changeset 7941:8a3f24796fa9 libavcodec

Replace second (and wrong) call to avcodec_align_dimensions() by adjusting stride_align. This is not particularly pretty and I will gladly implement something else if someone has an idea!
author michael
date Tue, 30 Sep 2008 01:07:25 +0000
parents 8dc81763fb42
children 64f35acc2407
files utils.c
diffstat 1 files changed, 15 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/utils.c	Tue Sep 30 00:28:13 2008 +0000
+++ b/utils.c	Tue Sep 30 01:07:25 2008 +0000
@@ -229,6 +229,7 @@
         int size[4] = {0};
         int tmpsize;
         AVPicture picture;
+        int stride_align[4];
 
         avcodec_get_chroma_sub_sample(s->pix_fmt, &h_chroma_shift, &v_chroma_shift);
 
@@ -238,12 +239,22 @@
             w+= EDGE_WIDTH*2;
             h+= EDGE_WIDTH*2;
         }
-        avcodec_align_dimensions(s, &w, &h);
 
         ff_fill_linesize(&picture, s->pix_fmt, w);
 
-        for (i=0; i<4; i++)
-            picture.linesize[i] = ALIGN(picture.linesize[i], STRIDE_ALIGN);
+        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
+//picture size unneccessarily in some cases. The solution here is not
+//pretty and better ideas are welcome!
+#ifdef HAVE_MMX
+            if(s->codec_id == CODEC_ID_SVQ1)
+                stride_align[i]= 16;
+            else
+#endif
+            stride_align[i] = STRIDE_ALIGN;
+            picture.linesize[i] = ALIGN(picture.linesize[i], stride_align[i]);
+        }
 
         tmpsize = ff_fill_pointer(&picture, NULL, s->pix_fmt, h);
 
@@ -269,7 +280,7 @@
             if((s->flags&CODEC_FLAG_EMU_EDGE) || (s->pix_fmt == PIX_FMT_PAL8) || !size[2])
                 buf->data[i] = buf->base[i];
             else
-                buf->data[i] = buf->base[i] + ALIGN((buf->linesize[i]*EDGE_WIDTH>>v_shift) + (EDGE_WIDTH>>h_shift), STRIDE_ALIGN);
+                buf->data[i] = buf->base[i] + ALIGN((buf->linesize[i]*EDGE_WIDTH>>v_shift) + (EDGE_WIDTH>>h_shift), stride_align[i]);
         }
         buf->width  = s->width;
         buf->height = s->height;