Packages
image
0.23.2
0.72.0
0.71.0
0.70.0
0.69.0
0.68.0
0.67.0
0.67.0-dev
retired
0.66.0
0.65.0
0.64.0
0.63.0
0.62.1
0.62.0
0.61.1
0.61.0
0.60.0
0.59.3
0.59.2
0.59.1
0.59.0
0.58.0
0.57.0
0.56.1
0.56.0
0.55.2
0.55.1
retired
0.55.0
0.54.4
0.54.3
0.54.2
0.54.1
0.54.0
0.53.0
0.52.3
0.52.2
0.52.1
0.52.0
retired
0.51.0
0.50.0
0.49.0
0.48.1
0.48.0
0.47.0
0.46.0
0.45.0
0.44.0
0.43.2
0.43.1
0.43.0
0.42.0
0.41.0
0.40.0
0.39.3
0.39.2
0.39.1
0.39.0
0.38.4
0.38.3
0.38.2
0.38.1
0.38.0
0.37.0
0.36.2
0.36.1
0.36.0
0.35.0
0.34.0
0.33.0
0.32.0
0.31.1
0.31.0
0.30.0
0.29.0
0.28.2
0.28.1
0.28.0
0.27.0
0.26.0
0.25.1
0.25.0
0.24.1
0.24.0
0.23.2
0.23.1
0.23.0
0.22.1
0.22.0
0.21.0
0.20.0
retired
0.19.0
0.18.1
0.18.0
0.17.0
0.16.0
0.15.0
0.14.4
0.14.2
0.14.1
0.14.0
retired
0.13.1
0.13.0
0.12.0
0.11.0
0.10.0
0.10.0-rc.0
retired
0.9.0
retired
0.8.0
0.7.0
0.6.0
0.5.0
0.4.0
0.3.0
0.2.0
0.1.0
An approachable image processing library primarily based upon Vix and libvips that is NIF-based, fast, multi-threaded, pipelined and has a low memory footprint.
Current section
Files
Jump to
Current section
Files
lib/image/options/video.ex
if Image.evision_configured?() do
defmodule Image.Options.Video do
@moduledoc """
Options and option validation for `Image.Video.stream!/2`.
"""
@type backend ::
:any
| :vfw
| :v4l
| :v4l2
| :firewire
| :fireware
| :ieee1394
| :dc1394
| :cmu1394
| :qt
| :unicap
| :dshow
| :pvapi
| :openni
| :openni_asus
| :android
| :xiapi
| :avfoundation
| :giganetix
| :msmf
| :winrt
| :intelperc
| :realsense
| :openni2
| :openni2_asus
| :openni2_astra
| :gphoto2
| :gstreamer
| :ffmpeg
| :images
| :aravis
| :opencv_mjpeg
| :intel_mfx
| :xine
| :ueye
| :obsensor
| pos_integer()
@type open_options :: [
{:backend, backend()}
]
# See https://docs.opencv.org/4.x/d4/d15/group__videoio__flags__base.html#ga023786be1ee68a9105bf2e48c700294d
@backend_map %{
any: 0,
vfw: 200,
v4l: 200,
v4l2: 200,
firewire: 300,
fireware: 300,
ieee1394: 300,
dc1394: 300,
cmu1394: 300,
qt: 500,
unicap: 600,
dshow: 700,
pvapi: 800,
openni: 900,
openni_asus: 910,
android: 1000,
xiapi: 1100,
avfoundation: 1200,
giganetix: 1300,
msmf: 1400,
winrt: 1410,
intelperc: 1500,
realsense: 1500,
openni2: 1600,
openni2_asus: 1610,
openni2_astra: 1620,
gphoto2: 1700,
gstreamer: 1800,
ffmpeg: 1900,
images: 2000,
aravis: 2100,
opencv_mjpeg: 2200,
intel_mfx: 2300,
xine: 2400,
ueye: 2500,
obsensor: 2600
}
@inverted_backend_map Map.new(@backend_map, fn {key, val} -> {val, key} end)
@any_backend Map.fetch!(@backend_map, :any)
def known_backends do
@backend_map
end
@doc false
def inverted_known_backends do
@inverted_backend_map
end
def validate_open_options([]) do
{:ok, @any_backend}
end
def validate_open_options(backend: backend) when is_atom(backend) do
case Map.fetch(known_backends(), backend) do
{:ok, backend} -> {:ok, backend}
:error -> {:error, "Invalid or unknown backend #{inspect(backend)}"}
end
end
def validate_open_options(backend: backend) when is_integer(backend) do
case Map.has_key?(inverted_known_backends(), backend) do
true -> {:ok, backend}
false -> {:error, "Invalid or unknown backend #{inspect(backend)}"}
end
end
# Its a video stream, no options may be provided
def validate_stream_options(%Evision.VideoCapture{frame_count: 0.0}, []) do
{:ok, {nil, nil, nil, nil}}
end
def validate_stream_options(%Evision.VideoCapture{frame_count: frame_count}, []) do
{:ok, {:frame, 0, trunc(frame_count) - 1, 1}}
end
def validate_stream_options(%Evision.VideoCapture{} = video, frame: first..last = range)
when first >= 0 and last > first do
%{frame_count: frame_count} = video
max_frame = trunc(frame_count) - 1
step = Map.get(range, :step, 1)
if first <= max_frame and last <= max_frame do
{:ok, {:frame, first, last, step}}
else
{:error,
"Requested range #{inspect(range)} is not in the maximal range 0..#{inspect(max_frame)}"}
end
end
def validate_stream_options(%Evision.VideoCapture{} = video, millisecond: first..last = range)
when first >= 0 and last > first do
%{frame_count: frame_count, fps: fps} = video
max_millis = trunc(frame_count * fps * 1_000) - 1
step = Map.get(range, :step, 1)
if first <= max_millis and last <= max_millis do
{:ok, {:millisecond, first, last, step}}
else
{:error,
"Requestged range #{inspect(range)} is not in the maximum range 0..#{inspect(max_millis)}"}
end
end
def validate_stream_options(%Evision.VideoCapture{} = video, frame: first..last = range) do
%{frame_count: frame_count} = video
step = abs(Map.get(range, :step, 1))
first = if first < 0, do: trunc(frame_count + first), else: first
last = if last < 0, do: trunc(frame_count + last), else: last
validate_stream_options(video, frame: Range.new(first, last, step))
end
def validate_stream_options(%Evision.VideoCapture{} = video, millisecond: first..last = range)
when first < 0 and last < 0 and last > first do
%{frame_count: frame_count, fps: fps} = video
max_millis = trunc(frame_count * fps * 1_000)
step = abs(Map.get(range, :step, 1))
first = if first < 0, do: max_millis + first, else: first
last = if last < 0, do: max_millis + last, else: last
validate_stream_options(video, millisecond: Range.new(first, last, step))
end
def validate_stream_options!(video, options) do
case validate_stream_options(video, options) do
{:ok, options} -> options
{:error, reason} -> raise Image.Error, reason
end
end
end
end