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(&params->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(&params->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: