[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.57, Fri Dec 12 09:58:40 2003 UTC revision 1.95.2.65, Mon Mar 29 17:37:55 2004 UTC
# Line 123  Line 123 
123          if (create->width%2 || create->height%2)          if (create->width%2 || create->height%2)
124                  return XVID_ERR_FAIL;                  return XVID_ERR_FAIL;
125    
126            if (create->width<=0 || create->height<=0)
127                    return XVID_ERR_FAIL;
128    
129          /* allocate encoder struct */          /* allocate encoder struct */
130    
131          pEnc = (Encoder *) xvid_malloc(sizeof(Encoder), CACHE_LINE);          pEnc = (Encoder *) xvid_malloc(sizeof(Encoder), CACHE_LINE);
# Line 652  Line 655 
655                  data.max_quant[i] = pEnc->mbParam.max_quant[i];                  data.max_quant[i] = pEnc->mbParam.max_quant[i];
656          }          }
657    
658          data.reference.csp = XVID_CSP_USER;          data.reference.csp = XVID_CSP_PLANAR;
659          data.reference.plane[0] = pEnc->reference->image.y;          data.reference.plane[0] = pEnc->reference->image.y;
660          data.reference.plane[1] = pEnc->reference->image.u;          data.reference.plane[1] = pEnc->reference->image.u;
661          data.reference.plane[2] = pEnc->reference->image.v;          data.reference.plane[2] = pEnc->reference->image.v;
# Line 660  Line 663 
663          data.reference.stride[1] = pEnc->mbParam.edged_width/2;          data.reference.stride[1] = pEnc->mbParam.edged_width/2;
664          data.reference.stride[2] = pEnc->mbParam.edged_width/2;          data.reference.stride[2] = pEnc->mbParam.edged_width/2;
665    
666          data.current.csp = XVID_CSP_USER;          data.current.csp = XVID_CSP_PLANAR;
667          data.current.plane[0] = frame->image.y;          data.current.plane[0] = frame->image.y;
668          data.current.plane[1] = frame->image.u;          data.current.plane[1] = frame->image.u;
669          data.current.plane[2] = frame->image.v;          data.current.plane[2] = frame->image.v;
# Line 690  Line 693 
693    
694          } else { /* XVID_PLG_AFTER */          } else { /* XVID_PLG_AFTER */
695                  if ((pEnc->mbParam.plugin_flags & XVID_REQORIGINAL)) {                  if ((pEnc->mbParam.plugin_flags & XVID_REQORIGINAL)) {
696                          data.original.csp = XVID_CSP_USER;                          data.original.csp = XVID_CSP_PLANAR;
697                          data.original.plane[0] = original->y;                          data.original.plane[0] = original->y;
698                          data.original.plane[1] = original->u;                          data.original.plane[1] = original->u;
699                          data.original.plane[2] = original->v;                          data.original.plane[2] = original->v;
# Line 740  Line 743 
743                  data.mblks = frame->sStat.mblks;                  data.mblks = frame->sStat.mblks;
744                  data.ublks = frame->sStat.ublks;                  data.ublks = frame->sStat.ublks;
745    
746                  if (stats) {                  /* New code */
747                          stats->type = coding2type(frame->coding_type);                  data.stats.type      = coding2type(frame->coding_type);
748                          stats->quant = frame->quant;                  data.stats.quant     = frame->quant;
749                          stats->vol_flags = frame->vol_flags;                  data.stats.vol_flags = frame->vol_flags;
750                          stats->vop_flags = frame->vop_flags;                  data.stats.vop_flags = frame->vop_flags;
751                          stats->length = frame->length;                  data.stats.length    = frame->length;
752                          stats->hlength = frame->length - (frame->sStat.iTextBits / 8);                  data.stats.hlength   = frame->length - (frame->sStat.iTextBits / 8);
753                          stats->kblks = frame->sStat.kblks;                  data.stats.kblks     = frame->sStat.kblks;
754                          stats->mblks = frame->sStat.mblks;                  data.stats.mblks     = frame->sStat.mblks;
755                          stats->ublks = frame->sStat.ublks;                  data.stats.ublks     = frame->sStat.ublks;
756                          stats->sse_y = data.sse_y;                  data.stats.sse_y     = data.sse_y;
757                          stats->sse_u = data.sse_u;                  data.stats.sse_u     = data.sse_u;
758                          stats->sse_v = data.sse_v;                  data.stats.sse_v     = data.sse_v;
759                  }  
760                    if (stats)
761                            *stats = data.stats;
762          }          }
763    
764          /* call plugins */          /* call plugins */
# Line 848  Line 853 
853          pCur->ticks = (int32_t)pCur->stamp % time_base;          pCur->ticks = (int32_t)pCur->stamp % time_base;
854                  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) ;
855    
856                  /* HEAVY DEBUG OUTPUT remove when timecodes prove to be stable */  #if 0   /* HEAVY DEBUG OUTPUT */
857            fprintf(stderr,"WriteVop:   %d - %d \n",
 /*              fprintf(stderr,"WriteVop:   %d - %d \n",  
858                          ((int32_t)pCur->stamp / time_base), ((int32_t)pRef->stamp / time_base));                          ((int32_t)pCur->stamp / time_base), ((int32_t)pRef->stamp / time_base));
859                  fprintf(stderr,"set_timecodes: VOP %1d   stamp=%lld ref_stamp=%lld  base=%d\n",                  fprintf(stderr,"set_timecodes: VOP %1d   stamp=%lld ref_stamp=%lld  base=%d\n",
860                          pCur->coding_type, pCur->stamp, pRef->stamp, time_base);                          pCur->coding_type, pCur->stamp, pRef->stamp, time_base);
861                  fprintf(stderr,"set_timecodes: VOP %1d   seconds=%d   ticks=%d   (ref-sec=%d  ref-tick=%d)\n",                  fprintf(stderr,"set_timecodes: VOP %1d   seconds=%d   ticks=%d   (ref-sec=%d  ref-tick=%d)\n",
862                          pCur->coding_type, pCur->seconds, pCur->ticks, pRef->seconds, pRef->ticks);                          pCur->coding_type, pCur->seconds, pCur->ticks, pRef->seconds, pRef->ticks);
863    #endif
864    }
865    
866  */  static int
867    gcd(int a, int b)
868    {
869            int r ;
870    
871            if (b > a) {
872                    r = a;
873                    a = b;
874                    b = r;
875            }
876    
877            while ((r = a % b)) {
878                    a = b;
879                    b = r;
880            }
881            return b;
882    }
883    
884    static void
885    simplify_par(int *par_width, int *par_height)
886    {
887    
888            int _par_width  = (!*par_width)  ? 1 : (*par_width<0)  ? -*par_width:  *par_width;
889            int _par_height = (!*par_height) ? 1 : (*par_height<0) ? -*par_height: *par_height;
890            int divisor = gcd(_par_width, _par_height);
891    
892            _par_width  /= divisor;
893            _par_height /= divisor;
894    
895            /* 2^8 precision maximum */
896            if (_par_width>255 || _par_height>255) {
897                    float div;
898                    emms();
899                    if (_par_width>_par_height)
900                            div = (float)_par_width/255;
901                    else
902                            div = (float)_par_height/255;
903    
904                    _par_width  = (int)((float)_par_width/div);
905                    _par_height = (int)((float)_par_height/div);
906  }  }
907    
908            *par_width = _par_width;
909            *par_height = _par_height;
910    
911            return;
912    }
913    
914    
915  /*****************************************************************************  /*****************************************************************************
# Line 1074  Line 1124 
1124    
1125          pEnc->current->fincr = pEnc->mbParam.fincr>0 ? pEnc->mbParam.fincr : frame->fincr;          pEnc->current->fincr = pEnc->mbParam.fincr>0 ? pEnc->mbParam.fincr : frame->fincr;
1126          inc_frame_num(pEnc);          inc_frame_num(pEnc);
1127          pEnc->current->vol_flags = pEnc->mbParam.vol_flags;          pEnc->current->vol_flags = frame->vol_flags;
1128          pEnc->current->vop_flags = frame->vop_flags;          pEnc->current->vop_flags = frame->vop_flags;
1129          pEnc->current->motion_flags = frame->motion;          pEnc->current->motion_flags = frame->motion;
1130          pEnc->current->fcode = pEnc->mbParam.m_fcode;          pEnc->current->fcode = pEnc->mbParam.m_fcode;
# Line 1109  Line 1159 
1159                  }                  }
1160          }          }
1161    
1162            if (type != I_VOP)
1163                    pEnc->current->vol_flags = pEnc->mbParam.vol_flags; /* don't allow VOL changes here */
1164    
1165          /* bframes buffer overflow check */          /* bframes buffer overflow check */
1166          if (type == B_VOP && pEnc->bframenum_tail >= pEnc->mbParam.max_bframes) {          if (type == B_VOP && pEnc->bframenum_tail >= pEnc->mbParam.max_bframes) {
1167                  type = P_VOP;                  type = P_VOP;
# Line 1221  Line 1274 
1274                  pEnc->iFrameNum = 1;                  pEnc->iFrameNum = 1;
1275    
1276                  /* ---- update vol flags at IVOP ----------- */                  /* ---- update vol flags at IVOP ----------- */
1277                  pEnc->current->vol_flags = pEnc->mbParam.vol_flags = frame->vol_flags;                  pEnc->mbParam.vol_flags = pEnc->current->vol_flags;
1278    
1279                    /* Aspect ratio */
1280                  switch(frame->par) {                  switch(frame->par) {
                 case 0:  
                         pEnc->mbParam.par = XVID_PAR_11_VGA;  
                         break;  
1281                  case XVID_PAR_11_VGA:                  case XVID_PAR_11_VGA:
1282                  case XVID_PAR_43_PAL:                  case XVID_PAR_43_PAL:
1283                  case XVID_PAR_43_NTSC:                  case XVID_PAR_43_NTSC:
# Line 1235  Line 1287 
1287                          pEnc->mbParam.par = frame->par;                          pEnc->mbParam.par = frame->par;
1288                          break;                          break;
1289                  default:                  default:
1290                          pEnc->mbParam.par = XVID_PAR_EXT;                          pEnc->mbParam.par = XVID_PAR_11_VGA;
1291                          break;                          break;
1292                  }                  }
1293                  pEnc->mbParam.par_width = (frame->par_width)?frame->par_width:1;  
1294                  pEnc->mbParam.par_height = (frame->par_height)?frame->par_height:1;                  /* For extended PAR only, we try to sanityse/simplify par values */
1295                    if (pEnc->mbParam.par == XVID_PAR_EXT) {
1296                            pEnc->mbParam.par_width  = frame->par_width;
1297                            pEnc->mbParam.par_height = frame->par_height;
1298                            simplify_par(&pEnc->mbParam.par_width, &pEnc->mbParam.par_height);
1299                    }
1300    
1301                  if ((pEnc->mbParam.vol_flags & XVID_VOL_MPEGQUANT)) {                  if ((pEnc->mbParam.vol_flags & XVID_VOL_MPEGQUANT)) {
1302                          if (frame->quant_intra_matrix != NULL)                          if (frame->quant_intra_matrix != NULL)
# Line 1386  Line 1443 
1443                  start_timer();                  start_timer();
1444                  image_setedges(&pEnc->current->image,                  image_setedges(&pEnc->current->image,
1445                          pEnc->mbParam.edged_width, pEnc->mbParam.edged_height,                          pEnc->mbParam.edged_width, pEnc->mbParam.edged_height,
1446                          pEnc->mbParam.width, pEnc->mbParam.height);                          pEnc->mbParam.width, pEnc->mbParam.height, 0);
1447                  stop_edges_timer();                  stop_edges_timer();
1448          }          }
1449    
# Line 1398  Line 1455 
1455    
1456          SetMacroblockQuants(&pEnc->mbParam, pEnc->current);          SetMacroblockQuants(&pEnc->mbParam, pEnc->current);
1457    
1458          BitstreamWriteVolHeader(bs, &pEnc->mbParam);          BitstreamWriteVolHeader(bs, &pEnc->mbParam, pEnc->current);
1459    
1460          set_timecodes(pEnc->current,pEnc->reference,pEnc->mbParam.fbase);          set_timecodes(pEnc->current,pEnc->reference,pEnc->mbParam.fbase);
1461    
# Line 1497  Line 1554 
1554          if (!reference->is_edged) {          if (!reference->is_edged) {
1555                  start_timer();                  start_timer();
1556                  image_setedges(pRef, pParam->edged_width, pParam->edged_height,                  image_setedges(pRef, pParam->edged_width, pParam->edged_height,
1557                                             pParam->width, pParam->height);                                             pParam->width, pParam->height, 0);
1558                  stop_edges_timer();                  stop_edges_timer();
1559                  reference->is_edged = 1;                  reference->is_edged = 1;
1560          }          }
# Line 1593  Line 1650 
1650    
1651          set_timecodes(current,reference,pParam->fbase);          set_timecodes(current,reference,pParam->fbase);
1652          if (vol_header)          if (vol_header)
1653          {       BitstreamWriteVolHeader(bs, &pEnc->mbParam);          {       BitstreamWriteVolHeader(bs, &pEnc->mbParam, current);
1654                  BitstreamPad(bs);                  BitstreamPad(bs);
1655          }          }
1656    
# Line 1895  Line 1952 
1952          if (!pEnc->reference->is_edged) {          if (!pEnc->reference->is_edged) {
1953                  image_setedges(f_ref, pEnc->mbParam.edged_width,                  image_setedges(f_ref, pEnc->mbParam.edged_width,
1954                                             pEnc->mbParam.edged_height, pEnc->mbParam.width,                                             pEnc->mbParam.edged_height, pEnc->mbParam.width,
1955                                             pEnc->mbParam.height);                                             pEnc->mbParam.height, 0);
1956                  pEnc->current->is_edged = 1;                  pEnc->current->is_edged = 1;
1957          }          }
1958    
# Line 1912  Line 1969 
1969          if (!pEnc->current->is_edged) {          if (!pEnc->current->is_edged) {
1970                  image_setedges(b_ref, pEnc->mbParam.edged_width,                  image_setedges(b_ref, pEnc->mbParam.edged_width,
1971                                             pEnc->mbParam.edged_height, pEnc->mbParam.width,                                             pEnc->mbParam.edged_height, pEnc->mbParam.width,
1972                                             pEnc->mbParam.height);                                             pEnc->mbParam.height, 0);
1973                  pEnc->current->is_edged = 1;                  pEnc->current->is_edged = 1;
1974          }          }
1975    

Legend:
Removed from v.1.95.2.57  
changed lines
  Added in v.1.95.2.65

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