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

Annotation of /trunk/xvidcore/src/quant/adapt_quant.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3 - (view) (download)

1 : Isibaar 3 #include "../portab.h"
2 :     #include "adapt_quant.h"
3 :    
4 :     #define MAX(a,b) (((a) > (b)) ? (a) : (b))
5 :     #define RDIFF(a,b) ((int)(a+0.5)-(int)(b+0.5))
6 :    
7 :     int normalize_quantizer_field(float *in, int *out, int num, int min_quant, int max_quant)
8 :     {
9 :     int i;
10 :     int finished;
11 :    
12 :     do
13 :     {
14 :     finished = 1;
15 :     for(i = 1; i < num; i++)
16 :     {
17 :     if(RDIFF(in[i], in[i-1]) > 2)
18 :     {
19 :     in[i] -= (float) 0.5;
20 :     finished = 0;
21 :     }
22 :     else if(RDIFF(in[i], in[i-1]) < -2)
23 :     {
24 :     in[i-1] -= (float) 0.5;
25 :     finished = 0;
26 :     }
27 :    
28 :     if(in[i] > max_quant)
29 :     {
30 :     in[i] = (float) max_quant;
31 :     finished = 0;
32 :     }
33 :     if(in[i] < min_quant)
34 :     {
35 :     in[i] = (float) min_quant;
36 :     finished = 0;
37 :     }
38 :     if(in[i-1] > max_quant)
39 :     {
40 :     in[i-1] = (float) max_quant;
41 :     finished = 0;
42 :     }
43 :     if(in[i-1] < min_quant)
44 :     {
45 :     in[i-1] = (float) min_quant;
46 :     finished = 0;
47 :     }
48 :     }
49 :     } while(!finished);
50 :    
51 :     out[0] = 0;
52 :     for (i = 1; i < num; i++)
53 :     out[i] = RDIFF(in[i], in[i-1]);
54 :    
55 :     return (int) (in[0] + 0.5);
56 :     }
57 :    
58 :     int adaptive_quantization(unsigned char* buf, int stride, int* intquant,
59 :     int framequant, int min_quant, int max_quant,
60 :     int mb_width, int mb_height) // no qstride because normalization
61 :     {
62 :     int i,j,k,l;
63 :    
64 :     static float *quant;
65 :     unsigned char *ptr;
66 :     float *val;
67 :     float global = 0.;
68 :     uint32_t mid_range = 0;
69 :    
70 :     const float DarkAmpl = 14 / 2;
71 :     const float BrightAmpl = 10 / 2;
72 :     const float DarkThres = 70;
73 :     const float BrightThres = 200;
74 :    
75 :     const float GlobalDarkThres = 60;
76 :     const float GlobalBrightThres = 170;
77 :    
78 :     const float MidRangeThres = 20;
79 :     const float UpperLimit = 200;
80 :     const float LowerLimit = 25;
81 :    
82 :    
83 :     if(!quant)
84 :     if(!(quant = (float *) malloc(mb_width*mb_height * sizeof(float))))
85 :     return -1;
86 :    
87 :     val = (float *) malloc(mb_width*mb_height * sizeof(float));
88 :    
89 :     for(k = 0; k < mb_height; k++)
90 :     {
91 :     for(l = 0;l < mb_width; l++) // do this for all macroblocks individually
92 :     {
93 :     quant[k*mb_width+l] = (float) framequant;
94 :    
95 :     // calculate luminance-masking
96 :     ptr = &buf[16*k*stride+16*l]; // address of MB
97 :    
98 :     val[k*mb_width+l] = 0.;
99 :    
100 :     for(i = 0; i < 16; i++)
101 :     for(j = 0; j < 16; j++)
102 :     val[k*mb_width+l] += ptr[i*stride+j];
103 :     val[k*mb_width+l] /= 256.;
104 :     global += val[k*mb_width+l];
105 :    
106 :     if((val[k*mb_width+l] > LowerLimit) && (val[k*mb_width+l] < UpperLimit))
107 :     mid_range++;
108 :     }
109 :     }
110 :    
111 :     global /= mb_width*mb_height;
112 :    
113 :     if((global < GlobalBrightThres) && (global > GlobalDarkThres)
114 :     || (mid_range < MidRangeThres)) {
115 :     for(k = 0; k < mb_height; k++)
116 :     {
117 :     for(l = 0;l < mb_width; l++) // do this for all macroblocks individually
118 :     {
119 :     if(val[k*mb_width+l] < DarkThres)
120 :     quant[k*mb_width+l] += DarkAmpl*(DarkThres-val[k*mb_width+l])/DarkThres;
121 :     else if (val[k*mb_width+l]>BrightThres)
122 :     quant[k*mb_width+l] += BrightAmpl*(val[k*mb_width+l]-BrightThres)/(255-BrightThres);
123 :     }
124 :     }
125 :     }
126 :     free(val);
127 :     return normalize_quantizer_field(quant, intquant, mb_width*mb_height, min_quant, max_quant);
128 :     }

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