Make sure clip coordinates are inside the screen area.
authoreugeni <eugeni@b3059339-0415-0410-9bf9-f77b7e298cf2>
Sat, 18 Jul 2009 11:33:03 +0000 (11:33 +0000)
committereugeni <eugeni@b3059339-0415-0410-9bf9-f77b7e298cf2>
Sat, 18 Jul 2009 11:33:03 +0000 (11:33 +0000)
git-svn-id: svn://git.mplayerhq.hu/mplayer/trunk@29425 b3059339-0415-0410-9bf9-f77b7e298cf2

libass/ass_render.c
libmpcodecs/vf_ass.c

index f64908c..e4c06f7 100644 (file)
@@ -317,6 +317,11 @@ static ass_image_t* my_draw_bitmap(unsigned char* bitmap, int bitmap_w, int bitm
 {
        ass_image_t* img = calloc(1, sizeof(ass_image_t));
 
+       assert(dst_x >= 0);
+       assert(dst_y >= 0);
+       assert(dst_x + bitmap_w < frame_context.width);
+       assert(dst_y + bitmap_h < frame_context.height);
+
        img->w = bitmap_w;
        img->h = bitmap_h;
        img->stride = stride;
@@ -598,6 +603,7 @@ static double x2scr_pos(double x) {
        return x*frame_context.orig_width / frame_context.track->PlayResX +
                global_settings->left_margin;
 }
+
 /**
  * \brief Mapping between script and screen coordinates
  */
@@ -2148,6 +2154,11 @@ static int ass_render_event(ass_event_t* event, event_images_t* event_images)
                render_context.clip_y1 = y2scr_pos(render_context.clip_y1);
        }
 
+       render_context.clip_x0 = FFMIN(FFMAX(render_context.clip_x0, 0), frame_context.width);
+       render_context.clip_x1 = FFMIN(FFMAX(render_context.clip_x1, 0), frame_context.width);
+       render_context.clip_y0 = FFMIN(FFMAX(render_context.clip_y0, 0), frame_context.height);
+       render_context.clip_y1 = FFMIN(FFMAX(render_context.clip_y1, 0), frame_context.height);
+
        // calculate rotation parameters
        {
                FT_Vector center;
index b88e7b3..2068383 100644 (file)
@@ -219,6 +219,10 @@ static void copy_from_image(struct vf_instance_s* vf, int first_row, int last_ro
        last_row += (last_row % 2);
        chroma_rows = (last_row - first_row) / 2;
 
+       assert(first_row >= 0);
+       assert(first_row <= last_row);
+       assert(last_row < vf->priv->outh);
+
        for (pl = 1; pl < 3; ++pl) {
                int dst_stride = vf->priv->outw;
                int src_stride = vf->dmpi->stride[pl];