diff options
Diffstat (limited to 'libMpegTPEnc/src/tpenc_asc.cpp')
-rw-r--r-- | libMpegTPEnc/src/tpenc_asc.cpp | 42 |
1 files changed, 33 insertions, 9 deletions
diff --git a/libMpegTPEnc/src/tpenc_asc.cpp b/libMpegTPEnc/src/tpenc_asc.cpp index 6200c14..bc4302e 100644 --- a/libMpegTPEnc/src/tpenc_asc.cpp +++ b/libMpegTPEnc/src/tpenc_asc.cpp @@ -2,7 +2,7 @@ /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. +© Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -127,8 +127,7 @@ typedef struct { * * The number of channel element parameter describes the kind of consecutively elements. * E.g. MODE_1_2_2_2_1 means: - * - First 2 elements (SCE,CPE) are front channel elements. - * - Following element (CPE) is a side channel element. + * - First 3 elements (SCE,CPE,CPE) are front channel elements. * - Next element (CPE) is a back channel element. * - Last element (LFE) is a lfe channel element. */ @@ -140,7 +139,8 @@ static const CHANNEL_CONFIGURATION pceConfigTab[] = { MODE_1_2_1, { 2, 0, 1, 0, { ID_SCE, ID_CPE, ID_SCE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE } } }, { MODE_1_2_2, { 2, 0, 1, 0, { ID_SCE, ID_CPE, ID_CPE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE } } }, { MODE_1_2_2_1, { 2, 0, 1, 1, { ID_SCE, ID_CPE, ID_CPE, ID_LFE, ID_NONE, ID_NONE, ID_NONE, ID_NONE } } }, - { MODE_1_2_2_2_1, { 2, 1, 1, 1, { ID_SCE, ID_CPE, ID_CPE, ID_CPE, ID_LFE, ID_NONE, ID_NONE, ID_NONE } } }, + { MODE_1_2_2_2_1, { 3, 0, 1, 1, { ID_SCE, ID_CPE, ID_CPE, ID_CPE, ID_LFE, ID_NONE, ID_NONE, ID_NONE } } }, + { MODE_1_1, { 2, 0, 0, 0, { ID_SCE, ID_SCE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE } } }, { MODE_1_1_1_1, { 2, 2, 0, 0, { ID_SCE, ID_SCE, ID_SCE, ID_SCE, ID_NONE, ID_NONE, ID_NONE, ID_NONE } } }, @@ -151,7 +151,11 @@ static const CHANNEL_CONFIGURATION pceConfigTab[] = { MODE_2_2_2, { 1, 1, 1, 0, { ID_CPE, ID_CPE, ID_CPE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE } } }, { MODE_2_2_2_2, { 4, 0, 0, 0, { ID_CPE, ID_CPE, ID_CPE, ID_CPE, ID_NONE, ID_NONE, ID_NONE, ID_NONE } } }, - { MODE_2_1, { 1, 0, 1, 0, { ID_CPE, ID_SCE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE } } } + { MODE_2_1, { 1, 0, 1, 0, { ID_CPE, ID_SCE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE } } }, + + { MODE_7_1_REAR_SURROUND, { 2, 0, 2, 1, { ID_SCE, ID_CPE, ID_CPE, ID_CPE, ID_LFE, ID_NONE, ID_NONE, ID_NONE } } }, + { MODE_7_1_FRONT_CENTER, { 3, 0, 1, 1, { ID_SCE, ID_CPE, ID_CPE, ID_CPE, ID_LFE, ID_NONE, ID_NONE, ID_NONE } } }, + }; @@ -255,7 +259,7 @@ int transportEnc_writePCE(HANDLE_FDK_BITSTREAM hBs, if ( matrixMixdownA!=0 && ((channelMode==MODE_1_2_2)||(channelMode==MODE_1_2_2_1)) ) { FDKwriteBits(hBs, 1, 1); /* Matrix mixdown present */ FDKwriteBits(hBs, (matrixMixdownA-1)&0x3, 2); /* matrix_mixdown_idx */ - FDKwriteBits(hBs, pseudoSurroundEnable&0x1, 1); /* pseudo_surround_enable */ + FDKwriteBits(hBs, (pseudoSurroundEnable)?1:0, 1); /* pseudo_surround_enable */ } else { FDKwriteBits(hBs, 0, 1); /* Matrix mixdown not present */ @@ -379,7 +383,7 @@ int transportEnc_writeGASpecificConfig( /* Write PCE if channel config is not 1-7 */ if (getChannelConfig(config->channelMode) == 0) { - transportEnc_writePCE(asc, config->channelMode, config->samplingRate, 0, 1, 0, 0, alignAnchor); + transportEnc_writePCE(asc, config->channelMode, config->samplingRate, 0, 1, config->matrixMixdownA, (config->flags&CC_PSEUDO_SURROUND)?1:0, alignAnchor); } if (extFlg) { if (aot == AOT_ER_BSAC) { @@ -474,7 +478,7 @@ int transportEnc_writeASC ( break; } - if (config->extAOT == AOT_SBR || config->extAOT == AOT_PS) + if (config->sbrSignaling==SIG_EXPLICIT_HIERARCHICAL && config->sbrPresent) writeAot(asc, config->extAOT); else writeAot(asc, config->aot); @@ -492,7 +496,7 @@ int transportEnc_writeASC ( FDKwriteBits( asc, getChannelConfig(config->channelMode), 4 ); - if (config->extAOT == AOT_SBR || config->extAOT == AOT_PS) { + if (config->sbrSignaling==SIG_EXPLICIT_HIERARCHICAL && config->sbrPresent) { writeSampleRate(asc, config->extSamplingRate); writeAot(asc, config->aot); } @@ -545,6 +549,26 @@ int transportEnc_writeASC ( break; } + /* backward compatible explicit signaling of extension AOT */ + if (config->sbrSignaling==SIG_EXPLICIT_BW_COMPATIBLE) + { + TP_ASC_EXTENSION_ID ascExtId = ASCEXT_UNKOWN; + + if (config->sbrPresent) { + ascExtId=ASCEXT_SBR; + FDKwriteBits( asc, ascExtId, 11 ); + writeAot(asc, config->extAOT); + FDKwriteBits( asc, 1, 1 ); /* sbrPresentFlag=1 */ + writeSampleRate(asc, config->extSamplingRate); + if (config->psPresent) { + ascExtId=ASCEXT_PS; + FDKwriteBits( asc, ascExtId, 11 ); + FDKwriteBits( asc, 1, 1 ); /* psPresentFlag=1 */ + } + } + + } + /* Make sure all bits are sync'ed */ FDKsyncCache( asc ); |