avfilter/vf_lagfun: use macro

This commit is contained in:
Paul B Mahol 2021-02-11 00:40:04 +01:00
parent 05b394d537
commit 16c09b4659

View File

@ -77,91 +77,55 @@ typedef struct ThreadData {
AVFrame *in, *out; AVFrame *in, *out;
} ThreadData; } ThreadData;
static int lagfun_frame8(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) #define LAGFUN(name, type) \
{ static int lagfun_frame##name(AVFilterContext *ctx, void *arg, \
LagfunContext *s = ctx->priv; int jobnr, int nb_jobs) \
const float decay = s->decay; { \
ThreadData *td = arg; LagfunContext *s = ctx->priv; \
AVFrame *in = td->in; const float decay = s->decay; \
AVFrame *out = td->out; ThreadData *td = arg; \
AVFrame *in = td->in; \
for (int p = 0; p < s->nb_planes; p++) { AVFrame *out = td->out; \
const int slice_start = (s->planeheight[p] * jobnr) / nb_jobs; \
const int slice_end = (s->planeheight[p] * (jobnr+1)) / nb_jobs; for (int p = 0; p < s->nb_planes; p++) { \
const uint8_t *src = in->data[p] + slice_start * in->linesize[p]; const int slice_start = (s->planeheight[p] * jobnr) / nb_jobs; \
float *osrc = s->old[p] + slice_start * s->planewidth[p]; const int slice_end = (s->planeheight[p] * (jobnr+1)) / nb_jobs; \
uint8_t *dst = out->data[p] + slice_start * out->linesize[p]; const type *src = (const type *)in->data[p] + \
slice_start * in->linesize[p] / sizeof(type); \
if (!((1 << p) & s->planes)) { float *osrc = s->old[p] + slice_start * s->planewidth[p]; \
av_image_copy_plane(dst, out->linesize[p], type *dst = (type *)out->data[p] + \
src, in->linesize[p], slice_start * out->linesize[p] / sizeof(type); \
s->linesize[p], slice_end - slice_start); \
continue; if (!((1 << p) & s->planes)) { \
} av_image_copy_plane((uint8_t *)dst, out->linesize[p], \
(const uint8_t *)src, in->linesize[p], \
for (int y = slice_start; y < slice_end; y++) { s->linesize[p], slice_end - slice_start); \
for (int x = 0; x < s->planewidth[p]; x++) { continue; \
float v = FFMAX(src[x], osrc[x] * decay); } \
\
osrc[x] = v; for (int y = slice_start; y < slice_end; y++) { \
if (ctx->is_disabled) { for (int x = 0; x < s->planewidth[p]; x++) { \
dst[x] = src[x]; float v = FFMAX(src[x], osrc[x] * decay); \
} else { \
dst[x] = lrintf(v); osrc[x] = v; \
} if (ctx->is_disabled) { \
} dst[x] = src[x]; \
} else { \
src += in->linesize[p]; dst[x] = lrintf(v); \
osrc += s->planewidth[p]; } \
dst += out->linesize[p]; } \
} \
} src += in->linesize[p] / sizeof(type); \
osrc += s->planewidth[p]; \
return 0; dst += out->linesize[p] / sizeof(type); \
} \
} \
\
return 0; \
} }
static int lagfun_frame16(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) LAGFUN(8, uint8_t)
{ LAGFUN(16, uint16_t)
LagfunContext *s = ctx->priv;
const float decay = s->decay;
ThreadData *td = arg;
AVFrame *in = td->in;
AVFrame *out = td->out;
for (int p = 0; p < s->nb_planes; p++) {
const int slice_start = (s->planeheight[p] * jobnr) / nb_jobs;
const int slice_end = (s->planeheight[p] * (jobnr+1)) / nb_jobs;
const uint16_t *src = (const uint16_t *)in->data[p] + slice_start * in->linesize[p] / 2;
float *osrc = s->old[p] + slice_start * s->planewidth[p];
uint16_t *dst = (uint16_t *)out->data[p] + slice_start * out->linesize[p] / 2;
if (!((1 << p) & s->planes)) {
av_image_copy_plane((uint8_t *)dst, out->linesize[p],
(uint8_t *)src, in->linesize[p],
s->linesize[p], slice_end - slice_start);
continue;
}
for (int y = slice_start; y < slice_end; y++) {
for (int x = 0; x < s->planewidth[p]; x++) {
float v = FFMAX(src[x], osrc[x] * decay);
osrc[x] = v;
if (ctx->is_disabled) {
dst[x] = src[x];
} else {
dst[x] = lrintf(v);
}
}
src += in->linesize[p] / 2;
osrc += s->planewidth[p];
dst += out->linesize[p] / 2;
}
}
return 0;
}
static int config_output(AVFilterLink *outlink) static int config_output(AVFilterLink *outlink)
{ {