[cvs] / xvidcore / src / decoder.c Repository:
ViewVC logotype

Diff of /xvidcore/src/decoder.c

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

revision 1.75, Tue Nov 22 10:23:01 2005 UTC revision 1.77, Fri Dec 30 14:04:49 2005 UTC
# Line 196  Line 196 
196    dec->packed_mode = 0;    dec->packed_mode = 0;
197    dec->time_inc_resolution = 1; /* until VOL header says otherwise */    dec->time_inc_resolution = 1; /* until VOL header says otherwise */
198    
199      dec->bs_version = 0xffff; /* Initialize to very high value -> assume bugfree stream */
200    
201    dec->fixed_dimensions = (dec->width > 0 && dec->height > 0);    dec->fixed_dimensions = (dec->width > 0 && dec->height > 0);
202    
203    if (dec->fixed_dimensions)    if (dec->fixed_dimensions)
# Line 466  Line 468 
468          const uint32_t cbp,          const uint32_t cbp,
469          Bitstream * bs,          Bitstream * bs,
470          const uint32_t rounding,          const uint32_t rounding,
471          const int ref)          const int ref,
472                    const int bvop)
473  {  {
474    uint32_t stride = dec->edged_width;    uint32_t stride = dec->edged_width;
475    uint32_t stride2 = stride / 2;    uint32_t stride2 = stride / 2;
# Line 487  Line 490 
490    
491    start_timer();    start_timer();
492    
493    if (pMB->mode != MODE_INTER4V) { /* INTER, INTER_Q, NOT_CODED, FORWARD, BACKWARD */    if ((pMB->mode != MODE_INTER4V) || (bvop)) { /* INTER, INTER_Q, NOT_CODED, FORWARD, BACKWARD */
494    
495      uv_dx = mv[0].x;      uv_dx = mv[0].x;
496      uv_dy = mv[0].y;      uv_dy = mv[0].y;
# Line 581  Line 584 
584          const uint32_t cbp,          const uint32_t cbp,
585          Bitstream * bs,          Bitstream * bs,
586          const uint32_t rounding,          const uint32_t rounding,
587          const int ref)          const int ref,
588                    const int bvop)
589  {  {
590    uint32_t stride = dec->edged_width;    uint32_t stride = dec->edged_width;
591    uint32_t stride2 = stride / 2;    uint32_t stride2 = stride / 2;
# Line 605  Line 609 
609    
610    start_timer();    start_timer();
611    
612    if(pMB->mode!=MODE_INTER4V)   /* INTER, INTER_Q, NOT_CODED, FORWARD, BACKWARD */    if((pMB->mode!=MODE_INTER4V) || (bvop))   /* INTER, INTER_Q, NOT_CODED, FORWARD, BACKWARD */
613    {    {
614      /* Prepare top field vector */      /* Prepare top field vector */
615      uvtop_dx = DIV2ROUND(mv[0].x);      uvtop_dx = DIV2ROUND(mv[0].x);
# Line 1063  Line 1067 
1067    
1068          /* See how to decode */          /* See how to decode */
1069          if(!mb->field_pred)          if(!mb->field_pred)
1070           decoder_mbinter(dec, mb, x, y, cbp, bs, rounding, 0);           decoder_mbinter(dec, mb, x, y, cbp, bs, rounding, 0, 0);
1071          else          else
1072           decoder_mbinter_field(dec, mb, x, y, cbp, bs, rounding, 0);           decoder_mbinter_field(dec, mb, x, y, cbp, bs, rounding, 0, 0);
1073    
1074        } else if (gmc_warp) {  /* a not coded S(GMC)-VOP macroblock */        } else if (gmc_warp) {  /* a not coded S(GMC)-VOP macroblock */
1075          mb->mode = MODE_NOT_CODED_GMC;          mb->mode = MODE_NOT_CODED_GMC;
# Line 1086  Line 1090 
1090          mb->field_pred=0; /* (!) */          mb->field_pred=0; /* (!) */
1091    
1092          decoder_mbinter(dec, mb, x, y, 0, bs,          decoder_mbinter(dec, mb, x, y, 0, bs,
1093                                  rounding, 0);                                  rounding, 0, 0);
1094    
1095          if(dec->out_frm && cp_mb > 0) {          if(dec->out_frm && cp_mb > 0) {
1096            output_slice(&dec->cur, dec->edged_width,dec->width,dec->out_frm,st_mb,y,cp_mb);            output_slice(&dec->cur, dec->edged_width,dec->width,dec->out_frm,st_mb,y,cp_mb);
# Line 1188  Line 1192 
1192      b_uv_dy = (b_uv_dy >> 1) + roundtab_79[b_uv_dy & 0x3];      b_uv_dy = (b_uv_dy >> 1) + roundtab_79[b_uv_dy & 0x3];
1193    
1194    } else {    } else {
1195      uv_dx = pMB->mvs[0].x + pMB->mvs[1].x + pMB->mvs[2].x + pMB->mvs[3].x;            if (dec->quarterpel) { /* for qpel the /2 shall be done before summation. We've done it right in the encoder in the past. */
1196      uv_dy = pMB->mvs[0].y + pMB->mvs[1].y + pMB->mvs[2].y + pMB->mvs[3].y;                                                           /* TODO: figure out if we ever did it wrong on the encoder side. If yes, add some workaround */
     b_uv_dx = pMB->b_mvs[0].x + pMB->b_mvs[1].x + pMB->b_mvs[2].x + pMB->b_mvs[3].x;  
     b_uv_dy = pMB->b_mvs[0].y + pMB->b_mvs[1].y + pMB->b_mvs[2].y + pMB->b_mvs[3].y;  
   
     if (dec->quarterpel) {  
1197        if (dec->bs_version <= BS_VERSION_BUGGY_CHROMA_ROUNDING) {        if (dec->bs_version <= BS_VERSION_BUGGY_CHROMA_ROUNDING) {
1198                                  uv_dx = (uv_dx>>1) | (uv_dx&1);                          int z;
1199                                  uv_dy = (uv_dy>>1) | (uv_dy&1);                          uv_dx = 0; uv_dy = 0;
1200                                  b_uv_dx = (b_uv_dx>>1) | (b_uv_dx&1);                          b_uv_dx = 0; b_uv_dy = 0;
1201                                  b_uv_dy = (b_uv_dy>>1) | (b_uv_dy&1);                          for (z = 0; z < 4; z++) {
1202                              uv_dx += ((pMB->mvs[z].x>>1) | (pMB->mvs[z].x&1));
1203                              uv_dy += ((pMB->mvs[z].y>>1) | (pMB->mvs[z].y&1));
1204                              b_uv_dx += ((pMB->b_mvs[z].x>>1) | (pMB->b_mvs[z].x&1));
1205                              b_uv_dy += ((pMB->b_mvs[z].y>>1) | (pMB->b_mvs[z].y&1));
1206                            }
1207                          }                          }
1208                          else {                          else {
1209          uv_dx /= 2;                          uv_dx = (pMB->mvs[0].x / 2) + (pMB->mvs[1].x / 2) + (pMB->mvs[2].x / 2) + (pMB->mvs[3].x / 2);
1210          uv_dy /= 2;                          uv_dy = (pMB->mvs[0].y / 2) + (pMB->mvs[1].y / 2) + (pMB->mvs[2].y / 2) + (pMB->mvs[3].y / 2);
1211          b_uv_dx /= 2;                          b_uv_dx = (pMB->b_mvs[0].x / 2) + (pMB->b_mvs[1].x / 2) + (pMB->b_mvs[2].x / 2) + (pMB->b_mvs[3].x / 2);
1212          b_uv_dy /= 2;                          b_uv_dy = (pMB->b_mvs[0].y / 2) + (pMB->b_mvs[1].y / 2) + (pMB->b_mvs[2].y / 2) + (pMB->b_mvs[3].y / 2);
1213        }        }
1214            } else {
1215          uv_dx = pMB->mvs[0].x + pMB->mvs[1].x + pMB->mvs[2].x + pMB->mvs[3].x;
1216          uv_dy = pMB->mvs[0].y + pMB->mvs[1].y + pMB->mvs[2].y + pMB->mvs[3].y;
1217          b_uv_dx = pMB->b_mvs[0].x + pMB->b_mvs[1].x + pMB->b_mvs[2].x + pMB->b_mvs[3].x;
1218          b_uv_dy = pMB->b_mvs[0].y + pMB->b_mvs[1].y + pMB->b_mvs[2].y + pMB->b_mvs[3].y;
1219      }      }
1220    
1221      uv_dx = (uv_dx >> 3) + roundtab_76[uv_dx & 0xf];      uv_dx = (uv_dx >> 3) + roundtab_76[uv_dx & 0xf];
# Line 1384  Line 1394 
1394        if (last_mb->mode == MODE_NOT_CODED) {        if (last_mb->mode == MODE_NOT_CODED) {
1395          mb->cbp = 0;          mb->cbp = 0;
1396          mb->mode = MODE_FORWARD;          mb->mode = MODE_FORWARD;
1397          decoder_mbinter(dec, mb, x, y, mb->cbp, bs, 0, 1);          decoder_mbinter(dec, mb, x, y, mb->cbp, bs, 0, 1, 1);
1398          continue;          continue;
1399        }        }
1400    
# Line 1467  Line 1477 
1477          get_b_motion_vector(bs, &mb->mvs[0], fcode_backward, dec->p_bmv, dec, x, y);          get_b_motion_vector(bs, &mb->mvs[0], fcode_backward, dec->p_bmv, dec, x, y);
1478          dec->p_bmv = mb->mvs[1] = mb->mvs[2] = mb->mvs[3] = mb->mvs[0];          dec->p_bmv = mb->mvs[1] = mb->mvs[2] = mb->mvs[3] = mb->mvs[0];
1479    
1480          decoder_mbinter(dec, mb, x, y, mb->cbp, bs, 0, 0);          decoder_mbinter(dec, mb, x, y, mb->cbp, bs, 0, 0, 1);
1481          break;          break;
1482    
1483        case MODE_FORWARD:        case MODE_FORWARD:
1484          get_b_motion_vector(bs, &mb->mvs[0], fcode_forward, dec->p_fmv, dec, x, y);          get_b_motion_vector(bs, &mb->mvs[0], fcode_forward, dec->p_fmv, dec, x, y);
1485          dec->p_fmv = mb->mvs[1] = mb->mvs[2] = mb->mvs[3] = mb->mvs[0];          dec->p_fmv = mb->mvs[1] = mb->mvs[2] = mb->mvs[3] = mb->mvs[0];
1486    
1487          decoder_mbinter(dec, mb, x, y, mb->cbp, bs, 0, 1);          decoder_mbinter(dec, mb, x, y, mb->cbp, bs, 0, 1, 1);
1488          break;          break;
1489    
1490        default:        default:

Legend:
Removed from v.1.75  
changed lines
  Added in v.1.77

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