GEN_DRAW.C
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:3k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. // gen_draw.c //
  2. #include "mp4_decoder.h"
  3. #include "gen_draw.h"
  4. /**
  5.  *
  6. **/
  7. extern int MV[2][6][MBR+1][MBC+2]; // motion vectors
  8. extern int modemap[MBR+1][MBC+2]; // macroblock modes
  9. /***/
  10. static void colorBlock_mv(unsigned char *buff, int stride, int mb_xpos, int mb_ypos, int bnum, int xsize, int ysize);
  11. static void drawline(int stride, int x0, int y0, int dx, int dy, unsigned char *buff, char colour, int xsize, int ysize);
  12. static void check_and_colour(unsigned char *buff, int x0, int y0, int xsize, int ysize, char colour);
  13. /***/
  14. // Purpose: draw motion vectors in a displayable buffer
  15. void colorBuffer_mv(unsigned char *buff, int stride, int xsize, int ysize)
  16. {
  17. int mb_xsize, mb_ysize;
  18. int mb_xpos, mb_ypos;
  19. int bnum;
  20. mb_xsize = xsize>>4;
  21. mb_ysize = ysize>>4;
  22. for (mb_ypos = 0; mb_ypos < mb_ysize; mb_ypos++)
  23. {
  24. for (mb_xpos = 0; mb_xpos < mb_xsize; mb_xpos++)
  25. {
  26. switch (modemap[mb_xpos+1][mb_ypos+1])
  27. {
  28. case MODE_INTER: case MODE_INTER_Q:
  29. {
  30. colorBlock_mv(buff, stride, mb_xpos, mb_ypos, -1, xsize, ysize);
  31. }
  32. break;
  33. case MODE_INTER4V: case MODE_INTER4V_Q:
  34. {
  35. for (bnum = 0; bnum < 4; bnum++)
  36. {
  37. colorBlock_mv(buff, stride, mb_xpos, mb_ypos, bnum, xsize, ysize);
  38. }
  39. }
  40. break;
  41. default:
  42. break;
  43. }
  44. }
  45. }
  46. }
  47. /***/
  48. // Purpose: draw motion vector for this block, bnum is -1 if it's an entire macroblock
  49. static void colorBlock_mv(unsigned char *buff, int stride, int mb_xpos, int mb_ypos, int bnum, int xsize, int ysize)
  50. {
  51. int mvx, mvy;
  52. int xpos = mb_xpos<<4;
  53. int ypos = mb_ypos<<4;
  54. if (bnum == -1) {
  55. xpos += 8;
  56. ypos += 8;
  57. bnum = 0; // retrieve correct block number for MV extraction
  58. else {
  59. xpos += (bnum & 1) ? 12 : 4;
  60. ypos += (bnum & 2) ? 12 : 4;
  61. }
  62. mvx = MV[0][bnum][mb_xpos+1][mb_ypos+1];
  63. mvy = MV[1][bnum][mb_xpos+1][mb_ypos+1];
  64. drawline(stride, xpos, ypos, mvx, mvy, buff, 0, xsize, ysize);
  65. }
  66. /***/
  67. // John Funnell < johnf@mail.nu >
  68. // Purpose: line drawing function - pilfered from the Net
  69. static void drawline(int stride, int x0, int y0, int dx, int dy, unsigned char *buff, char colour, int xsize, int ysize) {
  70. int y1 = y0 + dy;
  71. int x1 = x0 + dx;
  72. int stepx, stepy;
  73. int fraction;
  74. if (dy < 0) { 
  75. dy = -dy;  stepy = -stride; 
  76. else { 
  77. stepy = stride; 
  78. }
  79. if (dx < 0) { 
  80. dx = -dx;  stepx = -1; 
  81. } else { 
  82. stepx = 1; 
  83. }
  84. // retrieve pixel coord
  85. dy <<= 1; 
  86. dx <<= 1;
  87. // retrieve image coordinates
  88. y0 *= stride;
  89. y1 *= stride;
  90. check_and_colour(buff, x0, y0, xsize, ysize, colour);
  91. if (dx > dy) {
  92. fraction = dy - (dx >> 1);
  93. while (x0 != x1) {
  94. if (fraction >= 0) {
  95. y0 += stepy;
  96. fraction -= dx;
  97. }
  98. x0 += stepx;
  99. fraction += dy;
  100. check_and_colour(buff, x0, y0, xsize, ysize, colour);
  101. }
  102. } else {
  103. fraction = dx - (dy >> 1);
  104. while (y0 != y1) {
  105. if (fraction >= 0) {
  106. x0 += stepx;
  107. fraction -= dy;
  108. }
  109. y0 += stepy;
  110. fraction += dx;
  111. check_and_colour(buff, x0, y0, xsize, ysize, colour);
  112. }
  113. }
  114. }
  115. /***/
  116. static void check_and_colour(unsigned char *buff, int x0, int y0, int xsize, int ysize, char colour)
  117. {
  118. if (x0 < 0)
  119. return;
  120. if (x0 > xsize)
  121. return;
  122. if (y0 < 0)
  123. return;
  124. if (y0 > (xsize*(ysize-1)))
  125. return;
  126. buff[x0+y0] = colour;
  127. }