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

Diff of /xvidcore/src/bitstream/bitstream.c

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

revision 1.8, Wed May 1 13:00:02 2002 UTC revision 1.13, Thu May 9 00:15:51 2002 UTC
# Line 41  Line 41 
41    *                                                                                                                                                        *    *                                                                                                                                                        *
42    *  Revision history:                                                         *    *  Revision history:                                                         *
43    *                                                                                                                                                        *    *                                                                                                                                                        *
44    *  01.05.2002 added BVOP support to BitstreamWriteVopHeader    *  08.05.2002  add low_delay support for B_VOP decode                                            *
45      *              MinChen <chenm001@163.com>                                    *
46      *  06.05.2002 low_delay                                                      *
47      *  06.05.2002 fixed fincr/fbase error                                        *
48      *  01.05.2002 added BVOP support to BitstreamWriteVopHeader                  *
49    *  15.04.2002 rewrite log2bin use asm386  By MinChen <chenm001@163.com>      *    *  15.04.2002 rewrite log2bin use asm386  By MinChen <chenm001@163.com>      *
50    *  26.03.2002 interlacing support                                                                                        *    *  26.03.2002 interlacing support                                                                                        *
51    *  03.03.2002 qmatrix writing                                                                                            *    *  03.03.2002 qmatrix writing                                                                                            *
# Line 58  Line 62 
62  #include "../quant/quant_matrix.h"  #include "../quant/quant_matrix.h"
63    
64    
65  static int __inline log2bin(int value)  static uint32_t __inline log2bin(uint32_t value)
66  {  {
67  /* Changed by Chenm001 */  /* Changed by Chenm001 */
68  #ifndef WIN32  #ifndef WIN32
# Line 115  Line 119 
119  returns coding_type, or -1 if error  returns coding_type, or -1 if error
120  */  */
121    
122  int BitstreamReadHeaders(Bitstream * bs, DECODER * dec, uint32_t * rounding, uint32_t * quant, uint32_t * fcode, uint32_t * intra_dc_threshold)  int BitstreamReadHeaders(Bitstream * bs, DECODER * dec, uint32_t * rounding, uint32_t * quant, uint32_t * fcode_forward, uint32_t * fcode_backward, uint32_t * intra_dc_threshold)
123  {  {
124          uint32_t vol_ver_id;          uint32_t vol_ver_id;
125          uint32_t time_inc_resolution;          static uint32_t time_increment_resolution;
126          uint32_t coding_type;          uint32_t coding_type;
127          uint32_t start_code;          uint32_t start_code;
128            uint32_t time_incr=0;
129            int32_t  time_increment;
130    
131          do          do
132          {          {
# Line 220  Line 226 
226                          {                          {
227                                  DEBUG("+ vol_control_parameters");                                  DEBUG("+ vol_control_parameters");
228                                  BitstreamSkip(bs, 2);                                           // chroma_format                                  BitstreamSkip(bs, 2);                                           // chroma_format
229                                  BitstreamSkip(bs, 1);                                           // low_delay                                  dec->low_delay=BitstreamGetBit(bs);                     // low_delay
230                                  if (BitstreamGetBit(bs))                                        // vbv_parameters                                  if (BitstreamGetBit(bs))                                        // vbv_parameters
231                                  {                                  {
232                                          DEBUG("+ vbv_parameters");                                          DEBUG("+ vbv_parameters");
# Line 249  Line 255 
255    
256                          READ_MARKER();                          READ_MARKER();
257    
258                          time_inc_resolution = BitstreamGetBits(bs, 16); // vop_time_increment_resolution  // *************************** for decode B-frame time ***********************
259                          time_inc_resolution--;                          time_increment_resolution = BitstreamGetBits(bs, 16);   // vop_time_increment_resolution
260                          if (time_inc_resolution > 0)                          time_increment_resolution--;
261                            //DEBUG1("time_increment_resolution=",time_increment_resolution);
262                            if (time_increment_resolution > 0)
263                          {                          {
264                                  dec->time_inc_bits = log2bin(time_inc_resolution);                                  dec->time_inc_bits = log2bin(time_increment_resolution);
265                          }                          }
266                          else                          else
267                          {                          {
# Line 417  Line 425 
425                                          }                                          }
426                                  }                                  }
427    
428                                  if (BitstreamGetBit(bs))        // scalability                                  if ((dec->scalability=BitstreamGetBit(bs)))     // scalability
429                                  {                                  {
430                                          // TODO                                          // TODO
431                                          DEBUG("TODO: scalability");                                          DEBUG("TODO: scalability");
# Line 463  Line 471 
471                          coding_type = BitstreamGetBits(bs, 2);          // vop_coding_type                          coding_type = BitstreamGetBits(bs, 2);          // vop_coding_type
472                          //DEBUG1("coding_type", coding_type);                          //DEBUG1("coding_type", coding_type);
473    
474                          while (BitstreamGetBit(bs) != 0) ;                      // time_base  // *************************** for decode B-frame time ***********************
475                            while (BitstreamGetBit(bs) != 0)                        // time_base
476                                    time_incr++;
477    
478                          READ_MARKER();                          READ_MARKER();
479    
# Line 471  Line 481 
481                          //DEBUG1("vop_time_incr", BitstreamShowBits(bs, dec->time_inc_bits));                          //DEBUG1("vop_time_incr", BitstreamShowBits(bs, dec->time_inc_bits));
482                          if (dec->time_inc_bits)                          if (dec->time_inc_bits)
483                          {                          {
484                                  BitstreamSkip(bs, dec->time_inc_bits);  // vop_time_increment                                  //BitstreamSkip(bs, dec->time_inc_bits);        // vop_time_increment
485                                    time_increment = (BitstreamGetBits(bs, dec->time_inc_bits));    // vop_time_increment
486                            }
487                            if(coding_type != B_VOP){
488                                dec->last_time_base = dec->time_base;
489                                    dec->time_base += time_incr;
490                                    dec->time = dec->time_base*time_increment_resolution + time_increment;
491                                    dec->time_pp= (uint32_t)(dec->time - dec->last_non_b_time);
492                                    dec->last_non_b_time= dec->time;
493                            }else{
494                                    dec->time = (dec->last_time_base + time_incr)*time_increment_resolution + time_increment;
495                                    dec->time_bp= (uint32_t)(dec->last_non_b_time - dec->time);
496                          }                          }
497                            //DEBUG1("time_increment=",time_increment);
498    
499                          READ_MARKER();                          READ_MARKER();
500    
# Line 486  Line 508 
508                          }                          }
509                          */                          */
510    
511                          if (coding_type != I_VOP)                          // fix a little bug by MinChen <chenm002@163.com>
512                            if ((dec->shape != VIDOBJLAY_SHAPE_BINARY_ONLY) && (coding_type == P_VOP))
513                          {                          {
514                                  *rounding = BitstreamGetBit(bs);        // rounding_type                                  *rounding = BitstreamGetBit(bs);        // rounding_type
515                                  //DEBUG1("rounding", *rounding);                                  //DEBUG1("rounding", *rounding);
# Line 540  Line 563 
563                                  }                                  }
564                          }                          }
565    
566                          *quant = BitstreamGetBits(bs, dec->quant_bits);         // vop_quant                          if((*quant = BitstreamGetBits(bs, dec->quant_bits)) < 1)                // vop_quant
567                                    *quant = 1;
568    
569                          //DEBUG1("quant", *quant);                          //DEBUG1("quant", *quant);
570    
571                          if (coding_type != I_VOP)                          if (coding_type != I_VOP)
572                          {                          {
573                                  *fcode = BitstreamGetBits(bs, 3);                       // fcode_forward                                  *fcode_forward = BitstreamGetBits(bs, 3);               // fcode_forward
574                          }                          }
575    
576                          if (coding_type == B_VOP)                          if (coding_type == B_VOP)
577                          {                          {
578                                  // *fcode_backward = BitstreamGetBits(bs, 3);           // fcode_backward                                  *fcode_backward = BitstreamGetBits(bs, 3);              // fcode_backward
579                            }
580                            if (!dec->scalability){
581                                    if ((dec->shape != VIDOBJLAY_SHAPE_RECTANGULAR) && (coding_type != I_VOP)){
582                                            BitstreamSkip(bs, 1);           // vop_shape_coding_type
583                                    }
584                          }                          }
585                          return coding_type;                          return coding_type;
586                  }                  }
# Line 615  Line 645 
645          BitstreamPutBits(bs, 0, 8);                     // video_object_type_indication          BitstreamPutBits(bs, 0, 8);                     // video_object_type_indication
646          BitstreamPutBit(bs, 0);                         // is_object_layer_identified (0=not given)          BitstreamPutBit(bs, 0);                         // is_object_layer_identified (0=not given)
647          BitstreamPutBits(bs, 1, 4);                     // aspect_ratio_info (1=1:1)          BitstreamPutBits(bs, 1, 4);                     // aspect_ratio_info (1=1:1)
648          BitstreamPutBit(bs, 0);                         // vol_control_parameters (0=not given)  
649    #ifdef BFRAMES
650            if (pParam->max_bframes > 0)
651            {
652                    dprintf("low_delay=1");
653                    BitstreamPutBit(bs, 1);                         // vol_control_parameters
654                    BitstreamPutBits(bs, 1, 2);                     // chroma_format 1="4:2:0"
655                    BitstreamPutBit(bs, 0);                         // low_delay
656                    BitstreamPutBit(bs, 0);                         // vbv_parameters (0=not given)
657            }
658            else
659    #endif
660            {
661                    BitstreamPutBits(bs, 0, 1);                     // vol_control_parameters (0=not given)
662            }
663    
664    
665          BitstreamPutBits(bs, 0, 2);                     // video_object_layer_shape (0=rectangular)          BitstreamPutBits(bs, 0, 2);                     // video_object_layer_shape (0=rectangular)
666    
667          WRITE_MARKER();          WRITE_MARKER();
# Line 625  Line 671 
671                          25fps           res=25          inc=1                          25fps           res=25          inc=1
672                          29.97fps        res=30000       inc=1001                          29.97fps        res=30000       inc=1001
673          */          */
674    #ifdef BFRAMES
675            BitstreamPutBits(bs, pParam->fbase, 16);
676    #else
677          BitstreamPutBits(bs, 2, 16);          BitstreamPutBits(bs, 2, 16);
678    #endif
679    
680          WRITE_MARKER();          WRITE_MARKER();
681    
# Line 707  Line 757 
757    
758          // time_increment: value=nth_of_sec, nbits = log2(resolution)          // time_increment: value=nth_of_sec, nbits = log2(resolution)
759  #ifdef BFRAMES  #ifdef BFRAMES
760          BitstreamPutBits(bs, frame->ticks, 5);          BitstreamPutBits(bs, frame->ticks, log2bin(pParam->fbase));
761          dprintf("[%i:%i] %c\n", frame->seconds, frame->ticks, frame->coding_type == I_VOP ? 'I' : frame->coding_type == P_VOP ? 'P' : 'B');          dprintf("[%i:%i] %c\n", frame->seconds, frame->ticks, frame->coding_type == I_VOP ? 'I' : frame->coding_type == P_VOP ? 'P' : 'B');
762  #else  #else
763          BitstreamPutBits(bs, 1, 1);          BitstreamPutBits(bs, 1, 1);
# Line 717  Line 767 
767    
768          BitstreamPutBits(bs, 1, 1);                             // vop_coded          BitstreamPutBits(bs, 1, 1);                             // vop_coded
769    
770          if (frame->coding_type != I_VOP)          if (frame->coding_type == P_VOP)
771                  BitstreamPutBits(bs, frame->rounding_type, 1);                  BitstreamPutBits(bs, frame->rounding_type, 1);
772    
773          BitstreamPutBits(bs, 0, 3);                             // intra_dc_vlc_threshold          BitstreamPutBits(bs, 0, 3);                             // intra_dc_vlc_threshold

Legend:
Removed from v.1.8  
changed lines
  Added in v.1.13

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