/* * bit reservoir source file * * Copyright (c) 1999-2000 Mark Taylor * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* $Id: reservoir.c,v 1.29.2.2 2005/11/26 18:37:34 bouvigne Exp $ */ #ifdef HAVE_CONFIG_H # include <config.h> #endif #include <assert.h> #include "bitstream.h" #include "reservoir.h" #ifdef WITH_DMALLOC #include <dmalloc.h> #endif /* 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 */ /* * Background information: * * This is the original text from the ISO standard. Because of * sooo many bugs and irritations correcting comments are added * in brackets []. A '^W' means you should remove the last word. * * 1) The following rule can be used to calculate the maximum * number of bits used for one granule [^W frame]: * At the highest possible bitrate of Layer III (320 kbps * per stereo signal [^W^W^W], 48 kHz) the frames must be of * [^W^W^W are designed to have] constant length, i.e. * one buffer [^W^W the frame] length is: * * 320 kbps * 1152/48 kHz = 7680 bit = 960 byte * * This value is used as the maximum buffer per channel [^W^W] at * lower bitrates [than 320 kbps]. At 64 kbps mono or 128 kbps * stereo the main granule length is 64 kbps * 576/48 kHz = 768 bit * [per granule and channel] at 48 kHz sampling frequency. * This means that there is a maximum deviation (short time buffer * [= reservoir]) of 7680 - 2*2*768 = 4608 bits is allowed at 64 kbps. * The actual deviation is equal to the number of bytes [with the * meaning of octets] denoted by the main_data_end offset pointer. * The actual maximum deviation is (2^9-1)*8 bit = 4088 bits * [for MPEG-1 and (2^8-1)*8 bit for MPEG-2, both are hard limits]. * ... The xchange of buffer bits between the left and right channel * is allowed without restrictions [exception: dual channel]. * Because of the [constructed] constraint on the buffer size * main_data_end is always set to 0 in the case of bit_rate_index==14, * i.e. data rate 320 kbps per stereo signal [^W^W^W]. In this case * all data are allocated between adjacent header [^W sync] words * [, i.e. there is no buffering at all]. */ int ResvFrameBegin(lame_global_flags *gfp, int *mean_bits) { lame_internal_flags *gfc=gfp->internal_flags; int fullFrameBits; int resvLimit; int maxmp3buf; III_side_info_t *l3_side = &gfc->l3_side; int frameLength; frameLength = getframebits(gfp); *mean_bits = (frameLength - gfc->sideinfo_len * 8) / gfc->mode_gr; /* * Meaning of the variables: * resvLimit: (0, 8, ..., 8*255 (MPEG-2), 8*511 (MPEG-1)) * Number of bits can be stored in previous frame(s) due to * counter size constaints * maxmp3buf: ( ??? ... 8*1951 (MPEG-1 and 2), 8*2047 (MPEG-2.5)) * Number of bits allowed to encode one frame (you can take 8*511 bit * from the bit reservoir and at most 8*1440 bit from the current * frame (320 kbps, 32 kHz), so 8*1951 bit is the largest possible * value for MPEG-1 and -2) * * maximum allowed granule/channel size times 4 = 8*2047 bits., * so this is the absolute maximum supported by the format. * * * fullFrameBits: maximum number of bits available for encoding * the current frame. * * mean_bits: target number of bits per granule. * * frameLength: * * gfc->ResvMax: maximum allowed reservoir * * gfc->ResvSize: current reservoir size * * l3_side->resvDrain_pre: * ancillary data to be added to previous frame: * (only usefull in VBR modes if it is possible to have * maxmp3buf < fullFrameBits)). Currently disabled, * see #define NEW_DRAIN * * l3_side->resvDrain_post: * ancillary data to be added to this frame: * */ /* main_data_begin has 9 bits in MPEG-1, 8 bits MPEG-2 */ resvLimit = (8*256)*gfc->mode_gr-8; /* maximum allowed frame size. dont use more than this number of bits, even if the frame has the space for them: */ if (gfp->brate > 320) { /* in freeformat the buffer is constant*/ maxmp3buf = 8*((int)((gfp->brate*1000)/(gfp->out_samplerate / (FLOAT)1152)/8 +.5)); } else { /*all mp3 decoders should have enough buffer to handle this value: size of a 320kbps 32kHz frame*/ maxmp3buf = 8*1440; /* Bouvigne suggests this more lax interpretation of the ISO doc instead of using 8*960. */ if (gfp->strict_ISO) maxmp3buf = 8*((int)(320000/(gfp->out_samplerate / (FLOAT)1152)/8 +.5)); } gfc->ResvMax = maxmp3buf - frameLength; if (gfc->ResvMax > resvLimit) gfc->ResvMax = resvLimit; if (gfc->ResvMax < 0 || gfp->disable_reservoir) gfc->ResvMax = 0; fullFrameBits = *mean_bits * gfc->mode_gr + Min ( gfc->ResvSize, gfc->ResvMax ); if (fullFrameBits > maxmp3buf) fullFrameBits = maxmp3buf; assert ( 0 == gfc->ResvMax % 8 ); assert ( gfc->ResvMax >= 0 ); l3_side->resvDrain_pre = 0; #ifdef HAVE_GTK if (gfc->pinfo != NULL) { gfc->pinfo->mean_bits = *mean_bits / 2; /* expected bits per channel per granule [is this also right for mono/stereo, MPEG-1/2 ?] */ gfc->pinfo->resvsize = gfc->ResvSize; } #endif return fullFrameBits; } /* ResvMaxBits returns targ_bits: target number of bits to use for 1 granule extra_bits: amount extra available from reservoir Mark Taylor 4/99 */ void ResvMaxBits(lame_global_flags *gfp, int mean_bits, int *targ_bits, int *extra_bits, int cbr) { lame_internal_flags *gfc=gfp->internal_flags; int add_bits; int ResvSize = gfc->ResvSize, ResvMax = gfc->ResvMax; /* conpensate the saved bits used in the 1st granule */ if (cbr) ResvSize += mean_bits; if (gfc->substep_shaping & 1) ResvMax *= 0.9; *targ_bits = mean_bits ; /* extra bits if the reservoir is almost full */ if (ResvSize*10 > ResvMax*9) { add_bits= ResvSize - (ResvMax * 9) / 10; *targ_bits += add_bits; gfc->substep_shaping |= 0x80; }else { add_bits =0 ; gfc->substep_shaping &= 0x7f; /* 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);*/ if (!gfp->disable_reservoir && !(gfc->substep_shaping & 1)) *targ_bits -= .1*mean_bits; } /* amount from the reservoir we are allowed to use. ISO says 6/10 */ *extra_bits = (ResvSize < (gfc->ResvMax*6)/10 ? ResvSize : (gfc->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_internal_flags *gfc,gr_info *gi) { gfc->ResvSize -= gi->part2_3_length + gi->part2_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. */ void ResvFrameEnd(lame_internal_flags *gfc, int mean_bits) { int stuffingBits; int over_bits; III_side_info_t *l3_side = &gfc->l3_side; gfc->ResvSize += mean_bits * gfc->mode_gr; stuffingBits=0; l3_side->resvDrain_post = 0; l3_side->resvDrain_pre = 0; /* we must be byte aligned */ if ( (over_bits = gfc->ResvSize % 8) != 0 ) stuffingBits += over_bits; over_bits = (gfc->ResvSize - stuffingBits) - gfc->ResvMax; if (over_bits > 0) { assert ( 0 == over_bits % 8 ); assert ( over_bits >= 0 ); stuffingBits += over_bits; } #undef NEW_DRAIN #ifdef NEW_DRAIN /* drain as many bits as possible into previous frame ancillary data * In particular, in VBR mode ResvMax may have changed, and we have * to make sure main_data_begin does not create a reservoir bigger * than ResvMax mt 4/00*/ { int mdb_bytes = Min(l3_side->main_data_begin*8,stuffingBits)/8; l3_side->resvDrain_pre += 8*mdb_bytes; stuffingBits -= 8*mdb_bytes; gfc->ResvSize -= 8*mdb_bytes; l3_side->main_data_begin -= mdb_bytes; /* drain just enough to be byte aligned. The remaining bits will * be added to the reservoir, and we will deal with them next frame. * If the next frame is at a lower bitrate, it may have a larger ResvMax, * and we will not have to waste these bits! mt 4/00 */ assert ( stuffingBits >= 0 ); l3_side->resvDrain_post += (stuffingBits % 8); gfc->ResvSize -= stuffingBits % 8; } #else /* drain the rest into this frames ancillary data*/ l3_side->resvDrain_post += stuffingBits; gfc->ResvSize -= stuffingBits; #endif return; }