|
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 */
|