Blame libmp3lame/bitstream.c

Packit 47f805
/*
Packit 47f805
 *      MP3 bitstream Output interface for LAME
Packit 47f805
 *
Packit 47f805
 *      Copyright (c) 1999-2000 Mark Taylor
Packit 47f805
 *      Copyright (c) 1999-2002 Takehiro Tominaga
Packit 47f805
 *
Packit 47f805
 * This library is free software; you can redistribute it and/or
Packit 47f805
 * modify it under the terms of the GNU Library General Public
Packit 47f805
 * License as published by the Free Software Foundation; either
Packit 47f805
 * version 2 of the License, or (at your option) any later version.
Packit 47f805
 *
Packit 47f805
 * This library is distributed in the hope that it will be useful,
Packit 47f805
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 47f805
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 47f805
 * Library General Public License for more details.
Packit 47f805
 *
Packit 47f805
 * You should have received a copy of the GNU Library General Public
Packit 47f805
 * License along with this library; if not, write to the
Packit 47f805
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Packit 47f805
 * Boston, MA 02111-1307, USA.
Packit 47f805
 *
Packit 47f805
 * $Id: bitstream.c,v 1.99 2017/08/31 14:14:46 robert Exp $
Packit 47f805
 */
Packit 47f805
Packit 47f805
Packit 47f805
#ifdef HAVE_CONFIG_H
Packit 47f805
#include <config.h>
Packit 47f805
#endif
Packit 47f805
Packit 47f805
#include <stdlib.h>
Packit 47f805
#include <stdio.h>
Packit 47f805
Packit 47f805
#include "lame.h"
Packit 47f805
#include "machine.h"
Packit 47f805
#include "encoder.h"
Packit 47f805
#include "util.h"
Packit 47f805
#include "tables.h"
Packit 47f805
#include "quantize_pvt.h"
Packit 47f805
#include "lame_global_flags.h"
Packit 47f805
#include "gain_analysis.h"
Packit 47f805
#include "VbrTag.h"
Packit 47f805
#include "bitstream.h"
Packit 47f805
#include "tables.h"
Packit 47f805
Packit 47f805
Packit 47f805
Packit 47f805
/* unsigned int is at least this large:  */
Packit 47f805
/* we work with ints, so when doing bit manipulation, we limit
Packit 47f805
 * ourselves to MAX_LENGTH-2 just to be on the safe side */
Packit 47f805
#define MAX_LENGTH      32
Packit 47f805
Packit 47f805
Packit 47f805
Packit 47f805
#ifdef DEBUG
Packit 47f805
static int hogege;
Packit 47f805
#endif
Packit 47f805
Packit 47f805
Packit 47f805
Packit 47f805
static int
Packit 47f805
calcFrameLength(SessionConfig_t const *const cfg, int kbps, int pad)
Packit 47f805
{
Packit 47f805
  return 8 * ((cfg->version + 1) * 72000 * kbps / cfg->samplerate_out + pad);
Packit 47f805
}
Packit 47f805
Packit 47f805
Packit 47f805
/***********************************************************************
Packit 47f805
 * compute bitsperframe and mean_bits for a layer III frame
Packit 47f805
 **********************************************************************/
Packit 47f805
int
Packit 47f805
getframebits(const lame_internal_flags * gfc)
Packit 47f805
{
Packit 47f805
    SessionConfig_t const *const cfg = &gfc->cfg;
Packit 47f805
    EncResult_t const *const eov = &gfc->ov_enc;
Packit 47f805
    int     bit_rate;
Packit 47f805
Packit 47f805
    /* get bitrate in kbps [?] */
Packit 47f805
    if (eov->bitrate_index)
Packit 47f805
        bit_rate = bitrate_table[cfg->version][eov->bitrate_index];
Packit 47f805
    else
Packit 47f805
        bit_rate = cfg->avg_bitrate;
Packit 47f805
    /*assert(bit_rate <= 550); */
Packit 47f805
    assert(8 <= bit_rate && bit_rate <= 640);
Packit 47f805
Packit 47f805
    /* main encoding routine toggles padding on and off */
Packit 47f805
    /* one Layer3 Slot consists of 8 bits */
Packit 47f805
    return calcFrameLength(cfg, bit_rate, eov->padding);
Packit 47f805
}
Packit 47f805
Packit 47f805
int
Packit 47f805
get_max_frame_buffer_size_by_constraint(SessionConfig_t const * cfg, int constraint)
Packit 47f805
{
Packit 47f805
    int     maxmp3buf = 0;
Packit 47f805
    if (cfg->avg_bitrate > 320) {
Packit 47f805
        /* in freeformat the buffer is constant */
Packit 47f805
        if (constraint == MDB_STRICT_ISO) {
Packit 47f805
            maxmp3buf = calcFrameLength(cfg, cfg->avg_bitrate, 0);
Packit 47f805
        }
Packit 47f805
        else {
Packit 47f805
            /* maximum allowed bits per granule are 7680 */
Packit 47f805
            maxmp3buf = 7680 * (cfg->version + 1);
Packit 47f805
        }
Packit 47f805
    }
Packit 47f805
    else {
Packit 47f805
        int     max_kbps;
Packit 47f805
        if (cfg->samplerate_out < 16000) {
Packit 47f805
            max_kbps = bitrate_table[cfg->version][8]; /* default: allow 64 kbps (MPEG-2.5) */
Packit 47f805
        }
Packit 47f805
        else {
Packit 47f805
            max_kbps = bitrate_table[cfg->version][14];
Packit 47f805
        }
Packit 47f805
        switch (constraint) 
Packit 47f805
        {
Packit 47f805
        default:
Packit 47f805
        case MDB_DEFAULT:
Packit 47f805
            /* Bouvigne suggests this more lax interpretation of the ISO doc instead of using 8*960. */
Packit 47f805
            /* All mp3 decoders should have enough buffer to handle this value: size of a 320kbps 32kHz frame */
Packit 47f805
            maxmp3buf = 8 * 1440;
Packit 47f805
            break;
Packit 47f805
        case MDB_STRICT_ISO:
Packit 47f805
            maxmp3buf = calcFrameLength(cfg, max_kbps, 0);
Packit 47f805
            break;
Packit 47f805
        case MDB_MAXIMUM:
Packit 47f805
            maxmp3buf = 7680 * (cfg->version + 1);
Packit 47f805
            break;
Packit 47f805
        }
Packit 47f805
    }
Packit 47f805
    return maxmp3buf;
Packit 47f805
}
Packit 47f805
Packit 47f805
Packit 47f805
static void
Packit 47f805
putheader_bits(lame_internal_flags * gfc)
Packit 47f805
{
Packit 47f805
    SessionConfig_t const *const cfg = &gfc->cfg;
Packit 47f805
    EncStateVar_t *const esv = &gfc->sv_enc;
Packit 47f805
    Bit_stream_struc *bs = &gfc->bs;
Packit 47f805
#ifdef DEBUG
Packit 47f805
    hogege += cfg->sideinfo_len * 8;
Packit 47f805
#endif
Packit 47f805
    memcpy(&bs->buf[bs->buf_byte_idx], esv->header[esv->w_ptr].buf, cfg->sideinfo_len);
Packit 47f805
    bs->buf_byte_idx += cfg->sideinfo_len;
Packit 47f805
    bs->totbit += cfg->sideinfo_len * 8;
Packit 47f805
    esv->w_ptr = (esv->w_ptr + 1) & (MAX_HEADER_BUF - 1);
Packit 47f805
}
Packit 47f805
Packit 47f805
Packit 47f805
Packit 47f805
Packit 47f805
/*write j bits into the bit stream */
Packit 47f805
inline static void
Packit 47f805
putbits2(lame_internal_flags * gfc, int val, int j)
Packit 47f805
{
Packit 47f805
    EncStateVar_t const *const esv = &gfc->sv_enc;
Packit 47f805
    Bit_stream_struc *bs;
Packit 47f805
    bs = &gfc->bs;
Packit 47f805
Packit 47f805
    assert(j < MAX_LENGTH - 2);
Packit 47f805
Packit 47f805
    while (j > 0) {
Packit 47f805
        int     k;
Packit 47f805
        if (bs->buf_bit_idx == 0) {
Packit 47f805
            bs->buf_bit_idx = 8;
Packit 47f805
            bs->buf_byte_idx++;
Packit 47f805
            assert(bs->buf_byte_idx < BUFFER_SIZE);
Packit 47f805
            assert(esv->header[esv->w_ptr].write_timing >= bs->totbit);
Packit 47f805
            if (esv->header[esv->w_ptr].write_timing == bs->totbit) {
Packit 47f805
                putheader_bits(gfc);
Packit 47f805
            }
Packit 47f805
            bs->buf[bs->buf_byte_idx] = 0;
Packit 47f805
        }
Packit 47f805
Packit 47f805
        k = Min(j, bs->buf_bit_idx);
Packit 47f805
        j -= k;
Packit 47f805
Packit 47f805
        bs->buf_bit_idx -= k;
Packit 47f805
Packit 47f805
        assert(j < MAX_LENGTH); /* 32 too large on 32 bit machines */
Packit 47f805
        assert(bs->buf_bit_idx < MAX_LENGTH);
Packit 47f805
Packit 47f805
        bs->buf[bs->buf_byte_idx] |= ((val >> j) << bs->buf_bit_idx);
Packit 47f805
        bs->totbit += k;
Packit 47f805
    }
Packit 47f805
}
Packit 47f805
Packit 47f805
/*write j bits into the bit stream, ignoring frame headers */
Packit 47f805
inline static void
Packit 47f805
putbits_noheaders(lame_internal_flags * gfc, int val, int j)
Packit 47f805
{
Packit 47f805
    Bit_stream_struc *bs;
Packit 47f805
    bs = &gfc->bs;
Packit 47f805
Packit 47f805
    assert(j < MAX_LENGTH - 2);
Packit 47f805
Packit 47f805
    while (j > 0) {
Packit 47f805
        int     k;
Packit 47f805
        if (bs->buf_bit_idx == 0) {
Packit 47f805
            bs->buf_bit_idx = 8;
Packit 47f805
            bs->buf_byte_idx++;
Packit 47f805
            assert(bs->buf_byte_idx < BUFFER_SIZE);
Packit 47f805
            bs->buf[bs->buf_byte_idx] = 0;
Packit 47f805
        }
Packit 47f805
Packit 47f805
        k = Min(j, bs->buf_bit_idx);
Packit 47f805
        j -= k;
Packit 47f805
Packit 47f805
        bs->buf_bit_idx -= k;
Packit 47f805
Packit 47f805
        assert(j < MAX_LENGTH); /* 32 too large on 32 bit machines */
Packit 47f805
        assert(bs->buf_bit_idx < MAX_LENGTH);
Packit 47f805
Packit 47f805
        bs->buf[bs->buf_byte_idx] |= ((val >> j) << bs->buf_bit_idx);
Packit 47f805
        bs->totbit += k;
Packit 47f805
    }
Packit 47f805
}
Packit 47f805
Packit 47f805
Packit 47f805
/*
Packit 47f805
  Some combinations of bitrate, Fs, and stereo make it impossible to stuff
Packit 47f805
  out a frame using just main_data, due to the limited number of bits to
Packit 47f805
  indicate main_data_length. In these situations, we put stuffing bits into
Packit 47f805
  the ancillary data...
Packit 47f805
*/
Packit 47f805
Packit 47f805
inline static void
Packit 47f805
drain_into_ancillary(lame_internal_flags * gfc, int remainingBits)
Packit 47f805
{
Packit 47f805
    SessionConfig_t const *const cfg = &gfc->cfg;
Packit 47f805
    EncStateVar_t *const esv = &gfc->sv_enc;
Packit 47f805
    int     i;
Packit 47f805
    assert(remainingBits >= 0);
Packit 47f805
Packit 47f805
    if (remainingBits >= 8) {
Packit 47f805
        putbits2(gfc, 0x4c, 8);
Packit 47f805
        remainingBits -= 8;
Packit 47f805
    }
Packit 47f805
    if (remainingBits >= 8) {
Packit 47f805
        putbits2(gfc, 0x41, 8);
Packit 47f805
        remainingBits -= 8;
Packit 47f805
    }
Packit 47f805
    if (remainingBits >= 8) {
Packit 47f805
        putbits2(gfc, 0x4d, 8);
Packit 47f805
        remainingBits -= 8;
Packit 47f805
    }
Packit 47f805
    if (remainingBits >= 8) {
Packit 47f805
        putbits2(gfc, 0x45, 8);
Packit 47f805
        remainingBits -= 8;
Packit 47f805
    }
Packit 47f805
Packit 47f805
    if (remainingBits >= 32) {
Packit 47f805
        const char *const version = get_lame_short_version();
Packit 47f805
        if (remainingBits >= 32)
Packit 47f805
            for (i = 0; i < (int) strlen(version) && remainingBits >= 8; ++i) {
Packit 47f805
                remainingBits -= 8;
Packit 47f805
                putbits2(gfc, version[i], 8);
Packit 47f805
            }
Packit 47f805
    }
Packit 47f805
Packit 47f805
    for (; remainingBits >= 1; remainingBits -= 1) {
Packit 47f805
        putbits2(gfc, esv->ancillary_flag, 1);
Packit 47f805
        esv->ancillary_flag ^= !cfg->disable_reservoir;
Packit 47f805
    }
Packit 47f805
Packit 47f805
    assert(remainingBits == 0);
Packit 47f805
Packit 47f805
}
Packit 47f805
Packit 47f805
/*write N bits into the header */
Packit 47f805
inline static void
Packit 47f805
writeheader(lame_internal_flags * gfc, int val, int j)
Packit 47f805
{
Packit 47f805
    EncStateVar_t *const esv = &gfc->sv_enc;
Packit 47f805
    int     ptr = esv->header[esv->h_ptr].ptr;
Packit 47f805
Packit 47f805
    while (j > 0) {
Packit 47f805
        int const k = Min(j, 8 - (ptr & 7));
Packit 47f805
        j -= k;
Packit 47f805
        assert(j < MAX_LENGTH); /* >> 32  too large for 32 bit machines */
Packit 47f805
        esv->header[esv->h_ptr].buf[ptr >> 3]
Packit 47f805
            |= ((val >> j)) << (8 - (ptr & 7) - k);
Packit 47f805
        ptr += k;
Packit 47f805
    }
Packit 47f805
    esv->header[esv->h_ptr].ptr = ptr;
Packit 47f805
}
Packit 47f805
Packit 47f805
Packit 47f805
static int
Packit 47f805
CRC_update(int value, int crc)
Packit 47f805
{
Packit 47f805
    int     i;
Packit 47f805
    value <<= 8;
Packit 47f805
    for (i = 0; i < 8; i++) {
Packit 47f805
        value <<= 1;
Packit 47f805
        crc <<= 1;
Packit 47f805
Packit 47f805
        if (((crc ^ value) & 0x10000))
Packit 47f805
            crc ^= CRC16_POLYNOMIAL;
Packit 47f805
    }
Packit 47f805
    return crc;
Packit 47f805
}
Packit 47f805
Packit 47f805
Packit 47f805
void
Packit 47f805
CRC_writeheader(lame_internal_flags const *gfc, char *header)
Packit 47f805
{
Packit 47f805
    SessionConfig_t const *const cfg = &gfc->cfg;
Packit 47f805
    int     crc = 0xffff;    /* (jo) init crc16 for error_protection */
Packit 47f805
    int     i;
Packit 47f805
Packit 47f805
    crc = CRC_update(((unsigned char *) header)[2], crc);
Packit 47f805
    crc = CRC_update(((unsigned char *) header)[3], crc);
Packit 47f805
    for (i = 6; i < cfg->sideinfo_len; i++) {
Packit 47f805
        crc = CRC_update(((unsigned char *) header)[i], crc);
Packit 47f805
    }
Packit 47f805
Packit 47f805
    header[4] = crc >> 8;
Packit 47f805
    header[5] = crc & 255;
Packit 47f805
}
Packit 47f805
Packit 47f805
inline static void
Packit 47f805
encodeSideInfo2(lame_internal_flags * gfc, int bitsPerFrame)
Packit 47f805
{
Packit 47f805
    SessionConfig_t const *const cfg = &gfc->cfg;
Packit 47f805
    EncResult_t const *const eov = &gfc->ov_enc;
Packit 47f805
    EncStateVar_t *const esv = &gfc->sv_enc;
Packit 47f805
    III_side_info_t *l3_side;
Packit 47f805
    int     gr, ch;
Packit 47f805
Packit 47f805
    l3_side = &gfc->l3_side;
Packit 47f805
    esv->header[esv->h_ptr].ptr = 0;
Packit 47f805
    memset(esv->header[esv->h_ptr].buf, 0, cfg->sideinfo_len);
Packit 47f805
    if (cfg->samplerate_out < 16000)
Packit 47f805
        writeheader(gfc, 0xffe, 12);
Packit 47f805
    else
Packit 47f805
        writeheader(gfc, 0xfff, 12);
Packit 47f805
    writeheader(gfc, (cfg->version), 1);
Packit 47f805
    writeheader(gfc, 4 - 3, 2);
Packit 47f805
    writeheader(gfc, (!cfg->error_protection), 1);
Packit 47f805
    writeheader(gfc, (eov->bitrate_index), 4);
Packit 47f805
    writeheader(gfc, (cfg->samplerate_index), 2);
Packit 47f805
    writeheader(gfc, (eov->padding), 1);
Packit 47f805
    writeheader(gfc, (cfg->extension), 1);
Packit 47f805
    writeheader(gfc, (cfg->mode), 2);
Packit 47f805
    writeheader(gfc, (eov->mode_ext), 2);
Packit 47f805
    writeheader(gfc, (cfg->copyright), 1);
Packit 47f805
    writeheader(gfc, (cfg->original), 1);
Packit 47f805
    writeheader(gfc, (cfg->emphasis), 2);
Packit 47f805
    if (cfg->error_protection) {
Packit 47f805
        writeheader(gfc, 0, 16); /* dummy */
Packit 47f805
    }
Packit 47f805
Packit 47f805
    if (cfg->version == 1) {
Packit 47f805
        /* MPEG1 */
Packit 47f805
        assert(l3_side->main_data_begin >= 0);
Packit 47f805
        writeheader(gfc, (l3_side->main_data_begin), 9);
Packit 47f805
Packit 47f805
        if (cfg->channels_out == 2)
Packit 47f805
            writeheader(gfc, l3_side->private_bits, 3);
Packit 47f805
        else
Packit 47f805
            writeheader(gfc, l3_side->private_bits, 5);
Packit 47f805
Packit 47f805
        for (ch = 0; ch < cfg->channels_out; ch++) {
Packit 47f805
            int     band;
Packit 47f805
            for (band = 0; band < 4; band++) {
Packit 47f805
                writeheader(gfc, l3_side->scfsi[ch][band], 1);
Packit 47f805
            }
Packit 47f805
        }
Packit 47f805
Packit 47f805
        for (gr = 0; gr < 2; gr++) {
Packit 47f805
            for (ch = 0; ch < cfg->channels_out; ch++) {
Packit 47f805
                gr_info *const gi = &l3_side->tt[gr][ch];
Packit 47f805
                writeheader(gfc, gi->part2_3_length + gi->part2_length, 12);
Packit 47f805
                writeheader(gfc, gi->big_values / 2, 9);
Packit 47f805
                writeheader(gfc, gi->global_gain, 8);
Packit 47f805
                writeheader(gfc, gi->scalefac_compress, 4);
Packit 47f805
Packit 47f805
                if (gi->block_type != NORM_TYPE) {
Packit 47f805
                    writeheader(gfc, 1, 1); /* window_switching_flag */
Packit 47f805
                    writeheader(gfc, gi->block_type, 2);
Packit 47f805
                    writeheader(gfc, gi->mixed_block_flag, 1);
Packit 47f805
Packit 47f805
                    if (gi->table_select[0] == 14)
Packit 47f805
                        gi->table_select[0] = 16;
Packit 47f805
                    writeheader(gfc, gi->table_select[0], 5);
Packit 47f805
                    if (gi->table_select[1] == 14)
Packit 47f805
                        gi->table_select[1] = 16;
Packit 47f805
                    writeheader(gfc, gi->table_select[1], 5);
Packit 47f805
Packit 47f805
                    writeheader(gfc, gi->subblock_gain[0], 3);
Packit 47f805
                    writeheader(gfc, gi->subblock_gain[1], 3);
Packit 47f805
                    writeheader(gfc, gi->subblock_gain[2], 3);
Packit 47f805
                }
Packit 47f805
                else {
Packit 47f805
                    writeheader(gfc, 0, 1); /* window_switching_flag */
Packit 47f805
                    if (gi->table_select[0] == 14)
Packit 47f805
                        gi->table_select[0] = 16;
Packit 47f805
                    writeheader(gfc, gi->table_select[0], 5);
Packit 47f805
                    if (gi->table_select[1] == 14)
Packit 47f805
                        gi->table_select[1] = 16;
Packit 47f805
                    writeheader(gfc, gi->table_select[1], 5);
Packit 47f805
                    if (gi->table_select[2] == 14)
Packit 47f805
                        gi->table_select[2] = 16;
Packit 47f805
                    writeheader(gfc, gi->table_select[2], 5);
Packit 47f805
Packit 47f805
                    assert(0 <= gi->region0_count && gi->region0_count < 16);
Packit 47f805
                    assert(0 <= gi->region1_count && gi->region1_count < 8);
Packit 47f805
                    writeheader(gfc, gi->region0_count, 4);
Packit 47f805
                    writeheader(gfc, gi->region1_count, 3);
Packit 47f805
                }
Packit 47f805
                writeheader(gfc, gi->preflag, 1);
Packit 47f805
                writeheader(gfc, gi->scalefac_scale, 1);
Packit 47f805
                writeheader(gfc, gi->count1table_select, 1);
Packit 47f805
            }
Packit 47f805
        }
Packit 47f805
    }
Packit 47f805
    else {
Packit 47f805
        /* MPEG2 */
Packit 47f805
        assert(l3_side->main_data_begin >= 0);
Packit 47f805
        writeheader(gfc, (l3_side->main_data_begin), 8);
Packit 47f805
        writeheader(gfc, l3_side->private_bits, cfg->channels_out);
Packit 47f805
Packit 47f805
        gr = 0;
Packit 47f805
        for (ch = 0; ch < cfg->channels_out; ch++) {
Packit 47f805
            gr_info *const gi = &l3_side->tt[gr][ch];
Packit 47f805
            writeheader(gfc, gi->part2_3_length + gi->part2_length, 12);
Packit 47f805
            writeheader(gfc, gi->big_values / 2, 9);
Packit 47f805
            writeheader(gfc, gi->global_gain, 8);
Packit 47f805
            writeheader(gfc, gi->scalefac_compress, 9);
Packit 47f805
Packit 47f805
            if (gi->block_type != NORM_TYPE) {
Packit 47f805
                writeheader(gfc, 1, 1); /* window_switching_flag */
Packit 47f805
                writeheader(gfc, gi->block_type, 2);
Packit 47f805
                writeheader(gfc, gi->mixed_block_flag, 1);
Packit 47f805
Packit 47f805
                if (gi->table_select[0] == 14)
Packit 47f805
                    gi->table_select[0] = 16;
Packit 47f805
                writeheader(gfc, gi->table_select[0], 5);
Packit 47f805
                if (gi->table_select[1] == 14)
Packit 47f805
                    gi->table_select[1] = 16;
Packit 47f805
                writeheader(gfc, gi->table_select[1], 5);
Packit 47f805
Packit 47f805
                writeheader(gfc, gi->subblock_gain[0], 3);
Packit 47f805
                writeheader(gfc, gi->subblock_gain[1], 3);
Packit 47f805
                writeheader(gfc, gi->subblock_gain[2], 3);
Packit 47f805
            }
Packit 47f805
            else {
Packit 47f805
                writeheader(gfc, 0, 1); /* window_switching_flag */
Packit 47f805
                if (gi->table_select[0] == 14)
Packit 47f805
                    gi->table_select[0] = 16;
Packit 47f805
                writeheader(gfc, gi->table_select[0], 5);
Packit 47f805
                if (gi->table_select[1] == 14)
Packit 47f805
                    gi->table_select[1] = 16;
Packit 47f805
                writeheader(gfc, gi->table_select[1], 5);
Packit 47f805
                if (gi->table_select[2] == 14)
Packit 47f805
                    gi->table_select[2] = 16;
Packit 47f805
                writeheader(gfc, gi->table_select[2], 5);
Packit 47f805
Packit 47f805
                assert(0 <= gi->region0_count && gi->region0_count < 16);
Packit 47f805
                assert(0 <= gi->region1_count && gi->region1_count < 8);
Packit 47f805
                writeheader(gfc, gi->region0_count, 4);
Packit 47f805
                writeheader(gfc, gi->region1_count, 3);
Packit 47f805
            }
Packit 47f805
Packit 47f805
            writeheader(gfc, gi->scalefac_scale, 1);
Packit 47f805
            writeheader(gfc, gi->count1table_select, 1);
Packit 47f805
        }
Packit 47f805
    }
Packit 47f805
Packit 47f805
    if (cfg->error_protection) {
Packit 47f805
        /* (jo) error_protection: add crc16 information to header */
Packit 47f805
        CRC_writeheader(gfc, esv->header[esv->h_ptr].buf);
Packit 47f805
    }
Packit 47f805
Packit 47f805
    {
Packit 47f805
        int const old = esv->h_ptr;
Packit 47f805
        assert(esv->header[old].ptr == cfg->sideinfo_len * 8);
Packit 47f805
Packit 47f805
        esv->h_ptr = (old + 1) & (MAX_HEADER_BUF - 1);
Packit 47f805
        esv->header[esv->h_ptr].write_timing = esv->header[old].write_timing + bitsPerFrame;
Packit 47f805
Packit 47f805
        if (esv->h_ptr == esv->w_ptr) {
Packit 47f805
            /* yikes! we are out of header buffer space */
Packit 47f805
            ERRORF(gfc, "Error: MAX_HEADER_BUF too small in bitstream.c \n");
Packit 47f805
        }
Packit 47f805
Packit 47f805
    }
Packit 47f805
}
Packit 47f805
Packit 47f805
Packit 47f805
inline static int
Packit 47f805
huffman_coder_count1(lame_internal_flags * gfc, gr_info const *gi)
Packit 47f805
{
Packit 47f805
    /* Write count1 area */
Packit 47f805
    struct huffcodetab const *const h = &ht[gi->count1table_select + 32];
Packit 47f805
    int     i, bits = 0;
Packit 47f805
#ifdef DEBUG
Packit 47f805
    int     gegebo = gfc->bs.totbit;
Packit 47f805
#endif
Packit 47f805
Packit 47f805
    int const *ix = &gi->l3_enc[gi->big_values];
Packit 47f805
    FLOAT const *xr = &gi->xr[gi->big_values];
Packit 47f805
    assert(gi->count1table_select < 2);
Packit 47f805
Packit 47f805
    for (i = (gi->count1 - gi->big_values) / 4; i > 0; --i) {
Packit 47f805
        int     huffbits = 0;
Packit 47f805
        int     p = 0, v;
Packit 47f805
Packit 47f805
        v = ix[0];
Packit 47f805
        if (v) {
Packit 47f805
            p += 8;
Packit 47f805
            if (xr[0] < 0.0f)
Packit 47f805
                huffbits++;
Packit 47f805
            assert(v <= 1);
Packit 47f805
        }
Packit 47f805
Packit 47f805
        v = ix[1];
Packit 47f805
        if (v) {
Packit 47f805
            p += 4;
Packit 47f805
            huffbits *= 2;
Packit 47f805
            if (xr[1] < 0.0f)
Packit 47f805
                huffbits++;
Packit 47f805
            assert(v <= 1);
Packit 47f805
        }
Packit 47f805
Packit 47f805
        v = ix[2];
Packit 47f805
        if (v) {
Packit 47f805
            p += 2;
Packit 47f805
            huffbits *= 2;
Packit 47f805
            if (xr[2] < 0.0f)
Packit 47f805
                huffbits++;
Packit 47f805
            assert(v <= 1);
Packit 47f805
        }
Packit 47f805
Packit 47f805
        v = ix[3];
Packit 47f805
        if (v) {
Packit 47f805
            p++;
Packit 47f805
            huffbits *= 2;
Packit 47f805
            if (xr[3] < 0.0f)
Packit 47f805
                huffbits++;
Packit 47f805
            assert(v <= 1);
Packit 47f805
        }
Packit 47f805
Packit 47f805
        ix += 4;
Packit 47f805
        xr += 4;
Packit 47f805
        putbits2(gfc, huffbits + h->table[p], h->hlen[p]);
Packit 47f805
        bits += h->hlen[p];
Packit 47f805
    }
Packit 47f805
#ifdef DEBUG
Packit 47f805
    DEBUGF(gfc, "count1: real: %ld counted:%d (bigv %d count1len %d)\n",
Packit 47f805
           gfc->bs.totbit - gegebo, gi->count1bits, gi->big_values, gi->count1);
Packit 47f805
#endif
Packit 47f805
    return bits;
Packit 47f805
}
Packit 47f805
Packit 47f805
Packit 47f805
Packit 47f805
/*
Packit 47f805
  Implements the pseudocode of page 98 of the IS
Packit 47f805
  */
Packit 47f805
inline static int
Packit 47f805
Huffmancode(lame_internal_flags * const gfc, const unsigned int tableindex,
Packit 47f805
            int start, int end, gr_info const *gi)
Packit 47f805
{
Packit 47f805
    struct huffcodetab const *const h = &ht[tableindex];
Packit 47f805
    unsigned int const linbits = h->xlen;
Packit 47f805
    int     i, bits = 0;
Packit 47f805
Packit 47f805
    assert(tableindex < 32u);
Packit 47f805
    if (!tableindex)
Packit 47f805
        return bits;
Packit 47f805
Packit 47f805
    for (i = start; i < end; i += 2) {
Packit 47f805
        int16_t  cbits = 0;
Packit 47f805
        uint16_t xbits = 0;
Packit 47f805
        unsigned int xlen = h->xlen;
Packit 47f805
        unsigned int ext = 0;
Packit 47f805
        unsigned int x1 = gi->l3_enc[i];
Packit 47f805
        unsigned int x2 = gi->l3_enc[i + 1];
Packit 47f805
Packit 47f805
        assert(gi->l3_enc[i] >= 0);
Packit 47f805
        assert(gi->l3_enc[i+1] >= 0);
Packit 47f805
Packit 47f805
        if (x1 != 0u) {
Packit 47f805
            if (gi->xr[i] < 0.0f)
Packit 47f805
                ext++;
Packit 47f805
            cbits--;
Packit 47f805
        }
Packit 47f805
Packit 47f805
        if (tableindex > 15u) {
Packit 47f805
            /* use ESC-words */
Packit 47f805
            if (x1 >= 15u) {
Packit 47f805
                uint16_t const linbits_x1 = x1 - 15u;
Packit 47f805
                assert(linbits_x1 <= h->linmax);
Packit 47f805
                ext |= linbits_x1 << 1u;
Packit 47f805
                xbits = linbits;
Packit 47f805
                x1 = 15u;
Packit 47f805
            }
Packit 47f805
Packit 47f805
            if (x2 >= 15u) {
Packit 47f805
                uint16_t const linbits_x2 = x2 - 15u;
Packit 47f805
                assert(linbits_x2 <= h->linmax);
Packit 47f805
                ext <<= linbits;
Packit 47f805
                ext |= linbits_x2;
Packit 47f805
                xbits += linbits;
Packit 47f805
                x2 = 15u;
Packit 47f805
            }
Packit 47f805
            xlen = 16;
Packit 47f805
        }
Packit 47f805
Packit 47f805
        if (x2 != 0u) {
Packit 47f805
            ext <<= 1;
Packit 47f805
            if (gi->xr[i + 1] < 0.0f)
Packit 47f805
                ext++;
Packit 47f805
            cbits--;
Packit 47f805
        }
Packit 47f805
Packit 47f805
        assert((x1 | x2) < 16u);
Packit 47f805
Packit 47f805
        x1 = x1 * xlen + x2;
Packit 47f805
        xbits -= cbits;
Packit 47f805
        cbits += h->hlen[x1];
Packit 47f805
Packit 47f805
        assert(cbits <= MAX_LENGTH);
Packit 47f805
        assert(xbits <= MAX_LENGTH);
Packit 47f805
Packit 47f805
        putbits2(gfc, h->table[x1], cbits);
Packit 47f805
        putbits2(gfc, (int)ext, xbits);
Packit 47f805
        bits += cbits + xbits;
Packit 47f805
    }
Packit 47f805
    return bits;
Packit 47f805
}
Packit 47f805
Packit 47f805
/*
Packit 47f805
  Note the discussion of huffmancodebits() on pages 28
Packit 47f805
  and 29 of the IS, as well as the definitions of the side
Packit 47f805
  information on pages 26 and 27.
Packit 47f805
  */
Packit 47f805
static int
Packit 47f805
ShortHuffmancodebits(lame_internal_flags * gfc, gr_info const *gi)
Packit 47f805
{
Packit 47f805
    int     bits;
Packit 47f805
    int     region1Start;
Packit 47f805
Packit 47f805
    region1Start = 3 * gfc->scalefac_band.s[3];
Packit 47f805
    if (region1Start > gi->big_values)
Packit 47f805
        region1Start = gi->big_values;
Packit 47f805
Packit 47f805
    /* short blocks do not have a region2 */
Packit 47f805
    bits = Huffmancode(gfc, gi->table_select[0], 0, region1Start, gi);
Packit 47f805
    bits += Huffmancode(gfc, gi->table_select[1], region1Start, gi->big_values, gi);
Packit 47f805
    return bits;
Packit 47f805
}
Packit 47f805
Packit 47f805
static int
Packit 47f805
LongHuffmancodebits(lame_internal_flags * gfc, gr_info const *gi)
Packit 47f805
{
Packit 47f805
    unsigned int i;
Packit 47f805
    int     bigvalues, bits;
Packit 47f805
    int     region1Start, region2Start;
Packit 47f805
Packit 47f805
    bigvalues = gi->big_values;
Packit 47f805
    assert(0 <= bigvalues && bigvalues <= 576);
Packit 47f805
Packit 47f805
    assert(gi->region0_count >= -1);
Packit 47f805
    assert(gi->region1_count >= -1);
Packit 47f805
    i = gi->region0_count + 1;
Packit 47f805
    assert((size_t) i < dimension_of(gfc->scalefac_band.l));
Packit 47f805
    region1Start = gfc->scalefac_band.l[i];
Packit 47f805
    i += gi->region1_count + 1;
Packit 47f805
    assert((size_t) i < dimension_of(gfc->scalefac_band.l));
Packit 47f805
    region2Start = gfc->scalefac_band.l[i];
Packit 47f805
Packit 47f805
    if (region1Start > bigvalues)
Packit 47f805
        region1Start = bigvalues;
Packit 47f805
Packit 47f805
    if (region2Start > bigvalues)
Packit 47f805
        region2Start = bigvalues;
Packit 47f805
Packit 47f805
    bits = Huffmancode(gfc, gi->table_select[0], 0, region1Start, gi);
Packit 47f805
    bits += Huffmancode(gfc, gi->table_select[1], region1Start, region2Start, gi);
Packit 47f805
    bits += Huffmancode(gfc, gi->table_select[2], region2Start, bigvalues, gi);
Packit 47f805
    return bits;
Packit 47f805
}
Packit 47f805
Packit 47f805
inline static int
Packit 47f805
writeMainData(lame_internal_flags * const gfc)
Packit 47f805
{
Packit 47f805
    SessionConfig_t const *const cfg = &gfc->cfg;
Packit 47f805
    III_side_info_t const *const l3_side = &gfc->l3_side;
Packit 47f805
    int     gr, ch, sfb, data_bits, tot_bits = 0;
Packit 47f805
Packit 47f805
    if (cfg->version == 1) {
Packit 47f805
        /* MPEG 1 */
Packit 47f805
        for (gr = 0; gr < 2; gr++) {
Packit 47f805
            for (ch = 0; ch < cfg->channels_out; ch++) {
Packit 47f805
                gr_info const *const gi = &l3_side->tt[gr][ch];
Packit 47f805
                int const slen1 = slen1_tab[gi->scalefac_compress];
Packit 47f805
                int const slen2 = slen2_tab[gi->scalefac_compress];
Packit 47f805
                data_bits = 0;
Packit 47f805
#ifdef DEBUG
Packit 47f805
                hogege = gfc->bs.totbit;
Packit 47f805
#endif
Packit 47f805
                for (sfb = 0; sfb < gi->sfbdivide; sfb++) {
Packit 47f805
                    if (gi->scalefac[sfb] == -1)
Packit 47f805
                        continue; /* scfsi is used */
Packit 47f805
                    putbits2(gfc, gi->scalefac[sfb], slen1);
Packit 47f805
                    data_bits += slen1;
Packit 47f805
                }
Packit 47f805
                for (; sfb < gi->sfbmax; sfb++) {
Packit 47f805
                    if (gi->scalefac[sfb] == -1)
Packit 47f805
                        continue; /* scfsi is used */
Packit 47f805
                    putbits2(gfc, gi->scalefac[sfb], slen2);
Packit 47f805
                    data_bits += slen2;
Packit 47f805
                }
Packit 47f805
                assert(data_bits == gi->part2_length);
Packit 47f805
Packit 47f805
                if (gi->block_type == SHORT_TYPE) {
Packit 47f805
                    data_bits += ShortHuffmancodebits(gfc, gi);
Packit 47f805
                }
Packit 47f805
                else {
Packit 47f805
                    data_bits += LongHuffmancodebits(gfc, gi);
Packit 47f805
                }
Packit 47f805
                data_bits += huffman_coder_count1(gfc, gi);
Packit 47f805
#ifdef DEBUG
Packit 47f805
                DEBUGF(gfc, "<%ld> ", gfc->bs.totbit - hogege);
Packit 47f805
#endif
Packit 47f805
                /* does bitcount in quantize.c agree with actual bit count? */
Packit 47f805
                assert(data_bits == gi->part2_3_length + gi->part2_length);
Packit 47f805
                tot_bits += data_bits;
Packit 47f805
            }           /* for ch */
Packit 47f805
        }               /* for gr */
Packit 47f805
    }
Packit 47f805
    else {
Packit 47f805
        /* MPEG 2 */
Packit 47f805
        gr = 0;
Packit 47f805
        for (ch = 0; ch < cfg->channels_out; ch++) {
Packit 47f805
            gr_info const *const gi = &l3_side->tt[gr][ch];
Packit 47f805
            int     i, sfb_partition, scale_bits = 0;
Packit 47f805
            assert(gi->sfb_partition_table);
Packit 47f805
            data_bits = 0;
Packit 47f805
#ifdef DEBUG
Packit 47f805
            hogege = gfc->bs.totbit;
Packit 47f805
#endif
Packit 47f805
            sfb = 0;
Packit 47f805
            sfb_partition = 0;
Packit 47f805
Packit 47f805
            if (gi->block_type == SHORT_TYPE) {
Packit 47f805
                for (; sfb_partition < 4; sfb_partition++) {
Packit 47f805
                    int const sfbs = gi->sfb_partition_table[sfb_partition] / 3;
Packit 47f805
                    int const slen = gi->slen[sfb_partition];
Packit 47f805
                    for (i = 0; i < sfbs; i++, sfb++) {
Packit 47f805
                        putbits2(gfc, Max(gi->scalefac[sfb * 3 + 0], 0), slen);
Packit 47f805
                        putbits2(gfc, Max(gi->scalefac[sfb * 3 + 1], 0), slen);
Packit 47f805
                        putbits2(gfc, Max(gi->scalefac[sfb * 3 + 2], 0), slen);
Packit 47f805
                        scale_bits += 3 * slen;
Packit 47f805
                    }
Packit 47f805
                }
Packit 47f805
                data_bits += ShortHuffmancodebits(gfc, gi);
Packit 47f805
            }
Packit 47f805
            else {
Packit 47f805
                for (; sfb_partition < 4; sfb_partition++) {
Packit 47f805
                    int const sfbs = gi->sfb_partition_table[sfb_partition];
Packit 47f805
                    int const slen = gi->slen[sfb_partition];
Packit 47f805
                    for (i = 0; i < sfbs; i++, sfb++) {
Packit 47f805
                        putbits2(gfc, Max(gi->scalefac[sfb], 0), slen);
Packit 47f805
                        scale_bits += slen;
Packit 47f805
                    }
Packit 47f805
                }
Packit 47f805
                data_bits += LongHuffmancodebits(gfc, gi);
Packit 47f805
            }
Packit 47f805
            data_bits += huffman_coder_count1(gfc, gi);
Packit 47f805
#ifdef DEBUG
Packit 47f805
            DEBUGF(gfc, "<%ld> ", gfc->bs.totbit - hogege);
Packit 47f805
#endif
Packit 47f805
            /* does bitcount in quantize.c agree with actual bit count? */
Packit 47f805
            assert(data_bits == gi->part2_3_length);
Packit 47f805
            assert(scale_bits == gi->part2_length);
Packit 47f805
            tot_bits += scale_bits + data_bits;
Packit 47f805
        }               /* for ch */
Packit 47f805
    }                   /* for gf */
Packit 47f805
    return tot_bits;
Packit 47f805
}                       /* main_data */
Packit 47f805
Packit 47f805
Packit 47f805
Packit 47f805
/* compute the number of bits required to flush all mp3 frames
Packit 47f805
   currently in the buffer.  This should be the same as the
Packit 47f805
   reservoir size.  Only call this routine between frames - i.e.
Packit 47f805
   only after all headers and data have been added to the buffer
Packit 47f805
   by format_bitstream().
Packit 47f805
Packit 47f805
   Also compute total_bits_output =
Packit 47f805
       size of mp3 buffer (including frame headers which may not
Packit 47f805
       have yet been send to the mp3 buffer) +
Packit 47f805
       number of bits needed to flush all mp3 frames.
Packit 47f805
Packit 47f805
   total_bytes_output is the size of the mp3 output buffer if
Packit 47f805
   lame_encode_flush_nogap() was called right now.
Packit 47f805
Packit 47f805
 */
Packit 47f805
int
Packit 47f805
compute_flushbits(const lame_internal_flags * gfc, int *total_bytes_output)
Packit 47f805
{
Packit 47f805
    SessionConfig_t const *const cfg = &gfc->cfg;
Packit 47f805
    EncStateVar_t const *const esv = &gfc->sv_enc;
Packit 47f805
    int     flushbits, remaining_headers;
Packit 47f805
    int     bitsPerFrame;
Packit 47f805
    int     last_ptr, first_ptr;
Packit 47f805
    first_ptr = esv->w_ptr; /* first header to add to bitstream */
Packit 47f805
    last_ptr = esv->h_ptr - 1; /* last header to add to bitstream */
Packit 47f805
    if (last_ptr == -1)
Packit 47f805
        last_ptr = MAX_HEADER_BUF - 1;
Packit 47f805
Packit 47f805
    /* add this many bits to bitstream so we can flush all headers */
Packit 47f805
    flushbits = esv->header[last_ptr].write_timing - gfc->bs.totbit;
Packit 47f805
    *total_bytes_output = flushbits;
Packit 47f805
Packit 47f805
    if (flushbits >= 0) {
Packit 47f805
        /* if flushbits >= 0, some headers have not yet been written */
Packit 47f805
        /* reduce flushbits by the size of the headers */
Packit 47f805
        remaining_headers = 1 + last_ptr - first_ptr;
Packit 47f805
        if (last_ptr < first_ptr)
Packit 47f805
            remaining_headers = 1 + last_ptr - first_ptr + MAX_HEADER_BUF;
Packit 47f805
        flushbits -= remaining_headers * 8 * cfg->sideinfo_len;
Packit 47f805
    }
Packit 47f805
Packit 47f805
Packit 47f805
    /* finally, add some bits so that the last frame is complete
Packit 47f805
     * these bits are not necessary to decode the last frame, but
Packit 47f805
     * some decoders will ignore last frame if these bits are missing
Packit 47f805
     */
Packit 47f805
    bitsPerFrame = getframebits(gfc);
Packit 47f805
    flushbits += bitsPerFrame;
Packit 47f805
    *total_bytes_output += bitsPerFrame;
Packit 47f805
    /* round up:   */
Packit 47f805
    if (*total_bytes_output % 8)
Packit 47f805
        *total_bytes_output = 1 + (*total_bytes_output / 8);
Packit 47f805
    else
Packit 47f805
        *total_bytes_output = (*total_bytes_output / 8);
Packit 47f805
    *total_bytes_output += gfc->bs.buf_byte_idx + 1;
Packit 47f805
Packit 47f805
Packit 47f805
    if (flushbits < 0) {
Packit 47f805
#if 0
Packit 47f805
        /* if flushbits < 0, this would mean that the buffer looks like:
Packit 47f805
         * (data...)  last_header  (data...)  (extra data that should not be here...)
Packit 47f805
         */
Packit 47f805
        DEBUGF(gfc, "last header write_timing = %i \n", esv->header[last_ptr].write_timing);
Packit 47f805
        DEBUGF(gfc, "first header write_timing = %i \n", esv->header[first_ptr].write_timing);
Packit 47f805
        DEBUGF(gfc, "bs.totbit:                 %i \n", gfc->bs.totbit);
Packit 47f805
        DEBUGF(gfc, "first_ptr, last_ptr        %i %i \n", first_ptr, last_ptr);
Packit 47f805
        DEBUGF(gfc, "remaining_headers =        %i \n", remaining_headers);
Packit 47f805
        DEBUGF(gfc, "bitsperframe:              %i \n", bitsPerFrame);
Packit 47f805
        DEBUGF(gfc, "sidelen:                   %i \n", cfg->sideinfo_len);
Packit 47f805
#endif
Packit 47f805
        ERRORF(gfc, "strange error flushing buffer ... \n");
Packit 47f805
    }
Packit 47f805
    return flushbits;
Packit 47f805
}
Packit 47f805
Packit 47f805
Packit 47f805
void
Packit 47f805
flush_bitstream(lame_internal_flags * gfc)
Packit 47f805
{
Packit 47f805
    EncStateVar_t *const esv = &gfc->sv_enc;
Packit 47f805
    III_side_info_t *l3_side;
Packit 47f805
    int     nbytes;
Packit 47f805
    int     flushbits;
Packit 47f805
    int     last_ptr = esv->h_ptr - 1; /* last header to add to bitstream */
Packit 47f805
    if (last_ptr == -1)
Packit 47f805
        last_ptr = MAX_HEADER_BUF - 1;
Packit 47f805
    l3_side = &gfc->l3_side;
Packit 47f805
Packit 47f805
Packit 47f805
    if ((flushbits = compute_flushbits(gfc, &nbytes)) < 0)
Packit 47f805
        return;
Packit 47f805
    drain_into_ancillary(gfc, flushbits);
Packit 47f805
Packit 47f805
    /* check that the 100% of the last frame has been written to bitstream */
Packit 47f805
    assert(esv->header[last_ptr].write_timing + getframebits(gfc)
Packit 47f805
           == gfc->bs.totbit);
Packit 47f805
Packit 47f805
    /* we have padded out all frames with ancillary data, which is the
Packit 47f805
       same as filling the bitreservoir with ancillary data, so : */
Packit 47f805
    esv->ResvSize = 0;
Packit 47f805
    l3_side->main_data_begin = 0;
Packit 47f805
}
Packit 47f805
Packit 47f805
Packit 47f805
Packit 47f805
Packit 47f805
void
Packit 47f805
add_dummy_byte(lame_internal_flags * gfc, unsigned char val, unsigned int n)
Packit 47f805
{
Packit 47f805
    EncStateVar_t *const esv = &gfc->sv_enc;
Packit 47f805
    int     i;
Packit 47f805
Packit 47f805
    while (n-- > 0u) {
Packit 47f805
        putbits_noheaders(gfc, val, 8);
Packit 47f805
Packit 47f805
        for (i = 0; i < MAX_HEADER_BUF; ++i)
Packit 47f805
            esv->header[i].write_timing += 8;
Packit 47f805
    }
Packit 47f805
}
Packit 47f805
Packit 47f805
Packit 47f805
/*
Packit 47f805
  format_bitstream()
Packit 47f805
Packit 47f805
  This is called after a frame of audio has been quantized and coded.
Packit 47f805
  It will write the encoded audio to the bitstream. Note that
Packit 47f805
  from a layer3 encoder's perspective the bit stream is primarily
Packit 47f805
  a series of main_data() blocks, with header and side information
Packit 47f805
  inserted at the proper locations to maintain framing. (See Figure A.7
Packit 47f805
  in the IS).
Packit 47f805
  */
Packit 47f805
int
Packit 47f805
format_bitstream(lame_internal_flags * gfc)
Packit 47f805
{
Packit 47f805
    SessionConfig_t const *const cfg = &gfc->cfg;
Packit 47f805
    EncStateVar_t *const esv = &gfc->sv_enc;
Packit 47f805
    int     bits, nbytes;
Packit 47f805
    III_side_info_t *l3_side;
Packit 47f805
    int     bitsPerFrame;
Packit 47f805
    l3_side = &gfc->l3_side;
Packit 47f805
Packit 47f805
    bitsPerFrame = getframebits(gfc);
Packit 47f805
    drain_into_ancillary(gfc, l3_side->resvDrain_pre);
Packit 47f805
Packit 47f805
    encodeSideInfo2(gfc, bitsPerFrame);
Packit 47f805
    bits = 8 * cfg->sideinfo_len;
Packit 47f805
    bits += writeMainData(gfc);
Packit 47f805
    drain_into_ancillary(gfc, l3_side->resvDrain_post);
Packit 47f805
    bits += l3_side->resvDrain_post;
Packit 47f805
Packit 47f805
    l3_side->main_data_begin += (bitsPerFrame - bits) / 8;
Packit 47f805
Packit 47f805
    /* compare number of bits needed to clear all buffered mp3 frames
Packit 47f805
     * with what we think the resvsize is: */
Packit 47f805
    if (compute_flushbits(gfc, &nbytes) != esv->ResvSize) {
Packit 47f805
        ERRORF(gfc, "Internal buffer inconsistency. flushbits <> ResvSize");
Packit 47f805
    }
Packit 47f805
Packit 47f805
Packit 47f805
    /* compare main_data_begin for the next frame with what we
Packit 47f805
     * think the resvsize is: */
Packit 47f805
    if ((l3_side->main_data_begin * 8) != esv->ResvSize) {
Packit 47f805
        ERRORF(gfc, "bit reservoir error: \n"
Packit 47f805
               "l3_side->main_data_begin: %i \n"
Packit 47f805
               "Resvoir size:             %i \n"
Packit 47f805
               "resv drain (post)         %i \n"
Packit 47f805
               "resv drain (pre)          %i \n"
Packit 47f805
               "header and sideinfo:      %i \n"
Packit 47f805
               "data bits:                %i \n"
Packit 47f805
               "total bits:               %i (remainder: %i) \n"
Packit 47f805
               "bitsperframe:             %i \n",
Packit 47f805
               8 * l3_side->main_data_begin,
Packit 47f805
               esv->ResvSize,
Packit 47f805
               l3_side->resvDrain_post,
Packit 47f805
               l3_side->resvDrain_pre,
Packit 47f805
               8 * cfg->sideinfo_len,
Packit 47f805
               bits - l3_side->resvDrain_post - 8 * cfg->sideinfo_len,
Packit 47f805
               bits, bits % 8, bitsPerFrame);
Packit 47f805
Packit 47f805
        ERRORF(gfc, "This is a fatal error.  It has several possible causes:");
Packit 47f805
        ERRORF(gfc, "90%%  LAME compiled with buggy version of gcc using advanced optimizations");
Packit 47f805
        ERRORF(gfc, " 9%%  Your system is overclocked");
Packit 47f805
        ERRORF(gfc, " 1%%  bug in LAME encoding library");
Packit 47f805
Packit 47f805
        esv->ResvSize = l3_side->main_data_begin * 8;
Packit 47f805
    };
Packit 47f805
    assert(gfc->bs.totbit % 8 == 0);
Packit 47f805
Packit 47f805
    if (gfc->bs.totbit > 1000000000) {
Packit 47f805
        /* to avoid totbit overflow, (at 8h encoding at 128kbs) lets reset bit counter */
Packit 47f805
        int     i;
Packit 47f805
        for (i = 0; i < MAX_HEADER_BUF; ++i)
Packit 47f805
            esv->header[i].write_timing -= gfc->bs.totbit;
Packit 47f805
        gfc->bs.totbit = 0;
Packit 47f805
    }
Packit 47f805
Packit 47f805
Packit 47f805
    return 0;
Packit 47f805
}
Packit 47f805
Packit 47f805
Packit 47f805
static int
Packit 47f805
do_gain_analysis(lame_internal_flags * gfc, unsigned char* buffer, int minimum)
Packit 47f805
{
Packit 47f805
    SessionConfig_t const *const cfg = &gfc->cfg;
Packit 47f805
    RpgStateVar_t const *const rsv = &gfc->sv_rpg;
Packit 47f805
    RpgResult_t *const rov = &gfc->ov_rpg;
Packit 47f805
#ifdef DECODE_ON_THE_FLY
Packit 47f805
    if (cfg->decode_on_the_fly) { /* decode the frame */
Packit 47f805
        sample_t pcm_buf[2][1152];
Packit 47f805
        int     mp3_in = minimum;
Packit 47f805
        int     samples_out = -1;
Packit 47f805
Packit 47f805
        /* re-synthesis to pcm.  Repeat until we get a samples_out=0 */
Packit 47f805
        while (samples_out != 0) {
Packit 47f805
Packit 47f805
            samples_out = hip_decode1_unclipped(gfc->hip, buffer, mp3_in, pcm_buf[0], pcm_buf[1]);
Packit 47f805
            /* samples_out = 0:  need more data to decode
Packit 47f805
             * samples_out = -1:  error.  Lets assume 0 pcm output
Packit 47f805
             * samples_out = number of samples output */
Packit 47f805
Packit 47f805
            /* set the lenght of the mp3 input buffer to zero, so that in the
Packit 47f805
             * next iteration of the loop we will be querying mpglib about
Packit 47f805
             * buffered data */
Packit 47f805
            mp3_in = 0;
Packit 47f805
Packit 47f805
            if (samples_out == -1) {
Packit 47f805
                /* error decoding. Not fatal, but might screw up
Packit 47f805
                 * the ReplayGain tag. What should we do? Ignore for now */
Packit 47f805
                samples_out = 0;
Packit 47f805
            }
Packit 47f805
            if (samples_out > 0) {
Packit 47f805
                /* process the PCM data */
Packit 47f805
Packit 47f805
                /* this should not be possible, and indicates we have
Packit 47f805
                 * overflown the pcm_buf buffer */
Packit 47f805
                assert(samples_out <= 1152);
Packit 47f805
Packit 47f805
                if (cfg->findPeakSample) {
Packit 47f805
                    int     i;
Packit 47f805
                    /* FIXME: is this correct? maybe Max(fabs(pcm),PeakSample) */
Packit 47f805
                    for (i = 0; i < samples_out; i++) {
Packit 47f805
                        if (pcm_buf[0][i] > rov->PeakSample)
Packit 47f805
                            rov->PeakSample = pcm_buf[0][i];
Packit 47f805
                        else if (-pcm_buf[0][i] > rov->PeakSample)
Packit 47f805
                            rov->PeakSample = -pcm_buf[0][i];
Packit 47f805
                    }
Packit 47f805
                    if (cfg->channels_out > 1)
Packit 47f805
                        for (i = 0; i < samples_out; i++) {
Packit 47f805
                            if (pcm_buf[1][i] > rov->PeakSample)
Packit 47f805
                                rov->PeakSample = pcm_buf[1][i];
Packit 47f805
                            else if (-pcm_buf[1][i] > rov->PeakSample)
Packit 47f805
                                rov->PeakSample = -pcm_buf[1][i];
Packit 47f805
                        }
Packit 47f805
                }
Packit 47f805
Packit 47f805
                if (cfg->findReplayGain)
Packit 47f805
                    if (AnalyzeSamples
Packit 47f805
                        (rsv->rgdata, pcm_buf[0], pcm_buf[1], samples_out,
Packit 47f805
                         cfg->channels_out) == GAIN_ANALYSIS_ERROR)
Packit 47f805
                        return -6;
Packit 47f805
Packit 47f805
            }       /* if (samples_out>0) */
Packit 47f805
        }           /* while (samples_out!=0) */
Packit 47f805
    }               /* if (gfc->decode_on_the_fly) */
Packit 47f805
#endif
Packit 47f805
    return minimum;
Packit 47f805
}
Packit 47f805
Packit 47f805
static int
Packit 47f805
do_copy_buffer(lame_internal_flags * gfc, unsigned char *buffer, int size)
Packit 47f805
{
Packit 47f805
    Bit_stream_struc *const bs = &gfc->bs;
Packit 47f805
    int const minimum = bs->buf_byte_idx + 1;
Packit 47f805
    if (minimum <= 0)
Packit 47f805
        return 0;
Packit 47f805
    if (minimum > size)
Packit 47f805
        return -1;      /* buffer is too small */
Packit 47f805
    memcpy(buffer, bs->buf, minimum);
Packit 47f805
    bs->buf_byte_idx = -1;
Packit 47f805
    bs->buf_bit_idx = 0;
Packit 47f805
    return minimum;
Packit 47f805
}
Packit 47f805
Packit 47f805
/* copy data out of the internal MP3 bit buffer into a user supplied
Packit 47f805
   unsigned char buffer.
Packit 47f805
Packit 47f805
   mp3data=0      indicates data in buffer is an id3tags and VBR tags
Packit 47f805
   mp3data=1      data is real mp3 frame data.
Packit 47f805
Packit 47f805
Packit 47f805
*/
Packit 47f805
int
Packit 47f805
copy_buffer(lame_internal_flags * gfc, unsigned char *buffer, int size, int mp3data)
Packit 47f805
{
Packit 47f805
    int const minimum = do_copy_buffer(gfc, buffer, size);
Packit 47f805
    if (minimum > 0 && mp3data) {
Packit 47f805
        UpdateMusicCRC(&gfc->nMusicCRC, buffer, minimum);
Packit 47f805
Packit 47f805
        /** sum number of bytes belonging to the mp3 stream
Packit 47f805
         *  this info will be written into the Xing/LAME header for seeking
Packit 47f805
         */
Packit 47f805
        gfc->VBR_seek_table.nBytesWritten += minimum;
Packit 47f805
Packit 47f805
        return do_gain_analysis(gfc, buffer, minimum);
Packit 47f805
    }                   /* if (mp3data) */
Packit 47f805
    return minimum;
Packit 47f805
}
Packit 47f805
Packit 47f805
Packit 47f805
void
Packit 47f805
init_bit_stream_w(lame_internal_flags * gfc)
Packit 47f805
{
Packit 47f805
    EncStateVar_t *const esv = &gfc->sv_enc;
Packit 47f805
Packit 47f805
    esv->h_ptr = esv->w_ptr = 0;
Packit 47f805
    esv->header[esv->h_ptr].write_timing = 0;
Packit 47f805
Packit 47f805
    gfc->bs.buf = lame_calloc(unsigned char, BUFFER_SIZE);
Packit 47f805
    gfc->bs.buf_size = BUFFER_SIZE;
Packit 47f805
    gfc->bs.buf_byte_idx = -1;
Packit 47f805
    gfc->bs.buf_bit_idx = 0;
Packit 47f805
    gfc->bs.totbit = 0;
Packit 47f805
}
Packit 47f805
Packit 47f805
/* end of bitstream.c */