forked from FFmpeg/FFmpeg
avfilter/vf_colorspace: use colorspace negotiation API
Fixes a regression due to the fact that the colorspace filter does not use the new API introduced by8c7934f73a
. The scale filter uses it since45e09a3041
, and the setparams filter since3bf80df3cc
. Example: ffprobe -f lavfi yuvtestsrc,setparams=color_primaries=bt470bg:color_trc= bt470bg:colorspace=bt470bg,colorspace=bt709:range=tv,scale,showinfo Before: color_range:unknown color_space:bt470bg ... After: color_range:tv color_space:bt709 ... Signed-off-by: Nicolas Gaullier <nicolas.gaullier@cji.paris> Signed-off-by: Niklas Haas <git@haasn.dev>
This commit is contained in:
parent
38c322681e
commit
376b3d53c5
1 changed files with 36 additions and 26 deletions
|
@ -433,8 +433,7 @@ static int create_filtergraph(AVFilterContext *ctx,
|
|||
if (out->color_trc != s->out_trc) s->out_txchr = NULL;
|
||||
if (in->colorspace != s->in_csp ||
|
||||
in->color_range != s->in_rng) s->in_lumacoef = NULL;
|
||||
if (out->colorspace != s->out_csp ||
|
||||
out->color_range != s->out_rng) s->out_lumacoef = NULL;
|
||||
if (out->color_range != s->out_rng) s->rgb2yuv = NULL;
|
||||
|
||||
if (!s->out_primaries || !s->in_primaries) {
|
||||
s->in_prm = in->color_primaries;
|
||||
|
@ -563,26 +562,8 @@ static int create_filtergraph(AVFilterContext *ctx,
|
|||
redo_yuv2rgb = 1;
|
||||
}
|
||||
|
||||
if (!s->out_lumacoef) {
|
||||
s->out_csp = out->colorspace;
|
||||
if (!s->rgb2yuv) {
|
||||
s->out_rng = out->color_range;
|
||||
s->out_lumacoef = av_csp_luma_coeffs_from_avcsp(s->out_csp);
|
||||
if (!s->out_lumacoef) {
|
||||
if (s->out_csp == AVCOL_SPC_UNSPECIFIED) {
|
||||
if (s->user_all == CS_UNSPECIFIED) {
|
||||
av_log(ctx, AV_LOG_ERROR,
|
||||
"Please specify output colorspace\n");
|
||||
} else {
|
||||
av_log(ctx, AV_LOG_ERROR,
|
||||
"Unsupported output color property %d\n", s->user_all);
|
||||
}
|
||||
} else {
|
||||
av_log(ctx, AV_LOG_ERROR,
|
||||
"Unsupported output colorspace %d (%s)\n", s->out_csp,
|
||||
av_color_space_name(s->out_csp));
|
||||
}
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
redo_rgb2yuv = 1;
|
||||
}
|
||||
|
||||
|
@ -687,6 +668,26 @@ static av_cold int init(AVFilterContext *ctx)
|
|||
{
|
||||
ColorSpaceContext *s = ctx->priv;
|
||||
|
||||
s->out_csp = s->user_csp == AVCOL_SPC_UNSPECIFIED ?
|
||||
default_csp[FFMIN(s->user_all, CS_NB)] : s->user_csp;
|
||||
s->out_lumacoef = av_csp_luma_coeffs_from_avcsp(s->out_csp);
|
||||
if (!s->out_lumacoef) {
|
||||
if (s->out_csp == AVCOL_SPC_UNSPECIFIED) {
|
||||
if (s->user_all == CS_UNSPECIFIED) {
|
||||
av_log(ctx, AV_LOG_ERROR,
|
||||
"Please specify output colorspace\n");
|
||||
} else {
|
||||
av_log(ctx, AV_LOG_ERROR,
|
||||
"Unsupported output color property %d\n", s->user_all);
|
||||
}
|
||||
} else {
|
||||
av_log(ctx, AV_LOG_ERROR,
|
||||
"Unsupported output colorspace %d (%s)\n", s->out_csp,
|
||||
av_color_space_name(s->out_csp));
|
||||
}
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
ff_colorspacedsp_init(&s->dsp);
|
||||
|
||||
return 0;
|
||||
|
@ -735,6 +736,9 @@ static int filter_frame(AVFilterLink *link, AVFrame *in)
|
|||
return res;
|
||||
}
|
||||
|
||||
out->colorspace = s->out_csp;
|
||||
out->color_range = s->user_rng == AVCOL_RANGE_UNSPECIFIED ?
|
||||
in->color_range : s->user_rng;
|
||||
out->color_primaries = s->user_prm == AVCOL_PRI_UNSPECIFIED ?
|
||||
default_prm[FFMIN(s->user_all, CS_NB)] : s->user_prm;
|
||||
if (s->user_trc == AVCOL_TRC_UNSPECIFIED) {
|
||||
|
@ -746,10 +750,6 @@ static int filter_frame(AVFilterLink *link, AVFrame *in)
|
|||
} else {
|
||||
out->color_trc = s->user_trc;
|
||||
}
|
||||
out->colorspace = s->user_csp == AVCOL_SPC_UNSPECIFIED ?
|
||||
default_csp[FFMIN(s->user_all, CS_NB)] : s->user_csp;
|
||||
out->color_range = s->user_rng == AVCOL_RANGE_UNSPECIFIED ?
|
||||
in->color_range : s->user_rng;
|
||||
if (rgb_sz != s->rgb_sz) {
|
||||
const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(out->format);
|
||||
int uvw = in->width >> desc->log2_chroma_w;
|
||||
|
@ -841,8 +841,18 @@ static int query_formats(AVFilterContext *ctx)
|
|||
};
|
||||
int res;
|
||||
ColorSpaceContext *s = ctx->priv;
|
||||
AVFilterLink *outlink = ctx->outputs[0];
|
||||
AVFilterFormats *formats = ff_make_format_list(pix_fmts);
|
||||
|
||||
res = ff_formats_ref(ff_make_formats_list_singleton(s->out_csp), &outlink->incfg.color_spaces);
|
||||
if (res < 0)
|
||||
return res;
|
||||
if (s->user_rng != AVCOL_RANGE_UNSPECIFIED) {
|
||||
res = ff_formats_ref(ff_make_formats_list_singleton(s->user_rng), &outlink->incfg.color_ranges);
|
||||
if (res < 0)
|
||||
return res;
|
||||
}
|
||||
|
||||
if (!formats)
|
||||
return AVERROR(ENOMEM);
|
||||
if (s->user_format == AV_PIX_FMT_NONE)
|
||||
|
@ -855,7 +865,7 @@ static int query_formats(AVFilterContext *ctx)
|
|||
if (res < 0)
|
||||
return res;
|
||||
|
||||
return ff_formats_ref(formats, &ctx->outputs[0]->incfg.formats);
|
||||
return ff_formats_ref(formats, &outlink->incfg.formats);
|
||||
}
|
||||
|
||||
static int config_props(AVFilterLink *outlink)
|
||||
|
|
Loading…
Add table
Reference in a new issue