[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.31, Mon Apr 29 06:45:55 2002 UTC revision 1.32, Wed May 1 13:00:01 2002 UTC
# Line 47  Line 47 
47  #include "global.h"  #include "global.h"
48  #include "utils/timer.h"  #include "utils/timer.h"
49  #include "image/image.h"  #include "image/image.h"
50    #include "motion/motion.h"
51  #include "bitstream/cbp.h"  #include "bitstream/cbp.h"
52  #include "utils/mbfunctions.h"  #include "utils/mbfunctions.h"
53  #include "bitstream/bitstream.h"  #include "bitstream/bitstream.h"
# Line 64  Line 65 
65    
66  static int FrameCodeI(Encoder * pEnc, Bitstream * bs, uint32_t *pBits);  static int FrameCodeI(Encoder * pEnc, Bitstream * bs, uint32_t *pBits);
67  static int FrameCodeP(Encoder * pEnc, Bitstream * bs, uint32_t *pBits, bool force_inter, bool vol_header);  static int FrameCodeP(Encoder * pEnc, Bitstream * bs, uint32_t *pBits, bool force_inter, bool vol_header);
68    static void FrameCodeB(Encoder * pEnc, FRAMEINFO * frame, Bitstream * bs, uint32_t *pBits);
69    
70  static int DQtab[4] =  static int DQtab[4] =
71  {  {
# Line 163  Line 165 
165          pEnc->mbParam.edged_width = 16 * pEnc->mbParam.mb_width + 2 * EDGE_SIZE;          pEnc->mbParam.edged_width = 16 * pEnc->mbParam.mb_width + 2 * EDGE_SIZE;
166          pEnc->mbParam.edged_height = 16 * pEnc->mbParam.mb_height + 2 * EDGE_SIZE;          pEnc->mbParam.edged_height = 16 * pEnc->mbParam.mb_height + 2 * EDGE_SIZE;
167    
168            pEnc->mbParam.fbase = pParam->fbase;
169            pEnc->mbParam.fincr = pParam->fincr;
170    
171          pEnc->sStat.fMvPrevSigma = -1;          pEnc->sStat.fMvPrevSigma = -1;
172    
173          /* Fill rate control parameters */          /* Fill rate control parameters */
# Line 189  Line 194 
194          pEnc->current->mbs = NULL;          pEnc->current->mbs = NULL;
195          pEnc->reference->mbs = NULL;          pEnc->reference->mbs = NULL;
196    
 #ifdef _DEBUG  
 #ifdef WIN32  
 OutputDebugString("malloc mbs");  
 #endif  
 #endif  
   
197          if ((pEnc->current->mbs = xvid_malloc(sizeof(MACROBLOCK) * pEnc->mbParam.mb_width * pEnc->mbParam.mb_height, CACHE_LINE)) == NULL ||          if ((pEnc->current->mbs = xvid_malloc(sizeof(MACROBLOCK) * pEnc->mbParam.mb_width * pEnc->mbParam.mb_height, CACHE_LINE)) == NULL ||
198                  (pEnc->reference->mbs = xvid_malloc(sizeof(MACROBLOCK) * pEnc->mbParam.mb_width * pEnc->mbParam.mb_height, CACHE_LINE)) == NULL)                  (pEnc->reference->mbs = xvid_malloc(sizeof(MACROBLOCK) * pEnc->mbParam.mb_width * pEnc->mbParam.mb_height, CACHE_LINE)) == NULL)
199          {          {
# Line 209  Line 208 
208  #ifdef _DEBUG  #ifdef _DEBUG
209          image_null(&pEnc->sOriginal);          image_null(&pEnc->sOriginal);
210  #endif  #endif
211    #ifdef BFRAMES
212            image_null(&pEnc->f_refh);
213            image_null(&pEnc->f_refv);
214            image_null(&pEnc->f_refhv);
215    #endif
216          image_null(&pEnc->current->image);          image_null(&pEnc->current->image);
217          image_null(&pEnc->reference->image);          image_null(&pEnc->reference->image);
218          image_null(&pEnc->vInterH);          image_null(&pEnc->vInterH);
# Line 217  Line 221 
221          image_null(&pEnc->vInterHV);          image_null(&pEnc->vInterHV);
222          image_null(&pEnc->vInterHVf);          image_null(&pEnc->vInterHVf);
223    
 #ifdef _DEBUG  
 #ifdef WIN32  
 OutputDebugString("malloc images");  
 #endif  
 #endif  
224          if (          if (
225  #ifdef _DEBUG  #ifdef _DEBUG
226                  image_create(&pEnc->sOriginal, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height) < 0 ||                  image_create(&pEnc->sOriginal, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height) < 0 ||
227  #endif  #endif
228    #ifdef BFRAMES
229                    image_create(&pEnc->f_refh, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height) < 0 ||
230                    image_create(&pEnc->f_refv, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height) < 0 ||
231                    image_create(&pEnc->f_refhv, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height) < 0 ||
232    #endif
233                  image_create(&pEnc->current->image, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height) < 0 ||                  image_create(&pEnc->current->image, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height) < 0 ||
234                  image_create(&pEnc->reference->image, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height) < 0 ||                  image_create(&pEnc->reference->image, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height) < 0 ||
235                  image_create(&pEnc->vInterH, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height) < 0 ||                  image_create(&pEnc->vInterH, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height) < 0 ||
# Line 237  Line 241 
241  #ifdef _DEBUG  #ifdef _DEBUG
242                  image_destroy(&pEnc->sOriginal, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);                  image_destroy(&pEnc->sOriginal, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);
243  #endif  #endif
244    #ifdef BFRAMES
245                    image_destroy(&pEnc->f_refh, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);
246                    image_destroy(&pEnc->f_refv, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);
247                    image_destroy(&pEnc->f_refhv, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);
248    #endif
249                  image_destroy(&pEnc->current->image, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);                  image_destroy(&pEnc->current->image, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);
250                  image_destroy(&pEnc->reference->image, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);                  image_destroy(&pEnc->reference->image, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);
251                  image_destroy(&pEnc->vInterH, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);                  image_destroy(&pEnc->vInterH, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);
# Line 251  Line 260 
260                  return XVID_ERR_MEMORY;                  return XVID_ERR_MEMORY;
261          }          }
262    
263    // ==============================================================================
264    #ifdef BFRAMES
265    
266            // TODO: handle malloc() == NULL
267            pEnc->max_bframes = pParam->max_bframes;
268            pEnc->bquant_ratio = pParam->bquant_ratio;
269            if (pEnc->max_bframes > 0)
270            {
271                    int n;
272    
273                    pEnc->bframes = malloc(pEnc->max_bframes * sizeof(FRAMEINFO *));
274    
275                    for (n = 0; n < pEnc->max_bframes; n++)
276                    {
277                            pEnc->bframes[n] = malloc(sizeof(FRAMEINFO));
278                            pEnc->bframes[n]->mbs = malloc(sizeof(MACROBLOCK) * pEnc->mbParam.mb_width * pEnc->mbParam.mb_height);
279    
280                            if (image_create(&pEnc->bframes[n]->image, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height) < 0)
281                            {
282                                    return XVID_ERR_MEMORY;
283                            }
284                    }
285            }
286            pEnc->bframenum_head = 0;
287            pEnc->bframenum_tail = 0;
288            pEnc->flush_bframes = 0;
289    
290            pEnc->mbParam.m_seconds = 0;
291            pEnc->mbParam.m_ticks = 0;
292    #endif
293    
294    
295    // ==============================================================================
296    
297    
298          pParam->handle = (void *)pEnc;          pParam->handle = (void *)pEnc;
299    
300          if (pParam->rc_bitrate)          if (pParam->rc_bitrate)
# Line 270  Line 314 
314  {  {
315          ENC_CHECK(pEnc);          ENC_CHECK(pEnc);
316    
317    // =================================================================
318    #ifdef BFRAMES
319            if (pEnc->max_bframes > 0)
320            {
321                    int n;
322                    for (n = 0; n < pEnc->max_bframes; n++)
323                    {
324                            image_destroy(&pEnc->bframes[n]->image, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);
325                            free(pEnc->bframes[n]->mbs);
326                            free(pEnc->bframes[n]);
327                    }
328                    free(pEnc->bframes);
329            }
330    #endif BFRAMES
331    //====================================================================
332    
333          image_destroy(&pEnc->current->image, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);          image_destroy(&pEnc->current->image, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);
334          image_destroy(&pEnc->reference->image, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);          image_destroy(&pEnc->reference->image, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);
335          image_destroy(&pEnc->vInterH, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);          image_destroy(&pEnc->vInterH, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);
# Line 277  Line 337 
337          image_destroy(&pEnc->vInterVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);          image_destroy(&pEnc->vInterVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);
338          image_destroy(&pEnc->vInterHV, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);          image_destroy(&pEnc->vInterHV, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);
339          image_destroy(&pEnc->vInterHVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);          image_destroy(&pEnc->vInterHVf, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);
340    #ifdef BFRAMES
341            image_destroy(&pEnc->f_refh, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);
342            image_destroy(&pEnc->f_refv, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);
343            image_destroy(&pEnc->f_refhv, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);
344    #endif
345  #ifdef _DEBUG  #ifdef _DEBUG
346                  image_destroy(&pEnc->sOriginal, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);                  image_destroy(&pEnc->sOriginal, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height);
347  #endif  #endif
# Line 290  Line 355 
355          return XVID_ERR_OK;          return XVID_ERR_OK;
356  }  }
357    
358    
359    
360    // ==================================================================
361    #ifdef BFRAMES
362    int encoder_encode(Encoder * pEnc, XVID_ENC_FRAME * pFrame, XVID_ENC_STATS * pResult)
363    {
364            uint16_t x, y;
365            Bitstream bs;
366            uint32_t bits;
367    
368            ENC_CHECK(pEnc);
369            ENC_CHECK(pFrame);
370    
371            start_global_timer();
372    
373            BitstreamInit(&bs, pFrame->bitstream, 0);
374    
375    // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
376    // bframe "flush" code
377    // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
378    
379            if ((pFrame->image == NULL || pEnc->flush_bframes) &&
380                    pEnc->bframenum_head < pEnc->bframenum_tail)
381            {
382    
383                    if (pEnc->flush_bframes == 0)
384                    {
385                            // we have reached end of stream without getting a future reference
386                            // .. so encode last final frame a pframe
387                            dprintf("--- PFRAME (final frame correction) --- ");
388                            pEnc->bframenum_tail--;
389                            SWAP(pEnc->current, pEnc->reference);
390    
391                            SWAP(pEnc->current, pEnc->bframes[pEnc->bframenum_tail]);
392    
393                            FrameCodeP(pEnc, &bs, &bits, 1, 0);
394    
395                            BitstreamPad(&bs);
396                            pFrame->length = BitstreamLength(&bs);
397                            pFrame->input_consumed = 0;
398                            pFrame->intra = 0;
399                            return XVID_ERR_OK;
400                    }
401    
402                    dprintf("--- BFRAME (flush) --- ");
403                    FrameCodeB(pEnc,
404                            pEnc->bframes[pEnc->bframenum_head],
405                             &bs, &bits);
406                    pEnc->bframenum_head++;
407    
408    
409                    BitstreamPad(&bs);
410                    pFrame->length = BitstreamLength(&bs);
411                    pFrame->input_consumed = 0;
412                    pFrame->intra = 0;
413                    return XVID_ERR_OK;
414            }
415    
416            if (pFrame->image == NULL)
417            {
418                    pFrame->length = 0;
419                    pFrame->input_consumed = 1;
420                    pFrame->intra = 0;
421                    return XVID_ERR_OK;
422            }
423    
424            if (pEnc->bframenum_head > 0)
425            {
426                    pEnc->bframenum_head = pEnc->bframenum_tail = 0;
427            }
428    
429            pEnc->flush_bframes = 0;
430    
431    // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
432    
433            SWAP(pEnc->current, pEnc->reference);
434    
435            pEnc->current->quant = (pFrame->quant == 0) ? RateControlGetQ(0) : pFrame->quant;
436            pEnc->current->global_flags = pFrame->general;
437            pEnc->current->motion_flags = pFrame->motion;
438            pEnc->current->seconds = pEnc->mbParam.m_seconds;
439            pEnc->current->ticks = pEnc->mbParam.m_ticks;
440            //@@@ TODO: dyanmic fcode (in both directions)
441            pEnc->current->fcode = pEnc->mbParam.m_fcode;
442            pEnc->current->bcode = pEnc->mbParam.m_fcode;
443    
444            start_timer();
445            if (image_input(&pEnc->current->image, pEnc->mbParam.width, pEnc->mbParam.height, pEnc->mbParam.edged_width,
446                            pFrame->image, pFrame->colorspace))
447            {
448                    return XVID_ERR_FORMAT;
449            }
450            stop_conv_timer();
451    
452    #ifdef _DEBUG
453            image_copy(&pEnc->sOriginal, &pEnc->sCurrent, pEnc->mbParam.edged_width, pEnc->mbParam.height);
454    #endif
455    
456    
457    // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
458    // lumi masking
459    // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
460    
461            if ((pEnc->current->global_flags & XVID_LUMIMASKING))
462            {
463                    int * temp_dquants = (int *) xvid_malloc(pEnc->mbParam.mb_width * pEnc->mbParam.mb_height * sizeof(int), CACHE_LINE);
464    
465                    pEnc->current->quant = adaptive_quantization(pEnc->current->image.y,
466                                                                pEnc->mbParam.edged_width,  // stride
467                                                                temp_dquants,
468                                                                pEnc->current->quant,
469                                                                pEnc->current->quant,       // min_quant
470                                                                2*pEnc->current->quant,     // max_quant
471                                                                pEnc->mbParam.mb_width,
472                                                                pEnc->mbParam.mb_height);
473    
474                    for (y = 0; y < pEnc->mbParam.mb_height; y++)
475                            for (x = 0; x < pEnc->mbParam.mb_width; x++)
476                            {
477                                    MACROBLOCK *pMB = &pEnc->current->mbs[x + y * pEnc->mbParam.mb_width];
478                                    pMB->dquant = iDQtab[(temp_dquants[y * pEnc->mbParam.mb_width + x] + 2)];
479                            }
480                    xvid_free(temp_dquants);
481            }
482    
483    
484    // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
485    // ivop/pvop/bvop selection
486    // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
487    
488            if (pEnc->iFrameNum == 0 ||
489                    pFrame->intra == 1 ||
490                    (pFrame->intra < 0 && (pEnc->iMaxKeyInterval > 0 && pEnc->iFrameNum >= pEnc->iMaxKeyInterval)) ||
491                    image_mad(&pEnc->reference->image, &pEnc->current->image, pEnc->mbParam.edged_width, pEnc->mbParam.width, pEnc->mbParam.height) > 30)
492            {
493                    dprintf("--- IFRAME ---");
494    
495                    FrameCodeI(pEnc, &bs, &bits);
496    
497                    pFrame->intra = 1;
498                    pEnc->flush_bframes = 1;
499    
500                    /* note: sequences like "IIBB" decode fine with msfdam but,
501                       go screwy with divx5.00 */
502            }
503            else if (pEnc->bframenum_tail >= pEnc->max_bframes)
504            {
505                    dprintf("--- PFRAME ---");
506    
507                    FrameCodeP(pEnc, &bs, &bits, 1, 0);
508                    pFrame->intra = 0;
509                    pEnc->flush_bframes = 1;
510            }
511            else
512            {
513                    dprintf("--- BFRAME (store) ---  head=%i tail=%i", pEnc->bframenum_head, pEnc->bframenum_tail);
514    
515                    if (pFrame->bquant < 1)
516                    {
517                            pEnc->current->quant = ((pEnc->reference->quant + pEnc->current->quant) * pEnc->bquant_ratio) / 200;
518                    }
519                    else
520                    {
521                            pEnc->current->quant = pFrame->bquant;
522                    }
523    
524                    // store frame into bframe buffer & swap ref back to current
525                    SWAP(pEnc->current, pEnc->bframes[pEnc->bframenum_tail]);
526                    SWAP(pEnc->current, pEnc->reference);
527    
528                    pEnc->bframenum_tail++;
529    
530                    pFrame->intra = 0;
531                    pFrame->length = 0;
532                    pFrame->input_consumed = 1;
533    
534                    pEnc->mbParam.m_ticks += pEnc->mbParam.fincr;
535                    if (pEnc->mbParam.m_ticks > pEnc->mbParam.fbase)
536                    {
537                            pEnc->mbParam.m_seconds++;
538                            pEnc->mbParam.m_ticks = 0;
539                    }
540                    return XVID_ERR_OK;
541            }
542    
543            BitstreamPad(&bs);
544            pFrame->length = BitstreamLength(&bs);
545    
546            if (pResult)
547            {
548                    pResult->quant = pEnc->current->quant;
549                    pResult->hlength = pFrame->length - (pEnc->sStat.iTextBits / 8);
550                    pResult->kblks = pEnc->sStat.kblks;
551                    pResult->mblks = pEnc->sStat.mblks;
552                    pResult->ublks = pEnc->sStat.ublks;
553            }
554    
555    #ifdef _DEBUG
556            psnr = image_psnr(&pEnc->sOriginal, &pEnc->current->image, pEnc->mbParam.edged_width,
557                                    pEnc->mbParam.width, pEnc->mbParam.height);
558    
559            sprintf(temp, "PSNR: %f\n", psnr);
560            DEBUG(temp);
561    #endif
562    
563            if (pFrame->quant == 0)
564            {
565                    RateControlUpdate(pEnc->current->quant, pFrame->length, pFrame->intra);
566            }
567    
568            pEnc->iFrameNum++;
569            pEnc->mbParam.m_ticks += pEnc->mbParam.fincr;
570            if (pEnc->mbParam.m_ticks > pEnc->mbParam.fbase)
571            {
572                    pEnc->mbParam.m_seconds++;
573                    pEnc->mbParam.m_ticks = 0;
574            }
575            pFrame->input_consumed = 1;
576    
577            stop_global_timer();
578            write_timer();
579    
580            return XVID_ERR_OK;
581    }
582    // ==================================================================
583    #else
584  int encoder_encode(Encoder * pEnc, XVID_ENC_FRAME * pFrame, XVID_ENC_STATS * pResult)  int encoder_encode(Encoder * pEnc, XVID_ENC_FRAME * pFrame, XVID_ENC_STATS * pResult)
585  {  {
586          uint16_t x, y;          uint16_t x, y;
# Line 443  Line 734 
734    
735          return XVID_ERR_OK;          return XVID_ERR_OK;
736  }  }
737    #endif
738    
739    
740  static __inline void CodeIntraMB(Encoder *pEnc, MACROBLOCK *pMB) {  static __inline void CodeIntraMB(Encoder *pEnc, MACROBLOCK *pMB) {
# Line 931  Line 1223 
1223  }  }
1224    
1225    
1226  #if 0  #ifdef BFRAMES
   
1227  static void FrameCodeB(Encoder * pEnc, FRAMEINFO * frame, Bitstream * bs, uint32_t *pBits)  static void FrameCodeB(Encoder * pEnc, FRAMEINFO * frame, Bitstream * bs, uint32_t *pBits)
1228  {  {
1229          int16_t dct_codes[6][64];      int16_t dct_codes[6*64];
1230          int16_t qcoeff[6][64];      int16_t qcoeff[6*64];
1231          uint32_t x, y;          uint32_t x, y;
1232          VECTOR forward;          VECTOR forward;
1233          VECTOR backward;          VECTOR backward;
# Line 944  Line 1235 
1235          IMAGE *f_ref = &pEnc->reference->image;          IMAGE *f_ref = &pEnc->reference->image;
1236          IMAGE *b_ref = &pEnc->current->image;          IMAGE *b_ref = &pEnc->current->image;
1237    
1238          /* forward  */          // forward
1239          image_setedges(f_ref, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height, pEnc->mbParam.width, pEnc->mbParam.height);          image_setedges(f_ref, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height, pEnc->mbParam.width, pEnc->mbParam.height, frame->global_flags & XVID_INTERLACING);
1240          start_timer();          start_timer();
1241          image_interpolate(f_ref, &pEnc->f_refh, &pEnc->f_refv, &pEnc->f_refhv,          image_interpolate(f_ref, &pEnc->f_refh, &pEnc->f_refv, &pEnc->f_refhv,
1242                            pEnc->mbParam.edged_width, pEnc->mbParam.edged_height, 0);                            pEnc->mbParam.edged_width, pEnc->mbParam.edged_height, 0);
1243          stop_inter_timer();          stop_inter_timer();
1244    
1245          /* backward */          // backward
1246          image_setedges(b_ref, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height, pEnc->mbParam.width, pEnc->mbParam.height);          image_setedges(b_ref, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height, pEnc->mbParam.width, pEnc->mbParam.height, frame->global_flags & XVID_INTERLACING);
1247          start_timer();          start_timer();
1248          image_interpolate(b_ref, &pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV,          image_interpolate(b_ref, &pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV,
1249                            pEnc->mbParam.edged_width, pEnc->mbParam.edged_height, 0);                            pEnc->mbParam.edged_width, pEnc->mbParam.edged_height, 0);
# Line 963  Line 1254 
1254                               pEnc->reference->mbs, f_ref, &pEnc->f_refh, &pEnc->f_refv, &pEnc->f_refhv,                               pEnc->reference->mbs, f_ref, &pEnc->f_refh, &pEnc->f_refv, &pEnc->f_refhv,
1255                               pEnc->current->mbs, b_ref, &pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV);                               pEnc->current->mbs, b_ref, &pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV);
1256    
1257    
1258          stop_motion_timer();          stop_motion_timer();
1259    
1260          if (test_quant_type(&pEnc->mbParam, pEnc->current))          /*if (test_quant_type(&pEnc->mbParam, pEnc->current))
1261          {          {
1262                  BitstreamWriteVolHeader(bs, pEnc->mbParam.width, pEnc->mbParam.height, pEnc->mbParam.quant_type);                  BitstreamWriteVolHeader(bs, pEnc->mbParam.width, pEnc->mbParam.height, pEnc->mbParam.quant_type);
1263          }          }*/
1264    
1265          frame->coding_type = B_VOP;          frame->coding_type = B_VOP;
1266          BitstreamWriteVopHeader(bs, B_VOP, frame->tick, 0,      BitstreamWriteVopHeader(bs, &pEnc->mbParam, frame);
                                 frame->quant, frame->fcode, frame->bcode);  
1267    
1268          *pBits = BitstreamPos(bs);          *pBits = BitstreamPos(bs);
1269    
# Line 1011  Line 1302 
1302                                                   dct_codes);                                                   dct_codes);
1303    
1304                          mb->quant = frame->quant;                          mb->quant = frame->quant;
1305                          mb->cbp = MBTransQuantInter(&pEnc->mbParam, frame, x, y, dct_codes, qcoeff);                          mb->cbp = MBTransQuantInter(&pEnc->mbParam, frame, mb, x, y, dct_codes, qcoeff);
1306                          //mb->cbp = MBTransQuantBVOP(&pEnc->mbParam, x, y, dct_codes, qcoeff, &frame->image, frame->quant);                          //mb->cbp = MBTransQuantBVOP(&pEnc->mbParam, x, y, dct_codes, qcoeff, &frame->image, frame->quant);
1307    
1308    
# Line 1039  Line 1330 
1330                                  backward.y = mb->b_mvs[0].y;                                  backward.y = mb->b_mvs[0].y;
1331                          }                          }
1332    
1333                          /*  //                      printf("[%i %i] M=%i CBP=%i MVX=%i MVY=%i %i,%i  %i,%i\n", x, y, pMB->mode, pMB->cbp, pMB->mvs[0].x, bmb->pmvs[0].x, bmb->pmvs[0].y, forward.x, forward.y);
                           printf("[%i %i] M=%i CBP=%i MVX=%i MVY=%i %i,%i  %i,%i\n",  
                                x,  
                                y,  
                                pMB->mode,  
                                pMB->cbp,  
                                pMB->mvs[0].x,  
                                bmb->pmvs[0].x,  
                                bmb->pmvs[0].y,  
                                forward.x,  
                                forward.y);  
                         */  
1334    
1335                          start_timer();                          start_timer();
1336                          MBCodingBVOP(frame, mb, qcoeff, bs, &pEnc->sStat);                          MBCodingBVOP(mb, qcoeff, frame->fcode, frame->bcode, bs, &pEnc->sStat);
1337                          stop_coding_timer();                          stop_coding_timer();
1338                  }                  }
1339          }          }
# Line 1063  Line 1343 
1343          // TODO: dynamic fcode/bcode ???          // TODO: dynamic fcode/bcode ???
1344    
1345          *pBits = BitstreamPos(bs) - *pBits;          *pBits = BitstreamPos(bs) - *pBits;
   
1346  }  }
   
1347  #endif  #endif

Legend:
Removed from v.1.31  
changed lines
  Added in v.1.32

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