MayaFlux 1.0.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ open()

bool MayaFlux::IO::FFmpegCameraReader::open ( const CameraConfig &  config)
overridevirtual

Open a camera device using the supplied config.

Parameters
configDevice name, resolution hint, fps hint, format override.
Returns
True on success.

Implements MayaFlux::IO::CameraSource.

Definition at line 111 of file FFmpegCameraReader.cpp.

112{
113 close();
114
115 const std::string fmt_name = config.format_override.empty()
116 ? std::string(CAMERA_FORMAT)
117 : config.format_override;
118
119 const std::string input_format = config.input_format.empty()
120 ? std::string(PREFERRED_INPUT_FORMAT)
121 : config.input_format;
122
123 constexpr std::array<OpenHints, 4> ladder { {
124 { .format = true, .size = true, .fps = true },
125 { .format = false, .size = true, .fps = true },
126 { .format = false, .size = true, .fps = false },
127 { .format = false, .size = false, .fps = false },
128 } };
129
130 m_requested_pixel_format = config.pixel_format;
131
132 for (size_t step = 0; step < ladder.size(); ++step) {
133 const OpenHints& hints = ladder.at(step);
134 if (hints.format && input_format.empty())
135 continue;
136
137 AVDictionary* opts = build_options(config, input_format, hints);
138 const bool opened = m_demux->open_device(config.device_name, fmt_name, &opts);
139 av_dict_free(&opts);
140
141 if (!opened) {
142 m_last_error = "Device open failed: " + m_demux->last_error();
143 continue;
144 }
145
146 if (!m_video->open_device(*m_demux,
147 hints.size ? config.target_width : 0,
148 hints.size ? config.target_height : 0,
149 config.pixel_format)) {
150 m_last_error = "Video stream open failed: " + m_video->last_error();
151 m_demux->close();
152 continue;
153 }
154
155 m_sws_buf.clear();
156 m_scaler_ready = false;
157
158 if (step > (input_format.empty() ? 1U : 0U)) {
160 "FFmpegCameraReader::open: '{}' did not accept the requested mode, "
161 "opened with fallback step {}",
162 config.device_name, step + 1);
163 }
164
166 "FFmpegCameraReader: opened '{}' via {}: {}x{} @{:.1f}fps (scaler deferred)",
167 config.device_name, fmt_name,
168 m_video->width, m_video->height, m_video->frame_rate);
169
170 return true;
171 }
172
174 "FFmpegCameraReader::open: {}", m_last_error);
175 return false;
176}
#define MF_INFO(comp, ctx,...)
#define MF_ERROR(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
bool size
std::shared_ptr< FFmpegDemuxContext > m_demux
std::shared_ptr< VideoStreamContext > m_video
int m_requested_pixel_format
Pixel format requested at open() time, as an AVPixelFormat int.
void close() override
Release device, decode, and scratch resources.
@ FileIO
Filesystem I/O operations.
@ IO
Networking, file handling, streaming.

References close(), MayaFlux::IO::CameraConfig::device_name, MayaFlux::Journal::FileIO, MayaFlux::IO::CameraConfig::format_override, MayaFlux::IO::CameraConfig::input_format, MayaFlux::Journal::IO, m_demux, m_last_error, m_requested_pixel_format, m_scaler_ready, m_sws_buf, m_video, MF_ERROR, MF_INFO, MF_WARN, MayaFlux::IO::CameraConfig::pixel_format, MayaFlux::IO::CameraConfig::target_height, MayaFlux::IO::CameraConfig::target_width, and MayaFlux::IO::U.

+ Here is the call graph for this function: