summaryrefslogtreecommitdiffstats
path: root/video/mp_image.c
diff options
context:
space:
mode:
Diffstat (limited to 'video/mp_image.c')
-rw-r--r--video/mp_image.c107
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.