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

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

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

revision 1.1, Sat May 3 23:26:55 2003 UTC revision 1.1.2.1, Sat May 3 23:26:55 2003 UTC
# Line 0  Line 1 
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    }

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.1.2.1

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