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

Diff of /xvidcore/src/encoder.c

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

revision 1.95.2.31, Sat Jun 28 15:49:40 2003 UTC revision 1.95.2.40, Tue Aug 26 14:07:11 2003 UTC
# Line 117  Line 117 
117          Encoder *pEnc;          Encoder *pEnc;
118      int n;      int n;
119    
120          if (XVID_MAJOR(create->version) != 1)   /* v1.x.x */          if (XVID_VERSION_MAJOR(create->version) != 1) /* v1.x.x */
121                  return XVID_ERR_VERSION;                  return XVID_ERR_VERSION;
122    
123          if (create->width%2 || create->height%2)          if (create->width%2 || create->height%2)
# Line 226  Line 226 
226          pEnc->mbParam.frame_drop_ratio = MAX(create->frame_drop_ratio, 0);          pEnc->mbParam.frame_drop_ratio = MAX(create->frame_drop_ratio, 0);
227    
228      /* max keyframe interval */      /* max keyframe interval */
229      pEnc->mbParam.iMaxKeyInterval = create->max_key_interval <= 0 ?      pEnc->mbParam.iMaxKeyInterval = create->max_key_interval <= 0 ? (10 * (int)pEnc->mbParam.fbase) / (int)pEnc->mbParam.fincr : create->max_key_interval;
                 (10 * pEnc->mbParam.fbase) / pEnc->mbParam.fincr : create->max_key_interval;  
230    
231      /* allocate working frame-image memory */      /* allocate working frame-image memory */
232    
# Line 741  Line 740 
740    
741              for (j=0; j<pEnc->mbParam.mb_height; j++)              for (j=0; j<pEnc->mbParam.mb_height; j++)
742              for (i=0; i<pEnc->mbParam.mb_width; i++) {              for (i=0; i<pEnc->mbParam.mb_width; i++) {
743                  data.dquant[j*data.dquant_stride + i] = frame->mbs[j*pEnc->mbParam.mb_width + i].dquant;;                  data.dquant[j*data.dquant_stride + i] = frame->mbs[j*pEnc->mbParam.mb_width + i].dquant;
744              }              }
745          }          }
746    
# Line 771  Line 770 
770      }      }
771    
772      /* call plugins */      /* call plugins */
773      for (i=0; i<pEnc->num_plugins;i++) {      for (i=0; i<(unsigned int)pEnc->num_plugins;i++) {
774          emms();          emms();
775          if (pEnc->plugins[i].func) {          if (pEnc->plugins[i].func) {
776              if (pEnc->plugins[i].func(pEnc->plugins[i].param, opt, &data, 0) < 0) {              if (pEnc->plugins[i].func(pEnc->plugins[i].param, opt, &data, 0) < 0) {
# Line 867  Line 866 
866          int type;          int type;
867          Bitstream bs;          Bitstream bs;
868    
869          if (XVID_MAJOR(xFrame->version) != 1 || (stats && XVID_MAJOR(stats->version) != 1))     /* v1.x.x */          if (XVID_VERSION_MAJOR(xFrame->version) != 1 || (stats && XVID_VERSION_MAJOR(stats->version) != 1))     /* v1.x.x */
870                  return XVID_ERR_VERSION;                  return XVID_ERR_VERSION;
871    
872          xFrame->out_flags = 0;          xFrame->out_flags = 0;
# Line 904  Line 903 
903    
904                  if (xFrame->quant_intra_matrix)                  if (xFrame->quant_intra_matrix)
905                  {                  {
906                          memcpy(q->quant_intra_matrix, xFrame->quant_intra_matrix, sizeof(xFrame->quant_intra_matrix));                          memcpy(q->quant_intra_matrix, xFrame->quant_intra_matrix, 64*sizeof(unsigned char));
907                          q->frame.quant_intra_matrix = q->quant_intra_matrix;                          q->frame.quant_intra_matrix = q->quant_intra_matrix;
908                  }                  }
909    
910                  if (xFrame->quant_inter_matrix)                  if (xFrame->quant_inter_matrix)
911                  {                  {
912                          memcpy(q->quant_inter_matrix, xFrame->quant_inter_matrix, sizeof(xFrame->quant_inter_matrix));                          memcpy(q->quant_inter_matrix, xFrame->quant_inter_matrix, 64*sizeof(unsigned char));
913                          q->frame.quant_inter_matrix = q->quant_inter_matrix;                          q->frame.quant_inter_matrix = q->quant_inter_matrix;
914                  }                  }
915    
# Line 1196  Line 1195 
1195                          image_printf(&pEnc->current->image, pEnc->mbParam.edged_width, pEnc->mbParam.height, 5, 200, "IVOP");                          image_printf(&pEnc->current->image, pEnc->mbParam.edged_width, pEnc->mbParam.height, 5, 200, "IVOP");
1196                  }                  }
1197    
1198                    pEnc->iFrameNum = 1;
1199    
1200                  /* ---- update vol flags at IVOP ----------- */                  /* ---- update vol flags at IVOP ----------- */
1201                  pEnc->current->vol_flags = pEnc->mbParam.vol_flags = frame->vol_flags;                  pEnc->current->vol_flags = pEnc->mbParam.vol_flags = frame->vol_flags;
1202                    switch(frame->par) {
1203                    case XVID_PAR_11_VGA:
1204                    case XVID_PAR_43_PAL:
1205                    case XVID_PAR_43_NTSC:
1206                    case XVID_PAR_169_PAL:
1207                    case XVID_PAR_169_NTSC:
1208                    case XVID_PAR_EXT:
1209                            pEnc->mbParam.par = frame->par;
1210                            break;
1211                    default:
1212                            pEnc->mbParam.par = XVID_PAR_EXT;
1213                            break;
1214                    }
1215                    pEnc->mbParam.par_width = (frame->par_width)?frame->par_width:1;
1216                    pEnc->mbParam.par_height = (frame->par_height)?frame->par_height:1;
1217    
1218          if ((pEnc->mbParam.vol_flags & XVID_VOL_MPEGQUANT)) {          if ((pEnc->mbParam.vol_flags & XVID_VOL_MPEGQUANT)) {
1219                          if (frame->quant_intra_matrix != NULL)                          if (frame->quant_intra_matrix != NULL)
# Line 1252  Line 1267 
1267           * on next enc_encode call we must flush bframes           * on next enc_encode call we must flush bframes
1268           * %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */           * %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
1269    
1270  done_flush:  /*done_flush:*/
1271    
1272      pEnc->flush_bframes = 1;      pEnc->flush_bframes = 1;
1273    
# Line 1284  Line 1299 
1299  {  {
1300      unsigned int i,j;      unsigned int i,j;
1301      int quant = frame->quant;      int quant = frame->quant;
1302        if (quant > 31)
1303                    frame->quant = quant = 31;
1304            else if (quant < 1)
1305                    frame->quant = quant = 1;
1306    
1307      for (j=0; j<pParam->mb_height; j++)      for (j=0; j<pParam->mb_height; j++)
1308      for (i=0; i<pParam->mb_width; i++) {      for (i=0; i<pParam->mb_width; i++) {
# Line 1291  Line 1310 
1310          quant += pMB->dquant;          quant += pMB->dquant;
1311          if (quant > 31)          if (quant > 31)
1312                          quant = 31;                          quant = 31;
1313                  if (quant < 1)                  else if (quant < 1)
1314                          quant = 1;                          quant = 1;
1315          pMB->quant = quant;          pMB->quant = quant;
1316      }      }
# Line 1355  Line 1374 
1374    
1375          set_timecodes(pEnc->current,pEnc->reference,pEnc->mbParam.fbase);          set_timecodes(pEnc->current,pEnc->reference,pEnc->mbParam.fbase);
1376    
1377          BitstreamPadAlways(bs);          BitstreamPad(bs);
1378    
1379          BitstreamWriteVopHeader(bs, &pEnc->mbParam, pEnc->current, 1);          BitstreamWriteVopHeader(bs, &pEnc->mbParam, pEnc->current, 1);
1380    
1381          pEnc->current->sStat.iTextBits = 0;          pEnc->current->sStat.iTextBits = 0;
# Line 1394  Line 1414 
1414          }          }
1415          emms();          emms();
1416    
1417  /* XXX: Remove the two #if 0 blocks when we are sure we must always pad the stream */          BitstreamPadAlways(bs); /* next_start_code() at the end of VideoObjectPlane() */
1418  #if 0  
         /* for divx5 compatibility, we must always pad between the packed p and b frames */  
         if ((pEnc->mbParam.global_flags & XVID_GLOBAL_PACKED) && pEnc->bframenum_tail > 0)  
 #endif  
                 BitstreamPadAlways(bs);  
 #if 0  
         else  
                 BitstreamPad(bs);  
 #endif  
1419      pEnc->current->length = (BitstreamPos(bs) - bits) / 8;      pEnc->current->length = (BitstreamPos(bs) - bits) / 8;
1420    
1421          pEnc->fMvPrevSigma = -1;          pEnc->fMvPrevSigma = -1;
# Line 1486  Line 1498 
1498                  current->warp = GlobalMotionEst( current->mbs, pParam, current, reference,                  current->warp = GlobalMotionEst( current->mbs, pParam, current, reference,
1499                                                                   &pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV);                                                                   &pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV);
1500    
1501                  if (current->motion_flags & XVID_GME_REFINE) {                  if (current->motion_flags & XVID_ME_GME_REFINE) {
1502                          gmcval = GlobalMotionEstRefine(&current->warp,                          gmcval = GlobalMotionEstRefine(&current->warp,
1503                                                                  current->mbs, pParam,                                                                  current->mbs, pParam,
1504                                                                  current, reference,                                                                  current, reference,
# Line 1544  Line 1556 
1556          set_timecodes(current,reference,pParam->fbase);          set_timecodes(current,reference,pParam->fbase);
1557          if (vol_header)          if (vol_header)
1558          {       BitstreamWriteVolHeader(bs, &pEnc->mbParam);          {       BitstreamWriteVolHeader(bs, &pEnc->mbParam);
1559                  BitstreamPadAlways(bs);                  BitstreamPad(bs);
1560          }          }
1561    
1562          BitstreamWriteVopHeader(bs, &pEnc->mbParam, current, 1);          BitstreamWriteVopHeader(bs, &pEnc->mbParam, current, 1);
# Line 1558  Line 1570 
1570                          MACROBLOCK *pMB =                          MACROBLOCK *pMB =
1571                                  &current->mbs[x + y * pParam->mb_width];                                  &current->mbs[x + y * pParam->mb_width];
1572    
 /* Mode decision: Check, if the block should be INTRA / INTER or GMC-coded */  
 /* For a start, leave INTRA decision as is, only choose only between INTER/GMC  - gruel, 9.1.2002 */  
   
1573                          bIntra = (pMB->mode == MODE_INTRA) || (pMB->mode == MODE_INTRA_Q);                          bIntra = (pMB->mode == MODE_INTRA) || (pMB->mode == MODE_INTRA_Q);
1574    
1575                          if (bIntra) {                          if (bIntra) {
# Line 1574  Line 1583 
1583    
1584                                  current->sStat.kblks++;                                  current->sStat.kblks++;
1585    
1586                                    if (pEnc->current->vop_flags & XVID_VOP_GREYSCALE)
1587                                    {       pMB->cbp &= 0x3C;               /* keep only bits 5-2 */
1588                                            qcoeff[4*64+0]=0;               /* zero, because for INTRA MBs DC value is saved */
1589                                            qcoeff[5*64+0]=0;
1590                                    }
1591                                  MBCoding(current, pMB, qcoeff, bs, &current->sStat);                                  MBCoding(current, pMB, qcoeff, bs, &current->sStat);
1592                                  stop_coding_timer();                                  stop_coding_timer();
1593                                  continue;                                  continue;
1594                          }                          }
1595    
                         if (current->coding_type == S_VOP) {  
   
                                 int32_t iSAD = sad16(current->image.y + 16*y*pParam->edged_width + 16*x,  
                                         pEnc->vGMC.y + 16*y*pParam->edged_width + 16*x,  
                                         pParam->edged_width, 65536);  
   
                                 if (current->motion_flags & XVID_ME_CHROMA16) {  
                                         iSAD += sad8(current->image.u + 8*y*(pParam->edged_width/2) + 8*x,  
                                         pEnc->vGMC.u + 8*y*(pParam->edged_width/2) + 8*x, pParam->edged_width/2);  
   
                                         iSAD += sad8(current->image.v + 8*y*(pParam->edged_width/2) + 8*x,  
                                         pEnc->vGMC.v + 8*y*(pParam->edged_width/2) + 8*x, pParam->edged_width/2);  
                                 }  
   
                                 if (iSAD <= pMB->sad16) {               /* mode decision GMC */  
   
                                         if ((pParam->vol_flags & XVID_VOL_QUARTERPEL))  
                                                 pMB->qmvs[0] = pMB->qmvs[1] = pMB->qmvs[2] = pMB->qmvs[3] = pMB->amv;  
                                         else  
                                                 pMB->mvs[0] = pMB->mvs[1] = pMB->mvs[2] = pMB->mvs[3] = pMB->amv;  
   
                                         pMB->mode = MODE_INTER;  
                                         pMB->mcsel = 1;  
                                         pMB->sad16 = iSAD;  
                                 } else {  
                                         pMB->mcsel = 0;  
                                 }  
                         } else {  
                                 pMB->mcsel = 0; /* just a precaution */  
                         }  
   
1596                          start_timer();                          start_timer();
1597                          MBMotionCompensation(pMB, x, y, &reference->image,                          MBMotionCompensation(pMB, x, y, &reference->image,
1598                                                                   &pEnc->vInterH, &pEnc->vInterV,                                                                   &pEnc->vInterH, &pEnc->vInterV,
# Line 1824  Line 1807 
1807          }          }
1808          */          */
1809    
1810  /* XXX: Remove the two #if 0 blocks when we are sure we must always pad the stream */          BitstreamPadAlways(bs); /* next_start_code() at the end of VideoObjectPlane() */
 #if 0  
         /* for divx5 compatibility, we must always pad between the packed p and b frames */  
         if ((pParam->global_flags & XVID_GLOBAL_PACKED) && pEnc->bframenum_tail > 0)  
 #endif  
                 BitstreamPadAlways(bs);  
 #if 0  
         else  
                 BitstreamPad(bs);  
 #endif  
1811    
1812      current->length = (BitstreamPos(bs) - bits) / 8;      current->length = (BitstreamPos(bs) - bits) / 8;
1813    
# Line 1940  Line 1914 
1914                                  }                                  }
1915                          }                          }
1916    
1917  #ifdef BFRAMES_DEC_DEBUG                          /* keep only bits 5-2 -- Chroma blocks will just be skipped by the
1918          BFRAME_DEBUG                           * coding function for BFrames, that's why we don't zero teh DC
1919  #endif                           * coeffs */
1920                            if ((frame->vop_flags & XVID_VOP_GREYSCALE))
1921                                    mb->cbp &= 0x3C;
1922    
1923                          start_timer();                          start_timer();
1924                          MBCodingBVOP(mb, qcoeff, frame->fcode, frame->bcode, bs,                          MBCodingBVOP(mb, qcoeff, frame->fcode, frame->bcode, bs,
1925                                                   &frame->sStat, direction);                                                   &frame->sStat, direction);
# Line 1954  Line 1931 
1931    
1932          /* TODO: dynamic fcode/bcode ??? */          /* TODO: dynamic fcode/bcode ??? */
1933    
1934      BitstreamPadAlways(bs);      BitstreamPadAlways(bs); /* next_start_code() at the end of VideoObjectPlane() */
1935          frame->length = (BitstreamPos(bs) - bits) / 8;          frame->length = (BitstreamPos(bs) - bits) / 8;
1936    
1937  #ifdef BFRAMES_DEC_DEBUG  #ifdef BFRAMES_DEC_DEBUG

Legend:
Removed from v.1.95.2.31  
changed lines
  Added in v.1.95.2.40

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