34 lines
1.5 KiB
C
34 lines
1.5 KiB
C
/* RGB888 для sws_scale: FFmpeg выделяет выровненные строки и запас для SIMD.
|
|
* QImage разделяет буфер без копирования; последний владелец освобождает AVFrame. */
|
|
#pragma once
|
|
|
|
#ifdef HAVE_FFMPEG
|
|
#include <QImage>
|
|
#include "debug_config.h"
|
|
extern "C" {
|
|
#include <libavutil/frame.h>
|
|
}
|
|
|
|
inline QImage video_frame_image(int width, int height) {
|
|
AVFrame* frame = av_frame_alloc();
|
|
if (!frame) {
|
|
DEBUG_ERROR(DEBUG_CATEGORY_VIDEO, "video RGB frame allocation failed size=%dx%d", width, height); return {};
|
|
}
|
|
frame->format = AV_PIX_FMT_RGB24; frame->width = width; frame->height = height;
|
|
int result = av_frame_get_buffer(frame, 32);
|
|
if (result < 0) {
|
|
DEBUG_ERROR(DEBUG_CATEGORY_VIDEO, "video RGB buffer allocation failed size=%dx%d result=%d", width, height, result);
|
|
av_frame_free(&frame); return {};
|
|
}
|
|
QImage image(frame->data[0], width, height, frame->linesize[0], QImage::Format_RGB888, [](void* owner) {
|
|
auto* frame = static_cast<AVFrame*>(owner); av_frame_free(&frame);
|
|
}, frame);
|
|
if (image.isNull()) {
|
|
DEBUG_ERROR(DEBUG_CATEGORY_VIDEO, "video RGB image initialization failed size=%dx%d stride=%d", width, height, frame->linesize[0]);
|
|
av_frame_free(&frame); return {};
|
|
}
|
|
DEBUG_TRACE(DEBUG_CATEGORY_VIDEO, "video RGB buffer allocated size=%dx%d stride=%d alignment=32", width, height, frame->linesize[0]);
|
|
return image;
|
|
}
|
|
#endif
|