mirror of
https://github.com/DrBeef/Raze.git
synced 2024-11-16 09:21:12 +00:00
7b0104e9a1
git-svn-id: https://svn.eduke32.com/eduke32@452 1a8010ca-5511-0410-912e-c29ae57300e0
211 lines
5 KiB
C
Executable file
211 lines
5 KiB
C
Executable file
/*
|
|
* mpadec - MPEG audio decoder
|
|
* Copyright (C) 2002-2004 Dmitriy Startsev (dstartsev@rambler.ru)
|
|
*
|
|
* 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
|
|
*/
|
|
|
|
/* $Id: mpadec_internal.h,v 1.1.1.1 2004/07/27 02:57:55 metal_man Exp $ */
|
|
|
|
#ifndef __MPADEC_INTERNAL_H
|
|
#define __MPADEC_INTERNAL_H
|
|
|
|
#include "mpadec.h"
|
|
|
|
#define MPADEC_STATE_UNDEFINED 0
|
|
#define MPADEC_STATE_START 1
|
|
#define MPADEC_STATE_DECODE 2
|
|
|
|
#define MPG_MD_STEREO 0
|
|
#define MPG_MD_JOINT_STEREO 1
|
|
#define MPG_MD_DUAL_CHANNEL 2
|
|
#define MPG_MD_MONO 3
|
|
|
|
#define SBLIMIT 32
|
|
#define SSLIMIT 18
|
|
#define SCALE_BLOCK 12
|
|
|
|
typedef struct {
|
|
FLOAT decwin[512 + 32];
|
|
FLOAT muls[27][64];
|
|
FLOAT gainpow2[256 + 122];
|
|
FLOAT ispow[8207];
|
|
FLOAT win[2][4][36];
|
|
FLOAT *istabs[3][2][2];
|
|
FLOAT tan1_1[16];
|
|
FLOAT tan2_1[16];
|
|
FLOAT tan1_2[16];
|
|
FLOAT tan2_2[16];
|
|
FLOAT pow1_1[2][16];
|
|
FLOAT pow2_1[2][16];
|
|
FLOAT pow1_2[2][16];
|
|
FLOAT pow2_2[2][16];
|
|
int32_t long_limit[9][23];
|
|
int32_t short_limit[9][14];
|
|
int32_t n_slen2[512];
|
|
int32_t i_slen2[256];
|
|
int32_t mapbuf0[9][152];
|
|
int32_t mapbuf1[9][156];
|
|
int32_t mapbuf2[9][44];
|
|
int32_t *map[9][3];
|
|
int32_t *mapend[9][3];
|
|
uint8_t *mp2tables[10];
|
|
uint8_t grp3tab[32*3];
|
|
uint8_t grp5tab[128*3];
|
|
uint8_t grp9tab[1024*3];
|
|
} mpadec_tables_t;
|
|
|
|
typedef struct {
|
|
uint16_t bits;
|
|
int16_t d;
|
|
} alloc_table_t;
|
|
|
|
typedef struct {
|
|
uint32_t linbits;
|
|
int16_t *table;
|
|
} newhuff_t;
|
|
|
|
typedef struct {
|
|
int16_t long_idx[23];
|
|
int16_t long_diff[22];
|
|
int16_t short_idx[14];
|
|
int16_t short_diff[13];
|
|
} bandinfo_t;
|
|
|
|
typedef struct {
|
|
uint8_t layer;
|
|
uint8_t mode;
|
|
uint8_t channels;
|
|
uint8_t decoded_channels;
|
|
uint8_t LSF;
|
|
uint8_t MPEG25;
|
|
uint8_t CRC;
|
|
uint8_t extension;
|
|
uint8_t mode_ext;
|
|
uint8_t copyright;
|
|
uint8_t original;
|
|
uint8_t emphasis;
|
|
uint8_t jsbound;
|
|
uint8_t sblimit;
|
|
uint8_t downsample;
|
|
uint8_t downsample_sblimit;
|
|
uint16_t crc;
|
|
uint16_t rsvd;
|
|
uint32_t padding;
|
|
uint32_t bitrate_index;
|
|
uint32_t frequency_index;
|
|
uint32_t bitrate;
|
|
uint32_t frequency;
|
|
uint32_t frame_size;
|
|
uint32_t frame_samples;
|
|
uint32_t decoded_frequency;
|
|
uint32_t decoded_samples;
|
|
uint32_t decoded_size;
|
|
alloc_table_t *alloc_table;
|
|
} frameinfo_t;
|
|
|
|
typedef struct {
|
|
int32_t scfsi;
|
|
uint32_t part2_3_length;
|
|
uint32_t big_values;
|
|
uint32_t scalefac_compress;
|
|
uint8_t block_type;
|
|
uint8_t mixed_block_flag;
|
|
uint8_t preflag;
|
|
uint8_t scalefac_scale;
|
|
uint32_t table_select[3];
|
|
uint32_t subblock_gain[3];
|
|
uint32_t maxband[3];
|
|
uint32_t maxbandl;
|
|
uint32_t maxb;
|
|
uint32_t region1start;
|
|
uint32_t region2start;
|
|
uint32_t count1table_select;
|
|
FLOAT *full_gain[3];
|
|
FLOAT *pow2gain;
|
|
} grinfo_t;
|
|
|
|
typedef struct {
|
|
uint32_t main_data_begin;
|
|
uint32_t private_bits;
|
|
struct {
|
|
grinfo_t gr[2];
|
|
} ch[2];
|
|
} sideinfo_t;
|
|
|
|
struct mpadec_t {
|
|
uint32_t size;
|
|
uint32_t state;
|
|
uint8_t *next_byte;
|
|
uint32_t bytes_left;
|
|
uint32_t bit_buffer;
|
|
uint8_t bits_left;
|
|
uint8_t error;
|
|
uint8_t free_format;
|
|
uint8_t pad1;
|
|
uint32_t sample_size;
|
|
uint32_t prev_frame_size;
|
|
uint32_t header;
|
|
uint32_t hsize;
|
|
uint32_t ssize;
|
|
uint32_t dsize;
|
|
uint16_t crc;
|
|
uint16_t pad2;
|
|
uint32_t skip_samples;
|
|
uint32_t padding_samples;
|
|
uint32_t padding_start;
|
|
uint32_t decoded_frames;
|
|
uint32_t decoded_samples;
|
|
mp3tag_info_t tag_info;
|
|
uint32_t synth_size;
|
|
FLOAT replay_gain;
|
|
void (*synth_func)(void *mpadec, FLOAT block[SBLIMIT], int channel, uint8_t *buffer);
|
|
uint32_t reservoir_size;
|
|
uint8_t reservoir[2048];
|
|
frameinfo_t frame;
|
|
sideinfo_t sideinfo;
|
|
mpadec_config_t config;
|
|
mpadec_tables_t tables;
|
|
uint32_t synth_bufoffs;
|
|
uint8_t hybrid_block[4];
|
|
FLOAT hybrid_in[2][SBLIMIT][SSLIMIT];
|
|
FLOAT hybrid_out[2][SSLIMIT][SBLIMIT];
|
|
FLOAT hybrid_buffers[2][2][SBLIMIT*SSLIMIT];
|
|
FLOAT synth_buffers[2][2][0x110];
|
|
};
|
|
|
|
struct mpabuffer_t {
|
|
uint32_t size;
|
|
uint32_t offset;
|
|
uint32_t used;
|
|
uint8_t *buffer;
|
|
struct mpabuffer_t *next;
|
|
};
|
|
|
|
struct mpadec2_t {
|
|
uint32_t size;
|
|
mpadec_t mpadec;
|
|
struct mpabuffer_t *buffers;
|
|
uint32_t in_buffer_offset;
|
|
uint32_t in_buffer_used;
|
|
uint32_t out_buffer_offset;
|
|
uint32_t out_buffer_used;
|
|
uint8_t in_buffer[0x10000];
|
|
uint8_t out_buffer[8*1152];
|
|
};
|
|
|
|
#define GETBITS(n) ((mpa->bits_left >= (uint8_t)(n)) ? ((mpa->bit_buffer >> (mpa->bits_left -= (uint8_t)(n))) & bitmask[n]) : getbits(mpa, n))
|
|
|
|
#endif
|