diff libmpcodecs/vd_ffmpeg.c @ 30588:4cc35c457d9e

Handle negative height in draw_slice from FFmpeg in vd_ffmpeg.c, since at least vo_xv and vo_sdl can not handle it and the scale filter seems to work fine either way. The FFmpeg vp3/Theora decoder produces such slices. Fixes bug #1646.
author reimar
date Wed, 17 Feb 2010 23:46:57 +0000
parents ad6740b58b0d
children 5f777257f6af
line wrap: on
line diff
--- a/libmpcodecs/vd_ffmpeg.c	Wed Feb 17 23:45:01 2010 +0000
+++ b/libmpcodecs/vd_ffmpeg.c	Wed Feb 17 23:46:57 2010 +0000
@@ -480,6 +480,7 @@
                         int y, int type, int height){
     sh_video_t *sh = s->opaque;
     uint8_t *source[MP_MAX_PLANES]= {src->data[0] + offset[0], src->data[1] + offset[1], src->data[2] + offset[2]};
+    int strides[MP_MAX_PLANES] = {src->linesize[0], src->linesize[1], src->linesize[2]};
 #if 0
     int start=0, i;
     int width= s->width;
@@ -502,8 +503,19 @@
         }
     }else
 #endif
+    if (height < 0)
+    {
+        int i;
+        height = -height;
+        y -= height;
+        for (i = 0; i < MP_MAX_PLANES; i++)
+        {
+            strides[i] = -strides[i];
+            source[i] -= strides[i];
+        }
+    }
     if (y < sh->disp_h) {
-        mpcodecs_draw_slice (sh, source, src->linesize, sh->disp_w, (y+height)<=sh->disp_h?height:sh->disp_h-y, 0, y);
+        mpcodecs_draw_slice (sh, source, strides, sh->disp_w, (y+height)<=sh->disp_h?height:sh->disp_h-y, 0, y);
     }
 }