[svn] / trunk / xvidcore / src / quant / quant_mpeg4.c Repository:
ViewVC logotype

Diff of /trunk/xvidcore/src/quant/quant_mpeg4.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3, Fri Mar 8 02:46:11 2002 UTC revision 4, Fri Mar 8 19:17:46 2002 UTC
# Line 42  Line 42 
42    
43    
44  #include "quant_mpeg4.h"  #include "quant_mpeg4.h"
45    #include "quant_matrix.h"
   
46    
47  // function pointers  // function pointers
48  quant_intraFuncPtr quant4_intra;  quant_intraFuncPtr quant4_intra;
# Line 76  Line 75 
75      FIX(56),    FIX(58),    FIX(60),    FIX(62)      FIX(56),    FIX(58),    FIX(60),    FIX(62)
76  };  };
77    
   
 static const int16_t default_intra_matrix[64] = {  
      8,17,18,19,21,23,25,27,  
     17,18,19,21,23,25,27,28,  
     20,21,22,23,24,26,28,30,  
     21,22,23,24,26,28,30,32,  
     22,23,24,26,28,30,32,35,  
     23,24,26,28,30,32,35,38,  
     25,26,28,30,32,35,38,41,  
     27,28,30,32,35,38,41,45  
 };  
   
 static const int16_t default_inter_matrix[64] = {  
     16,17,18,19,20,21,22,23,  
     17,18,19,20,21,22,23,24,  
     18,19,20,21,22,23,24,25,  
     19,20,21,22,23,24,26,27,  
     20,21,22,23,25,26,27,28,  
     21,22,23,24,26,27,28,30,  
     22,23,24,26,27,28,30,31,  
     23,24,25,27,28,30,31,33  
 };  
   
   
78  /*    quantize intra-block  /*    quantize intra-block
79    
80      // const int32_t quantd = DIV_DIV(VM18P*quant, VM18Q);      // const int32_t quantd = DIV_DIV(VM18P*quant, VM18Q);
# Line 113  Line 88 
88      const uint32_t quantd = ((VM18P*quant) + (VM18Q/2)) / VM18Q;      const uint32_t quantd = ((VM18P*quant) + (VM18Q/2)) / VM18Q;
89      const uint32_t mult = multipliers[quant];      const uint32_t mult = multipliers[quant];
90      uint32_t i;      uint32_t i;
91            int16_t *intra_matrix;
92    
93            intra_matrix = get_intra_matrix();
94    
95      coeff[0] = DIV_DIV(data[0], (int32_t)dcscalar);      coeff[0] = DIV_DIV(data[0], (int32_t)dcscalar);
96    
# Line 121  Line 99 
99          if (data[i] < 0)          if (data[i] < 0)
100          {          {
101              uint32_t level = -data[i];              uint32_t level = -data[i];
102              level = ((level<<4) + (default_intra_matrix[i]>>1)) / default_intra_matrix[i];              level = ((level<<4) + (intra_matrix[i]>>1)) / intra_matrix[i];
103              level = ((level + quantd) * mult) >> 17;              level = ((level + quantd) * mult) >> 17;
104              coeff[i] = -(int16_t)level;              coeff[i] = -(int16_t)level;
105          }          }
106          else if (data[i] > 0)          else if (data[i] > 0)
107          {          {
108              uint32_t level = data[i];              uint32_t level = data[i];
109              level = ((level<<4) + (default_intra_matrix[i]>>1)) / default_intra_matrix[i];              level = ((level<<4) + (intra_matrix[i]>>1)) / intra_matrix[i];
110              level = ((level + quantd) * mult) >> 17;              level = ((level + quantd) * mult) >> 17;
111              coeff[i] = level;              coeff[i] = level;
112          }          }
# Line 148  Line 126 
126  void dequant4_intra_c(int16_t *data, const int16_t *coeff, const uint32_t quant, const uint32_t dcscalar)  void dequant4_intra_c(int16_t *data, const int16_t *coeff, const uint32_t quant, const uint32_t dcscalar)
127  {  {
128      uint32_t i;      uint32_t i;
129            int16_t *intra_matrix;
130    
131            intra_matrix = get_intra_matrix();
132    
133      data[0] = coeff[0]  * dcscalar;      data[0] = coeff[0]  * dcscalar;
134      if (data[0] < -2048)      if (data[0] < -2048)
# Line 168  Line 149 
149          else if (coeff[i] < 0)          else if (coeff[i] < 0)
150          {          {
151              uint32_t level = -coeff[i];              uint32_t level = -coeff[i];
152              level = (level * default_intra_matrix[i] * quant) >> 3;              level = (level * intra_matrix[i] * quant) >> 3;
153              data[i] = (level <= 2048 ? -(int16_t)level : -2048);              data[i] = (level <= 2048 ? -(int16_t)level : -2048);
154          }          }
155          else // if (coeff[i] > 0)          else // if (coeff[i] > 0)
156          {          {
157              uint32_t level = coeff[i];              uint32_t level = coeff[i];
158              level = (level * default_intra_matrix[i] * quant) >> 3;              level = (level * intra_matrix[i] * quant) >> 3;
159              data[i] = (level <= 2047 ? level : 2047);              data[i] = (level <= 2047 ? level : 2047);
160          }          }
161      }      }
# Line 194  Line 175 
175      const uint32_t mult = multipliers[quant];      const uint32_t mult = multipliers[quant];
176      uint32_t sum = 0;      uint32_t sum = 0;
177      uint32_t i;      uint32_t i;
178            int16_t *inter_matrix;
179    
180            inter_matrix = get_inter_matrix();
181    
182      for (i = 0; i < 64; i++)      for (i = 0; i < 64; i++)
183      {      {
184          if (data[i] < 0)          if (data[i] < 0)
185          {          {
186              uint32_t level = -data[i];              uint32_t level = -data[i];
187              level = ((level<<4) + (default_inter_matrix[i]>>1)) / default_inter_matrix[i];              level = ((level<<4) + (inter_matrix[i]>>1)) / inter_matrix[i];
188              level = (level * mult) >> 17;              level = (level * mult) >> 17;
189              sum += level;              sum += level;
190              coeff[i] = -(int16_t)level;              coeff[i] = -(int16_t)level;
# Line 208  Line 192 
192          else if (data[i] > 0)          else if (data[i] > 0)
193          {          {
194              uint32_t level = data[i];              uint32_t level = data[i];
195              level = ((level<<4) + (default_inter_matrix[i]>>1)) / default_inter_matrix[i];              level = ((level<<4) + (inter_matrix[i]>>1)) / inter_matrix[i];
196              level = (level * mult) >> 17;              level = (level * mult) >> 17;
197              sum += level;              sum += level;
198              coeff[i] = level;              coeff[i] = level;
# Line 231  Line 215 
215  {  {
216      uint32_t sum = 0;      uint32_t sum = 0;
217      uint32_t i;      uint32_t i;
218            int16_t *inter_matrix;
219    
220            inter_matrix = get_inter_matrix();
221    
222      for (i = 0; i < 64; i++)      for (i = 0; i < 64; i++)
223      {      {
# Line 241  Line 228 
228          else if (coeff[i] < 0)          else if (coeff[i] < 0)
229          {          {
230              int32_t level = -coeff[i];              int32_t level = -coeff[i];
231              level = ((2 * level + 1) * default_inter_matrix[i] * quant) >> 4;              level = ((2 * level + 1) * inter_matrix[i] * quant) >> 4;
232              data[i] = (level <= 2048 ? -level : -2048);              data[i] = (level <= 2048 ? -level : -2048);
233          }          }
234          else // if (coeff[i] > 0)          else // if (coeff[i] > 0)
235          {          {
236              uint32_t level = coeff[i];              uint32_t level = coeff[i];
237              level = ((2 * level + 1) * default_inter_matrix[i] * quant) >> 4;              level = ((2 * level + 1) * inter_matrix[i] * quant) >> 4;
238              data[i] = (level <= 2047 ? level : 2047);              data[i] = (level <= 2047 ? level : 2047);
239          }          }
240    

Legend:
Removed from v.3  
changed lines
  Added in v.4

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.4