| /********************************************************************** |
| * ISO MPEG Audio Subgroup Software Simulation Group (1996) |
| * ISO 13818-3 MPEG-2 Audio Encoder - Lower Sampling Frequency Extension |
| * |
| **********************************************************************/ |
| /* |
| Revision History: |
| |
| Date Programmer Comment |
| ========== ========================= =============================== |
| 1995/09/06 mc@fivebats.com created |
| |
| */ |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <math.h> |
| #include <assert.h> |
| #include "util.h" |
| #ifdef HAVEGTK |
| #include "gtkanal.h" |
| #endif |
| |
| |
| /* |
| Layer3 bit reservoir: |
| Described in C.1.5.4.2.2 of the IS |
| */ |
| |
| static int ResvSize = 0; /* in bits */ |
| static int ResvMax = 0; /* in bits */ |
| |
| /* |
| ResvFrameBegin: |
| Called (repeatedly) at the beginning of a frame. Updates the maximum |
| size of the reservoir, and checks to make sure main_data_begin |
| was set properly by the formatter |
| */ |
| int |
| ResvFrameBegin(lame_global_flags *gfp,III_side_info_t *l3_side, int mean_bits, int frameLength ) |
| { |
| int fullFrameBits; |
| int resvLimit; |
| |
| if (gfp->frameNum==0) { |
| ResvSize=0; |
| } |
| |
| |
| if ( gfp->version == 1 ) |
| { |
| resvLimit = 4088; /* main_data_begin has 9 bits in MPEG 1 */ |
| } |
| else |
| { |
| resvLimit = 2040; /* main_data_begin has 8 bits in MPEG 2 */ |
| } |
| |
| /* |
| main_data_begin was set by the formatter to the |
| expected value for the next call -- this should |
| agree with our reservoir size |
| */ |
| |
| #ifdef DEBUG |
| fprintf( stderr, ">>> ResvSize = %d\n", ResvSize ); |
| #endif |
| /* check expected resvsize */ |
| assert( (l3_side->main_data_begin * 8) == ResvSize ); |
| fullFrameBits = mean_bits * gfp->mode_gr + ResvSize; |
| |
| /* |
| determine maximum size of reservoir: |
| ResvMax + frameLength <= 7680; |
| */ |
| if ( frameLength > 7680 ) |
| ResvMax = 0; |
| else |
| ResvMax = 7680 - frameLength; |
| if (gfp->disable_reservoir) ResvMax=0; |
| |
| |
| /* |
| limit max size to resvLimit bits because |
| main_data_begin cannot indicate a |
| larger value |
| */ |
| if ( ResvMax > resvLimit ) |
| ResvMax = resvLimit; |
| |
| #ifdef HAVEGTK |
| if (gfp->gtkflag){ |
| pinfo->mean_bits=mean_bits/2; /* expected bits per channel per granule */ |
| pinfo->resvsize=ResvSize; |
| } |
| #endif |
| |
| return fullFrameBits; |
| } |
| |
| |
| /* |
| ResvMaxBits2: |
| As above, but now it *really* is bits per granule (both channels). |
| Mark Taylor 4/99 |
| */ |
| void ResvMaxBits(int mean_bits, int *targ_bits, int *extra_bits, int gr) |
| { |
| int add_bits; |
| *targ_bits = mean_bits ; |
| /* extra bits if the reservoir is almost full */ |
| if (ResvSize > ((ResvMax * 9) / 10)) { |
| add_bits= ResvSize-((ResvMax * 9) / 10); |
| *targ_bits += add_bits; |
| }else { |
| add_bits =0 ; |
| /* build up reservoir. this builds the reservoir a little slower |
| * than FhG. It could simple be mean_bits/15, but this was rigged |
| * to always produce 100 (the old value) at 128kbs */ |
| *targ_bits -= (int) (mean_bits/15.2); |
| } |
| |
| |
| /* amount from the reservoir we are allowed to use. ISO says 6/10 */ |
| *extra_bits = |
| (ResvSize < (ResvMax*6)/10 ? ResvSize : (ResvMax*6)/10); |
| *extra_bits -= add_bits; |
| |
| if (*extra_bits < 0) *extra_bits=0; |
| |
| |
| } |
| |
| /* |
| ResvAdjust: |
| Called after a granule's bit allocation. Readjusts the size of |
| the reservoir to reflect the granule's usage. |
| */ |
| void |
| ResvAdjust(lame_global_flags *gfp,gr_info *gi, III_side_info_t *l3_side, int mean_bits ) |
| { |
| ResvSize += (mean_bits / gfp->stereo) - gi->part2_3_length; |
| } |
| |
| |
| /* |
| ResvFrameEnd: |
| Called after all granules in a frame have been allocated. Makes sure |
| that the reservoir size is within limits, possibly by adding stuffing |
| bits. Note that stuffing bits are added by increasing a granule's |
| part2_3_length. The bitstream formatter will detect this and write the |
| appropriate stuffing bits to the bitstream. |
| */ |
| void |
| ResvFrameEnd(lame_global_flags *gfp,III_side_info_t *l3_side, int mean_bits) |
| { |
| int stuffingBits; |
| int over_bits; |
| |
| /* just in case mean_bits is odd, this is necessary... */ |
| if ( gfp->stereo == 2 && mean_bits & 1) |
| ResvSize += 1; |
| |
| over_bits = ResvSize - ResvMax; |
| if ( over_bits < 0 ) |
| over_bits = 0; |
| |
| ResvSize -= over_bits; |
| stuffingBits = over_bits; |
| |
| /* we must be byte aligned */ |
| if ( (over_bits = ResvSize % 8) ) |
| { |
| stuffingBits += over_bits; |
| ResvSize -= over_bits; |
| } |
| |
| |
| l3_side->resvDrain = stuffingBits; |
| return; |
| |
| } |
| |
| |