You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
249 lines
5.5 KiB
249 lines
5.5 KiB
// MPEG/WAVE Sound library
|
|
|
|
// (C) 1997 by Woo-jae Jung
|
|
|
|
// Mpegsound.h
|
|
// This is typeset for functions in MPEG/WAVE Sound library.
|
|
// Now, it's for only linux-pc-?86
|
|
|
|
/************************************/
|
|
/* Include default library packages */
|
|
/************************************/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include "config.h"
|
|
#endif
|
|
|
|
|
|
|
|
#include "mpegAudioStream.h"
|
|
#include "common.h"
|
|
|
|
class Synthesis;
|
|
class AudioFrame;
|
|
|
|
|
|
#ifndef _L__SOUND__
|
|
#define _L__SOUND__
|
|
|
|
#include "mpegAudioHeader.h"
|
|
#include "mpegAudioBitWindow.h"
|
|
|
|
|
|
//#define DEBUG_LAYER(x) x
|
|
#define DEBUG_LAYER(x)
|
|
|
|
|
|
/**************************/
|
|
/* Define values for MPEG */
|
|
/**************************/
|
|
#define SCALEBLOCK 12
|
|
#define MAXSUBBAND 32
|
|
#define MAXCHANNEL 2
|
|
#define RAWDATASIZE (2*2*2*32*SSLIMIT)
|
|
|
|
|
|
|
|
// Huffmancode
|
|
#define HTN 34
|
|
|
|
|
|
|
|
#define MODE_MONO 0
|
|
#define MODE_STEREO 1
|
|
|
|
/********************/
|
|
/* Type definitions */
|
|
/********************/
|
|
|
|
typedef struct {
|
|
bool generalflag;
|
|
unsigned int part2_3_length;
|
|
unsigned int big_values;
|
|
unsigned int global_gain;
|
|
unsigned int scalefac_compress;
|
|
unsigned int window_switching_flag;
|
|
unsigned int block_type;
|
|
unsigned int mixed_block_flag;
|
|
unsigned int table_select[3];
|
|
unsigned int subblock_gain[3];
|
|
unsigned int region0_count;
|
|
unsigned int region1_count;
|
|
unsigned int preflag;
|
|
unsigned int scalefac_scale;
|
|
unsigned int count1table_select;
|
|
}layer3grinfo;
|
|
|
|
typedef struct {
|
|
unsigned main_data_begin;
|
|
unsigned private_bits;
|
|
struct {
|
|
unsigned scfsi[4];
|
|
layer3grinfo gr[2];
|
|
}ch[2];
|
|
}layer3sideinfo;
|
|
|
|
typedef struct {
|
|
int l[23]; /* [cb] */
|
|
int s[3][13]; /* [window][cb] */
|
|
}layer3scalefactor; /* [ch] */
|
|
|
|
typedef struct {
|
|
int tablename;
|
|
unsigned int xlen,ylen;
|
|
unsigned int linbits;
|
|
unsigned int treelen;
|
|
const unsigned int (*val)[2];
|
|
}HUFFMANCODETABLE;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class DCT;
|
|
class Dump;
|
|
|
|
// Class for converting mpeg format to raw format
|
|
class Mpegtoraw {
|
|
/*****************************/
|
|
/* Constant tables for layer */
|
|
/*****************************/
|
|
private:
|
|
static const int bitrate[2][3][15];
|
|
static const int frequencies[2][3];
|
|
static const REAL scalefactorstable[64];
|
|
static const ATTR_ALIGN(64) HUFFMANCODETABLE ht[HTN];
|
|
|
|
|
|
friend class HuffmanLookup;
|
|
|
|
/*************************/
|
|
/* MPEG header variables */
|
|
/*************************/
|
|
|
|
// comes from constructor, decoder works on them
|
|
MpegAudioStream* mpegAudioStream;
|
|
MpegAudioHeader* mpegAudioHeader;
|
|
AudioFrame* audioFrame;
|
|
Dump* dump;
|
|
Synthesis* synthesis;
|
|
|
|
/***************************************/
|
|
/* Interface for setting music quality */
|
|
/***************************************/
|
|
|
|
int lWantStereo;
|
|
int lOutputStereo;
|
|
int lDownSample;
|
|
|
|
public:
|
|
Mpegtoraw(MpegAudioStream* mpegAudioStream,
|
|
MpegAudioHeader* mpegAudioHeader);
|
|
|
|
|
|
~Mpegtoraw();
|
|
int decode(AudioFrame* audioFrame);
|
|
|
|
|
|
void setStereo(int lStereo);
|
|
int getStereo();
|
|
|
|
void setDownSample(int lDownSample);
|
|
int getDownSample();
|
|
|
|
|
|
|
|
private:
|
|
void initialize();
|
|
|
|
|
|
|
|
/*****************************/
|
|
/* Loading MPEG-Audio stream */
|
|
/*****************************/
|
|
|
|
union
|
|
{
|
|
unsigned char store[4];
|
|
unsigned int current;
|
|
}u;
|
|
|
|
|
|
int getbyte() { return mpegAudioStream->getbyte(); }
|
|
int getbits(int bits) { return mpegAudioStream->getbits(bits); }
|
|
int getbits9(int bits) { return mpegAudioStream->getbits9(bits); }
|
|
int getbits8() { return mpegAudioStream->getbits8(); }
|
|
int getbit() { return mpegAudioStream->getbit(); }
|
|
|
|
|
|
void sync() { mpegAudioStream->sync(); }
|
|
bool issync() { return mpegAudioStream->issync(); }
|
|
|
|
|
|
/********************/
|
|
/* Global variables */
|
|
/********************/
|
|
|
|
// optimisation from maplay12+
|
|
// 0/1: nonzero for channel 0/1 2: max position for both
|
|
int nonzero[3];
|
|
|
|
// for Layer3
|
|
|
|
int layer3framestart;
|
|
int layer3part2start;
|
|
|
|
ATTR_ALIGN(64) REAL prevblck[2][2][SBLIMIT][SSLIMIT];
|
|
int currentprevblock;
|
|
ATTR_ALIGN(64) layer3sideinfo sideinfo;
|
|
ATTR_ALIGN(64) layer3scalefactor scalefactors[2];
|
|
|
|
ATTR_ALIGN(64) MpegAudioBitWindow bitwindow;
|
|
MpegAudioBitWindow lastValidBitwindow;
|
|
|
|
int wgetbit(void);
|
|
int wgetbits9(int bits);
|
|
int wgetbits(int bits);
|
|
int wgetCanReadBits();
|
|
|
|
/*************************************/
|
|
/* Decoding functions for each layer */
|
|
/*************************************/
|
|
|
|
// Extractor
|
|
void extractlayer1(void); // MPEG-1
|
|
void extractlayer2(void);
|
|
void extractlayer3(void);
|
|
void extractlayer3_2(void); // MPEG-2
|
|
|
|
|
|
// Functions for layer 3
|
|
void layer3initialize(void);
|
|
bool layer3getsideinfo(void);
|
|
bool layer3getsideinfo_2(void);
|
|
void layer3getscalefactors(int ch,int gr);
|
|
void layer3getscalefactors_2(int ch);
|
|
void layer3huffmandecode(int ch,int gr,int out[SBLIMIT][SSLIMIT]);
|
|
REAL layer3twopow2(int scale,int preflag,int pretab_offset,int l);
|
|
REAL layer3twopow2_1(int a,int b,int c);
|
|
void layer3dequantizesample(int ch,int gr,int in[SBLIMIT][SSLIMIT],
|
|
REAL out[SBLIMIT][SSLIMIT]);
|
|
void adjustNonZero(REAL in[2][SBLIMIT][SSLIMIT]);
|
|
void layer3fixtostereo(int gr,REAL in[2][SBLIMIT][SSLIMIT]);
|
|
void layer3reorderandantialias(int ch,int gr,REAL in[SBLIMIT][SSLIMIT],
|
|
REAL out[SBLIMIT][SSLIMIT]);
|
|
|
|
void layer3hybrid(int ch,int gr,REAL in[SBLIMIT][SSLIMIT],
|
|
REAL out[SSLIMIT][SBLIMIT]);
|
|
|
|
void huffmandecoder_1(const HUFFMANCODETABLE *h,int *x,int *y);
|
|
void huffmandecoder_2(const HUFFMANCODETABLE *h,int *x,int *y,int *v,int *w);
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|