reservoir.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:5k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /**********************************************************************
  2.  * ISO MPEG Audio Subgroup Software Simulation Group (1996)
  3.  * ISO 13818-3 MPEG-2 Audio Encoder - Lower Sampling Frequency Extension
  4.  *
  5.  **********************************************************************/
  6. /*
  7.   Revision History:
  8.   Date        Programmer                Comment
  9.   ==========  ========================= ===============================
  10.   1995/09/06  mc@fivebats.com           created
  11. */
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <math.h>
  15. #include <assert.h>
  16. #include "util.h"
  17. #ifdef HAVEGTK
  18. #include "gtkanal.h"
  19. #endif
  20. /*
  21.   Layer3 bit reservoir:
  22.   Described in C.1.5.4.2.2 of the IS
  23. */
  24. static int ResvSize = 0; /* in bits */
  25. static int ResvMax  = 0; /* in bits */
  26. /*
  27.   ResvFrameBegin:
  28.   Called (repeatedly) at the beginning of a frame. Updates the maximum
  29.   size of the reservoir, and checks to make sure main_data_begin
  30.   was set properly by the formatter
  31. */
  32. int
  33. ResvFrameBegin(lame_global_flags *gfp,III_side_info_t *l3_side, int mean_bits, int frameLength )
  34. {
  35.     int fullFrameBits;
  36.     int resvLimit;
  37.     if (gfp->frameNum==0) {
  38.       ResvSize=0;
  39.     }
  40.     if ( gfp->version == 1 )
  41.     {
  42. resvLimit = 4088; /* main_data_begin has 9 bits in MPEG 1 */
  43.     }
  44.     else
  45.     {
  46. resvLimit = 2040; /* main_data_begin has 8 bits in MPEG 2 */
  47.     }
  48.     /*
  49.       main_data_begin was set by the formatter to the
  50.       expected value for the next call -- this should
  51.       agree with our reservoir size
  52.     */
  53. #ifdef DEBUG
  54.     fprintf( stderr, ">>> ResvSize = %dn", ResvSize );
  55. #endif
  56.     /* check expected resvsize */
  57.     assert( (l3_side->main_data_begin * 8) == ResvSize );
  58.     fullFrameBits = mean_bits * gfp->mode_gr + ResvSize;
  59.     /*
  60.       determine maximum size of reservoir:
  61.       ResvMax + frameLength <= 7680;
  62.     */
  63.     if ( frameLength > 7680 )
  64. ResvMax = 0;
  65.     else
  66. ResvMax = 7680 - frameLength;
  67.     if (gfp->disable_reservoir) ResvMax=0;
  68.     /*
  69.       limit max size to resvLimit bits because
  70.       main_data_begin cannot indicate a
  71.       larger value
  72.       */
  73.     if ( ResvMax > resvLimit )
  74. ResvMax = resvLimit;
  75. #ifdef HAVEGTK
  76.   if (gfp->gtkflag){
  77.     pinfo->mean_bits=mean_bits/2;  /* expected bits per channel per granule */
  78.     pinfo->resvsize=ResvSize;
  79.   }
  80. #endif
  81.     return fullFrameBits;
  82. }
  83. /*
  84.   ResvMaxBits2:
  85.   As above, but now it *really* is bits per granule (both channels).  
  86.   Mark Taylor 4/99
  87. */
  88. void ResvMaxBits(int mean_bits, int *targ_bits, int *extra_bits, int gr)
  89. {
  90.   int add_bits;
  91.   *targ_bits = mean_bits ;
  92.   /* extra bits if the reservoir is almost full */
  93.   if (ResvSize > ((ResvMax * 9) / 10)) {
  94.     add_bits= ResvSize-((ResvMax * 9) / 10);
  95.     *targ_bits += add_bits;
  96.   }else {
  97.     add_bits =0 ;
  98.     /* build up reservoir.  this builds the reservoir a little slower
  99.      * than FhG.  It could simple be mean_bits/15, but this was rigged
  100.      * to always produce 100 (the old value) at 128kbs */
  101.     *targ_bits -= (int) (mean_bits/15.2);
  102.   }
  103.   
  104.   /* amount from the reservoir we are allowed to use. ISO says 6/10 */
  105.   *extra_bits =    
  106.     (ResvSize  < (ResvMax*6)/10  ? ResvSize : (ResvMax*6)/10);
  107.   *extra_bits -= add_bits;
  108.   
  109.   if (*extra_bits < 0) *extra_bits=0;
  110.   
  111. }
  112. /*
  113.   ResvAdjust:
  114.   Called after a granule's bit allocation. Readjusts the size of
  115.   the reservoir to reflect the granule's usage.
  116. */
  117. void
  118. ResvAdjust(lame_global_flags *gfp,gr_info *gi, III_side_info_t *l3_side, int mean_bits )
  119. {
  120.     ResvSize += (mean_bits / gfp->stereo) - gi->part2_3_length;
  121. }
  122. /*
  123.   ResvFrameEnd:
  124.   Called after all granules in a frame have been allocated. Makes sure
  125.   that the reservoir size is within limits, possibly by adding stuffing
  126.   bits. Note that stuffing bits are added by increasing a granule's
  127.   part2_3_length. The bitstream formatter will detect this and write the
  128.   appropriate stuffing bits to the bitstream.
  129. */
  130. void
  131. ResvFrameEnd(lame_global_flags *gfp,III_side_info_t *l3_side, int mean_bits)
  132. {
  133.     int stuffingBits;
  134.     int over_bits;
  135.     /* just in case mean_bits is odd, this is necessary... */
  136.     if ( gfp->stereo == 2 && mean_bits & 1)
  137. ResvSize += 1;
  138.     over_bits = ResvSize - ResvMax;
  139.     if ( over_bits < 0 )
  140. over_bits = 0;
  141.     
  142.     ResvSize -= over_bits;
  143.     stuffingBits = over_bits;
  144.     /* we must be byte aligned */
  145.     if ( (over_bits = ResvSize % 8) )
  146.     {
  147. stuffingBits += over_bits;
  148. ResvSize -= over_bits;
  149.     }
  150.     l3_side->resvDrain = stuffingBits;
  151.     return;
  152. }