diff options
author | Niklas Haas <git@nand.wakku.to> | 2016-06-29 09:16:13 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2016-07-03 19:42:52 +0200 |
commit | d81fb97f4587f73f62a760b99f686139f9b8d966 (patch) | |
tree | f97ec972e64160e1a479c1b31daf73af32ca54e1 /video/mp_image.c | |
parent | 3abf9c9204e2fcbc1910deb102efab4ab9d8c149 (diff) | |
download | mpv-d81fb97f4587f73f62a760b99f686139f9b8d966.tar.bz2 mpv-d81fb97f4587f73f62a760b99f686139f9b8d966.tar.xz |
mp_image: split colorimetry metadata into its own struct
This has two reasons:
1. I tend to add new fields to this metadata, and every time I've done
so I've consistently forgotten to update all of the dozens of places in
which this colorimetry metadata might end up getting used. While most
usages don't really care about most of the metadata, sometimes the
intend was simply to “copy” the colorimetry metadata from one struct to
another. With this being inside a substruct, those lines of code can now
simply read a.color = b.color without having to care about added or
removed fields.
2. It makes the type definitions nicer for upcoming refactors.
In going through all of the usages, I also expanded a few where I felt
that omitting the “young” fields was a bug.
Diffstat (limited to 'video/mp_image.c')
-rw-r--r-- | video/mp_image.c | 107 |
1 files changed, 52 insertions, 55 deletions
diff --git a/video/mp_image.c b/video/mp_image.c index 0b46f947bc..286e40bf62 100644 --- a/video/mp_image.c +++ b/video/mp_image.c @@ -393,11 +393,12 @@ void mp_image_copy_attributes(struct mp_image *dst, struct mp_image *src) dst->params.p_w = src->params.p_w; dst->params.p_h = src->params.p_h; } - dst->params.primaries = src->params.primaries; - dst->params.gamma = src->params.gamma; + dst->params.color.primaries = src->params.color.primaries; + dst->params.color.gamma = src->params.color.gamma; + dst->params.color.peak = src->params.color.peak; if ((dst->fmt.flags & MP_IMGFLAG_YUV) == (src->fmt.flags & MP_IMGFLAG_YUV)) { - dst->params.colorspace = src->params.colorspace; - dst->params.colorlevels = src->params.colorlevels; + dst->params.color.space = src->params.color.space; + dst->params.color.levels = src->params.color.levels; dst->params.chroma_location = src->params.chroma_location; } mp_image_params_guess_csp(&dst->params); // ensure colorspace consistency @@ -512,8 +513,8 @@ char *mp_image_params_to_str_buf(char *b, size_t bs, if (p->hw_subfmt) mp_snprintf_cat(b, bs, "[%llu]", (unsigned long long)(p->hw_subfmt)); mp_snprintf_cat(b, bs, " %s/%s", - m_opt_choice_str(mp_csp_names, p->colorspace), - m_opt_choice_str(mp_csp_levels_names, p->colorlevels)); + m_opt_choice_str(mp_csp_names, p->color.space), + m_opt_choice_str(mp_csp_levels_names, p->color.levels)); mp_snprintf_cat(b, bs, " CL=%s", m_opt_choice_str(mp_chroma_names, p->chroma_location)); if (p->rotate) @@ -564,11 +565,7 @@ bool mp_image_params_equal(const struct mp_image_params *p1, p1->hw_subfmt == p2->hw_subfmt && p1->w == p2->w && p1->h == p2->h && p1->p_w == p2->p_w && p1->p_h == p2->p_h && - p1->colorspace == p2->colorspace && - p1->colorlevels == p2->colorlevels && - p1->primaries == p2->primaries && - p1->gamma == p2->gamma && - p1->peak == p2->peak && + mp_colorspace_equal(p1->color, p2->color) && p1->chroma_location == p2->chroma_location && p1->rotate == p2->rotate && p1->stereo_in == p2->stereo_in && @@ -598,56 +595,56 @@ void mp_image_params_guess_csp(struct mp_image_params *params) if (!fmt.id) return; if (fmt.flags & MP_IMGFLAG_YUV) { - if (params->colorspace != MP_CSP_BT_601 && - params->colorspace != MP_CSP_BT_709 && - params->colorspace != MP_CSP_BT_2020_NC && - params->colorspace != MP_CSP_BT_2020_C && - params->colorspace != MP_CSP_SMPTE_240M && - params->colorspace != MP_CSP_YCGCO) + if (params->color.space != MP_CSP_BT_601 && + params->color.space != MP_CSP_BT_709 && + params->color.space != MP_CSP_BT_2020_NC && + params->color.space != MP_CSP_BT_2020_C && + params->color.space != MP_CSP_SMPTE_240M && + params->color.space != MP_CSP_YCGCO) { // Makes no sense, so guess instead // YCGCO should be separate, but libavcodec disagrees - params->colorspace = MP_CSP_AUTO; + params->color.space = MP_CSP_AUTO; } - if (params->colorspace == MP_CSP_AUTO) - params->colorspace = mp_csp_guess_colorspace(params->w, params->h); - if (params->colorlevels == MP_CSP_LEVELS_AUTO) { - if (params->gamma == MP_CSP_TRC_V_LOG) { - params->colorlevels = MP_CSP_LEVELS_PC; + if (params->color.space == MP_CSP_AUTO) + params->color.space = mp_csp_guess_colorspace(params->w, params->h); + if (params->color.levels == MP_CSP_LEVELS_AUTO) { + if (params->color.gamma == MP_CSP_TRC_V_LOG) { + params->color.levels = MP_CSP_LEVELS_PC; } else { - params->colorlevels = MP_CSP_LEVELS_TV; + params->color.levels = MP_CSP_LEVELS_TV; } } - if (params->primaries == MP_CSP_PRIM_AUTO) { + if (params->color.primaries == MP_CSP_PRIM_AUTO) { // Guess based on the colormatrix as a first priority - if (params->colorspace == MP_CSP_BT_2020_NC || - params->colorspace == MP_CSP_BT_2020_C) { - params->primaries = MP_CSP_PRIM_BT_2020; - } else if (params->colorspace == MP_CSP_BT_709) { - params->primaries = MP_CSP_PRIM_BT_709; + if (params->color.space == MP_CSP_BT_2020_NC || + params->color.space == MP_CSP_BT_2020_C) { + params->color.primaries = MP_CSP_PRIM_BT_2020; + } else if (params->color.space == MP_CSP_BT_709) { + params->color.primaries = MP_CSP_PRIM_BT_709; } else { // Ambiguous colormatrix for BT.601, guess based on res - params->primaries = mp_csp_guess_primaries(params->w, params->h); + params->color.primaries = mp_csp_guess_primaries(params->w, params->h); } } - if (params->gamma == MP_CSP_TRC_AUTO) - params->gamma = MP_CSP_TRC_BT_1886; + if (params->color.gamma == MP_CSP_TRC_AUTO) + params->color.gamma = MP_CSP_TRC_BT_1886; } else if (fmt.flags & MP_IMGFLAG_RGB) { - params->colorspace = MP_CSP_RGB; - params->colorlevels = MP_CSP_LEVELS_PC; + params->color.space = MP_CSP_RGB; + params->color.levels = MP_CSP_LEVELS_PC; // The majority of RGB content is either sRGB or (rarely) some other // color space which we don't even handle, like AdobeRGB or // ProPhotoRGB. The only reasonable thing we can do is assume it's // sRGB and hope for the best, which should usually just work out fine. // Note: sRGB primaries = BT.709 primaries - if (params->primaries == MP_CSP_PRIM_AUTO) - params->primaries = MP_CSP_PRIM_BT_709; - if (params->gamma == MP_CSP_TRC_AUTO) - params->gamma = MP_CSP_TRC_SRGB; + if (params->color.primaries == MP_CSP_PRIM_AUTO) + params->color.primaries = MP_CSP_PRIM_BT_709; + if (params->color.gamma == MP_CSP_TRC_AUTO) + params->color.gamma = MP_CSP_TRC_SRGB; } else if (fmt.flags & MP_IMGFLAG_XYZ) { - params->colorspace = MP_CSP_XYZ; - params->colorlevels = MP_CSP_LEVELS_PC; + params->color.space = MP_CSP_XYZ; + params->color.levels = MP_CSP_LEVELS_PC; // The default XYZ matrix converts it to BT.709 color space // since that's the most likely scenario. Proper VOs should ignore @@ -657,22 +654,22 @@ void mp_image_params_guess_csp(struct mp_image_params *params) // gamut for VOs which *do* use the specialized XYZ matrix but don't // know any better output gamut other than whatever the source is // tagged with. - if (params->primaries == MP_CSP_PRIM_AUTO) - params->primaries = MP_CSP_PRIM_BT_709; - if (params->gamma == MP_CSP_TRC_AUTO) - params->gamma = MP_CSP_TRC_LINEAR; + if (params->color.primaries == MP_CSP_PRIM_AUTO) + params->color.primaries = MP_CSP_PRIM_BT_709; + if (params->color.gamma == MP_CSP_TRC_AUTO) + params->color.gamma = MP_CSP_TRC_LINEAR; } else { // We have no clue. - params->colorspace = MP_CSP_AUTO; - params->colorlevels = MP_CSP_LEVELS_AUTO; - params->primaries = MP_CSP_PRIM_AUTO; - params->gamma = MP_CSP_TRC_AUTO; + params->color.space = MP_CSP_AUTO; + params->color.levels = MP_CSP_LEVELS_AUTO; + params->color.primaries = MP_CSP_PRIM_AUTO; + params->color.gamma = MP_CSP_TRC_AUTO; } - // Guess the reference peak (independent of the colorspace) - if (params->gamma == MP_CSP_TRC_SMPTE_ST2084) { - if (!params->peak) - params->peak = 10000; // As per the spec + // Guess the nominal peak (independent of the colorspace) + if (params->color.gamma == MP_CSP_TRC_SMPTE_ST2084) { + if (!params->color.peak) + params->color.peak = 10000; // As per the spec } } @@ -729,8 +726,8 @@ static void mp_image_copy_fields_to_av_frame(struct AVFrame *dst, if (src->fields & MP_IMGFIELD_REPEAT_FIRST) dst->repeat_pict = 1; - dst->colorspace = mp_csp_to_avcol_spc(src->params.colorspace); - dst->color_range = mp_csp_levels_to_avcol_range(src->params.colorlevels); + dst->colorspace = mp_csp_to_avcol_spc(src->params.color.space); + dst->color_range = mp_csp_levels_to_avcol_range(src->params.color.levels); } // Create a new mp_image reference to av_frame. |