comparison h264pred.c @ 11916:73f4fd490f2a libavcodec

Make "topright" argument to pred4x4() const. Patch by David Conrad <lessen42 gmail com>.
author rbultje
date Tue, 22 Jun 2010 19:12:54 +0000
parents 7dd2a45249a9
children 823f332655e8
comparison
equal deleted inserted replaced
11915:c6ef8db76115 11916:73f4fd490f2a
27 27
28 #include "avcodec.h" 28 #include "avcodec.h"
29 #include "mpegvideo.h" 29 #include "mpegvideo.h"
30 #include "h264pred.h" 30 #include "h264pred.h"
31 31
32 static void pred4x4_vertical_c(uint8_t *src, uint8_t *topright, int stride){ 32 static void pred4x4_vertical_c(uint8_t *src, const uint8_t *topright, int stride){
33 const uint32_t a= ((uint32_t*)(src-stride))[0]; 33 const uint32_t a= ((uint32_t*)(src-stride))[0];
34 ((uint32_t*)(src+0*stride))[0]= a; 34 ((uint32_t*)(src+0*stride))[0]= a;
35 ((uint32_t*)(src+1*stride))[0]= a; 35 ((uint32_t*)(src+1*stride))[0]= a;
36 ((uint32_t*)(src+2*stride))[0]= a; 36 ((uint32_t*)(src+2*stride))[0]= a;
37 ((uint32_t*)(src+3*stride))[0]= a; 37 ((uint32_t*)(src+3*stride))[0]= a;
38 } 38 }
39 39
40 static void pred4x4_horizontal_c(uint8_t *src, uint8_t *topright, int stride){ 40 static void pred4x4_horizontal_c(uint8_t *src, const uint8_t *topright, int stride){
41 ((uint32_t*)(src+0*stride))[0]= src[-1+0*stride]*0x01010101; 41 ((uint32_t*)(src+0*stride))[0]= src[-1+0*stride]*0x01010101;
42 ((uint32_t*)(src+1*stride))[0]= src[-1+1*stride]*0x01010101; 42 ((uint32_t*)(src+1*stride))[0]= src[-1+1*stride]*0x01010101;
43 ((uint32_t*)(src+2*stride))[0]= src[-1+2*stride]*0x01010101; 43 ((uint32_t*)(src+2*stride))[0]= src[-1+2*stride]*0x01010101;
44 ((uint32_t*)(src+3*stride))[0]= src[-1+3*stride]*0x01010101; 44 ((uint32_t*)(src+3*stride))[0]= src[-1+3*stride]*0x01010101;
45 } 45 }
46 46
47 static void pred4x4_dc_c(uint8_t *src, uint8_t *topright, int stride){ 47 static void pred4x4_dc_c(uint8_t *src, const uint8_t *topright, int stride){
48 const int dc= ( src[-stride] + src[1-stride] + src[2-stride] + src[3-stride] 48 const int dc= ( src[-stride] + src[1-stride] + src[2-stride] + src[3-stride]
49 + src[-1+0*stride] + src[-1+1*stride] + src[-1+2*stride] + src[-1+3*stride] + 4) >>3; 49 + src[-1+0*stride] + src[-1+1*stride] + src[-1+2*stride] + src[-1+3*stride] + 4) >>3;
50 50
51 ((uint32_t*)(src+0*stride))[0]= 51 ((uint32_t*)(src+0*stride))[0]=
52 ((uint32_t*)(src+1*stride))[0]= 52 ((uint32_t*)(src+1*stride))[0]=
53 ((uint32_t*)(src+2*stride))[0]= 53 ((uint32_t*)(src+2*stride))[0]=
54 ((uint32_t*)(src+3*stride))[0]= dc* 0x01010101; 54 ((uint32_t*)(src+3*stride))[0]= dc* 0x01010101;
55 } 55 }
56 56
57 static void pred4x4_left_dc_c(uint8_t *src, uint8_t *topright, int stride){ 57 static void pred4x4_left_dc_c(uint8_t *src, const uint8_t *topright, int stride){
58 const int dc= ( src[-1+0*stride] + src[-1+1*stride] + src[-1+2*stride] + src[-1+3*stride] + 2) >>2; 58 const int dc= ( src[-1+0*stride] + src[-1+1*stride] + src[-1+2*stride] + src[-1+3*stride] + 2) >>2;
59 59
60 ((uint32_t*)(src+0*stride))[0]= 60 ((uint32_t*)(src+0*stride))[0]=
61 ((uint32_t*)(src+1*stride))[0]= 61 ((uint32_t*)(src+1*stride))[0]=
62 ((uint32_t*)(src+2*stride))[0]= 62 ((uint32_t*)(src+2*stride))[0]=
63 ((uint32_t*)(src+3*stride))[0]= dc* 0x01010101; 63 ((uint32_t*)(src+3*stride))[0]= dc* 0x01010101;
64 } 64 }
65 65
66 static void pred4x4_top_dc_c(uint8_t *src, uint8_t *topright, int stride){ 66 static void pred4x4_top_dc_c(uint8_t *src, const uint8_t *topright, int stride){
67 const int dc= ( src[-stride] + src[1-stride] + src[2-stride] + src[3-stride] + 2) >>2; 67 const int dc= ( src[-stride] + src[1-stride] + src[2-stride] + src[3-stride] + 2) >>2;
68 68
69 ((uint32_t*)(src+0*stride))[0]= 69 ((uint32_t*)(src+0*stride))[0]=
70 ((uint32_t*)(src+1*stride))[0]= 70 ((uint32_t*)(src+1*stride))[0]=
71 ((uint32_t*)(src+2*stride))[0]= 71 ((uint32_t*)(src+2*stride))[0]=
72 ((uint32_t*)(src+3*stride))[0]= dc* 0x01010101; 72 ((uint32_t*)(src+3*stride))[0]= dc* 0x01010101;
73 } 73 }
74 74
75 static void pred4x4_128_dc_c(uint8_t *src, uint8_t *topright, int stride){ 75 static void pred4x4_128_dc_c(uint8_t *src, const uint8_t *topright, int stride){
76 ((uint32_t*)(src+0*stride))[0]= 76 ((uint32_t*)(src+0*stride))[0]=
77 ((uint32_t*)(src+1*stride))[0]= 77 ((uint32_t*)(src+1*stride))[0]=
78 ((uint32_t*)(src+2*stride))[0]= 78 ((uint32_t*)(src+2*stride))[0]=
79 ((uint32_t*)(src+3*stride))[0]= 128U*0x01010101U; 79 ((uint32_t*)(src+3*stride))[0]= 128U*0x01010101U;
80 } 80 }
102 const int av_unused t0= src[ 0-1*stride];\ 102 const int av_unused t0= src[ 0-1*stride];\
103 const int av_unused t1= src[ 1-1*stride];\ 103 const int av_unused t1= src[ 1-1*stride];\
104 const int av_unused t2= src[ 2-1*stride];\ 104 const int av_unused t2= src[ 2-1*stride];\
105 const int av_unused t3= src[ 3-1*stride];\ 105 const int av_unused t3= src[ 3-1*stride];\
106 106
107 static void pred4x4_down_right_c(uint8_t *src, uint8_t *topright, int stride){ 107 static void pred4x4_down_right_c(uint8_t *src, const uint8_t *topright, int stride){
108 const int lt= src[-1-1*stride]; 108 const int lt= src[-1-1*stride];
109 LOAD_TOP_EDGE 109 LOAD_TOP_EDGE
110 LOAD_LEFT_EDGE 110 LOAD_LEFT_EDGE
111 111
112 src[0+3*stride]=(l3 + 2*l2 + l1 + 2)>>2; 112 src[0+3*stride]=(l3 + 2*l2 + l1 + 2)>>2;
125 src[2+0*stride]= 125 src[2+0*stride]=
126 src[3+1*stride]=(t0 + 2*t1 + t2 + 2)>>2; 126 src[3+1*stride]=(t0 + 2*t1 + t2 + 2)>>2;
127 src[3+0*stride]=(t1 + 2*t2 + t3 + 2)>>2; 127 src[3+0*stride]=(t1 + 2*t2 + t3 + 2)>>2;
128 } 128 }
129 129
130 static void pred4x4_down_left_c(uint8_t *src, uint8_t *topright, int stride){ 130 static void pred4x4_down_left_c(uint8_t *src, const uint8_t *topright, int stride){
131 LOAD_TOP_EDGE 131 LOAD_TOP_EDGE
132 LOAD_TOP_RIGHT_EDGE 132 LOAD_TOP_RIGHT_EDGE
133 // LOAD_LEFT_EDGE 133 // LOAD_LEFT_EDGE
134 134
135 src[0+0*stride]=(t0 + t2 + 2*t1 + 2)>>2; 135 src[0+0*stride]=(t0 + t2 + 2*t1 + 2)>>2;
148 src[3+2*stride]= 148 src[3+2*stride]=
149 src[2+3*stride]=(t5 + t7 + 2*t6 + 2)>>2; 149 src[2+3*stride]=(t5 + t7 + 2*t6 + 2)>>2;
150 src[3+3*stride]=(t6 + 3*t7 + 2)>>2; 150 src[3+3*stride]=(t6 + 3*t7 + 2)>>2;
151 } 151 }
152 152
153 static void pred4x4_down_left_svq3_c(uint8_t *src, uint8_t *topright, int stride){ 153 static void pred4x4_down_left_svq3_c(uint8_t *src, const uint8_t *topright, int stride){
154 LOAD_TOP_EDGE 154 LOAD_TOP_EDGE
155 LOAD_LEFT_EDGE 155 LOAD_LEFT_EDGE
156 const av_unused int unu0= t0; 156 const av_unused int unu0= t0;
157 const av_unused int unu1= l0; 157 const av_unused int unu1= l0;
158 158
172 src[3+2*stride]= 172 src[3+2*stride]=
173 src[2+3*stride]= 173 src[2+3*stride]=
174 src[3+3*stride]=(l3 + t3)>>1; 174 src[3+3*stride]=(l3 + t3)>>1;
175 } 175 }
176 176
177 static void pred4x4_down_left_rv40_c(uint8_t *src, uint8_t *topright, int stride){ 177 static void pred4x4_down_left_rv40_c(uint8_t *src, const uint8_t *topright, int stride){
178 LOAD_TOP_EDGE 178 LOAD_TOP_EDGE
179 LOAD_TOP_RIGHT_EDGE 179 LOAD_TOP_RIGHT_EDGE
180 LOAD_LEFT_EDGE 180 LOAD_LEFT_EDGE
181 LOAD_DOWN_LEFT_EDGE 181 LOAD_DOWN_LEFT_EDGE
182 182
196 src[3+2*stride]= 196 src[3+2*stride]=
197 src[2+3*stride]=(t5 + t7 + 2*t6 + 2 + l5 + l7 + 2*l6 + 2)>>3; 197 src[2+3*stride]=(t5 + t7 + 2*t6 + 2 + l5 + l7 + 2*l6 + 2)>>3;
198 src[3+3*stride]=(t6 + t7 + 1 + l6 + l7 + 1)>>2; 198 src[3+3*stride]=(t6 + t7 + 1 + l6 + l7 + 1)>>2;
199 } 199 }
200 200
201 static void pred4x4_down_left_rv40_nodown_c(uint8_t *src, uint8_t *topright, int stride){ 201 static void pred4x4_down_left_rv40_nodown_c(uint8_t *src, const uint8_t *topright, int stride){
202 LOAD_TOP_EDGE 202 LOAD_TOP_EDGE
203 LOAD_TOP_RIGHT_EDGE 203 LOAD_TOP_RIGHT_EDGE
204 LOAD_LEFT_EDGE 204 LOAD_LEFT_EDGE
205 205
206 src[0+0*stride]=(t0 + t2 + 2*t1 + 2 + l0 + l2 + 2*l1 + 2)>>3; 206 src[0+0*stride]=(t0 + t2 + 2*t1 + 2 + l0 + l2 + 2*l1 + 2)>>3;
219 src[3+2*stride]= 219 src[3+2*stride]=
220 src[2+3*stride]=(t5 + t7 + 2*t6 + 2 + l3*4 + 2)>>3; 220 src[2+3*stride]=(t5 + t7 + 2*t6 + 2 + l3*4 + 2)>>3;
221 src[3+3*stride]=(t6 + t7 + 1 + 2*l3 + 1)>>2; 221 src[3+3*stride]=(t6 + t7 + 1 + 2*l3 + 1)>>2;
222 } 222 }
223 223
224 static void pred4x4_vertical_right_c(uint8_t *src, uint8_t *topright, int stride){ 224 static void pred4x4_vertical_right_c(uint8_t *src, const uint8_t *topright, int stride){
225 const int lt= src[-1-1*stride]; 225 const int lt= src[-1-1*stride];
226 LOAD_TOP_EDGE 226 LOAD_TOP_EDGE
227 LOAD_LEFT_EDGE 227 LOAD_LEFT_EDGE
228 228
229 src[0+0*stride]= 229 src[0+0*stride]=
242 src[3+1*stride]=(t1 + 2*t2 + t3 + 2)>>2; 242 src[3+1*stride]=(t1 + 2*t2 + t3 + 2)>>2;
243 src[0+2*stride]=(lt + 2*l0 + l1 + 2)>>2; 243 src[0+2*stride]=(lt + 2*l0 + l1 + 2)>>2;
244 src[0+3*stride]=(l0 + 2*l1 + l2 + 2)>>2; 244 src[0+3*stride]=(l0 + 2*l1 + l2 + 2)>>2;
245 } 245 }
246 246
247 static void pred4x4_vertical_left_c(uint8_t *src, uint8_t *topright, int stride){ 247 static void pred4x4_vertical_left_c(uint8_t *src, const uint8_t *topright, int stride){
248 LOAD_TOP_EDGE 248 LOAD_TOP_EDGE
249 LOAD_TOP_RIGHT_EDGE 249 LOAD_TOP_RIGHT_EDGE
250 250
251 src[0+0*stride]=(t0 + t1 + 1)>>1; 251 src[0+0*stride]=(t0 + t1 + 1)>>1;
252 src[1+0*stride]= 252 src[1+0*stride]=
264 src[3+1*stride]= 264 src[3+1*stride]=
265 src[2+3*stride]=(t3 + 2*t4 + t5 + 2)>>2; 265 src[2+3*stride]=(t3 + 2*t4 + t5 + 2)>>2;
266 src[3+3*stride]=(t4 + 2*t5 + t6 + 2)>>2; 266 src[3+3*stride]=(t4 + 2*t5 + t6 + 2)>>2;
267 } 267 }
268 268
269 static void pred4x4_vertical_left_rv40(uint8_t *src, uint8_t *topright, int stride, 269 static void pred4x4_vertical_left_rv40(uint8_t *src, const uint8_t *topright, int stride,
270 const int l0, const int l1, const int l2, const int l3, const int l4){ 270 const int l0, const int l1, const int l2, const int l3, const int l4){
271 LOAD_TOP_EDGE 271 LOAD_TOP_EDGE
272 LOAD_TOP_RIGHT_EDGE 272 LOAD_TOP_RIGHT_EDGE
273 273
274 src[0+0*stride]=(2*t0 + 2*t1 + l1 + 2*l2 + l3 + 4)>>3; 274 src[0+0*stride]=(2*t0 + 2*t1 + l1 + 2*l2 + l3 + 4)>>3;
287 src[3+1*stride]= 287 src[3+1*stride]=
288 src[2+3*stride]=(t3 + 2*t4 + t5 + 2)>>2; 288 src[2+3*stride]=(t3 + 2*t4 + t5 + 2)>>2;
289 src[3+3*stride]=(t4 + 2*t5 + t6 + 2)>>2; 289 src[3+3*stride]=(t4 + 2*t5 + t6 + 2)>>2;
290 } 290 }
291 291
292 static void pred4x4_vertical_left_rv40_c(uint8_t *src, uint8_t *topright, int stride){ 292 static void pred4x4_vertical_left_rv40_c(uint8_t *src, const uint8_t *topright, int stride){
293 LOAD_LEFT_EDGE 293 LOAD_LEFT_EDGE
294 LOAD_DOWN_LEFT_EDGE 294 LOAD_DOWN_LEFT_EDGE
295 295
296 pred4x4_vertical_left_rv40(src, topright, stride, l0, l1, l2, l3, l4); 296 pred4x4_vertical_left_rv40(src, topright, stride, l0, l1, l2, l3, l4);
297 } 297 }
298 298
299 static void pred4x4_vertical_left_rv40_nodown_c(uint8_t *src, uint8_t *topright, int stride){ 299 static void pred4x4_vertical_left_rv40_nodown_c(uint8_t *src, const uint8_t *topright, int stride){
300 LOAD_LEFT_EDGE 300 LOAD_LEFT_EDGE
301 301
302 pred4x4_vertical_left_rv40(src, topright, stride, l0, l1, l2, l3, l3); 302 pred4x4_vertical_left_rv40(src, topright, stride, l0, l1, l2, l3, l3);
303 } 303 }
304 304
305 static void pred4x4_horizontal_up_c(uint8_t *src, uint8_t *topright, int stride){ 305 static void pred4x4_horizontal_up_c(uint8_t *src, const uint8_t *topright, int stride){
306 LOAD_LEFT_EDGE 306 LOAD_LEFT_EDGE
307 307
308 src[0+0*stride]=(l0 + l1 + 1)>>1; 308 src[0+0*stride]=(l0 + l1 + 1)>>1;
309 src[1+0*stride]=(l0 + 2*l1 + l2 + 2)>>2; 309 src[1+0*stride]=(l0 + 2*l1 + l2 + 2)>>2;
310 src[2+0*stride]= 310 src[2+0*stride]=
321 src[2+2*stride]= 321 src[2+2*stride]=
322 src[2+3*stride]= 322 src[2+3*stride]=
323 src[3+3*stride]=l3; 323 src[3+3*stride]=l3;
324 } 324 }
325 325
326 static void pred4x4_horizontal_up_rv40_c(uint8_t *src, uint8_t *topright, int stride){ 326 static void pred4x4_horizontal_up_rv40_c(uint8_t *src, const uint8_t *topright, int stride){
327 LOAD_LEFT_EDGE 327 LOAD_LEFT_EDGE
328 LOAD_DOWN_LEFT_EDGE 328 LOAD_DOWN_LEFT_EDGE
329 LOAD_TOP_EDGE 329 LOAD_TOP_EDGE
330 LOAD_TOP_RIGHT_EDGE 330 LOAD_TOP_RIGHT_EDGE
331 331
345 src[2+2*stride]=(t6 + t7 + l3 + l4 + 2)>>2; 345 src[2+2*stride]=(t6 + t7 + l3 + l4 + 2)>>2;
346 src[2+3*stride]=(l4 + l5 + 1)>>1; 346 src[2+3*stride]=(l4 + l5 + 1)>>1;
347 src[3+3*stride]=(l4 + 2*l5 + l6 + 2)>>2; 347 src[3+3*stride]=(l4 + 2*l5 + l6 + 2)>>2;
348 } 348 }
349 349
350 static void pred4x4_horizontal_up_rv40_nodown_c(uint8_t *src, uint8_t *topright, int stride){ 350 static void pred4x4_horizontal_up_rv40_nodown_c(uint8_t *src, const uint8_t *topright, int stride){
351 LOAD_LEFT_EDGE 351 LOAD_LEFT_EDGE
352 LOAD_TOP_EDGE 352 LOAD_TOP_EDGE
353 LOAD_TOP_RIGHT_EDGE 353 LOAD_TOP_RIGHT_EDGE
354 354
355 src[0+0*stride]=(t1 + 2*t2 + t3 + 2*l0 + 2*l1 + 4)>>3; 355 src[0+0*stride]=(t1 + 2*t2 + t3 + 2*l0 + 2*l1 + 4)>>3;
368 src[2+2*stride]=(t6 + t7 + 2*l3 + 2)>>2; 368 src[2+2*stride]=(t6 + t7 + 2*l3 + 2)>>2;
369 src[2+3*stride]= 369 src[2+3*stride]=
370 src[3+3*stride]=l3; 370 src[3+3*stride]=l3;
371 } 371 }
372 372
373 static void pred4x4_horizontal_down_c(uint8_t *src, uint8_t *topright, int stride){ 373 static void pred4x4_horizontal_down_c(uint8_t *src, const uint8_t *topright, int stride){
374 const int lt= src[-1-1*stride]; 374 const int lt= src[-1-1*stride];
375 LOAD_TOP_EDGE 375 LOAD_TOP_EDGE
376 LOAD_LEFT_EDGE 376 LOAD_LEFT_EDGE
377 377
378 src[0+0*stride]= 378 src[0+0*stride]=