avfilter/vf_histogram: levels: support more input pixel formats
authorPaul B Mahol <onemda@gmail.com>
Sun, 23 Aug 2015 10:10:34 +0000 (10:10 +0000)
committerPaul B Mahol <onemda@gmail.com>
Sun, 23 Aug 2015 10:13:52 +0000 (10:13 +0000)
Signed-off-by: Paul B Mahol <onemda@gmail.com>
libavfilter/vf_histogram.c
tests/ref/fate/filter-histogram-levels

index 2712939..ece0b13 100644 (file)
@@ -49,8 +49,10 @@ typedef struct HistogramContext {
     int            waveform_mirror;
     int            display_mode;
     int            levels_mode;
-    const AVPixFmtDescriptor *desc;
+    const AVPixFmtDescriptor *desc, *odesc;
     int            components;
+    int            planewidth[4];
+    int            planeheight[4];
 } HistogramContext;
 
 #define OFFSET(x) offsetof(HistogramContext, x)
@@ -86,9 +88,25 @@ static const enum AVPixelFormat color_pix_fmts[] = {
     AV_PIX_FMT_NONE
 };
 
-static const enum AVPixelFormat levels_pix_fmts[] = {
-    AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUVA444P, AV_PIX_FMT_YUVJ444P,
-    AV_PIX_FMT_GRAY8, AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRAP, AV_PIX_FMT_NONE
+static const enum AVPixelFormat levels_in_pix_fmts[] = {
+    AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUVJ420P,
+    AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUVJ422P,
+    AV_PIX_FMT_YUV411P,  AV_PIX_FMT_YUVJ411P,
+    AV_PIX_FMT_YUV440P,  AV_PIX_FMT_YUV410P,
+    AV_PIX_FMT_YUVA444P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUVJ444P,
+    AV_PIX_FMT_GBRAP,    AV_PIX_FMT_GBRP,
+    AV_PIX_FMT_GRAY8,
+    AV_PIX_FMT_NONE
+};
+
+static const enum AVPixelFormat levels_out_yuv_pix_fmts[] = {
+    AV_PIX_FMT_YUVA444P, AV_PIX_FMT_YUV444P,
+    AV_PIX_FMT_NONE
+};
+
+static const enum AVPixelFormat levels_out_rgb_pix_fmts[] = {
+    AV_PIX_FMT_GBRAP,    AV_PIX_FMT_GBRP,
+    AV_PIX_FMT_NONE
 };
 
 static const enum AVPixelFormat waveform_pix_fmts[] = {
@@ -114,7 +132,36 @@ static int query_formats(AVFilterContext *ctx)
         pix_fmts = waveform_pix_fmts;
         break;
     case MODE_LEVELS:
-        pix_fmts = levels_pix_fmts;
+    {
+        AVFilterFormats *avff;
+        const AVPixFmtDescriptor *desc;
+        const enum AVPixelFormat *out_pix_fmts;
+        int rgb, i;
+
+        if (!ctx->inputs[0]->in_formats ||
+            !ctx->inputs[0]->in_formats->nb_formats) {
+            return AVERROR(EAGAIN);
+        }
+
+        if (!ctx->inputs[0]->out_formats)
+            ff_formats_ref(ff_make_format_list(levels_in_pix_fmts), &ctx->inputs[0]->out_formats);
+        avff = ctx->inputs[0]->in_formats;
+        desc = av_pix_fmt_desc_get(avff->formats[0]);
+        rgb = desc->flags & AV_PIX_FMT_FLAG_RGB;
+        for (i = 1; i < avff->nb_formats; i++) {
+            desc = av_pix_fmt_desc_get(avff->formats[i]);
+            if (rgb != desc->flags & AV_PIX_FMT_FLAG_RGB)
+                return AVERROR(EAGAIN);
+        }
+
+        if (rgb)
+            out_pix_fmts = levels_out_rgb_pix_fmts;
+        else
+            out_pix_fmts = levels_out_yuv_pix_fmts;
+        ff_formats_ref(ff_make_format_list(out_pix_fmts), &ctx->outputs[0]->in_formats);
+
+        return 0;
+    }
         break;
     case MODE_COLOR:
     case MODE_COLOR2:
@@ -153,6 +200,11 @@ static int config_input(AVFilterLink *inlink)
         h->fg_color = white_yuva_color;
     }
 
+    h->planeheight[1] = h->planeheight[2] = FF_CEIL_RSHIFT(inlink->h, h->desc->log2_chroma_h);
+    h->planeheight[0] = h->planeheight[3] = inlink->h;
+    h->planewidth[1]  = h->planewidth[2]  = FF_CEIL_RSHIFT(inlink->w, h->desc->log2_chroma_w);
+    h->planewidth[0]  = h->planewidth[3]  = inlink->w;
+
     return 0;
 }
 
@@ -187,6 +239,7 @@ static int config_output(AVFilterLink *outlink)
         av_assert0(0);
     }
 
+    h->odesc = av_pix_fmt_desc_get(outlink->format);
     outlink->sample_aspect_ratio = (AVRational){1,1};
 
     return 0;
@@ -257,13 +310,13 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
 
     out->pts = in->pts;
 
-    for (k = 0; k < h->ncomp; k++) {
+    for (k = 0; k < 4 && out->data[k]; k++) {
         const int is_chroma = (k == 1 || k == 2);
-        const int dst_h = FF_CEIL_RSHIFT(outlink->h, (is_chroma ? h->desc->log2_chroma_h : 0));
-        const int dst_w = FF_CEIL_RSHIFT(outlink->w, (is_chroma ? h->desc->log2_chroma_w : 0));
+        const int dst_h = FF_CEIL_RSHIFT(outlink->h, (is_chroma ? h->odesc->log2_chroma_h : 0));
+        const int dst_w = FF_CEIL_RSHIFT(outlink->w, (is_chroma ? h->odesc->log2_chroma_w : 0));
         for (i = 0; i < dst_h ; i++)
-            memset(out->data[h->desc->comp[k].plane] +
-                   i * out->linesize[h->desc->comp[k].plane],
+            memset(out->data[h->odesc->comp[k].plane] +
+                   i * out->linesize[h->odesc->comp[k].plane],
                    h->bg_color[k], dst_w);
     }
 
@@ -271,6 +324,8 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
     case MODE_LEVELS:
         for (m = 0, k = 0; k < h->ncomp; k++) {
             const int p = h->desc->comp[k].plane;
+            const int height = h->planeheight[p];
+            const int width = h->planewidth[p];
             int start;
             double max_hval_log;
             unsigned max_hval = 0;
@@ -279,9 +334,9 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
                 continue;
             start = m++ * (h->level_height + h->scale_height) * h->display_mode;
 
-            for (i = 0; i < in->height; i++) {
+            for (i = 0; i < height; i++) {
                 src = in->data[p] + i * in->linesize[p];
-                for (j = 0; j < in->width; j++)
+                for (j = 0; j < width; j++)
                     h->histogram[src[j]]++;
             }
 
index df9f6b2..bd268ca 100644 (file)
@@ -1,51 +1,51 @@
 #tb 0: 1/25
-0,          0,          0,        1,   488448, 0x0d7343b9
-0,          1,          1,        1,   488448, 0x118e3ade
-0,          2,          2,        1,   488448, 0x778f1ba9
-0,          3,          3,        1,   488448, 0x153bf44e
-0,          4,          4,        1,   488448, 0x2d83c1ab
-0,          5,          5,        1,   488448, 0xa3e95f8f
-0,          6,          6,        1,   488448, 0x91aad31b
-0,          7,          7,        1,   488448, 0x90b92c09
-0,          8,          8,        1,   488448, 0x1e4c9f41
-0,          9,          9,        1,   488448, 0xa88c1882
-0,         10,         10,        1,   488448, 0x1aa04274
-0,         11,         11,        1,   488448, 0x49c45de8
-0,         12,         12,        1,   488448, 0xe799c29f
-0,         13,         13,        1,   488448, 0x789e233f
-0,         14,         14,        1,   488448, 0x9f753404
-0,         15,         15,        1,   488448, 0x83050c2c
-0,         16,         16,        1,   488448, 0xddf7ccbf
-0,         17,         17,        1,   488448, 0xe3128531
-0,         18,         18,        1,   488448, 0xcc6596af
-0,         19,         19,        1,   488448, 0x6e19754f
-0,         20,         20,        1,   488448, 0xc3b32c7c
-0,         21,         21,        1,   488448, 0x40b4853f
-0,         22,         22,        1,   488448, 0x6e492674
-0,         23,         23,        1,   488448, 0x7f867236
-0,         24,         24,        1,   488448, 0x22094365
-0,         25,         25,        1,   488448, 0x45f30fc3
-0,         26,         26,        1,   488448, 0xe6cbad09
-0,         27,         27,        1,   488448, 0x0c44836b
-0,         28,         28,        1,   488448, 0xa7f04271
-0,         29,         29,        1,   488448, 0xd222ba88
-0,         30,         30,        1,   488448, 0xc96a9749
-0,         31,         31,        1,   488448, 0x82e25bbd
-0,         32,         32,        1,   488448, 0xf79d1882
-0,         33,         33,        1,   488448, 0x6d7fdd68
-0,         34,         34,        1,   488448, 0xeb5c9b1b
-0,         35,         35,        1,   488448, 0x9014f9f4
-0,         36,         36,        1,   488448, 0x96c6ab5f
-0,         37,         37,        1,   488448, 0x03911af0
-0,         38,         38,        1,   488448, 0xbf9dd8eb
-0,         39,         39,        1,   488448, 0x73509963
-0,         40,         40,        1,   488448, 0xf2ecb068
-0,         41,         41,        1,   488448, 0xec2fb311
-0,         42,         42,        1,   488448, 0xf4c7ba26
-0,         43,         43,        1,   488448, 0x23f56543
-0,         44,         44,        1,   488448, 0x25f8c48c
-0,         45,         45,        1,   488448, 0xf1ccd38b
-0,         46,         46,        1,   488448, 0x10780667
-0,         47,         47,        1,   488448, 0xbeb70431
-0,         48,         48,        1,   488448, 0xbc950678
-0,         49,         49,        1,   488448, 0xfedf5d83
+0,          0,          0,        1,   488448, 0xc27a6cac
+0,          1,          1,        1,   488448, 0xf00a152e
+0,          2,          2,        1,   488448, 0x060b8c70
+0,          3,          3,        1,   488448, 0xf75d6ee2
+0,          4,          4,        1,   488448, 0xd7a7f06e
+0,          5,          5,        1,   488448, 0x585281a5
+0,          6,          6,        1,   488448, 0xb06e3ee8
+0,          7,          7,        1,   488448, 0x201d0b8c
+0,          8,          8,        1,   488448, 0x4e14e319
+0,          9,          9,        1,   488448, 0x5aef5cca
+0,         10,         10,        1,   488448, 0x57018668
+0,         11,         11,        1,   488448, 0x2ad45b3f
+0,         12,         12,        1,   488448, 0x62cc36b8
+0,         13,         13,        1,   488448, 0x9e84585e
+0,         14,         14,        1,   488448, 0xe6552e42
+0,         15,         15,        1,   488448, 0x13b90c2c
+0,         16,         16,        1,   488448, 0xf9557145
+0,         17,         17,        1,   488448, 0x818340bc
+0,         18,         18,        1,   488448, 0x5112c6e1
+0,         19,         19,        1,   488448, 0x5d5b8f43
+0,         20,         20,        1,   488448, 0xf2101ea6
+0,         21,         21,        1,   488448, 0x4266af4d
+0,         22,         22,        1,   488448, 0xb358806e
+0,         23,         23,        1,   488448, 0xe336aa60
+0,         24,         24,        1,   488448, 0x64fcc339
+0,         25,         25,        1,   488448, 0x86e4b729
+0,         26,         26,        1,   488448, 0x48c380d0
+0,         27,         27,        1,   488448, 0xaee36fd3
+0,         28,         28,        1,   488448, 0x20b84429
+0,         29,         29,        1,   488448, 0x84d85542
+0,         30,         30,        1,   488448, 0x94aea169
+0,         31,         31,        1,   488448, 0x6278fa2c
+0,         32,         32,        1,   488448, 0xaadf998d
+0,         33,         33,        1,   488448, 0x29bba90d
+0,         34,         34,        1,   488448, 0xef1117ad
+0,         35,         35,        1,   488448, 0xd961e36d
+0,         36,         36,        1,   488448, 0xff53296e
+0,         37,         37,        1,   488448, 0x41f381f9
+0,         38,         38,        1,   488448, 0x66fcfc2a
+0,         39,         39,        1,   488448, 0x758bb472
+0,         40,         40,        1,   488448, 0xefc6dc9e
+0,         41,         41,        1,   488448, 0x77fccb69
+0,         42,         42,        1,   488448, 0x7a1d82a4
+0,         43,         43,        1,   488448, 0xc9d61a1b
+0,         44,         44,        1,   488448, 0x8e689deb
+0,         45,         45,        1,   488448, 0x52133e75
+0,         46,         46,        1,   488448, 0xcc0a098e
+0,         47,         47,        1,   488448, 0x045cd17f
+0,         48,         48,        1,   488448, 0x97f89963
+0,         49,         49,        1,   488448, 0xa1f835ff