int nb_jobs;
int *jobs_rets;
+ int maxsize; // history stats array size
int *histy, *histu, *histv, *histsat;
AVFrame *frame_sat;
frame->width = w;
frame->height = h;
- if (av_frame_get_buffer(frame, 32) < 0) {
+ if (av_frame_get_buffer(frame, 0) < 0) {
av_frame_free(&frame);
return NULL;
}
return frame;
}
-static int config_props(AVFilterLink *outlink)
+static int config_output(AVFilterLink *outlink)
{
AVFilterContext *ctx = outlink->src;
SignalstatsContext *s = ctx->priv;
s->hsub = desc->log2_chroma_w;
s->vsub = desc->log2_chroma_h;
s->depth = desc->comp[0].depth;
- if (s->depth > 8) {
- s->histy = av_malloc_array(1 << s->depth, sizeof(*s->histy));
- s->histu = av_malloc_array(1 << s->depth, sizeof(*s->histu));
- s->histv = av_malloc_array(1 << s->depth, sizeof(*s->histv));
- s->histsat = av_malloc_array(1 << s->depth, sizeof(*s->histsat));
-
- if (!s->histy || !s->histu || !s->histv || !s->histsat)
- return AVERROR(ENOMEM);
- }
+ s->maxsize = 1 << s->depth;
+ s->histy = av_malloc_array(s->maxsize, sizeof(*s->histy));
+ s->histu = av_malloc_array(s->maxsize, sizeof(*s->histu));
+ s->histv = av_malloc_array(s->maxsize, sizeof(*s->histv));
+ s->histsat = av_malloc_array(s->maxsize, sizeof(*s->histsat));
+
+ if (!s->histy || !s->histu || !s->histv || !s->histsat)
+ return AVERROR(ENOMEM);
outlink->w = inlink->w;
outlink->h = inlink->h;
{NULL}
};
-#define DEPTH 256
-
static int compute_sat_hue_metrics8(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
{
int i, j;
const int yuvu = p_u[i];
const int yuvv = p_v[i];
p_sat[i] = hypot(yuvu - 128, yuvv - 128); // int or round?
- ((int16_t*)p_hue)[i] = floor((180 / M_PI) * atan2f(yuvu-128, yuvv-128) + 180);
+ ((int16_t*)p_hue)[i] = fmod(floor((180 / M_PI) * atan2f(yuvu-128, yuvv-128) + 180), 360.);
}
p_u += lsz_u;
p_v += lsz_v;
const int yuvu = p_u[i];
const int yuvv = p_v[i];
p_sat[i] = hypot(yuvu - mid, yuvv - mid); // int or round?
- ((int16_t*)p_hue)[i] = floor((180 / M_PI) * atan2f(yuvu-mid, yuvv-mid) + 180);
+ ((int16_t*)p_hue)[i] = fmod(floor((180 / M_PI) * atan2f(yuvu-mid, yuvv-mid) + 180), 360.);
}
p_u += lsz_u;
p_v += lsz_v;
pw = 0, cpw = 0; // prev
int fil;
char metabuf[128];
- unsigned int histy[DEPTH] = {0},
- histu[DEPTH] = {0},
- histv[DEPTH] = {0},
+ unsigned int *histy = s->histy,
+ *histu = s->histu,
+ *histv = s->histv,
histhue[360] = {0},
- histsat[DEPTH] = {0}; // limited to 8 bit data.
+ *histsat = s->histsat;
int miny = -1, minu = -1, minv = -1;
int maxy = -1, maxu = -1, maxv = -1;
int lowy = -1, lowu = -1, lowv = -1;
NULL, FFMIN(s->chromah, ff_filter_get_nb_threads(ctx)));
// Calculate luma histogram and difference with previous frame or field.
+ memset(s->histy, 0, s->maxsize * sizeof(*s->histy));
for (j = 0; j < link->h; j++) {
for (i = 0; i < link->w; i++) {
const int yuv = in->data[0][w + i];
}
// Calculate chroma histogram and difference with previous frame or field.
+ memset(s->histu, 0, s->maxsize * sizeof(*s->histu));
+ memset(s->histv, 0, s->maxsize * sizeof(*s->histv));
+ memset(s->histsat, 0, s->maxsize * sizeof(*s->histsat));
for (j = 0; j < s->chromah; j++) {
for (i = 0; i < s->chromaw; i++) {
const int yuvu = in->data[1][cw+i];
chighp = lrint(s->cfs * 90 / 100.);
accy = accu = accv = accsat = 0;
- for (fil = 0; fil < DEPTH; fil++) {
+ for (fil = 0; fil < s->maxsize; fil++) {
if (miny < 0 && histy[fil]) miny = fil;
if (minu < 0 && histu[fil]) minu = fil;
if (minv < 0 && histv[fil]) minv = fil;
NULL, FFMIN(s->chromah, ff_filter_get_nb_threads(ctx)));
// Calculate luma histogram and difference with previous frame or field.
- memset(s->histy, 0, (1 << s->depth) * sizeof(*s->histy));
+ memset(s->histy, 0, s->maxsize * sizeof(*s->histy));
for (j = 0; j < link->h; j++) {
for (i = 0; i < link->w; i++) {
const int yuv = AV_RN16(in->data[0] + w + i * 2);
}
// Calculate chroma histogram and difference with previous frame or field.
- memset(s->histu, 0, (1 << s->depth) * sizeof(*s->histu));
- memset(s->histv, 0, (1 << s->depth) * sizeof(*s->histv));
- memset(s->histsat, 0, (1 << s->depth) * sizeof(*s->histsat));
+ memset(s->histu, 0, s->maxsize * sizeof(*s->histu));
+ memset(s->histv, 0, s->maxsize * sizeof(*s->histv));
+ memset(s->histsat, 0, s->maxsize * sizeof(*s->histsat));
for (j = 0; j < s->chromah; j++) {
for (i = 0; i < s->chromaw; i++) {
const int yuvu = AV_RN16(in->data[1] + cw + i * 2);
chighp = lrint(s->cfs * 90 / 100.);
accy = accu = accv = accsat = 0;
- for (fil = 0; fil < 1 << s->depth; fil++) {
+ for (fil = 0; fil < s->maxsize; fil++) {
if (miny < 0 && histy[fil]) miny = fil;
if (minu < 0 && histu[fil]) minu = fil;
if (minv < 0 && histv[fil]) minv = fil;
static const AVFilterPad signalstats_outputs[] = {
{
.name = "default",
- .config_props = config_props,
+ .config_props = config_output,
.type = AVMEDIA_TYPE_VIDEO,
},
{ NULL }
};
-AVFilter ff_vf_signalstats = {
+const AVFilter ff_vf_signalstats = {
.name = "signalstats",
.description = "Generate statistics from video analysis.",
.init = init,