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

mpeg/mp3

开发平台:

Visual C++

  1. /*
  2. (c) Copyright 1998, 1999 - Tord Jansson
  3. =======================================
  4. This file is part of the BladeEnc MP3 Encoder, based on
  5. ISO's reference code for MPEG Layer 3 compression, and might
  6. contain smaller or larger sections that are directly taken
  7. from ISO's reference code.
  8. All changes to the ISO reference code herein are either
  9. copyrighted by Tord Jansson (tord.jansson@swipnet.se)
  10. or sublicensed to Tord Jansson by a third party.
  11. BladeEnc is free software; you can redistribute this file
  12. and/or modify it under the terms of the GNU Lesser General Public
  13. License as published by the Free Software Foundation; either
  14. version 2.1 of the License, or (at your option) any later version.
  15. */
  16. #include <stdio.h>
  17. #include <stdlib.h>
  18. #include <math.h>
  19. #include <assert.h>
  20. #include "l3side.h"
  21. #include "loop.h"
  22. #include "huffman.h"
  23. #include "l3bitstream.h"
  24. #include "reservoir.h"
  25. /*
  26.   Layer3 bit reservoir:
  27.   Described in C.1.5.4.2.2 of the IS
  28. */
  29. static int ResvSize = 0; /* in bits */
  30. static int ResvMax  = 0; /* in bits */
  31. void fixStatic_reservoir( void )
  32. {
  33. ResvSize = 0;
  34. ResvMax = 0;
  35. }
  36. /*
  37.   ResvFrameBegin:
  38.   Called at the beginning of a frame. Updates the maximum
  39.   size of the reservoir, and checks to make sure main_data_begin
  40.   was set properly by the formatter
  41. */
  42. void
  43. ResvFrameBegin( frame_params *fr_ps, III_side_info_t *l3_side, int mean_bits, int frameLength )
  44. {
  45.   layer *info;
  46.   int fullFrameBits, mode_gr;
  47.   int expectedResvSize, resvLimit;
  48.   info = fr_ps->header;
  49. mode_gr = 2;
  50. resvLimit = 4088; /* main_data_begin has 9 bits in MPEG 1 */
  51.   /*
  52.     main_data_begin was set by the formatter to the
  53.     expected value for the next call -- this should
  54.     agree with our reservoir size
  55.   */
  56.   expectedResvSize = l3_side->main_data_begin * 8;
  57. /*  assert( expectedResvSize == ResvSize ); */
  58.   fullFrameBits = mean_bits * mode_gr;
  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.     /*
  68.       limit max size to resvLimit bits because
  69.       main_data_begin cannot indicate a
  70.       larger value
  71.       */
  72.   if ( ResvMax > resvLimit )
  73. ResvMax = resvLimit;
  74. }
  75. /*
  76.   ResvMaxBits:
  77.   Called at the beginning of each granule to get the max bit
  78.   allowance for the current granule based on reservoir size
  79.   and perceptual entropy.
  80. */
  81. int
  82. ResvMaxBits( frame_params *fr_ps, III_side_info_t *l3_side, double *pe, int mean_bits )
  83. {
  84.     int more_bits, max_bits, add_bits, over_bits;
  85.     mean_bits /= fr_ps->stereo;
  86.     max_bits = mean_bits;
  87.     if ( max_bits > 4095 )
  88. max_bits = 4095;
  89.     if ( ResvMax == 0 )
  90. return max_bits;
  91.     more_bits = (int) (*pe * 3.1 - mean_bits);
  92.     add_bits = 0;
  93.     if ( more_bits > 100 )
  94.     {
  95. int frac = (ResvSize * 6) / 10;
  96. if ( frac < more_bits )
  97.     add_bits = frac;
  98. else
  99.     add_bits = more_bits;
  100.     }
  101.     over_bits = ResvSize - ((ResvMax * 8) / 10) - add_bits;
  102.     if ( over_bits > 0 )
  103. add_bits += over_bits;
  104.     max_bits += add_bits;
  105.     if ( max_bits > 4095 )
  106. max_bits = 4095;
  107.     return max_bits;
  108. }
  109. /*
  110.   ResvAdjust:
  111.   Called after a granule's bit allocation. Readjusts the size of
  112.   the reservoir to reflect the granule's usage.
  113. */
  114. void
  115. ResvAdjust( frame_params *fr_ps, gr_info *gi, III_side_info_t *l3_side, int mean_bits )
  116. {
  117.     ResvSize += (mean_bits / fr_ps->stereo) - gi->part2_3_length;
  118. }
  119. /*
  120.   ResvFrameEnd:
  121.   Called after all granules in a frame have been allocated. Makes sure
  122.   that the reservoir size is within limits, possibly by adding stuffing
  123.   bits. Note that stuffing bits are added by increasing a granule's
  124.   part2_3_length. The bitstream formatter will detect this and write the
  125.   appropriate stuffing bits to the bitstream.
  126. */
  127. void
  128. ResvFrameEnd( frame_params *fr_ps, III_side_info_t *l3_side, int mean_bits )
  129. {
  130.     layer *info;
  131.     gr_info *gi;
  132.     int mode_gr, gr, ch, stereo, ancillary_pad, stuffingBits;
  133.     int over_bits;
  134.     info   = fr_ps->header;
  135.     stereo = fr_ps->stereo;
  136.     mode_gr = 2;
  137.     ancillary_pad = 0;
  138.     /* just in case mean_bits is odd, this is necessary... */
  139.     if ( (stereo == 2) && (mean_bits & 1) )
  140. ResvSize += 1;
  141.     over_bits = ResvSize - ResvMax;
  142.     if ( over_bits < 0 )
  143. over_bits = 0;
  144.     
  145.     ResvSize -= over_bits;
  146.     stuffingBits = over_bits + ancillary_pad;
  147.     /* we must be byte aligned */
  148.     if ( (over_bits = ResvSize % 8) )
  149.     {
  150. stuffingBits += over_bits;
  151. ResvSize -= over_bits;
  152.     }
  153.     if ( stuffingBits )
  154.     {
  155. /*
  156.   plan a: put all into the first granule
  157.   This was preferred by someone designing a
  158.   real-time decoder...
  159. */
  160. gi = (gr_info *) &(l3_side->gr[0].ch[0]);
  161. if ( gi->part2_3_length + stuffingBits < 4095 )
  162.     gi->part2_3_length += stuffingBits;
  163. else
  164. {
  165.     /* plan b: distribute throughout the granules */
  166.     for (gr = 0; gr < mode_gr; gr++ )
  167. for (ch = 0; ch < stereo; ch++ )
  168. {
  169.     int extraBits, bitsThisGr;
  170.     gr_info *gi = (gr_info *) &(l3_side->gr[gr].ch[ch]);
  171.     if ( stuffingBits == 0 )
  172. break;
  173.     extraBits = 4095 - gi->part2_3_length;
  174.     bitsThisGr = extraBits < stuffingBits ? extraBits : stuffingBits;
  175.     gi->part2_3_length += bitsThisGr;
  176.     stuffingBits -= bitsThisGr;
  177. }
  178.     /*
  179.       If any stuffing bits remain, we elect to spill them
  180.       into ancillary data. The bitstream formatter will do this if
  181.       l3side->resvDrain is set
  182.     */
  183.     l3_side->resvDrain = stuffingBits;
  184. }
  185.     }
  186. }