[svn] / branches / dev-api-4 / xvidcore / src / quant / adapt_quant.c Repository:
ViewVC logotype

Diff of /branches/dev-api-4/xvidcore/src/quant/adapt_quant.c

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

revision 18, Sat Mar 9 16:18:23 2002 UTC revision 195, Wed Jun 12 20:38:41 2002 UTC
# Line 6  Line 6 
6  #define MAX(a,b)      (((a) > (b)) ? (a) : (b))  #define MAX(a,b)      (((a) > (b)) ? (a) : (b))
7  #define RDIFF(a,b)    ((int)(a+0.5)-(int)(b+0.5))  #define RDIFF(a,b)    ((int)(a+0.5)-(int)(b+0.5))
8    
9  int normalize_quantizer_field(float *in, int *out, int num, int min_quant, int max_quant)  int
10    normalize_quantizer_field(float *in,
11                                                      int *out,
12                                                      int num,
13                                                      int min_quant,
14                                                      int max_quant)
15  {  {
16          int i;          int i;
17          int finished;          int finished;
18    
19          do          do {
         {  
20                  finished = 1;                  finished = 1;
21                  for(i = 1; i < num; i++)                  for (i = 1; i < num; i++) {
22                  {                          if (RDIFF(in[i], in[i - 1]) > 2) {
                         if(RDIFF(in[i], in[i-1]) > 2)  
                         {  
23                                  in[i] -= (float) 0.5;                                  in[i] -= (float) 0.5;
24                                  finished = 0;                                  finished = 0;
25                          }                          } else if (RDIFF(in[i], in[i - 1]) < -2) {
                         else if(RDIFF(in[i], in[i-1]) < -2)  
                         {  
26                                  in[i-1] -= (float) 0.5;                                  in[i-1] -= (float) 0.5;
27                                  finished = 0;                                  finished = 0;
28                          }                          }
29    
30                          if(in[i] > max_quant)                          if (in[i] > max_quant) {
                         {  
31                                  in[i] = (float) max_quant;                                  in[i] = (float) max_quant;
32                                  finished = 0;                                  finished = 0;
33                          }                          }
34                          if(in[i] < min_quant)                          if (in[i] < min_quant) {
                         {  
35                                  in[i] = (float) min_quant;                                  in[i] = (float) min_quant;
36                                  finished = 0;                                  finished = 0;
37                          }                          }
38                          if(in[i-1] > max_quant)                          if (in[i - 1] > max_quant) {
                         {  
39                                  in[i-1] = (float) max_quant;                                  in[i-1] = (float) max_quant;
40                                  finished = 0;                                  finished = 0;
41                          }                          }
42                          if(in[i-1] < min_quant)                          if (in[i - 1] < min_quant) {
                         {  
43                                  in[i-1] = (float) min_quant;                                  in[i-1] = (float) min_quant;
44                                  finished = 0;                                  finished = 0;
45                          }                          }
# Line 57  Line 53 
53          return (int) (in[0] + 0.5);          return (int) (in[0] + 0.5);
54  }  }
55    
56  int adaptive_quantization(unsigned char* buf, int stride, int* intquant,  int
57                            int framequant, int min_quant, int max_quant,  adaptive_quantization(unsigned char *buf,
58                            int mb_width, int mb_height)  // no qstride because normalization                                            int stride,
59                                              int *intquant,
60                                              int framequant,
61                                              int min_quant,
62                                              int max_quant,
63                                              int mb_width,
64                                              int mb_height)        // no qstride because normalization
65  {  {
66          int i,j,k,l;          int i,j,k,l;
67    
# Line 88  Line 90 
90    
91          val = (float *) malloc(mb_width*mb_height * sizeof(float));          val = (float *) malloc(mb_width*mb_height * sizeof(float));
92    
93          for(k = 0; k < mb_height; k++)          for (k = 0; k < mb_height; k++) {
         {  
94                  for(l = 0;l < mb_width; l++)        // do this for all macroblocks individually                  for(l = 0;l < mb_width; l++)        // do this for all macroblocks individually
95                  {                  {
96                          quant[k*mb_width+l] = (float) framequant;                          quant[k*mb_width+l] = (float) framequant;
# Line 105  Line 106 
106                          val[k*mb_width+l] /= 256.;                          val[k*mb_width+l] /= 256.;
107                          global += val[k*mb_width+l];                          global += val[k*mb_width+l];
108    
109                          if((val[k*mb_width+l] > LowerLimit) && (val[k*mb_width+l] < UpperLimit))                          if ((val[k * mb_width + l] > LowerLimit) &&
110                                    (val[k * mb_width + l] < UpperLimit))
111                                  mid_range++;                                  mid_range++;
112                  }                  }
113          }          }
# Line 114  Line 116 
116    
117          if(((global < GlobalBrightThres) && (global > GlobalDarkThres))          if(((global < GlobalBrightThres) && (global > GlobalDarkThres))
118             || (mid_range < MidRangeThres)) {             || (mid_range < MidRangeThres)) {
119                  for(k = 0; k < mb_height; k++)                  for (k = 0; k < mb_height; k++) {
                 {  
120                          for(l = 0;l < mb_width; l++)        // do this for all macroblocks individually                          for(l = 0;l < mb_width; l++)        // do this for all macroblocks individually
121                          {                          {
122                                  if(val[k*mb_width+l] < DarkThres)                                  if(val[k*mb_width+l] < DarkThres)
123                                          quant[k*mb_width+l] += DarkAmpl*(DarkThres-val[k*mb_width+l])/DarkThres;                                          quant[k * mb_width + l] +=
124                                                    DarkAmpl * (DarkThres -
125                                                                            val[k * mb_width + l]) / DarkThres;
126                                  else if (val[k*mb_width+l]>BrightThres)                                  else if (val[k*mb_width+l]>BrightThres)
127                                          quant[k*mb_width+l] += BrightAmpl*(val[k*mb_width+l]-BrightThres)/(255-BrightThres);                                          quant[k * mb_width + l] +=
128                                                    BrightAmpl * (val[k * mb_width + l] -
129                                                                              BrightThres) / (255 - BrightThres);
130                          }                          }
131                  }                  }
132          }          }
133          free(val);          free(val);
134          return normalize_quantizer_field(quant, intquant, mb_width*mb_height, min_quant, max_quant);          return normalize_quantizer_field(quant, intquant, mb_width * mb_height,
135                                                                             min_quant, max_quant);
136  }  }

Legend:
Removed from v.18  
changed lines
  Added in v.195

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