[FFmpeg-devel] [PATCH] lavfi/drawutils: attempt to fix subsampling.
Stefano Sabatini
stefasab at gmail.com
Tue May 28 17:13:46 CEST 2013
On date Tuesday 2013-05-28 15:09:12 +0200, Clément Bœsch encoded:
> ---
>
> Fix green lines with
> ./ffmpeg -i matrixbench_mpeg2.mpg -an -vsync 0 -vf 'select=isnan(prev_selected_t)+gte(t-prev_selected_t\,4),scale=90:45,tile=10x9' -y out.jpg
>
> Reported by a user on FFmpeg-user ml
>
> The last two chunks are the only necessary to fix the issue. I'm not
> comfortable enough with drawutils to say if those changes are enough.
>
> BTW, I'm quite sceptical about the ff_draw_round_to_sub() function.
> ---
> libavfilter/drawutils.c | 18 +++++++++---------
> 1 file changed, 9 insertions(+), 9 deletions(-)
>
> diff --git a/libavfilter/drawutils.c b/libavfilter/drawutils.c
> index 272d9df..f8aa8cc 100644
> --- a/libavfilter/drawutils.c
> +++ b/libavfilter/drawutils.c
> @@ -93,7 +93,7 @@ int ff_fill_line_with_color(uint8_t *line[4], int pixel_step[4], int w, uint8_t
> int hsub1 = (plane == 1 || plane == 2) ? hsub : 0;
>
> pixel_step[plane] = 1;
> - line_size = (w >> hsub1) * pixel_step[plane];
> + line_size = FF_CEIL_RSHIFT(w, hsub1) * pixel_step[plane];
> line[plane] = av_malloc(line_size);
> memset(line[plane], dst_color[plane], line_size);
> }
> @@ -114,9 +114,9 @@ void ff_draw_rectangle(uint8_t *dst[4], int dst_linesize[4],
> int vsub1 = plane == 1 || plane == 2 ? vsub : 0;
>
> p = dst[plane] + (y >> vsub1) * dst_linesize[plane];
> - for (i = 0; i < (h >> vsub1); i++) {
> + for (i = 0; i < FF_CEIL_RSHIFT(h, vsub1); i++) {
> memcpy(p + (x >> hsub1) * pixelstep[plane],
> - src[plane], (w >> hsub1) * pixelstep[plane]);
> + src[plane], FF_CEIL_RSHIFT(w, hsub1) * pixelstep[plane]);
> p += dst_linesize[plane];
> }
> }
> @@ -134,9 +134,9 @@ void ff_copy_rectangle(uint8_t *dst[4], int dst_linesize[4],
> int vsub1 = plane == 1 || plane == 2 ? vsub : 0;
>
> p = dst[plane] + (y >> vsub1) * dst_linesize[plane];
> - for (i = 0; i < (h >> vsub1); i++) {
> + for (i = 0; i < FF_CEIL_RSHIFT(h, vsub1); i++) {
> memcpy(p + (x >> hsub1) * pixelstep[plane],
> - src[plane] + src_linesize[plane]*(i+(y2>>vsub1)), (w >> hsub1) * pixelstep[plane]);
> + src[plane] + src_linesize[plane]*(i+(y2>>vsub1)), FF_CEIL_RSHIFT(w, hsub1) * pixelstep[plane]);
> p += dst_linesize[plane];
> }
> }
> @@ -233,8 +233,8 @@ void ff_copy_rectangle2(FFDrawContext *draw,
> for (plane = 0; plane < draw->nb_planes; plane++) {
> p = pointer_at(draw, src, src_linesize, plane, src_x, src_y);
> q = pointer_at(draw, dst, dst_linesize, plane, dst_x, dst_y);
> - wp = (w >> draw->hsub[plane]) * draw->pixelstep[plane];
> - hp = (h >> draw->vsub[plane]);
> + wp = FF_CEIL_RSHIFT(w, draw->hsub[plane]) * draw->pixelstep[plane];
> + hp = FF_CEIL_RSHIFT(h, draw->vsub[plane]);
> for (y = 0; y < hp; y++) {
> memcpy(q, p, wp);
> p += src_linesize[plane];
> @@ -252,8 +252,8 @@ void ff_fill_rectangle(FFDrawContext *draw, FFDrawColor *color,
>
> for (plane = 0; plane < draw->nb_planes; plane++) {
> p0 = pointer_at(draw, dst, dst_linesize, plane, dst_x, dst_y);
> - wp = (w >> draw->hsub[plane]);
> - hp = (h >> draw->vsub[plane]);
> + wp = FF_CEIL_RSHIFT(w, draw->hsub[plane]);
> + hp = FF_CEIL_RSHIFT(h, draw->vsub[plane]);
> if (!hp)
> return;
> p = p0;
LGTM assuming FATE is happy with it, thanks.
--
FFmpeg = Funny Formidable Mind-dumbing Political Extreme Gadget
More information about the ffmpeg-devel
mailing list