[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.49.2.21, Tue Dec 9 14:31:40 2003 UTC revision 1.49.2.31, Tue Feb 3 02:56:57 2004 UTC
# Line 58  Line 58 
58    
59  #include "image/image.h"  #include "image/image.h"
60  #include "image/colorspace.h"  #include "image/colorspace.h"
61    #include "image/postprocessing.h"
62  #include "utils/mem_align.h"  #include "utils/mem_align.h"
63    
64  static int  static int
# Line 204  Line 205 
205          dec->last_mbs = NULL;          dec->last_mbs = NULL;
206    
207          init_timer();          init_timer();
208            init_postproc(&dec->postproc);
209          init_mpeg_matrix(dec->mpeg_quant_matrices);          init_mpeg_matrix(dec->mpeg_quant_matrices);
210    
211          /* For B-frame support (used to save reference frame's time */          /* For B-frame support (used to save reference frame's time */
# Line 849  Line 851 
851                                  mb->quant = quant;                                  mb->quant = quant;
852    
853                                  if (dec->interlacing) {                                  if (dec->interlacing) {
854                                          if ((cbp || intra) && !mcsel) {                                          if (cbp || intra) {
855                                                  mb->field_dct = BitstreamGetBit(bs);                                                  mb->field_dct = BitstreamGetBit(bs);
856                                                  DPRINTF(XVID_DEBUG_MB,"decp: field_dct: %i\n", mb->field_dct);                                                  DPRINTF(XVID_DEBUG_MB,"decp: field_dct: %i\n", mb->field_dct);
857                                          }                                          }
858    
859                                          if (mb->mode == MODE_INTER || mb->mode == MODE_INTER_Q) {                                          if ((mb->mode == MODE_INTER || mb->mode == MODE_INTER_Q) && !mcsel) {
860                                                  mb->field_pred = BitstreamGetBit(bs);                                                  mb->field_pred = BitstreamGetBit(bs);
861                                                  DPRINTF(XVID_DEBUG_MB, "decp: field_pred: %i\n", mb->field_pred);                                                  DPRINTF(XVID_DEBUG_MB, "decp: field_pred: %i\n", mb->field_pred);
862    
# Line 898  Line 900 
900    
901                          } else if (gmc_warp) {  /* a not coded S(GMC)-VOP macroblock */                          } else if (gmc_warp) {  /* a not coded S(GMC)-VOP macroblock */
902                                  mb->mode = MODE_NOT_CODED_GMC;                                  mb->mode = MODE_NOT_CODED_GMC;
903                                    mb->quant = quant;
904                                  decoder_mbgmc(dec, mb, x, y, fcode, 0x00, bs, rounding);                                  decoder_mbgmc(dec, mb, x, y, fcode, 0x00, bs, rounding);
905    
906                                  if(dec->out_frm && cp_mb > 0) {                                  if(dec->out_frm && cp_mb > 0) {
# Line 907  Line 910 
910                                  st_mb = x+1;                                  st_mb = x+1;
911                          } else {        /* not coded P_VOP macroblock */                          } else {        /* not coded P_VOP macroblock */
912                                  mb->mode = MODE_NOT_CODED;                                  mb->mode = MODE_NOT_CODED;
913                                    mb->quant = quant;
914    
915                                  mb->mvs[0].x = mb->mvs[1].x = mb->mvs[2].x = mb->mvs[3].x = 0;                                  mb->mvs[0].x = mb->mvs[1].x = mb->mvs[2].x = mb->mvs[3].x = 0;
916                                  mb->mvs[0].y = mb->mvs[1].y = mb->mvs[2].y = mb->mvs[3].y = 0;                                  mb->mvs[0].y = mb->mvs[1].y = mb->mvs[2].y = mb->mvs[3].y = 0;
# Line 1314  Line 1318 
1318    
1319  /* perform post processing if necessary, and output the image */  /* perform post processing if necessary, and output the image */
1320  void decoder_output(DECODER * dec, IMAGE * img, MACROBLOCK * mbs,  void decoder_output(DECODER * dec, IMAGE * img, MACROBLOCK * mbs,
1321                                          xvid_dec_frame_t * frame, xvid_dec_stats_t * stats, int coding_type)                                          xvid_dec_frame_t * frame, xvid_dec_stats_t * stats,
1322                                            int coding_type, int quant)
1323    {
1324            if (dec->cartoon_mode)
1325                    frame->general &= ~XVID_FILMEFFECT;
1326    
1327            if (frame->general & (XVID_DEBLOCKY|XVID_DEBLOCKUV|XVID_FILMEFFECT) && mbs != NULL)     /* post process */
1328  {  {
1329                    /* note: image is stored to tmp */
1330                    image_copy(&dec->tmp, img, dec->edged_width, dec->height);
1331                    image_postproc(&dec->postproc, &dec->tmp, dec->edged_width,
1332                                               mbs, dec->mb_width, dec->mb_height, dec->mb_width,
1333                                               frame->general, dec->frames, (coding_type == B_VOP));
1334                    img = &dec->tmp;
1335            }
1336    
1337          image_output(img, dec->width, dec->height,          image_output(img, dec->width, dec->height,
1338                                   dec->edged_width, (uint8_t**)frame->output.plane, frame->output.stride,                                   dec->edged_width, (uint8_t**)frame->output.plane, frame->output.stride,
1339                                   frame->output.csp, dec->interlacing);                                   frame->output.csp, dec->interlacing);
# Line 1359  Line 1377 
1377                  /* if not decoding "low_delay/packed", and this isn't low_delay and                  /* if not decoding "low_delay/packed", and this isn't low_delay and
1378                          we have a reference frame, then outout the reference frame */                          we have a reference frame, then outout the reference frame */
1379                  if (!(dec->low_delay_default && dec->packed_mode) && !dec->low_delay && dec->frames>0) {                  if (!(dec->low_delay_default && dec->packed_mode) && !dec->low_delay && dec->frames>0) {
1380                          decoder_output(dec, &dec->refn[0], dec->last_mbs, frame, stats, dec->last_coding_type);                          decoder_output(dec, &dec->refn[0], dec->last_mbs, frame, stats, dec->last_coding_type, quant);
1381                          dec->frames = 0;                          dec->frames = 0;
1382                          ret = 0;                          ret = 0;
1383                  } else {                  } else {
# Line 1429  Line 1447 
1447          /* packed_mode: special-N_VOP treament */          /* packed_mode: special-N_VOP treament */
1448          if (dec->packed_mode && coding_type == N_VOP) {          if (dec->packed_mode && coding_type == N_VOP) {
1449                  if (dec->low_delay_default && dec->frames > 0) {                  if (dec->low_delay_default && dec->frames > 0) {
1450                          decoder_output(dec, &dec->refn[0], dec->last_mbs, frame, stats, dec->last_coding_type);                          decoder_output(dec, &dec->refn[0], dec->last_mbs, frame, stats, dec->last_coding_type, quant);
1451                          output = 1;                          output = 1;
1452                  }                  }
1453                  /* ignore otherwise */                  /* ignore otherwise */
# Line 1450  Line 1468 
1468                          /* XXX: not_coded vops are not used for forward prediction */                          /* XXX: not_coded vops are not used for forward prediction */
1469                          /* we should not swap(last_mbs,mbs) */                          /* we should not swap(last_mbs,mbs) */
1470                          image_copy(&dec->cur, &dec->refn[0], dec->edged_width, dec->height);                          image_copy(&dec->cur, &dec->refn[0], dec->edged_width, dec->height);
1471                            SWAP(MACROBLOCK *, dec->mbs, dec->last_mbs); /* it will be swapped back */
1472                          break;                          break;
1473                  }                  }
1474    
# Line 1462  Line 1481 
1481                  /* note: for packed_mode, output is performed when the special-N_VOP is decoded */                  /* note: for packed_mode, output is performed when the special-N_VOP is decoded */
1482                  if (!(dec->low_delay_default && dec->packed_mode)) {                  if (!(dec->low_delay_default && dec->packed_mode)) {
1483                          if (dec->low_delay) {                          if (dec->low_delay) {
1484                                  decoder_output(dec, &dec->cur, dec->mbs, frame, stats, coding_type);                                  decoder_output(dec, &dec->cur, dec->mbs, frame, stats, coding_type, quant);
1485                                  output = 1;                                  output = 1;
1486                          } else if (dec->frames > 0)     { /* is the reference frame valid? */                          } else if (dec->frames > 0)     { /* is the reference frame valid? */
1487                                  /* output the reference frame */                                  /* output the reference frame */
1488                                  decoder_output(dec, &dec->refn[0], dec->last_mbs, frame, stats, dec->last_coding_type);                                  decoder_output(dec, &dec->refn[0], dec->last_mbs, frame, stats, dec->last_coding_type, quant);
1489                                  output = 1;                                  output = 1;
1490                          }                          }
1491                  }                  }
# Line 1491  Line 1510 
1510                          /* attemping to decode a bvop without atleast 2 reference frames */                          /* attemping to decode a bvop without atleast 2 reference frames */
1511                          image_printf(&dec->cur, dec->edged_width, dec->height, 16, 16,                          image_printf(&dec->cur, dec->edged_width, dec->height, 16, 16,
1512                                                  "broken b-frame, mising ref frames");                                                  "broken b-frame, mising ref frames");
1513                          stats->type = XVID_TYPE_NOTHING;                          if (stats) stats->type = XVID_TYPE_NOTHING;
1514                  } else if (dec->time_pp <= dec->time_bp) {                  } else if (dec->time_pp <= dec->time_bp) {
1515                          /* this occurs when dx50_bvop_compatibility==0 sequences are                          /* this occurs when dx50_bvop_compatibility==0 sequences are
1516                          decoded in vfw. */                          decoded in vfw. */
1517                          image_printf(&dec->cur, dec->edged_width, dec->height, 16, 16,                          image_printf(&dec->cur, dec->edged_width, dec->height, 16, 16,
1518                                                  "broken b-frame, tpp=%i tbp=%i", dec->time_pp, dec->time_bp);                                                  "broken b-frame, tpp=%i tbp=%i", dec->time_pp, dec->time_bp);
1519                          stats->type = XVID_TYPE_NOTHING;                          if (stats) stats->type = XVID_TYPE_NOTHING;
1520                  } else {                  } else {
1521                          decoder_bframe(dec, &bs, quant, fcode_forward, fcode_backward);                          decoder_bframe(dec, &bs, quant, fcode_forward, fcode_backward);
1522                          decoder_output(dec, &dec->cur, dec->mbs, frame, stats, coding_type);                          decoder_output(dec, &dec->cur, dec->mbs, frame, stats, coding_type, quant);
1523                  }                  }
1524    
1525                  output = 1;                  output = 1;
# Line 1522  Line 1541 
1541          if (dec->low_delay_default && output == 0) {          if (dec->low_delay_default && output == 0) {
1542                  if (dec->packed_mode && seen_something) {                  if (dec->packed_mode && seen_something) {
1543                          /* output the recently decoded frame */                          /* output the recently decoded frame */
1544                          decoder_output(dec, &dec->refn[0], dec->last_mbs, frame, stats, dec->last_coding_type);                          decoder_output(dec, &dec->refn[0], dec->last_mbs, frame, stats, dec->last_coding_type, quant);
1545                  } else {                  } else {
1546                          image_clear(&dec->cur, dec->width, dec->height, dec->edged_width, 0, 128, 128);                          image_clear(&dec->cur, dec->width, dec->height, dec->edged_width, 0, 128, 128);
1547                          image_printf(&dec->cur, dec->edged_width, dec->height, 16, 16,                          image_printf(&dec->cur, dec->edged_width, dec->height, 16, 16,
# Line 1530  Line 1549 
1549                          image_printf(&dec->cur, dec->edged_width, dec->height, 16, 64,                          image_printf(&dec->cur, dec->edged_width, dec->height, 16, 64,
1550                                  "bframe decoder lag");                                  "bframe decoder lag");
1551    
1552                          decoder_output(dec, &dec->cur, NULL, frame, stats, P_VOP);                          decoder_output(dec, &dec->cur, NULL, frame, stats, P_VOP, quant);
1553                          if (stats) stats->type = XVID_TYPE_NOTHING;                          if (stats) stats->type = XVID_TYPE_NOTHING;
1554                  }                  }
1555          }          }

Legend:
Removed from v.1.49.2.21  
changed lines
  Added in v.1.49.2.31

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