Mercurial > mplayer.hg
comparison libvo/gl_common.c @ 30107:11e3ee8cd05e
Put the colourspace-related variables into a separate struct to ease
extracting the code and sharing with other vos.
author | reimar |
---|---|
date | Thu, 31 Dec 2009 18:07:37 +0000 |
parents | 9d724e6def3e |
children | 0898adc64a6f |
comparison
equal
deleted
inserted
replaced
30106:e0d36dce5d85 | 30107:11e3ee8cd05e |
---|---|
1016 #define COL_Y 0 | 1016 #define COL_Y 0 |
1017 #define COL_U 1 | 1017 #define COL_U 1 |
1018 #define COL_V 2 | 1018 #define COL_V 2 |
1019 #define COL_C 3 | 1019 #define COL_C 3 |
1020 | 1020 |
1021 static void get_yuv2rgb_coeffs(gl_conversion_params_t *params, float yuv2rgb[3][4]) { | 1021 static void get_yuv2rgb_coeffs(struct mp_csp_params *params, float yuv2rgb[3][4]) { |
1022 float uvcos = params->saturation * cos(params->hue); | 1022 float uvcos = params->saturation * cos(params->hue); |
1023 float uvsin = params->saturation * sin(params->hue); | 1023 float uvsin = params->saturation * sin(params->hue); |
1024 int i; | 1024 int i; |
1025 float uv_coeffs[3][2] = { | 1025 float uv_coeffs[3][2] = { |
1026 { 0.000, 1.596}, | 1026 { 0.000, 1.596}, |
1047 * \brief generate a 3D YUV -> RGB map | 1047 * \brief generate a 3D YUV -> RGB map |
1048 * \param params struct containing parameters like brightness, gamma, ... | 1048 * \param params struct containing parameters like brightness, gamma, ... |
1049 * \param map where to store map. Must provide space for (size + 2)^3 elements | 1049 * \param map where to store map. Must provide space for (size + 2)^3 elements |
1050 * \param size size of the map, excluding border | 1050 * \param size size of the map, excluding border |
1051 */ | 1051 */ |
1052 static void gen_yuv2rgb_map(gl_conversion_params_t *params, unsigned char *map, int size) { | 1052 static void gen_yuv2rgb_map(struct mp_csp_params *params, unsigned char *map, int size) { |
1053 int i, j, k, l; | 1053 int i, j, k, l; |
1054 float step = 1.0 / size; | 1054 float step = 1.0 / size; |
1055 float y, u, v; | 1055 float y, u, v; |
1056 float yuv2rgb[3][4]; | 1056 float yuv2rgb[3][4]; |
1057 unsigned char gmaps[3][GMAP_SIZE]; | 1057 unsigned char gmaps[3][GMAP_SIZE]; |
1099 break; | 1099 break; |
1100 case YUV_CONVERSION_FRAGMENT_LOOKUP: | 1100 case YUV_CONVERSION_FRAGMENT_LOOKUP: |
1101 texs[0] = (*texu)++; | 1101 texs[0] = (*texu)++; |
1102 ActiveTexture(GL_TEXTURE0 + texs[0]); | 1102 ActiveTexture(GL_TEXTURE0 + texs[0]); |
1103 lookup_data = malloc(4 * LOOKUP_RES); | 1103 lookup_data = malloc(4 * LOOKUP_RES); |
1104 gen_gamma_map(lookup_data, LOOKUP_RES, params->rgamma); | 1104 gen_gamma_map(lookup_data, LOOKUP_RES, params->csp_params.rgamma); |
1105 gen_gamma_map(&lookup_data[LOOKUP_RES], LOOKUP_RES, params->ggamma); | 1105 gen_gamma_map(&lookup_data[LOOKUP_RES], LOOKUP_RES, params->csp_params.ggamma); |
1106 gen_gamma_map(&lookup_data[2 * LOOKUP_RES], LOOKUP_RES, params->bgamma); | 1106 gen_gamma_map(&lookup_data[2 * LOOKUP_RES], LOOKUP_RES, params->csp_params.bgamma); |
1107 glCreateClearTex(GL_TEXTURE_2D, GL_LUMINANCE8, GL_LUMINANCE, GL_UNSIGNED_BYTE, GL_LINEAR, | 1107 glCreateClearTex(GL_TEXTURE_2D, GL_LUMINANCE8, GL_LUMINANCE, GL_UNSIGNED_BYTE, GL_LINEAR, |
1108 LOOKUP_RES, 4, 0); | 1108 LOOKUP_RES, 4, 0); |
1109 glUploadTex(GL_TEXTURE_2D, GL_LUMINANCE, GL_UNSIGNED_BYTE, lookup_data, | 1109 glUploadTex(GL_TEXTURE_2D, GL_LUMINANCE, GL_UNSIGNED_BYTE, lookup_data, |
1110 LOOKUP_RES, 0, 0, LOOKUP_RES, 4, 0); | 1110 LOOKUP_RES, 0, 0, LOOKUP_RES, 4, 0); |
1111 ActiveTexture(GL_TEXTURE0); | 1111 ActiveTexture(GL_TEXTURE0); |
1119 break; | 1119 break; |
1120 } | 1120 } |
1121 texs[0] = (*texu)++; | 1121 texs[0] = (*texu)++; |
1122 ActiveTexture(GL_TEXTURE0 + texs[0]); | 1122 ActiveTexture(GL_TEXTURE0 + texs[0]); |
1123 lookup_data = malloc(3 * sz * sz * sz); | 1123 lookup_data = malloc(3 * sz * sz * sz); |
1124 gen_yuv2rgb_map(params, lookup_data, LOOKUP_3DRES); | 1124 gen_yuv2rgb_map(¶ms->csp_params, lookup_data, LOOKUP_3DRES); |
1125 glAdjustAlignment(sz); | 1125 glAdjustAlignment(sz); |
1126 PixelStorei(GL_UNPACK_ROW_LENGTH, 0); | 1126 PixelStorei(GL_UNPACK_ROW_LENGTH, 0); |
1127 TexImage3D(GL_TEXTURE_3D, 0, 3, sz, sz, sz, 1, | 1127 TexImage3D(GL_TEXTURE_3D, 0, 3, sz, sz, sz, 1, |
1128 GL_RGB, GL_UNSIGNED_BYTE, lookup_data); | 1128 GL_RGB, GL_UNSIGNED_BYTE, lookup_data); |
1129 TexParameterf(GL_TEXTURE_3D, GL_TEXTURE_PRIORITY, 1.0); | 1129 TexParameterf(GL_TEXTURE_3D, GL_TEXTURE_PRIORITY, 1.0); |
1328 '0', 'r', rect, texw, texh, params->filter_strength); | 1328 '0', 'r', rect, texw, texh, params->filter_strength); |
1329 add_scaler(YUV_CHROM_SCALER(type), &prog_pos, &prog_remain, chrom_scale_texs, | 1329 add_scaler(YUV_CHROM_SCALER(type), &prog_pos, &prog_remain, chrom_scale_texs, |
1330 '1', 'g', rect, params->chrom_texw, params->chrom_texh, params->filter_strength); | 1330 '1', 'g', rect, params->chrom_texw, params->chrom_texh, params->filter_strength); |
1331 add_scaler(YUV_CHROM_SCALER(type), &prog_pos, &prog_remain, chrom_scale_texs, | 1331 add_scaler(YUV_CHROM_SCALER(type), &prog_pos, &prog_remain, chrom_scale_texs, |
1332 '2', 'b', rect, params->chrom_texw, params->chrom_texh, params->filter_strength); | 1332 '2', 'b', rect, params->chrom_texw, params->chrom_texh, params->filter_strength); |
1333 get_yuv2rgb_coeffs(params, yuv2rgb); | 1333 get_yuv2rgb_coeffs(¶ms->csp_params, yuv2rgb); |
1334 switch (YUV_CONVERSION(type)) { | 1334 switch (YUV_CONVERSION(type)) { |
1335 case YUV_CONVERSION_FRAGMENT: | 1335 case YUV_CONVERSION_FRAGMENT: |
1336 snprintf(prog_pos, prog_remain, yuv_prog_template, | 1336 snprintf(prog_pos, prog_remain, yuv_prog_template, |
1337 yuv2rgb[ROW_R][COL_Y], yuv2rgb[ROW_G][COL_Y], yuv2rgb[ROW_B][COL_Y], | 1337 yuv2rgb[ROW_R][COL_Y], yuv2rgb[ROW_G][COL_Y], yuv2rgb[ROW_B][COL_Y], |
1338 yuv2rgb[ROW_R][COL_U], yuv2rgb[ROW_G][COL_U], yuv2rgb[ROW_B][COL_U], | 1338 yuv2rgb[ROW_R][COL_U], yuv2rgb[ROW_G][COL_U], yuv2rgb[ROW_B][COL_U], |
1343 snprintf(prog_pos, prog_remain, yuv_pow_prog_template, | 1343 snprintf(prog_pos, prog_remain, yuv_pow_prog_template, |
1344 yuv2rgb[ROW_R][COL_Y], yuv2rgb[ROW_G][COL_Y], yuv2rgb[ROW_B][COL_Y], | 1344 yuv2rgb[ROW_R][COL_Y], yuv2rgb[ROW_G][COL_Y], yuv2rgb[ROW_B][COL_Y], |
1345 yuv2rgb[ROW_R][COL_U], yuv2rgb[ROW_G][COL_U], yuv2rgb[ROW_B][COL_U], | 1345 yuv2rgb[ROW_R][COL_U], yuv2rgb[ROW_G][COL_U], yuv2rgb[ROW_B][COL_U], |
1346 yuv2rgb[ROW_R][COL_V], yuv2rgb[ROW_G][COL_V], yuv2rgb[ROW_B][COL_V], | 1346 yuv2rgb[ROW_R][COL_V], yuv2rgb[ROW_G][COL_V], yuv2rgb[ROW_B][COL_V], |
1347 yuv2rgb[ROW_R][COL_C], yuv2rgb[ROW_G][COL_C], yuv2rgb[ROW_B][COL_C], | 1347 yuv2rgb[ROW_R][COL_C], yuv2rgb[ROW_G][COL_C], yuv2rgb[ROW_B][COL_C], |
1348 (float)1.0 / params->rgamma, (float)1.0 / params->bgamma, (float)1.0 / params->bgamma); | 1348 (float)1.0 / params->csp_params.rgamma, (float)1.0 / params->csp_params.bgamma, (float)1.0 / params->csp_params.bgamma); |
1349 break; | 1349 break; |
1350 case YUV_CONVERSION_FRAGMENT_LOOKUP: | 1350 case YUV_CONVERSION_FRAGMENT_LOOKUP: |
1351 snprintf(prog_pos, prog_remain, yuv_lookup_prog_template, | 1351 snprintf(prog_pos, prog_remain, yuv_lookup_prog_template, |
1352 yuv2rgb[ROW_R][COL_Y], yuv2rgb[ROW_G][COL_Y], yuv2rgb[ROW_B][COL_Y], | 1352 yuv2rgb[ROW_R][COL_Y], yuv2rgb[ROW_G][COL_Y], yuv2rgb[ROW_B][COL_Y], |
1353 yuv2rgb[ROW_R][COL_U], yuv2rgb[ROW_G][COL_U], yuv2rgb[ROW_B][COL_U], | 1353 yuv2rgb[ROW_R][COL_U], yuv2rgb[ROW_G][COL_U], yuv2rgb[ROW_B][COL_U], |
1395 * \param parms struct containing parameters like conversion and scaler type, | 1395 * \param parms struct containing parameters like conversion and scaler type, |
1396 * brightness, ... | 1396 * brightness, ... |
1397 * \ingroup glconversion | 1397 * \ingroup glconversion |
1398 */ | 1398 */ |
1399 void glSetupYUVConversion(gl_conversion_params_t *params) { | 1399 void glSetupYUVConversion(gl_conversion_params_t *params) { |
1400 float uvcos = params->saturation * cos(params->hue); | 1400 float uvcos = params->csp_params.saturation * cos(params->csp_params.hue); |
1401 float uvsin = params->saturation * sin(params->hue); | 1401 float uvsin = params->csp_params.saturation * sin(params->csp_params.hue); |
1402 switch (YUV_CONVERSION(params->type)) { | 1402 switch (YUV_CONVERSION(params->type)) { |
1403 case YUV_CONVERSION_COMBINERS: | 1403 case YUV_CONVERSION_COMBINERS: |
1404 glSetupYUVCombiners(uvcos, uvsin); | 1404 glSetupYUVCombiners(uvcos, uvsin); |
1405 break; | 1405 break; |
1406 case YUV_CONVERSION_COMBINERS_ATI: | 1406 case YUV_CONVERSION_COMBINERS_ATI: |