From 19c8f2271423281c9b876b984076a6467c455904 Mon Sep 17 00:00:00 2001 From: Paul B Mahol Date: Mon, 8 Jul 2013 15:12:11 +0000 Subject: [PATCH] lavfi/rotate: switch to new drawutils Get rid of ugly hacks, also add support for more pixel formats. Signed-off-by: Paul B Mahol --- libavfilter/vf_rotate.c | 41 ++++++++++++++---------------------- tests/ref/fate/filter-pixfmts-rotate | 7 ++++++ 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/libavfilter/vf_rotate.c b/libavfilter/vf_rotate.c index a032f99086..b967d76cb8 100644 --- a/libavfilter/vf_rotate.c +++ b/libavfilter/vf_rotate.c @@ -71,10 +71,10 @@ typedef struct { int hsub, vsub; int nb_planes; int use_bilinear; - uint8_t *line[4]; - int linestep[4]; float sinx, cosx; double var_values[VAR_VARS_NB]; + FFDrawContext draw; + FFDrawColor color; } RotContext; #define OFFSET(x) offsetof(RotContext, x) @@ -111,10 +111,6 @@ static av_cold int init(AVFilterContext *ctx) static av_cold void uninit(AVFilterContext *ctx) { RotContext *rot = ctx->priv; - int i; - - for (i = 0; i < 4; i++) - av_freep(&rot->line[i]); av_expr_free(rot->angle_expr); rot->angle_expr = NULL; @@ -123,10 +119,14 @@ static av_cold void uninit(AVFilterContext *ctx) static int query_formats(AVFilterContext *ctx) { static enum PixelFormat pix_fmts[] = { + AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRAP, AV_PIX_FMT_ARGB, AV_PIX_FMT_RGBA, AV_PIX_FMT_ABGR, AV_PIX_FMT_BGRA, + AV_PIX_FMT_0RGB, AV_PIX_FMT_RGB0, + AV_PIX_FMT_0BGR, AV_PIX_FMT_BGR0, AV_PIX_FMT_RGB24, AV_PIX_FMT_BGR24, AV_PIX_FMT_GRAY8, + AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVA444P, AV_PIX_FMT_YUVA420P, @@ -179,11 +179,13 @@ static int config_props(AVFilterLink *outlink) RotContext *rot = ctx->priv; AVFilterLink *inlink = ctx->inputs[0]; const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(inlink->format); - uint8_t rgba_color[4]; - int is_packed_rgba, ret; + int ret; double res; char *expr; + ff_draw_init(&rot->draw, inlink->format, 0); + ff_draw_color(&rot->draw, &rot->color, rot->fillcolor); + rot->hsub = pixdesc->log2_chroma_w; rot->vsub = pixdesc->log2_chroma_h; @@ -236,16 +238,6 @@ static int config_props(AVFilterLink *outlink) rot->nb_planes = av_pix_fmt_count_planes(inlink->format); outlink->w = rot->outw; outlink->h = rot->outh; - - memcpy(rgba_color, rot->fillcolor, sizeof(rgba_color)); - ff_fill_line_with_color(rot->line, rot->linestep, outlink->w, rot->fillcolor, - outlink->format, rgba_color, &is_packed_rgba, NULL); - av_log(ctx, AV_LOG_INFO, - "w:%d h:%d -> w:%d h:%d bgcolor:0x%02X%02X%02X%02X[%s]\n", - inlink->w, inlink->h, outlink->w, outlink->h, - rot->fillcolor[0], rot->fillcolor[1], rot->fillcolor[2], rot->fillcolor[3], - is_packed_rgba ? "rgba" : "yuva"); - return 0; } @@ -336,8 +328,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) /* fill background */ if (rot->fillcolor_enable) - ff_draw_rectangle(out->data, out->linesize, - rot->line, rot->linestep, rot->hsub, rot->vsub, + ff_fill_rectangle(&rot->draw, &rot->color, out->data, out->linesize, 0, 0, outlink->w, outlink->h); for (plane = 0; plane < rot->nb_planes; plane++) { @@ -370,17 +361,17 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) /* the out-of-range values avoid border artifacts */ if (x1 >= -1 && x1 <= inw && y1 >= -1 && y1 <= inh) { uint8_t inp_inv[4]; /* interpolated input value */ - pout = out->data[plane] + j * out->linesize[plane] + i * rot->linestep[plane]; + pout = out->data[plane] + j * out->linesize[plane] + i * rot->draw.pixelstep[plane]; if (rot->use_bilinear) { pin = interpolate_bilinear(inp_inv, - in->data[plane], in->linesize[plane], rot->linestep[plane], + in->data[plane], in->linesize[plane], rot->draw.pixelstep[plane], x, y, inw-1, inh-1); } else { int x2 = av_clip(x1, 0, inw-1); int y2 = av_clip(y1, 0, inh-1); - pin = in->data[plane] + y2 * in->linesize[plane] + x2 * rot->linestep[plane]; + pin = in->data[plane] + y2 * in->linesize[plane] + x2 * rot->draw.pixelstep[plane]; } - switch (rot->linestep[plane]) { + switch (rot->draw.pixelstep[plane]) { case 1: *pout = *pin; break; @@ -395,7 +386,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) *((uint32_t *)pout) = *((uint32_t *)pin); break; default: - memcpy(pout, pin, rot->linestep[plane]); + memcpy(pout, pin, rot->draw.pixelstep[plane]); break; } } diff --git a/tests/ref/fate/filter-pixfmts-rotate b/tests/ref/fate/filter-pixfmts-rotate index ccd5d461ff..594ffc0797 100644 --- a/tests/ref/fate/filter-pixfmts-rotate +++ b/tests/ref/fate/filter-pixfmts-rotate @@ -1,10 +1,17 @@ +0bgr 1040a5c4645582fc271f7be40ea5aaf7 +0rgb 7f21fcf8fd658de854b75dd8c47b0b00 abgr 24f441d2e6e67cae2d3451aa1dad23a7 argb 993002f41f621d04cd76278e466c03eb +bgr0 efe11efe2840fa84ee95cdb913463bc1 bgr24 d0f449e8b38e07c947bd808f441a8ace bgra 54cebf01881cb63ec3727f7cc23b0a6b +gbrap 6d69c0cd0cba6300065f8d990e35b081 +gbrp b73c4db6a96fa79106232ba0e2da1c10 gray 5a896c38449a0fb08129a7394952eb31 +rgb0 c29f92ff5224044c7272c763fa5321e6 rgb24 739f0eb47e76ce5c87354d5631ac2d5b rgba f25570a798f24e8174729d978872c272 +yuv410p 22e673170464119cafb1a973c5a8080c yuv420p afed4567a1b2d54ca9bc87bbdfff9a34 yuv444p df57aba68928092b54f6b75ab01e3110 yuva420p ad9bdb4f21855550a6f94e2d96588097 -- 2.11.0