I have a problem with my code.
I want convert YUV to RGB, but sws_scale
returns 0 always and data is filled 00000000..NULL
I tried googling, but I could not find any problems.
Do I need AVPicture or QImage? Can anyone point out my problem?
pVFrame = av_frame_alloc();
while (av_read_frame(pFormatCtx, &packet) == 0) {
if (packet.stream_index == VSI) {
if (bool res = avcodec_send_packet(pVideoCodecCtx, &packet)) {
printf("avcodec_send_packet failed %d %d %d\n", res, AVERROR(EINVAL), AVERROR(ENOMEM));
}
avcodec_receive_frame(pVideoCodecCtx, pVFrame);
AVFrame* YUV_frame = Con_yuv_YUV420P(pVFrame);
QFrame->push(Con_yuv_RGB(YUV_frame));
}
}
}
AVFrame* Con_yuv_RGB(AVFrame* YUV_frame)
{
AVFrame* RGBFrame = av_frame_alloc();
SwsContext* sws_Context = NULL;
sws_Context = sws_getCachedContext(sws_Context, YUV_frame->width, YUV_frame->height, pVideoCodecCtx->pix_fmt,
YUV_frame->width, YUV_frame->height, AV_PIX_FMT_RGB32, SWS_BICUBIC, NULL, NULL, NULL);
if (sws_Context == NULL) {
return false;
}
result = sws_scale(sws_Context, YUV_frame->data, YUV_frame->linesize, 0, (int)YUV_frame->height, RGBFrame->data, RGBFrame->linesize);
if (result < 0)
{
return false;
}
av_frame_unref(YUV_frame);
if (RGBFrame == NULL) {
av_frame_unref(RGBFrame);
return false;
}
sws_freeContext(sws_Context);
return RGBFrame;
What is the problem?
Reference link - https://gist.github.com/nakaly/11eb992ebd134ee08b75e4c67afb5703,
http://codefromabove.com/2014/10/ffmpeg-convert-rgba-to-yuv/,
sws_scale YUV --> RGB distorted image,
https://www.gamedev.net/forums/topic/464977-sws_scale-problems/
https://ffmpeg.org/doxygen/2.7/group__libsws.html#gae531c9754c9205d90ad6800015046d74
ADD: enter image description here
before convert. It has to fill the buffer.
RGBFrame->width = YUV_frame->width; RGBFrame->format = AV_PIX_FMT_RGB32;
RGBFrame->height = YUV_frame->height;
int result = av_frame_get_buffer(RGBFrame, 32);
if (result != 0) return false;