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.
tdemultimedia/mpeglib/lib/splay/mpegsound.h

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