[cvs] / xvidcore / src / image / postprocessing.c Repository:
ViewVC logotype

Annotation of /xvidcore/src/image/postprocessing.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1.2.1 - (view) (download)

1 : Isibaar 1.1.2.1 #include <stdlib.h>
2 :     #include <string.h>
3 :     #include <math.h>
4 :    
5 :     #include "../portab.h"
6 :     #include "../global.h"
7 :     #include "image.h"
8 :     #include "postprocessing.h"
9 :    
10 :     void
11 :     image_deblock(IMAGE * img, int edged_width,
12 :     const MACROBLOCK * mbs, int mb_width, int mb_height, int mb_stride,
13 :     int flags)
14 :     {
15 :     const int edged_width2 = edged_width /2;
16 :     int i,j;
17 :     int quant;
18 :    
19 :     /* luma: j,i in block units */
20 :     if ((flags & XVID_DEC_DEBLOCKY))
21 :     {
22 :     for (j = 1; j < mb_height*2; j++) /* horizontal deblocking */
23 :     for (i = 0; i < mb_width*2; i++)
24 :     {
25 :     quant = mbs[(j+0)/2*mb_stride + (i/2)].quant;
26 :     deblock8x8_h(img->y + j*8*edged_width + i*8, edged_width, quant);
27 :     }
28 :    
29 :     for (j = 0; j < mb_height*2; j++) /* vertical deblocking */
30 :     for (i = 1; i < mb_width*2; i++)
31 :     {
32 :     quant = mbs[(j+0)/2*mb_stride + (i/2)].quant;
33 :     deblock8x8_v(img->y + j*8*edged_width + i*8, edged_width, quant);
34 :     }
35 :     }
36 :    
37 :    
38 :     /* chroma */
39 :     if ((flags & XVID_DEC_DEBLOCKUV))
40 :     {
41 :     for (j = 1; j < mb_height; j++) /* horizontal deblocking */
42 :     for (i = 0; i < mb_width; i++)
43 :     {
44 :     quant = mbs[(j+0)*mb_stride + i].quant;
45 :     deblock8x8_h(img->u + j*8*edged_width2 + i*8, edged_width2, quant);
46 :     deblock8x8_h(img->v + j*8*edged_width2 + i*8, edged_width2, quant);
47 :     }
48 :    
49 :     for (j = 0; j < mb_height; j++) /* vertical deblocking */
50 :     for (i = 1; i < mb_width; i++)
51 :     {
52 :     quant = mbs[(j+0)*mb_stride + i].quant;
53 :     deblock8x8_v(img->u + j*8*edged_width2 + i*8, edged_width2, quant);
54 :     deblock8x8_v(img->v + j*8*edged_width2 + i*8, edged_width2, quant);
55 :     }
56 :     }
57 :     }
58 :    
59 :     #define THR1 2
60 :     #define THR2 6
61 :    
62 :     void deblock8x8_h(uint8_t *img, int stride, int quant)
63 :     {
64 :     int i, j;
65 :     int eq_cnt;
66 :     uint8_t *v[10], p0, p9;
67 :     int min, max;
68 :     int a30, a31, a32;
69 :     int diff, limit;
70 :    
71 :     for(j = 0; j < 8; j++) {
72 :     eq_cnt = 0;
73 :    
74 :     /* Load pixel addresses for filtering */
75 :    
76 :     for(i = 0; i < 10; i++)
77 :     v[i] = img + (i-5)*stride + j;
78 :    
79 :     /* First, decide whether to use default or DC-offset mode */
80 :    
81 :     for(i = 0; i < 9; i++)
82 :     {
83 :     if(ABS(*v[i] - *v[(i+1)]) < THR1)
84 :     eq_cnt++;
85 :     }
86 :    
87 :     if(eq_cnt < THR2) { /* Default mode */
88 :    
89 :     a30 = (*v[3] * 2 - *v[4] * 5 + *v[5] * 5 - *v[6] * 2);
90 :    
91 :     if(ABS(a30) < 8*quant) {
92 :     a31 = (*v[1] * 2 - *v[2] * 5 + *v[3] * 5 - *v[4] * 2);
93 :     a32 = (*v[5] * 2 - *v[6] * 5 + *v[7] * 5 - *v[8] * 2);
94 :    
95 :     diff = (5 * ((SIGN(a30) * MIN(ABS(a30), MIN(ABS(a31), ABS(a32)))) - a30) + 32) >> 6;
96 :     limit = (*v[4] - *v[5]) / 2;
97 :    
98 :     if (limit > 0)
99 :     diff = (diff < 0) ? 0 : ((diff > limit) ? limit : diff);
100 :     else
101 :     diff = (diff > 0) ? 0 : ((diff < limit) ? limit : diff);
102 :    
103 :     *v[4] -= diff;
104 :     *v[5] += diff;
105 :     }
106 :     }
107 :     else { /* DC-offset mode */
108 :    
109 :     /* Now decide whether to apply smoothing filter or not */
110 :     max = MAX(*v[1], MAX(*v[2], MAX(*v[3], MAX(*v[4], MAX(*v[5], MAX(*v[6], MAX(*v[7], *v[8])))))));
111 :     min = MIN(*v[1], MIN(*v[2], MIN(*v[3], MIN(*v[4], MIN(*v[5], MIN(*v[6], MIN(*v[7], *v[8])))))));
112 :    
113 :     if((max-min) < 2*quant) {
114 :    
115 :     /* Choose edge pixels */
116 :     p0 = (ABS(*v[1]-*v[0]) < quant) ? *v[0] : *v[1];
117 :     p9 = (ABS(*v[8]-*v[9]) < quant) ? *v[9] : *v[8];
118 :    
119 :     *v[1] = (6*p0 + (*v[1]<<2) + (*v[2]<<1) + (*v[3]<<1) + *v[4] + *v[5] + 8) >> 4;
120 :     *v[2] = ((p0<<2) + (*v[1]<<1) + (*v[2]<<2) + (*v[3]<<1) + (*v[4]<<1) + *v[5] + *v[6] + 8) >> 4;
121 :     *v[3] = ((p0<<1) + (*v[1]<<1) + (*v[2]<<1) + (*v[3]<<2) + (*v[4]<<1) + (*v[5]<<1) + *v[6] + *v[7] + 8) >> 4;
122 :     *v[4] = (p0 + *v[1] + (*v[2]<<1) + (*v[3]<<1) + (*v[4]<<2) + (*v[5]<<1) + (*v[6]<<1) + *v[7] + *v[8] + 8) >> 4;
123 :     *v[5] = (*v[1] + *v[2] + (*v[3]<<1) + (*v[4]<<1) + (*v[5]<<2) + (*v[6]<<1) + (*v[7]<<1) + *v[8] + p9 + 8) >> 4;
124 :     *v[6] = (*v[2] + *v[3] + (*v[4]<<1) + (*v[5]<<1) + (*v[6]<<2) + (*v[7]<<1) + (*v[8]<<1) + (p9<<1) + 8) >> 4;
125 :     *v[7] = (*v[3] + *v[4] + (*v[5]<<1) + (*v[6]<<1) + (*v[7]<<2) + (*v[8]<<1) + (p9<<2) + 8) >> 4;
126 :     *v[8] = (*v[4] + *v[5] + (*v[6]<<1) + (*v[7]<<1) + (*v[8]<<2) + 6*p9 + 8) >> 4;
127 :     }
128 :     }
129 :     }
130 :     }
131 :    
132 :    
133 :    
134 :     void deblock8x8_v(uint8_t *img, int stride, int quant)
135 :     {
136 :     int i, j;
137 :     int eq_cnt;
138 :     uint8_t *v[10], p0, p9;
139 :     int min, max;
140 :     int a30, a31, a32;
141 :     int diff, limit;
142 :    
143 :     for(j = 0; j < 8; j++) {
144 :     eq_cnt = 0;
145 :    
146 :     /* Load pixel addresses for filtering */
147 :    
148 :     for(i = 0; i < 10; i++)
149 :     v[i] = img + j*stride + (i-5);
150 :    
151 :     /* First, decide whether to use default or DC-offset mode */
152 :    
153 :     for(i = 0; i < 9; i++)
154 :     {
155 :     if(ABS(*v[i] - *v[i+1]) < THR1)
156 :     eq_cnt++;
157 :     }
158 :    
159 :     if(eq_cnt < THR2) { /* Default mode */
160 :    
161 :     a30 = (*v[3] * 2 - *v[4] * 5 + *v[5] * 5 - *v[6] * 2);
162 :    
163 :     if(ABS(a30) < 8*quant) {
164 :     a31 = (*v[1] * 2 - *v[2] * 5 + *v[3] * 5 - *v[4] * 2);
165 :     a32 = (*v[5] * 2 - *v[6] * 5 + *v[7] * 5 - *v[8] * 2);
166 :    
167 :     diff = (5 * ((SIGN(a30) * MIN(ABS(a30), MIN(ABS(a31), ABS(a32)))) - a30) + 32) >> 6;
168 :     limit = (*v[4] - *v[5]) / 2;
169 :    
170 :     if (limit > 0)
171 :     diff = (diff < 0) ? 0 : ((diff > limit) ? limit : diff);
172 :     else
173 :     diff = (diff > 0) ? 0 : ((diff < limit) ? limit : diff);
174 :    
175 :     *v[4] -= diff;
176 :     *v[5] += diff;
177 :     }
178 :     }
179 :     else { /* DC-offset mode */
180 :    
181 :     /* Now decide whether to apply smoothing filter or not */
182 :     max = MAX(*v[1], MAX(*v[2], MAX(*v[3], MAX(*v[4], MAX(*v[5], MAX(*v[6], MAX(*v[7], *v[8])))))));
183 :     min = MIN(*v[1], MIN(*v[2], MIN(*v[3], MIN(*v[4], MIN(*v[5], MIN(*v[6], MIN(*v[7], *v[8])))))));
184 :    
185 :     if((max-min) < 2*quant) {
186 :    
187 :     /* Choose edge pixels */
188 :     p0 = (ABS(*v[1]-*v[0]) < quant) ? *v[0] : *v[1];
189 :     p9 = (ABS(*v[8]-*v[9]) < quant) ? *v[9] : *v[8];
190 :    
191 :     *v[1] = (6*p0 + (*v[1]<<2) + (*v[2]<<1) + (*v[3]<<1) + *v[4] + *v[5] + 8) >> 4;
192 :     *v[2] = ((p0<<2) + (*v[1]<<1) + (*v[2]<<2) + (*v[3]<<1) + (*v[4]<<1) + *v[5] + *v[6] + 8) >> 4;
193 :     *v[3] = ((p0<<1) + (*v[1]<<1) + (*v[2]<<1) + (*v[3]<<2) + (*v[4]<<1) + (*v[5]<<1) + *v[6] + *v[7] + 8) >> 4;
194 :     *v[4] = (p0 + *v[1] + (*v[2]<<1) + (*v[3]<<1) + (*v[4]<<2) + (*v[5]<<1) + (*v[6]<<1) + *v[7] + *v[8] + 8) >> 4;
195 :     *v[5] = (*v[1] + *v[2] + (*v[3]<<1) + (*v[4]<<1) + (*v[5]<<2) + (*v[6]<<1) + (*v[7]<<1) + *v[8] + p9 + 8) >> 4;
196 :     *v[6] = (*v[2] + *v[3] + (*v[4]<<1) + (*v[5]<<1) + (*v[6]<<2) + (*v[7]<<1) + (*v[8]<<1) + (p9<<1) + 8) >> 4;
197 :     *v[7] = (*v[3] + *v[4] + (*v[5]<<1) + (*v[6]<<1) + (*v[7]<<2) + (*v[8]<<1) + (p9<<2) + 8) >> 4;
198 :     *v[8] = (*v[4] + *v[5] + (*v[6]<<1) + (*v[7]<<1) + (*v[8]<<2) + 6*p9 + 8) >> 4;
199 :     }
200 :     }
201 :     }
202 :     }

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