233 lines
9.3 KiB
C
233 lines
9.3 KiB
C
#pragma once
|
|
|
|
#include "stdint-gcc.h"
|
|
|
|
#define SYNCWORDH 0xFF
|
|
#define SYNCWORDL 0xE0
|
|
#define DQ_FRACBITS_OUT 25 // number of fraction bits in output of dequant
|
|
#define CSHIFT 12 // coefficients have 12 leading sign bits for early-terminating mulitplies
|
|
#define SIBYTES_MPEG1_MONO 17
|
|
#define SIBYTES_MPEG1_STEREO 32
|
|
#define SIBYTES_MPEG2_MONO 9
|
|
#define SIBYTES_MPEG2_STEREO 17
|
|
#define IMDCT_SCALE 2 // additional scaling (by sqrt(2)) for fast IMDCT36
|
|
#define NGRANS_MPEG1 2
|
|
#define NGRANS_MPEG2 1
|
|
#define SQRTHALF 0x5a82799a // sqrt(0.5) in Q31 format
|
|
#define MAX_NGRAN 2 /* max granules */
|
|
#define MAX_NCHAN 2 /* max channels */
|
|
#define MAX_NSAMP 576 /* max samples per channel, per granule */
|
|
#define MAX_SCFBD 4 /* max scalefactor bands per channel */
|
|
#define NGRANS_MPEG1 2
|
|
#define NGRANS_MPEG2 1
|
|
#define HUFF_PAIRTABS 32
|
|
#define BLOCK_SIZE 18
|
|
#define NBANDS 32
|
|
#define MAX_REORDER_SAMPS (192 - 126) * 3 // largest critical band for short blocks (see sfBandTable)
|
|
#define VBUF_LENGTH 17 * 2 * NBANDS // for double-sized vbuf FIFO
|
|
#define MAX_SCFBD 4 // max scalefactor bands per channel
|
|
#define MAINBUF_SIZE 1940
|
|
#define MAX_NGRAN 2 // max granules
|
|
#define MAX_NCHAN 2 // max channels
|
|
#define MAX_NSAMP 576 // max samples per channel, per granule
|
|
#define CLZ(x) __builtin_clz(x) // fb
|
|
|
|
#define CLIP_2N(y, n) \
|
|
{ \
|
|
int32_t x = 1 << n; \
|
|
if (y < -x) y = -x; \
|
|
x--; \
|
|
if (y > x) y = x; \
|
|
}
|
|
|
|
#define D32FP(i, s1, s2) \
|
|
{ \
|
|
a0 = buf[i]; \
|
|
a3 = buf[31 - i]; \
|
|
a1 = buf[15 - i]; \
|
|
a2 = buf[16 + i]; \
|
|
b0 = a0 + a3; \
|
|
b3 = MULSHIFT32(*cptr++, a0 - a3) << 1; \
|
|
b1 = a1 + a2; \
|
|
b2 = MULSHIFT32(*cptr++, a1 - a2) << (s1); \
|
|
buf[i] = b0 + b1; \
|
|
buf[15 - i] = MULSHIFT32(*cptr, b0 - b1) << (s2); \
|
|
buf[16 + i] = b2 + b3; \
|
|
buf[31 - i] = MULSHIFT32(*cptr++, b3 - b2) << (s2); \
|
|
}
|
|
|
|
|
|
typedef struct MP3FrameInfo {
|
|
int32_t bitrate;
|
|
int32_t nChans;
|
|
int32_t samprate;
|
|
int32_t bitsPerSample;
|
|
int32_t outputSamps;
|
|
int32_t layer;
|
|
int32_t version;
|
|
} MP3FrameInfo_t;
|
|
|
|
typedef struct SFBandTable {
|
|
int32_t l[23];
|
|
int32_t s[14];
|
|
} SFBandTable_t;
|
|
|
|
typedef struct BitStreamInfo {
|
|
uint8_t* bytePtr;
|
|
uint32_t iCache;
|
|
int32_t cachedBits;
|
|
int32_t nBytes;
|
|
} BitStreamInfo_t;
|
|
|
|
typedef enum { /* map these to the corresponding 2-bit values in the frame header */
|
|
Stereo = 0x00, /* two independent channels, but L and R frames might have different # of bits */
|
|
Joint = 0x01, /* coupled channels - layer III: mix of M-S and intensity, Layers I/II: intensity and direct coding only */
|
|
Dual = 0x02, /* two independent channels, L and R always have exactly 1/2 the total bitrate */
|
|
Mono = 0x03 /* one channel */
|
|
} StereoMode_t;
|
|
|
|
typedef enum { /* map to 0,1,2 to make table indexing easier */
|
|
MPEG1 = 0,
|
|
MPEG2 = 1,
|
|
MPEG25 = 2
|
|
} MPEGVersion_t;
|
|
|
|
typedef struct FrameHeader {
|
|
int32_t layer; /* layer index (1, 2, or 3) */
|
|
int32_t crc; /* CRC flag: 0 = disabled, 1 = enabled */
|
|
int32_t brIdx; /* bitrate index (0 - 15) */
|
|
int32_t srIdx; /* sample rate index (0 - 2) */
|
|
int32_t paddingBit; /* padding flag: 0 = no padding, 1 = single pad byte */
|
|
int32_t privateBit; /* unused */
|
|
int32_t modeExt; /* used to decipher joint stereo mode */
|
|
int32_t copyFlag; /* copyright flag: 0 = no, 1 = yes */
|
|
int32_t origFlag; /* original flag: 0 = copy, 1 = original */
|
|
int32_t emphasis; /* deemphasis mode */
|
|
int32_t CRCWord; /* CRC word (16 bits, 0 if crc not enabled) */
|
|
} FrameHeader_t;
|
|
|
|
typedef struct SideInfoSub {
|
|
int32_t part23Length; /* number of bits in main data */
|
|
int32_t nBigvals; /* 2x this = first set of Huffman cw's (maximum amplitude can be > 1) */
|
|
int32_t globalGain; /* overall gain for dequantizer */
|
|
int32_t sfCompress; /* unpacked to figure out number of bits in scale factors */
|
|
int32_t winSwitchFlag; /* window switching flag */
|
|
int32_t blockType; /* block type */
|
|
int32_t mixedBlock; /* 0 = regular block (all short or long), 1 = mixed block */
|
|
int32_t tableSelect[3]; /* index of Huffman tables for the big values regions */
|
|
int32_t subBlockGain[3]; /* subblock gain offset, relative to global gain */
|
|
int32_t region0Count; /* 1+region0Count = num scale factor bands in first region of bigvals */
|
|
int32_t region1Count; /* 1+region1Count = num scale factor bands in second region of bigvals */
|
|
int32_t preFlag; /* for optional high frequency boost */
|
|
int32_t sfactScale; /* scaling of the scalefactors */
|
|
int32_t count1TableSelect; /* index of Huffman table for quad codewords */
|
|
} SideInfoSub_t;
|
|
|
|
typedef struct SideInfo {
|
|
int32_t mainDataBegin;
|
|
int32_t privateBits;
|
|
int32_t scfsi[MAX_NCHAN][MAX_SCFBD]; /* 4 scalefactor bands per channel */
|
|
} SideInfo_t;
|
|
|
|
typedef struct {
|
|
int32_t cbType; /* pure long = 0, pure short = 1, mixed = 2 */
|
|
int32_t cbEndS[3]; /* number nonzero short cb's, per subbblock */
|
|
int32_t cbEndSMax; /* max of cbEndS[] */
|
|
int32_t cbEndL; /* number nonzero long cb's */
|
|
} CriticalBandInfo_t;
|
|
|
|
typedef struct DequantInfo {
|
|
int32_t workBuf[MAX_REORDER_SAMPS]; /* workbuf for reordering short blocks */
|
|
} DequantInfo_t;
|
|
|
|
typedef struct HuffmanInfo {
|
|
int32_t huffDecBuf[MAX_NCHAN][MAX_NSAMP]; /* used both for decoded Huffman values and dequantized coefficients */
|
|
int32_t nonZeroBound[MAX_NCHAN]; /* number of coeffs in huffDecBuf[ch] which can be > 0 */
|
|
int32_t gb[MAX_NCHAN]; /* minimum number of guard bits in huffDecBuf[ch] */
|
|
} HuffmanInfo_t;
|
|
|
|
typedef enum HuffTabType { noBits, oneShot, loopNoLinbits, loopLinbits, quadA, quadB, invalidTab } HuffTabType_t;
|
|
|
|
typedef struct HuffTabLookup {
|
|
int32_t linBits;
|
|
int32_t tabType; /*HuffTabType*/
|
|
} HuffTabLookup_t;
|
|
|
|
typedef struct IMDCTInfo {
|
|
int32_t outBuf[MAX_NCHAN][BLOCK_SIZE][NBANDS]; /* output of IMDCT */
|
|
int32_t overBuf[MAX_NCHAN][MAX_NSAMP / 2]; /* overlap-add buffer (by symmetry, only need 1/2 size) */
|
|
int32_t numPrevIMDCT[MAX_NCHAN]; /* how many IMDCT's calculated in this channel on prev. granule */
|
|
int32_t prevType[MAX_NCHAN];
|
|
int32_t prevWinSwitch[MAX_NCHAN];
|
|
int32_t gb[MAX_NCHAN];
|
|
} IMDCTInfo_t;
|
|
|
|
typedef struct BlockCount {
|
|
int32_t nBlocksLong;
|
|
int32_t nBlocksTotal;
|
|
int32_t nBlocksPrev;
|
|
int32_t prevType;
|
|
int32_t prevWinSwitch;
|
|
int32_t currWinSwitch;
|
|
int32_t gbIn;
|
|
int32_t gbOut;
|
|
} BlockCount_t;
|
|
|
|
typedef struct ScaleFactorInfoSub { /* max bits in scalefactors = 5, so use char's to save space */
|
|
char l[23]; /* [band] */
|
|
char s[13][3]; /* [band][window] */
|
|
} ScaleFactorInfoSub_t;
|
|
|
|
typedef struct ScaleFactorJS { /* used in MPEG 2, 2.5 intensity (joint) stereo only */
|
|
int32_t intensityScale;
|
|
int32_t slen[4];
|
|
int32_t nr[4];
|
|
} ScaleFactorJS_t;
|
|
|
|
/* NOTE - could get by with smaller vbuf if memory is more important than speed
|
|
* (in Subband, instead of replicating each block in FDCT32 you would do a memmove on the
|
|
* last 15 blocks to shift them down one, a hardware style FIFO)
|
|
*/
|
|
typedef struct SubbandInfo {
|
|
int32_t vbuf[MAX_NCHAN * VBUF_LENGTH]; /* vbuf for fast DCT-based synthesis PQMF - double size for speed (no modulo indexing) */
|
|
int32_t vindex; /* internal index for tracking position in vbuf */
|
|
} SubbandInfo_t;
|
|
|
|
typedef struct MP3DecInfo {
|
|
/* buffer which must be large enough to hold largest possible main_data section */
|
|
uint8_t mainBuf[MAINBUF_SIZE];
|
|
/* special info for "free" bitrate files */
|
|
int32_t freeBitrateFlag;
|
|
int32_t freeBitrateSlots;
|
|
/* user-accessible info */
|
|
int32_t bitrate;
|
|
int32_t nChans;
|
|
int32_t samprate;
|
|
int32_t nGrans; /* granules per frame */
|
|
int32_t nGranSamps; /* samples per granule */
|
|
int32_t nSlots;
|
|
int32_t layer;
|
|
|
|
int32_t mainDataBegin;
|
|
int32_t mainDataBytes;
|
|
int32_t part23Length[MAX_NGRAN][MAX_NCHAN];
|
|
} MP3DecInfo_t;
|
|
|
|
typedef struct {
|
|
uint8_t mpeg_version; // 0=MPEG2.5, 1=reserved, 2=MPEG2, 3=MPEG1
|
|
uint8_t layer; // 0=reserved, 1=Layer III, 2=Layer II, 3=Layer I
|
|
bool crc_protected;
|
|
uint8_t bitrate_idx;
|
|
uint8_t sample_rate_idx;
|
|
bool padding;
|
|
uint8_t channel_mode;
|
|
uint32_t frame_length; // In Bytes
|
|
} Mp3FrameHeader;
|
|
|
|
struct invalid_frame {
|
|
uint32_t timer = 0;
|
|
bool start = true;
|
|
uint32_t count1 = 0;
|
|
uint32_t count2 = 0;
|
|
|
|
}; |