[Libav-user] av_picture_copy to different linesize

Vic Lee llyzs at 163.com
Sun Apr 17 16:48:26 CEST 2011


Sorry for the noise, but I found my problem. :) The code actually works 
just fine, however the problem is that XVideo driver wants some byte 
alignment and we need to respect that.

Vic

On 04/17/2011 07:12 PM, Vic Lee wrote:
> 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