[FFmpeg-devel] [PATCH] fix for rev11962 that broke yuv422 mpeg encoding

Michael Niedermayer michaelni
Fri Feb 22 03:22:12 CET 2008


On Wed, Feb 20, 2008 at 12:57:13AM +0100, christophelorenz wrote:
> The following command
> ffmpeg -i source -pix_fmt yuv422p -vcodec mpeg2video -intra -qscale 1 
> output422.m2v
> outputs corrupted chroma since rev 11962.
> (source is 720x576, -intra and -qscale make the chroma alignment problem 
> easier to see)
>
> Rev 11962 has changed the linesize of the yuv planes using ALIGN macro to 
> align Y on U dimension.
> However macro is only designed to align to pow2 values and not various 
> image width.
> Also after alignment to picture.linesize[1] there's no garantee that the 
> linesize[0] is still aligned to a STRIDE_ALIGN multiple anymore.
>
> Refs in libavcodec/utils.c:
> L162:
> #define ALIGN(x, a) (((x)+(a)-1)&~((a)-1))
> L298:
> picture.linesize[0] = ALIGN(picture.linesize[0], picture.linesize[1]);
>
> I changed the code so that the linesize[1,2,3] are adjusted to upper value 
> that is a round fraction of linesize[0],
> while preserving alignment to STRIDE_ALIGN for all planes.
>
> Chris.
>

> Index: libavcodec/utils.c
> ===================================================================
> --- libavcodec/utils.c	(revision 12154)
> +++ libavcodec/utils.c	(working copy)
> @@ -293,10 +293,11 @@
>  
>          /* next ensures that linesize= 2^x uvlinesize, that is needed because
>           * some MC code assumes it */
> +        picture.linesize[0] = ALIGN(picture.linesize[0], STRIDE_ALIGN);
>          if (picture.linesize[1])
> -            picture.linesize[0] = ALIGN(picture.linesize[0], picture.linesize[1]);
> -        else
> -            picture.linesize[0] = ALIGN(picture.linesize[0], STRIDE_ALIGN);
> +            picture.linesize[1] = picture.linesize[0]/(picture.linesize[0]/picture.linesize[1]);
> +        if (picture.linesize[2])
> +            picture.linesize[2] = picture.linesize[0]/(picture.linesize[0]/picture.linesize[2]);
> +        if (picture.linesize[3])
> +            picture.linesize[3] = picture.linesize[0]/(picture.linesize[0]/picture.linesize[3]);

This is completely wrong
Some MC code assumes 2*linesize[1] == linesize[0] for YV12 or it did assume,
i dont remember, but if it still exists and assumes that, it wil definitly not
work with any other factor than 2.
So first find out if that code still exists and then either remove the align
stuff or fix it properly.
Also what you wrote above is code duplication due to:
for (i=1; i<4; i++)
    picture.linesize[i] = ALIGN(picture.linesize[i], STRIDE_ALIGN);

being straight before your code for picture.linesize[0]

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

I wish the Xiph folks would stop pretending they've got something they
do not.  Somehow I fear this will remain a wish. -- M?ns Rullg?rd
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20080222/65e4ca77/attachment.pgp>



More information about the ffmpeg-devel mailing list