aboutsummaryrefslogtreecommitdiffstats
path: root/libMpegTPEnc/src/tpenc_lib.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libMpegTPEnc/src/tpenc_lib.cpp')
-rw-r--r--libMpegTPEnc/src/tpenc_lib.cpp553
1 files changed, 287 insertions, 266 deletions
diff --git a/libMpegTPEnc/src/tpenc_lib.cpp b/libMpegTPEnc/src/tpenc_lib.cpp
index 24fb32f..a8567b9 100644
--- a/libMpegTPEnc/src/tpenc_lib.cpp
+++ b/libMpegTPEnc/src/tpenc_lib.cpp
@@ -1,74 +1,85 @@
-
-/* -----------------------------------------------------------------------------------------------------------
+/* -----------------------------------------------------------------------------
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.
+© Copyright 1995 - 2018 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.
+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:
+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 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
+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.
+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.
+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."
+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.
+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.
+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.
+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
@@ -79,24 +90,24 @@ Am Wolfsmantel 33
www.iis.fraunhofer.de/amm
amm-info@iis.fraunhofer.de
------------------------------------------------------------------------------------------------------------ */
+----------------------------------------------------------------------------- */
+
+/******************* MPEG transport format encoder library *********************
-/************************** MPEG-4 Transport Encoder ************************
+ Author(s): Manuel Jander
- Author(s): Manuel Jander
Description: MPEG Transport encode
-******************************************************************************/
+*******************************************************************************/
#include "tpenc_lib.h"
/* library info */
-#include "version"
+#include "tp_version.h"
#define MODULE_NAME "transportEnc"
#include "tpenc_asc.h"
-#include "conv_string.h"
#include "tpenc_adts.h"
@@ -104,25 +115,23 @@ amm-info@iis.fraunhofer.de
#include "tpenc_latm.h"
-
-
typedef struct {
int curSubFrame;
int nSubFrames;
int prevBits;
} RAWPACKETS_INFO;
-struct TRANSPORTENC
-{
+struct TRANSPORTENC {
CODER_CONFIG config;
- TRANSPORT_TYPE transportFmt; /*!< MPEG4 transport type. */
+ TRANSPORT_TYPE transportFmt; /*!< MPEG4 transport type. */
FDK_BITSTREAM bitStream;
UCHAR *bsBuffer;
INT bsBufferSize;
- INT pceFrameCounter; /*!< Indicates frame period when PCE must be written in raw_data_block.
- -1 means not to write a PCE in raw_dat_block. */
+ INT pceFrameCounter; /*!< Indicates frame period when PCE must be written in
+ raw_data_block. -1 means not to write a PCE in
+ raw_dat_block. */
union {
STRUCT_ADTS adts;
@@ -132,8 +141,6 @@ struct TRANSPORTENC
RAWPACKETS_INFO raw;
-
-
} writer;
CSTpCallBacks callbacks;
@@ -141,24 +148,22 @@ struct TRANSPORTENC
typedef struct _TRANSPORTENC_STRUCT TRANSPORTENC_STRUCT;
-
/*
* MEMORY Declaration
*/
-C_ALLOC_MEM(Ram_TransportEncoder, TRANSPORTENC, 1)
+C_ALLOC_MEM(Ram_TransportEncoder, struct TRANSPORTENC, 1)
-TRANSPORTENC_ERROR transportEnc_Open( HANDLE_TRANSPORTENC *phTpEnc )
-{
+TRANSPORTENC_ERROR transportEnc_Open(HANDLE_TRANSPORTENC *phTpEnc) {
HANDLE_TRANSPORTENC hTpEnc;
- if ( phTpEnc == NULL ){
+ if (phTpEnc == NULL) {
return TRANSPORTENC_INVALID_PARAMETER;
}
hTpEnc = GetRam_TransportEncoder(0);
- if ( hTpEnc == NULL ) {
+ if (hTpEnc == NULL) {
return TRANSPORTENC_NO_MEM;
}
@@ -169,29 +174,31 @@ TRANSPORTENC_ERROR transportEnc_Open( HANDLE_TRANSPORTENC *phTpEnc )
/**
* \brief Get frame period of PCE in raw_data_block.
*
- * - Write PCE only if necessary. PCE can be part of the ASC if chConfig==0 whererfore
- * no additonal PCE will be written in raw_data_block.
+ * - Write PCE only if necessary. PCE can be part of the ASC if chConfig==0
+ * whererfore no additonal PCE will be written in raw_data_block.
* - A matrixMixdown coefficient can only be written if chConfig is 5.0 or 5.1.
- * - The PCE repetition rate in raw_data_block can be controlled via headerPeriod parameter.
+ * - The PCE repetition rate in raw_data_block can be controlled via
+ * headerPeriod parameter.
*
- * \param channelConfig Channel Configuration derived from Channel Mode
+ * \param channelMode Encoder Channel Mode.
+ * \param channelConfigZero No standard channel configuration.
* \param transportFmt Format of the transport to be written.
* \param headerPeriod Chosen PCE frame repetition rate.
- * \param matrixMixdownA Indicates if a valid Matrix Mixdown coefficient is available.
+ * \param matrixMixdownA Indicates if a valid Matrix Mixdown coefficient
+ * is available.
*
- * \return PCE frame repetition rate. -1 means no PCE present in raw_data_block.
+ * \return PCE frame repetition rate. -1 means no PCE present in
+ * raw_data_block.
*/
-static INT getPceRepetitionRate(
- const int channelConfig,
- const TRANSPORT_TYPE transportFmt,
- const int headerPeriod,
- const int matrixMixdownA
- )
-{
+static INT getPceRepetitionRate(const CHANNEL_MODE channelMode,
+ const int channelConfigZero,
+ const TRANSPORT_TYPE transportFmt,
+ const int headerPeriod,
+ const int matrixMixdownA) {
INT pceFrameCounter = -1; /* variable to be returned */
- if (headerPeriod>0) {
- switch ( channelConfig ) {
+ if (headerPeriod > 0) {
+ switch (getChannelConfig(channelMode, channelConfigZero)) {
case 0:
switch (transportFmt) {
case TT_MP4_ADTS:
@@ -199,53 +206,52 @@ static INT getPceRepetitionRate(
case TT_MP4_RAW:
pceFrameCounter = headerPeriod;
break;
- case TT_MP4_ADIF: /* ADIF header comprises PCE */
- case TT_MP4_LOAS: /* PCE in ASC if chChonfig==0 */
- case TT_MP4_LATM_MCP1: /* PCE in ASC if chChonfig==0 */
- case TT_DRM: /* PCE not allowed in DRM */
+ case TT_MP4_ADIF: /* ADIF header comprises PCE */
+ if ((channelMode == MODE_1_2_2) || (channelMode == MODE_1_2_2_1)) {
+ pceFrameCounter = headerPeriod; /* repeating pce only meaningful
+ for potential matrix mixdown */
+ break;
+ }
+ case TT_MP4_LOAS: /* PCE in ASC if chChonfig==0 */
+ case TT_MP4_LATM_MCP1: /* PCE in ASC if chChonfig==0 */
default:
- pceFrameCounter = -1; /* no PCE in raw_data_block */
+ pceFrameCounter = -1; /* no PCE in raw_data_block */
}
break;
case 5: /* MODE_1_2_2 */
case 6: /* MODE_1_2_2_1 */
- /* matrixMixdownCoefficient can only be written if 5.0 and 5.1 config present. */
- if (matrixMixdownA!=0) {
+ /* matrixMixdownCoefficient can only be written if 5.0 and 5.1 config
+ * present. */
+ if (matrixMixdownA != 0) {
switch (transportFmt) {
- case TT_MP4_ADIF: /* ADIF header comprises PCE */
+ case TT_MP4_ADIF: /* ADIF header comprises PCE */
case TT_MP4_ADTS:
- case TT_MP4_LOAS: /* no PCE in ASC because chConfig!=0 */
- case TT_MP4_LATM_MCP1: /* no PCE in ASC because chConfig!=0 */
+ case TT_MP4_LOAS: /* no PCE in ASC because chConfig!=0 */
+ case TT_MP4_LATM_MCP1: /* no PCE in ASC because chConfig!=0 */
case TT_MP4_LATM_MCP0:
case TT_MP4_RAW:
pceFrameCounter = headerPeriod;
break;
- case TT_DRM: /* PCE not allowed in DRM */
default:
- pceFrameCounter = -1; /* no PCE in raw_data_block */
- } /* switch transportFmt */
- } /* if matrixMixdownA!=0 */
+ pceFrameCounter = -1; /* no PCE in raw_data_block */
+ } /* switch transportFmt */
+ } /* if matrixMixdownA!=0 */
break;
default:
- pceFrameCounter = -1; /* no PCE in raw_data_block */
- } /* switch getChannelConfig() */
- } /* if headerPeriod>0 */
+ pceFrameCounter = -1; /* no PCE in raw_data_block */
+ } /* switch getChannelConfig() */
+ } /* if headerPeriod>0 */
else {
- pceFrameCounter = -1; /* no PCE in raw_data_block */
+ pceFrameCounter = -1; /* no PCE in raw_data_block */
}
return pceFrameCounter;
}
-TRANSPORTENC_ERROR transportEnc_Init(
- HANDLE_TRANSPORTENC hTpEnc,
- UCHAR *bsBuffer,
- INT bsBufferSize,
- TRANSPORT_TYPE transportFmt,
- CODER_CONFIG *cconfig,
- UINT flags
- )
-{
+TRANSPORTENC_ERROR transportEnc_Init(HANDLE_TRANSPORTENC hTpEnc,
+ UCHAR *bsBuffer, INT bsBufferSize,
+ TRANSPORT_TYPE transportFmt,
+ CODER_CONFIG *cconfig, UINT flags) {
/* Copy configuration structure */
FDKmemcpy(&hTpEnc->config, cconfig, sizeof(CODER_CONFIG));
@@ -255,86 +261,95 @@ TRANSPORTENC_ERROR transportEnc_Init(
hTpEnc->bsBuffer = bsBuffer;
hTpEnc->bsBufferSize = bsBufferSize;
- FDKinitBitStream(&hTpEnc->bitStream, hTpEnc->bsBuffer, hTpEnc->bsBufferSize, 0, BS_WRITER);
+ FDKinitBitStream(&hTpEnc->bitStream, hTpEnc->bsBuffer, hTpEnc->bsBufferSize,
+ 0, BS_WRITER);
switch (transportFmt) {
+ case TT_MP4_ADIF:
+ /* Sanity checks */
+ if ((hTpEnc->config.aot != AOT_AAC_LC) ||
+ (hTpEnc->config.samplesPerFrame != 1024)) {
+ return TRANSPORTENC_INVALID_PARAMETER;
+ }
+ hTpEnc->writer.adif.headerWritten = 0;
+ hTpEnc->writer.adif.samplingRate = hTpEnc->config.samplingRate;
+ hTpEnc->writer.adif.bitRate = hTpEnc->config.bitRate;
+ hTpEnc->writer.adif.profile = ((int)hTpEnc->config.aot) - 1;
+ hTpEnc->writer.adif.cm = hTpEnc->config.channelMode;
+ hTpEnc->writer.adif.bVariableRate = 0;
+ hTpEnc->writer.adif.instanceTag = 0;
+ hTpEnc->writer.adif.matrixMixdownA = hTpEnc->config.matrixMixdownA;
+ hTpEnc->writer.adif.pseudoSurroundEnable =
+ (hTpEnc->config.flags & CC_PSEUDO_SURROUND) ? 1 : 0;
+ break;
- case TT_MP4_ADIF:
- /* Sanity checks */
- if ( (hTpEnc->config.aot != AOT_AAC_LC)
- ||(hTpEnc->config.samplesPerFrame != 1024))
- {
- return TRANSPORTENC_INVALID_PARAMETER;
- }
- hTpEnc->writer.adif.headerWritten = 0;
- hTpEnc->writer.adif.samplingRate = hTpEnc->config.samplingRate;
- hTpEnc->writer.adif.bitRate = hTpEnc->config.bitRate;
- hTpEnc->writer.adif.profile = ((int)hTpEnc->config.aot) - 1;
- hTpEnc->writer.adif.cm = hTpEnc->config.channelMode;
- hTpEnc->writer.adif.bVariableRate = 0;
- hTpEnc->writer.adif.instanceTag = 0;
- break;
-
- case TT_MP4_ADTS:
- /* Sanity checks */
- if ( ( hTpEnc->config.aot != AOT_AAC_LC)
- ||(hTpEnc->config.samplesPerFrame != 1024) )
- {
- return TRANSPORTENC_INVALID_PARAMETER;
- }
- if ( adtsWrite_Init(&hTpEnc->writer.adts, &hTpEnc->config) != 0) {
- return TRANSPORTENC_INVALID_PARAMETER;
- }
- break;
+ case TT_MP4_ADTS:
+ /* Sanity checks */
+ if ((hTpEnc->config.aot != AOT_AAC_LC) ||
+ (hTpEnc->config.samplesPerFrame != 1024)) {
+ return TRANSPORTENC_INVALID_PARAMETER;
+ }
+ if (adtsWrite_Init(&hTpEnc->writer.adts, &hTpEnc->config) != 0) {
+ return TRANSPORTENC_INVALID_PARAMETER;
+ }
+ break;
- case TT_MP4_LOAS:
- case TT_MP4_LATM_MCP0:
- case TT_MP4_LATM_MCP1:
- {
+ case TT_MP4_LOAS:
+ case TT_MP4_LATM_MCP0:
+ case TT_MP4_LATM_MCP1: {
TRANSPORTENC_ERROR error;
- error = transportEnc_Latm_Init(
- &hTpEnc->writer.latm,
- &hTpEnc->bitStream,
- &hTpEnc->config,
- flags & TP_FLAG_LATM_AMV,
- transportFmt,
- &hTpEnc->callbacks
- );
+ error = transportEnc_Latm_Init(&hTpEnc->writer.latm, &hTpEnc->bitStream,
+ &hTpEnc->config, flags & TP_FLAG_LATM_AMV,
+ transportFmt, &hTpEnc->callbacks);
if (error != TRANSPORTENC_OK) {
return error;
}
- }
- break;
-
- case TT_MP4_RAW:
- hTpEnc->writer.raw.curSubFrame = 0;
- hTpEnc->writer.raw.nSubFrames = hTpEnc->config.nSubFrames;
- break;
-
+ } break;
+ case TT_MP4_RAW:
+ hTpEnc->writer.raw.curSubFrame = 0;
+ hTpEnc->writer.raw.nSubFrames = hTpEnc->config.nSubFrames;
+ break;
- default:
- return TRANSPORTENC_INVALID_PARAMETER;
+ default:
+ return TRANSPORTENC_INVALID_PARAMETER;
}
/* pceFrameCounter indicates if PCE must be written in raw_data_block. */
hTpEnc->pceFrameCounter = getPceRepetitionRate(
- getChannelConfig(hTpEnc->config.channelMode),
- transportFmt,
- hTpEnc->config.headerPeriod,
- hTpEnc->config.matrixMixdownA);
+ hTpEnc->config.channelMode, hTpEnc->config.channelConfigZero,
+ transportFmt, hTpEnc->config.headerPeriod, hTpEnc->config.matrixMixdownA);
return TRANSPORTENC_OK;
}
-HANDLE_FDK_BITSTREAM transportEnc_GetBitstream( HANDLE_TRANSPORTENC hTp )
-{
+TRANSPORTENC_ERROR transportEnc_AddOtherDataBits(HANDLE_TRANSPORTENC hTpEnc,
+ const int nBits) {
+ TRANSPORTENC_ERROR tpErr = TRANSPORTENC_OK;
+
+ switch (hTpEnc->transportFmt) {
+ case TT_MP4_LATM_MCP0:
+ case TT_MP4_LATM_MCP1:
+ case TT_MP4_LOAS:
+ tpErr = transportEnc_LatmAddOtherDataBits(&hTpEnc->writer.latm, nBits);
+ break;
+ case TT_MP4_ADTS:
+ case TT_MP4_ADIF:
+ case TT_MP4_RAW:
+ default:
+ tpErr = TRANSPORTENC_UNKOWN_ERROR;
+ }
+
+ return tpErr;
+}
+
+HANDLE_FDK_BITSTREAM transportEnc_GetBitstream(HANDLE_TRANSPORTENC hTp) {
return &hTp->bitStream;
}
-int transportEnc_RegisterSbrCallback( HANDLE_TRANSPORTENC hTpEnc, const cbSbr_t cbSbr, void* user_data)
-{
+int transportEnc_RegisterSbrCallback(HANDLE_TRANSPORTENC hTpEnc,
+ const cbSbr_t cbSbr, void *user_data) {
if (hTpEnc == NULL) {
return -1;
}
@@ -342,15 +357,29 @@ int transportEnc_RegisterSbrCallback( HANDLE_TRANSPORTENC hTpEnc, const cbSbr_t
hTpEnc->callbacks.cbSbrData = user_data;
return 0;
}
+int transportEnc_RegisterUsacCallback(HANDLE_TRANSPORTENC hTpEnc,
+ const cbUsac_t cbUsac, void *user_data) {
+ if (hTpEnc == NULL) {
+ return -1;
+ }
+ hTpEnc->callbacks.cbUsac = cbUsac;
+ hTpEnc->callbacks.cbUsacData = user_data;
+ return 0;
+}
+int transportEnc_RegisterSscCallback(HANDLE_TRANSPORTENC hTpEnc,
+ const cbSsc_t cbSsc, void *user_data) {
+ if (hTpEnc == NULL) {
+ return -1;
+ }
+ hTpEnc->callbacks.cbSsc = cbSsc;
+ hTpEnc->callbacks.cbSscData = user_data;
+ return 0;
+}
-TRANSPORTENC_ERROR transportEnc_WriteAccessUnit(
- HANDLE_TRANSPORTENC hTp,
- INT frameUsedBits,
- int bufferFullness,
- int ncc
- )
-{
+TRANSPORTENC_ERROR transportEnc_WriteAccessUnit(HANDLE_TRANSPORTENC hTp,
+ INT frameUsedBits,
+ int bufferFullness, int ncc) {
TRANSPORTENC_ERROR err = TRANSPORTENC_OK;
if (!hTp) {
@@ -359,48 +388,41 @@ TRANSPORTENC_ERROR transportEnc_WriteAccessUnit(
HANDLE_FDK_BITSTREAM hBs = &hTp->bitStream;
/* In case of writing PCE in raw_data_block frameUsedBits must be adapted. */
- if (hTp->pceFrameCounter>=hTp->config.headerPeriod) {
- frameUsedBits += transportEnc_GetPCEBits(hTp->config.channelMode, hTp->config.matrixMixdownA, 3); /* Consider 3 bits ID signalling in alignment */
+ if (hTp->pceFrameCounter >= hTp->config.headerPeriod) {
+ frameUsedBits += transportEnc_GetPCEBits(
+ hTp->config.channelMode, hTp->config.matrixMixdownA,
+ 3); /* Consider 3 bits ID signalling in alignment */
}
switch (hTp->transportFmt) {
case TT_MP4_ADIF:
- FDKinitBitStream(&hTp->bitStream, hTp->bsBuffer, hTp->bsBufferSize, 0, BS_WRITER);
- adifWrite_EncodeHeader(
- &hTp->writer.adif,
- hBs,
- bufferFullness
- );
+ FDKinitBitStream(&hTp->bitStream, hTp->bsBuffer, hTp->bsBufferSize, 0,
+ BS_WRITER);
+ if (0 != adifWrite_EncodeHeader(&hTp->writer.adif, hBs, bufferFullness)) {
+ err = TRANSPORTENC_INVALID_CONFIG;
+ }
break;
case TT_MP4_ADTS:
- bufferFullness /= ncc; /* Number of Considered Channels */
+ bufferFullness /= ncc; /* Number of Considered Channels */
bufferFullness /= 32;
bufferFullness = FDKmin(0x7FF, bufferFullness); /* Signal variable rate */
- adtsWrite_EncodeHeader(
- &hTp->writer.adts,
- &hTp->bitStream,
- bufferFullness,
- frameUsedBits
- );
+ adtsWrite_EncodeHeader(&hTp->writer.adts, &hTp->bitStream, bufferFullness,
+ frameUsedBits);
break;
case TT_MP4_LOAS:
case TT_MP4_LATM_MCP0:
case TT_MP4_LATM_MCP1:
- bufferFullness /= ncc; /* Number of Considered Channels */
+ bufferFullness /= ncc; /* Number of Considered Channels */
bufferFullness /= 32;
bufferFullness = FDKmin(0xFF, bufferFullness); /* Signal variable rate */
- transportEnc_LatmWrite(
- &hTp->writer.latm,
- hBs,
- frameUsedBits,
- bufferFullness,
- &hTp->callbacks
- );
- break;
+ transportEnc_LatmWrite(&hTp->writer.latm, hBs, frameUsedBits,
+ bufferFullness, &hTp->callbacks);
+ break;
case TT_MP4_RAW:
if (hTp->writer.raw.curSubFrame >= hTp->writer.raw.nSubFrames) {
hTp->writer.raw.curSubFrame = 0;
- FDKinitBitStream(&hTp->bitStream, hTp->bsBuffer, hTp->bsBufferSize, 0, BS_WRITER);
+ FDKinitBitStream(&hTp->bitStream, hTp->bsBuffer, hTp->bsBufferSize, 0,
+ BS_WRITER);
}
hTp->writer.raw.prevBits = FDKgetValidBits(hBs);
break;
@@ -410,7 +432,7 @@ TRANSPORTENC_ERROR transportEnc_WriteAccessUnit(
}
/* Write PCE in raw_data_block if required */
- if (hTp->pceFrameCounter>=hTp->config.headerPeriod) {
+ if (hTp->pceFrameCounter >= hTp->config.headerPeriod) {
INT crcIndex = 0;
/* Align inside PCE with repsect to the first bit of the raw_data_block() */
UINT alignAnchor = FDKgetValidBits(&hTp->bitStream);
@@ -418,29 +440,34 @@ TRANSPORTENC_ERROR transportEnc_WriteAccessUnit(
/* Write PCE element ID bits */
FDKwriteBits(&hTp->bitStream, ID_PCE, 3);
- if ( (hTp->transportFmt==TT_MP4_ADTS) && !hTp->writer.adts.protection_absent) {
+ if ((hTp->transportFmt == TT_MP4_ADTS) &&
+ !hTp->writer.adts.protection_absent) {
crcIndex = adtsWrite_CrcStartReg(&hTp->writer.adts, &hTp->bitStream, 0);
}
/* Write PCE as first raw_data_block element */
- transportEnc_writePCE(&hTp->bitStream, hTp->config.channelMode, hTp->config.samplingRate, 0, 1, hTp->config.matrixMixdownA, (hTp->config.flags&CC_PSEUDO_SURROUND)?1:0, alignAnchor);
+ transportEnc_writePCE(
+ &hTp->bitStream, hTp->config.channelMode, hTp->config.samplingRate, 0,
+ 1, hTp->config.matrixMixdownA,
+ (hTp->config.flags & CC_PSEUDO_SURROUND) ? 1 : 0, alignAnchor);
- if ( (hTp->transportFmt==TT_MP4_ADTS) && !hTp->writer.adts.protection_absent) {
+ if ((hTp->transportFmt == TT_MP4_ADTS) &&
+ !hTp->writer.adts.protection_absent) {
adtsWrite_CrcEndReg(&hTp->writer.adts, &hTp->bitStream, crcIndex);
}
hTp->pceFrameCounter = 0; /* reset pce frame counter */
}
- if (hTp->pceFrameCounter!=-1) {
- hTp->pceFrameCounter++; /* Update pceFrameCounter only if PCE writing is active. */
+ if (hTp->pceFrameCounter != -1) {
+ hTp->pceFrameCounter++; /* Update pceFrameCounter only if PCE writing is
+ active. */
}
return err;
}
-
-TRANSPORTENC_ERROR transportEnc_EndAccessUnit(HANDLE_TRANSPORTENC hTp, int *bits)
-{
+TRANSPORTENC_ERROR transportEnc_EndAccessUnit(HANDLE_TRANSPORTENC hTp,
+ int *bits) {
switch (hTp->transportFmt) {
case TT_MP4_LATM_MCP0:
case TT_MP4_LATM_MCP1:
@@ -465,8 +492,9 @@ TRANSPORTENC_ERROR transportEnc_EndAccessUnit(HANDLE_TRANSPORTENC hTp, int *bits
return TRANSPORTENC_OK;
}
-TRANSPORTENC_ERROR transportEnc_GetFrame(HANDLE_TRANSPORTENC hTpEnc, int *nbytes)
-{
+TRANSPORTENC_ERROR transportEnc_GetFrame(HANDLE_TRANSPORTENC hTpEnc,
+ int *nbytes) {
+ TRANSPORTENC_ERROR tpErr = TRANSPORTENC_OK;
HANDLE_FDK_BITSTREAM hBs = &hTpEnc->bitStream;
switch (hTpEnc->transportFmt) {
@@ -474,11 +502,12 @@ TRANSPORTENC_ERROR transportEnc_GetFrame(HANDLE_TRANSPORTENC hTpEnc, int *nbytes
case TT_MP4_LATM_MCP1:
case TT_MP4_LOAS:
*nbytes = hTpEnc->bsBufferSize;
- transportEnc_LatmGetFrame(&hTpEnc->writer.latm, hBs, nbytes);
+ tpErr = transportEnc_LatmGetFrame(&hTpEnc->writer.latm, hBs, nbytes);
break;
case TT_MP4_ADTS:
- if (hTpEnc->writer.adts.currentBlock >= hTpEnc->writer.adts.num_raw_blocks+1) {
- *nbytes = (FDKgetValidBits(hBs) + 7)>>3;
+ if (hTpEnc->writer.adts.currentBlock >=
+ hTpEnc->writer.adts.num_raw_blocks + 1) {
+ *nbytes = (FDKgetValidBits(hBs) + 7) >> 3;
hTpEnc->writer.adts.currentBlock = 0;
} else {
*nbytes = 0;
@@ -486,28 +515,31 @@ TRANSPORTENC_ERROR transportEnc_GetFrame(HANDLE_TRANSPORTENC hTpEnc, int *nbytes
break;
case TT_MP4_ADIF:
FDK_ASSERT((INT)FDKgetValidBits(hBs) >= 0);
- *nbytes = (FDKgetValidBits(hBs) + 7)>>3;
+ *nbytes = (FDKgetValidBits(hBs) + 7) >> 3;
break;
case TT_MP4_RAW:
FDKsyncCache(hBs);
hTpEnc->writer.raw.curSubFrame++;
- *nbytes = ((FDKgetValidBits(hBs)-hTpEnc->writer.raw.prevBits) + 7)>>3;
+ *nbytes = ((FDKgetValidBits(hBs) - hTpEnc->writer.raw.prevBits) + 7) >> 3;
break;
default:
break;
}
- return TRANSPORTENC_OK;
+ return tpErr;
}
-INT transportEnc_GetStaticBits( HANDLE_TRANSPORTENC hTp, int auBits )
-{
+INT transportEnc_GetStaticBits(HANDLE_TRANSPORTENC hTp, int auBits) {
INT nbits = 0, nPceBits = 0;
/* Write PCE within raw_data_block in transport lib. */
- if (hTp->pceFrameCounter>=hTp->config.headerPeriod) {
- nPceBits = transportEnc_GetPCEBits(hTp->config.channelMode, hTp->config.matrixMixdownA, 3); /* Consider 3 bits ID signalling in alignment */
- auBits += nPceBits; /* Adapt required raw_data_block bit consumtpion for AU length information e.g. in LATM/LOAS configuration. */
+ if (hTp->pceFrameCounter >= hTp->config.headerPeriod) {
+ nPceBits = transportEnc_GetPCEBits(
+ hTp->config.channelMode, hTp->config.matrixMixdownA,
+ 3); /* Consider 3 bits ID signalling in alignment */
+ auBits += nPceBits; /* Adapt required raw_data_block bit consumtpion for AU
+ length information e.g. in LATM/LOAS configuration.
+ */
}
switch (hTp->transportFmt) {
@@ -521,73 +553,70 @@ INT transportEnc_GetStaticBits( HANDLE_TRANSPORTENC hTp, int auBits )
case TT_MP4_LOAS:
case TT_MP4_LATM_MCP0:
case TT_MP4_LATM_MCP1:
- nbits = transportEnc_LatmCountTotalBitDemandHeader( &hTp->writer.latm, auBits );
+ nbits =
+ transportEnc_LatmCountTotalBitDemandHeader(&hTp->writer.latm, auBits);
break;
default:
nbits = 0;
break;
}
- /* PCE is written in the transport library therefore the bit consumption is part of the transport static bits. */
+ /* PCE is written in the transport library therefore the bit consumption is
+ * part of the transport static bits. */
nbits += nPceBits;
return nbits;
}
-void transportEnc_Close(HANDLE_TRANSPORTENC *phTp)
-{
- if (phTp != NULL)
- {
+void transportEnc_Close(HANDLE_TRANSPORTENC *phTp) {
+ if (phTp != NULL) {
if (*phTp != NULL) {
FreeRam_TransportEncoder(phTp);
}
}
}
-int transportEnc_CrcStartReg(HANDLE_TRANSPORTENC hTpEnc, int mBits)
-{
+int transportEnc_CrcStartReg(HANDLE_TRANSPORTENC hTpEnc, int mBits) {
int crcReg = 0;
switch (hTpEnc->transportFmt) {
- case TT_MP4_ADTS:
- crcReg = adtsWrite_CrcStartReg(&hTpEnc->writer.adts, &hTpEnc->bitStream, mBits);
- break;
- default:
- break;
+ case TT_MP4_ADTS:
+ crcReg = adtsWrite_CrcStartReg(&hTpEnc->writer.adts, &hTpEnc->bitStream,
+ mBits);
+ break;
+ default:
+ break;
}
return crcReg;
}
-void transportEnc_CrcEndReg(HANDLE_TRANSPORTENC hTpEnc, int reg)
-{
+void transportEnc_CrcEndReg(HANDLE_TRANSPORTENC hTpEnc, int reg) {
switch (hTpEnc->transportFmt) {
- case TT_MP4_ADTS:
- adtsWrite_CrcEndReg(&hTpEnc->writer.adts, &hTpEnc->bitStream, reg);
- break;
- default:
- break;
+ case TT_MP4_ADTS:
+ adtsWrite_CrcEndReg(&hTpEnc->writer.adts, &hTpEnc->bitStream, reg);
+ break;
+ default:
+ break;
}
}
-
-TRANSPORTENC_ERROR transportEnc_GetConf(HANDLE_TRANSPORTENC hTpEnc,
- CODER_CONFIG *cc,
- FDK_BITSTREAM *dataBuffer,
- UINT *confType)
-{
+TRANSPORTENC_ERROR transportEnc_GetConf(HANDLE_TRANSPORTENC hTpEnc,
+ CODER_CONFIG *cc,
+ FDK_BITSTREAM *dataBuffer,
+ UINT *confType) {
TRANSPORTENC_ERROR tpErr = TRANSPORTENC_OK;
HANDLE_LATM_STREAM hLatmConfig = &hTpEnc->writer.latm;
*confType = 0; /* set confType variable to default */
/* write StreamMuxConfig or AudioSpecificConfig depending on format used */
- switch (hTpEnc->transportFmt)
- {
+ switch (hTpEnc->transportFmt) {
case TT_MP4_LATM_MCP0:
case TT_MP4_LATM_MCP1:
case TT_MP4_LOAS:
- tpErr = CreateStreamMuxConfig(hLatmConfig, dataBuffer, 0, &hTpEnc->callbacks);
+ tpErr =
+ CreateStreamMuxConfig(hLatmConfig, dataBuffer, 0, &hTpEnc->callbacks);
*confType = 1; /* config is SMC */
break;
default:
@@ -597,11 +626,9 @@ TRANSPORTENC_ERROR transportEnc_GetConf(HANDLE_TRANSPORTENC hTpEnc,
}
return tpErr;
-
}
-TRANSPORTENC_ERROR transportEnc_GetLibInfo( LIB_INFO *info )
-{
+TRANSPORTENC_ERROR transportEnc_GetLibInfo(LIB_INFO *info) {
int i;
if (info == NULL) {
@@ -629,14 +656,8 @@ TRANSPORTENC_ERROR transportEnc_GetLibInfo( LIB_INFO *info )
info->title = TP_LIB_TITLE;
/* Set flags */
- info->flags = 0
- | CAPF_ADIF
- | CAPF_ADTS
- | CAPF_LATM
- | CAPF_LOAS
- | CAPF_RAWPACKETS
- ;
+ info->flags =
+ 0 | CAPF_ADIF | CAPF_ADTS | CAPF_LATM | CAPF_LOAS | CAPF_RAWPACKETS;
return TRANSPORTENC_OK;
}
-