Авкодек YUV в RGB

Я пытаюсь конвертировать YUV-кадр в RGB, используя libswscale.

Вот мой код:

AVFrame *RGBFrame;
SwsContext *ConversionContext;

ConversionContext = sws_getCachedContext(NULL, FrameWidth, FrameHeight, AV_PIX_FMT_YUV420P, FrameWidth, FrameHeight, AV_PIX_FMT_RGB24, SWS_BILINEAR, 0, 0, 0);
RGBFrame = av_frame_alloc();

avpicture_fill((AVPicture *)RGBFrame, &FillVect[0], AV_PIX_FMT_RGB24, FrameWidth, FrameHeight);

sws_scale(ConversionContext, VideoFrame->data, VideoFrame->linesize, 0, VideoFrame->height, RGBFrame->data, RGBFrame->linesize);

Моя программа делает SEGFAULT по функции sws_scale.

VideoFrame — это структура AVFrame, которая содержит мой декодированный кадр.

Я думаю, что это потому, что фрейм YUV происходит от avcodec_decode_video2, который возвращает такой массив:

VideoFrame->data[0] // Y array, linesize = frame width
VideoFrame->data[1] // U array, linesize = frame width/2
VideoFrame->data[2] // V array, linesize = frame width/2

В то время как YUV420P теоретически имеет только одну плоскость (согласно Википедии, YUV420P является плоским форматом, тогда данные Y, U, V группируются вместе).
Итак, я не знаю, как приступить к преобразованию моего массива, где данные Y, U, V разделены в RGB24, используя swscale.

Пожалуйста, помогите мне, спасибо 🙂

4

Решение

av_frame_alloc только выделяет память для самого объекта кадра, но не выделяет память для хранения данных изображения. Сделали ли вы:

FillVect.resize( avpicture_get_size( PIX_FMT_RGB24, FrameWidth, FrameHeight ) );

где-то в вашем коде перед вызовом avpicture_fill? Или каким-то другим способом убедиться, что FillVect выделяет достаточно памяти для сохранения всей декодированной картинки?

Вы пытались запустить его под valgrind, чтобы увидеть, что именно вызывает SEGFAULT?

1

Другие решения