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:
committed by
Niklas Haas
parent
38c322681e
commit
376b3d53c5
@@ -433,8 +433,7 @@ static int create_filtergraph(AVFilterContext *ctx,
|
|||||||
if (out->color_trc != s->out_trc) s->out_txchr = NULL;
|
if (out->color_trc != s->out_trc) s->out_txchr = NULL;
|
||||||
if (in->colorspace != s->in_csp ||
|
if (in->colorspace != s->in_csp ||
|
||||||
in->color_range != s->in_rng) s->in_lumacoef = NULL;
|
in->color_range != s->in_rng) s->in_lumacoef = NULL;
|
||||||
if (out->colorspace != s->out_csp ||
|
if (out->color_range != s->out_rng) s->rgb2yuv = NULL;
|
||||||
out->color_range != s->out_rng) s->out_lumacoef = NULL;
|
|
||||||
|
|
||||||
if (!s->out_primaries || !s->in_primaries) {
|
if (!s->out_primaries || !s->in_primaries) {
|
||||||
s->in_prm = in->color_primaries;
|
s->in_prm = in->color_primaries;
|
||||||
@@ -563,26 +562,8 @@ static int create_filtergraph(AVFilterContext *ctx,
|
|||||||
redo_yuv2rgb = 1;
|
redo_yuv2rgb = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!s->out_lumacoef) {
|
if (!s->rgb2yuv) {
|
||||||
s->out_csp = out->colorspace;
|
|
||||||
s->out_rng = out->color_range;
|
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;
|
redo_rgb2yuv = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -687,6 +668,26 @@ static av_cold int init(AVFilterContext *ctx)
|
|||||||
{
|
{
|
||||||
ColorSpaceContext *s = ctx->priv;
|
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);
|
ff_colorspacedsp_init(&s->dsp);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -735,6 +736,9 @@ static int filter_frame(AVFilterLink *link, AVFrame *in)
|
|||||||
return res;
|
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 ?
|
out->color_primaries = s->user_prm == AVCOL_PRI_UNSPECIFIED ?
|
||||||
default_prm[FFMIN(s->user_all, CS_NB)] : s->user_prm;
|
default_prm[FFMIN(s->user_all, CS_NB)] : s->user_prm;
|
||||||
if (s->user_trc == AVCOL_TRC_UNSPECIFIED) {
|
if (s->user_trc == AVCOL_TRC_UNSPECIFIED) {
|
||||||
@@ -746,10 +750,6 @@ static int filter_frame(AVFilterLink *link, AVFrame *in)
|
|||||||
} else {
|
} else {
|
||||||
out->color_trc = s->user_trc;
|
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) {
|
if (rgb_sz != s->rgb_sz) {
|
||||||
const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(out->format);
|
const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(out->format);
|
||||||
int uvw = in->width >> desc->log2_chroma_w;
|
int uvw = in->width >> desc->log2_chroma_w;
|
||||||
@@ -841,8 +841,18 @@ static int query_formats(AVFilterContext *ctx)
|
|||||||
};
|
};
|
||||||
int res;
|
int res;
|
||||||
ColorSpaceContext *s = ctx->priv;
|
ColorSpaceContext *s = ctx->priv;
|
||||||
|
AVFilterLink *outlink = ctx->outputs[0];
|
||||||
AVFilterFormats *formats = ff_make_format_list(pix_fmts);
|
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)
|
if (!formats)
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
if (s->user_format == AV_PIX_FMT_NONE)
|
if (s->user_format == AV_PIX_FMT_NONE)
|
||||||
@@ -855,7 +865,7 @@ static int query_formats(AVFilterContext *ctx)
|
|||||||
if (res < 0)
|
if (res < 0)
|
||||||
return res;
|
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)
|
static int config_props(AVFilterLink *outlink)
|
||||||
|
Reference in New Issue
Block a user