[svn] / branches / dev-api-3 / xvidcore / src / motion / motion_comp.c Repository:
ViewVC logotype

Annotation of /branches/dev-api-3/xvidcore/src/motion/motion_comp.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 702 - (view) (download)

1 : Isibaar 616 // 30.10.2002 corrected qpel chroma rounding
2 : Isibaar 581 // 04.10.2002 added qpel support to MBMotionCompensation
3 : edgomez 195 // 01.05.2002 updated MBMotionCompensationBVOP
4 :     // 14.04.2002 bframe compensation
5 : suxen_drol 118
6 : Isibaar 3 #include "../encoder.h"
7 :     #include "../utils/mbfunctions.h"
8 :     #include "../image/interpolate8x8.h"
9 : suxen_drol 701 #include "../image/reduced.h"
10 : Isibaar 3 #include "../utils/timer.h"
11 : suxen_drol 118 #include "motion.h"
12 : Isibaar 3
13 :     #define ABS(X) (((X)>0)?(X):-(X))
14 :     #define SIGN(X) (((X)>0)?1:-1)
15 :    
16 : suxen_drol 701
17 : edgomez 195 static __inline void
18 : Isibaar 588 compensate16x16_interpolate(int16_t * const dct_codes,
19 :     uint8_t * const cur,
20 :     const uint8_t * const ref,
21 :     const uint8_t * const refh,
22 : suxen_drol 701 uint8_t * const refv,
23 : Isibaar 588 const uint8_t * const refhv,
24 : suxen_drol 701 uint32_t x,
25 :     uint32_t y,
26 : Isibaar 588 const int32_t dx,
27 :     const int32_t dy,
28 :     const uint32_t stride,
29 :     const uint32_t quarterpel,
30 : suxen_drol 701 const int reduced_resolution,
31 :     const uint32_t rounding)
32 : Isibaar 588 {
33 : suxen_drol 701
34 :     if (reduced_resolution)
35 :     {
36 : suxen_drol 702 const uint8_t * reference;
37 :     x*=2; y*=2;
38 : Isibaar 588
39 : suxen_drol 702 reference = get_ref(ref, refh, refv, refhv, x, y, 1, dx, dy, stride);
40 :    
41 :     filter_18x18_to_8x8(dct_codes, cur+y*stride + x, stride);
42 :     filter_diff_18x18_to_8x8(dct_codes, reference, stride);
43 : Isibaar 588
44 : suxen_drol 702 filter_18x18_to_8x8(dct_codes+64, cur+y*stride + x + 16, stride);
45 :     filter_diff_18x18_to_8x8(dct_codes+64, reference + 16, stride);
46 : Isibaar 588
47 : suxen_drol 702 filter_18x18_to_8x8(dct_codes+128, cur+(y+16)*stride + x, stride);
48 :     filter_diff_18x18_to_8x8(dct_codes+128, reference + 16*stride, stride);
49 : suxen_drol 701
50 : suxen_drol 702 filter_18x18_to_8x8(dct_codes+192, cur+(y+16)*stride + x + 16, stride);
51 :     filter_diff_18x18_to_8x8(dct_codes+192, reference + 16*stride + 16, stride);
52 : suxen_drol 701
53 : suxen_drol 702 transfer32x32_copy(cur + y*stride + x, reference, stride);
54 : suxen_drol 701
55 :     }else{
56 :     if(quarterpel) {
57 :     interpolate16x16_quarterpel((uint8_t *) refv, (uint8_t *) ref, (uint8_t *) refh,
58 :     (uint8_t *) refh + 64, (uint8_t *) refhv, x, y, dx, dy, stride, rounding);
59 :    
60 :     transfer_8to16sub(dct_codes, cur + y*stride + x,
61 :     refv + y*stride + x, stride);
62 :     transfer_8to16sub(dct_codes+64, cur + y*stride + x + 8,
63 :     refv + y*stride + x + 8, stride);
64 :     transfer_8to16sub(dct_codes+128, cur + y*stride + x + 8*stride,
65 :     refv + y*stride + x + 8*stride, stride);
66 :     transfer_8to16sub(dct_codes+192, cur + y*stride + x + 8*stride + 8,
67 :     refv + y*stride + x + 8*stride+8, stride);
68 :    
69 :     }
70 :     else
71 :     {
72 : suxen_drol 702 const uint8_t * reference = get_ref(ref, refh, refv, refhv, x, y, 1, dx, dy, stride);
73 : suxen_drol 701
74 :     transfer_8to16sub(dct_codes, cur + y * stride + x,
75 :     reference, stride);
76 :     transfer_8to16sub(dct_codes+64, cur + y * stride + x + 8,
77 :     reference + 8, stride);
78 :     transfer_8to16sub(dct_codes+128, cur + y * stride + x + 8*stride,
79 :     reference + 8*stride, stride);
80 :     transfer_8to16sub(dct_codes+192, cur + y * stride + x + 8*stride+8,
81 :     reference + 8*stride + 8, stride);
82 :     }
83 : Isibaar 588 }
84 :     }
85 :    
86 :     static __inline void
87 : Isibaar 581 compensate8x8_interpolate(int16_t * const dct_codes,
88 :     uint8_t * const cur,
89 :     const uint8_t * const ref,
90 :     const uint8_t * const refh,
91 :     const uint8_t * const refv,
92 :     const uint8_t * const refhv,
93 : suxen_drol 702 uint32_t x,
94 :     uint32_t y,
95 : Isibaar 581 const int32_t dx,
96 :     const int32_t dy,
97 :     const uint32_t stride,
98 :     const uint32_t quarterpel,
99 : suxen_drol 701 const int reduced_resolution,
100 : Isibaar 581 const uint32_t rounding)
101 : Isibaar 3 {
102 : suxen_drol 701 if (reduced_resolution)
103 : edgomez 195 {
104 : suxen_drol 702 const uint8_t * reference;
105 :     x*=2; y*=2;
106 :    
107 :     reference = get_ref(ref, refh, refv, refhv, x, y, 1, dx, dy, stride);
108 :    
109 :     filter_18x18_to_8x8(dct_codes, cur+y*stride + x, stride);
110 :     filter_diff_18x18_to_8x8(dct_codes, reference, stride);
111 :    
112 :     transfer16x16_copy(cur + y*stride + x, reference, stride);
113 :    
114 : suxen_drol 701 } else {
115 :    
116 :     if(quarterpel) {
117 :     interpolate8x8_quarterpel((uint8_t *) refv, (uint8_t *) ref, (uint8_t *) refh,
118 :     (uint8_t *) refh + 64, (uint8_t *) refhv, x, y, dx, dy, stride, rounding);
119 : Isibaar 581
120 : suxen_drol 701 transfer_8to16sub(dct_codes, cur + y*stride + x,
121 :     refv + y*stride + x, stride);
122 :     }
123 :     else
124 : Isibaar 581 {
125 : suxen_drol 702 const uint8_t * reference = get_ref(ref, refh, refv, refhv, x, y, 1, dx, dy, stride);
126 : suxen_drol 701
127 :     transfer_8to16sub(dct_codes, cur + y * stride + x,
128 :     reference, stride);
129 : Isibaar 581 }
130 : edgomez 195 }
131 : Isibaar 3 }
132 :    
133 : edgomez 195 void
134 :     MBMotionCompensation(MACROBLOCK * const mb,
135 :     const uint32_t i,
136 :     const uint32_t j,
137 :     const IMAGE * const ref,
138 :     const IMAGE * const refh,
139 :     const IMAGE * const refv,
140 :     const IMAGE * const refhv,
141 :     IMAGE * const cur,
142 :     int16_t * dct_codes,
143 :     const uint32_t width,
144 :     const uint32_t height,
145 :     const uint32_t edged_width,
146 : Isibaar 581 const uint32_t quarterpel,
147 : suxen_drol 701 const int reduced_resolution,
148 : edgomez 195 const uint32_t rounding)
149 : Isibaar 3 {
150 : suxen_drol 701
151 : chl 619 if (mb->mode == MODE_NOT_CODED || mb->mode == MODE_INTER || mb->mode == MODE_INTER_Q) {
152 : Isibaar 3
153 : chl 619 int32_t dx = (quarterpel ? mb->qmvs[0].x : mb->mvs[0].x);
154 :     int32_t dy = (quarterpel ? mb->qmvs[0].y : mb->mvs[0].y);
155 : chl 530
156 : chl 619 if ( (mb->mode == MODE_NOT_CODED) && (dx==0) && (dy==0) ) { /* quick copy */
157 : suxen_drol 701 transfer16x16_copy(cur->y + 16 * (i + j * edged_width),
158 :     ref->y + 16 * (i + j * edged_width),
159 :     edged_width);
160 : chl 619
161 :     transfer8x8_copy(cur->u + 8 * (i + j * edged_width/2),
162 :     ref->u + 8 * (i + j * edged_width/2),
163 :     edged_width / 2);
164 :     transfer8x8_copy(cur->v + 8 * (i + j * edged_width/2),
165 :     ref->v + 8 * (i + j * edged_width/2),
166 :     edged_width / 2);
167 :     return;
168 : Isibaar 581 }
169 : chl 619 /* quick MODE_NOT_CODED for GMC with MV!=(0,0) is still needed */
170 : Isibaar 581
171 : suxen_drol 702 if (reduced_resolution)
172 :     {
173 :     dx = RRV_MV_SCALEUP(dx);
174 :     dy = RRV_MV_SCALEUP(dy);
175 :     }
176 :    
177 : Isibaar 588 compensate16x16_interpolate(&dct_codes[0 * 64], cur->y, ref->y, refh->y,
178 : suxen_drol 701 refv->y, refhv->y, 16 * i, 16 * j, dx, dy,
179 :     edged_width, quarterpel, reduced_resolution, rounding);
180 : Isibaar 3
181 : Isibaar 581 if (quarterpel)
182 :     {
183 : Isibaar 617 dx /= 2;
184 :     dy /= 2;
185 : Isibaar 581 }
186 :    
187 : Isibaar 617 dx = (dx >> 1) + roundtab_79[dx & 0x3];
188 :     dy = (dy >> 1) + roundtab_79[dy & 0x3];
189 :    
190 : suxen_drol 702 /* uv-block-based compensation
191 :     XXX: rrv doesnt work with 16x16 block-based intepolation.
192 :     we need to use 18x18-block interpolation */
193 : suxen_drol 701 if (reduced_resolution)
194 :     {
195 : suxen_drol 702 const stride = edged_width/2;
196 :     uint8_t * current, * reference;
197 :    
198 :     current = cur->u + 16*j*stride + 16*i;
199 :     reference = refv->u + 16*j*stride + 16*i;
200 :     interpolate16x16_switch(refv->u, ref->u, 16*i, 16*j, dx, dy, stride, rounding);
201 :     filter_18x18_to_8x8(dct_codes + 4*64, current, stride);
202 :     filter_diff_18x18_to_8x8(dct_codes + 4*64, reference, stride);
203 :     transfer16x16_copy(current, reference, stride);
204 :    
205 :     current = cur->v + 16*j*stride + 16*i;
206 :     reference = refv->v + 16*j*stride + 16*i;
207 :     interpolate16x16_switch(refv->v, ref->v, 16*i, 16*j, dx, dy, stride, rounding);
208 :     filter_18x18_to_8x8(dct_codes + 5*64, current, stride);
209 :     filter_diff_18x18_to_8x8(dct_codes + 5*64, reference, stride);
210 :     transfer16x16_copy(current, reference, stride);
211 : suxen_drol 701 }else{
212 :     transfer_8to16sub(&dct_codes[4 * 64],
213 :     cur->u + 8 * j * edged_width / 2 + 8 * i,
214 :     interpolate8x8_switch2(refv->u, ref->u, 8 * i, 8 * j,
215 :     dx, dy, edged_width / 2, rounding),
216 :     edged_width / 2);
217 : Isibaar 3
218 : suxen_drol 701 transfer_8to16sub(&dct_codes[5 * 64],
219 :     cur->v + 8 * j * edged_width / 2 + 8 * i,
220 :     interpolate8x8_switch2(refv->u, ref->v, 8 * i, 8 * j,
221 :     dx, dy, edged_width / 2, rounding),
222 :     edged_width / 2);
223 :     }
224 : suxen_drol 449
225 : chl 530 } else { // mode == MODE_INTER4V
226 : suxen_drol 702 int i;
227 : Isibaar 3 int32_t sum, dx, dy;
228 : suxen_drol 702 VECTOR mvs[4];
229 : Isibaar 3
230 : Isibaar 581 if(quarterpel)
231 : suxen_drol 702 for (i = 0; i < 4; i++) mvs[i] = mb->qmvs[i];
232 : Isibaar 581 else
233 : suxen_drol 702 for (i = 0; i < 4; i++) mvs[i] = mb->mvs[i];
234 : Isibaar 581
235 : suxen_drol 701 if (reduced_resolution)
236 :     {
237 : suxen_drol 702 for (i = 0; i < 4; i++)
238 :     {
239 :     mvs[i].x = RRV_MV_SCALEUP(mvs[i].x);
240 :     mvs[i].y = RRV_MV_SCALEUP(mvs[i].y);
241 :     }
242 : suxen_drol 701 }
243 : Isibaar 3
244 : suxen_drol 702 compensate8x8_interpolate(&dct_codes[0 * 64], cur->y, ref->y, refh->y,
245 :     refv->y, refhv->y, 16 * i, 16 * j, mvs[0].x,
246 :     mvs[0].y, edged_width, quarterpel, reduced_resolution, rounding);
247 :     compensate8x8_interpolate(&dct_codes[1 * 64], cur->y, ref->y, refh->y,
248 :     refv->y, refhv->y, 16 * i + 8, 16 * j,
249 :     mvs[1].x, mvs[1].y, edged_width, quarterpel, reduced_resolution, rounding);
250 :     compensate8x8_interpolate(&dct_codes[2 * 64], cur->y, ref->y, refh->y,
251 :     refv->y, refhv->y, 16 * i, 16 * j + 8,
252 :     mvs[2].x, mvs[2].y, edged_width, quarterpel, reduced_resolution, rounding);
253 :     compensate8x8_interpolate(&dct_codes[3 * 64], cur->y, ref->y, refh->y,
254 :     refv->y, refhv->y, 16 * i + 8, 16 * j + 8,
255 :     mvs[3].x, mvs[3].y, edged_width, quarterpel, reduced_resolution, rounding);
256 :    
257 : Isibaar 581 if(quarterpel)
258 : Isibaar 616 sum = (mvs[0].x / 2) + (mvs[1].x / 2) + (mvs[2].x / 2) + (mvs[3].x / 2);
259 :     else
260 :     sum = mvs[0].x + mvs[1].x + mvs[2].x + mvs[3].x;
261 : Isibaar 581
262 : Isibaar 616 dx = (sum >> 3) + roundtab_76[sum & 0xf];
263 : Isibaar 3
264 : Isibaar 581 if(quarterpel)
265 : Isibaar 616 sum = (mvs[0].y / 2) + (mvs[1].y / 2) + (mvs[2].y / 2) + (mvs[3].y / 2);
266 :     else
267 :     sum = mvs[0].y + mvs[1].y + mvs[2].y + mvs[3].y;
268 : Isibaar 581
269 : Isibaar 616 dy = (sum >> 3) + roundtab_76[sum & 0xf];
270 : Isibaar 3
271 : suxen_drol 702
272 :     /* uv-block-based compensation
273 :     XXX: rrv doesnt work with 16x16 block-based intepolation.
274 :     we need to use 18x18-block interpolation */
275 : suxen_drol 701 if (reduced_resolution)
276 :     {
277 : suxen_drol 702 const stride = edged_width/2;
278 :     uint8_t * current, * reference;
279 :    
280 :     current = cur->u + 16*j*stride + 16*i;
281 :     reference = refv->u + 16*j*stride + 16*i;
282 :     interpolate16x16_switch(refv->u, ref->u, 16*i, 16*j, dx, dy, stride, rounding);
283 :     filter_18x18_to_8x8(dct_codes + 4*64, current, stride);
284 :     filter_diff_18x18_to_8x8(dct_codes + 4*64, reference, stride);
285 :     transfer16x16_copy(current, reference, stride);
286 :    
287 :     current = cur->v + 16*j*stride + 16*i;
288 :     reference = refv->v + 16*j*stride + 16*i;
289 :     interpolate16x16_switch(refv->v, ref->v, 16*i, 16*j, dx, dy, stride, rounding);
290 :     filter_18x18_to_8x8(dct_codes + 5*64, current, stride);
291 :     filter_diff_18x18_to_8x8(dct_codes + 5*64, reference, stride);
292 :     transfer16x16_copy(current, reference, stride);
293 :    
294 : suxen_drol 701 }else{
295 :     transfer_8to16sub(&dct_codes[4 * 64],
296 :     cur->u + 8 * j * edged_width / 2 + 8 * i,
297 :     interpolate8x8_switch2(refv->u, ref->u, 8 * i, 8 * j,
298 :     dx, dy, edged_width / 2, rounding),
299 :     edged_width / 2);
300 : Isibaar 3
301 : suxen_drol 701 transfer_8to16sub(&dct_codes[5 * 64],
302 :     cur->v + 8 * j * edged_width / 2 + 8 * i,
303 :     interpolate8x8_switch2(refv->u, ref->v, 8 * i, 8 * j,
304 :     dx, dy, edged_width / 2, rounding),
305 :     edged_width / 2);
306 :     }
307 : Isibaar 3 }
308 :     }
309 : suxen_drol 118
310 :    
311 : edgomez 195 void
312 :     MBMotionCompensationBVOP(MBParam * pParam,
313 :     MACROBLOCK * const mb,
314 :     const uint32_t i,
315 :     const uint32_t j,
316 :     IMAGE * const cur,
317 :     const IMAGE * const f_ref,
318 :     const IMAGE * const f_refh,
319 :     const IMAGE * const f_refv,
320 :     const IMAGE * const f_refhv,
321 :     const IMAGE * const b_ref,
322 :     const IMAGE * const b_refh,
323 :     const IMAGE * const b_refv,
324 :     const IMAGE * const b_refhv,
325 :     int16_t * dct_codes)
326 : suxen_drol 118 {
327 :     static const uint32_t roundtab[16] =
328 :     { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2 };
329 :    
330 :     const int32_t edged_width = pParam->edged_width;
331 :     int32_t dx, dy;
332 :     int32_t b_dx, b_dy;
333 : chl 374 int k,sum;
334 : suxen_drol 118 int x = i;
335 :     int y = j;
336 : syskin 658 uint32_t quarterpel = pParam->m_quarterpel;
337 : suxen_drol 118
338 : edgomez 195 switch (mb->mode) {
339 :     case MODE_FORWARD:
340 : suxen_drol 118
341 : syskin 658 if (quarterpel) {
342 :     dx = mb->qmvs[0].x;
343 :     dy = mb->qmvs[0].y;
344 :     } else {
345 :     dx = mb->mvs[0].x;
346 :     dy = mb->mvs[0].y;
347 :     }
348 : suxen_drol 118
349 : syskin 658 compensate16x16_interpolate(&dct_codes[0 * 64], cur->y, f_ref->y, f_refh->y,
350 :     f_refv->y, f_refhv->y, 16 * i, 16 * j, dx,
351 : suxen_drol 701 dy, edged_width, quarterpel, 0 /*reduced_resolution*/, 0);
352 : suxen_drol 118
353 : syskin 658 if (quarterpel) {
354 :     dx /= 2;
355 :     dy /= 2;
356 :     }
357 : suxen_drol 118
358 : syskin 658 dx = (dx >> 1) + roundtab_79[dx & 0x3];
359 :     dy = (dy >> 1) + roundtab_79[dy & 0x3];
360 : suxen_drol 118
361 : chl 530 /* uv-block-based compensation */
362 : suxen_drol 449 transfer_8to16sub(&dct_codes[4 * 64],
363 : chl 530 cur->u + 8 * j * edged_width / 2 + 8 * i,
364 :     interpolate8x8_switch2(f_refv->u, f_ref->u, 8 * i, 8 * j,
365 :     dx, dy, edged_width / 2, 0),
366 :    
367 : suxen_drol 449 edged_width / 2);
368 :    
369 :     transfer_8to16sub(&dct_codes[5 * 64],
370 : chl 530 cur->v + 8 * j * edged_width / 2 + 8 * i,
371 :     interpolate8x8_switch2(f_refv->u, f_ref->v, 8 * i, 8 * j,
372 :     dx, dy, edged_width / 2, 0),
373 :    
374 : suxen_drol 449 edged_width / 2);
375 :    
376 : suxen_drol 118 break;
377 :    
378 : edgomez 195 case MODE_BACKWARD:
379 : syskin 658 if (quarterpel) {
380 :     b_dx = mb->b_qmvs[0].x;
381 :     b_dy = mb->b_qmvs[0].y;
382 :     } else {
383 :     b_dx = mb->b_mvs[0].x;
384 :     b_dy = mb->b_mvs[0].y;
385 :     }
386 : suxen_drol 118
387 : syskin 658 compensate16x16_interpolate(&dct_codes[0 * 64], cur->y, b_ref->y, b_refh->y,
388 :     b_refv->y, b_refhv->y, 16 * i, 16 * j, b_dx,
389 : suxen_drol 701 b_dy, edged_width, quarterpel, 0 /*reduced_resolution*/, 0);
390 : suxen_drol 118
391 : syskin 658 if (quarterpel) {
392 :     b_dx /= 2;
393 :     b_dy /= 2;
394 :     }
395 : suxen_drol 118
396 : syskin 658 b_dx = (b_dx >> 1) + roundtab_79[b_dx & 0x3];
397 :     b_dy = (b_dy >> 1) + roundtab_79[b_dy & 0x3];
398 : suxen_drol 118
399 :    
400 : chl 530 /* uv-block-based compensation */
401 : suxen_drol 449 transfer_8to16sub(&dct_codes[4 * 64],
402 : chl 530 cur->u + 8 * j * edged_width / 2 + 8 * i,
403 :     interpolate8x8_switch2(f_refv->u, b_ref->u, 8 * i, 8 * j,
404 :     b_dx, b_dy, edged_width / 2, 0),
405 : suxen_drol 449
406 : chl 530 edged_width / 2);
407 :    
408 : suxen_drol 449 transfer_8to16sub(&dct_codes[5 * 64],
409 : chl 530 cur->v + 8 * j * edged_width / 2 + 8 * i,
410 :     interpolate8x8_switch2(f_refv->u, b_ref->v, 8 * i, 8 * j,
411 :     b_dx, b_dy, edged_width / 2, 0),
412 : suxen_drol 449
413 : chl 530 edged_width / 2);
414 :    
415 : suxen_drol 118 break;
416 :    
417 : chl 374 case MODE_INTERPOLATE: /* _could_ use DIRECT, but would be overkill (no 4MV there) */
418 : chl 530 case MODE_DIRECT_NO4V:
419 : chl 374
420 : syskin 658 if (quarterpel) {
421 :     dx = mb->qmvs[0].x;
422 :     dy = mb->qmvs[0].y;
423 :     b_dx = mb->b_qmvs[0].x;
424 :     b_dy = mb->b_qmvs[0].y;
425 : chl 374
426 : syskin 658 interpolate16x16_quarterpel((uint8_t *) f_refv->y, (uint8_t *) f_ref->y, (uint8_t *) f_refh->y,
427 :     (uint8_t *) f_refh->y + 64, (uint8_t *) f_refhv->y, 16*i, 16*j, dx, dy, edged_width, 0);
428 :     interpolate16x16_quarterpel((uint8_t *) b_refv->y, (uint8_t *) b_ref->y, (uint8_t *) b_refh->y,
429 :     (uint8_t *) b_refh->y + 64, (uint8_t *) b_refhv->y, 16*i, 16*j, b_dx, b_dy, edged_width, 0);
430 : suxen_drol 118
431 : syskin 658 for (k = 0; k < 4; k++) {
432 :     transfer_8to16sub2(&dct_codes[k * 64],
433 :     cur->y + (i * 16+(k&1)*8) + (j * 16+((k>>1)*8)) * edged_width,
434 :     f_refv->y + (i * 16+(k&1)*8) + (j * 16+((k>>1)*8)) * edged_width,
435 :     b_refv->y + (i * 16+(k&1)*8) + (j * 16+((k>>1)*8)) * edged_width,
436 :     edged_width);
437 :     }
438 :     b_dx /= 2;
439 :     b_dy /= 2;
440 :     dx /= 2;
441 :     dy /= 2;
442 :    
443 :     } else {
444 :     dx = mb->mvs[0].x;
445 :     dy = mb->mvs[0].y;
446 :     b_dx = mb->b_mvs[0].x;
447 :     b_dy = mb->b_mvs[0].y;
448 :    
449 :     for (k = 0; k < 4; k++) {
450 :     transfer_8to16sub2(&dct_codes[k * 64],
451 :     cur->y + (i * 16+(k&1)*8) + (j * 16+((k>>1)*8)) * edged_width,
452 :     get_ref(f_ref->y, f_refh->y, f_refv->y,
453 :     f_refhv->y, 2*i + (k&1), 2*j + (k>>1), 8, dx, dy,
454 :     edged_width),
455 :     get_ref(b_ref->y, b_refh->y, b_refv->y,
456 :     b_refhv->y, 2*i + (k&1), 2 * j+(k>>1), 8, b_dx, b_dy,
457 :     edged_width),
458 :     edged_width);
459 :     }
460 :    
461 : chl 374 }
462 : suxen_drol 118
463 :    
464 : syskin 658 dx = (dx >> 1) + roundtab_79[dx & 0x3];
465 :     dy = (dy >> 1) + roundtab_79[dy & 0x3];
466 : suxen_drol 118
467 : syskin 658 b_dx = (b_dx >> 1) + roundtab_79[b_dx & 0x3];
468 :     b_dy = (b_dy >> 1) + roundtab_79[b_dy & 0x3];
469 :    
470 : chl 530 transfer_8to16sub2(&dct_codes[4 * 64],
471 :     cur->u + (y * 8) * edged_width / 2 + (x * 8),
472 :     interpolate8x8_switch2(f_refv->u, b_ref->u, 8 * i, 8 * j,
473 :     b_dx, b_dy, edged_width / 2, 0),
474 :     interpolate8x8_switch2(f_refv->u + 8, f_ref->u, 8 * i, 8 * j,
475 :     dx, dy, edged_width / 2, 0),
476 : suxen_drol 449 edged_width / 2);
477 :    
478 : chl 530 transfer_8to16sub2(&dct_codes[5 * 64],
479 :     cur->v + (y * 8) * edged_width / 2 + (x * 8),
480 :     interpolate8x8_switch2(f_refv->u, b_ref->v, 8 * i, 8 * j,
481 :     b_dx, b_dy, edged_width / 2, 0),
482 :     interpolate8x8_switch2(f_refv->u + 8, f_ref->v, 8 * i, 8 * j,
483 :     dx, dy, edged_width / 2, 0),
484 : suxen_drol 449 edged_width / 2);
485 : chl 530
486 : suxen_drol 118 break;
487 : chl 374
488 :     case MODE_DIRECT:
489 : syskin 658 if (quarterpel) {
490 :     for (k=0;k<4;k++) {
491 : suxen_drol 118
492 : syskin 658 dx = mb->qmvs[k].x;
493 :     dy = mb->qmvs[k].y;
494 :     b_dx = mb->b_qmvs[k].x;
495 :     b_dy = mb->b_qmvs[k].y;
496 : chl 374
497 : syskin 658 interpolate8x8_quarterpel((uint8_t *) f_refv->y,
498 :     (uint8_t *) f_ref->y,
499 :     (uint8_t *) f_refh->y,
500 :     (uint8_t *) f_refh->y + 64,
501 :     (uint8_t *) f_refhv->y,
502 :     16*i + (k&1)*8, 16*j + (k>>1)*8, dx, dy, edged_width, 0);
503 :     interpolate8x8_quarterpel((uint8_t *) b_refv->y,
504 :     (uint8_t *) b_ref->y,
505 :     (uint8_t *) b_refh->y,
506 :     (uint8_t *) b_refh->y + 64,
507 :     (uint8_t *) b_refhv->y,
508 :     16*i + (k&1)*8, 16*j + (k>>1)*8, b_dx, b_dy, edged_width, 0);
509 : chl 374
510 :    
511 : syskin 658 transfer_8to16sub2(&dct_codes[k * 64],
512 :     cur->y + (i * 16+(k&1)*8) + (j * 16+((k>>1)*8)) * edged_width,
513 :     f_refv->y + (i * 16+(k&1)*8) + (j * 16+((k>>1)*8)) * edged_width,
514 :     b_refv->y + (i * 16+(k&1)*8) + (j * 16+((k>>1)*8)) * edged_width,
515 :     edged_width);
516 :     }
517 :     sum = mb->qmvs[0].y/2 + mb->qmvs[1].y/2 + mb->qmvs[2].y/2 + mb->qmvs[3].y/2;
518 :     dy = (sum >> 3) + roundtab_76[sum & 0xf];
519 :     sum = mb->qmvs[0].x/2 + mb->qmvs[1].x/2 + mb->qmvs[2].x/2 + mb->qmvs[3].x/2;
520 :     dx = (sum >> 3) + roundtab_76[sum & 0xf];
521 : chl 374
522 : syskin 658 sum = mb->b_qmvs[0].y/2 + mb->b_qmvs[1].y/2 + mb->b_qmvs[2].y/2 + mb->b_qmvs[3].y/2;
523 :     b_dy = (sum >> 3) + roundtab_76[sum & 0xf];
524 :     sum = mb->b_qmvs[0].x/2 + mb->b_qmvs[1].x/2 + mb->b_qmvs[2].x/2 + mb->b_qmvs[3].x/2;
525 :     b_dx = (sum >> 3) + roundtab_76[sum & 0xf];
526 : chl 374
527 : syskin 658 } else {
528 :     for (k=0;k<4;k++) {
529 :     dx = mb->mvs[k].x;
530 :     dy = mb->mvs[k].y;
531 : chl 374
532 : syskin 658 b_dx = mb->b_mvs[k].x;
533 :     b_dy = mb->b_mvs[k].y;
534 : chl 374
535 : syskin 658 transfer_8to16sub2(&dct_codes[k * 64],
536 :     cur->y + (i*16 + (k&1)*8) + (j*16 + (k>>1)*8 ) * edged_width,
537 :     get_ref(f_ref->y, f_refh->y, f_refv->y, f_refhv->y,
538 :     2*i + (k&1), 2*j + (k>>1), 8, dx, dy,
539 :     edged_width),
540 :     get_ref(b_ref->y, b_refh->y, b_refv->y, b_refhv->y,
541 :     2*i + (k&1), 2*j + (k>>1), 8, b_dx, b_dy,
542 :     edged_width),
543 :     edged_width);
544 :     }
545 : chl 374
546 : syskin 658 sum = mb->mvs[0].x + mb->mvs[1].x + mb->mvs[2].x + mb->mvs[3].x;
547 :     dx = (sum == 0 ? 0 : SIGN(sum) * (roundtab[ABS(sum) % 16] + (ABS(sum) / 16) * 2));
548 : chl 374
549 : syskin 658 sum = mb->mvs[0].y + mb->mvs[1].y + mb->mvs[2].y + mb->mvs[3].y;
550 :     dy = (sum == 0 ? 0 : SIGN(sum) * (roundtab[ABS(sum) % 16] + (ABS(sum) / 16) * 2));
551 :    
552 :     sum = mb->b_mvs[0].x + mb->b_mvs[1].x + mb->b_mvs[2].x + mb->b_mvs[3].x;
553 :     b_dx = (sum == 0 ? 0 : SIGN(sum) * (roundtab[ABS(sum) % 16] + (ABS(sum) / 16) * 2));
554 :    
555 :     sum = mb->b_mvs[0].y + mb->b_mvs[1].y + mb->b_mvs[2].y + mb->b_mvs[3].y;
556 :     b_dy = (sum == 0 ? 0 : SIGN(sum) * (roundtab[ABS(sum) % 16] + (ABS(sum) / 16) * 2));
557 :    
558 :     }
559 : chl 530 transfer_8to16sub2(&dct_codes[4 * 64],
560 :     cur->u + (y * 8) * edged_width / 2 + (x * 8),
561 :     interpolate8x8_switch2(f_refv->u, b_ref->u, 8 * i, 8 * j,
562 :     b_dx, b_dy, edged_width / 2, 0),
563 :     interpolate8x8_switch2(f_refv->u + 8, f_ref->u, 8 * i, 8 * j, dx, dy,
564 :     edged_width / 2, 0),
565 : suxen_drol 449 edged_width / 2);
566 :    
567 : chl 530 transfer_8to16sub2(&dct_codes[5 * 64],
568 :     cur->v + (y * 8) * edged_width / 2 + (x * 8),
569 :     interpolate8x8_switch2(f_refv->u, b_ref->v, 8 * i, 8 * j,
570 :     b_dx, b_dy, edged_width / 2, 0),
571 :     interpolate8x8_switch2(f_refv->u + 8, f_ref->v, 8 * i, 8 * j,
572 :     dx, dy, edged_width / 2, 0),
573 : suxen_drol 449 edged_width / 2);
574 : chl 530
575 :    
576 : suxen_drol 118 break;
577 :     }
578 :     }

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