[svn] / trunk / xvidcore / src / motion / motion_comp.c Repository:
ViewVC logotype

Diff of /trunk/xvidcore/src/motion/motion_comp.c

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

revision 372, Thu Aug 15 12:15:20 2002 UTC revision 373, Thu Aug 15 18:13:02 2002 UTC
# Line 99  Line 99 
99                  dy = (dy & 3) ? (dy >> 1) | 1 : dy / 2;                  dy = (dy & 3) ? (dy >> 1) | 1 : dy / 2;
100    
101                  /* uv-image-based compensation */                  /* uv-image-based compensation */
102  #ifdef BFRAMES  #ifdef BUGGY_BFRAMES
103    /* was #ifdef BFRAMES, but that's not possible because non-halfpel is _allowed_
104       if max_bframes<=0 . We should better check for XVID_HALFPEL flag */
105    
106                  compensate8x8_halfpel(&dct_codes[4 * 64], cur->u, ref->u, refh->u,                  compensate8x8_halfpel(&dct_codes[4 * 64], cur->u, ref->u, refh->u,
107                                                            refv->u, refhv->u, 8 * i, 8 * j, dx, dy,                                                            refv->u, refhv->u, 8 * i, 8 * j, dx, dy,
108                                                            edged_width / 2);                                                            edged_width / 2);
# Line 107  Line 110 
110                                                            refv->v, refhv->v, 8 * i, 8 * j, dx, dy,                                                            refv->v, refhv->v, 8 * i, 8 * j, dx, dy,
111                                                            edged_width / 2);                                                            edged_width / 2);
112  #else  #else
113    
114    
115                  /* uv-block-based compensation */                  /* uv-block-based compensation */
116                  interpolate8x8_switch(refv->u, ref->u, 8 * i, 8 * j, dx, dy,                  interpolate8x8_switch(refv->u, ref->u, 8 * i, 8 * j, dx, dy,
117                                                            edged_width / 2, rounding);                                                            edged_width / 2, rounding);
# Line 197  Line 202 
202          const int32_t edged_width = pParam->edged_width;          const int32_t edged_width = pParam->edged_width;
203          int32_t dx, dy;          int32_t dx, dy;
204          int32_t b_dx, b_dy;          int32_t b_dx, b_dy;
         int k,sum;  
205          int x = i;          int x = i;
206          int y = j;          int y = j;
207    
208    
209    
210          switch (mb->mode) {          switch (mb->mode) {
211          case MODE_FORWARD:          case MODE_FORWARD:
212                  dx = mb->mvs[0].x;                  dx = mb->mvs[0].x;
# Line 287  Line 292 
292                  break;                  break;
293    
294    
295          case MODE_INTERPOLATE:          /* _could_ use DIRECT, but would be overkill (no 4MV there) */          case MODE_INTERPOLATE:
   
296                  dx = mb->mvs[0].x;                  dx = mb->mvs[0].x;
297                  dy = mb->mvs[0].y;                  dy = mb->mvs[0].y;
   
298                  b_dx = mb->b_mvs[0].x;                  b_dx = mb->b_mvs[0].x;
299                  b_dy = mb->b_mvs[0].y;                  b_dy = mb->b_mvs[0].y;
300    
301                  for (k=0;k<4;k++)                  transfer_8to16sub2_c(&dct_codes[0 * 64],
302                  {                                                           cur->y + (i * 16) + (j * 16) * edged_width,
303                          transfer_8to16sub2_c(&dct_codes[k * 64],                                                           get_ref(f_ref->y, f_refh->y, f_refv->y,
304                                                           cur->y + (i * 16+(k&1)*8) + (j * 16+((k>>1)*8)) * edged_width,                                                                           f_refhv->y, 16 * i, 16 * j, 1, dx, dy,
305                                                                             edged_width), get_ref(b_ref->y, b_refh->y,
306                                                                                                                       b_refv->y,
307                                                                                                                       b_refhv->y, 16 * i,
308                                                                                                                       16 * j, 1, b_dx,
309                                                                                                                       b_dy, edged_width),
310                                                             edged_width);
311    
312                    transfer_8to16sub2_c(&dct_codes[1 * 64],
313                                                             cur->y + (i * 16 + 8) + (j * 16) * edged_width,
314                                                           get_ref(f_ref->y, f_refh->y, f_refv->y,                                                           get_ref(f_ref->y, f_refh->y, f_refv->y,
315                                                                           f_refhv->y, 2*i + (k&1), 2*j + (k>>1), 8, dx, dy,                                                                           f_refhv->y, 16 * i + 8, 16 * j, 1, dx, dy,
316                                                                             edged_width), get_ref(b_ref->y, b_refh->y,
317                                                                                                                       b_refv->y,
318                                                                                                                       b_refhv->y,
319                                                                                                                       16 * i + 8, 16 * j,
320                                                                                                                       1, b_dx, b_dy,
321                                                                           edged_width),                                                                           edged_width),
322                                                           get_ref(b_ref->y, b_refh->y, b_refv->y,                                                           edged_width);
323                                                                           b_refhv->y, 2*i + (k&1), 2 * j+(k>>1), 8, b_dx, b_dy,  
324                    transfer_8to16sub2_c(&dct_codes[2 * 64],
325                                                             cur->y + (i * 16) + (j * 16 + 8) * edged_width,
326                                                             get_ref(f_ref->y, f_refh->y, f_refv->y,
327                                                                             f_refhv->y, 16 * i, 16 * j + 8, 1, dx, dy,
328                                                                             edged_width), get_ref(b_ref->y, b_refh->y,
329                                                                                                                       b_refv->y,
330                                                                                                                       b_refhv->y, 16 * i,
331                                                                                                                       16 * j + 8, 1, b_dx,
332                                                                                                                       b_dy, edged_width),
333                                                             edged_width);
334    
335                    transfer_8to16sub2_c(&dct_codes[3 * 64],
336                                                             cur->y + (i * 16 + 8) + (j * 16 +
337                                                                                                              8) * edged_width,
338                                                             get_ref(f_ref->y, f_refh->y, f_refv->y,
339                                                                             f_refhv->y, 16 * i + 8, 16 * j + 8, 1, dx,
340                                                                             dy, edged_width), get_ref(b_ref->y,
341                                                                                                                               b_refh->y,
342                                                                                                                               b_refv->y,
343                                                                                                                               b_refhv->y,
344                                                                                                                               16 * i + 8,
345                                                                                                                               16 * j + 8, 1,
346                                                                                                                               b_dx, b_dy,
347                                                                           edged_width),                                                                           edged_width),
348                                                           edged_width);                                                           edged_width);
349                  }  
350    
351                  dx = (dx & 3) ? (dx >> 1) | 1 : dx / 2;                  dx = (dx & 3) ? (dx >> 1) | 1 : dx / 2;
352                  dy = (dy & 3) ? (dy >> 1) | 1 : dy / 2;                  dy = (dy & 3) ? (dy >> 1) | 1 : dy / 2;
# Line 317  Line 357 
357                  transfer_8to16sub2_c(&dct_codes[4 * 64],                  transfer_8to16sub2_c(&dct_codes[4 * 64],
358                                                           cur->u + (y * 8) * edged_width / 2 + (x * 8),                                                           cur->u + (y * 8) * edged_width / 2 + (x * 8),
359                                                           get_ref(f_ref->u, f_refh->u, f_refv->u,                                                           get_ref(f_ref->u, f_refh->u, f_refv->u,
360                                                                           f_refhv->u, i, j, 8, dx, dy,                                                                           f_refhv->u, 8 * i, 8 * j, 1, dx, dy,
361                                                                           edged_width / 2),                                                                           edged_width / 2), get_ref(b_ref->u,
362                                                           get_ref(b_ref->u, b_refh->u, b_refv->u,                                                                                                                             b_refh->u,
363                                                                           b_refhv->u, i, j, 8, b_dx, b_dy,                                                                                                                             b_refv->u,
364                                                                           edged_width / 2),                                                                                                                             b_refhv->u,
365                                                                                                                               8 * i, 8 * j, 1,
366                                                                                                                               b_dx, b_dy,
367                                                                                                                               edged_width /
368                                                                                                                               2),
369                                                           edged_width / 2);                                                           edged_width / 2);
370    
371                  transfer_8to16sub2_c(&dct_codes[5 * 64],                  transfer_8to16sub2_c(&dct_codes[5 * 64],
372                                                           cur->v + (y * 8) * edged_width / 2 + (x * 8),                                                           cur->v + (y * 8) * edged_width / 2 + (x * 8),
373                                                           get_ref(f_ref->v, f_refh->v, f_refv->v,                                                           get_ref(f_ref->v, f_refh->v, f_refv->v,
374                                                                           f_refhv->v, 8 * i, 8 * j, 1, dx, dy,                                                                           f_refhv->v, 8 * i, 8 * j, 1, dx, dy,
375                                                                           edged_width / 2),                                                                           edged_width / 2), get_ref(b_ref->v,
376                                                           get_ref(b_ref->v, b_refh->v, b_refv->v,                                                                                                                             b_refh->v,
377                                                                           b_refhv->v, 8 * i, 8 * j, 1, b_dx, b_dy,                                                                                                                             b_refv->v,
378                                                                           edged_width / 2),                                                                                                                             b_refhv->v,
379                                                                                                                               8 * i, 8 * j, 1,
380                                                                                                                               b_dx, b_dy,
381                                                                                                                               edged_width /
382                                                                                                                               2),
383                                                           edged_width / 2);                                                           edged_width / 2);
384    
385                  break;                  break;
386    
387          case MODE_DIRECT:          case MODE_DIRECT:
388                    // todo
                 for (k=0;k<4;k++)  
                 {  
                         dx = mb->mvs[k].x;  
                         dy = mb->mvs[k].y;  
   
                         b_dx = mb->b_mvs[k].x;  
                         b_dy = mb->b_mvs[k].y;  
   
 //              fprintf(stderr,"Direct Vector %d -- %d:%d    %d:%d\n",k,dx,dy,b_dx,b_dy);  
   
                         transfer_8to16sub2_c(&dct_codes[k * 64],  
                                                          cur->y + (i*16 + (k&1)*8) + (j*16 + (k>>1)*8 ) * edged_width,  
                                                          get_ref(f_ref->y, f_refh->y, f_refv->y, f_refhv->y,  
                                                                          2*i + (k&1), 2*j + (k>>1), 8, dx, dy,  
                                                                          edged_width),  
                                                          get_ref(b_ref->y, b_refh->y, b_refv->y, b_refhv->y,  
                                                                          2*i + (k&1), 2*j + (k>>1), 8, b_dx, b_dy,  
                                                                          edged_width),  
                                                          edged_width);  
                 }  
   
                 sum = mb->mvs[0].x + mb->mvs[1].x + mb->mvs[2].x + mb->mvs[3].x;  
                 dx = (sum == 0 ? 0 : SIGN(sum) * (roundtab[ABS(sum) % 16] + (ABS(sum) / 16) * 2));  
   
                 sum = mb->mvs[0].y + mb->mvs[1].y + mb->mvs[2].y + mb->mvs[3].y;  
                 dy = (sum == 0 ? 0 : SIGN(sum) * (roundtab[ABS(sum) % 16] + (ABS(sum) / 16) * 2));  
   
   
                 sum = mb->b_mvs[0].x + mb->b_mvs[1].x + mb->b_mvs[2].x + mb->b_mvs[3].x;  
                 b_dx = (sum == 0 ? 0 : SIGN(sum) * (roundtab[ABS(sum) % 16] + (ABS(sum) / 16) * 2));  
   
                 sum = mb->b_mvs[0].y + mb->b_mvs[1].y + mb->b_mvs[2].y + mb->b_mvs[3].y;  
                 b_dy = (sum == 0 ? 0 : SIGN(sum) * (roundtab[ABS(sum) % 16] + (ABS(sum) / 16) * 2));  
   
 /*              // for QPel don't forget to always do  
   
                 if (quarterpel)  
                         sum /= 2;  
 */  
   
                 transfer_8to16sub2_c(&dct_codes[4 * 64],  
                                                          cur->u + (y * 8) * edged_width / 2 + (x * 8),  
                                                          get_ref(f_ref->u, f_refh->u, f_refv->u,  
                                                                          f_refhv->u, i, j, 8, dx, dy,  
                                                                          edged_width / 2),  
                                                          get_ref(b_ref->u, b_refh->u, b_refv->u,  
                                                                          b_refhv->u, i, j, 8, b_dx, b_dy,  
                                                                          edged_width / 2),  
                                                          edged_width / 2);  
   
                 transfer_8to16sub2_c(&dct_codes[5 * 64],  
                                                          cur->v + (y * 8) * edged_width / 2 + (x * 8),  
                                                          get_ref(f_ref->v, f_refh->v, f_refv->v,  
                                                                          f_refhv->v, i, j, 8, dx, dy,  
                                                                          edged_width / 2),  
                                                          get_ref(b_ref->v, b_refh->v, b_refv->v,  
                                                                          b_refhv->v, i, j, 8, b_dx, b_dy,  
                                                                          edged_width / 2),  
                                                          edged_width / 2);  
   
   
389                  break;                  break;
390          }          }
391    
392  }  }

Legend:
Removed from v.372  
changed lines
  Added in v.373

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