mirror of
https://github.com/mpv-player/mpv.git
synced 2025-12-28 05:33:14 +00:00
video: support YCgCo colorspace
YCgCo can be manually selected, but will also be used if the decoder reports YCgCo. To make things more fun, files are sometimes marked incorrectly, which will display such broken files incorrectly starting with this commit.
This commit is contained in:
@@ -581,7 +581,8 @@ const m_option_t mplayer_opts[]={
|
|||||||
({"auto", MP_CSP_AUTO},
|
({"auto", MP_CSP_AUTO},
|
||||||
{"BT.601", MP_CSP_BT_601},
|
{"BT.601", MP_CSP_BT_601},
|
||||||
{"BT.709", MP_CSP_BT_709},
|
{"BT.709", MP_CSP_BT_709},
|
||||||
{"SMPTE-240M", MP_CSP_SMPTE_240M})),
|
{"SMPTE-240M", MP_CSP_SMPTE_240M},
|
||||||
|
{"YCgCo", MP_CSP_YCGCO})),
|
||||||
OPT_CHOICE("colormatrix-input-range", requested_input_range, 0,
|
OPT_CHOICE("colormatrix-input-range", requested_input_range, 0,
|
||||||
({"auto", MP_CSP_LEVELS_AUTO},
|
({"auto", MP_CSP_LEVELS_AUTO},
|
||||||
{"limited", MP_CSP_LEVELS_TV},
|
{"limited", MP_CSP_LEVELS_TV},
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ char * const mp_csp_names[MP_CSP_COUNT] = {
|
|||||||
"SMPTE-240M",
|
"SMPTE-240M",
|
||||||
"RGB",
|
"RGB",
|
||||||
"XYZ",
|
"XYZ",
|
||||||
|
"YCgCo",
|
||||||
};
|
};
|
||||||
|
|
||||||
char * const mp_csp_equalizer_names[MP_CSP_EQ_COUNT] = {
|
char * const mp_csp_equalizer_names[MP_CSP_EQ_COUNT] = {
|
||||||
@@ -59,6 +60,7 @@ enum mp_csp avcol_spc_to_mp_csp(enum AVColorSpace colorspace)
|
|||||||
case AVCOL_SPC_SMPTE170M: return MP_CSP_BT_601;
|
case AVCOL_SPC_SMPTE170M: return MP_CSP_BT_601;
|
||||||
case AVCOL_SPC_SMPTE240M: return MP_CSP_SMPTE_240M;
|
case AVCOL_SPC_SMPTE240M: return MP_CSP_SMPTE_240M;
|
||||||
case AVCOL_SPC_RGB: return MP_CSP_RGB;
|
case AVCOL_SPC_RGB: return MP_CSP_RGB;
|
||||||
|
case AVCOL_SPC_YCGCO: return MP_CSP_YCGCO;
|
||||||
default: return MP_CSP_AUTO;
|
default: return MP_CSP_AUTO;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -79,6 +81,7 @@ enum AVColorSpace mp_csp_to_avcol_spc(enum mp_csp colorspace)
|
|||||||
case MP_CSP_BT_601: return AVCOL_SPC_BT470BG;
|
case MP_CSP_BT_601: return AVCOL_SPC_BT470BG;
|
||||||
case MP_CSP_SMPTE_240M: return AVCOL_SPC_SMPTE240M;
|
case MP_CSP_SMPTE_240M: return AVCOL_SPC_SMPTE240M;
|
||||||
case MP_CSP_RGB: return AVCOL_SPC_RGB;
|
case MP_CSP_RGB: return AVCOL_SPC_RGB;
|
||||||
|
case MP_CSP_YCGCO: return AVCOL_SPC_YCGCO;
|
||||||
default: return AVCOL_SPC_UNSPECIFIED;
|
default: return AVCOL_SPC_UNSPECIFIED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -190,6 +193,15 @@ void mp_get_yuv2rgb_coeffs(struct mp_csp_params *params, float m[3][4])
|
|||||||
levels_in = -1;
|
levels_in = -1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case MP_CSP_YCGCO: {
|
||||||
|
static const float ycgco_to_rgb[3][4] = {
|
||||||
|
{1, -1, 1},
|
||||||
|
{1, 1, 0},
|
||||||
|
{1, -1, -1},
|
||||||
|
};
|
||||||
|
memcpy(m, ycgco_to_rgb, sizeof(ycgco_to_rgb));
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
abort();
|
abort();
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ enum mp_csp {
|
|||||||
MP_CSP_SMPTE_240M,
|
MP_CSP_SMPTE_240M,
|
||||||
MP_CSP_RGB,
|
MP_CSP_RGB,
|
||||||
MP_CSP_XYZ,
|
MP_CSP_XYZ,
|
||||||
|
MP_CSP_YCGCO,
|
||||||
MP_CSP_COUNT
|
MP_CSP_COUNT
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user