changeset 34603:d0135e230f3d

Fix green bottom line on yadif with certain parity. This implementation of the filter method needs a padding, that mplayer allocates but never fills with data. Do the padding properly and tweak the height alignment to even number of lines, instead of rounding to 32.
author iive
date Sat, 11 Feb 2012 22:33:22 +0000
parents a5d0652dd1a0
children 1efa9c367aab
files libmpcodecs/vf_yadif.c
diffstat 1 files changed, 13 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/libmpcodecs/vf_yadif.c	Sat Feb 11 21:17:50 2012 +0000
+++ b/libmpcodecs/vf_yadif.c	Sat Feb 11 22:33:22 2012 +0000
@@ -60,8 +60,19 @@
 
     for(i=0; i<3; i++){
         int is_chroma= !!i;
+        int pn_width  = width >>is_chroma;
+        int pn_height = height>>is_chroma;
 
-        memcpy_pic(p->ref[2][i], src[i], width>>is_chroma, height>>is_chroma, p->stride[i], src_stride[i]);
+
+        memcpy_pic(p->ref[2][i], src[i], pn_width, pn_height, p->stride[i], src_stride[i]);
+
+        fast_memcpy(p->ref[2][i] +  pn_height   * p->stride[i],
+                          src[i] + (pn_height-1)*src_stride[i], pn_width);
+        fast_memcpy(p->ref[2][i] + (pn_height+1)* p->stride[i],
+                          src[i] + (pn_height-1)*src_stride[i], pn_width);
+
+        fast_memcpy(p->ref[2][i] -   p->stride[i], src[i], pn_width);
+        fast_memcpy(p->ref[2][i] - 2*p->stride[i], src[i], pn_width);
     }
 }
 
@@ -373,7 +384,7 @@
         for(i=0; i<3; i++){
             int is_chroma= !!i;
             int w= ((width   + 31) & (~31))>>is_chroma;
-            int h= ((height+6+ 31) & (~31))>>is_chroma;
+            int h=(((height  +  1) & ( ~1))>>is_chroma) + 6;
 
             vf->priv->stride[i]= w;
             for(j=0; j<3; j++)