Open a camera device using the supplied config.
112{
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
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) {
143 continue;
144 }
145
147 hints.size ? config.target_width : 0,
148 hints.
size ? config.target_height : 0,
149 config.pixel_format)) {
152 continue;
153 }
154
157
158 if (step > (input_format.empty() ? 1U : 0
U)) {
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,
169
170 return true;
171 }
172
175 return false;
176}
#define MF_INFO(comp, ctx,...)
#define MF_ERROR(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
std::shared_ptr< FFmpegDemuxContext > m_demux
std::vector< uint8_t > m_sws_buf
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.