diff options
author | Matthias P. Braendli <matthias.braendli@mpb.li> | 2016-09-10 20:15:44 +0200 |
---|---|---|
committer | Matthias P. Braendli <matthias.braendli@mpb.li> | 2016-09-10 20:15:44 +0200 |
commit | 14c7b800eaa23e9da7c92c7c4df397d0c191f097 (patch) | |
tree | d840b6ec41ff74d1184ca1dcd7731d08f1e9ebbb /libMpegTPDec/src | |
parent | 78a801e4d716c6f2403cc56cf6c5b6f138f24b2f (diff) | |
download | ODR-AudioEnc-14c7b800eaa23e9da7c92c7c4df397d0c191f097.tar.gz ODR-AudioEnc-14c7b800eaa23e9da7c92c7c4df397d0c191f097.tar.bz2 ODR-AudioEnc-14c7b800eaa23e9da7c92c7c4df397d0c191f097.zip |
Remove FDK-AAC
Diffstat (limited to 'libMpegTPDec/src')
-rw-r--r-- | libMpegTPDec/src/mpegFileFormat.h | 114 | ||||
-rw-r--r-- | libMpegTPDec/src/tpdec_adif.cpp | 155 | ||||
-rw-r--r-- | libMpegTPDec/src/tpdec_adif.h | 123 | ||||
-rw-r--r-- | libMpegTPDec/src/tpdec_adts.cpp | 388 | ||||
-rw-r--r-- | libMpegTPDec/src/tpdec_adts.h | 236 | ||||
-rw-r--r-- | libMpegTPDec/src/tpdec_asc.cpp | 1050 | ||||
-rw-r--r-- | libMpegTPDec/src/tpdec_latm.cpp | 433 | ||||
-rw-r--r-- | libMpegTPDec/src/tpdec_latm.h | 176 | ||||
-rw-r--r-- | libMpegTPDec/src/tpdec_lib.cpp | 1323 | ||||
-rw-r--r-- | libMpegTPDec/src/version | 8 |
10 files changed, 0 insertions, 4006 deletions
diff --git a/libMpegTPDec/src/mpegFileFormat.h b/libMpegTPDec/src/mpegFileFormat.h deleted file mode 100644 index b0cfe9e..0000000 --- a/libMpegTPDec/src/mpegFileFormat.h +++ /dev/null @@ -1,114 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright 1995 - 2013 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 ------------------------------------------------------------------------------------------------------------ */ - -/*************************** Fraunhofer IIS FDK Tools *********************** - - Author(s): Oliver Moser - Description: bitstream format detection routines - -******************************************************************************/ - -#if !defined(__BITSTREAM_FORMAT_H__) -#define __BITSTREAM_FORMAT_H__ - -#include "machine_type.h" -#include "FDK_audio.h" - -/** - * \brief Try to find out the format of a file, given the few first bytes. - * \param fileData pointer to a buffer holding the first bytes of a file. - * \param pAu pointer to UCHAR*, returns the address of the first AU found or NULL. - * \param length pointer to the length of the buffer fileData. Return length of first AU. - * \return the detected file format, or FF_UNKNOWN in case of failure. - */ -FILE_FORMAT GetFileFormat(UCHAR *fileData, UCHAR **pAu, UINT *length); - -/** - * \brief Try to find out the transport type contained in a given file. - * \param filename name of the file to be analysed. - * \param fileFormat pointer to a variable where the detected file format is stored into. - * \return the detected transport type or TT_UNKNOWN in case of failure. - */ -TRANSPORT_TYPE GetTransportType(const char* filename, FILE_FORMAT *fileFormat); - -#endif diff --git a/libMpegTPDec/src/tpdec_adif.cpp b/libMpegTPDec/src/tpdec_adif.cpp deleted file mode 100644 index 237e881..0000000 --- a/libMpegTPDec/src/tpdec_adif.cpp +++ /dev/null @@ -1,155 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright 1995 - 2013 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): Josef Hoepfl - Description: ADIF reader - -******************************************************************************/ - -#include "tpdec_adif.h" - - -#include "FDK_bitstream.h" -#include "genericStds.h" - -TRANSPORTDEC_ERROR adifRead_DecodeHeader( - CAdifHeader *pAdifHeader, - CProgramConfig *pPce, - HANDLE_FDK_BITSTREAM bs - ) -{ - int i; - TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK; - UINT startAnchor = FDKgetValidBits(bs); - - if ((INT)startAnchor < MIN_ADIF_HEADERLENGTH) { - return (TRANSPORTDEC_NOT_ENOUGH_BITS); - } - - if (FDKreadBits(bs,8) != 'A') { - return (TRANSPORTDEC_SYNC_ERROR); - } - if (FDKreadBits(bs,8) != 'D') { - return (TRANSPORTDEC_SYNC_ERROR); - } - if (FDKreadBits(bs,8) != 'I') { - return (TRANSPORTDEC_SYNC_ERROR); - } - if (FDKreadBits(bs,8) != 'F') { - return (TRANSPORTDEC_SYNC_ERROR); - } - - if ( (pAdifHeader->CopyrightIdPresent = FDKreadBits(bs,1)) != 0 ) - FDKpushBiDirectional(bs,72); /* CopyrightId */ - - - pAdifHeader->OriginalCopy = FDKreadBits(bs,1); - pAdifHeader->Home = FDKreadBits(bs,1); - pAdifHeader->BitstreamType = FDKreadBits(bs,1); - - /* pAdifHeader->BitRate = FDKreadBits(bs, 23); */ - pAdifHeader->BitRate = FDKreadBits(bs,16); - pAdifHeader->BitRate <<= 7; - pAdifHeader->BitRate |= FDKreadBits(bs,7); - - pAdifHeader->NumProgramConfigElements = FDKreadBits(bs,4) + 1; - - if (pAdifHeader->BitstreamType == 0) { - FDKpushBiDirectional(bs,20); /* adif_buffer_fullness */ - } - - /* Parse all PCEs but keep only one */ - for (i=0; i < pAdifHeader->NumProgramConfigElements; i++) - { - CProgramConfig_Read(pPce, bs, startAnchor); - } - - FDKbyteAlign(bs, startAnchor); - - return (ErrorStatus); -} - - - diff --git a/libMpegTPDec/src/tpdec_adif.h b/libMpegTPDec/src/tpdec_adif.h deleted file mode 100644 index d6780a7..0000000 --- a/libMpegTPDec/src/tpdec_adif.h +++ /dev/null @@ -1,123 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright 1995 - 2013 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): Josef Hoepfl - Description: ADIF reader - -******************************************************************************/ - -#ifndef TPDEC_ADIF_H -#define TPDEC_ADIF_H - -#include "tpdec_lib.h" - -#define MIN_ADIF_HEADERLENGTH 63 /* in bits */ - -typedef struct -{ - INT NumProgramConfigElements; - UINT BitRate; - UCHAR CopyrightIdPresent; - UCHAR OriginalCopy; - UCHAR Home; - UCHAR BitstreamType; -} CAdifHeader; - -/** - * \brief Parse a ADIF header at the given bitstream and store the parsed data into a given CAdifHeader - * and CProgramConfig struct - * - * \param pAdifHeader pointer to a CAdifHeader structure to hold the parsed ADIF header data. - * \param pPce pointer to a CProgramConfig structure where the last PCE will remain. - * - * \return TRANSPORTDEC_ERROR error code - */ -TRANSPORTDEC_ERROR adifRead_DecodeHeader( - CAdifHeader *pAdifHeader, - CProgramConfig *pPce, - HANDLE_FDK_BITSTREAM bs - ); - -#endif /* TPDEC_ADIF_H */ diff --git a/libMpegTPDec/src/tpdec_adts.cpp b/libMpegTPDec/src/tpdec_adts.cpp deleted file mode 100644 index c455681..0000000 --- a/libMpegTPDec/src/tpdec_adts.cpp +++ /dev/null @@ -1,388 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright 1995 - 2013 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): Josef Hoepfl - Description: ADTS interface - -******************************************************************************/ - -#include "tpdec_adts.h" - - -#include "FDK_bitstream.h" - - - -void adtsRead_CrcInit(HANDLE_ADTS pAdts) /*!< pointer to adts crc info stucture */ -{ - FDKcrcInit(&pAdts->crcInfo, 0x8005, 0xFFFF, 16); -} - -int adtsRead_CrcStartReg( - HANDLE_ADTS pAdts, /*!< pointer to adts stucture */ - HANDLE_FDK_BITSTREAM hBs, /*!< handle to current bit buffer structure */ - int mBits /*!< number of bits in crc region */ - ) -{ - if (pAdts->bs.protection_absent) { - return 0; - } - - return ( FDKcrcStartReg(&pAdts->crcInfo, hBs, mBits) ); - -} - -void adtsRead_CrcEndReg( - HANDLE_ADTS pAdts, /*!< pointer to adts crc info stucture */ - HANDLE_FDK_BITSTREAM hBs, /*!< handle to current bit buffer structure */ - int reg /*!< crc region */ - ) -{ - if (pAdts->bs.protection_absent == 0) - { - FDKcrcEndReg(&pAdts->crcInfo, hBs, reg); - } -} - -TRANSPORTDEC_ERROR adtsRead_CrcCheck( HANDLE_ADTS pAdts ) -{ - TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK; - USHORT crc; - - if (pAdts->bs.protection_absent) - return TRANSPORTDEC_OK; - - crc = FDKcrcGetCRC(&pAdts->crcInfo); - if (crc != pAdts->crcReadValue) - { - return (TRANSPORTDEC_CRC_ERROR); - } - - return (ErrorStatus); -} - - - -#define Adts_Length_SyncWord 12 -#define Adts_Length_Id 1 -#define Adts_Length_Layer 2 -#define Adts_Length_ProtectionAbsent 1 -#define Adts_Length_Profile 2 -#define Adts_Length_SamplingFrequencyIndex 4 -#define Adts_Length_PrivateBit 1 -#define Adts_Length_ChannelConfiguration 3 -#define Adts_Length_OriginalCopy 1 -#define Adts_Length_Home 1 -#define Adts_Length_CopyrightIdentificationBit 1 -#define Adts_Length_CopyrightIdentificationStart 1 -#define Adts_Length_FrameLength 13 -#define Adts_Length_BufferFullness 11 -#define Adts_Length_NumberOfRawDataBlocksInFrame 2 -#define Adts_Length_CrcCheck 16 - -TRANSPORTDEC_ERROR adtsRead_DecodeHeader( - HANDLE_ADTS pAdts, - CSAudioSpecificConfig *pAsc, - HANDLE_FDK_BITSTREAM hBs, - const INT ignoreBufferFullness - ) -{ - INT crcReg; - - INT valBits; - INT cmp_buffer_fullness; - int i, adtsHeaderLength; - - STRUCT_ADTS_BS bs; - -#ifdef TP_PCE_ENABLE - CProgramConfig oldPce; - /* Store the old PCE temporarily. Maybe we'll need it later if we - have channelConfig=0 and no PCE in this frame. */ - FDKmemcpy(&oldPce, &pAsc->m_progrConfigElement, sizeof(CProgramConfig)); -#endif - - valBits = FDKgetValidBits(hBs); - - /* adts_fixed_header */ - bs.mpeg_id = FDKreadBits(hBs, Adts_Length_Id); - bs.layer = FDKreadBits(hBs, Adts_Length_Layer); - bs.protection_absent = FDKreadBits(hBs, Adts_Length_ProtectionAbsent); - bs.profile = FDKreadBits(hBs, Adts_Length_Profile); - bs.sample_freq_index = FDKreadBits(hBs, Adts_Length_SamplingFrequencyIndex); - bs.private_bit = FDKreadBits(hBs, Adts_Length_PrivateBit); - bs.channel_config = FDKreadBits(hBs, Adts_Length_ChannelConfiguration); - bs.original = FDKreadBits(hBs, Adts_Length_OriginalCopy); - bs.home = FDKreadBits(hBs, Adts_Length_Home); - - /* adts_variable_header */ - bs.copyright_id = FDKreadBits(hBs, Adts_Length_CopyrightIdentificationBit); - bs.copyright_start = FDKreadBits(hBs, Adts_Length_CopyrightIdentificationStart); - bs.frame_length = FDKreadBits(hBs, Adts_Length_FrameLength); - bs.adts_fullness = FDKreadBits(hBs, Adts_Length_BufferFullness); - bs.num_raw_blocks = FDKreadBits(hBs, Adts_Length_NumberOfRawDataBlocksInFrame); - bs.num_pce_bits = 0; - - adtsHeaderLength = ADTS_HEADERLENGTH; - - if (!bs.protection_absent) { - FDKcrcReset(&pAdts->crcInfo); - FDKpushBack(hBs, 56); /* complete fixed and variable header! */ - crcReg = FDKcrcStartReg(&pAdts->crcInfo, hBs, 0); - FDKpushFor(hBs, 56); - } - - if (! bs.protection_absent && bs.num_raw_blocks>0) { - for (i=0; i<bs.num_raw_blocks; i++) { - pAdts->rawDataBlockDist[i] = (USHORT)FDKreadBits(hBs, 16); - adtsHeaderLength += 16; - } - /* Change raw data blocks to delta values */ - pAdts->rawDataBlockDist[bs.num_raw_blocks] = bs.frame_length - 7 - bs.num_raw_blocks*2 - 2 ; - for (i=bs.num_raw_blocks; i>0; i--) { - pAdts->rawDataBlockDist[i] -= pAdts->rawDataBlockDist[i-1]; - } - } - - /* adts_error_check */ - if (!bs.protection_absent) - { - USHORT crc_check; - - FDKcrcEndReg(&pAdts->crcInfo, hBs, crcReg); - crc_check = FDKreadBits(hBs, Adts_Length_CrcCheck); - adtsHeaderLength += Adts_Length_CrcCheck; - - pAdts->crcReadValue = crc_check; - /* Check header CRC in case of multiple raw data blocks */ - if (bs.num_raw_blocks > 0) { - if (pAdts->crcReadValue != FDKcrcGetCRC(&pAdts->crcInfo)) { - return TRANSPORTDEC_CRC_ERROR; - } - /* Reset CRC for the upcoming raw_data_block() */ - FDKcrcReset(&pAdts->crcInfo); - } - } - - - /* check if valid header */ - if ( - (bs.layer != 0) || // we only support MPEG ADTS - (bs.sample_freq_index >= 13) // we only support 96kHz - 7350kHz - ) { - FDKpushFor(hBs, bs.frame_length * 8); // try again one frame later - return TRANSPORTDEC_UNSUPPORTED_FORMAT; - } - - /* special treatment of id-bit */ - if ( (bs.mpeg_id == 0) && (pAdts->decoderCanDoMpeg4 == 0) ) - { - /* MPEG-2 decoder cannot play MPEG-4 bitstreams */ - - - FDKpushFor(hBs, bs.frame_length * 8); // try again one frame later - return TRANSPORTDEC_UNSUPPORTED_FORMAT; - } - - if (!ignoreBufferFullness) - { - cmp_buffer_fullness = bs.frame_length*8 + bs.adts_fullness*32*getNumberOfEffectiveChannels(bs.channel_config); - - - /* Evaluate buffer fullness */ - if (bs.adts_fullness != 0x7FF) - { - if (pAdts->BufferFullnesStartFlag) - { - if ( valBits < cmp_buffer_fullness ) - { - /* Condition for start of decoding is not fulfilled */ - - /* The current frame will not be decoded */ - FDKpushBack(hBs, adtsHeaderLength); - - if ( (cmp_buffer_fullness+adtsHeaderLength) > ((TRANSPORTDEC_INBUF_SIZE<<3)-7) ) { - return TRANSPORTDEC_SYNC_ERROR; - } else { - return TRANSPORTDEC_NOT_ENOUGH_BITS; - } - } - else - { - pAdts->BufferFullnesStartFlag = 0; - } - } - } - } - - - /* Get info from ADTS header */ - AudioSpecificConfig_Init(pAsc); - pAsc->m_aot = (AUDIO_OBJECT_TYPE)(bs.profile + 1); - pAsc->m_samplingFrequencyIndex = bs.sample_freq_index; - pAsc->m_samplingFrequency = SamplingRateTable[bs.sample_freq_index]; - pAsc->m_channelConfiguration = bs.channel_config; - pAsc->m_samplesPerFrame = 1024; - -#ifdef TP_PCE_ENABLE - if (bs.channel_config == 0) - { - int pceBits = 0; - UINT alignAnchor = FDKgetValidBits(hBs); - - if (FDKreadBits(hBs,3) == ID_PCE) { - /* Got luck! Parse the PCE */ - int crcReg; - crcReg = adtsRead_CrcStartReg(pAdts, hBs, 0); - - CProgramConfig_Read(&pAsc->m_progrConfigElement, hBs, alignAnchor); - - adtsRead_CrcEndReg(pAdts, hBs, crcReg); - pceBits = alignAnchor - FDKgetValidBits(hBs); - /* store the number of PCE bits */ - bs.num_pce_bits = pceBits; - } - else { - /* No PCE in this frame! Push back the ID tag bits. */ - FDKpushBack(hBs,3); - - /* Encoders do not have to write a PCE in each frame. - So if we already have a valid PCE we have to use it. */ - if ( oldPce.isValid - && (bs.sample_freq_index == pAdts->bs.sample_freq_index) /* we could compare the complete fixed header (bytes) here! */ - && (bs.channel_config == pAdts->bs.channel_config) /* == 0 */ - && (bs.mpeg_id == pAdts->bs.mpeg_id) ) - { /* Restore previous PCE which is still valid */ - FDKmemcpy(&pAsc->m_progrConfigElement, &oldPce, sizeof(CProgramConfig)); - } - else if (bs.mpeg_id == 0) { - /* If not it seems that we have a implicit channel configuration. - This mode is not allowed in the context of ISO/IEC 14496-3. - Skip this frame and try the next one. */ - FDKpushFor(hBs, (bs.frame_length<<3) - adtsHeaderLength - 3); - return TRANSPORTDEC_UNSUPPORTED_FORMAT; - } - /* else { - ISO/IEC 13818-7 implicit channel mapping is allowed. - So just open the box of chocolates to see what we got. - } */ - } - } -#endif /* TP_PCE_ENABLE */ - - /* Copy bit stream data struct to persistent memory now, once we passed all sanity checks above. */ - FDKmemcpy(&pAdts->bs, &bs, sizeof(STRUCT_ADTS_BS)); - - return TRANSPORTDEC_OK; -} - -int adtsRead_GetRawDataBlockLength( - HANDLE_ADTS pAdts, - INT blockNum - ) -{ - int length; - - if (pAdts->bs.num_raw_blocks == 0) { - length = (pAdts->bs.frame_length - 7) << 3; /* aac_frame_length subtracted by the header size (7 bytes). */ - if (pAdts->bs.protection_absent == 0) - length -= 16; /* substract 16 bit CRC */ - } else { - if (pAdts->bs.protection_absent) { - length = -1; /* raw data block length is unknown */ - } else { - if (blockNum < 0 || blockNum > 3) { - length = -1; - } - length = (pAdts->rawDataBlockDist[blockNum] << 3) - 16; - } - } - if (blockNum == 0 && length > 0) { - length -= pAdts->bs.num_pce_bits; - } - return length; -} - - diff --git a/libMpegTPDec/src/tpdec_adts.h b/libMpegTPDec/src/tpdec_adts.h deleted file mode 100644 index a3b83a5..0000000 --- a/libMpegTPDec/src/tpdec_adts.h +++ /dev/null @@ -1,236 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright 1995 - 2013 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): Josef Hoepfl - Description: ADTS interface - -******************************************************************************/ - -#ifndef TPDEC_ADTS_H -#define TPDEC_ADTS_H - -#include "tpdec_lib.h" - - -#define ADTS_SYNCWORD ( 0xfff ) -#define ADTS_SYNCLENGTH ( 12 ) /* in bits */ -#define ADTS_HEADERLENGTH ( 56 ) /* minimum header size in bits */ -#define ADTS_FIXED_HEADERLENGTH ( 28 ) /* in bits */ -#define ADTS_VARIABLE_HEADERLENGTH ( ADTS_HEADERLENGTH - ADTS_FIXED_HEADERLENGTH ) - -#ifdef CHECK_TWO_SYNCS - #define ADTS_MIN_TP_BUF_SIZE ( 8191 + 2 ) -#else - #define ADTS_MIN_TP_BUF_SIZE ( 8191 ) -#endif - -#include "FDK_crc.h" - -typedef struct { - /* ADTS header fields */ - UCHAR mpeg_id; - UCHAR layer; - UCHAR protection_absent; - UCHAR profile; - UCHAR sample_freq_index; - UCHAR private_bit; - UCHAR channel_config; - UCHAR original; - UCHAR home; - UCHAR copyright_id; - UCHAR copyright_start; - USHORT frame_length; - USHORT adts_fullness; - UCHAR num_raw_blocks; - UCHAR num_pce_bits; -} STRUCT_ADTS_BS; - -struct STRUCT_ADTS { - - STRUCT_ADTS_BS bs; - - UCHAR decoderCanDoMpeg4; - UCHAR BufferFullnesStartFlag; - - FDK_CRCINFO crcInfo; /* CRC state info */ - USHORT crcReadValue; /* CRC value read from bitstream data */ - USHORT rawDataBlockDist[4]; /* distance between each raw data block. Not the same as found in the bitstream */ -} ; - -typedef struct STRUCT_ADTS *HANDLE_ADTS; - -/*! - \brief Initialize ADTS CRC - - The function initialzes the crc buffer and the crc lookup table. - - \return none -*/ -void adtsRead_CrcInit( HANDLE_ADTS pAdts ); - -/** - * \brief Starts CRC region with a maximum number of bits - * If mBits is positive zero padding will be used for CRC calculation, if there - * are less than mBits bits available. - * If mBits is negative no zero padding is done. - * If mBits is zero the memory for the buffer is allocated dynamically, the - * number of bits is not limited. - * - * \param pAdts ADTS data handle - * \param hBs bitstream handle, on which the CRC region referes to - * \param mBits max number of bits in crc region to be considered - * - * \return ID for the created region, -1 in case of an error - */ -int adtsRead_CrcStartReg( - HANDLE_ADTS pAdts, - HANDLE_FDK_BITSTREAM hBs, - int mBits - ); - -/** - * \brief Ends CRC region identified by reg - * - * \param pAdts ADTS data handle - * \param hBs bitstream handle, on which the CRC region referes to - * \param reg CRC regions ID returned by adtsRead_CrcStartReg() - * - * \return none - */ -void adtsRead_CrcEndReg( - HANDLE_ADTS pAdts, - HANDLE_FDK_BITSTREAM hBs, - int reg - ); - -/** - * \brief Check CRC - * - * Checks if the currently calculated CRC matches the CRC field read from the bitstream - * Deletes all CRC regions. - * - * \param pAdts ADTS data handle - * - * \return Returns 0 if they are identical otherwise 1 - */ -TRANSPORTDEC_ERROR adtsRead_CrcCheck( HANDLE_ADTS pAdts ); - - -/** - * \brief Check if we have a valid ADTS frame at the current bitbuffer position - * - * This function assumes enough bits in buffer for the current frame. - * It reads out the header bits to prepare the bitbuffer for the decode loop. - * In case the header bits show an invalid bitstream/frame, the whole frame is skipped. - * - * \param pAdts ADTS data handle which is filled with parsed ADTS header data - * \param bs handle of bitstream from whom the ADTS header is read - * - * \return error status - */ -TRANSPORTDEC_ERROR adtsRead_DecodeHeader( - HANDLE_ADTS pAdts, - CSAudioSpecificConfig *pAsc, - HANDLE_FDK_BITSTREAM bs, - const INT ignoreBufferFullness - ); - -/** - * \brief Get the raw data block length of the given block number. - * - * \param pAdts ADTS data handle - * \param blockNum current raw data block index - * \param pLength pointer to an INT where the length of the given raw data block is stored into - * the returned value might be -1, in which case the raw data block length is unknown. - * - * \return error status - */ -int adtsRead_GetRawDataBlockLength( - HANDLE_ADTS pAdts, - INT blockNum - ); - - -#endif /* TPDEC_ADTS_H */ diff --git a/libMpegTPDec/src/tpdec_asc.cpp b/libMpegTPDec/src/tpdec_asc.cpp deleted file mode 100644 index 4d7cc02..0000000 --- a/libMpegTPDec/src/tpdec_asc.cpp +++ /dev/null @@ -1,1050 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright 1995 - 2013 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): Daniel Homm - Description: - -******************************************************************************/ - -#include "tpdec_lib.h" -#include "tp_data.h" - - -void CProgramConfig_Reset(CProgramConfig *pPce) -{ - pPce->elCounter = 0; -} - -void CProgramConfig_Init(CProgramConfig *pPce) -{ - FDKmemclear(pPce, sizeof(CProgramConfig)); -#ifdef TP_PCE_ENABLE - pPce->SamplingFrequencyIndex = 0xf; -#endif -} - -int CProgramConfig_IsValid ( const CProgramConfig *pPce ) -{ - return ( (pPce->isValid) ? 1 : 0); -} - -#ifdef TP_PCE_ENABLE -void CProgramConfig_Read( - CProgramConfig *pPce, - HANDLE_FDK_BITSTREAM bs, - UINT alignmentAnchor - ) -{ - int i; - - pPce->NumEffectiveChannels = 0; - pPce->NumChannels = 0; - pPce->ElementInstanceTag = (UCHAR) FDKreadBits(bs,4); - pPce->Profile = (UCHAR) FDKreadBits(bs,2); - pPce->SamplingFrequencyIndex = (UCHAR) FDKreadBits(bs,4); - pPce->NumFrontChannelElements = (UCHAR) FDKreadBits(bs,4); - pPce->NumSideChannelElements = (UCHAR) FDKreadBits(bs,4); - pPce->NumBackChannelElements = (UCHAR) FDKreadBits(bs,4); - pPce->NumLfeChannelElements = (UCHAR) FDKreadBits(bs,2); - pPce->NumAssocDataElements = (UCHAR) FDKreadBits(bs,3); - pPce->NumValidCcElements = (UCHAR) FDKreadBits(bs,4); - - if ((pPce->MonoMixdownPresent = (UCHAR) FDKreadBits(bs,1)) != 0) - { - pPce->MonoMixdownElementNumber = (UCHAR) FDKreadBits(bs,4); - } - - if ((pPce->StereoMixdownPresent = (UCHAR) FDKreadBits(bs,1)) != 0) - { - pPce->StereoMixdownElementNumber = (UCHAR) FDKreadBits(bs,4); - } - - if ((pPce->MatrixMixdownIndexPresent = (UCHAR) FDKreadBits(bs,1)) != 0) - { - pPce->MatrixMixdownIndex = (UCHAR) FDKreadBits(bs,2); - pPce->PseudoSurroundEnable = (UCHAR) FDKreadBits(bs,1); - } - - for (i=0; i < pPce->NumFrontChannelElements; i++) - { - pPce->FrontElementIsCpe[i] = (UCHAR) FDKreadBits(bs,1); - pPce->FrontElementTagSelect[i] = (UCHAR) FDKreadBits(bs,4); - pPce->NumChannels += pPce->FrontElementIsCpe[i] ? 2 : 1; - } - - for (i=0; i < pPce->NumSideChannelElements; i++) - { - pPce->SideElementIsCpe[i] = (UCHAR) FDKreadBits(bs,1); - pPce->SideElementTagSelect[i] = (UCHAR) FDKreadBits(bs,4); - pPce->NumChannels += pPce->SideElementIsCpe[i] ? 2 : 1; - } - - for (i=0; i < pPce->NumBackChannelElements; i++) - { - pPce->BackElementIsCpe[i] = (UCHAR) FDKreadBits(bs,1); - pPce->BackElementTagSelect[i] = (UCHAR) FDKreadBits(bs,4); - pPce->NumChannels += pPce->BackElementIsCpe[i] ? 2 : 1; - } - - pPce->NumEffectiveChannels = pPce->NumChannels; - - for (i=0; i < pPce->NumLfeChannelElements; i++) - { - pPce->LfeElementTagSelect[i] = (UCHAR) FDKreadBits(bs,4); - pPce->NumChannels += 1; - } - - for (i=0; i < pPce->NumAssocDataElements; i++) - { - pPce->AssocDataElementTagSelect[i] = (UCHAR) FDKreadBits(bs,4); - } - - for (i=0; i < pPce->NumValidCcElements; i++) - { - pPce->CcElementIsIndSw[i] = (UCHAR) FDKreadBits(bs,1); - pPce->ValidCcElementTagSelect[i] = (UCHAR) FDKreadBits(bs,4); - } - - FDKbyteAlign(bs, alignmentAnchor); - - pPce->CommentFieldBytes = (UCHAR) FDKreadBits(bs,8); - - for (i=0; i < pPce->CommentFieldBytes; i++) - { - UCHAR text; - - text = (UCHAR)FDKreadBits(bs,8); - - if (i < PC_COMMENTLENGTH) - { - pPce->Comment[i] = text; - } - } - - pPce->isValid = 1; -} - -/* - * Compare two program configurations. - * Returns the result of the comparison: - * -1 - completely different - * 0 - completely equal - * 1 - different but same channel configuration - * 2 - different channel configuration but same number of channels - */ -int CProgramConfig_Compare ( const CProgramConfig * const pPce1, - const CProgramConfig * const pPce2 ) -{ - int result = 0; /* Innocent until proven false. */ - - if (FDKmemcmp(pPce1, pPce2, sizeof(CProgramConfig)) != 0) - { /* Configurations are not completely different. - So look into details and analyse the channel configurations: */ - result = -1; - - if (pPce1->NumChannels == pPce2->NumChannels) - { /* Now the logic changes. We first assume to have the same channel configuration - and then prove if this assumption is true. */ - result = 1; - - /* Front channels */ - if (pPce1->NumFrontChannelElements != pPce2->NumFrontChannelElements) { - result = 2; /* different number of front channel elements */ - } else { - int el, numCh1 = 0, numCh2 = 0; - for (el = 0; el < pPce1->NumFrontChannelElements; el += 1) { - numCh1 += pPce1->FrontElementIsCpe[el] ? 2 : 1; - numCh2 += pPce2->FrontElementIsCpe[el] ? 2 : 1; - } - if (numCh1 != numCh2) { - result = 2; /* different number of front channels */ - } - } - /* Side channels */ - if (pPce1->NumSideChannelElements != pPce2->NumSideChannelElements) { - result = 2; /* different number of side channel elements */ - } else { - int el, numCh1 = 0, numCh2 = 0; - for (el = 0; el < pPce1->NumSideChannelElements; el += 1) { - numCh1 += pPce1->SideElementIsCpe[el] ? 2 : 1; - numCh2 += pPce2->SideElementIsCpe[el] ? 2 : 1; - } - if (numCh1 != numCh2) { - result = 2; /* different number of side channels */ - } - } - /* Back channels */ - if (pPce1->NumBackChannelElements != pPce2->NumBackChannelElements) { - result = 2; /* different number of back channel elements */ - } else { - int el, numCh1 = 0, numCh2 = 0; - for (el = 0; el < pPce1->NumBackChannelElements; el += 1) { - numCh1 += pPce1->BackElementIsCpe[el] ? 2 : 1; - numCh2 += pPce2->BackElementIsCpe[el] ? 2 : 1; - } - if (numCh1 != numCh2) { - result = 2; /* different number of back channels */ - } - } - /* LFE channels */ - if (pPce1->NumLfeChannelElements != pPce2->NumLfeChannelElements) { - result = 2; /* different number of lfe channels */ - } - /* LFEs are always SCEs so we don't need to count the channels. */ - } - } - - return result; -} - -void CProgramConfig_GetDefault( CProgramConfig *pPce, - const UINT channelConfig ) -{ - FDK_ASSERT(pPce != NULL); - - /* Init PCE */ - CProgramConfig_Init(pPce); - pPce->Profile = 1; /* Set AAC LC because it is the only supported object type. */ - - switch (channelConfig) { - /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ - case 6: /* 3/0/2.1ch */ - pPce->NumLfeChannelElements += 1; - pPce->NumChannels += 1; - case 5: /* 3/0/2.0ch */ - case 4: /* 3/0/1.0ch */ - pPce->NumBackChannelElements += 1; - pPce->BackElementIsCpe[0] = (channelConfig>4) ? 1 : 0; - pPce->NumChannels += (channelConfig>4) ? 2 : 1; - pPce->NumEffectiveChannels += (channelConfig>4) ? 2 : 1; - case 3: /* 3/0/0.0ch */ - pPce->NumFrontChannelElements += 1; - pPce->FrontElementIsCpe[1] = 1; - pPce->NumChannels += 2; - pPce->NumEffectiveChannels += 2; - case 1: /* 1/0/0.0ch */ - pPce->NumFrontChannelElements += 1; - pPce->FrontElementIsCpe[0] = 0; - pPce->NumChannels += 1; - pPce->NumEffectiveChannels += 1; - pPce->isValid = 1; - break; - /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ - case 2: /* 2/0/0.ch */ - pPce->NumFrontChannelElements = 1; - pPce->FrontElementIsCpe[0] = 1; - pPce->NumChannels += 2; - pPce->NumEffectiveChannels += 2; - pPce->isValid = 1; - break; - /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ - default: - pPce->isValid = 0; /* To be explicit! */ - break; - } - - if (pPce->isValid) { - /* Create valid element instance tags */ - int el, elTagSce = 0, elTagCpe = 0; - - for (el = 0; el < pPce->NumFrontChannelElements; el += 1) { - pPce->FrontElementTagSelect[el] = (pPce->FrontElementIsCpe) ? elTagCpe++ : elTagSce++; - } - for (el = 0; el < pPce->NumSideChannelElements; el += 1) { - pPce->SideElementTagSelect[el] = (pPce->SideElementIsCpe) ? elTagCpe++ : elTagSce++; - } - for (el = 0; el < pPce->NumBackChannelElements; el += 1) { - pPce->BackElementTagSelect[el] = (pPce->BackElementIsCpe) ? elTagCpe++ : elTagSce++; - } - elTagSce = 0; - for (el = 0; el < pPce->NumLfeChannelElements; el += 1) { - pPce->LfeElementTagSelect[el] = elTagSce++; - } - } -} -#endif /* TP_PCE_ENABLE */ - -/** - * \brief get implicit audio channel type for given channelConfig and MPEG ordered channel index - * \param channelConfig MPEG channelConfiguration from 1 upto 7 - * \param index MPEG channel order index - * \return audio channel type. - */ -void getImplicitAudioChannelTypeAndIndex( - AUDIO_CHANNEL_TYPE *chType, - UCHAR *chIndex, - UINT channelConfig, - UINT index - ) -{ - if (index < 3) { - *chType = ACT_FRONT; - *chIndex = index; - } else { - switch (channelConfig) { - case MODE_1_2_1: - case MODE_1_2_2: - case MODE_1_2_2_1: - switch (index) { - case 3: - case 4: - *chType = ACT_BACK; - *chIndex = index - 3; - break; - case 5: - *chType = ACT_LFE; - *chIndex = 0; - break; - } - break; - case MODE_1_2_2_2_1: - switch (index) { - case 3: - case 4: - *chType = ACT_SIDE; - *chIndex = index - 3; - break; - case 5: - case 6: - *chType = ACT_BACK; - *chIndex = index - 5; - break; - case 7: - *chType = ACT_LFE; - *chIndex = 0; - break; - } - break; - default: - *chType = ACT_NONE; - break; - } - } -} - -int CProgramConfig_LookupElement( - CProgramConfig *pPce, - UINT channelConfig, - const UINT tag, - const UINT channelIdx, - UCHAR chMapping[], - AUDIO_CHANNEL_TYPE chType[], - UCHAR chIndex[], - UCHAR *elMapping, - MP4_ELEMENT_ID elList[], - MP4_ELEMENT_ID elType - ) -{ - if (channelConfig > 0) - { - /* Constant channel mapping must have - been set during initialization. */ - if ( elType == ID_SCE - || elType == ID_CPE - || elType == ID_LFE ) - { - *elMapping = pPce->elCounter; - if (elList[pPce->elCounter] != elType) { - /* Not in the list */ - if ( (channelConfig == 2) && (elType == ID_SCE) ) - { /* This scenario occurs with HE-AAC v2 streams of buggy encoders. - Due to other decoder implementations decoding of these kind of streams is desired. */ - channelConfig = 1; - } else { - return 0; - } - } - /* Assume all front channels */ - getImplicitAudioChannelTypeAndIndex(&chType[channelIdx], &chIndex[channelIdx], channelConfig, channelIdx); - if (elType == ID_CPE) { - chType[channelIdx+1] = chType[channelIdx]; - chIndex[channelIdx+1] = chIndex[channelIdx]+1; - } - pPce->elCounter++; - } - /* Accept all non-channel elements, too. */ - return 1; - } - else - { -#ifdef TP_PCE_ENABLE - if (!pPce->isValid) -#endif /* TP_PCE_ENABLE */ - { - /* Implicit channel mapping. */ - if ( elType == ID_SCE - || elType == ID_CPE - || elType == ID_LFE ) - { - /* Store all channel element IDs */ - elList[pPce->elCounter] = elType; - *elMapping = pPce->elCounter++; - } - } -#ifdef TP_PCE_ENABLE - else { - /* Accept the additional channel(s), only if the tag is in the lists */ - int isCpe = 0, i; - int cc = 0, fc = 0, sc = 0, bc = 0, lc = 0, ec = 0; /* Channel and element counters */ - - switch (elType) - { - case ID_CPE: - isCpe = 1; - case ID_SCE: - /* search in front channels */ - for (i = 0; i < pPce->NumFrontChannelElements; i++) { - if (isCpe == pPce->FrontElementIsCpe[i] && pPce->FrontElementTagSelect[i] == tag) { - chMapping[cc] = channelIdx; - chType[cc] = ACT_FRONT; - chIndex[cc] = fc; - if (isCpe) { - chMapping[cc+1] = channelIdx+1; - chType[cc+1] = ACT_FRONT; - chIndex[cc+1] = fc+1; - } - *elMapping = ec; - return 1; - } - ec++; - if (pPce->FrontElementIsCpe[i]) { - cc+=2; fc+=2; - } else { - cc++; fc++; - } - } - /* search in side channels */ - for (i = 0; i < pPce->NumSideChannelElements; i++) { - if (isCpe == pPce->SideElementIsCpe[i] && pPce->SideElementTagSelect[i] == tag) { - chMapping[cc] = channelIdx; - chType[cc] = ACT_SIDE; - chIndex[cc] = sc; - if (isCpe) { - chMapping[cc+1] = channelIdx+1; - chType[cc+1] = ACT_SIDE; - chIndex[cc+1] = sc+1; - } - *elMapping = ec; - return 1; - } - ec++; - if (pPce->SideElementIsCpe[i]) { - cc+=2; sc+=2; - } else { - cc++; sc++; - } - } - /* search in back channels */ - for (i = 0; i < pPce->NumBackChannelElements; i++) { - if (isCpe == pPce->BackElementIsCpe[i] && pPce->BackElementTagSelect[i] == tag) { - chMapping[cc] = channelIdx; - chType[cc] = ACT_BACK; - chIndex[cc] = bc; - if (isCpe) { - chMapping[cc+1] = channelIdx+1; - chType[cc+1] = ACT_BACK; - chIndex[cc+1] = bc+1; - } - *elMapping = ec; - return 1; - } - ec++; - if (pPce->BackElementIsCpe[i]) { - cc+=2; bc+=2; - } else { - cc++; bc++; - } - } - break; - - case ID_LFE: - /* Initialize channel counter and element counter */ - cc = pPce->NumEffectiveChannels; - ec = pPce->NumFrontChannelElements+ pPce->NumSideChannelElements + pPce->NumBackChannelElements; - /* search in lfe channels */ - for (i = 0; i < pPce->NumLfeChannelElements; i++) { - if ( pPce->LfeElementTagSelect[i] == tag ) { - chMapping[cc] = channelIdx; - *elMapping = ec; - chType[cc] = ACT_LFE; - chIndex[cc] = lc; - return 1; - } - ec++; - cc++; - lc++; - } - break; - - /* Non audio elements */ - case ID_CCE: - /* search in cce channels */ - for (i = 0; i < pPce->NumValidCcElements; i++) { - if (pPce->ValidCcElementTagSelect[i] == tag) { - return 1; - } - } - break; - case ID_DSE: - /* search associated data elements */ - for (i = 0; i < pPce->NumAssocDataElements; i++) { - if (pPce->AssocDataElementTagSelect[i] == tag) { - return 1; - } - } - break; - default: - return 0; - } - return 0; /* not found in any list */ - } -#endif /* TP_PCE_ENABLE */ - } - - return 1; -} - -#ifdef TP_PCE_ENABLE -int CProgramConfig_GetElementTable( - const CProgramConfig *pPce, - MP4_ELEMENT_ID elList[], - const INT elListSize - ) -{ - int i, el = 0; - - if ( elListSize - < pPce->NumFrontChannelElements + pPce->NumSideChannelElements + pPce->NumBackChannelElements + pPce->NumLfeChannelElements - ) - { - return 0; - } - - for (i=0; i < pPce->NumFrontChannelElements; i++) - { - elList[el++] = (pPce->FrontElementIsCpe[i]) ? ID_CPE : ID_SCE; - } - - for (i=0; i < pPce->NumSideChannelElements; i++) - { - elList[el++] = (pPce->SideElementIsCpe[i]) ? ID_CPE : ID_SCE; - } - - for (i=0; i < pPce->NumBackChannelElements; i++) - { - elList[el++] = (pPce->BackElementIsCpe[i]) ? ID_CPE : ID_SCE; - } - - for (i=0; i < pPce->NumLfeChannelElements; i++) - { - elList[el++] = ID_LFE; - } - - - return el; -} -#endif - -static AUDIO_OBJECT_TYPE getAOT(HANDLE_FDK_BITSTREAM bs) -{ - int tmp = 0; - - tmp = FDKreadBits(bs,5); - if (tmp == AOT_ESCAPE) { - int tmp2 = FDKreadBits(bs,6); - tmp = 32 + tmp2; - } - - return (AUDIO_OBJECT_TYPE)tmp; -} - -static INT getSampleRate(HANDLE_FDK_BITSTREAM bs, UCHAR *index, int nBits) -{ - INT sampleRate; - int idx; - - idx = FDKreadBits(bs, nBits); - if( idx == (1<<nBits)-1 ) { - if(FDKgetValidBits(bs) < 24) { - return 0; - } - sampleRate = FDKreadBits(bs,24); - } else { - sampleRate = SamplingRateTable[idx]; - } - - *index = idx; - - return sampleRate; -} - -#ifdef TP_GA_ENABLE -static -TRANSPORTDEC_ERROR GaSpecificConfig_Parse( CSGaSpecificConfig *self, - CSAudioSpecificConfig *asc, - HANDLE_FDK_BITSTREAM bs, - UINT ascStartAnchor ) -{ - TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK; - - self->m_frameLengthFlag = FDKreadBits(bs,1); - - self->m_dependsOnCoreCoder = FDKreadBits(bs,1); - - if( self->m_dependsOnCoreCoder ) - self->m_coreCoderDelay = FDKreadBits(bs,14); - - self->m_extensionFlag = FDKreadBits(bs,1); - - if( asc->m_channelConfiguration == 0 ) { - CProgramConfig_Read(&asc->m_progrConfigElement, bs, ascStartAnchor); - } - - if ((asc->m_aot == AOT_AAC_SCAL) || (asc->m_aot == AOT_ER_AAC_SCAL)) { - self->m_layer = FDKreadBits(bs,3); - } - - if (self->m_extensionFlag) { - if (asc->m_aot == AOT_ER_BSAC) { - self->m_numOfSubFrame = FDKreadBits(bs,5); - self->m_layerLength = FDKreadBits(bs,11); - } - - if ((asc->m_aot == AOT_ER_AAC_LC) || (asc->m_aot == AOT_ER_AAC_LTP) || - (asc->m_aot == AOT_ER_AAC_SCAL) || (asc->m_aot == AOT_ER_AAC_LD)) - { - asc->m_vcb11Flag = FDKreadBits(bs,1); /* aacSectionDataResilienceFlag */ - asc->m_rvlcFlag = FDKreadBits(bs,1); /* aacScalefactorDataResilienceFlag */ - asc->m_hcrFlag = FDKreadBits(bs,1); /* aacSpectralDataResilienceFlag */ - } - - self->m_extensionFlag3 = FDKreadBits(bs,1); - - } - return (ErrorStatus); -} -#endif /* TP_GA_ENABLE */ - - - - - -#ifdef TP_ELD_ENABLE - -static INT ld_sbr_header( const CSAudioSpecificConfig *asc, - HANDLE_FDK_BITSTREAM hBs, - CSTpCallBacks *cb ) -{ - const int channelConfiguration = asc->m_channelConfiguration; - int i = 0; - INT error = 0; - - if (channelConfiguration == 2) { - error = cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_CPE, i++); - } else { - error = cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_SCE, i++); - } - - switch ( channelConfiguration ) { - case 7: - error |= cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_CPE, i++); - case 6: - case 5: - error |= cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_CPE, i++); - case 3: - error |= cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_CPE, i++); - break; - - case 4: - error |= cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_CPE, i++); - error |= cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_SCE, i++); - break; - } - - return error; -} - -static -TRANSPORTDEC_ERROR EldSpecificConfig_Parse( - CSAudioSpecificConfig *asc, - HANDLE_FDK_BITSTREAM hBs, - CSTpCallBacks *cb - ) -{ - TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK; - CSEldSpecificConfig *esc = &asc->m_sc.m_eldSpecificConfig; - ASC_ELD_EXT_TYPE eldExtType; - int eldExtLen, len, cnt; - - FDKmemclear(esc, sizeof(CSEldSpecificConfig)); - - esc->m_frameLengthFlag = FDKreadBits(hBs, 1 ); - if (esc->m_frameLengthFlag) { - asc->m_samplesPerFrame = 480; - } else { - asc->m_samplesPerFrame = 512; - } - - asc->m_vcb11Flag = FDKreadBits(hBs, 1 ); - asc->m_rvlcFlag = FDKreadBits(hBs, 1 ); - asc->m_hcrFlag = FDKreadBits(hBs, 1 ); - - esc->m_sbrPresentFlag = FDKreadBits(hBs, 1 ); - - if (esc->m_sbrPresentFlag == 1) { - esc->m_sbrSamplingRate = FDKreadBits(hBs, 1 ); /* 0: single rate, 1: dual rate */ - esc->m_sbrCrcFlag = FDKreadBits(hBs, 1 ); - - asc->m_extensionSamplingFrequency = asc->m_samplingFrequency << esc->m_sbrSamplingRate; - - if (cb->cbSbr != NULL){ - if ( 0 != ld_sbr_header(asc, hBs, cb) ) { - return TRANSPORTDEC_PARSE_ERROR; - } - } - } - esc->m_useLdQmfTimeAlign = 0; - - /* new ELD syntax */ - /* parse ExtTypeConfigData */ - while ((eldExtType = (ASC_ELD_EXT_TYPE)FDKreadBits(hBs, 4 )) != ELDEXT_TERM) { - eldExtLen = len = FDKreadBits(hBs, 4 ); - if ( len == 0xf ) { - len = FDKreadBits(hBs, 8 ); - eldExtLen += len; - - if ( len == 0xff ) { - len = FDKreadBits(hBs, 16 ); - eldExtLen += len; - } - } - - switch (eldExtType) { - case ELDEXT_LDSAC: - esc->m_useLdQmfTimeAlign = 1; - if (cb->cbSsc != NULL) { - ErrorStatus = (TRANSPORTDEC_ERROR)cb->cbSsc( - cb->cbSscData, - hBs, - asc->m_aot, - asc->m_samplingFrequency, - 1, /* muxMode */ - len - ); - } else { - ErrorStatus = TRANSPORTDEC_UNSUPPORTED_FORMAT; - } - if (ErrorStatus != TRANSPORTDEC_OK) { - goto bail; - } - break; - default: - for(cnt=0; cnt<len; cnt++) { - FDKreadBits(hBs, 8 ); - } - break; - /* add future eld extension configs here */ - } - } -bail: - return (ErrorStatus); -} -#endif /* TP_ELD_ENABLE */ - - -static -TRANSPORTDEC_ERROR AudioSpecificConfig_ExtensionParse(CSAudioSpecificConfig *self, HANDLE_FDK_BITSTREAM bs, CSTpCallBacks *cb) -{ - TP_ASC_EXTENSION_ID lastAscExt, ascExtId = ASCEXT_UNKOWN; - INT bitsAvailable = (INT)FDKgetValidBits(bs); - - while (bitsAvailable >= 11) - { - lastAscExt = ascExtId; - ascExtId = (TP_ASC_EXTENSION_ID)FDKreadBits(bs, 11); - bitsAvailable -= 11; - - switch (ascExtId) { - case ASCEXT_SBR: /* 0x2b7 */ - if ( (self->m_extensionAudioObjectType != AOT_SBR) && (bitsAvailable >= 5) ) { - self->m_extensionAudioObjectType = getAOT(bs); - - if ( (self->m_extensionAudioObjectType == AOT_SBR) - || (self->m_extensionAudioObjectType == AOT_ER_BSAC) ) - { /* Get SBR extension configuration */ - self->m_sbrPresentFlag = FDKreadBits(bs, 1); - bitsAvailable -= 1; - - if ( self->m_sbrPresentFlag == 1 ) { - self->m_extensionSamplingFrequency = getSampleRate(bs, &self->m_extensionSamplingFrequencyIndex, 4); - - if ((INT)self->m_extensionSamplingFrequency <= 0) { - return TRANSPORTDEC_PARSE_ERROR; - } - } - if ( self->m_extensionAudioObjectType == AOT_ER_BSAC ) { - self->m_extensionChannelConfiguration = FDKreadBits(bs, 4); - bitsAvailable -= 4; - } - } - /* Update counter because of variable length fields (AOT and sampling rate) */ - bitsAvailable = (INT)FDKgetValidBits(bs); - } - break; - case ASCEXT_PS: /* 0x548 */ - if ( (lastAscExt == ASCEXT_SBR) - && (self->m_extensionAudioObjectType == AOT_SBR) - && (bitsAvailable > 0) ) - { /* Get PS extension configuration */ - self->m_psPresentFlag = FDKreadBits(bs, 1); - bitsAvailable -= 1; - } - break; - default: - /* Just ignore anything. */ - return TRANSPORTDEC_OK; - } - } - - return TRANSPORTDEC_OK; -} - -/* - * API Functions - */ - -void AudioSpecificConfig_Init(CSAudioSpecificConfig *asc) -{ - FDKmemclear(asc, sizeof(CSAudioSpecificConfig)); - - /* Init all values that should not be zero. */ - asc->m_aot = AOT_NONE; - asc->m_samplingFrequencyIndex = 0xf; - asc->m_epConfig = -1; - asc->m_extensionAudioObjectType = AOT_NULL_OBJECT; -#ifdef TP_PCE_ENABLE - CProgramConfig_Init(&asc->m_progrConfigElement); -#endif -} - -TRANSPORTDEC_ERROR AudioSpecificConfig_Parse( - CSAudioSpecificConfig *self, - HANDLE_FDK_BITSTREAM bs, - int fExplicitBackwardCompatible, - CSTpCallBacks *cb - ) -{ - TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK; - UINT ascStartAnchor = FDKgetValidBits(bs); - int frameLengthFlag = -1; - - AudioSpecificConfig_Init(self); - - self->m_aot = getAOT(bs); - self->m_samplingFrequency = getSampleRate(bs, &self->m_samplingFrequencyIndex, 4); - if (self->m_samplingFrequency <= 0) { - return TRANSPORTDEC_PARSE_ERROR; - } - - self->m_channelConfiguration = FDKreadBits(bs,4); - - /* SBR extension ( explicit non-backwards compatible mode ) */ - self->m_sbrPresentFlag = 0; - self->m_psPresentFlag = 0; - - if ( self->m_aot == AOT_SBR || self->m_aot == AOT_PS ) { - self->m_extensionAudioObjectType = AOT_SBR; - - self->m_sbrPresentFlag = 1; - if ( self->m_aot == AOT_PS ) { - self->m_psPresentFlag = 1; - } - - self->m_extensionSamplingFrequency = getSampleRate(bs, &self->m_extensionSamplingFrequencyIndex, 4); - self->m_aot = getAOT(bs); - - } else { - self->m_extensionAudioObjectType = AOT_NULL_OBJECT; - } - - /* Parse whatever specific configs */ - switch (self->m_aot) - { -#ifdef TP_GA_ENABLE - case AOT_AAC_LC: - case AOT_ER_AAC_LC: - case AOT_ER_AAC_LD: - case AOT_ER_AAC_SCAL: - case AOT_ER_BSAC: - if ((ErrorStatus = GaSpecificConfig_Parse(&self->m_sc.m_gaSpecificConfig, self, bs, ascStartAnchor)) != TRANSPORTDEC_OK ) { - return (ErrorStatus); - } - frameLengthFlag = self->m_sc.m_gaSpecificConfig.m_frameLengthFlag; - break; -#endif /* TP_GA_ENABLE */ - case AOT_MPEGS: - if (cb->cbSsc != NULL) { - cb->cbSsc( - cb->cbSscData, - bs, - self->m_aot, - self->m_samplingFrequency, - 1, - 0 /* don't know the length */ - ); - } else { - return TRANSPORTDEC_UNSUPPORTED_FORMAT; - } - break; -#ifdef TP_ELD_ENABLE - case AOT_ER_AAC_ELD: - if ((ErrorStatus = EldSpecificConfig_Parse(self, bs, cb)) != TRANSPORTDEC_OK ) { - return (ErrorStatus); - } - frameLengthFlag = self->m_sc.m_eldSpecificConfig.m_frameLengthFlag; - self->m_sbrPresentFlag = self->m_sc.m_eldSpecificConfig.m_sbrPresentFlag; - self->m_extensionSamplingFrequency = (self->m_sc.m_eldSpecificConfig.m_sbrSamplingRate+1) * self->m_samplingFrequency; - break; -#endif /* TP_ELD_ENABLE */ - - default: - return TRANSPORTDEC_UNSUPPORTED_FORMAT; - break; - } - - /* Frame length */ - switch (self->m_aot) - { -#if defined(TP_GA_ENABLE) || defined(TP_USAC_ENABLE) - case AOT_AAC_LC: - case AOT_ER_AAC_LC: - case AOT_ER_AAC_SCAL: - case AOT_ER_BSAC: - /*case AOT_USAC:*/ - if (!frameLengthFlag) - self->m_samplesPerFrame = 1024; - else - self->m_samplesPerFrame = 960; - break; -#endif /* TP_GA_ENABLE */ -#if defined(TP_GA_ENABLE) - case AOT_ER_AAC_LD: - if (!frameLengthFlag) - self->m_samplesPerFrame = 512; - else - self->m_samplesPerFrame = 480; - break; -#endif /* defined(TP_GA_ENABLE) */ - default: - break; - } - - switch (self->m_aot) - { - case AOT_ER_AAC_LC: - case AOT_ER_AAC_LD: - case AOT_ER_AAC_ELD: - case AOT_ER_AAC_SCAL: - case AOT_ER_CELP: - case AOT_ER_HVXC: - case AOT_ER_BSAC: - self->m_epConfig = FDKreadBits(bs,2); - - if (self->m_epConfig > 1) { - return TRANSPORTDEC_UNSUPPORTED_FORMAT; // EPCONFIG; - } - break; - default: - break; - } - - if (fExplicitBackwardCompatible) { - ErrorStatus = AudioSpecificConfig_ExtensionParse(self, bs, cb); - } - - return (ErrorStatus); -} - - diff --git a/libMpegTPDec/src/tpdec_latm.cpp b/libMpegTPDec/src/tpdec_latm.cpp deleted file mode 100644 index 5710d77..0000000 --- a/libMpegTPDec/src/tpdec_latm.cpp +++ /dev/null @@ -1,433 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright 1995 - 2013 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): Daniel Homm - Description: - -******************************************************************************/ - -#include "tpdec_latm.h" - - -#include "FDK_bitstream.h" - - -#define TPDEC_TRACKINDEX(p,l) (2*(p) + (l)) - -static -UINT CLatmDemux_GetValue(HANDLE_FDK_BITSTREAM bs) -{ - UCHAR bytesForValue = 0, tmp = 0; - int value = 0; - - bytesForValue = (UCHAR) FDKreadBits(bs,2); - - for (UINT i=0; i<=bytesForValue; i++) { - value <<= 8; - tmp = (UCHAR) FDKreadBits(bs,8); - value += tmp; - } - - return value; -} - - -static -TRANSPORTDEC_ERROR CLatmDemux_ReadAudioMuxElement( - HANDLE_FDK_BITSTREAM bs, - CLatmDemux *pLatmDemux, - int m_muxConfigPresent, - CSTpCallBacks *pTpDecCallbacks, - CSAudioSpecificConfig *pAsc, - int *pfConfigFound - ) -{ - TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK; - - if (m_muxConfigPresent) { - pLatmDemux->m_useSameStreamMux = FDKreadBits(bs,1); - - if (!pLatmDemux->m_useSameStreamMux) { - if ((ErrorStatus = CLatmDemux_ReadStreamMuxConfig(bs, pLatmDemux, pTpDecCallbacks, pAsc, pfConfigFound))) { - return (ErrorStatus); - } - } - } - - /* If there was no configuration read, its not possible to parse PayloadLengthInfo below. */ - if (! *pfConfigFound) { - return TRANSPORTDEC_SYNC_ERROR; - } - - if (pLatmDemux->m_AudioMuxVersionA == 0) { - /* Do only once per call, because parsing and decoding is done in-line. */ - if ((ErrorStatus = CLatmDemux_ReadPayloadLengthInfo(bs,pLatmDemux))) { - return (ErrorStatus); - } - } else { - /* audioMuxVersionA > 0 is reserved for future extensions */ - ErrorStatus = TRANSPORTDEC_UNSUPPORTED_FORMAT; - } - - return (ErrorStatus); -} - -TRANSPORTDEC_ERROR CLatmDemux_Read( - HANDLE_FDK_BITSTREAM bs, - CLatmDemux *pLatmDemux, - TRANSPORT_TYPE tt, - CSTpCallBacks *pTpDecCallbacks, - CSAudioSpecificConfig *pAsc, - int *pfConfigFound, - const INT ignoreBufferFullness - ) -{ - UINT cntBits; - UINT cmpBufferFullness; - UINT audioMuxLengthBytesLast = 0; - TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK; - - cntBits = FDKgetValidBits(bs); - - if ((INT)cntBits < MIN_LATM_HEADERLENGTH) { - return TRANSPORTDEC_NOT_ENOUGH_BITS; - } - - if ((ErrorStatus = CLatmDemux_ReadAudioMuxElement(bs, pLatmDemux, (tt != TT_MP4_LATM_MCP0), pTpDecCallbacks, pAsc, pfConfigFound))) - return (ErrorStatus); - - if (!ignoreBufferFullness) - { - cmpBufferFullness = 24+audioMuxLengthBytesLast*8 - + pLatmDemux->m_linfo[0][0].m_bufferFullness* pAsc[TPDEC_TRACKINDEX(0,0)].m_channelConfiguration*32; - - /* evaluate buffer fullness */ - - if (pLatmDemux->m_linfo[0][0].m_bufferFullness != 0xFF) - { - if (!pLatmDemux->BufferFullnessAchieved) - { - if (cntBits < cmpBufferFullness) - { - /* condition for start of decoding is not fulfilled */ - - /* the current frame will not be decoded */ - return TRANSPORTDEC_NOT_ENOUGH_BITS; - } - else - { - pLatmDemux->BufferFullnessAchieved = 1; - } - } - } - } - - return (ErrorStatus); -} - - -TRANSPORTDEC_ERROR CLatmDemux_ReadStreamMuxConfig( - HANDLE_FDK_BITSTREAM bs, - CLatmDemux *pLatmDemux, - CSTpCallBacks *pTpDecCallbacks, - CSAudioSpecificConfig *pAsc, - int * pfConfigFound - ) -{ - LATM_LAYER_INFO *p_linfo = NULL; - TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK; - - pLatmDemux->m_AudioMuxVersion = FDKreadBits(bs,1); - - if (pLatmDemux->m_AudioMuxVersion == 0) { - pLatmDemux->m_AudioMuxVersionA = 0; - } else { - pLatmDemux->m_AudioMuxVersionA = FDKreadBits(bs,1); - } - - if (pLatmDemux->m_AudioMuxVersionA == 0) { - if (pLatmDemux->m_AudioMuxVersion == 1) { - pLatmDemux->m_taraBufferFullness = CLatmDemux_GetValue(bs); - } - pLatmDemux->m_allStreamsSameTimeFraming = FDKreadBits(bs,1); - pLatmDemux->m_noSubFrames = FDKreadBits(bs,6) + 1; - pLatmDemux->m_numProgram = FDKreadBits(bs,4) + 1; - - if (pLatmDemux->m_numProgram > 1) { - return TRANSPORTDEC_UNSUPPORTED_FORMAT; - } - - int idCnt = 0; - for (UINT prog = 0; prog < pLatmDemux->m_numProgram; prog++) { - pLatmDemux->m_numLayer = FDKreadBits(bs,3) + 1; - if (pLatmDemux->m_numLayer > 2) { - return TRANSPORTDEC_UNSUPPORTED_FORMAT; - } - - for (UINT lay = 0; lay < pLatmDemux->m_numLayer; lay++) { - p_linfo = &pLatmDemux->m_linfo[prog][lay]; - - p_linfo->m_streamID = idCnt++; - p_linfo->m_frameLengthInBits = 0; - - if( (prog == 0) && (lay == 0) ) { - pLatmDemux->m_useSameConfig = 0; - } else { - pLatmDemux->m_useSameConfig = FDKreadBits(bs,1); - } - - if (pLatmDemux->m_useSameConfig) { - if (lay > 1) { - FDKmemcpy(&pAsc[TPDEC_TRACKINDEX(prog,lay)], &pAsc[TPDEC_TRACKINDEX(prog,lay-1)], sizeof(CSAudioSpecificConfig)); - } else { - return TRANSPORTDEC_PARSE_ERROR; - } - } else { - if (pLatmDemux->m_AudioMuxVersion == 1) - { - FDK_BITSTREAM tmpBs; - UINT ascStartPos, ascLen=0; - - ascLen = CLatmDemux_GetValue(bs); - ascStartPos = FDKgetValidBits(bs); - tmpBs = *bs; - FDKsyncCache(&tmpBs); - tmpBs.hBitBuf.ValidBits = ascLen; - - /* Read ASC */ - if ((ErrorStatus = AudioSpecificConfig_Parse(&pAsc[TPDEC_TRACKINDEX(prog,lay)], &tmpBs, 1, pTpDecCallbacks))) { - return (ErrorStatus); - } - *pfConfigFound = 1; - - /* The field p_linfo->m_ascLen could be wrong, so check if */ - if ( 0 > (INT)FDKgetValidBits(&tmpBs)) { - return TRANSPORTDEC_PARSE_ERROR; - } - FDKpushFor(bs, ascLen); /* position bitstream after ASC */ - } - else { - /* Read ASC */ - if ((ErrorStatus = AudioSpecificConfig_Parse(&pAsc[TPDEC_TRACKINDEX(prog,lay)], bs, 0, pTpDecCallbacks))) { - return (ErrorStatus); - } - } - { - int cbError; - - cbError = pTpDecCallbacks->cbUpdateConfig(pTpDecCallbacks->cbUpdateConfigData, &pAsc[TPDEC_TRACKINDEX(prog,lay)]); - if (cbError != 0) { - return TRANSPORTDEC_UNKOWN_ERROR; - } - *pfConfigFound = 1; - } - } - - p_linfo->m_frameLengthType = FDKreadBits(bs,3); - switch( p_linfo->m_frameLengthType ) { - case 0: - p_linfo->m_bufferFullness = FDKreadBits(bs,8); - - if (!pLatmDemux->m_allStreamsSameTimeFraming) { - if ((lay > 0) && (pAsc[TPDEC_TRACKINDEX(prog,lay)].m_aot == AOT_AAC_SCAL || pAsc[TPDEC_TRACKINDEX(prog,lay)].m_aot == AOT_ER_AAC_SCAL)) { - return TRANSPORTDEC_UNSUPPORTED_FORMAT; - } - } - break; - case 1: - /* frameLength = FDKreadBits(bs,9); */ - case 3: - case 4: - case 5: - /* CELP */ - case 6: - case 7: - /* HVXC */ - default: - return TRANSPORTDEC_PARSE_ERROR; //_LATM_INVALIDFRAMELENGTHTYPE; - - } /* switch framelengthtype*/ - - } /* layer loop */ - } /* prog loop */ - - pLatmDemux->m_otherDataPresent = FDKreadBits(bs,1); - pLatmDemux->m_otherDataLength = 0; - - if (pLatmDemux->m_otherDataPresent) { - int otherDataLenEsc = 0; - do { - pLatmDemux->m_otherDataLength <<= 8; // *= 256 - otherDataLenEsc = FDKreadBits(bs,1); - pLatmDemux->m_otherDataLength += FDKreadBits(bs,8); - } while (otherDataLenEsc); - } - - pLatmDemux->m_crcCheckPresent = FDKreadBits(bs,1); - pLatmDemux->m_crcCheckSum = 0; - - if (pLatmDemux->m_crcCheckPresent) { - pLatmDemux->m_crcCheckSum = FDKreadBits(bs,8); - } - - } - else { - /* audioMuxVersionA > 0 is reserved for future extensions */ - ErrorStatus = TRANSPORTDEC_UNSUPPORTED_FORMAT; - } - return (ErrorStatus); -} - -TRANSPORTDEC_ERROR CLatmDemux_ReadPayloadLengthInfo(HANDLE_FDK_BITSTREAM bs, CLatmDemux *pLatmDemux) -{ - TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK; - int totalPayloadBits = 0; - - if( pLatmDemux->m_allStreamsSameTimeFraming == 1 ) { - for (UINT prog=0; prog<pLatmDemux->m_numProgram; prog++ ) { - for (UINT lay=0; lay<pLatmDemux->m_numLayer; lay++ ) { - LATM_LAYER_INFO *p_linfo = &pLatmDemux->m_linfo[prog][lay]; - - switch (p_linfo->m_frameLengthType ) { - case 0: - p_linfo->m_frameLengthInBits = CLatmDemux_ReadAuChunkLengthInfo(bs); - totalPayloadBits += p_linfo->m_frameLengthInBits; - break; - case 3: - case 5: - case 7: - default: - return TRANSPORTDEC_PARSE_ERROR; //AAC_DEC_LATM_INVALIDFRAMELENGTHTYPE; - } - } - } - } - else { - ErrorStatus = TRANSPORTDEC_PARSE_ERROR; //AAC_DEC_LATM_TIMEFRAMING; - } - if (pLatmDemux->m_audioMuxLengthBytes > (UINT)0 && totalPayloadBits > (int)pLatmDemux->m_audioMuxLengthBytes*8) { - return TRANSPORTDEC_PARSE_ERROR; - } - return (ErrorStatus); -} - -int CLatmDemux_ReadAuChunkLengthInfo(HANDLE_FDK_BITSTREAM bs) -{ - UCHAR endFlag; - int len = 0; - - do { - UCHAR tmp = (UCHAR) FDKreadBits(bs,8); - endFlag = (tmp < 255); - - len += tmp; - - } while( endFlag == 0 ); - - len <<= 3; /* convert from bytes to bits */ - - return len; -} - -int CLatmDemux_GetFrameLengthInBits(CLatmDemux *pLatmDemux) -{ - return pLatmDemux->m_linfo[0][0].m_frameLengthInBits; -} - -int CLatmDemux_GetOtherDataPresentFlag(CLatmDemux *pLatmDemux) -{ - return pLatmDemux->m_otherDataPresent ? 1 : 0; -} - -int CLatmDemux_GetOtherDataLength(CLatmDemux *pLatmDemux) -{ - return pLatmDemux->m_otherDataLength; -} - -UINT CLatmDemux_GetNrOfSubFrames(CLatmDemux *pLatmDemux) -{ - return pLatmDemux->m_noSubFrames; -} - diff --git a/libMpegTPDec/src/tpdec_latm.h b/libMpegTPDec/src/tpdec_latm.h deleted file mode 100644 index 6dc13e8..0000000 --- a/libMpegTPDec/src/tpdec_latm.h +++ /dev/null @@ -1,176 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright 1995 - 2013 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): Daniel Homm - Description: - -******************************************************************************/ - -#ifndef LATM_DEMUX_H -#define LATM_DEMUX_H - -#include "tpdec_lib.h" - - -#include "FDK_bitstream.h" - -#define MIN_LATM_HEADERLENGTH 9 -#define MIN_LOAS_HEADERLENGTH MIN_LATM_HEADERLENGTH + 24 /* both in bits */ - #define MIN_TP_BUF_SIZE_LOAS ( 8194 ) - -enum { - LATM_MAX_PROG = 1, - LATM_MAX_LAYER = 2, - LATM_MAX_VAR_CHUNKS=16, - LATM_MAX_ID=16 -}; - -typedef struct { - UINT m_frameLengthType; - UINT m_bufferFullness; - UINT m_streamID; - UINT m_frameLengthInBits; -} LATM_LAYER_INFO; - -typedef struct { - LATM_LAYER_INFO m_linfo[LATM_MAX_PROG][LATM_MAX_LAYER]; - UINT m_taraBufferFullness; - UINT m_otherDataLength; - UINT m_audioMuxLengthBytes; /* Length of LOAS payload */ - - UCHAR m_useSameStreamMux; - UCHAR m_AudioMuxVersion; - UCHAR m_AudioMuxVersionA; - UCHAR m_allStreamsSameTimeFraming; - UCHAR m_noSubFrames; - UCHAR m_numProgram; - UCHAR m_numLayer; - UCHAR m_useSameConfig; - - UCHAR m_otherDataPresent; - UCHAR m_crcCheckPresent; - UCHAR m_crcCheckSum; - - SCHAR BufferFullnessAchieved; -} CLatmDemux; - -int CLatmDemux_ReadAuChunkLengthInfo(HANDLE_FDK_BITSTREAM bs); - -TRANSPORTDEC_ERROR CLatmDemux_Read( - HANDLE_FDK_BITSTREAM bs, - CLatmDemux *pLatmDemux, - TRANSPORT_TYPE tt, - CSTpCallBacks *pTpDecCallbacks, - CSAudioSpecificConfig *pAsc, - int *pfConfigFound, - const INT ignoreBufferFullness - ); - -/** - * \brief Read StreamMuxConfig - * \param bs bit stream handle as data source - * \param pLatmDemux pointer to CLatmDemux struct of current LATM context - * \param pTpDecCallbacks Call back structure for configuration callbacks - * \param pAsc pointer to a ASC for configuration storage - * \param pfConfigFound pointer to a flag which is set to 1 if a configuration was found and processed successfully - * \return error code - */ -TRANSPORTDEC_ERROR CLatmDemux_ReadStreamMuxConfig( - HANDLE_FDK_BITSTREAM bs, - CLatmDemux *pLatmDemux, - CSTpCallBacks *pTpDecCallbacks, - CSAudioSpecificConfig *pAsc, - int * pfConfigFound - ); - -TRANSPORTDEC_ERROR CLatmDemux_ReadPayloadLengthInfo(HANDLE_FDK_BITSTREAM bs, CLatmDemux *pLatmDemux); - -int CLatmDemux_GetFrameLengthInBits(CLatmDemux *pLatmDemux); -int CLatmDemux_GetOtherDataPresentFlag(CLatmDemux *pLatmDemux); -int CLatmDemux_GetOtherDataLength(CLatmDemux *pLatmDemux); -UINT CLatmDemux_GetNrOfSubFrames(CLatmDemux *pLatmDemux); - - -#endif /* LATM_DEMUX_H */ diff --git a/libMpegTPDec/src/tpdec_lib.cpp b/libMpegTPDec/src/tpdec_lib.cpp deleted file mode 100644 index 1f9f29b..0000000 --- a/libMpegTPDec/src/tpdec_lib.cpp +++ /dev/null @@ -1,1323 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright 1995 - 2013 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 Transport Decoder ************************ - - Author(s): Manuel Jander - Description: MPEG Transport decoder - -******************************************************************************/ - -#include "tpdec_lib.h" - -/* library version */ -#include "version" - - -#include "tp_data.h" - -#include "tpdec_adts.h" - -#include "tpdec_adif.h" - -#include "tpdec_latm.h" - - - -#define MODULE_NAME "transportDec" - -typedef union { - STRUCT_ADTS adts; - - CAdifHeader adif; - - CLatmDemux latm; - - -} transportdec_parser_t; - -struct TRANSPORTDEC -{ - TRANSPORT_TYPE transportFmt; /*!< MPEG4 transportDec type. */ - - CSTpCallBacks callbacks; /*!< Struct holding callback and its data */ - - FDK_BITSTREAM bitStream[2]; /* Bitstream reader */ - UCHAR *bsBuffer; /* Internal bitstreamd data buffer (unallocated in case of TT_MP4_RAWPACKETS) */ - - transportdec_parser_t parser; /* Format specific parser structs. */ - - CSAudioSpecificConfig asc[(1*2)]; /* Audio specific config from the last config found. */ - UINT globalFramePos; /* Global transport frame reference bit position. */ - UINT accessUnitAnchor[2]; /* Current access unit start bit position. */ - INT auLength[2]; /* Length of current access unit. */ - INT numberOfRawDataBlocks; /* Current number of raw data blocks contained remaining from the current transport frame. */ - UINT avgBitRate; /* Average bit rate used for frame loss estimation. */ - UINT lastValidBufferFullness; /* Last valid buffer fullness value for frame loss estimation */ - INT remainder; /* Reminder in division during lost access unit estimation. */ - INT missingAccessUnits; /* Estimated missing access units. */ - UINT burstPeriod; /* Data burst period in mili seconds. */ - UINT holdOffFrames; /* Amount of frames that were already hold off due to buffer fullness condition not being met. */ - UINT flags; /* Flags. */ -}; - -/* Flag bitmasks for "flags" member of struct TRANSPORTDEC */ -#define TPDEC_SYNCOK 1 -#define TPDEC_MINIMIZE_DELAY 2 -#define TPDEC_IGNORE_BUFFERFULLNESS 4 -#define TPDEC_EARLY_CONFIG 8 -#define TPDEC_LOST_FRAMES_PENDING 16 -#define TPDEC_CONFIG_FOUND 32 - -C_ALLOC_MEM(Ram_TransportDecoder, TRANSPORTDEC, 1) -C_ALLOC_MEM(Ram_TransportDecoderBuffer, UCHAR, TRANSPORTDEC_INBUF_SIZE) - - - - -HANDLE_TRANSPORTDEC transportDec_Open( const TRANSPORT_TYPE transportFmt, const UINT flags) -{ - HANDLE_TRANSPORTDEC hInput; - - hInput = GetRam_TransportDecoder(0); - if ( hInput == NULL ) { - return NULL; - } - - /* Init transportDec struct. */ - hInput->transportFmt = transportFmt; - - switch (transportFmt) { - - case TT_MP4_ADIF: - break; - - case TT_MP4_ADTS: - if (flags & TP_FLAG_MPEG4) - hInput->parser.adts.decoderCanDoMpeg4 = 1; - else - hInput->parser.adts.decoderCanDoMpeg4 = 0; - adtsRead_CrcInit(&hInput->parser.adts); - hInput->parser.adts.BufferFullnesStartFlag = 1; - hInput->numberOfRawDataBlocks = 0; - break; - - - case TT_MP4_LATM_MCP0: - case TT_MP4_LATM_MCP1: - case TT_MP4_LOAS: - case TT_MP4_RAW: - break; - - default: - FreeRam_TransportDecoder(&hInput); - hInput = NULL; - break; - } - - if (hInput != NULL) { - /* Create bitstream */ - if ( TT_IS_PACKET(transportFmt) ) { - hInput->bsBuffer = NULL; - } else { - hInput->bsBuffer = GetRam_TransportDecoderBuffer(0); - if (hInput->bsBuffer == NULL) { - transportDec_Close( &hInput ); - return NULL; - } - FDKinitBitStream(&hInput->bitStream[0], hInput->bsBuffer, TRANSPORTDEC_INBUF_SIZE, 0, BS_READER); - } - - hInput->burstPeriod = 0; - } - - return hInput; -} - -TRANSPORTDEC_ERROR transportDec_OutOfBandConfig(HANDLE_TRANSPORTDEC hTp, UCHAR *conf, const UINT length, UINT layer ) -{ - TRANSPORTDEC_ERROR err = TRANSPORTDEC_OK; - - FDK_BITSTREAM bs; - HANDLE_FDK_BITSTREAM hBs = &bs; - - FDKinitBitStream(hBs, conf, 0x10000000, length<<3, BS_READER); - - int fConfigFound = 0; - - /* config transport decoder */ - switch (hTp->transportFmt) { - case TT_MP4_LATM_MCP0: - case TT_MP4_LATM_MCP1: - case TT_MP4_LOAS: - { - if (layer != 0) { - return TRANSPORTDEC_INVALID_PARAMETER; - } - CLatmDemux *pLatmDemux = &hTp->parser.latm; - err = CLatmDemux_ReadStreamMuxConfig(hBs, pLatmDemux, &hTp->callbacks, hTp->asc, &fConfigFound); - if (err != TRANSPORTDEC_OK) { - return err; - } - } - break; - default: - fConfigFound = 1; - err = AudioSpecificConfig_Parse(&hTp->asc[layer], hBs, 1, &hTp->callbacks); - if (err == TRANSPORTDEC_OK) { - int errC; - - errC = hTp->callbacks.cbUpdateConfig(hTp->callbacks.cbUpdateConfigData, &hTp->asc[layer]); - if (errC != 0) { - err = TRANSPORTDEC_PARSE_ERROR; - } - } - break; - } - - if (err == TRANSPORTDEC_OK && fConfigFound) { - hTp->flags |= TPDEC_CONFIG_FOUND; - } - - return err; -} - -int transportDec_RegisterAscCallback( HANDLE_TRANSPORTDEC hTpDec, const cbUpdateConfig_t cbUpdateConfig, void* user_data) -{ - if (hTpDec == NULL) { - return -1; - } - hTpDec->callbacks.cbUpdateConfig = cbUpdateConfig; - hTpDec->callbacks.cbUpdateConfigData = user_data; - return 0; -} - -int transportDec_RegisterSscCallback( HANDLE_TRANSPORTDEC hTpDec, const cbSsc_t cbSsc, void* user_data) -{ - if (hTpDec == NULL) { - return -1; - } - hTpDec->callbacks.cbSsc = cbSsc; - hTpDec->callbacks.cbSscData = user_data; - return 0; -} - -int transportDec_RegisterSbrCallback( HANDLE_TRANSPORTDEC hTpDec, const cbSbr_t cbSbr, void* user_data) -{ - if (hTpDec == NULL) { - return -1; - } - hTpDec->callbacks.cbSbr = cbSbr; - hTpDec->callbacks.cbSbrData = user_data; - return 0; -} - -TRANSPORTDEC_ERROR transportDec_FillData( - const HANDLE_TRANSPORTDEC hTp, - UCHAR *pBuffer, - const UINT bufferSize, - UINT *pBytesValid, - const INT layer ) -{ - HANDLE_FDK_BITSTREAM hBs; - - if ( (hTp == NULL) - || (layer >= 2) ) { - return TRANSPORTDEC_INVALID_PARAMETER; - } - - if (*pBytesValid == 0) { - /* nothing to do */ - return TRANSPORTDEC_OK; - } - - /* set bitbuffer shortcut */ - hBs = &hTp->bitStream[layer]; - - if ( TT_IS_PACKET(hTp->transportFmt) ) { - if (hTp->numberOfRawDataBlocks == 0) { - /* For packet based transport, pass input buffer to bitbuffer without copying the data. - Unfortunately we do not know the actual buffer size. And the FDK bit buffer implementation - needs a number 2^x. So we assume the maximum of 48 channels with 6144 bits per channel - and round it up to the next power of 2 => 65536 bytes */ - FDKinitBitStream(hBs, pBuffer, 0x10000, (*pBytesValid)<<3, BS_READER); - *pBytesValid = 0; - } - } else { - /* ... else feed bitbuffer with new stream data (append). */ - if (hTp->numberOfRawDataBlocks <= 0) { - FDKfeedBuffer (hBs, pBuffer, bufferSize, pBytesValid) ; - } - } - - return TRANSPORTDEC_OK; -} - -HANDLE_FDK_BITSTREAM transportDec_GetBitstream( const HANDLE_TRANSPORTDEC hTp, const UINT layer ) -{ - return &hTp->bitStream[layer]; -} - -TRANSPORT_TYPE transportDec_GetFormat( const HANDLE_TRANSPORTDEC hTp ) -{ - return hTp->transportFmt; -} - -INT transportDec_GetBufferFullness( const HANDLE_TRANSPORTDEC hTp ) -{ - INT bufferFullness = -1; - - switch (hTp->transportFmt) { - case TT_MP4_ADTS: - if (hTp->parser.adts.bs.adts_fullness != 0x7ff) { - bufferFullness = hTp->parser.adts.bs.frame_length*8 + hTp->parser.adts.bs.adts_fullness * 32 * getNumberOfEffectiveChannels(hTp->parser.adts.bs.channel_config); - } - break; - case TT_MP4_LOAS: - case TT_MP4_LATM_MCP0: - case TT_MP4_LATM_MCP1: - if (hTp->parser.latm.m_linfo[0][0].m_bufferFullness != 0xff) { - bufferFullness = hTp->parser.latm.m_linfo[0][0].m_bufferFullness; - } - break; - default: - break; - } - - return bufferFullness; -} - -/** - * \brief adjust bit stream position and the end of an access unit. - * \param hTp transport decoder handle. - * \return error code. - */ -static -TRANSPORTDEC_ERROR transportDec_AdjustEndOfAccessUnit(HANDLE_TRANSPORTDEC hTp) -{ - HANDLE_FDK_BITSTREAM hBs = &hTp->bitStream[0]; - TRANSPORTDEC_ERROR err = TRANSPORTDEC_OK; - - switch (hTp->transportFmt) { - case TT_MP4_LOAS: - case TT_MP4_LATM_MCP0: - case TT_MP4_LATM_MCP1: - if ( hTp->numberOfRawDataBlocks == 0 ) - { - /* Do byte align at the end of AudioMuxElement. */ - FDKbyteAlign(hBs, hTp->globalFramePos); - - /* Check global frame length */ - if (hTp->transportFmt == TT_MP4_LOAS && hTp->parser.latm.m_audioMuxLengthBytes > 0) - { - int loasOffset; - - loasOffset = (hTp->parser.latm.m_audioMuxLengthBytes*8 + FDKgetValidBits(hBs)) - hTp->globalFramePos; - if (loasOffset != 0) { - FDKpushBiDirectional(hBs, loasOffset); - /* For ELD and other payloads there is an unknown amount of padding, so ignore unread bits, but - throw an error only if too many bits where read. */ - if (loasOffset < 0) { - err = TRANSPORTDEC_PARSE_ERROR; - } - } - } - } - break; - - case TT_MP4_ADTS: - if (hTp->parser.adts.bs.protection_absent == 0) - { - int offset; - - /* Calculate offset to end of AU */ - offset = hTp->parser.adts.rawDataBlockDist[hTp->parser.adts.bs.num_raw_blocks-hTp->numberOfRawDataBlocks]<<3; - /* CAUTION: The PCE (if available) is declared to be a part of the header! */ - offset -= hTp->accessUnitAnchor[0] - FDKgetValidBits(hBs) + 16 + hTp->parser.adts.bs.num_pce_bits; - FDKpushBiDirectional(hBs, offset); - } - if (hTp->parser.adts.bs.num_raw_blocks > 0 && hTp->parser.adts.bs.protection_absent == 0) { - /* Note this CRC read currently happens twice because of transportDec_CrcCheck() */ - hTp->parser.adts.crcReadValue = FDKreadBits(hBs, 16); - } - if ( hTp->numberOfRawDataBlocks == 0 ) - { - /* Check global frame length */ - if (hTp->parser.adts.bs.protection_absent == 0) - { - int offset; - - offset = (hTp->parser.adts.bs.frame_length*8 - ADTS_SYNCLENGTH + FDKgetValidBits(hBs)) - hTp->globalFramePos; - if (offset != 0) { - FDKpushBiDirectional(hBs, offset); - } - } - } - break; - - default: - break; - } - - return err; -} - - -/** - * \brief Determine additional buffer fullness contraint due to burst data reception. - * The parameter TPDEC_PARAM_BURSTPERIOD must have been set as a precondition. - * \param hTp transport decoder handle. - * \param bufferFullness the buffer fullness value of the first frame to be decoded. - * \param bitsAvail the amount of available bits at the end of the first frame to be decoded. - * \return error code - */ -static -TRANSPORTDEC_ERROR additionalHoldOffNeeded( - HANDLE_TRANSPORTDEC hTp, - INT bufferFullness, - INT bitsAvail - ) -{ - INT checkLengthBits, avgBitsPerFrame; - INT maxAU; /* maximum number of frames per Master Frame */ - INT samplesPerFrame = hTp->asc->m_samplesPerFrame; - INT samplingFrequency = (INT)hTp->asc->m_samplingFrequency; - - if ( (hTp->avgBitRate == 0) || (hTp->burstPeriod == 0) ) { - return TRANSPORTDEC_OK; - } - if ( (samplesPerFrame == 0 ) || (samplingFrequency == 0) ) { - return TRANSPORTDEC_NOT_ENOUGH_BITS; - } - - /* One Master Frame is sent every hTp->burstPeriod ms */ - maxAU = hTp->burstPeriod * samplingFrequency + (samplesPerFrame*1000 - 1); - maxAU = maxAU / (samplesPerFrame*1000); - /* Subtract number of frames which were already held off. */ - maxAU -= hTp->holdOffFrames; - - avgBitsPerFrame = hTp->avgBitRate * samplesPerFrame + (samplingFrequency-1); - avgBitsPerFrame = avgBitsPerFrame / samplingFrequency; - - /* Consider worst case of bufferFullness quantization. */ - switch (hTp->transportFmt) { - case TT_MP4_ADIF: - case TT_MP4_ADTS: - case TT_MP4_LOAS: - case TT_MP4_LATM_MCP0: - case TT_MP4_LATM_MCP1: - bufferFullness += 31; - break; - default: - break; - } - - checkLengthBits = bufferFullness + (maxAU-1)*avgBitsPerFrame; - - /* Check if buffer is big enough to fullfill buffer fullness condition */ - if ( (checkLengthBits /*+headerBits*/) > ((TRANSPORTDEC_INBUF_SIZE<<3)-7) ) { - return TRANSPORTDEC_SYNC_ERROR; - } - - if ( bitsAvail < checkLengthBits ) { - return TRANSPORTDEC_NOT_ENOUGH_BITS; - } - else { - return TRANSPORTDEC_OK; - } -} - -static TRANSPORTDEC_ERROR transportDec_readHeader( - HANDLE_TRANSPORTDEC hTp, - HANDLE_FDK_BITSTREAM hBs, - int syncLength, - int ignoreBufferFullness, - int *pRawDataBlockLength, - int *pfTraverseMoreFrames, - int *pSyncLayerFrameBits, - int *pfConfigFound, - int *pHeaderBits - ) -{ - TRANSPORTDEC_ERROR err = TRANSPORTDEC_OK; - int rawDataBlockLength = *pRawDataBlockLength; - int fTraverseMoreFrames = (pfTraverseMoreFrames != NULL) ? *pfTraverseMoreFrames : 0; - int syncLayerFrameBits = (pSyncLayerFrameBits != NULL) ? *pSyncLayerFrameBits : 0; - int fConfigFound = (pfConfigFound != NULL) ? *pfConfigFound : 0; - int startPos; - - startPos = FDKgetValidBits(hBs); - - switch (hTp->transportFmt) { - case TT_MP4_ADTS: - if (hTp->numberOfRawDataBlocks <= 0) - { - int errC; - - hTp->globalFramePos = FDKgetValidBits(hBs); - - /* Parse ADTS header */ - err = adtsRead_DecodeHeader( &hTp->parser.adts, &hTp->asc[0], hBs, ignoreBufferFullness ); - if (err != TRANSPORTDEC_OK) { - if (err != TRANSPORTDEC_NOT_ENOUGH_BITS) { - err = TRANSPORTDEC_SYNC_ERROR; - } - } else { - errC = hTp->callbacks.cbUpdateConfig(hTp->callbacks.cbUpdateConfigData, &hTp->asc[0]); - if (errC != 0) { - if (errC == TRANSPORTDEC_NEED_TO_RESTART) { - err = TRANSPORTDEC_NEED_TO_RESTART; - goto bail; - } else { - err = TRANSPORTDEC_SYNC_ERROR; - } - } else { - fConfigFound = 1; - hTp->numberOfRawDataBlocks = hTp->parser.adts.bs.num_raw_blocks+1; - } - } - } - else { - /* Reset CRC because the next bits are the beginning of a raw_data_block() */ - FDKcrcReset(&hTp->parser.adts.crcInfo); - hTp->parser.adts.bs.num_pce_bits = 0; - } - if (err == TRANSPORTDEC_OK) { - hTp->numberOfRawDataBlocks--; - rawDataBlockLength = adtsRead_GetRawDataBlockLength(&hTp->parser.adts, (hTp->parser.adts.bs.num_raw_blocks-hTp->numberOfRawDataBlocks)); - if (rawDataBlockLength <= 0) { - /* No further frame traversal possible. */ - fTraverseMoreFrames = 0; - } - syncLayerFrameBits = (hTp->parser.adts.bs.frame_length<<3) - (startPos - FDKgetValidBits(hBs)) - syncLength; - if (syncLayerFrameBits <= 0) { - err = TRANSPORTDEC_SYNC_ERROR; - } - } else { - hTp->numberOfRawDataBlocks = 0; - } - break; - case TT_MP4_LOAS: - if (hTp->numberOfRawDataBlocks <= 0) - { - syncLayerFrameBits = FDKreadBits(hBs, 13); - hTp->parser.latm.m_audioMuxLengthBytes = syncLayerFrameBits; - syncLayerFrameBits <<= 3; - } - case TT_MP4_LATM_MCP1: - case TT_MP4_LATM_MCP0: - if (hTp->numberOfRawDataBlocks <= 0) - { - hTp->globalFramePos = FDKgetValidBits(hBs); - - err = CLatmDemux_Read( - hBs, - &hTp->parser.latm, - hTp->transportFmt, - &hTp->callbacks, - hTp->asc, - &fConfigFound, - ignoreBufferFullness); - - if (err != TRANSPORTDEC_OK) { - if (err != TRANSPORTDEC_NOT_ENOUGH_BITS) { - err = TRANSPORTDEC_SYNC_ERROR; - } - } else { - hTp->numberOfRawDataBlocks = CLatmDemux_GetNrOfSubFrames(&hTp->parser.latm); - if (hTp->transportFmt == TT_MP4_LOAS) { - syncLayerFrameBits -= startPos - FDKgetValidBits(hBs) - (13); - } - } - } else { - err = CLatmDemux_ReadPayloadLengthInfo(hBs, &hTp->parser.latm); - if (err != TRANSPORTDEC_OK) { - err = TRANSPORTDEC_SYNC_ERROR; - } - } - if (err == TRANSPORTDEC_OK) { - rawDataBlockLength = CLatmDemux_GetFrameLengthInBits(&hTp->parser.latm); - hTp->numberOfRawDataBlocks--; - } else { - hTp->numberOfRawDataBlocks = 0; - } - break; - default: - { - syncLayerFrameBits = 0; - } - break; - } - -bail: - - *pRawDataBlockLength = rawDataBlockLength; - - if (pHeaderBits != NULL) { - *pHeaderBits += startPos - (INT)FDKgetValidBits(hBs); - } - if (pfConfigFound != NULL) { - *pfConfigFound = fConfigFound; - } - - if (pfTraverseMoreFrames != NULL) { - *pfTraverseMoreFrames = fTraverseMoreFrames; - } - if (pSyncLayerFrameBits != NULL) { - *pSyncLayerFrameBits = syncLayerFrameBits; - } - if (pfConfigFound != NULL) { - *pfConfigFound = fConfigFound; - } - - return err; -} - -/* How many bits to advance for synchronization search. */ -#define TPDEC_SYNCSKIP 8 - -static -TRANSPORTDEC_ERROR synchronization( - HANDLE_TRANSPORTDEC hTp, - INT *pHeaderBits - ) -{ - TRANSPORTDEC_ERROR err = TRANSPORTDEC_OK, errFirstFrame = TRANSPORTDEC_OK; - HANDLE_FDK_BITSTREAM hBs = &hTp->bitStream[0]; - - INT syncLayerFrameBits = 0; /* Length of sync layer frame (i.e. LOAS) */ - INT rawDataBlockLength = 0, rawDataBlockLengthPrevious; - INT totalBits; - INT headerBits = 0, headerBitsFirstFrame = 0, headerBitsPrevious; - INT numFramesTraversed = 0, fTraverseMoreFrames, fConfigFound = (hTp->flags & TPDEC_CONFIG_FOUND), startPosFirstFrame = -1; - INT numRawDataBlocksFirstFrame = 0, numRawDataBlocksPrevious, globalFramePosFirstFrame = 0, rawDataBlockLengthFirstFrame = 0; - INT ignoreBufferFullness = hTp->flags & (TPDEC_LOST_FRAMES_PENDING|TPDEC_IGNORE_BUFFERFULLNESS|TPDEC_SYNCOK); - - /* Synch parameters */ - INT syncLength; /* Length of sync word in bits */ - UINT syncWord; /* Sync word to be found */ - UINT syncMask; /* Mask for sync word (for adding one bit, so comprising one bit less) */ - C_ALLOC_SCRATCH_START(contextFirstFrame, transportdec_parser_t, 1); - - totalBits = (INT)FDKgetValidBits(hBs); - - if (totalBits <= 0) { - err = TRANSPORTDEC_NOT_ENOUGH_BITS; - goto bail; - } - - fTraverseMoreFrames = (hTp->flags & (TPDEC_MINIMIZE_DELAY|TPDEC_EARLY_CONFIG)) && ! (hTp->flags & TPDEC_SYNCOK); - - /* Set transport specific sync parameters */ - switch (hTp->transportFmt) { - case TT_MP4_ADTS: - syncWord = ADTS_SYNCWORD; - syncLength = ADTS_SYNCLENGTH; - break; - case TT_MP4_LOAS: - syncWord = 0x2B7; - syncLength = 11; - break; - default: - syncWord = 0; - syncLength = 0; - break; - } - - syncMask = (1<<syncLength)-1; - - do { - INT bitsAvail = 0; /* Bits available in bitstream buffer */ - INT checkLengthBits; /* Helper to check remaining bits and buffer boundaries */ - UINT synch; /* Current sync word read from bitstream */ - - headerBitsPrevious = headerBits; - - bitsAvail = (INT)FDKgetValidBits(hBs); - - if (hTp->numberOfRawDataBlocks == 0) { - /* search synchword */ - - FDK_ASSERT( (bitsAvail % TPDEC_SYNCSKIP) == 0); - - if ((bitsAvail-syncLength) < TPDEC_SYNCSKIP) { - err = TRANSPORTDEC_NOT_ENOUGH_BITS; - headerBits = 0; - } else { - - synch = FDKreadBits(hBs, syncLength); - - if ( !(hTp->flags & TPDEC_SYNCOK) ) { - for (; (bitsAvail-syncLength) >= TPDEC_SYNCSKIP; bitsAvail-=TPDEC_SYNCSKIP) { - if (synch == syncWord) { - break; - } - synch = ((synch << TPDEC_SYNCSKIP) & syncMask) | FDKreadBits(hBs, TPDEC_SYNCSKIP); - } - } - if (synch != syncWord) { - /* No correct syncword found. */ - err = TRANSPORTDEC_SYNC_ERROR; - } else { - err = TRANSPORTDEC_OK; - } - headerBits = syncLength; - } - } else { - headerBits = 0; - } - - /* Save previous raw data block data */ - rawDataBlockLengthPrevious = rawDataBlockLength; - numRawDataBlocksPrevious = hTp->numberOfRawDataBlocks; - - /* Parse transport header (raw data block granularity) */ - - if (err == TRANSPORTDEC_OK ) - { - err = transportDec_readHeader( - hTp, - hBs, - syncLength, - ignoreBufferFullness, - &rawDataBlockLength, - &fTraverseMoreFrames, - &syncLayerFrameBits, - &fConfigFound, - &headerBits - ); - } - - bitsAvail -= headerBits; - - checkLengthBits = syncLayerFrameBits; - - /* Check if the whole frame would fit the bitstream buffer */ - if (err == TRANSPORTDEC_OK) { - if ( (checkLengthBits+headerBits) > ((TRANSPORTDEC_INBUF_SIZE<<3)-7) ) { - /* We assume that the size of the transport bit buffer has been - chosen to meet all system requirements, thus this condition - is considered a synchronisation error. */ - err = TRANSPORTDEC_SYNC_ERROR; - } else { - if ( bitsAvail < checkLengthBits ) { - err = TRANSPORTDEC_NOT_ENOUGH_BITS; - } - } - } - - if (err == TRANSPORTDEC_NOT_ENOUGH_BITS) { - break; - } - - - if (err == TRANSPORTDEC_SYNC_ERROR) { - int bits; - - /* Enforce re-sync of transport headers. */ - hTp->numberOfRawDataBlocks = 0; - - /* Ensure that the bit amount lands at a multiple of TPDEC_SYNCSKIP */ - bits = (bitsAvail + headerBits) % TPDEC_SYNCSKIP; - /* Rewind - TPDEC_SYNCSKIP, in order to look for a synch one bit ahead next time. */ - FDKpushBiDirectional(hBs, -(headerBits - TPDEC_SYNCSKIP) + bits); - bitsAvail += headerBits - TPDEC_SYNCSKIP - bits; - headerBits = 0; - } - - /* Frame traversal */ - if ( fTraverseMoreFrames ) - { - /* Save parser context for early config discovery "rewind all frames" */ - if ( (hTp->flags & TPDEC_EARLY_CONFIG) && !(hTp->flags & TPDEC_MINIMIZE_DELAY)) - { - /* ignore buffer fullness if just traversing additional frames for ECD */ - ignoreBufferFullness = 1; - - /* Save context in order to return later */ - if ( err == TRANSPORTDEC_OK && startPosFirstFrame == -1 ) { - startPosFirstFrame = FDKgetValidBits(hBs); - numRawDataBlocksFirstFrame = hTp->numberOfRawDataBlocks; - globalFramePosFirstFrame = hTp->globalFramePos; - rawDataBlockLengthFirstFrame = rawDataBlockLength; - headerBitsFirstFrame = headerBits; - errFirstFrame = err; - FDKmemcpy(contextFirstFrame, &hTp->parser, sizeof(transportdec_parser_t)); - } - - /* Break when config was found or it is not possible anymore to find a config */ - if (startPosFirstFrame != -1 && (fConfigFound || err != TRANSPORTDEC_OK)) - { - /* In case of ECD and sync error, do not rewind anywhere. */ - if (err == TRANSPORTDEC_SYNC_ERROR) - { - startPosFirstFrame = -1; - fConfigFound = 0; - numFramesTraversed = 0; - } - break; - } - } - - if (err == TRANSPORTDEC_OK) { - FDKpushFor(hBs, rawDataBlockLength); - bitsAvail -= rawDataBlockLength; - numFramesTraversed++; - /* Ignore error here itentionally. */ - transportDec_AdjustEndOfAccessUnit(hTp); - } - } - } while ( fTraverseMoreFrames || (err == TRANSPORTDEC_SYNC_ERROR && !(hTp->flags & TPDEC_SYNCOK))); - - /* Restore context in case of ECD frame traversal */ - if ( startPosFirstFrame != -1 && (fConfigFound || err != TRANSPORTDEC_OK) ) { - FDKpushBiDirectional(hBs, FDKgetValidBits(hBs) - startPosFirstFrame); - FDKmemcpy(&hTp->parser, contextFirstFrame, sizeof(transportdec_parser_t)); - hTp->numberOfRawDataBlocks = numRawDataBlocksFirstFrame; - hTp->globalFramePos = globalFramePosFirstFrame; - rawDataBlockLength = rawDataBlockLengthFirstFrame; - headerBits = headerBitsFirstFrame; - err = errFirstFrame; - numFramesTraversed = 0; - } - - /* Additional burst data mode buffer fullness check. */ - if ( !(hTp->flags & (TPDEC_LOST_FRAMES_PENDING|TPDEC_IGNORE_BUFFERFULLNESS|TPDEC_SYNCOK)) && err == TRANSPORTDEC_OK) { - err = additionalHoldOffNeeded(hTp, transportDec_GetBufferFullness(hTp), FDKgetValidBits(hBs) - syncLayerFrameBits); - if (err == TRANSPORTDEC_NOT_ENOUGH_BITS) { - hTp->holdOffFrames++; - } - } - - /* Rewind for retry because of not enough bits */ - if (err == TRANSPORTDEC_NOT_ENOUGH_BITS) { - FDKpushBack(hBs, headerBits); - headerBits = 0; - } - else { - /* reset hold off frame counter */ - hTp->holdOffFrames = 0; - } - - /* Return to last good frame in case of frame traversal but not ECD. */ - if (numFramesTraversed > 0) { - FDKpushBack(hBs, rawDataBlockLengthPrevious); - if (err != TRANSPORTDEC_OK) { - hTp->numberOfRawDataBlocks = numRawDataBlocksPrevious; - headerBits = headerBitsPrevious; - } - err = TRANSPORTDEC_OK; - } - -bail: - hTp->auLength[0] = rawDataBlockLength; - - /* Detect pointless TRANSPORTDEC_NOT_ENOUGH_BITS error case, were the bit buffer is already full, - or no new burst packet fits. Recover by advancing the bit buffer. */ - if ( (TRANSPORTDEC_NOT_ENOUGH_BITS == err) && (FDKgetValidBits(hBs) >= ((TRANSPORTDEC_INBUF_SIZE*8 - ((hTp->avgBitRate*hTp->burstPeriod)/1000)) - 7)) ) - { - FDKpushFor(hBs, TPDEC_SYNCSKIP); - err = TRANSPORTDEC_SYNC_ERROR; - } - - if (err == TRANSPORTDEC_OK) { - hTp->flags |= TPDEC_SYNCOK; - } - - if (fConfigFound) { - hTp->flags |= TPDEC_CONFIG_FOUND; - } - - if (pHeaderBits != NULL) { - *pHeaderBits = headerBits; - } - - if (err == TRANSPORTDEC_SYNC_ERROR) { - hTp->flags &= ~TPDEC_SYNCOK; - } - - C_ALLOC_SCRATCH_END(contextFirstFrame, transportdec_parser_t, 1); - - return err; -} - -/** - * \brief Synchronize to stream and estimate the amount of missing access units due - * to a current synchronization error in case of constant average bit rate. - */ -static -TRANSPORTDEC_ERROR transportDec_readStream ( HANDLE_TRANSPORTDEC hTp, const UINT layer ) -{ - - TRANSPORTDEC_ERROR error = TRANSPORTDEC_OK; - HANDLE_FDK_BITSTREAM hBs = &hTp->bitStream[layer]; - INT nAU = -1; - INT headerBits; - INT bitDistance, bfDelta; - - /* Obtain distance to next synch word */ - bitDistance = FDKgetValidBits(hBs); - error = synchronization(hTp, &headerBits); - bitDistance -= FDKgetValidBits(hBs); - - - FDK_ASSERT(bitDistance >= 0); - - if (error == TRANSPORTDEC_SYNC_ERROR || (hTp->flags & TPDEC_LOST_FRAMES_PENDING)) - { - /* Check if estimating lost access units is feasible. */ - if (hTp->avgBitRate > 0 && hTp->asc[0].m_samplesPerFrame > 0 && hTp->asc[0].m_samplingFrequency > 0) - { - if (error == TRANSPORTDEC_OK) - { - int aj; - - aj = transportDec_GetBufferFullness(hTp); - if (aj > 0) { - bfDelta = aj; - } else { - bfDelta = 0; - } - /* sync was ok: last of a series of bad access units. */ - hTp->flags &= ~TPDEC_LOST_FRAMES_PENDING; - /* Add up bitDistance until end of the current frame. Later we substract - this frame from the grand total, since this current successfully synchronized - frame should not be skipped of course; but it must be accounted into the - bufferfulness math. */ - bitDistance += hTp->auLength[0]; - } else { - if ( !(hTp->flags & TPDEC_LOST_FRAMES_PENDING) ) { - /* sync not ok: one of many bad access units. */ - hTp->flags |= TPDEC_LOST_FRAMES_PENDING; - bfDelta = - (INT)hTp->lastValidBufferFullness; - } else { - bfDelta = 0; - } - } - - { - int num, denom; - - /* Obtain estimate of number of lost frames */ - num = hTp->asc[0].m_samplingFrequency * (bfDelta + bitDistance) + hTp->remainder; - denom = hTp->avgBitRate * hTp->asc[0].m_samplesPerFrame; - if (num > 0) { - nAU = num / denom; - hTp->remainder = num % denom; - } else { - hTp->remainder = num; - } - - if (error == TRANSPORTDEC_OK) - { - /* Final adjustment of remainder, taken -1 into account because current - frame should not be skipped, thus substract -1 or do nothing instead - of +1-1 accordingly. */ - if ( (denom - hTp->remainder) >= hTp->remainder ) { - nAU--; - } - - if (nAU < 0) { - /* There was one frame too much concealed, so unfortunately we will have to skip one good frame. */ - transportDec_EndAccessUnit(hTp); - error = synchronization(hTp, &headerBits); - nAU = -1; -#ifdef DEBUG - FDKprintf("ERROR: Bufferfullness accounting failed. remainder=%d, nAU=%d\n", hTp->remainder, nAU); -#endif - } - hTp->remainder = 0; - /* Enforce last missed frames to be concealed. */ - if (nAU > 0) { - FDKpushBack(hBs, headerBits); - } - } - } - } - } - - /* Be sure that lost frames are handled correctly. This is necessary due to some - sync error sequences where later it turns out that there is not enough data, but - the bits upto the sync word are discarded, thus causing a value of nAU > 0 */ - if (nAU > 0) { - error = TRANSPORTDEC_SYNC_ERROR; - } - - hTp->missingAccessUnits = nAU; - - return error; -} - -/* returns error code */ -TRANSPORTDEC_ERROR transportDec_ReadAccessUnit( const HANDLE_TRANSPORTDEC hTp, const UINT layer ) -{ - TRANSPORTDEC_ERROR err = TRANSPORTDEC_OK; - HANDLE_FDK_BITSTREAM hBs; - - if (!hTp) { - return TRANSPORTDEC_INVALID_PARAMETER; - } - - hBs = &hTp->bitStream[layer]; - - if ((INT)FDKgetValidBits(hBs) <= 0) { - err = TRANSPORTDEC_NOT_ENOUGH_BITS; - } - - switch (hTp->transportFmt) { - - case TT_MP4_ADIF: - /* Read header if not already done */ - if (!(hTp->flags & TPDEC_CONFIG_FOUND)) - { - CProgramConfig *pce; - - AudioSpecificConfig_Init(&hTp->asc[0]); - pce = &hTp->asc[0].m_progrConfigElement; - err = adifRead_DecodeHeader(&hTp->parser.adif, pce, hBs); - if (err) - goto bail; - - /* Map adif header to ASC */ - hTp->asc[0].m_aot = (AUDIO_OBJECT_TYPE)(pce->Profile + 1); - hTp->asc[0].m_samplingFrequencyIndex = pce->SamplingFrequencyIndex; - hTp->asc[0].m_samplingFrequency = SamplingRateTable[pce->SamplingFrequencyIndex]; - hTp->asc[0].m_channelConfiguration = 0; - hTp->asc[0].m_samplesPerFrame = 1024; - hTp->avgBitRate = hTp->parser.adif.BitRate; - - /* Call callback to decoder. */ - { - int errC; - - errC = hTp->callbacks.cbUpdateConfig(hTp->callbacks.cbUpdateConfigData, &hTp->asc[0]); - if (errC == 0) { - hTp->flags |= TPDEC_CONFIG_FOUND; - } else { - err = TRANSPORTDEC_PARSE_ERROR; - goto bail; - } - } - } - hTp->auLength[layer] = -1; /* Access Unit data length is unknown. */ - break; - - case TT_MP4_RAW: - /* One Access Unit was filled into buffer. - So get the length out of the buffer. */ - hTp->auLength[layer] = FDKgetValidBits(hBs); - hTp->flags |= TPDEC_SYNCOK; - break; - - case TT_MP4_LATM_MCP0: - case TT_MP4_LATM_MCP1: - { - int fConfigFound = hTp->flags & TPDEC_CONFIG_FOUND; - err = transportDec_readHeader(hTp, hBs, 0, 1, &hTp->auLength[layer], NULL, NULL, &fConfigFound, NULL); - if (fConfigFound) { - hTp->flags |= TPDEC_CONFIG_FOUND; - } - } - break; - - case TT_RSVD50: - case TT_MP4_ADTS: - case TT_MP4_LOAS: - err = transportDec_readStream(hTp, layer); - break; - - default: - err = TRANSPORTDEC_UNSUPPORTED_FORMAT; - break; - } - - if (err == TRANSPORTDEC_OK) { - hTp->accessUnitAnchor[layer] = FDKgetValidBits(hBs); - } else { - hTp->accessUnitAnchor[layer] = 0; - } - -bail: - return err; -} - -INT transportDec_GetAuBitsRemaining( const HANDLE_TRANSPORTDEC hTp, const UINT layer ) -{ - INT bits; - - if (hTp->accessUnitAnchor[layer] > 0 && hTp->auLength[layer] > 0) { - bits = hTp->auLength[layer] - (hTp->accessUnitAnchor[layer] - FDKgetValidBits(&hTp->bitStream[layer])); - } else { - bits = FDKgetValidBits(&hTp->bitStream[layer]); - } - - return bits; -} - -INT transportDec_GetAuBitsTotal( const HANDLE_TRANSPORTDEC hTp, const UINT layer ) -{ - return hTp->auLength[layer]; -} - -TRANSPORTDEC_ERROR transportDec_GetMissingAccessUnitCount ( INT *pNAccessUnits, HANDLE_TRANSPORTDEC hTp ) -{ - *pNAccessUnits = hTp->missingAccessUnits; - - return TRANSPORTDEC_OK; -} - -/* Inform the transportDec layer that reading of access unit has finished. */ -TRANSPORTDEC_ERROR transportDec_EndAccessUnit(HANDLE_TRANSPORTDEC hTp) -{ - TRANSPORTDEC_ERROR err = TRANSPORTDEC_OK; - - - err = transportDec_AdjustEndOfAccessUnit(hTp); - - switch (hTp->transportFmt) { - default: - break; - } - - return err; -} - -TRANSPORTDEC_ERROR transportDec_SetParam ( const HANDLE_TRANSPORTDEC hTp, - const TPDEC_PARAM param, - const INT value) -{ - TRANSPORTDEC_ERROR error = TRANSPORTDEC_OK; - - switch (param) { - case TPDEC_PARAM_MINIMIZE_DELAY: - if (value) { - hTp->flags |= TPDEC_MINIMIZE_DELAY; - } else { - hTp->flags &= ~TPDEC_MINIMIZE_DELAY; - } - break; - case TPDEC_PARAM_EARLY_CONFIG: - if (value) { - hTp->flags |= TPDEC_EARLY_CONFIG; - } else { - hTp->flags &= ~TPDEC_EARLY_CONFIG; - } - break; - case TPDEC_PARAM_IGNORE_BUFFERFULLNESS: - if (value) { - hTp->flags |= TPDEC_IGNORE_BUFFERFULLNESS; - } else { - hTp->flags &= ~TPDEC_IGNORE_BUFFERFULLNESS; - } - break; - case TPDEC_PARAM_SET_BITRATE: - hTp->avgBitRate = value; - break; - case TPDEC_PARAM_BURST_PERIOD: - hTp->burstPeriod = value; - break; - case TPDEC_PARAM_RESET: - { - int i; - - for (i=0; i<(1*2); i++) { - FDKresetBitbuffer(&hTp->bitStream[i]); - hTp->auLength[i] = 0; - hTp->accessUnitAnchor[i] = 0; - } - hTp->flags &= ~(TPDEC_SYNCOK|TPDEC_LOST_FRAMES_PENDING); - if (hTp->transportFmt != TT_MP4_ADIF) { - hTp->flags &= ~TPDEC_CONFIG_FOUND; - } - hTp->remainder = 0; - hTp->avgBitRate = 0; - hTp->missingAccessUnits = 0; - hTp->numberOfRawDataBlocks = 0; - hTp->globalFramePos = 0; - hTp->holdOffFrames = 0; - } - break; - } - - return error; -} - -UINT transportDec_GetNrOfSubFrames(HANDLE_TRANSPORTDEC hTp) -{ - UINT nSubFrames = 0; - - if (hTp == NULL) - return 0; - - if (hTp->transportFmt==TT_MP4_LATM_MCP1 || hTp->transportFmt==TT_MP4_LATM_MCP0 || hTp->transportFmt==TT_MP4_LOAS) - nSubFrames = CLatmDemux_GetNrOfSubFrames(&hTp->parser.latm); - else if (hTp->transportFmt==TT_MP4_ADTS) - nSubFrames = hTp->parser.adts.bs.num_raw_blocks; - - return nSubFrames; -} - -void transportDec_Close(HANDLE_TRANSPORTDEC *phTp) -{ - if (phTp != NULL) - { - if (*phTp != NULL) { - if ( ! TT_IS_PACKET((*phTp)->transportFmt) ) { - FreeRam_TransportDecoderBuffer(&(*phTp)->bsBuffer); - } - if (*phTp != NULL) { - FreeRam_TransportDecoder(phTp); - } - } - } -} - -TRANSPORTDEC_ERROR transportDec_GetLibInfo( LIB_INFO *info ) -{ - int i; - - if (info == NULL) { - return TRANSPORTDEC_UNKOWN_ERROR; - } - - /* search for next free tab */ - for (i = 0; i < FDK_MODULE_LAST; i++) { - if (info[i].module_id == FDK_NONE) break; - } - if (i == FDK_MODULE_LAST) return TRANSPORTDEC_UNKOWN_ERROR; - info += i; - - info->module_id = FDK_TPDEC; - info->build_date = __DATE__; - info->build_time = __TIME__; - info->title = TP_LIB_TITLE; - info->version = LIB_VERSION(TP_LIB_VL0, TP_LIB_VL1, TP_LIB_VL2); - LIB_VERSION_STRING(info); - info->flags = 0 - | CAPF_ADIF - | CAPF_ADTS - | CAPF_LATM - | CAPF_LOAS - | CAPF_RAWPACKETS - ; - - return TRANSPORTDEC_OK; /* FDKERR_NOERROR; */ -} - - -int transportDec_CrcStartReg(HANDLE_TRANSPORTDEC pTp, INT mBits) -{ - switch (pTp->transportFmt) { - case TT_MP4_ADTS: - return adtsRead_CrcStartReg(&pTp->parser.adts, &pTp->bitStream[0], mBits); - default: - return 0; - } -} - -void transportDec_CrcEndReg(HANDLE_TRANSPORTDEC pTp, INT reg) -{ - switch (pTp->transportFmt) { - case TT_MP4_ADTS: - adtsRead_CrcEndReg(&pTp->parser.adts, &pTp->bitStream[0], reg); - break; - default: - break; - } -} - -TRANSPORTDEC_ERROR transportDec_CrcCheck(HANDLE_TRANSPORTDEC pTp) -{ - switch (pTp->transportFmt) { - case TT_MP4_ADTS: - if ( (pTp->parser.adts.bs.num_raw_blocks > 0) && (pTp->parser.adts.bs.protection_absent == 0) ) - { - HANDLE_FDK_BITSTREAM hBs = &pTp->bitStream[0]; - - transportDec_AdjustEndOfAccessUnit(pTp); - } - return adtsRead_CrcCheck(&pTp->parser.adts); - default: - return TRANSPORTDEC_OK; - } -} diff --git a/libMpegTPDec/src/version b/libMpegTPDec/src/version deleted file mode 100644 index 2803347..0000000 --- a/libMpegTPDec/src/version +++ /dev/null @@ -1,8 +0,0 @@ - -/* library info */ -#define TP_LIB_VL0 2 -#define TP_LIB_VL1 3 -#define TP_LIB_VL2 3 -#define TP_LIB_TITLE "MPEG Transport" -#define TP_LIB_BUILD_DATE __DATE__ -#define TP_LIB_BUILD_TIME __TIME__ |