reservoir.c
上传用户:njqiyou
上传日期:2007-01-08
资源大小:574k
文件大小:6k
源码类别:

mpeg/mp3

开发平台:

C/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.  * $Id: reservoir.c,v 1.1 1996/02/14 04:04:23 rowlands Exp $
  6.  *
  7.  * $Log: reservoir.c,v $
  8.  * Revision 1.1  1996/02/14 04:04:23  rowlands
  9.  * Initial revision
  10.  *
  11.  * Received from Mike Coleman
  12.  **********************************************************************/
  13. /*
  14.   Revision History:
  15.   Date        Programmer                Comment
  16.   ==========  ========================= ===============================
  17.   1995/09/06  mc@fivebats.com           created
  18. */
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #include <math.h>
  22. #include <assert.h>
  23. #include "l3side.h"
  24. #include "loop.h"
  25. #include "huffman.h"
  26. #include "l3bitstream.h"
  27. #include "reservoir.h"
  28. /*
  29.   Layer3 bit reservoir:
  30.   Described in C.1.5.4.2.2 of the IS
  31. */
  32. static int ResvSize = 0; /* in bits */
  33. static int ResvMax  = 0; /* in bits */
  34. /*
  35.   ResvFrameBegin:
  36.   Called at the beginning of a frame. Updates the maximum
  37.   size of the reservoir, and checks to make sure main_data_begin
  38.   was set properly by the formatter
  39. */
  40. void
  41. ResvFrameBegin( frame_params *fr_ps, III_side_info_t *l3_side, int mean_bits, int frameLength )
  42. {
  43.     layer *info;
  44.     int fullFrameBits, mode_gr;
  45.     int expectedResvSize, resvLimit;
  46.     info = fr_ps->header;
  47.     if ( info->version == 1 )
  48.     {
  49. mode_gr = 2;
  50. resvLimit = 4088; /* main_data_begin has 9 bits in MPEG 1 */
  51.     }
  52.     else
  53.     {
  54. mode_gr = 1;
  55. resvLimit = 2040; /* main_data_begin has 8 bits in MPEG 2 */
  56.     }
  57.     /*
  58.       main_data_begin was set by the formatter to the
  59.       expected value for the next call -- this should
  60.       agree with our reservoir size
  61.     */
  62.     expectedResvSize = l3_side->main_data_begin * 8;
  63. #ifdef DEBUG
  64.     fprintf( stderr, ">>> ResvSize = %dn", ResvSize );
  65. #endif
  66.     assert( expectedResvSize == ResvSize );
  67.     fullFrameBits = mean_bits * mode_gr;
  68.     /*
  69.       determine maximum size of reservoir:
  70.       ResvMax + frameLength <= 7680;
  71.     */
  72.     if ( frameLength > 7680 )
  73. ResvMax = 0;
  74.     else
  75. ResvMax = 7680 - frameLength;
  76.     /*
  77.       limit max size to resvLimit bits because
  78.       main_data_begin cannot indicate a
  79.       larger value
  80.       */
  81.     if ( ResvMax > resvLimit )
  82. ResvMax = resvLimit;
  83. }
  84. /*
  85.   ResvMaxBits:
  86.   Called at the beginning of each granule to get the max bit
  87.   allowance for the current granule based on reservoir size
  88.   and perceptual entropy.
  89. */
  90. int
  91. ResvMaxBits( frame_params *fr_ps, III_side_info_t *l3_side, double *pe, int mean_bits )
  92. {
  93.     int more_bits, max_bits, add_bits, over_bits;
  94.     mean_bits /= fr_ps->stereo;
  95.     max_bits = mean_bits;
  96.     if ( max_bits > 4095 )
  97. max_bits = 4095;
  98.     if ( ResvMax == 0 )
  99. return max_bits;
  100.     more_bits = *pe * 3.1 - mean_bits;
  101.     add_bits = 0;
  102.     if ( more_bits > 100 )
  103.     {
  104. int frac = (ResvSize * 6) / 10;
  105. if ( frac < more_bits )
  106.     add_bits = frac;
  107. else
  108.     add_bits = more_bits;
  109.     }
  110.     over_bits = ResvSize - ((ResvMax * 8) / 10) - add_bits;
  111.     if ( over_bits > 0 )
  112. add_bits += over_bits;
  113.     max_bits += add_bits;
  114.     if ( max_bits > 4095 )
  115. max_bits = 4095;
  116.     return max_bits;
  117. }
  118. /*
  119.   ResvAdjust:
  120.   Called after a granule's bit allocation. Readjusts the size of
  121.   the reservoir to reflect the granule's usage.
  122. */
  123. void
  124. ResvAdjust( frame_params *fr_ps, gr_info *gi, III_side_info_t *l3_side, int mean_bits )
  125. {
  126.     ResvSize += (mean_bits / fr_ps->stereo) - gi->part2_3_length;
  127. }
  128. /*
  129.   ResvFrameEnd:
  130.   Called after all granules in a frame have been allocated. Makes sure
  131.   that the reservoir size is within limits, possibly by adding stuffing
  132.   bits. Note that stuffing bits are added by increasing a granule's
  133.   part2_3_length. The bitstream formatter will detect this and write the
  134.   appropriate stuffing bits to the bitstream.
  135. */
  136. void
  137. ResvFrameEnd( frame_params *fr_ps, III_side_info_t *l3_side, int mean_bits )
  138. {
  139.     layer *info;
  140.     gr_info *gi;
  141.     int mode_gr, gr, ch, stereo, ancillary_pad, stuffingBits;
  142.     int over_bits;
  143.     info   = fr_ps->header;
  144.     stereo = fr_ps->stereo;
  145.     mode_gr = (info->version == 1) ? 2 : 1;
  146.     ancillary_pad = 0;
  147. #if 1
  148.     /* just in case mean_bits is odd, this is necessary... */
  149.     if ( (stereo == 2) && (mean_bits & 1) )
  150. ResvSize += 1;
  151. #endif
  152.     over_bits = ResvSize - ResvMax;
  153.     if ( over_bits < 0 )
  154. over_bits = 0;
  155.     
  156.     ResvSize -= over_bits;
  157.     stuffingBits = over_bits + ancillary_pad;
  158.     /* we must be byte aligned */
  159.     if ( (over_bits = ResvSize % 8) )
  160.     {
  161. stuffingBits += over_bits;
  162. ResvSize -= over_bits;
  163.     }
  164.     if ( stuffingBits )
  165.     {
  166. /*
  167.   plan a: put all into the first granule
  168.   This was preferred by someone designing a
  169.   real-time decoder...
  170. */
  171. gi = (gr_info *) &(l3_side->gr[0].ch[0]);
  172. if ( gi->part2_3_length + stuffingBits < 4095 )
  173.     gi->part2_3_length += stuffingBits;
  174. else
  175. {
  176.     /* plan b: distribute throughout the granules */
  177.     for (gr = 0; gr < mode_gr; gr++ )
  178. for (ch = 0; ch < stereo; ch++ )
  179. {
  180.     int extraBits, bitsThisGr;
  181.     gr_info *gi = (gr_info *) &(l3_side->gr[gr].ch[ch]);
  182.     if ( stuffingBits == 0 )
  183. break;
  184.     extraBits = 4095 - gi->part2_3_length;
  185.     bitsThisGr = extraBits < stuffingBits ? extraBits : stuffingBits;
  186.     gi->part2_3_length += bitsThisGr;
  187.     stuffingBits -= bitsThisGr;
  188. }
  189.     /*
  190.       If any stuffing bits remain, we elect to spill them
  191.       into ancillary data. The bitstream formatter will do this if
  192.       l3side->resvDrain is set
  193.     */
  194. #ifdef DEBUG
  195.     if ( stuffingBits )
  196. fprintf( stderr, "spilling %d stuffing bits into ancillary datan", stuffingBits );
  197. #endif
  198.     l3_side->resvDrain = stuffingBits;
  199. }
  200.     }
  201. }