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

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

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

revision 702, Tue Dec 10 11:13:50 2002 UTC revision 706, Wed Dec 11 11:03:37 2002 UTC
# Line 130  Line 130 
130          }          }
131  }  }
132    
133    
134    
135    /* XXX: slow, inelegant... */
136    static void
137    interpolate18x18_switch(uint8_t * const cur,
138                                              const uint8_t * const refn,
139                                              const uint32_t x,
140                                              const uint32_t y,
141                                              const int32_t dx,
142                                              const int dy,
143                                              const uint32_t stride,
144                                              const uint32_t rounding)
145    {
146            interpolate8x8_switch(cur, refn, x-1, y-1, dx, dy, stride, rounding);
147            interpolate8x8_switch(cur, refn, x+7, y-1, dx, dy, stride, rounding);
148            interpolate8x8_switch(cur, refn, x+9, y-1, dx, dy, stride, rounding);
149    
150            interpolate8x8_switch(cur, refn, x-1, y+7, dx, dy, stride, rounding);
151            interpolate8x8_switch(cur, refn, x+7, y+7, dx, dy, stride, rounding);
152            interpolate8x8_switch(cur, refn, x+9, y+7, dx, dy, stride, rounding);
153    
154            interpolate8x8_switch(cur, refn, x-1, y+9, dx, dy, stride, rounding);
155            interpolate8x8_switch(cur, refn, x+7, y+9, dx, dy, stride, rounding);
156            interpolate8x8_switch(cur, refn, x+9, y+9, dx, dy, stride, rounding);
157    }
158    
159    
160  void  void
161  MBMotionCompensation(MACROBLOCK * const mb,  MBMotionCompensation(MACROBLOCK * const mb,
162                                           const uint32_t i,                                           const uint32_t i,
# Line 153  Line 180 
180                  int32_t dx = (quarterpel ? mb->qmvs[0].x : mb->mvs[0].x);                  int32_t dx = (quarterpel ? mb->qmvs[0].x : mb->mvs[0].x);
181                  int32_t dy = (quarterpel ? mb->qmvs[0].y : mb->mvs[0].y);                  int32_t dy = (quarterpel ? mb->qmvs[0].y : mb->mvs[0].y);
182    
183                  if ( (mb->mode == MODE_NOT_CODED) && (dx==0) && (dy==0) ) {     /* quick copy */                  if ( (!reduced_resolution) && (mb->mode == MODE_NOT_CODED) && (dx==0) && (dy==0) ) {    /* quick copy */
184                          transfer16x16_copy(cur->y + 16 * (i + j * edged_width),                          transfer16x16_copy(cur->y + 16 * (i + j * edged_width),
185                                                             ref->y + 16 * (i + j * edged_width),                                                             ref->y + 16 * (i + j * edged_width),
186                                                             edged_width);                                                             edged_width);
# Line 187  Line 214 
214                  dx = (dx >> 1) + roundtab_79[dx & 0x3];                  dx = (dx >> 1) + roundtab_79[dx & 0x3];
215                  dy = (dy >> 1) + roundtab_79[dy & 0x3];                  dy = (dy >> 1) + roundtab_79[dy & 0x3];
216    
217                  /* uv-block-based compensation                  /* uv-block-based compensation */
                         XXX: rrv doesnt work with 16x16 block-based intepolation.  
                         we need to use 18x18-block interpolation */  
218                  if (reduced_resolution)                  if (reduced_resolution)
219                  {                  {
220                          const stride = edged_width/2;                          const stride = edged_width/2;
# Line 197  Line 222 
222    
223                          current = cur->u + 16*j*stride + 16*i;                          current = cur->u + 16*j*stride + 16*i;
224                          reference = refv->u + 16*j*stride + 16*i;                          reference = refv->u + 16*j*stride + 16*i;
225                          interpolate16x16_switch(refv->u, ref->u, 16*i, 16*j, dx, dy, stride, rounding);                          interpolate18x18_switch(refv->u, ref->u, 16*i, 16*j, dx, dy, stride, rounding);
226                          filter_18x18_to_8x8(dct_codes + 4*64, current, stride);                          filter_18x18_to_8x8(dct_codes + 4*64, current, stride);
227                          filter_diff_18x18_to_8x8(dct_codes + 4*64, reference, stride);                          filter_diff_18x18_to_8x8(dct_codes + 4*64, reference, stride);
228                          transfer16x16_copy(current, reference, stride);                          transfer16x16_copy(current, reference, stride);
229    
230                          current = cur->v + 16*j*stride + 16*i;                          current = cur->v + 16*j*stride + 16*i;
231                          reference = refv->v + 16*j*stride + 16*i;                          reference = refv->v + 16*j*stride + 16*i;
232                          interpolate16x16_switch(refv->v, ref->v, 16*i, 16*j, dx, dy, stride, rounding);                          interpolate18x18_switch(refv->v, ref->v, 16*i, 16*j, dx, dy, stride, rounding);
233                          filter_18x18_to_8x8(dct_codes + 5*64, current, stride);                          filter_18x18_to_8x8(dct_codes + 5*64, current, stride);
234                          filter_diff_18x18_to_8x8(dct_codes + 5*64, reference, stride);                          filter_diff_18x18_to_8x8(dct_codes + 5*64, reference, stride);
235                          transfer16x16_copy(current, reference, stride);                          transfer16x16_copy(current, reference, stride);
# Line 223  Line 248 
248                  }                  }
249    
250          } else {                                        // mode == MODE_INTER4V          } else {                                        // mode == MODE_INTER4V
251                  int i;                  int k;
252                  int32_t sum, dx, dy;                  int32_t sum, dx, dy;
253                  VECTOR mvs[4];                  VECTOR mvs[4];
254    
255                  if(quarterpel)                  if(quarterpel)
256                          for (i = 0; i < 4; i++) mvs[i] = mb->qmvs[i];                          for (k = 0; k < 4; k++) mvs[k] = mb->qmvs[k];
257                  else                  else
258                          for (i = 0; i < 4; i++) mvs[i] = mb->mvs[i];                          for (k = 0; k < 4; k++) mvs[k] = mb->mvs[k];
259    
260                  if (reduced_resolution)                  if (reduced_resolution)
261                  {                  {
262                          for (i = 0; i < 4; i++)                          for (k = 0; k < 4; k++)
263                          {                          {
264                                  mvs[i].x = RRV_MV_SCALEUP(mvs[i].x);                                  mvs[k].x = RRV_MV_SCALEUP(mvs[k].x);
265                                  mvs[i].y = RRV_MV_SCALEUP(mvs[i].y);                                  mvs[k].y = RRV_MV_SCALEUP(mvs[k].y);
266                          }                          }
267                  }                  }
268    
# Line 269  Line 294 
294                  dy = (sum >> 3) + roundtab_76[sum & 0xf];                  dy = (sum >> 3) + roundtab_76[sum & 0xf];
295    
296    
297                  /* uv-block-based compensation                  /* uv-block-based compensation */
                         XXX: rrv doesnt work with 16x16 block-based intepolation.  
                         we need to use 18x18-block interpolation */  
298                  if (reduced_resolution)                  if (reduced_resolution)
299                  {                  {
300                          const stride = edged_width/2;                          const stride = edged_width/2;
# Line 279  Line 302 
302    
303                          current = cur->u + 16*j*stride + 16*i;                          current = cur->u + 16*j*stride + 16*i;
304                          reference = refv->u + 16*j*stride + 16*i;                          reference = refv->u + 16*j*stride + 16*i;
305                          interpolate16x16_switch(refv->u, ref->u, 16*i, 16*j, dx, dy, stride, rounding);                          interpolate18x18_switch(refv->u, ref->u, 16*i, 16*j, dx, dy, stride, rounding);
306                          filter_18x18_to_8x8(dct_codes + 4*64, current, stride);                          filter_18x18_to_8x8(dct_codes + 4*64, current, stride);
307                          filter_diff_18x18_to_8x8(dct_codes + 4*64, reference, stride);                          filter_diff_18x18_to_8x8(dct_codes + 4*64, reference, stride);
308                          transfer16x16_copy(current, reference, stride);                          transfer16x16_copy(current, reference, stride);
309    
310                          current = cur->v + 16*j*stride + 16*i;                          current = cur->v + 16*j*stride + 16*i;
311                          reference = refv->v + 16*j*stride + 16*i;                          reference = refv->v + 16*j*stride + 16*i;
312                          interpolate16x16_switch(refv->v, ref->v, 16*i, 16*j, dx, dy, stride, rounding);                          interpolate18x18_switch(refv->v, ref->v, 16*i, 16*j, dx, dy, stride, rounding);
313                          filter_18x18_to_8x8(dct_codes + 5*64, current, stride);                          filter_18x18_to_8x8(dct_codes + 5*64, current, stride);
314                          filter_diff_18x18_to_8x8(dct_codes + 5*64, reference, stride);                          filter_diff_18x18_to_8x8(dct_codes + 5*64, reference, stride);
315                          transfer16x16_copy(current, reference, stride);                          transfer16x16_copy(current, reference, stride);

Legend:
Removed from v.702  
changed lines
  Added in v.706

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