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

Diff of /trunk/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 224, Wed Jun 19 08:46:57 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    
68          static float *quant;          static float *quant;
69          unsigned char *ptr;          unsigned char *ptr;
70          float *val;          float *val;
71          float global = 0.;          float global = 0., maxval = 0.;
72          uint32_t mid_range = 0;  
73            const float DarkThres = 0.25;
74            const float DarkAmpl = 7.0;
75    
76            const float BrightThres = 4.0;
77            const float BrightAmpl = 5.0;
78    
79          const float DarkAmpl    = 14 / 2;          const char LowestVal = 10;
         const float BrightAmpl  = 10 / 2;  
         const float DarkThres   = 70;  
         const float BrightThres = 200;  
   
         const float GlobalDarkThres = 60;  
         const float GlobalBrightThres = 170;  
   
         const float MidRangeThres = 20;  
         const float UpperLimit = 200;  
         const float LowerLimit = 25;  
80    
81            const float GlobalBrightThres = 220.0;
82            const float GlobalDarkThres = 20.0;
83            float global_quant = 1.0;
84    
85          if(!quant)          if(!quant)
86                  if(!(quant = (float *) malloc(mb_width*mb_height * sizeof(float))))                  if(!(quant = (float *) malloc(mb_width*mb_height * sizeof(float))))
# Line 88  Line 88 
88    
89          val = (float *) malloc(mb_width*mb_height * sizeof(float));          val = (float *) malloc(mb_width*mb_height * sizeof(float));
90    
91          for(k = 0; k < mb_height; k++)          for (k = 0; k < mb_height; k++) {
         {  
92                  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
93                  {                  {
94                          quant[k*mb_width+l] = (float) framequant;                          quant[k*mb_width+l] = (float) framequant;
# Line 101  Line 100 
100    
101                          for(i = 0; i < 16; i++)                          for(i = 0; i < 16; i++)
102                                  for(j = 0; j < 16; j++)                                  for(j = 0; j < 16; j++)
103                                    {
104                                            if( ptr[i * stride + j] < LowestVal )
105                                                    ptr[i * stride + j] = 0;
106                                          val[k*mb_width+l] += ptr[i*stride+j];                                          val[k*mb_width+l] += ptr[i*stride+j];
107                                    }
108                          val[k*mb_width+l] /= 256.;                          val[k*mb_width+l] /= 256.;
109                          global += val[k*mb_width+l];                          global += val[k*mb_width+l];
110                            if( val[k * mb_width + l] > maxval )
111                          if((val[k*mb_width+l] > LowerLimit) && (val[k*mb_width+l] < UpperLimit))                                  maxval = val[k * mb_width + l];
                                 mid_range++;  
112                  }                  }
113          }          }
114    
115          global /= mb_width*mb_height;          global /= mb_width*mb_height;
116            maxval /= global;
117            if( global < GlobalDarkThres )
118                    global_quant *= -1.0;
119            else if ( global < GlobalBrightThres )
120                    global_quant = 0.0;
121    
122          if(((global < GlobalBrightThres) && (global > GlobalDarkThres))          for (k = 0; k < mb_height; k++) {
            || (mid_range < MidRangeThres)) {  
                 for(k = 0; k < mb_height; k++)  
                 {  
123                          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
124                          {                          {
125                            val[k * mb_width + l] /= global;
126                                  if(val[k*mb_width+l] < DarkThres)                                  if(val[k*mb_width+l] < DarkThres)
127                                          quant[k*mb_width+l] += DarkAmpl*(DarkThres-val[k*mb_width+l])/DarkThres;                                  quant[k * mb_width + l] += global_quant +
128                                            DarkAmpl * (DarkThres - val[k * mb_width + l]) / DarkThres;
129                                  else if (val[k*mb_width+l]>BrightThres)                                  else if (val[k*mb_width+l]>BrightThres)
130                                          quant[k*mb_width+l] += BrightAmpl*(val[k*mb_width+l]-BrightThres)/(255-BrightThres);                                  quant[k * mb_width + l] += global_quant +
131                          }                                          BrightAmpl * (val[k * mb_width + l] - BrightThres) / (maxval - BrightThres);
132                  }                  }
133          }          }
134          free(val);          free(val);
135          return normalize_quantizer_field(quant, intquant, mb_width*mb_height, min_quant, max_quant);          return normalize_quantizer_field(quant, intquant, mb_width * mb_height,
136                                                                             min_quant, max_quant);
137  }  }

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

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