> > +#define RGB_TO_Y_BT709(r, g, b) \ > +((0.21260*219.0/255.0) * (r) + (0.71520*219.0/255.0) * (g) + \ > + (0.07220*219.0/255.0) * (b)) > + > +#define RGB_TO_U_BT709(r1, g1, b1, max) \ > +(-(0.11457*224.0/255.0) * r1 - (0.38543*224.0/255.0) * g1 + \ > + (0.50000*224.0/255.0) * b1 + max * 0.5) > + > +#define RGB_TO_V_BT709(r1, g1, b1, max) \ > +((0.50000*224.0/255.0) * r1 - (0.45415*224.0/255.0) * g1 - \ > + (0.04585*224.0/255.0) * b1 + max * 0.5) > + > +static float lerpf(float v0, float v1, float f) > +{ > + return v0 + (v1 - v0) * f; > +} > Do we need to make this always inline?
> + > static int config_input(AVFilterLink *inlink) > { > AVFilterContext *ctx = inlink->dst; > PseudoColorContext *s = ctx->priv; > const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format); > - int depth, ret, hsub, vsub, color; > + int depth, ret, hsub, vsub, color, factor, rgb; > > + rgb = desc->flags & AV_PIX_FMT_FLAG_RGB; > depth = desc->comp[0].depth; > + factor = 1 << (depth - 8); > s->max = (1 << depth) - 1; > s->nb_planes = av_pix_fmt_count_planes(inlink->format); > > @@ -457,7 +1138,7 @@ static int config_input(AVFilterLink *inlink) > s->var_values[VAR_VMAX] = 240 * (1 << (depth - 8)); > s->var_values[VAR_AMAX] = s->max; > > - for (color = 0; color < s->nb_planes; color++) { > + for (color = 0; color < s->nb_planes && s->preset < 0; color++) { > double res; > int val; > > @@ -488,6 +1169,56 @@ static int config_input(AVFilterLink *inlink) > } > } > > + if (s->preset >= 0) { > + for (int i = 0; i < 255; i++) { > + for (int j = 0; j < factor; j++) { > + const float lf = j / (float)factor; > + int r, g, b; > + > + g = lerpf(presets[s->preset][i][1], > presets[s->preset][i+1][1], lf) * s->max; > + b = lerpf(presets[s->preset][i][2], > presets[s->preset][i+1][2], lf) * s->max; > + r = lerpf(presets[s->preset][i][0], > presets[s->preset][i+1][0], lf) * s->max; > + > + if (!rgb) { > + int y = RGB_TO_Y_BT709(r, g, b); > + int u = RGB_TO_U_BT709(r, g, b, s->max); > + int v = RGB_TO_V_BT709(r, g, b, s->max); > + > + r = v; > + g = y; > + b = u; > + } > + > + s->lut[0][i*factor+j] = g; > + s->lut[1][i*factor+j] = b; > + s->lut[2][i*factor+j] = r; > + } > + } > + > Near the same code block as below, could we move the for loop in a function? > + for (int j = 0; j < factor; j++) { > + const float lf = j / (float)factor; > + int r, g, b; > + > + g = lerpf(presets[s->preset][254][1], > presets[s->preset][255][1], lf) * s->max; > + b = lerpf(presets[s->preset][254][2], > presets[s->preset][255][2], lf) * s->max; > + r = lerpf(presets[s->preset][254][0], > presets[s->preset][255][0], lf) * s->max; > + > + if (!rgb) { > + int y = RGB_TO_Y_BT709(r, g, b); > + int u = RGB_TO_U_BT709(r, g, b, s->max); > + int v = RGB_TO_V_BT709(r, g, b, s->max); > + > + r = v; > + g = y; > + b = u; > + } > + > + s->lut[0][255*factor+j] = g; > + s->lut[1][255*factor+j] = b; > + s->lut[2][255*factor+j] = r; the previous block is " s->lut[2][i*factor+j] = r ", Is this a typo of "s->lut[2][254*factor+j] = r" ? > + } > + } + > switch (inlink->format) { > case AV_PIX_FMT_YUV444P: > case AV_PIX_FMT_YUVA444P: > -- > 2.17.1 > > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".