You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123 lines
4.4 KiB
C

/*
* Musepack audio compression
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#pragma once
#include <mpc/mpc_types.h>
#include <stdio.h>
// FIXME : define this somewhere else
#ifndef NULL
#define NULL 0
#endif
#define MPC_FRAME_LENGTH (36 * 32)
#define MAX_FRAME_SIZE 4352
typedef struct {
mpc_uint16_t Code; // >= 14 bit
mpc_uint16_t Length; // >= 4 bit
} Huffman_t;
typedef struct {
mpc_uint_t pos; // next free byte position in the buffer
mpc_uint_t bitsCount; // number of used bits in bitsBuff
mpc_uint64_t outputBits; // Counter for the number of written bits in the bitstream
mpc_uint32_t bitsBuff; // bits buffer
mpc_uint8_t * buffer; // Buffer for bitstream-file
mpc_uint_t framesInBlock; // Number of frames in current block
mpc_uint_t frames_per_block_pwr; // Number of frame in a block = 1 << frames_per_block_pwr
// seeking
mpc_uint32_t * seek_table;
mpc_uint32_t seek_pos; /// current position in the seek table
mpc_uint32_t seek_ref; /// reference position for the seek information
mpc_uint32_t seek_ptr; /// position of the seek pointer block
mpc_uint32_t seek_pwr; /// keep a seek table entry every 2^seek_pwr block
mpc_uint32_t block_cnt; /// number of encoded blocks
FILE * outputFile; // ouput file
mpc_uint32_t MS_Channelmode;
mpc_uint32_t Overflows; // = 0; // number of internal (filterbank) clippings
mpc_uint32_t MaxBand; /// number of non zero bands in last frame
mpc_int32_t SCF_Index_L [32] [3];
mpc_int32_t SCF_Index_R [32] [3]; // holds scalefactor-indices
mpc_int32_t SCF_Last_L [32];
mpc_int32_t SCF_Last_R [32]; // Last coded SCF value
mpc_quantizer Q [32]; // holds quantized samples
mpc_int32_t Res_L [32];
mpc_int32_t Res_R [32]; // holds the chosen quantizer for each subband
mpc_bool_t DSCF_Flag_L [32];
mpc_bool_t DSCF_Flag_R [32]; // differential SCF used?
mpc_bool_t MS_Flag[32]; // MS used?
} mpc_encoder_t;
void mpc_encoder_init ( mpc_encoder_t * e,
mpc_uint64_t SamplesInWAVE,
unsigned int FramesBlockPwr,
unsigned int SeekDistance );
void mpc_encoder_exit ( mpc_encoder_t * e );
void writeStreamInfo ( mpc_encoder_t*e,
const unsigned int MaxBand,
const unsigned int MS_on,
const unsigned int SamplesCount,
const unsigned int SamplesSkip,
const unsigned int SampleFreq,
const unsigned int ChannelCount);
void writeGainInfo ( mpc_encoder_t * e,
unsigned short t_gain,
unsigned short t_peak,
unsigned short a_gain,
unsigned short a_peak);
void writeEncoderInfo ( mpc_encoder_t * e,
const float profile,
const int PNS_on,
const int version_major,
const int version_minor,
const int version_build );
mpc_uint32_t writeBlock ( mpc_encoder_t *, const char *, const mpc_bool_t, mpc_uint32_t);
void writeMagic (mpc_encoder_t * e);
void emptyBits(mpc_encoder_t * e);
/// maximum number of output bits is 31 !
static mpc_inline void writeBits (mpc_encoder_t * e, mpc_uint32_t input, unsigned int bits )
{
e->outputBits += bits;
if (e->bitsCount + bits > sizeof(e->bitsBuff) * 8) {
int tmp = (sizeof(e->bitsBuff) * 8 - e->bitsCount);
bits -= tmp;
e->bitsBuff = (e->bitsBuff << tmp) | (input >> bits);
e->bitsCount = sizeof(e->bitsBuff) * 8;
emptyBits(e);
input &= (1 << bits) - 1;
}
e->bitsBuff = (e->bitsBuff << bits) | input;
e->bitsCount += bits;
}
void writeSeekTable (mpc_encoder_t * e);
void writeBitstream_SV8 ( mpc_encoder_t*, int);
unsigned int encodeSize(mpc_uint64_t, char *, mpc_bool_t);
void encodeEnum(mpc_encoder_t * e, const mpc_uint32_t bits, const mpc_uint_t N);
void encodeLog(mpc_encoder_t * e, mpc_uint32_t value, mpc_uint32_t max);