| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 | /* ***** BEGIN LICENSE BLOCK *****   * Source last modified: $Id: aaccommon.h,v 1.1 2005/02/26 01:47:34 jrecker Exp $  *    * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved.   *        * The contents of this file, and the files included with this file,  * are subject to the current version of the RealNetworks Public  * Source License (the "RPSL") available at  * http://www.helixcommunity.org/content/rpsl unless you have licensed  * the file under the current version of the RealNetworks Community  * Source License (the "RCSL") available at  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL  * will apply. You may also obtain the license terms directly from  * RealNetworks.  You may not use this file except in compliance with  * the RPSL or, if you have a valid RCSL with RealNetworks applicable  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for  * the rights, obligations and limitations governing use of the  * contents of the file.  *    * This file is part of the Helix DNA Technology. RealNetworks is the  * developer of the Original Code and owns the copyrights in the  * portions it created.  *    * This file, and the files included with this file, is distributed  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET  * ENJOYMENT OR NON-INFRINGEMENT.  *   * Technology Compatibility Kit Test Suite(s) Location:   *    http://www.helixcommunity.org/content/tck   *   * Contributor(s):   *    * ***** END LICENSE BLOCK ***** */  /************************************************************************************** * Fixed-point HE-AAC decoder * Jon Recker (jrecker@real.com) * February 2005 * * aaccommon.h - implementation-independent API's, datatypes, and definitions **************************************************************************************/#ifndef _AACCOMMON_H#define _AACCOMMON_H#ifdef ESP8266#  include "pgmspace.h"#elif defined(ESP_PLATFORM) && __has_include(<pgm_space.h>)#  include <pgm_space.h>#else#  define PROGMEM#  define pgm_read_byte(addr) (*(const unsigned char *)(addr))#  define pgm_read_word(addr) (*(const unsigned short *)(addr))#endif// Can't fit in ESP8266 RAM#ifndef ESP8266  #define AAC_ENABLE_SBR 1 #endif#pragma GCC optimize ("O3")#include "aacdec.h"#include "statname.h"/* 12-bit syncword */#define	SYNCWORDH			0xff#define	SYNCWORDL			0xf0#define MAX_NCHANS_ELEM		2	/* max number of channels in any single bitstream element (SCE,CPE,CCE,LFE) */#define ADTS_HEADER_BYTES	7#define NUM_SAMPLE_RATES	12#define NUM_DEF_CHAN_MAPS	8#define NUM_ELEMENTS		8#define MAX_NUM_PCE_ADIF	16#define MAX_WIN_GROUPS		8#define MAX_SFB_SHORT		15#define MAX_SF_BANDS		(MAX_SFB_SHORT*MAX_WIN_GROUPS)	/* worst case = 15 sfb's * 8 windows for short block */#define MAX_MS_MASK_BYTES	((MAX_SF_BANDS + 7) >> 3)#define MAX_PRED_SFB		41#define MAX_TNS_FILTERS		8#define MAX_TNS_COEFS		60#define MAX_TNS_ORDER		20#define MAX_PULSES			4#define MAX_GAIN_BANDS		3#define MAX_GAIN_WIN		8#define MAX_GAIN_ADJUST		7#define NSAMPS_LONG			1024#define NSAMPS_SHORT		128#define NUM_SYN_ID_BITS		3#define NUM_INST_TAG_BITS	4#define EXT_SBR_DATA		0x0d#define EXT_SBR_DATA_CRC	0x0e#define IS_ADIF(p)		((p)[0] == 'A' && (p)[1] == 'D' && (p)[2] == 'I' && (p)[3] == 'F')#define GET_ELE_ID(p)	((AACElementID)(*(p) >> (8-NUM_SYN_ID_BITS)))/* AAC file format */enum {	AAC_FF_Unknown = 0,		/* should be 0 on init */	AAC_FF_ADTS = 1,	AAC_FF_ADIF = 2,	AAC_FF_RAW =  3};/* syntactic element type */enum {	AAC_ID_INVALID = -1,	AAC_ID_SCE =  0,	AAC_ID_CPE =  1,	AAC_ID_CCE =  2,	AAC_ID_LFE =  3,	AAC_ID_DSE =  4,	AAC_ID_PCE =  5,	AAC_ID_FIL =  6,	AAC_ID_END =  7};typedef struct _AACDecInfo {	/* pointers to platform-specific state information */	void *psInfoBase;	/* baseline MPEG-4 LC decoding */	void *psInfoSBR;	/* MPEG-4 SBR decoding */		/* raw decoded data, before rounding to 16-bit PCM (for postprocessing such as SBR) */	void *rawSampleBuf[AAC_MAX_NCHANS];	int rawSampleBytes;	int rawSampleFBits;	/* fill data (can be used for processing SBR or other extensions) */	unsigned char *fillBuf;	int fillCount;	int fillExtType;	/* block information */	int prevBlockID;	int currBlockID;	int currInstTag;	int sbDeinterleaveReqd[MAX_NCHANS_ELEM];	int adtsBlocksLeft;	/* user-accessible info */	int bitRate;	int nChans;	int sampRate;	int profile;	int format;	int sbrEnabled;	int tnsUsed;	int pnsUsed;	int frameCount;} AACDecInfo;/* decoder functions which must be implemented for each platform */AACDecInfo *AllocateBuffers(void);AACDecInfo *AllocateBuffersPre(void **space, int *len);void FreeBuffers(AACDecInfo *aacDecInfo);void ClearBuffer(void *buf, int nBytes);int UnpackADTSHeader(AACDecInfo *aacDecInfo, unsigned char **buf, int *bitOffset, int *bitsAvail);int GetADTSChannelMapping(AACDecInfo *aacDecInfo, unsigned char *buf, int bitOffset, int bitsAvail);int UnpackADIFHeader(AACDecInfo *aacDecInfo, unsigned char **buf, int *bitOffset, int *bitsAvail);int SetRawBlockParams(AACDecInfo *aacDecInfo, int copyLast, int nChans, int sampRate, int profile);int PrepareRawBlock(AACDecInfo *aacDecInfo);int FlushCodec(AACDecInfo *aacDecInfo);int DecodeNextElement(AACDecInfo *aacDecInfo, unsigned char **buf, int *bitOffset, int *bitsAvail);int DecodeNoiselessData(AACDecInfo *aacDecInfo, unsigned char **buf, int *bitOffset, int *bitsAvail, int ch);int Dequantize(AACDecInfo *aacDecInfo, int ch);int StereoProcess(AACDecInfo *aacDecInfo);int DeinterleaveShortBlocks(AACDecInfo *aacDecInfo, int ch);int PNS(AACDecInfo *aacDecInfo, int ch);int TNSFilter(AACDecInfo *aacDecInfo, int ch);int IMDCT(AACDecInfo *aacDecInfo, int ch, int chBase, short *outbuf);/* SBR specific functions */int InitSBR(AACDecInfo *aacDecInfo);int InitSBRPre(AACDecInfo *aacDecInfo, void **ptr, int *sz);void FreeSBR(AACDecInfo *aacDecInfo);int DecodeSBRBitstream(AACDecInfo *aacDecInfo, int chBase);int DecodeSBRData(AACDecInfo *aacDecInfo, int chBase, short *outbuf);int FlushCodecSBR(AACDecInfo *aacDecInfo);/* aactabs.c - global ROM tables */extern const int sampRateTab[NUM_SAMPLE_RATES];extern const int predSFBMax[NUM_SAMPLE_RATES];extern const int channelMapTab[NUM_DEF_CHAN_MAPS];extern const int elementNumChans[NUM_ELEMENTS];extern const unsigned /*char*/ int sfBandTotalShort[NUM_SAMPLE_RATES];extern const unsigned /*char*/ int sfBandTotalLong[NUM_SAMPLE_RATES];extern const int sfBandTabShortOffset[NUM_SAMPLE_RATES];extern const /*short*/ int sfBandTabShort[76];extern const int sfBandTabLongOffset[NUM_SAMPLE_RATES];extern const /*short*/ int sfBandTabLong[325];extern const int tnsMaxBandsShortOffset[AAC_NUM_PROFILES];extern const unsigned /*char*/ int tnsMaxBandsShort[2*NUM_SAMPLE_RATES];extern const unsigned /*char*/ int tnsMaxOrderShort[AAC_NUM_PROFILES];extern const int tnsMaxBandsLongOffset[AAC_NUM_PROFILES];extern const unsigned /*char*/ int tnsMaxBandsLong[2*NUM_SAMPLE_RATES];extern const unsigned /*char*/ int tnsMaxOrderLong[AAC_NUM_PROFILES];#endif	/* _AACCOMMON_H */
 |