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

◆ setup_scaler()

bool MayaFlux::IO::VideoStreamContext::setup_scaler ( uint32_t  target_width,
uint32_t  target_height,
int  target_format 
)
private

Allocate and initialise the SwsContext for pixel format conversion.

Parameters
target_widthDesired output width (0 = source width).
target_heightDesired output height (0 = source height).
target_formatDesired AVPixelFormat (negative = AV_PIX_FMT_RGBA).
Returns
True on success.

Definition at line 295 of file VideoStreamContext.cpp.

298{
299 if (!codec_context)
300 return false;
301
302 if (codec_context->pix_fmt == AV_PIX_FMT_NONE) {
303 m_last_error = "setup_scaler: source pix_fmt is AV_PIX_FMT_NONE — "
304 "codec has not resolved its output format yet";
305 return false;
306 }
307
312 : static_cast<int>(AV_PIX_FMT_RGBA);
313
314 sws_context = sws_getContext(
315 static_cast<int>(width),
316 static_cast<int>(height),
317 codec_context->pix_fmt,
318 static_cast<int>(out_width),
319 static_cast<int>(out_height),
320 static_cast<AVPixelFormat>(out_pixel_format),
321 SWS_BILINEAR,
322 nullptr, nullptr, nullptr);
323
324 if (!sws_context) {
325 m_last_error = "sws_getContext failed";
326 return false;
327 }
328
329 const AVPixFmtDescriptor* desc = av_pix_fmt_desc_get(
330 static_cast<AVPixelFormat>(out_pixel_format));
331 if (!desc) {
332 m_last_error = "setup_scaler: no descriptor for target pixel format";
333 return false;
334 }
335
336 if (av_pix_fmt_count_planes(static_cast<AVPixelFormat>(out_pixel_format)) != 1) {
337 m_last_error = std::string("setup_scaler: target format ")
338 + (desc->name ? desc->name : "?")
339 + " is multi-planar; the read path writes a single packed plane";
340 return false;
341 }
342
343 out_bytes_per_pixel = static_cast<uint32_t>((av_get_bits_per_pixel(desc) + 7) / 8);
344
345 out_linesize = static_cast<int>(out_width * out_bytes_per_pixel);
346 int align_remainder = out_linesize % 32;
347 if (align_remainder != 0)
348 out_linesize += 32 - align_remainder;
349
350 return true;
351}
uint32_t target_width
Requested output width (0 = source).
uint32_t target_height
Requested output height (0 = source).
uint32_t out_height
Output height after scaling.
uint32_t height
Source height in pixels.
uint32_t width
Source width in pixels.
int out_pixel_format
Output AVPixelFormat.
int out_linesize
Output row stride in bytes.
SwsContext * sws_context
Owned; freed in destructor.
AVCodecContext * codec_context
Owned; freed in destructor.
int target_format
Requested AVPixelFormat (negative = RGBA).
uint32_t out_bytes_per_pixel
Bytes per pixel in output format.
uint32_t out_width
Output width after scaling.

References codec_context, height, m_last_error, out_bytes_per_pixel, out_height, out_linesize, out_pixel_format, out_width, sws_context, target_format, target_height, target_width, and width.

Referenced by open(), and rebuild_scaler_from_frame().

+ Here is the caller graph for this function: