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

Diff of /trunk/xvidcore/src/encoder.c

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

revision 853, Sat Feb 15 18:48:15 2003 UTC revision 867, Mon Feb 17 23:45:21 2003 UTC
# Line 26  Line 26 
26   *  along with this program; if not, write to the Free Software   *  along with this program; if not, write to the Free Software
27   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
28   *   *
29   ****************************************************************************/   *  $Id: encoder.c,v 1.93 2003-02-17 23:45:21 edgomez Exp $
   
 /*****************************************************************************  
  *  
  *  History  
  *  
  *  10.07.2002  added BFRAMES_DEC_DEBUG support  
  *              MinChen <chenm001@163.com>  
  *  20.06.2002 bframe patch  
  *  08.05.2002 fix some problem in DEBUG mode;  
  *             MinChen <chenm001@163.com>  
  *  14.04.2002 added FrameCodeB()  
  *  
  *  $Id: encoder.c,v 1.92 2003-02-15 18:48:15 edgomez Exp $  
30   *   *
31   ****************************************************************************/   ****************************************************************************/
32    
# Line 605  Line 592 
592    
593  static __inline void inc_frame_num(Encoder * pEnc)  static __inline void inc_frame_num(Encoder * pEnc)
594  {  {
595          pEnc->current->stamp = pEnc->mbParam.m_stamp;   // first frame is zero          pEnc->current->stamp = pEnc->mbParam.m_stamp;   /* first frame is zero */
596          pEnc->mbParam.m_stamp += pEnc->mbParam.fincr;          pEnc->mbParam.m_stamp += pEnc->mbParam.fincr;
597  }  }
598    
# Line 647  Line 634 
634                  pCur->ticks = (int32_t)pCur->stamp % time_base;                  pCur->ticks = (int32_t)pCur->stamp % time_base;
635                  pCur->seconds =  ((int32_t)pCur->stamp / time_base)     - ((int32_t)pRef->stamp / time_base) ;                  pCur->seconds =  ((int32_t)pCur->stamp / time_base)     - ((int32_t)pRef->stamp / time_base) ;
636    
637                  //HEAVY DEBUG OUTPUT    remove when timecodes prove to be stable                  /* HEAVY DEBUG OUTPUT remove when timecodes prove to be stable */
638    
639  /*              fprintf(stderr,"WriteVop:   %d - %d \n",  /*              fprintf(stderr,"WriteVop:   %d - %d \n",
640                          ((int32_t)pCur->stamp / time_base), ((int32_t)pRef->stamp / time_base));                          ((int32_t)pCur->stamp / time_base), ((int32_t)pRef->stamp / time_base));
# Line 860  Line 847 
847                                  pEnc->mbParam.width, pEnc->mbParam.height, pEnc->mbParam.edged_width);                                  pEnc->mbParam.width, pEnc->mbParam.height, pEnc->mbParam.edged_width);
848                  }                  }
849    
850                  // queue input frame, and dequue next image                  /* queue input frame, and dequue next image */
851                  if (pEnc->queue_size > 0)                  if (pEnc->queue_size > 0)
852                  {                  {
853                          image_swap(&pEnc->current->image, &pEnc->queue[pEnc->queue_tail]);                          image_swap(&pEnc->current->image, &pEnc->queue[pEnc->queue_tail]);
# Line 891  Line 878 
878                                  pEnc->bframenum_head, pEnc->bframenum_tail,                                  pEnc->bframenum_head, pEnc->bframenum_tail,
879                                  pEnc->queue_head, pEnc->queue_tail, pEnc->queue_size);                                  pEnc->queue_head, pEnc->queue_tail, pEnc->queue_size);
880    
881                  //      BitstreamPutBits(&bs, 0x7f, 8);                          /* That disabled line of code was supposed to inform VirtualDub
882                             * that the frame was a dummy delay frame - now disabled (thx god :-)
883                             */
884                            /* BitstreamPutBits(&bs, 0x7f, 8); */
885                          pFrame->intra = 5;                          pFrame->intra = 5;
886    
887                          if (pResult) {                          if (pResult) {
# Line 937  Line 927 
927    
928          emms();          emms();
929    
930          // only inc frame num, adapt quant, etc. if we havent seen it before          /* only inc frame num, adapt quant, etc. if we havent seen it before */
931          if (pEnc->bframenum_dx50bvop < 0 )          if (pEnc->bframenum_dx50bvop < 0 )
932          {          {
933                  mode = intra2coding_type(pFrame->intra);                  mode = intra2coding_type(pFrame->intra);
# Line 1053  Line 1043 
1043                          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");
1044                  }                  }
1045    
1046                  // when we reach an iframe in DX50BVOP mode, encode the last bframe as a pframe                  /* when we reach an iframe in DX50BVOP mode, encode the last bframe as a pframe */
1047    
1048                  if ((pEnc->mbParam.global & XVID_GLOBAL_DX50BVOP) && pEnc->bframenum_tail > 0) {                  if ((pEnc->mbParam.global & XVID_GLOBAL_DX50BVOP) && pEnc->bframenum_tail > 0) {
1049    
# Line 1145  Line 1135 
1135    
1136                  pEnc->bframenum_tail++;                  pEnc->bframenum_tail++;
1137    
1138  // bframe report by koepi                  /* bframe report by koepi */
1139                  pFrame->intra = 2;                  pFrame->intra = 2;
1140                  pFrame->length = 0;                  pFrame->length = 0;
1141    
# Line 1349  Line 1339 
1339    
1340          }          }
1341    
1342  //      BitstreamPutBits(&bs, 0xFFFF, 16);          /* Relic from OpenDivX - now disabled
1343  //      BitstreamPutBits(&bs, 0xFFFF, 16);          BitstreamPutBits(&bs, 0xFFFF, 16);
1344            BitstreamPutBits(&bs, 0xFFFF, 16);
1345            */
1346    
1347          BitstreamPadAlways(&bs);          BitstreamPadAlways(&bs);
1348          pFrame->length = BitstreamLength(&bs);          pFrame->length = BitstreamLength(&bs);
1349    
# Line 1501  Line 1494 
1494                                          pMB->pmvs[vec].x = pMB->mvs[vec].x - pred.x;                                          pMB->pmvs[vec].x = pMB->mvs[vec].x - pred.x;
1495                                          pMB->pmvs[vec].y = pMB->mvs[vec].y - pred.y;                                          pMB->pmvs[vec].y = pMB->mvs[vec].y - pred.y;
1496                                  }                                  }
1497                          } else                          // intra / stuffing / not_coded                          } else                          /* intra / stuffing / not_coded */
1498                          {                          {
1499                                  for (vec = 0; vec < 4; ++vec) {                                  for (vec = 0; vec < 4; ++vec) {
1500                                          pMB->mvs[vec].x = pMB->mvs[vec].y = 0;                                          pMB->mvs[vec].x = pMB->mvs[vec].y = 0;
# Line 1698  Line 1691 
1691                  HintedMEGet(pEnc, 1);                  HintedMEGet(pEnc, 1);
1692          }          }
1693    
1694          return 1;                                       // intra          return 1;                                       /* intra */
1695  }  }
1696    
1697    
# Line 2036  Line 2029 
2029          iSearchRange = 1 << (3 + pEnc->mbParam.m_fcode);          iSearchRange = 1 << (3 + pEnc->mbParam.m_fcode);
2030    
2031          if ((fSigma > iSearchRange / 3)          if ((fSigma > iSearchRange / 3)
2032                  && (pEnc->mbParam.m_fcode <= (3 + pEnc->mbParam.m_quarterpel))) // maximum search range 128                  && (pEnc->mbParam.m_fcode <= (3 + pEnc->mbParam.m_quarterpel))) /* maximum search range 128 */
2033          {          {
2034                  pEnc->mbParam.m_fcode++;                  pEnc->mbParam.m_fcode++;
2035                  iSearchRange *= 2;                  iSearchRange *= 2;
2036          } else if ((fSigma < iSearchRange / 6)          } else if ((fSigma < iSearchRange / 6)
2037                             && (pEnc->fMvPrevSigma >= 0)                             && (pEnc->fMvPrevSigma >= 0)
2038                             && (pEnc->fMvPrevSigma < iSearchRange / 6)                             && (pEnc->fMvPrevSigma < iSearchRange / 6)
2039                          && (pEnc->mbParam.m_fcode >= (2 + pEnc->mbParam.m_quarterpel))) // minimum search range 16                             && (pEnc->mbParam.m_fcode >= (2 + pEnc->mbParam.m_quarterpel)))      /* minimum search range 16 */
2040          {          {
2041                  pEnc->mbParam.m_fcode--;                  pEnc->mbParam.m_fcode--;
2042                  iSearchRange /= 2;                  iSearchRange /= 2;
# Line 2064  Line 2057 
2057                  set_timecodes(pEnc->current,pEnc->reference,pEnc->mbParam.fbase);                  set_timecodes(pEnc->current,pEnc->reference,pEnc->mbParam.fbase);
2058                  BitstreamWriteVopHeader(bs, &pEnc->mbParam, pEnc->current, 0);                  BitstreamWriteVopHeader(bs, &pEnc->mbParam, pEnc->current, 0);
2059    
2060                  // copy reference frame details into the current frame                  /* copy reference frame details into the current frame */
2061                  pEnc->current->quant = pEnc->reference->quant;                  pEnc->current->quant = pEnc->reference->quant;
2062                  pEnc->current->motion_flags = pEnc->reference->motion_flags;                  pEnc->current->motion_flags = pEnc->reference->motion_flags;
2063                  pEnc->current->rounding_type = pEnc->reference->rounding_type;                  pEnc->current->rounding_type = pEnc->reference->rounding_type;
# Line 2093  Line 2086 
2086    
2087          *pBits = BitstreamPos(bs) - *pBits;          *pBits = BitstreamPos(bs) - *pBits;
2088    
2089          return 0;                                       // inter          return 0;                                       /* inter */
2090  }  }
2091    
2092    
# Line 2126  Line 2119 
2119    
2120          frame->quarterpel =  pEnc->mbParam.m_quarterpel;          frame->quarterpel =  pEnc->mbParam.m_quarterpel;
2121    
2122          // forward          /* forward  */
2123          image_setedges(f_ref, pEnc->mbParam.edged_width,          image_setedges(f_ref, pEnc->mbParam.edged_width,
2124                                     pEnc->mbParam.edged_height, pEnc->mbParam.width,                                     pEnc->mbParam.edged_height, pEnc->mbParam.width,
2125                                     pEnc->mbParam.height);                                     pEnc->mbParam.height);
# Line 2136  Line 2129 
2129                                            pEnc->mbParam.m_quarterpel, 0);                                            pEnc->mbParam.m_quarterpel, 0);
2130          stop_inter_timer();          stop_inter_timer();
2131    
2132          // backward          /* backward */
2133          image_setedges(b_ref, pEnc->mbParam.edged_width,          image_setedges(b_ref, pEnc->mbParam.edged_width,
2134                                     pEnc->mbParam.edged_height, pEnc->mbParam.width,                                     pEnc->mbParam.edged_height, pEnc->mbParam.width,
2135                                     pEnc->mbParam.height);                                     pEnc->mbParam.height);
# Line 2149  Line 2142 
2142          start_timer();          start_timer();
2143    
2144          MotionEstimationBVOP(&pEnc->mbParam, frame,          MotionEstimationBVOP(&pEnc->mbParam, frame,
2145                  ((int32_t)(pEnc->current->stamp - frame->stamp)),                               // time_bp                                                   ((int32_t)(pEnc->current->stamp - frame->stamp)),                              /* time_bp */
2146                  ((int32_t)(pEnc->current->stamp - pEnc->reference->stamp)),     // time_pp                                                   ((int32_t)(pEnc->current->stamp - pEnc->reference->stamp)),    /* time_pp */
2147                          pEnc->reference->mbs, f_ref,                          pEnc->reference->mbs, f_ref,
2148                                                   &pEnc->f_refh, &pEnc->f_refv, &pEnc->f_refhv,                                                   &pEnc->f_refh, &pEnc->f_refv, &pEnc->f_refhv,
2149                                                   pEnc->current, b_ref, &pEnc->vInterH,                                                   pEnc->current, b_ref, &pEnc->vInterH,
# Line 2159  Line 2152 
2152    
2153          stop_motion_timer();          stop_motion_timer();
2154    
2155          /*if (test_quant_type(&pEnc->mbParam, pEnc->current))          /*
2156             {          if (test_quant_type(&pEnc->mbParam, pEnc->current)) {
2157             BitstreamWriteVolHeader(bs, pEnc->mbParam.width, pEnc->mbParam.height, pEnc->mbParam.quant_type);             BitstreamWriteVolHeader(bs, pEnc->mbParam.width, pEnc->mbParam.height, pEnc->mbParam.quant_type);
2158             } */          }
2159            */
2160    
2161          frame->coding_type = B_VOP;          frame->coding_type = B_VOP;
2162    
# Line 2182  Line 2176 
2176                          MACROBLOCK * const mb = &frame->mbs[x + y * pEnc->mbParam.mb_width];                          MACROBLOCK * const mb = &frame->mbs[x + y * pEnc->mbParam.mb_width];
2177                          int direction = pEnc->mbParam.global & XVID_ALTERNATESCAN ? 2 : 0;                          int direction = pEnc->mbParam.global & XVID_ALTERNATESCAN ? 2 : 0;
2178    
2179                          // decoder ignores mb when refence block is INTER(0,0), CBP=0                          /* decoder ignores mb when refence block is INTER(0,0), CBP=0 */
2180                          if (mb->mode == MODE_NOT_CODED) {                          if (mb->mode == MODE_NOT_CODED) {
2181                                  //mb->mvs[0].x = mb->mvs[0].y = mb->cbp = 0;                                  /* mb->mvs[0].x = mb->mvs[0].y = mb->cbp = 0; */
2182                                  continue;                                  continue;
2183                          }                          }
2184    
# Line 2203  Line 2197 
2197    
2198                                  if ( (mb->mode == MODE_DIRECT) && (mb->cbp == 0)                                  if ( (mb->mode == MODE_DIRECT) && (mb->cbp == 0)
2199                                          && (mb->pmvs[3].x == 0) && (mb->pmvs[3].y == 0) ) {                                          && (mb->pmvs[3].x == 0) && (mb->pmvs[3].y == 0) ) {
2200                                          mb->mode = MODE_DIRECT_NONE_MV; // skipped                                          mb->mode = MODE_DIRECT_NONE_MV; /* skipped */
2201                                  }                                  }
2202                          }                          }
2203    
# Line 2219  Line 2213 
2213    
2214          emms();          emms();
2215    
2216          // TODO: dynamic fcode/bcode ???          /* TODO: dynamic fcode/bcode ??? */
2217    
2218          *pBits = BitstreamPos(bs) - *pBits;          *pBits = BitstreamPos(bs) - *pBits;
2219    

Legend:
Removed from v.853  
changed lines
  Added in v.867

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