diff options
Diffstat (limited to 'libMpegTPEnc/src/tpenc_dab.cpp')
-rw-r--r-- | libMpegTPEnc/src/tpenc_dab.cpp | 467 |
1 files changed, 0 insertions, 467 deletions
diff --git a/libMpegTPEnc/src/tpenc_dab.cpp b/libMpegTPEnc/src/tpenc_dab.cpp deleted file mode 100644 index 202fecf..0000000 --- a/libMpegTPEnc/src/tpenc_dab.cpp +++ /dev/null @@ -1,467 +0,0 @@ - -/* ----------------------------------------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -� Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur F�rderung der angewandten Forschung e.V. - All rights reserved. - - 1. INTRODUCTION -The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements -the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. -This FDK AAC Codec software is intended to be used on a wide variety of Android devices. - -AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual -audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by -independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part -of the MPEG specifications. - -Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) -may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners -individually for the purpose of encoding or decoding bit streams in products that are compliant with -the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license -these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec -software may already be covered under those patent licenses when it is used for those licensed purposes only. - -Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, -are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional -applications information and documentation. - -2. COPYRIGHT LICENSE - -Redistribution and use in source and binary forms, with or without modification, are permitted without -payment of copyright license fees provided that you satisfy the following conditions: - -You must retain the complete text of this software license in redistributions of the FDK AAC Codec or -your modifications thereto in source code form. - -You must retain the complete text of this software license in the documentation and/or other materials -provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. -You must make available free of charge copies of the complete source code of the FDK AAC Codec and your -modifications thereto to recipients of copies in binary form. - -The name of Fraunhofer may not be used to endorse or promote products derived from this library without -prior written permission. - -You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec -software or your modifications thereto. - -Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software -and the date of any change. For modified versions of the FDK AAC Codec, the term -"Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term -"Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." - -3. NO PATENT LICENSE - -NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, -ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with -respect to this software. - -You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized -by appropriate patent licenses. - -4. DISCLAIMER - -This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors -"AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties -of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR -CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, -including but not limited to procurement of substitute goods or services; loss of use, data, or profits, -or business interruption, however caused and on any theory of liability, whether in contract, strict -liability, or tort (including negligence), arising in any way out of the use of this software, even if -advised of the possibility of such damage. - -5. CONTACT INFORMATION - -Fraunhofer Institute for Integrated Circuits IIS -Attention: Audio and Multimedia Departments - FDK AAC LL -Am Wolfsmantel 33 -91058 Erlangen, Germany - -www.iis.fraunhofer.de/amm -amm-info@iis.fraunhofer.de ------------------------------------------------------------------------------------------------------------ */ - -/******************************** MPEG Audio Encoder ************************** - - Initial author: serge - contents/description: DAB Transport Headers support - -******************************************************************************/ -#include <stdio.h> -#include "FDK_audio.h" -#include "tpenc_dab.h" - - -#include "tpenc_lib.h" -#include "tpenc_asc.h" - -#include "common_fix.h" - -int dabWrite_CrcStartReg( - HANDLE_DAB pDab, /*!< pointer to dab stucture */ - HANDLE_FDK_BITSTREAM hBs, /*!< handle to current bit buffer structure */ - int mBits /*!< number of bits in crc region */ - ) -{ - //fprintf(stderr, "dabWrite_CrcStartReg(%p): bits in crc region=%d\n", hBs, mBits); - return ( FDKcrcStartReg(&pDab->crcInfo2, hBs, mBits) ); -} - -void dabWrite_CrcEndReg( - HANDLE_DAB pDab, /*!< pointer to dab crc info stucture */ - HANDLE_FDK_BITSTREAM hBs, /*!< handle to current bit buffer structure */ - int reg /*!< crc region */ - ) -{ - //fprintf(stderr, "dabWrite_CrcEndReg(%p): crc region=%d\n", hBs, reg); - FDKcrcEndReg(&pDab->crcInfo2, hBs, reg); -} - -int dabWrite_GetHeaderBits( HANDLE_DAB hDab ) -{ - int bits = 0; - - if (hDab->currentBlock == 0) { - /* Static and variable header bits */ - bits += 16; //header_firecode 16 - bits += 8; //rfa=1, dac_rate=1, sbr_flag=1, aac_channel_mode=1, ps_flag=1, mpeg_surround_config=3 - bits += 12 * hDab->num_raw_blocks; //au_start[1...num_aus] 12 bit AU start position markers - - //4 byte alignment - if (hDab->dac_rate == 0 || hDab->sbr_flag == 0) - bits+=4; - //16sbr => 16 + 5 + 3 + 12*(2-1) => 36 => 40 bits 5 - //24sbr => 16 + 5 + 3 + 12*(3-1) => 48 ok 6 - //32sbr => 16 + 5 + 3 + 12*(4-1) => 60 => 64 bits 8 - //48sbr => 16 + 5 + 3 + 12*(6-1) => 84 => 88 bits 11 - } - - /* Add raw data block CRC bits. Not really part of the header, put they cause bit overhead to be accounted. */ - bits += 16; - - - return bits; -} - - -int dabWrite_CountTotalBitDemandHeader( HANDLE_DAB hDab, unsigned int streamDataLength ) -{ - //fprintf(stderr, "streamDataLength=%d (%d bytes)\n", streamDataLength, streamDataLength >> 3); - return dabWrite_GetHeaderBits(hDab); -} - - -INT dabWrite_Init(HANDLE_DAB hDab, CODER_CONFIG *config) -{ - /* Sanity checks */ - if((int)config->aot > 4 - || (int)config->aot < 1 ) { - return -1; - } - - /* Sanity checks DAB-specific */ - if ( !(config->nSubFrames == 2 && config->samplingRate == 16000 && (config->flags & CC_SBR)) && - !(config->nSubFrames == 3 && config->samplingRate == 24000 && (config->flags & CC_SBR)) && - !(config->nSubFrames == 4 && config->samplingRate == 32000) && - !(config->nSubFrames == 6 && config->samplingRate == 48000)) { - return -1; - } - - hDab->dac_rate = 0; - hDab->aac_channel_mode=0; - hDab->sbr_flag = 0; - hDab->ps_flag = 0; - hDab->mpeg_surround_config=0; - hDab->subchannels_num=config->bitRate/8000; - - - if(config->samplingRate == 24000 || config->samplingRate == 48000) - hDab->dac_rate = 1; - - if (config->extAOT==AOT_SBR || config->extAOT == AOT_PS) - hDab->sbr_flag = 1; - - if(config->extAOT == AOT_PS) - hDab->ps_flag = 1; - - - if(config->channelMode == MODE_2) - hDab->aac_channel_mode = 1; - - //fprintf(stderr, "hDab->dac_rate=%d\n", hDab->dac_rate); - //fprintf(stderr, "hDab->sbr_flag=%d\n", hDab->sbr_flag); - //fprintf(stderr, "hDab->ps_flag=%d\n", hDab->ps_flag); - //fprintf(stderr, "hDab->aac_channel_mode=%d\n", hDab->aac_channel_mode); - //fprintf(stderr, "hDab->subchannels_num=%d\n", hDab->subchannels_num); - //fprintf(stderr, "cc->nSubFrames=%d\n", config->nSubFrames); - - hDab->num_raw_blocks=config->nSubFrames-1; /* 0 means 1 raw data block */ - - FDKcrcInit(&hDab->crcInfo, 0x1021, 0xFFFF, 16); - FDKcrcInit(&hDab->crcFire, 0x782d, 0, 16); - FDKcrcInit(&hDab->crcInfo2, 0x8005, 0xFFFF, 16); - - hDab->currentBlock = 0; - hDab->headerBits = dabWrite_GetHeaderBits(hDab); - - return 0; -} - -int dabWrite_EncodeHeader(HANDLE_DAB hDab, - HANDLE_FDK_BITSTREAM hBitStream, - int buffer_fullness, - int frame_length) -{ - INT crcIndex = 0; - - - FDK_ASSERT(((frame_length+hDab->headerBits)/8)<0x2000); /*13 bit*/ - FDK_ASSERT(buffer_fullness<0x800); /* 11 bit */ - - FDKcrcReset(&hDab->crcInfo); - - -// fprintf(stderr, "dabWrite_EncodeHeader() hDab->currentBlock=%d, frame_length=%d, buffer_fullness=%d\n", -// hDab->currentBlock, frame_length, buffer_fullness); - -// if (hDab->currentBlock == 0) { -// //hDab->subFrameStartPrev=dabWrite_GetHeaderBits(hDab); -// fprintf(stderr, "header bits[%d] [%d]\n", hDab->subFrameStartPrev, hDab->subFrameStartPrev >> 3); -// FDKresetBitbuffer(hBitStream, BS_WRITER); -// } - - //hDab->subFrameStartBit = FDKgetValidBits(hBitStream); -// fprintf(stderr, "dabWrite_EncodeHeader() hDab->subFrameStartBit=%d [%d]\n", hDab->subFrameStartBit, hDab->subFrameStartBit >> 3); - - //hDab->subFrameStartBit = FDKgetValidBits(hBitStream); - /* Skip new header if this is raw data block 1..n */ - if (hDab->currentBlock == 0) - { - FDKresetBitbuffer(hBitStream, BS_WRITER); -// fprintf(stderr, "dabWrite_EncodeHeader() after FDKresetBitbuffer=%d [%d]\n", FDKgetValidBits(hBitStream), FDKgetValidBits(hBitStream) >> 3); - - /* fixed header */ - FDKwriteBits(hBitStream, 0, 16); //header_firecode - FDKwriteBits(hBitStream, 0, 1); //rfa - FDKwriteBits(hBitStream, hDab->dac_rate, 1); - FDKwriteBits(hBitStream, hDab->sbr_flag, 1); - FDKwriteBits(hBitStream, hDab->aac_channel_mode, 1); - FDKwriteBits(hBitStream, hDab->ps_flag, 1); - FDKwriteBits(hBitStream, hDab->mpeg_surround_config, 3); - /* variable header */ - int i; - for(i=0; i<hDab->num_raw_blocks; i++) - FDKwriteBits(hBitStream, 0, 12); - /* padding */ - if (hDab->dac_rate == 0 || hDab->sbr_flag == 0) { - FDKwriteBits(hBitStream, 0, 4); - } - } /* End of DAB header */ - - hDab->subFrameStartBit = FDKgetValidBits(hBitStream); - FDK_ASSERT(FDKgetValidBits(hBitStream) % 8 == 0); //only aligned header - -// fprintf(stderr, "dabWrite_EncodeHeader() FDKgetValidBits(hBitStream)=%d [%d]\n", FDKgetValidBits(hBitStream), FDKgetValidBits(hBitStream) >> 3); - return 0; -} - -int dabWrite_writeExtensionFillPayload(HANDLE_FDK_BITSTREAM hBitStream, int extPayloadBits) -{ -#define EXT_TYPE_BITS ( 4 ) -#define DATA_EL_VERSION_BITS ( 4 ) -#define FILL_NIBBLE_BITS ( 4 ) - -#define EXT_TYPE_BITS ( 4 ) -#define DATA_EL_VERSION_BITS ( 4 ) -#define FILL_NIBBLE_BITS ( 4 ) - - INT extBitsUsed = 0; - INT extPayloadType = EXT_FIL; - //fprintf(stderr, "FDKaacEnc_writeExtensionPayload() extPayloadType=%d\n", extPayloadType); - if (extPayloadBits >= EXT_TYPE_BITS) - { - UCHAR fillByte = 0x00; /* for EXT_FIL and EXT_FILL_DATA */ - - if (hBitStream != NULL) { - FDKwriteBits(hBitStream, extPayloadType, EXT_TYPE_BITS); - } - extBitsUsed += EXT_TYPE_BITS; - - switch (extPayloadType) { - case EXT_FILL_DATA: - fillByte = 0xA5; - case EXT_FIL: - default: - if (hBitStream != NULL) { - int writeBits = extPayloadBits; - FDKwriteBits(hBitStream, 0x00, FILL_NIBBLE_BITS); - writeBits -= 8; /* acount for the extension type and the fill nibble */ - while (writeBits >= 8) { - FDKwriteBits(hBitStream, fillByte, 8); - writeBits -= 8; - } - } - extBitsUsed += FILL_NIBBLE_BITS + (extPayloadBits & ~0x7) - 8; - break; - } - } - - return (extBitsUsed); -} - -void dabWrite_FillRawDataBlock(HANDLE_FDK_BITSTREAM hBitStream, int payloadBits) -{ - INT extBitsUsed = 0; -#define EL_ID_BITS ( 3 ) -#define FILL_EL_COUNT_BITS ( 4 ) -#define FILL_EL_ESC_COUNT_BITS ( 8 ) -#define MAX_FILL_DATA_BYTES ( 269 ) - while (payloadBits >= (EL_ID_BITS + FILL_EL_COUNT_BITS)) { - INT cnt, esc_count=-1, alignBits=7; - - payloadBits -= EL_ID_BITS + FILL_EL_COUNT_BITS; - if (payloadBits >= 15*8) { - payloadBits -= FILL_EL_ESC_COUNT_BITS; - esc_count = 0; /* write esc_count even if cnt becomes smaller 15 */ - } - alignBits = 0; - - cnt = fixMin(MAX_FILL_DATA_BYTES, (payloadBits+alignBits)>>3); - - if (cnt >= 15) { - esc_count = cnt - 15 + 1; - } - - if (hBitStream != NULL) { - /* write bitstream */ - FDKwriteBits(hBitStream, ID_FIL, EL_ID_BITS); - if (esc_count >= 0) { - FDKwriteBits(hBitStream, 15, FILL_EL_COUNT_BITS); - FDKwriteBits(hBitStream, esc_count, FILL_EL_ESC_COUNT_BITS); - } else { - FDKwriteBits(hBitStream, cnt, FILL_EL_COUNT_BITS); - } - } - - extBitsUsed += EL_ID_BITS + FILL_EL_COUNT_BITS + ((esc_count>=0) ? FILL_EL_ESC_COUNT_BITS : 0); - - cnt = fixMin(cnt*8, payloadBits); /* convert back to bits */ -#if 0 - extBitsUsed += FDKaacEnc_writeExtensionPayload( hBitStream, - pExtension->type, - pExtension->pPayload, - cnt ); -#else - extBitsUsed += dabWrite_writeExtensionFillPayload(hBitStream, cnt); -#endif - payloadBits -= cnt; - } -} - -void dabWrite_EndRawDataBlock(HANDLE_DAB hDab, - HANDLE_FDK_BITSTREAM hBs, - int *pBits) -{ - FDK_BITSTREAM bsWriter; - INT crcIndex = 0; - USHORT crcData; - INT writeBits=0; - INT writeBitsNonLastBlock=0; - INT writeBitsLastBlock=0; -#if 1 - if (hDab->currentBlock == hDab->num_raw_blocks) { - //calculate byte-alignment before writing ID_FIL - if((FDKgetValidBits(hBs)+3) % 8){ - writeBits = 8 - ((FDKgetValidBits(hBs)+3) % 8); - } - - INT offset_end = hDab->subchannels_num*110*8 - 2*8 - 3; - writeBitsLastBlock = offset_end - FDKgetValidBits(hBs); - dabWrite_FillRawDataBlock(hBs, writeBitsLastBlock); - FDKsyncCache(hBs); - //fprintf(stderr, "FIL-element written=%d\n", writeBitsLastBlock); - writeBitsLastBlock=writeBits; - } -#endif - FDKwriteBits(hBs, 7, 3); //finalize AU: ID_END - FDKsyncCache(hBs); - //byte-align (if ID_FIL doesn't align it). - if(FDKgetValidBits(hBs) % 8){ - writeBits = 8 - (FDKgetValidBits(hBs) % 8); - FDKwriteBits(hBs, 0x00, writeBits); - FDKsyncCache(hBs); - } - - //fake-written bits alignment for last AU - if (hDab->currentBlock == hDab->num_raw_blocks) - writeBits=writeBitsLastBlock; - - INT frameLen = (FDKgetValidBits(hBs) - hDab->subFrameStartBit) >> 3; - //fprintf(stderr, "frame=%d, offset writeBits=%d\n", frameLen, writeBits); - - FDK_ASSERT(FDKgetValidBits(hBs) % 8 == 0); //only aligned au's - FDK_ASSERT(hDab->subchannels_num*110*8 >= FDKgetValidBits(hBs)+2*8); //don't overlap superframe - - FDKinitBitStream(&bsWriter, hBs->hBitBuf.Buffer, hBs->hBitBuf.bufSize, 0, BS_WRITER); - FDKpushFor(&bsWriter, hDab->subFrameStartBit); - FDKcrcReset(&hDab->crcInfo); - hDab->crcIndex = FDKcrcStartReg(&hDab->crcInfo, &bsWriter, 0); -#if 0 - if (hDab->currentBlock == hDab->num_raw_blocks) { - INT offset_size = hDab->subchannels_num*110*8 - 2*8 - FDKgetValidBits(hBs); - //fprintf(stderr, "offset_size=%d\n", offset_size >> 3); - FDKpushFor(hBs, offset_size); - } -#endif - - FDKpushFor(&bsWriter, FDKgetValidBits(hBs) - hDab->subFrameStartBit); - FDKcrcEndReg(&hDab->crcInfo, &bsWriter, hDab->crcIndex); - crcData = FDKcrcGetCRC(&hDab->crcInfo); - //fprintf(stderr, "crcData = %04x\n", crcData); - /* Write inverted CRC of current raw data block */ - FDKwriteBits(hBs, crcData ^ 0xffff, 16); - FDKsyncCache(hBs); - - - /* Write distance to current data block */ - if(hDab->currentBlock) { - FDKinitBitStream(&bsWriter, hBs->hBitBuf.Buffer, hBs->hBitBuf.bufSize, 0, BS_WRITER); - FDKpushFor(&bsWriter, 24 + (hDab->currentBlock-1)*12); - //fprintf(stderr, "FDKwriteBits() = %d\n", hDab->subFrameStartBit>>3); - FDKwriteBits(&bsWriter, (hDab->subFrameStartBit>>3), 12); - FDKsyncCache(&bsWriter); - } - - /* Write FireCode */ - if (hDab->currentBlock == hDab->num_raw_blocks) { - FDKinitBitStream(&bsWriter, hBs->hBitBuf.Buffer, hBs->hBitBuf.bufSize, 0, BS_WRITER); - FDKpushFor(&bsWriter, 16); - - FDKcrcReset(&hDab->crcFire); - crcIndex = FDKcrcStartReg(&hDab->crcFire, &bsWriter, 72); - FDKpushFor(&bsWriter, 9*8); //9bytes - FDKcrcEndReg(&hDab->crcFire, &bsWriter, crcIndex); - - crcData = FDKcrcGetCRC(&hDab->crcFire); - //fprintf(stderr, "Firecode: %04x\n", crcData); - - FDKinitBitStream(&bsWriter, hBs->hBitBuf.Buffer, hBs->hBitBuf.bufSize, 0, BS_WRITER); - FDKwriteBits(&bsWriter, crcData, 16); - FDKsyncCache(&bsWriter); - } - - if (hDab->currentBlock == 0) - *pBits += hDab->headerBits; - else - *pBits += 16; - - *pBits += writeBits + 3; //size: ID_END + alignment - - /* Correct *pBits to reflect the amount of bits of the current subframe */ - *pBits -= hDab->subFrameStartBit; - /* Fixup CRC bits, since they come after each raw data block */ - - hDab->currentBlock++; - //fprintf(stderr, "dabWrite_EndRawDataBlock() *pBits=%d (%d)\n", *pBits, *pBits >> 3); -} - |