quantize.c
上传用户:super_houu
上传日期:2008-09-21
资源大小:4099k
文件大小:2k
源码类别:

DVD

开发平台:

Others

  1. #include "Includesysdefs.h"
  2. #ifdef SUPPORT_CAPTURE_LOGO
  3. CONST char quant_mat[8][8]={
  4. { 8, 16, 19, 22, 26, 27, 29, 34},
  5. {16, 16, 22, 24, 27, 29, 34, 37},
  6. {19, 22, 26, 27, 29, 34, 34, 38},
  7. {22, 22, 26, 27, 29, 34, 37, 40},
  8. {22, 26, 27, 29, 32, 35, 40, 48},
  9. {26, 27, 29, 32, 35, 40, 48, 58},
  10. {26, 27, 29, 34, 38, 46, 56, 69},
  11. {27, 29, 35, 38, 46, 56, 69, 83}
  12. };
  13. void quant_intra(short src[8][8],int dc_prec,int mquant)
  14. {
  15.  
  16.   long x, d;
  17.   x = (long)src[0][0];
  18.   d = 8>>dc_prec; /* intra_dc_mult */
  19.   src[0][0] = (short)((x>=0) ? (x+(d>>1))/d : -((-x+(d>>1))/d)); /* round(x/d) */
  20. #if 0
  21.   for (k=1; k<64; k++)
  22.   {
  23. i=k/8;
  24. j=k&7;
  25.     x = (long)src[i][j];
  26.     d = (long)quant_mat[i][j];
  27.     y = (32*(x>=0 ? x : -x) + (d>>1))/d; /* round(32*x/quant_mat) */
  28.     d = (3*mquant+2)>>2;
  29.     y = (y+d)/(2*mquant); /* (y+0.75*mquant) / (2*mquant) */
  30.     /* clip to syntax limits */
  31. if (y > 2047)
  32. {
  33.         y = 2047;
  34.     }
  35.     src[i][j] = (short)((x>=0) ? y : -y);
  36.   }
  37. #endif
  38.   /*
  39. ax - x,y
  40. bx - sign of x
  41. cx - d
  42. dx - mquant
  43. es:di - quant_mat
  44. ds:si - src
  45.   */
  46.   asm{
  47. lds si,src
  48. add si,2
  49. mov ax,seg quant_mat
  50. mov es,ax
  51. mov di,1
  52. loop_k:
  53. mov ax,[si] // x = src[i][j];
  54. xor bx,bx
  55. cmp ax,0
  56. jg no_neg
  57. neg ax
  58. mov bx,1
  59. no_neg: // x = abs(x); bx = sign(x)
  60. mov cl,byte ptr es:quant_mat[di] // d = quant_mat[i][j];
  61. xor ch,ch
  62. shl ax,5 // the following lines do: ((32*x)/(d>>1)+1)>>1
  63. shr cx,1
  64. xor dx,dx
  65. div cx
  66. inc ax
  67. shr ax,1
  68. mov dx,[mquant]
  69. mov cx,dx // d*=3
  70. shl cx,1
  71. add cx,dx
  72. add cx,2
  73. shr cx,1 // d>>=2
  74. shr cx,1
  75. add ax,dx // y+d
  76. mov cx,dx
  77. shl cx,1
  78. xor dx,dx
  79. div cx
  80. cmp ax,2047 // if( y>2047 )
  81. jl no_overflow
  82. mov ax,2047
  83. no_overflow:
  84. cmp bx,1 // ((x>=0) ? y : -y);
  85. jne no_neg1
  86. neg ax
  87. no_neg1:
  88. mov [si],ax
  89. add si,2
  90. add di,1
  91. cmp di,64
  92. jne loop_k
  93. }
  94. }
  95. #endif