Guest User

Untitled

a guest
Oct 19th, 2018
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.84 KB | None | 0 0
  1. /* Setup texture units and fragment program */
  2. void drawInit(void) {
  3. uint8_t i, j, k;
  4. float y, cb, cr;
  5. char fragProg[] = "!!ARBfp1.0\n\
  6. TEMP ycbcr;\n\
  7. TEMP rgb;\n\
  8. PARAM scale = { 0.8032226, 0.875, 0.875, 1.0 };\n\
  9. TEX ycbcr.r, fragment.texcoord[0], texture[0], RECT;\n\
  10. TEX ycbcr.g, fragment.texcoord[1], texture[1], RECT;\n\
  11. TEX ycbcr.b, fragment.texcoord[2], texture[2], RECT;\n\
  12. MUL ycbcr, ycbcr, scale;\n\
  13. TEX rgb, ycbcr, texture[3], 3D;\n\
  14. MUL result.color, rgb, fragment.color;\n\
  15. END";
  16.  
  17. /* YCbCR to RGB fragment program */
  18. globals.ycbcrtorgb = malloc(strlen(fragProg) + 1);
  19. strcpy(globals.ycbcrtorgb, fragProg);
  20.  
  21. /* 3D lookup table for YCrCb to RGB conversion */
  22. glGenTextures(1, &globals.lut);
  23. glActiveTexture(GL_TEXTURE3);
  24. glBindTexture(GL_TEXTURE_3D, globals.lut);
  25. glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  26. glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  27. glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  28. glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP);
  29. glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP);
  30.  
  31. /* Build and load YCrCb to RGB lookup table */
  32. for(i = 0; i < 7; i++) {
  33. for(j = 0; j < 7; j++) {
  34. for(k = 0; k < 7; k++) {
  35. y = (float)k / 6.0;
  36. cb = (float)j / 6.0 - 0.5;
  37. cr = (float)i / 6.0 - 0.5;
  38. globals.defaultlut[i][j][k][0] = y + 1.402 * cr;
  39. globals.defaultlut[i][j][k][1] = y - 0.34414 * cb - 0.71414 * cr;
  40. globals.defaultlut[i][j][k][2] = y + 1.772 * cb;
  41. }
  42. }
  43. }
  44. glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB, 8, 8, 8, 0, GL_RGB, GL_FLOAT, globals.defaultlut);
  45.  
  46. --
  47.  
  48. /* Setup GL to draw YCbCr 4:2:0 video */
  49. void glSetupColourspaceConversion(void) {
  50. glActiveTexture(GL_TEXTURE0);
  51. glEnable(GL_TEXTURE_RECTANGLE_NV);
  52.  
  53. glActiveTexture(GL_TEXTURE1);
  54. glEnable(GL_TEXTURE_RECTANGLE_NV);
  55.  
  56. glActiveTexture(GL_TEXTURE2);
  57. glEnable(GL_TEXTURE_RECTANGLE_NV);
  58.  
  59. glActiveTexture(GL_TEXTURE3);
  60. glEnable(GL_TEXTURE_3D);
  61.  
  62. glEnable(GL_FRAGMENT_PROGRAM_ARB);
  63. glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(globals.ycbcrtorgb), globals.ycbcrtorgb);
  64. }
  65.  
  66. /* Setup GL to draw RGB interface elements */
  67. void glUnsetupColourspaceConversion(void) {
  68. glActiveTexture(GL_TEXTURE0);
  69. glDisable(GL_TEXTURE_RECTANGLE_NV);
  70.  
  71. glActiveTexture(GL_TEXTURE1);
  72. glDisable(GL_TEXTURE_RECTANGLE_NV);
  73.  
  74. glActiveTexture(GL_TEXTURE2);
  75. glDisable(GL_TEXTURE_RECTANGLE_NV);
  76.  
  77. glActiveTexture(GL_TEXTURE3);
  78. glDisable(GL_TEXTURE_3D);
  79.  
  80. glDisable(GL_FRAGMENT_PROGRAM_ARB);
  81. }
  82.  
  83.  
  84.  
  85. --
  86.  
  87. /* Draw channel to Tx window in back buffer, yes it has to be upside down */
  88. glSetupColourspaceConversion();
  89.  
  90. glActiveTexture(GL_TEXTURE0);
  91. glBindTexture(GL_TEXTURE_RECTANGLE_NV, state.channels[i].ytex);
  92. glActiveTexture(GL_TEXTURE1);
  93. glBindTexture(GL_TEXTURE_RECTANGLE_NV, state.channels[i].cbtex);
  94. glActiveTexture(GL_TEXTURE2);
  95. glBindTexture(GL_TEXTURE_RECTANGLE_NV, state.channels[i].crtex);
  96.  
  97. glBegin(GL_QUADS);
  98. glMultiTexCoord2i(GL_TEXTURE0, 0, 0);
  99. glMultiTexCoord2i(GL_TEXTURE1, 0, 0);
  100. glMultiTexCoord2i(GL_TEXTURE2, 0, 0);
  101. glVertex2i(x, y + 576);
  102. glMultiTexCoord2i(GL_TEXTURE0, s->planeWidth[0], 0);
  103. glMultiTexCoord2i(GL_TEXTURE1, s->planeWidth[1], 0);
  104. glMultiTexCoord2i(GL_TEXTURE2, s->planeWidth[2], 0);
  105. glVertex2i(x + 720, y + 576);
  106. glMultiTexCoord2i(GL_TEXTURE0, s->planeWidth[0], s->planeHeight[0]);
  107. glMultiTexCoord2i(GL_TEXTURE1, s->planeWidth[1], s->planeHeight[1]);
  108. glMultiTexCoord2i(GL_TEXTURE2, s->planeWidth[2], s->planeHeight[2]);
  109. glVertex2i(x + 720, y);
  110. glMultiTexCoord2i(GL_TEXTURE0, 0, s->planeHeight[0]);
  111. glMultiTexCoord2i(GL_TEXTURE1, 0, s->planeHeight[1]);
  112. glMultiTexCoord2i(GL_TEXTURE2, 0, s->planeHeight[2]);
  113. glVertex2i(x, y);
  114. glEnd();
  115.  
  116. glUnsetupColourspaceConversion();
Add Comment
Please, Sign In to add comment