mirror of
https://github.com/mpv-player/mpv
synced 2024-10-30 04:46:41 +01:00
b6628f4e1e
Rewrite the csputils.c code generating a conversion matrix for YUV->RGB conversions (currently used by vo_gl only). Functional differences: - The separate "mplayer default" colorspace is removed, and BT.601 is used instead (the default colorspace was in fact BT.601; see below). - The old code was missing chroma scaling. As a result the "mplayer default" colorspace actually mapped to BT.601, and everything else was buggy (I guess the other colorspaces were added with particular coefficient semantics, without understanding that the original "default colorspace" was actually BT.601 and why its coefficients differed from the added version). - The old code had a bug in the equalizer hue equations. - The old code assumed that for specifying whether input and output were limited-range or full-range YUV or RGB it would make sense to specify "no conversion" meaning full-range YUV to full-range RGB or limited-range YUV to limited-range RGB. This isn't true; limited- range YUV has different ranges for luma and chroma (16-235 vs 16-240) which means you have to scale chroma for limited->limited conversions. The new code assumes limited->limited conversions for the levelconv parameter 2. It'd probably make sense to change the API later to specify the ranges of input and output separately. - The undocumented EBU and XYZ colorspaces are removed. I doubt any videos use these. Also the EBU colorspace looks like it'd expect a different input range - at least no input would map to full RGB red as it was.
69 lines
1.9 KiB
C
69 lines
1.9 KiB
C
/*
|
|
* This file is part of MPlayer.
|
|
*
|
|
* MPlayer is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* MPlayer is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with MPlayer; if not, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*
|
|
* You can alternatively redistribute this file and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*/
|
|
|
|
#ifndef MPLAYER_CSPUTILS_H
|
|
#define MPLAYER_CSPUTILS_H
|
|
|
|
#include <stdint.h>
|
|
|
|
enum mp_csp_standard {
|
|
MP_CSP_DEFAULT,
|
|
MP_CSP_BT_601,
|
|
MP_CSP_BT_709,
|
|
MP_CSP_SMPTE_240M,
|
|
MP_CSP_COUNT
|
|
};
|
|
|
|
enum mp_csp_levelconv {
|
|
MP_CSP_LEVELCONV_TV_TO_PC,
|
|
MP_CSP_LEVELCONV_PC_TO_TV,
|
|
MP_CSP_LEVELCONV_TV_TO_TV,
|
|
MP_CSP_LEVELCONV_COUNT
|
|
};
|
|
|
|
struct mp_csp_params {
|
|
enum mp_csp_standard format;
|
|
enum mp_csp_levelconv levelconv;
|
|
float brightness;
|
|
float contrast;
|
|
float hue;
|
|
float saturation;
|
|
float rgamma;
|
|
float ggamma;
|
|
float bgamma;
|
|
int input_shift;
|
|
};
|
|
|
|
void mp_gen_gamma_map(unsigned char *map, int size, float gamma);
|
|
#define ROW_R 0
|
|
#define ROW_G 1
|
|
#define ROW_B 2
|
|
#define COL_Y 0
|
|
#define COL_U 1
|
|
#define COL_V 2
|
|
#define COL_C 3
|
|
void mp_get_yuv2rgb_coeffs(struct mp_csp_params *params, float yuv2rgb[3][4]);
|
|
void mp_gen_yuv2rgb_map(struct mp_csp_params *params, uint8_t *map, int size);
|
|
|
|
#endif /* MPLAYER_CSPUTILS_H */
|