diff options
author | wm4 <wm4@nowhere> | 2013-06-08 02:15:24 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2013-06-28 21:20:41 +0200 |
commit | ac266da6588f25a449a739f7a6a3d2c69ca80e19 (patch) | |
tree | 6fc863452bec6fd07b05d057d093946772ba96c7 /video/csputils.c | |
parent | 3382a6f6e48c7e093c2b7e0e4a0e28b60a084358 (diff) | |
download | mpv-ac266da6588f25a449a739f7a6a3d2c69ca80e19.tar.bz2 mpv-ac266da6588f25a449a739f7a6a3d2c69ca80e19.tar.xz |
vo_opengl: handle chroma location
Use the video decoder chroma location flags and render chroma locations
other than centered. Until now, we've always used the intuitive and
obvious centered chroma location, but H.264 uses something else.
FFmpeg provides a small overview in libavcodec/avcodec.h:
-----------
/**
* X X 3 4 X X are luma samples,
* 1 2 1-6 are possible chroma positions
* X X 5 6 X 0 is undefined/unknown position
*/
enum AVChromaLocation{
AVCHROMA_LOC_UNSPECIFIED = 0,
AVCHROMA_LOC_LEFT = 1, ///< mpeg2/4, h264 default
AVCHROMA_LOC_CENTER = 2, ///< mpeg1, jpeg, h263
AVCHROMA_LOC_TOPLEFT = 3, ///< DV
AVCHROMA_LOC_TOP = 4,
AVCHROMA_LOC_BOTTOMLEFT = 5,
AVCHROMA_LOC_BOTTOM = 6,
AVCHROMA_LOC_NB , ///< Not part of ABI
};
-----------
The visual difference is literally minimal, but since videophiles
apparently consider this detail as quality mark of a video renderer,
support it anyway. We don't bother with chroma locations other than
centered and left, though.
Not sure about correctness, but it's probably ok.
Diffstat (limited to 'video/csputils.c')
-rw-r--r-- | video/csputils.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/video/csputils.c b/video/csputils.c index 240c7a3259..91b7d88ec6 100644 --- a/video/csputils.c +++ b/video/csputils.c @@ -100,6 +100,25 @@ enum mp_csp mp_csp_guess_colorspace(int width, int height) return width >= 1280 || height > 576 ? MP_CSP_BT_709 : MP_CSP_BT_601; } +enum mp_chroma_location avchroma_location_to_mp(enum AVChromaLocation loc) +{ + switch (loc) { + case AVCHROMA_LOC_LEFT: return MP_CHROMA_LEFT; + case AVCHROMA_LOC_CENTER: return MP_CHROMA_CENTER; + default: return MP_CHROMA_AUTO; + } +} + +// Return location of chroma samples relative to luma samples. 0/0 means +// centered. Other possible values are -1 (top/left) and +1 (right/bottom). +void mp_get_chroma_location(enum mp_chroma_location loc, int *x, int *y) +{ + *x = 0; + *y = 0; + if (loc == MP_CHROMA_LEFT) + *x = -1; +} + /** * \brief little helper function to create a lookup table for gamma * \param map buffer to create map into |