# HG changeset patch # User reimar # Date 1375727817 0 # Node ID 583523331410d47eea5e43bbf7fd562e235dfcab # Parent 687e65bf99f93ba2dbf53f6762e28958cef5c8d6 vf_screenshot: slice handling fix. We can only support slices if the next filter does so. Fixes bugzilla issue #2140. diff -r 687e65bf99f9 -r 583523331410 libmpcodecs/vf_screenshot.c --- a/libmpcodecs/vf_screenshot.c Mon Aug 05 16:51:10 2013 +0000 +++ b/libmpcodecs/vf_screenshot.c Mon Aug 05 18:36:57 2013 +0000 @@ -59,10 +59,24 @@ //===========================================================================// +static void draw_slice(struct vf_instance *vf, unsigned char** src, + int* stride, int w,int h, int x, int y) +{ + if (vf->priv->store_slices) { + uint8_t *dst[MP_MAX_PLANES] = {NULL}; + int dst_stride[MP_MAX_PLANES] = {0}; + dst_stride[0] = vf->priv->stride; + dst[0] = vf->priv->buffer; + sws_scale(vf->priv->ctx, src, stride, y, h, dst, dst_stride); + } + vf_next_draw_slice(vf,src,stride,w,h,x,y); +} + static int config(struct vf_instance *vf, int width, int height, int d_width, int d_height, unsigned int flags, unsigned int outfmt) { + int res; vf->priv->ctx=sws_getContextFromCmdLine(width, height, outfmt, d_width, d_height, IMGFMT_RGB24); @@ -78,7 +92,11 @@ free(vf->priv->buffer); // probably reconfigured vf->priv->buffer = NULL; - return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt); + res = vf_next_config(vf,width,height,d_width,d_height,flags,outfmt); + // Our draw_slice only works properly if the + // following filter can do slices. + vf->draw_slice=vf->next->draw_slice ? draw_slice : NULL; + return res; } static void write_png(struct vf_priv_s *priv) @@ -150,19 +168,6 @@ } -static void draw_slice(struct vf_instance *vf, unsigned char** src, - int* stride, int w,int h, int x, int y) -{ - if (vf->priv->store_slices) { - uint8_t *dst[MP_MAX_PLANES] = {NULL}; - int dst_stride[MP_MAX_PLANES] = {0}; - dst_stride[0] = vf->priv->stride; - dst[0] = vf->priv->buffer; - sws_scale(vf->priv->ctx, src, stride, y, h, dst, dst_stride); - } - vf_next_draw_slice(vf,src,stride,w,h,x,y); -} - static void get_image(struct vf_instance *vf, mp_image_t *mpi) { // FIXME: should vf.c really call get_image when using slices??