[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.16, Thu Mar 27 17:09:48 2003 UTC revision 1.95.2.23, Fri May 16 17:16:21 2003 UTC
# Line 134  Line 134 
134                  return XVID_ERR_MEMORY;                  return XVID_ERR_MEMORY;
135          memset(pEnc, 0, sizeof(Encoder));          memset(pEnc, 0, sizeof(Encoder));
136    
137        pEnc->mbParam.profile = create->profile;
138    
139          /* global flags */          /* global flags */
140      pEnc->mbParam.global_flags = create->global;      pEnc->mbParam.global_flags = create->global;
141    
# Line 151  Line 153 
153      if (pEnc->mbParam.fincr>0)      if (pEnc->mbParam.fincr>0)
154              simplify_time(&pEnc->mbParam.fincr, &pEnc->mbParam.fbase);              simplify_time(&pEnc->mbParam.fincr, &pEnc->mbParam.fbase);
155    
156      /* plugin */      /* zones */
157        if(create->num_zones > 0) {
158                    pEnc->num_zones = create->num_zones;
159                    pEnc->zones = xvid_malloc(sizeof(xvid_enc_zone_t) * pEnc->num_zones, CACHE_LINE);
160                    if (pEnc->zones == NULL)
161                            goto xvid_err_memory0;
162            memcpy(pEnc->zones, create->zones, sizeof(xvid_enc_zone_t) * pEnc->num_zones);
163            } else {
164                    pEnc->num_zones = 0;
165                    pEnc->zones = NULL;
166            }
167    
168        /* plugins */
169        if(create->num_plugins > 0) {
170      pEnc->num_plugins = create->num_plugins;      pEnc->num_plugins = create->num_plugins;
171      pEnc->plugins = xvid_malloc(sizeof(xvid_enc_plugin_t) * pEnc->num_plugins, CACHE_LINE);      pEnc->plugins = xvid_malloc(sizeof(xvid_enc_plugin_t) * pEnc->num_plugins, CACHE_LINE);
172      if (pEnc->plugins == NULL)      if (pEnc->plugins == NULL)
173          goto xvid_err_memory0;          goto xvid_err_memory0;
174            } else {
175                    pEnc->num_plugins = 0;
176                    pEnc->plugins = NULL;
177            }
178    
179      for (n=0; n<pEnc->num_plugins;n++) {      for (n=0; n<pEnc->num_plugins;n++) {
180          xvid_plg_create_t pcreate;          xvid_plg_create_t pcreate;
# Line 169  Line 188 
188    
189          memset(&pcreate, 0, sizeof(xvid_plg_create_t));          memset(&pcreate, 0, sizeof(xvid_plg_create_t));
190          pcreate.version = XVID_VERSION;          pcreate.version = XVID_VERSION;
191            pcreate.num_zones = pEnc->num_zones;
192            pcreate.zones = pEnc->zones;
193          pcreate.width = pEnc->mbParam.width;          pcreate.width = pEnc->mbParam.width;
194          pcreate.height = pEnc->mbParam.height;          pcreate.height = pEnc->mbParam.height;
195          pcreate.fincr = pEnc->mbParam.fincr;          pcreate.fincr = pEnc->mbParam.fincr;
# Line 198  Line 219 
219          pEnc->mbParam.bquant_ratio = MAX(create->bquant_ratio, 0);          pEnc->mbParam.bquant_ratio = MAX(create->bquant_ratio, 0);
220          pEnc->mbParam.bquant_offset = create->bquant_offset;          pEnc->mbParam.bquant_offset = create->bquant_offset;
221    
222        /* min/max quant */
223        for (n=0; n<3; n++) {
224            pEnc->mbParam.min_quant[n] = create->min_quant[n] > 0 ? create->min_quant[n] : 2;
225            pEnc->mbParam.max_quant[n] = create->max_quant[n] > 0 ? create->max_quant[n] : 31;
226        }
227    
228          /* frame drop ratio */          /* frame drop ratio */
229          pEnc->mbParam.frame_drop_ratio = MAX(create->frame_drop_ratio, 0);          pEnc->mbParam.frame_drop_ratio = MAX(create->frame_drop_ratio, 0);
230    
231      /* max keyframe interval */      /* max keyframe interval */
232      pEnc->mbParam.iMaxKeyInterval = create->max_key_interval <=0 ? 250 : create->max_key_interval;      pEnc->mbParam.iMaxKeyInterval = create->max_key_interval <= 0 ?
233      /*XXX: replace 250 hard code with "10seconds * framerate" */                  10 * pEnc->mbParam.fbase / pEnc->mbParam.fincr : create->max_key_interval;
234    
235          /* Bitrate allocator defaults          /* Bitrate allocator defaults
236    
# Line 500  Line 527 
527      }      }
528      xvid_free(pEnc->plugins);      xvid_free(pEnc->plugins);
529    
530        xvid_free(pEnc->zones);
531    
532          xvid_free(pEnc);          xvid_free(pEnc);
533    
534          create->handle = NULL;          create->handle = NULL;
# Line 577  Line 606 
606                                    pEnc->mbParam.edged_height);                                    pEnc->mbParam.edged_height);
607          image_destroy(&pEnc->f_refhv, pEnc->mbParam.edged_width,          image_destroy(&pEnc->f_refhv, pEnc->mbParam.edged_width,
608                                    pEnc->mbParam.edged_height);                                    pEnc->mbParam.edged_height);
609            image_destroy(&pEnc->vGMC, pEnc->mbParam.edged_width,
610                                      pEnc->mbParam.edged_height);
611    
612          if ((pEnc->mbParam.plugin_flags & XVID_REQORIGINAL)) {          if ((pEnc->mbParam.plugin_flags & XVID_REQORIGINAL)) {
613                  image_destroy(&pEnc->sOriginal, pEnc->mbParam.edged_width,                  image_destroy(&pEnc->sOriginal, pEnc->mbParam.edged_width,
# Line 598  Line 629 
629      }      }
630    
631    
632      if (pEnc->num_plugins>0)      if (pEnc->num_plugins>0) {
     {  
633          xvid_plg_destroy_t pdestroy;          xvid_plg_destroy_t pdestroy;
634          memset(&pdestroy, 0, sizeof(xvid_plg_destroy_t));          memset(&pdestroy, 0, sizeof(xvid_plg_destroy_t));
635    
# Line 614  Line 644 
644          xvid_free(pEnc->plugins);          xvid_free(pEnc->plugins);
645      }      }
646    
647        if (pEnc->num_plugins>0)
648            xvid_free(pEnc->zones);
649    
650          xvid_free(pEnc);          xvid_free(pEnc);
651    
652          return 0;  /* ok */          return 0;  /* ok */
# Line 635  Line 668 
668      memset(&data, 0, sizeof(xvid_plg_data_t));      memset(&data, 0, sizeof(xvid_plg_data_t));
669      data.version = XVID_VERSION;      data.version = XVID_VERSION;
670    
671        /* find zone */
672        for(i=0; i<pEnc->num_zones && pEnc->zones[i].frame<=frame->frame_num; i++) ;
673        data.zone = i>0 ? &pEnc->zones[i-1] : NULL;
674    
675      data.width = pEnc->mbParam.width;      data.width = pEnc->mbParam.width;
676      data.height = pEnc->mbParam.height;      data.height = pEnc->mbParam.height;
677      data.mb_width = pEnc->mbParam.mb_width;      data.mb_width = pEnc->mbParam.mb_width;
# Line 642  Line 679 
679      data.fincr = frame->fincr;      data.fincr = frame->fincr;
680      data.fbase = pEnc->mbParam.fbase;      data.fbase = pEnc->mbParam.fbase;
681    
682        for (i=0; i<3; i++) {
683            data.min_quant[i] = pEnc->mbParam.min_quant[i];
684            data.max_quant[i] = pEnc->mbParam.max_quant[i];
685        }
686    
687      data.reference.csp = XVID_CSP_USER;      data.reference.csp = XVID_CSP_USER;
688      data.reference.plane[0] = pEnc->reference->image.y;      data.reference.plane[0] = pEnc->reference->image.y;
689      data.reference.plane[1] = pEnc->reference->image.u;      data.reference.plane[1] = pEnc->reference->image.u;
# Line 662  Line 704 
704    
705      if (opt == XVID_PLG_BEFORE) {      if (opt == XVID_PLG_BEFORE) {
706          data.type = XVID_TYPE_AUTO;          data.type = XVID_TYPE_AUTO;
707          data.quant = 2;          data.quant = 0;
708    
709                  if ((pEnc->mbParam.plugin_flags & XVID_REQDQUANTS)) {                  if ((pEnc->mbParam.plugin_flags & XVID_REQDQUANTS)) {
710              data.dquant = pEnc->temp_dquants;              data.dquant = pEnc->temp_dquants;
# Line 754  Line 796 
796      /* copy modified values back into frame*/      /* copy modified values back into frame*/
797      if (opt == XVID_PLG_BEFORE) {      if (opt == XVID_PLG_BEFORE) {
798          *type = data.type;          *type = data.type;
799          *quant = data.quant;          *quant = data.quant > 0 ? data.quant : 2;   /* default */
800    
801          if ((pEnc->mbParam.plugin_flags & XVID_REQDQUANTS)) {          if ((pEnc->mbParam.plugin_flags & XVID_REQDQUANTS)) {
802              for (j=0; j<pEnc->mbParam.mb_height; j++)              for (j=0; j<pEnc->mbParam.mb_height; j++)
# Line 1042  Line 1084 
1084                          type = MEanalysis(&pEnc->reference->image, pEnc->current,                          type = MEanalysis(&pEnc->reference->image, pEnc->current,
1085                                          &pEnc->mbParam, pEnc->mbParam.iMaxKeyInterval,                                          &pEnc->mbParam, pEnc->mbParam.iMaxKeyInterval,
1086                                          pEnc->iFrameNum, pEnc->bframenum_tail, xFrame->bframe_threshold);                                          pEnc->iFrameNum, pEnc->bframenum_tail, xFrame->bframe_threshold);
   
             if (type == B_VOP && !(pEnc->current->vop_flags & XVID_VOP_DYNAMIC_BFRAMES)) {  
                 type = P_VOP;   /* disable dynamic bframes */  
             }  
1087                  }                  }
1088          }          }
1089    
1090      /* bframes buffer overflow check */      /* bframes buffer overflow check */
1091      if (type != I_VOP) {      if (type == B_VOP && pEnc->bframenum_tail >= pEnc->mbParam.max_bframes) {
         if (pEnc->bframenum_tail >= pEnc->mbParam.max_bframes) {  
1092              type = P_VOP;              type = P_VOP;
         }else{  
             type = B_VOP;  
         }  
1093      }      }
1094    
1095          pEnc->iFrameNum++;          pEnc->iFrameNum++;
# Line 1353  Line 1387 
1387          }          }
1388          emms();          emms();
1389    
1390    /* XXX: Remove the two #if 0 blocks when we are sure we must always pad the stream */
1391    #if 0
1392          /* for divx5 compatibility, we must always pad between the packed p and b frames */          /* for divx5 compatibility, we must always pad between the packed p and b frames */
1393          if ((pEnc->mbParam.global_flags & XVID_GLOBAL_PACKED) && pEnc->bframenum_tail > 0)          if ((pEnc->mbParam.global_flags & XVID_GLOBAL_PACKED) && pEnc->bframenum_tail > 0)
1394    #endif
1395                  BitstreamPadAlways(bs);                  BitstreamPadAlways(bs);
1396    #if 0
1397          else          else
1398                  BitstreamPad(bs);                  BitstreamPad(bs);
1399    #endif
1400      pEnc->current->length = (BitstreamPos(bs) - bits) / 8;      pEnc->current->length = (BitstreamPos(bs) - bits) / 8;
1401    
1402          pEnc->fMvPrevSigma = -1;          pEnc->fMvPrevSigma = -1;
# Line 1754  Line 1793 
1793          }          }
1794          */          */
1795    
1796    /* XXX: Remove the two #if 0 blocks when we are sure we must always pad the stream */
1797    #if 0
1798          /* for divx5 compatibility, we must always pad between the packed p and b frames */          /* for divx5 compatibility, we must always pad between the packed p and b frames */
1799          if ((pEnc->mbParam.global_flags & XVID_GLOBAL_PACKED) && pEnc->bframenum_tail > 0)          if ((pEnc->mbParam.global_flags & XVID_GLOBAL_PACKED) && pEnc->bframenum_tail > 0)
1800    #endif
1801                  BitstreamPadAlways(bs);                  BitstreamPadAlways(bs);
1802    #if 0
1803          else          else
1804                  BitstreamPad(bs);                  BitstreamPad(bs);
1805    #endif
1806    
1807      pEnc->current->length = (BitstreamPos(bs) - bits) / 8;      pEnc->current->length = (BitstreamPos(bs) - bits) / 8;
1808    
# Line 1890  Line 1934 
1934    
1935          /* TODO: dynamic fcode/bcode ??? */          /* TODO: dynamic fcode/bcode ??? */
1936    
1937      BitstreamPad(bs);      BitstreamPadAlways(bs);
1938          frame->length = (BitstreamPos(bs) - bits) / 8;          frame->length = (BitstreamPos(bs) - bits) / 8;
1939    
1940  #ifdef BFRAMES_DEC_DEBUG  #ifdef BFRAMES_DEC_DEBUG

Legend:
Removed from v.1.95.2.16  
changed lines
  Added in v.1.95.2.23

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