[Libav-user] av_picture_copy to different linesize
Vic Lee
llyzs at 163.com
Sun Apr 17 13:12:46 CEST 2011
Hi FFmpeg developers,
I am a FreeRDP developer and I am currently working on using FFmpeg to
decode video. The code I attached below is a simplified version of my
real code. It basically just decode the video frame and store the image
into my own buffer, which will be later sent to XVideo:
/* Decode data into frame */
AVPacket pkt;
av_init_packet(&pkt);
pkt.data = data;
pkt.size = data_size;
len = avcodec_decode_video2(context, frame, &decoded, &pkt);
/* Copy the decoded frame to decoded_data */
decoded_size = avpicture_get_size(context->pix_fmt,
context->width, context->height);
decoded_data = malloc(decoded_size);
f = avcodec_alloc_frame();
avpicture_fill((AVPicture *) f, decoded_data,
context->pix_fmt,
context->width, context->height);
av_picture_copy((AVPicture *) f, (AVPicture *) frame,
context->pix_fmt,
context->width, context->height);
av_free(f);
So far I only work with YUV420P. The above codes works fine if the
decoded frame->linesize[0]==width; however in some cases
frame->linesize[0] will be aligned to larger size than width, then color
will be messed up in the target YUV data buffer (Y channel is ok but U
and V is not).
To be more specific, the problematic test video is 852x480, the output
frame has linesize 896/448/448, and the target frame has 852/426/426. I
tried to read the av_picture_copy source code and dump the buffers, and
seems everythig is alright: every first 426 bytes of the source lines
are just copied to the target. But the color of the image does not look
right.
Am I missing something here?
Vic
More information about the Libav-user
mailing list