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

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

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

revision 701, Mon Dec 9 10:47:05 2002 UTC revision 702, Tue Dec 10 11:13:50 2002 UTC
# Line 55  Line 55 
55   *  22.12.2001  lock based interpolation   *  22.12.2001  lock based interpolation
56   *  01.12.2001  inital version; (c)2001 peter ross <pross@cs.rmit.edu.au>   *  01.12.2001  inital version; (c)2001 peter ross <pross@cs.rmit.edu.au>
57   *   *
58   *  $Id: decoder.c,v 1.37.2.17 2002-12-09 10:47:05 suxen_drol Exp $   *  $Id: decoder.c,v 1.37.2.18 2002-12-10 11:13:50 suxen_drol Exp $
59   *   *
60   *************************************************************************/   *************************************************************************/
61    
# Line 389  Line 389 
389    
390  // decode an inter macroblock  // decode an inter macroblock
391    
 static void  
 rrv_mv_scaleup(VECTOR * mv)  
 {  
         if (mv->x > 0) {  
                 mv->x = 2*mv->x - 1;  
         } else if (mv->x < 0) {  
                 mv->x = 2*mv->x + 1;  
         }  
   
         if (mv->y > 0) {  
                 mv->y = 2*mv->y - 1;  
         } else if (mv->y < 0) {  
                 mv->y = 2*mv->y + 1;  
         }  
 }  
   
   
   
392  void  void
393  decoder_mbinter(DECODER * dec,  decoder_mbinter(DECODER * dec,
394                                  const MACROBLOCK * pMB,                                  const MACROBLOCK * pMB,
# Line 431  Line 413 
413          uint8_t *pY_Cur, *pU_Cur, *pV_Cur;          uint8_t *pY_Cur, *pU_Cur, *pV_Cur;
414    
415          int uv_dx, uv_dy;          int uv_dx, uv_dy;
416          VECTOR mv[4];          VECTOR mv[4];   /* local copy of mvs */
   
         for (i = 0; i < 4; i++)  
         {  
                 mv[i] = pMB->mvs[i];  
                 //DPRINTF(DPRINTF_MB, "mv[%i]   orig=%i,%i   local=%i", i, pMB->mvs[i].x, pMB->mvs[i].y,                                                mv[i].x, mv[i].y);  
         }  
417    
418          if (reduced_resolution) {          if (reduced_resolution) {
419                  pY_Cur = dec->cur.y + (y_pos << 5) * stride + (x_pos << 5);                  pY_Cur = dec->cur.y + (y_pos << 5) * stride + (x_pos << 5);
420                  pU_Cur = dec->cur.u + (y_pos << 4) * stride2 + (x_pos << 4);                  pU_Cur = dec->cur.u + (y_pos << 4) * stride2 + (x_pos << 4);
421                  pV_Cur = dec->cur.v + (y_pos << 4) * stride2 + (x_pos << 4);                  pV_Cur = dec->cur.v + (y_pos << 4) * stride2 + (x_pos << 4);
422                  rrv_mv_scaleup(&mv[0]);                  for (i = 0; i < 4; i++) {
423                  rrv_mv_scaleup(&mv[1]);                          mv[i].x = RRV_MV_SCALEUP(pMB->mvs[i].x);
424                  rrv_mv_scaleup(&mv[2]);                          mv[i].y = RRV_MV_SCALEUP(pMB->mvs[i].y);
425                  rrv_mv_scaleup(&mv[3]);                  }
426          }else{          }else{
427                  pY_Cur = dec->cur.y + (y_pos << 4) * stride + (x_pos << 4);                  pY_Cur = dec->cur.y + (y_pos << 4) * stride + (x_pos << 4);
428                  pU_Cur = dec->cur.u + (y_pos << 3) * stride2 + (x_pos << 3);                  pU_Cur = dec->cur.u + (y_pos << 3) * stride2 + (x_pos << 3);
429                  pV_Cur = dec->cur.v + (y_pos << 3) * stride2 + (x_pos << 3);                  pV_Cur = dec->cur.v + (y_pos << 3) * stride2 + (x_pos << 3);
430                    for (i = 0; i < 4; i++)
431                            mv[i] = pMB->mvs[i];
432          }          }
433    
434          if (pMB->mode == MODE_INTER || pMB->mode == MODE_INTER_Q) {          if (pMB->mode == MODE_INTER || pMB->mode == MODE_INTER_Q) {
# Line 1751  Line 1729 
1729          }          }
1730    
1731    
         /* reduced resolution deblocking filter */  
   
1732          if (reduced_resolution)          if (reduced_resolution)
1733          {          {
1734                  const int rmb_width = (dec->width + 31) / 32;                  image_deblock_rrv(&dec->cur, dec->edged_width, dec->mbs,
1735                  const int rmb_height = (dec->height + 31) / 32;                          (dec->width + 31) / 32, (dec->height + 31) / 32, dec->mb_width);
                 const int edged_width2 = dec->edged_width /2;  
                 int i,j;  
   
                 /* horizontal deblocking */  
   
                 for (j = 1; j < rmb_height*2; j++)      // luma: j,i in block units  
                 for (i = 0; i < rmb_width*2; i++)  
                 {  
                         if (dec->mbs[(j-1)/2*dec->mb_width + (i/2)].mode != MODE_NOT_CODED ||  
                                 dec->mbs[(j+0)/2*dec->mb_width + (i/2)].mode != MODE_NOT_CODED)  
                         {  
                                 xvid_HFilter_31_C(dec->cur.y + (j*16 - 1)*dec->edged_width + i*16,  
                                                               dec->cur.y + (j*16 + 0)*dec->edged_width + i*16, 2);  
                         }  
                 }  
   
                 for (j = 1; j < rmb_height; j++)        // chroma  
                 for (i = 0; i < rmb_width; i++)  
                 {  
                         if (dec->mbs[(j-1)*dec->mb_width + i].mode != MODE_NOT_CODED ||  
                                 dec->mbs[(j+0)*dec->mb_width + i].mode != MODE_NOT_CODED)  
                         {  
                                 hfilter_31(dec->cur.u + (j*16 - 1)*edged_width2 + i*16,  
                                                                   dec->cur.u + (j*16 + 0)*edged_width2 + i*16, 2);  
                                 hfilter_31(dec->cur.v + (j*16 - 1)*edged_width2 + i*16,  
                                                                   dec->cur.v + (j*16 + 0)*edged_width2 + i*16, 2);  
                         }  
                 }  
   
                 /* vertical deblocking */  
   
                 for (j = 0; j < rmb_height*2; j++)              // luma: i,j in block units  
                 for (i = 1; i < rmb_width*2; i++)  
                 {  
                         if (dec->mbs[(j/2)*dec->mb_width + (i-1)/2].mode != MODE_NOT_CODED ||  
                                 dec->mbs[(j/2)*dec->mb_width + (i+0)/2].mode != MODE_NOT_CODED)  
                         {  
                                 vfilter_31(dec->cur.y + (j*16)*dec->edged_width + i*16 - 1,  
                                                               dec->cur.y + (j*16)*dec->edged_width + i*16 + 0,  
                                                                   dec->edged_width, 2);  
                         }  
                 }  
   
                 for (j = 0; j < rmb_height; j++)        // chroma  
                 for (i = 1; i < rmb_width; i++)  
                 {  
                         if (dec->mbs[j*dec->mb_width + i - 1].mode != MODE_NOT_CODED ||  
                                 dec->mbs[j*dec->mb_width + i + 0].mode != MODE_NOT_CODED)  
                         {  
                                 vfilter_31(dec->cur.u + (j*16)*edged_width2 + i*16 - 1,  
                                                                   dec->cur.u + (j*16)*edged_width2 + i*16 + 0,  
                                                                   edged_width2, 2);  
                                 vfilter_31(dec->cur.v + (j*16)*edged_width2 + i*16 - 1,  
                                                                   dec->cur.v + (j*16)*edged_width2 + i*16 + 0,  
                                                                   edged_width2, 2);  
                         }  
                 }  
1736          }          }
1737    
1738          BitstreamByteAlign(&bs);          BitstreamByteAlign(&bs);

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

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