summaryrefslogtreecommitdiffstats
path: root/libAACdec/src/aacdec_hcr_types.h
diff options
context:
space:
mode:
Diffstat (limited to 'libAACdec/src/aacdec_hcr_types.h')
-rw-r--r--libAACdec/src/aacdec_hcr_types.h366
1 files changed, 366 insertions, 0 deletions
diff --git a/libAACdec/src/aacdec_hcr_types.h b/libAACdec/src/aacdec_hcr_types.h
new file mode 100644
index 0000000..54b3dbd
--- /dev/null
+++ b/libAACdec/src/aacdec_hcr_types.h
@@ -0,0 +1,366 @@
+
+/* -----------------------------------------------------------------------------------------------------------
+Software License for The Fraunhofer FDK AAC Codec Library for Android
+
+© Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
+ All rights reserved.
+
+ 1. INTRODUCTION
+The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements
+the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio.
+This FDK AAC Codec software is intended to be used on a wide variety of Android devices.
+
+AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual
+audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by
+independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part
+of the MPEG specifications.
+
+Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer)
+may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners
+individually for the purpose of encoding or decoding bit streams in products that are compliant with
+the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license
+these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec
+software may already be covered under those patent licenses when it is used for those licensed purposes only.
+
+Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality,
+are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional
+applications information and documentation.
+
+2. COPYRIGHT LICENSE
+
+Redistribution and use in source and binary forms, with or without modification, are permitted without
+payment of copyright license fees provided that you satisfy the following conditions:
+
+You must retain the complete text of this software license in redistributions of the FDK AAC Codec or
+your modifications thereto in source code form.
+
+You must retain the complete text of this software license in the documentation and/or other materials
+provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form.
+You must make available free of charge copies of the complete source code of the FDK AAC Codec and your
+modifications thereto to recipients of copies in binary form.
+
+The name of Fraunhofer may not be used to endorse or promote products derived from this library without
+prior written permission.
+
+You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec
+software or your modifications thereto.
+
+Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software
+and the date of any change. For modified versions of the FDK AAC Codec, the term
+"Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term
+"Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android."
+
+3. NO PATENT LICENSE
+
+NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer,
+ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with
+respect to this software.
+
+You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized
+by appropriate patent licenses.
+
+4. DISCLAIMER
+
+This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors
+"AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties
+of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages,
+including but not limited to procurement of substitute goods or services; loss of use, data, or profits,
+or business interruption, however caused and on any theory of liability, whether in contract, strict
+liability, or tort (including negligence), arising in any way out of the use of this software, even if
+advised of the possibility of such damage.
+
+5. CONTACT INFORMATION
+
+Fraunhofer Institute for Integrated Circuits IIS
+Attention: Audio and Multimedia Departments - FDK AAC LL
+Am Wolfsmantel 33
+91058 Erlangen, Germany
+
+www.iis.fraunhofer.de/amm
+amm-info@iis.fraunhofer.de
+----------------------------------------------------------------------------------------------------------- */
+
+/***************************** MPEG-4 AAC Decoder ***************************
+
+ Author(s): Robert Weidner (DSP Solutions)
+ Description: HCR Decoder: Common defines and structures; defines for
+ switching error-generator, -detector, and -concealment;
+
+*******************************************************************************/
+
+#ifndef _AACDEC_HCR_TYPES_H_
+#define _AACDEC_HCR_TYPES_H_
+
+
+
+#include "FDK_bitstream.h"
+#include "overlapadd.h"
+
+/* ------------------------------------------------ */
+/* ------------------------------------------------ */
+
+#define LINES_PER_UNIT 4
+
+/* ------------------------------------------------ */
+/* ------------------------------------------------ */
+/* ----------- basic HCR configuration ------------ */
+
+
+ #define MAX_SFB_HCR (((1024/8) / LINES_PER_UNIT) * 8) /* (8 * 16) is not enough because sfbs are split in units for blocktype short */
+ #define NUMBER_OF_UNIT_GROUPS (LINES_PER_UNIT * 8)
+ #define LINES_PER_UNIT_GROUP (1024 / NUMBER_OF_UNIT_GROUPS) /* 15 16 30 32 */
+
+
+/* ------------------------------------------------ */
+/* ------------------------------------------------ */
+/* ------------------------------------------------ */
+
+#define FROM_LEFT_TO_RIGHT 0
+#define FROM_RIGHT_TO_LEFT 1
+
+#define MAX_CB_PAIRS 23
+#define MAX_HCR_SETS 14
+
+#define ESCAPE_VALUE 16
+#define POSITION_OF_FLAG_A 21
+#define POSITION_OF_FLAG_B 20
+
+#define MAX_CB 32 /* last used CB is cb #31 when VCB11 is used */
+
+#define MAX_CB_CHECK 32 /* support for VCB11 available -- is more general, could therefore used in both cases */
+
+#define NUMBER_OF_BIT_IN_WORD 32
+
+/* log */
+#define THIRTYTWO_LOG_DIV_TWO_LOG 5
+#define EIGHT_LOG_DIV_TWO_LOG 3
+#define FOUR_LOG_DIV_TWO_LOG 2
+
+/* borders */
+#define CPE_TOP_LENGTH 12288
+#define SCE_TOP_LENGTH 6144
+#define LEN_OF_LONGEST_CW_TOP_LENGTH 49
+
+/* qsc's of high level */
+#define Q_VALUE_INVALID 8192 /* mark a invalid line with this value (to be concealed later on) */
+#define HCR_DIRAC 500 /* a line of high level */
+
+/* masks */
+#define MASK_LEFT 0xFFF000
+#define MASK_RIGHT 0xFFF
+#define CLR_BIT_10 0x3FF
+#define TEST_BIT_10 0x400
+
+#define LEFT_OFFSET 12
+
+/* when set HCR is replaced by a dummy-module which just fills the outputbuffer with a dirac sequence */
+/* use this if HCR is suspected to write in other modules -- if error is stell there, HCR is innocent */
+#define USE_HCR_DUMMY 0
+
+
+/* ------------------------------ */
+/* - insert HCR errors - */
+/* ------------------------------ */
+
+ /* modify input lengths -- high protected */
+#define ERROR_LORSD 0 /* offset: error if different from zero */
+#define ERROR_LOLC 0 /* offset: error if different from zero */
+
+ /* segments are earlier empty as expected when decoding PCWs */
+#define ERROR_PCW_BODY 0 /* set a positive values to trigger the error (make segments earlyer appear to be empty) */
+#define ERROR_PCW_BODY_SIGN 0 /* set a positive values to trigger the error (make segments earlyer appear to be empty) */
+#define ERROR_PCW_BODY_SIGN_ESC 0 /* set a positive values to trigger the error (make segments earlyer appear to be empty) */
+
+ /* pretend there are too many bits decoded (enlarge length of codeword) at PCWs -- use a positive value */
+#define ERROR_PCW_BODY_ONLY_TOO_LONG 0 /* set a positive values to trigger the error */
+#define ERROR_PCW_BODY_SIGN_TOO_LONG 0 /* set a positive values to trigger the error */
+#define ERROR_PCW_BODY_SIGN_ESC_TOO_LONG 0 /* set a positive values to trigger the error */
+
+ /* modify HCR bitstream block */
+#define ERROR_GENERATOR_BIT_STREAM_HCR 0 /* modify every <MODULO_DIVISOR_HCR>-bit when reading from bitstream */ /* !!! BEWARE!!! if RVLC is active, also RVLC data at ESC2 will be modified !!! */
+#define MODULO_DIVISOR_HCR 30
+
+
+/* ------------------------------ */
+/* - detect HCR errors - */
+/* ------------------------------ */
+ /* check input data */
+#define CHECK_VALID_HCR_INPUT 1 /* it is highly recommended to check input data */
+
+ /* during decoding */
+#define CHECK_SEGMENTATION_IMMEDIATELY 1 /* the 2 or 4 lines of a detected PCW-decoding-error is marked */
+
+#define CHECK_SEGMENTATION_FINAL 1 /* all the segments are checked -- therefore -- if this check passes, its a kind of evidence that the
+ decoded PCWs and non-PCWs are fine */
+
+#define DETECT_TOO_LONG_CW_READS 1 /* if a codeword is decoded there exists a border for the number of bits, which are allowed to read for this
+ codeword. This border is the minimum of the length of the longest codeword (for the currently used
+ codebook) and the separately transmitted 'lengthOfLongestCodeword' in this frame and channel. The number
+ of decoded bits is counted (for PCWs only -- there it makes really sense in my opinion). If this number
+ exceeds the border (derived as minimum -- see above), a error is detected. */
+
+#define STATE_MACHINE_ERROR_CHECK 1 /* test if the number of remaining bits in a segment is _below_ zero. If there are no errors the lowest
+ allowed value for remainingBitsInSegment is zero. This check also could be set to zero (save runtime) */
+ /* other */
+#define VALID_LAV_ERROR_TRIGGER 1 /* when set to '1', avoid setting the LAV-Flag in errorLog due to a previous-line-marking (at PCW decoder). A little
+ more runtime is needed then when writing values out into output-buffer. */
+
+#define HCR_LISTEN_TO_MUTED_LINES 0 /* listen to the "error-concealment" for testing */
+
+/* ------------------------------ */
+/* - conceal HCR errors - */
+/* ------------------------------ */
+
+#define HCR_ERROR_CONCEALMENT 1 /* if set to '1', HCR _mutes_ the erred quantized spectral coefficients */
+
+
+// ------------------------------------------------------------------------------------------------------------------
+// errorLog: A word of 32 bits used for logging possible errors within HCR
+// in case of distorted bitstreams. Table of all known errors:
+// ------------------------------------------------------------------------------------------------------------------------
+ // bit fatal location meaning
+ // ----+-----+-----------+--------------------------------------
+#define SEGMENT_OVERRIDE_ERR_PCW_BODY 0x80000000 // 31 no PCW-Dec During PCW decoding it is checked after every PCW if there are too many bits decoded (immediate check).
+#define SEGMENT_OVERRIDE_ERR_PCW_BODY_SIGN 0x40000000 // 30 no PCW-Dec During PCW decoding it is checked after every PCW if there are too many bits decoded (immediate check).
+#define SEGMENT_OVERRIDE_ERR_PCW_BODY_SIGN_ESC 0x20000000 // 29 no PCW-Dec During PCW decoding it is checked after every PCW if there are too many bits decoded (immediate check).
+#define EXTENDED_SORTED_COUNTER_OVERFLOW 0x10000000 // 28 yes Init-Dec Error during extending sideinfo (neither a PCW nor a nonPCW was decoded so far)
+ // 0x08000000 // 27 reserved
+ // 0x04000000 // 26 reserved
+ // 0x02000000 // 25 reserved
+ // 0x01000000 // 24 reserved
+ // 0x00800000 // 23 reserved
+ // 0x00400000 // 22 reserved
+ // 0x00200000 // 21 reserved
+ // 0x00100000 // 20 reserved
+
+ /* special errors */
+#define TOO_MANY_PCW_BODY_BITS_DECODED 0x00080000 // 19 yes PCW-Dec During PCW-body-decoding too many bits have been read from bitstream -- advice: skip non-PCW decoding
+#define TOO_MANY_PCW_BODY_SIGN_BITS_DECODED 0x00040000 // 18 yes PCW-Dec During PCW-body-sign-decoding too many bits have been read from bitstream -- advice: skip non-PCW decoding
+#define TOO_MANY_PCW_BODY_SIGN_ESC_BITS_DECODED 0x00020000 // 17 yes PCW-Dec During PCW-body-sign-esc-decoding too many bits have been read from bitstream -- advice: skip non-PCW decoding
+
+
+ // 0x00010000 // 16 reserved
+#define STATE_ERROR_BODY_ONLY 0x00008000 // 15 no NonPCW-Dec State machine returned with error
+#define STATE_ERROR_BODY_SIGN__BODY 0x00004000 // 14 no NonPCW-Dec State machine returned with error
+#define STATE_ERROR_BODY_SIGN__SIGN 0x00002000 // 13 no NonPCW-Dec State machine returned with error
+#define STATE_ERROR_BODY_SIGN_ESC__BODY 0x00001000 // 12 no NonPCW-Dec State machine returned with error
+#define STATE_ERROR_BODY_SIGN_ESC__SIGN 0x00000800 // 11 no NonPCW-Dec State machine returned with error
+#define STATE_ERROR_BODY_SIGN_ESC__ESC_PREFIX 0x00000400 // 10 no NonPCW-Dec State machine returned with error
+#define STATE_ERROR_BODY_SIGN_ESC__ESC_WORD 0x00000200 // 9 no NonPCW-Dec State machine returned with error
+#define HCR_SI_LENGTHS_FAILURE 0x00000100 // 8 yes Init-Dec LengthOfLongestCodeword must not be less than lenghtOfReorderedSpectralData
+#define NUM_SECT_OUT_OF_RANGE_SHORT_BLOCK 0x00000080 // 7 yes Init-Dec The number of sections is not within the allowed range (short block)
+#define NUM_SECT_OUT_OF_RANGE_LONG_BLOCK 0x00000040 // 6 yes Init-Dec The number of sections is not within the allowed range (long block)
+#define LINE_IN_SECT_OUT_OF_RANGE_SHORT_BLOCK 0x00000020 // 5 yes Init-Dec The number of lines per section is not within the allowed range (short block)
+#define CB_OUT_OF_RANGE_SHORT_BLOCK 0x00000010 // 4 yes Init-Dec The codebook is not within the allowed range (short block)
+#define LINE_IN_SECT_OUT_OF_RANGE_LONG_BLOCK 0x00000008 // 3 yes Init-Dec The number of lines per section is not within the allowed range (long block)
+#define CB_OUT_OF_RANGE_LONG_BLOCK 0x00000004 // 2 yes Init-Dec The codebook is not within the allowed range (long block)
+#define LAV_VIOLATION 0x00000002 // 1 no Final The absolute value of at least one decoded line was too high for the according codebook.
+#define BIT_IN_SEGMENTATION_ERROR 0x00000001 // 0 no Final After PCW and non-PWC-decoding at least one segment is not zero (global check).
+
+ /*----------*/
+#define HCR_FATAL_PCW_ERROR_MASK 0x100E01FC
+
+
+typedef enum {
+ PCW_BODY,
+ PCW_BODY_SIGN,
+ PCW_BODY_SIGN_ESC
+} PCW_TYPE;
+
+
+/* interface Decoder <---> HCR */
+typedef struct {
+ UINT errorLog;
+ SPECTRAL_PTR pQuantizedSpectralCoefficientsBase;
+ int quantizedSpectralCoefficientsIdx;
+ SHORT lengthOfReorderedSpectralData;
+ SHORT numSection;
+ SHORT *pNumLineInSect;
+ USHORT bitstreamIndex;
+ SCHAR lengthOfLongestCodeword;
+ UCHAR *pCodebook;
+} HCR_INPUT_OUTPUT;
+
+typedef struct {
+ const UCHAR *pMinOfCbPair;
+ const UCHAR *pMaxOfCbPair;
+} HCR_CB_PAIRS;
+
+typedef struct{
+ const USHORT *pLargestAbsVal;
+ const UCHAR *pMaxCwLength;
+ const UCHAR *pCbDimension;
+ const UCHAR *pCbDimShift;
+ const UCHAR *pCbSign;
+ const UCHAR *pCbPriority;
+} HCR_TABLE_INFO;
+
+typedef struct{
+ UINT numSegment;
+ UINT pSegmentBitfield[((1024>>1)/NUMBER_OF_BIT_IN_WORD+1)];
+ UINT pCodewordBitfield[((1024>>1)/NUMBER_OF_BIT_IN_WORD+1)];
+ UINT segmentOffset;
+ FIXP_DBL pTempValues[1024];
+ USHORT pLeftStartOfSegment[1024>>1];
+ USHORT pRightStartOfSegment[1024>>1];
+ SCHAR pRemainingBitsInSegment[1024>>1];
+ UCHAR readDirection;
+ UCHAR numWordForBitfield;
+ USHORT pNumBitValidInLastWord;
+} HCR_SEGMENT_INFO;
+
+typedef struct{
+
+ UINT numCodeword;
+ UINT numSortedSection;
+ USHORT pNumCodewordInSection[MAX_SFB_HCR];
+ USHORT pNumSortedCodewordInSection[MAX_SFB_HCR];
+ USHORT pNumExtendedSortedCodewordInSection[MAX_SFB_HCR+MAX_HCR_SETS];
+ int numExtendedSortedCodewordInSectionIdx;
+ USHORT pNumExtendedSortedSectionsInSets[MAX_HCR_SETS];
+ int numExtendedSortedSectionsInSetsIdx;
+ USHORT pReorderOffset[MAX_SFB_HCR];
+ UCHAR pSortedCodebook[MAX_SFB_HCR];
+
+ UCHAR pExtendedSortedCodebook[MAX_SFB_HCR+MAX_HCR_SETS];
+ int extendedSortedCodebookIdx;
+#if DETECT_TOO_LONG_CW_READS
+ UCHAR pMaxLenOfCbInExtSrtSec[MAX_SFB_HCR+MAX_HCR_SETS];
+ int maxLenOfCbInExtSrtSecIdx;
+#endif
+ UCHAR pCodebookSwitch[MAX_SFB_HCR];
+} HCR_SECTION_INFO;
+
+typedef UINT (*STATEFUNC)(HANDLE_FDK_BITSTREAM, void*);
+
+typedef struct{
+ /* worst-case and 1024/4 non-PCWs exist in worst-case */
+ FIXP_DBL *pResultBase; /* Base address for spectral data output target buffer */
+ UINT iNode[1024>>2]; /* Helper indices for code books */
+ USHORT iResultPointer[1024>>2]; /* Helper indices for accessing pResultBase */
+ UINT pEscapeSequenceInfo[1024>>2];
+ UINT codewordOffset;
+ STATEFUNC pState;
+ UCHAR pCodebook[1024>>2];
+ UCHAR pCntSign[1024>>2];
+ /* this array holds the states coded as integer values within the range [0,1,..,7] */
+ SCHAR pSta[1024>>2];
+} HCR_NON_PCW_SIDEINFO;
+
+typedef struct{
+ HCR_INPUT_OUTPUT decInOut;
+ HCR_CB_PAIRS cbPairs;
+ HCR_TABLE_INFO tableInfo;
+ HCR_SEGMENT_INFO segmentInfo;
+ HCR_SECTION_INFO sectionInfo;
+ HCR_NON_PCW_SIDEINFO nonPcwSideinfo;
+
+ INT globalHcrType;
+} CErHcrInfo;
+
+
+typedef CErHcrInfo *H_HCR_INFO;
+
+
+#endif /* _AACDEC_HCR_TYPES_H_ */