Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Setup texture units and fragment program */
- void drawInit(void) {
- uint8_t i, j, k;
- float y, cb, cr;
- char fragProg[] = "!!ARBfp1.0\n\
- TEMP ycbcr;\n\
- TEMP rgb;\n\
- PARAM scale = { 0.8032226, 0.875, 0.875, 1.0 };\n\
- TEX ycbcr.r, fragment.texcoord[0], texture[0], RECT;\n\
- TEX ycbcr.g, fragment.texcoord[1], texture[1], RECT;\n\
- TEX ycbcr.b, fragment.texcoord[2], texture[2], RECT;\n\
- MUL ycbcr, ycbcr, scale;\n\
- TEX rgb, ycbcr, texture[3], 3D;\n\
- MUL result.color, rgb, fragment.color;\n\
- END";
- /* YCbCR to RGB fragment program */
- globals.ycbcrtorgb = malloc(strlen(fragProg) + 1);
- strcpy(globals.ycbcrtorgb, fragProg);
- /* 3D lookup table for YCrCb to RGB conversion */
- glGenTextures(1, &globals.lut);
- glActiveTexture(GL_TEXTURE3);
- glBindTexture(GL_TEXTURE_3D, globals.lut);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP);
- /* Build and load YCrCb to RGB lookup table */
- for(i = 0; i < 7; i++) {
- for(j = 0; j < 7; j++) {
- for(k = 0; k < 7; k++) {
- y = (float)k / 6.0;
- cb = (float)j / 6.0 - 0.5;
- cr = (float)i / 6.0 - 0.5;
- globals.defaultlut[i][j][k][0] = y + 1.402 * cr;
- globals.defaultlut[i][j][k][1] = y - 0.34414 * cb - 0.71414 * cr;
- globals.defaultlut[i][j][k][2] = y + 1.772 * cb;
- }
- }
- }
- glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB, 8, 8, 8, 0, GL_RGB, GL_FLOAT, globals.defaultlut);
- --
- /* Setup GL to draw YCbCr 4:2:0 video */
- void glSetupColourspaceConversion(void) {
- glActiveTexture(GL_TEXTURE0);
- glEnable(GL_TEXTURE_RECTANGLE_NV);
- glActiveTexture(GL_TEXTURE1);
- glEnable(GL_TEXTURE_RECTANGLE_NV);
- glActiveTexture(GL_TEXTURE2);
- glEnable(GL_TEXTURE_RECTANGLE_NV);
- glActiveTexture(GL_TEXTURE3);
- glEnable(GL_TEXTURE_3D);
- glEnable(GL_FRAGMENT_PROGRAM_ARB);
- glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(globals.ycbcrtorgb), globals.ycbcrtorgb);
- }
- /* Setup GL to draw RGB interface elements */
- void glUnsetupColourspaceConversion(void) {
- glActiveTexture(GL_TEXTURE0);
- glDisable(GL_TEXTURE_RECTANGLE_NV);
- glActiveTexture(GL_TEXTURE1);
- glDisable(GL_TEXTURE_RECTANGLE_NV);
- glActiveTexture(GL_TEXTURE2);
- glDisable(GL_TEXTURE_RECTANGLE_NV);
- glActiveTexture(GL_TEXTURE3);
- glDisable(GL_TEXTURE_3D);
- glDisable(GL_FRAGMENT_PROGRAM_ARB);
- }
- --
- /* Draw channel to Tx window in back buffer, yes it has to be upside down */
- glSetupColourspaceConversion();
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_RECTANGLE_NV, state.channels[i].ytex);
- glActiveTexture(GL_TEXTURE1);
- glBindTexture(GL_TEXTURE_RECTANGLE_NV, state.channels[i].cbtex);
- glActiveTexture(GL_TEXTURE2);
- glBindTexture(GL_TEXTURE_RECTANGLE_NV, state.channels[i].crtex);
- glBegin(GL_QUADS);
- glMultiTexCoord2i(GL_TEXTURE0, 0, 0);
- glMultiTexCoord2i(GL_TEXTURE1, 0, 0);
- glMultiTexCoord2i(GL_TEXTURE2, 0, 0);
- glVertex2i(x, y + 576);
- glMultiTexCoord2i(GL_TEXTURE0, s->planeWidth[0], 0);
- glMultiTexCoord2i(GL_TEXTURE1, s->planeWidth[1], 0);
- glMultiTexCoord2i(GL_TEXTURE2, s->planeWidth[2], 0);
- glVertex2i(x + 720, y + 576);
- glMultiTexCoord2i(GL_TEXTURE0, s->planeWidth[0], s->planeHeight[0]);
- glMultiTexCoord2i(GL_TEXTURE1, s->planeWidth[1], s->planeHeight[1]);
- glMultiTexCoord2i(GL_TEXTURE2, s->planeWidth[2], s->planeHeight[2]);
- glVertex2i(x + 720, y);
- glMultiTexCoord2i(GL_TEXTURE0, 0, s->planeHeight[0]);
- glMultiTexCoord2i(GL_TEXTURE1, 0, s->planeHeight[1]);
- glMultiTexCoord2i(GL_TEXTURE2, 0, s->planeHeight[2]);
- glVertex2i(x, y);
- glEnd();
- glUnsetupColourspaceConversion();
Add Comment
Please, Sign In to add comment