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;
The ffmpeg documentation covers it:
https://www.ffmpeg.org/doxygen/2.3/group__lavu__frame.html#gac700017c5270c79c1e1befdeeb008b2f
AVFrame* av_frame_alloc ( void )
Allocate an AVFrame and set its fields to default values.
The resulting struct must be freed using av_frame_free().
Returns An AVFrame filled with default values or NULL on failure. Note this only allocates the AVFrame itself, not the data buffers. Those must be allocated through other means, e.g. with av_frame_get_buffer() or manually.
https://www.ffmpeg.org/doxygen/2.3/group__lavu__frame.html#ga6b1acbfa82c79bf7fd78d868572f0ceb
int av_frame_get_buffer ( AVFrame * frame, int align ) Allocate new buffer(s) for audio or video data.
The following fields must be set on frame before calling this function:
format (pixel format for video, sample format for audio) width and height for video nb_samples and channel_layout for audio This function will fill AVFrame.data and AVFrame.buf arrays and, if necessary, allocate and fill AVFrame.extended_data and AVFrame.extended_buf. For planar formats, one buffer will be allocated for each plane.