From 92a688cabdb0f3a53ca6f460fe942ce734e3b12a Mon Sep 17 00:00:00 2001 From: Lynne Date: Tue, 28 Oct 2025 14:18:19 +0100 Subject: [PATCH] lavu: add support for Panasonic V-Gamut --- libavfilter/vf_libplacebo.c | 1 + libavfilter/vf_setparams.c | 3 ++- libavutil/csp.c | 17 +++++++++++------ libavutil/pixdesc.c | 21 +++++++++++++++++++-- libavutil/pixfmt.h | 7 ++++++- 5 files changed, 39 insertions(+), 10 deletions(-) diff --git a/libavfilter/vf_libplacebo.c b/libavfilter/vf_libplacebo.c index 6bf0d9fc87..f2cf83ab33 100644 --- a/libavfilter/vf_libplacebo.c +++ b/libavfilter/vf_libplacebo.c @@ -1665,6 +1665,7 @@ static const AVOption libplacebo_options[] = { {"smpte432", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_SMPTE432}, INT_MIN, INT_MAX, STATIC, .unit = "color_primaries"}, {"jedec-p22", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_JEDEC_P22}, INT_MIN, INT_MAX, STATIC, .unit = "color_primaries"}, {"ebu3213", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_EBU3213}, INT_MIN, INT_MAX, STATIC, .unit = "color_primaries"}, + {"vgamut", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_V_GAMUT}, INT_MIN, INT_MAX, STATIC, .unit = "color_primaries"}, {"color_trc", "select color transfer", OFFSET(color_trc), AV_OPT_TYPE_INT, {.i64=-1}, -1, AVCOL_TRC_NB-1, DYNAMIC, .unit = "color_trc"}, {"auto", "keep the same color transfer", 0, AV_OPT_TYPE_CONST, {.i64=-1}, INT_MIN, INT_MAX, STATIC, .unit = "color_trc"}, diff --git a/libavfilter/vf_setparams.c b/libavfilter/vf_setparams.c index dd765f9d08..17ffa098c2 100644 --- a/libavfilter/vf_setparams.c +++ b/libavfilter/vf_setparams.c @@ -66,7 +66,7 @@ static const AVOption setparams_options[] = { {"pc", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_JPEG}, 0, 0, FLAGS, .unit = "range"}, {"jpeg", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_JPEG}, 0, 0, FLAGS, .unit = "range"}, - {"color_primaries", "select color primaries", OFFSET(color_primaries), AV_OPT_TYPE_INT, {.i64=-1}, -1, AVCOL_PRI_NB-1, FLAGS, .unit = "color_primaries"}, + {"color_primaries", "select color primaries", OFFSET(color_primaries), AV_OPT_TYPE_INT, {.i64=-1}, -1, AVCOL_PRI_EXT_NB-1, FLAGS, .unit = "color_primaries"}, {"auto", "keep the same color primaries", 0, AV_OPT_TYPE_CONST, {.i64=-1}, 0, 0, FLAGS, .unit = "color_primaries"}, {"bt709", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_BT709}, 0, 0, FLAGS, .unit = "color_primaries"}, {"unknown", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_UNSPECIFIED}, 0, 0, FLAGS, .unit = "color_primaries"}, @@ -81,6 +81,7 @@ static const AVOption setparams_options[] = { {"smpte432", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_SMPTE432}, 0, 0, FLAGS, .unit = "color_primaries"}, {"jedec-p22", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_JEDEC_P22}, 0, 0, FLAGS, .unit = "color_primaries"}, {"ebu3213", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_EBU3213}, 0, 0, FLAGS, .unit = "color_primaries"}, + {"vgamut", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_V_GAMUT}, 0, 0, FLAGS, .unit = "color_primaries"}, {"color_trc", "select color transfer", OFFSET(color_trc), AV_OPT_TYPE_INT, {.i64=-1}, -1, AVCOL_TRC_EXT_NB-1, FLAGS, .unit = "color_trc"}, {"auto", "keep the same color transfer", 0, AV_OPT_TYPE_CONST, {.i64=-1}, 0, 0, FLAGS, .unit = "color_trc"}, diff --git a/libavutil/csp.c b/libavutil/csp.c index 914de37985..c8ecddc110 100644 --- a/libavutil/csp.c +++ b/libavutil/csp.c @@ -87,16 +87,21 @@ static const AVColorPrimariesDesc color_primaries[AVCOL_PRI_NB] = { [AVCOL_PRI_JEDEC_P22] = { WP_D65, { { AVR(0.630), AVR(0.340) }, { AVR(0.295), AVR(0.605) }, { AVR(0.155), AVR(0.077) } } }, }; +static const AVColorPrimariesDesc color_primaries_ext[AVCOL_PRI_EXT_NB - + AVCOL_PRI_EXT_BASE] = { + [AVCOL_PRI_V_GAMUT - AVCOL_PRI_EXT_BASE] = { WP_D65, { { AVR(0.730), AVR(0.280) }, { AVR(0.165), AVR(0.840) }, { AVR(0.100), AVR(-0.030) } } }, +}; + const AVColorPrimariesDesc *av_csp_primaries_desc_from_id(enum AVColorPrimaries prm) { - const AVColorPrimariesDesc *p; - - if ((unsigned)prm >= AVCOL_PRI_NB) - return NULL; - p = &color_primaries[prm]; + const AVColorPrimariesDesc *p = NULL; + if ((unsigned)prm < AVCOL_PRI_NB) + p = &color_primaries[prm]; + else if (((unsigned)prm >= AVCOL_PRI_EXT_BASE) && + ((unsigned)prm < AVCOL_PRI_EXT_NB)) + p = &color_primaries_ext[prm - AVCOL_PRI_EXT_BASE]; if (!p->prim.r.x.num) return NULL; - return p; } diff --git a/libavutil/pixdesc.c b/libavutil/pixdesc.c index 7fc47e8ba1..0e00142995 100644 --- a/libavutil/pixdesc.c +++ b/libavutil/pixdesc.c @@ -3430,6 +3430,11 @@ static const char * const color_primaries_names[AVCOL_PRI_NB] = { [AVCOL_PRI_EBU3213] = "ebu3213", }; +static const char * const color_primaries_names_ext[AVCOL_PRI_EXT_NB - + AVCOL_PRI_EXT_BASE] = { + [AVCOL_PRI_V_GAMUT - AVCOL_PRI_EXT_BASE] = "vgamut", +}; + static const char * const color_transfer_names[] = { [AVCOL_TRC_RESERVED0] = "reserved", [AVCOL_TRC_BT709] = "bt709", @@ -3922,8 +3927,12 @@ int av_color_range_from_name(const char *name) const char *av_color_primaries_name(enum AVColorPrimaries primaries) { - return (unsigned) primaries < AVCOL_PRI_NB ? - color_primaries_names[primaries] : NULL; + if ((unsigned)primaries < AVCOL_PRI_NB) + return color_primaries_names[primaries]; + else if (((unsigned)primaries >= AVCOL_PRI_EXT_BASE) && + ((unsigned)primaries < AVCOL_PRI_EXT_NB)) + return color_primaries_names_ext[primaries - AVCOL_TRC_EXT_BASE]; + return NULL; } int av_color_primaries_from_name(const char *name) @@ -3938,6 +3947,14 @@ int av_color_primaries_from_name(const char *name) return i; } + for (i = 0; i < FF_ARRAY_ELEMS(color_primaries_names_ext); i++) { + if (!color_primaries_names_ext[i]) + continue; + + if (av_strstart(name, color_primaries_names_ext[i], NULL)) + return AVCOL_PRI_EXT_BASE + i; + } + return AVERROR(EINVAL); } diff --git a/libavutil/pixfmt.h b/libavutil/pixfmt.h index 7cb76d503c..27e0b2d7a7 100644 --- a/libavutil/pixfmt.h +++ b/libavutil/pixfmt.h @@ -670,7 +670,12 @@ enum AVColorPrimaries { AVCOL_PRI_SMPTE432 = 12, ///< SMPTE ST 432-1 (2010) / P3 D65 / Display P3 AVCOL_PRI_EBU3213 = 22, ///< EBU Tech. 3213-E (nothing there) / one of JEDEC P22 group phosphors AVCOL_PRI_JEDEC_P22 = AVCOL_PRI_EBU3213, - AVCOL_PRI_NB ///< Not part of ABI + AVCOL_PRI_NB, ///< Not part of ABI + + /* The following entries are not part of H.273, but custom extensions */ + AVCOL_PRI_EXT_BASE = 256, + AVCOL_PRI_V_GAMUT = AVCOL_PRI_EXT_BASE, + AVCOL_PRI_EXT_NB ///< Not part of ABI }; /**