summaryrefslogtreecommitdiffstats
path: root/libavfilter/vf_histogram.c
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2015-08-19 10:05:33 +0000
committerPaul B Mahol <onemda@gmail.com>2015-08-19 10:05:33 +0000
commitfa95965f5aee9b434fad78860ff7ff1368cb2bac (patch)
treefd92fa279be339b3313160ebde5818781fd1b1c0 /libavfilter/vf_histogram.c
parent6495c4c68713f352b164f47501d274d8da2edaf5 (diff)
downloadffmpeg-streaming-fa95965f5aee9b434fad78860ff7ff1368cb2bac.zip
ffmpeg-streaming-fa95965f5aee9b434fad78860ff7ff1368cb2bac.tar.gz
avfilter/vf_histogram: make it possible to pick color components for levels mode
Signed-off-by: Paul B Mahol <onemda@gmail.com>
Diffstat (limited to 'libavfilter/vf_histogram.c')
-rw-r--r--libavfilter/vf_histogram.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/libavfilter/vf_histogram.c b/libavfilter/vf_histogram.c
index 31004b7..7c7e26d 100644
--- a/libavfilter/vf_histogram.c
+++ b/libavfilter/vf_histogram.c
@@ -50,6 +50,7 @@ typedef struct HistogramContext {
int display_mode;
int levels_mode;
const AVPixFmtDescriptor *desc;
+ int components;
} HistogramContext;
#define OFFSET(x) offsetof(HistogramContext, x)
@@ -74,6 +75,7 @@ static const AVOption histogram_options[] = {
{ "levels_mode", "set levels mode", OFFSET(levels_mode), AV_OPT_TYPE_INT, {.i64=0}, 0, 1, FLAGS, "levels_mode"},
{ "linear", NULL, 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, FLAGS, "levels_mode" },
{ "logarithmic", NULL, 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, "levels_mode" },
+ { "components", "set color components to display", OFFSET(components), AV_OPT_TYPE_INT, {.i64=7}, 1, 15, FLAGS},
{ NULL }
};
@@ -158,11 +160,16 @@ static int config_output(AVFilterLink *outlink)
{
AVFilterContext *ctx = outlink->src;
HistogramContext *h = ctx->priv;
+ int ncomp = 0, i;
switch (h->mode) {
case MODE_LEVELS:
+ for (i = 0; i < h->ncomp; i++) {
+ if ((1 << i) & h->components)
+ ncomp++;
+ }
outlink->w = 256;
- outlink->h = (h->level_height + h->scale_height) * FFMAX(h->ncomp * h->display_mode, 1);
+ outlink->h = (h->level_height + h->scale_height) * FFMAX(ncomp * h->display_mode, 1);
break;
case MODE_WAVEFORM:
if (h->waveform_mode)
@@ -238,7 +245,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
AVFrame *out;
const uint8_t *src;
uint8_t *dst;
- int i, j, k, l;
+ int i, j, k, l, m;
out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
if (!out) {
@@ -260,12 +267,16 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
switch (h->mode) {
case MODE_LEVELS:
- for (k = 0; k < h->ncomp; k++) {
+ for (m = 0, k = 0; k < h->ncomp; k++) {
const int p = h->desc->comp[k].plane;
- const int start = k * (h->level_height + h->scale_height) * h->display_mode;
+ int start;
double max_hval_log;
unsigned max_hval = 0;
+ if (!((1 << k) & h->components))
+ continue;
+ start = m++ * (h->level_height + h->scale_height) * h->display_mode;
+
for (i = 0; i < in->height; i++) {
src = in->data[p] + i * in->linesize[p];
for (j = 0; j < in->width; j++)
OpenPOWER on IntegriCloud