mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-09-24 15:54:12 +00:00
193 lines
6.3 KiB
C
193 lines
6.3 KiB
C
|
/* $Header: /cvs/root/winamp/vlb/DolbyPayload.h,v 1.1 2009/04/28 20:21:07 audiodsp Exp $ */
|
||
|
|
||
|
/***************************************************************************\
|
||
|
*
|
||
|
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
|
||
|
* Reserved. Do not copy. Do not distribute.
|
||
|
* Confidential information.
|
||
|
*
|
||
|
* filename: DolbyPayload.h
|
||
|
* project : MPEG-2 AAC Decoder
|
||
|
* contents/description: Dolby SE bitstream parser include file
|
||
|
*
|
||
|
\***************************************************************************/
|
||
|
|
||
|
#ifndef _DolbyPayload_h_
|
||
|
#define _DolbyPayload_h_
|
||
|
|
||
|
//This is the quickest way to get all the Dolby Payload into the AAC Decoder but not the best!
|
||
|
#include<math.h>
|
||
|
#include<stdlib.h>
|
||
|
#include<stdio.h>
|
||
|
#include"bitstream.h"
|
||
|
|
||
|
#define DSPmax(a,b) (((a) > (b)) ? (a) : (b));
|
||
|
#define DSPmin(a,b) (((a) < (b)) ? (a) : (b));
|
||
|
|
||
|
#define DNS
|
||
|
#define SIGNAL_SUB
|
||
|
#define DOLBY_MAX_NUM_SFB 64
|
||
|
#define DOLBY_BLOCK_LEN_LONG 1024
|
||
|
#define SS_BUF_LEN_LONG 150
|
||
|
#define SS_BUF_LEN_SHORT 18
|
||
|
#define SS_COPYSTART 50
|
||
|
#define SS_STEP_LONG 10 /* note that SS_STEP_LONG must divide into SS_BUF_LEN_LONG without remainder,
|
||
|
to assure that all values in normCopy array are power normalized.*/
|
||
|
#define SS_STEP_SHORT 3 /* note that SS_STEP_SHORT must divide into SS_BUF_LEN_SHORT without remainder,
|
||
|
to assure that all values in normCopy array are power normalized.*/
|
||
|
|
||
|
#define GLOBAL_ATTEN 0.08f
|
||
|
#define NS_ATTEN1_LONG 0.975f
|
||
|
#define NS_ATTEN2_LONG 0.90f
|
||
|
#define NS_ATTEN1_SHORT 0.90f /* 0.816 would be attenuation factor to apply same per octave attenuation as
|
||
|
short block, but it is desireable to allow gentler rolloff for short blocks.
|
||
|
Thus set to 0.90. */
|
||
|
#define NS_ATTEN2_SHORT 0.7f /* To apply the same per octave attenuation as long block, the slope would
|
||
|
be too sharp (greater than 6dB from bin to bin), thus allow a gentler slope
|
||
|
for short blocks due to flat nature of short block spectra. */
|
||
|
#define NSFILT_COEF 0.3f
|
||
|
#define BACKWARD_MASK_COMP 0.95f
|
||
|
#define START_BIN_LONG 50
|
||
|
#define START_BIN_SHORT (START_BIN_LONG / 8)
|
||
|
#define SE_MAX_NUM_BANDS 80
|
||
|
#define MAX_NUM_POWER_VALUES SE_MAX_NUM_BANDS
|
||
|
|
||
|
|
||
|
|
||
|
#define SE_BAND_IGNORE_BITS 3
|
||
|
#define SE_NSHAPE_ORDER 2
|
||
|
#define NOISE_LENGTH 10000
|
||
|
#define NUM_BANDRES_OPTIONS 2
|
||
|
#define SE_BANDRES_2_67_DB 0
|
||
|
#define SE_BANDRES_1_33_DB 1
|
||
|
#define NUM_BLOCKTYPES 4
|
||
|
#define MAX_NUM_WINDOW_GROUPS 8
|
||
|
#define SE_DNS_PWR_BITS_SHORT 3
|
||
|
#define SE_DNS_PWR_BITS_LONG 4
|
||
|
#define SE_SPECT_FLAT_BITS_LONG 8
|
||
|
#define SE_SPECT_FLAT_BITS_SHORT 4
|
||
|
#define SE_REF_ENERG_BITS_LONG 8
|
||
|
#define SE_REF_ENERG_BITS_SHORT 7
|
||
|
|
||
|
// buffer model control variables
|
||
|
#define NEW_BUFFER_MODEL /* if #defined, uses the new buffer model which accounts for */
|
||
|
/* frequency alignment between non-short and short frames */
|
||
|
//#define DEBUG_PRINT_BUFFER_MODEL /* if #defined, prints out buffer model. Check the exact if statement */
|
||
|
/* in the code to see whether or not the long or short buffer model is being printed out */
|
||
|
|
||
|
#define USE_XFORM_HYSTERESIS
|
||
|
#define XFORM_HYSTERESIS_LENGTH 2 /* Hysteresis for switching SE transform lengths. Relevant
|
||
|
* only if USE_XFORM_HYSTERESIS is #define'd.
|
||
|
* NOTE: Should be between 2 and (2 * NRDB per SE frame) inclusive or
|
||
|
* even a clean switch (from single to double or vice-versa) will
|
||
|
* elicit an unnecessary sound card close/re-open/glitch (twice).
|
||
|
*/
|
||
|
|
||
|
struct SECTION_INFORMATION_STRUCT{
|
||
|
int aiSectionCount[MAX_NUM_WINDOW_GROUPS];
|
||
|
int aaiSectionCodebooks[MAX_NUM_WINDOW_GROUPS][DOLBY_MAX_NUM_SFB];
|
||
|
int aaiSectionStart[MAX_NUM_WINDOW_GROUPS][DOLBY_MAX_NUM_SFB];
|
||
|
int aaiSectionEnd[MAX_NUM_WINDOW_GROUPS][DOLBY_MAX_NUM_SFB];
|
||
|
};
|
||
|
|
||
|
struct DNS_INFORMATION_STRUCT{
|
||
|
int iWindowSequence;
|
||
|
int iGroupCount;
|
||
|
int iGroupLength[MAX_NUM_WINDOW_GROUPS];
|
||
|
int iMaxSFB;
|
||
|
int iLastBin;
|
||
|
const int *piBandOffsets;
|
||
|
const SECTION_INFORMATION_STRUCT *psSectionInfoStruct;
|
||
|
float aafDNSRatio[MAX_NUM_WINDOW_GROUPS][DOLBY_MAX_NUM_SFB];
|
||
|
};
|
||
|
|
||
|
struct DOLBY_PAYLOAD_STRUCT{
|
||
|
int iDolbyBitStreamWarning;
|
||
|
int iUsesDoubleLengthXForm;
|
||
|
int iSEPowerResolution;
|
||
|
int iChannels;
|
||
|
int iSampleRateIndex;
|
||
|
int iSampleRate;
|
||
|
int num_se_bands[2];
|
||
|
int seBands[2][MAX_NUM_WINDOW_GROUPS][SE_MAX_NUM_BANDS];
|
||
|
int sfm[2][MAX_NUM_WINDOW_GROUPS];
|
||
|
int delta_power_values[2][MAX_NUM_WINDOW_GROUPS][MAX_NUM_POWER_VALUES];
|
||
|
float fdamp[2][MAX_NUM_WINDOW_GROUPS];
|
||
|
int SE_num_ignored_upper_bands[2];
|
||
|
int aiMaxSFB[2];
|
||
|
int aiTotalSFB[2];
|
||
|
int aiCopyStop[2];
|
||
|
int iGroupLength[2][MAX_NUM_WINDOW_GROUPS];
|
||
|
int iGroupCount[2];
|
||
|
|
||
|
DNS_INFORMATION_STRUCT asDNSInfoStruct[2];
|
||
|
};
|
||
|
|
||
|
struct Huffman
|
||
|
{
|
||
|
int index;
|
||
|
int len;
|
||
|
unsigned long cw;
|
||
|
} ;
|
||
|
|
||
|
struct Huffman_lookup
|
||
|
{
|
||
|
int index;
|
||
|
int len;
|
||
|
int cw;
|
||
|
};
|
||
|
|
||
|
typedef struct {
|
||
|
unsigned int sr;
|
||
|
unsigned int* SE_bands_bw;
|
||
|
unsigned char SE_max_num_se_bands;
|
||
|
unsigned char SE_num_ignored_upper_bands;
|
||
|
} SE_Band_Info_struct;
|
||
|
|
||
|
typedef struct {
|
||
|
int powerResolution;
|
||
|
Huffman* cwLengthLookupTable;
|
||
|
Huffman_lookup* cwValueLookupTable;
|
||
|
int num_codewords;
|
||
|
} SE_power_resolution_table_struct;
|
||
|
|
||
|
|
||
|
void applyDNS( float *pfSpectralData,
|
||
|
DNS_INFORMATION_STRUCT*psDNSInfoStruct,
|
||
|
int iPrevWnd);
|
||
|
|
||
|
|
||
|
unsigned char computeSeBandInfo (unsigned int SRate, /* input: Sample Rate */
|
||
|
unsigned int first_SE_bin, /* input: bin number of the first bin of the extension range */
|
||
|
SE_Band_Info_struct* pSE_Band_Info_struct, /* input: SE band info struct ptr */
|
||
|
int* SE_bands_bw, /* output: SE bandwidths, in bins (array; memory assumed to be already allocated) */
|
||
|
int* num_SE_bands);
|
||
|
|
||
|
int spectralExtInfo( int cnt,
|
||
|
DOLBY_PAYLOAD_STRUCT *seData,
|
||
|
CDolbyBitStream*poBitStream);
|
||
|
void spectralExtend(float* pfData,
|
||
|
int iCopyStart,
|
||
|
int iCopyStop,
|
||
|
int iSfm,
|
||
|
int iBandCount,
|
||
|
int* piBands,
|
||
|
int* delta_power_values,
|
||
|
float fDamp,
|
||
|
int iHBlockSize,
|
||
|
int wnd,
|
||
|
int SEPowerResolution,
|
||
|
int iPreviousWnd,
|
||
|
float* avgCopyEnergies);
|
||
|
|
||
|
void computeAvgCopyEnergies(float* pfData,
|
||
|
int iCopyStart,
|
||
|
int iCopyStop,
|
||
|
int num_se_bands,
|
||
|
int* piBands,
|
||
|
int halfWindowLength,
|
||
|
int iWindowSequence,
|
||
|
float* avgCopyEnergies);
|
||
|
|
||
|
|
||
|
#endif
|