diff utils.c @ 9192:6faca73d75cc libavcodec

Change linesize alignment method to ensure that linesize[0] == 2*linesize[1] for YUV420P and YUV422P always. Fixes MPEG-2 4:2:2 encoding on PPC and ARM, and should fix mxf_d10 regression.
author reimar
date Thu, 19 Mar 2009 21:34:55 +0000
parents caee3bed2145
children 9fd579338f23
line wrap: on
line diff
--- a/utils.c	Thu Mar 19 21:31:10 2009 +0000
+++ b/utils.c	Thu Mar 19 21:34:55 2009 +0000
@@ -242,6 +242,7 @@
         int h_chroma_shift, v_chroma_shift;
         int size[4] = {0};
         int tmpsize;
+        int unaligned;
         AVPicture picture;
         int stride_align[4];
 
@@ -254,8 +255,14 @@
             h+= EDGE_WIDTH*2;
         }
 
+        do {
+            // NOTE: do not align linesizes individually, this breaks e.g. assumptions
+            // that linesize[0] == 2*linesize[1] in the MPEG-encoder for 4:2:2
         ff_fill_linesize(&picture, s->pix_fmt, w);
+            // increase alignment of w for next try (rhs gives the lowest bit set in w)
+            w += w & ~(w-1);
 
+            unaligned = 0;
         for (i=0; i<4; i++){
 //STRIDE_ALIGN is 8 for SSE* but this does not work for SVQ1 chroma planes
 //we could change STRIDE_ALIGN to 16 for x86/sse but it would increase the
@@ -267,8 +274,9 @@
             else
 #endif
             stride_align[i] = STRIDE_ALIGN;
-            picture.linesize[i] = ALIGN(picture.linesize[i], stride_align[i]);
+                unaligned |= picture.linesize[i] % stride_align[i];
         }
+        } while (unaligned);
 
         tmpsize = ff_fill_pointer(&picture, NULL, s->pix_fmt, h);
         if (tmpsize < 0)