diff options
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. |