Commit 8e087bf3 authored by Jean-Michel Trivi's avatar Jean-Michel Trivi

AAC-Decoder: DRC metadata in stream info

Provide relevant DRC metadata information via API needed for DRC
  presentation mode wrapper.

Bug 9428126

Change-Id: I827cd6bdfd2a8799c21935ae32af23739c90a9b6
parent af967fcc
...@@ -144,10 +144,9 @@ to allocate memory for the required structures, and the corresponding mpegFileRe ...@@ -144,10 +144,9 @@ to allocate memory for the required structures, and the corresponding mpegFileRe
files and to de-allocate associated structures. mpegFileRead_Open() tries to detect the bitstream format and files and to de-allocate associated structures. mpegFileRead_Open() tries to detect the bitstream format and
in case of MPEG-4 file format or Raw Packets file format (a Fraunhofer IIS proprietary format) reads the Audio in case of MPEG-4 file format or Raw Packets file format (a Fraunhofer IIS proprietary format) reads the Audio
Specific Config data (ASC). An unsuccessful attempt to recognize the bitstream format requires the user to Specific Config data (ASC). An unsuccessful attempt to recognize the bitstream format requires the user to
provide this information manually (see \ref CommandLineUsage). For any other bitstream formats that are provide this information manually. For any other bitstream formats that are usually applicable in streaming
usually applicable in streaming applications, the decoder itself will try to synchronize and parse the given applications, the decoder itself will try to synchronize and parse the given bitstream fragment using the
bitstream fragment using the FDK transport library. Hence, for streaming applications (without file access) FDK transport library. Hence, for streaming applications (without file access) this step is not necessary.
this step is not necessary.
-# Call aacDecoder_Open() to open and retrieve a handle to a new AAC decoder instance. -# Call aacDecoder_Open() to open and retrieve a handle to a new AAC decoder instance.
\dontinclude main.cpp \dontinclude main.cpp
...@@ -571,10 +570,25 @@ typedef struct ...@@ -571,10 +570,25 @@ typedef struct
UINT numTotalAccessUnits; /*!< This is the number of total access units that have passed through the decoder. */ UINT numTotalAccessUnits; /*!< This is the number of total access units that have passed through the decoder. */
UINT numBadAccessUnits; /*!< This is the number of total access units that were considered with errors from numTotalBytes. */ UINT numBadAccessUnits; /*!< This is the number of total access units that were considered with errors from numTotalBytes. */
/* Metadata */
SCHAR drcProgRefLev; /*!< DRC program reference level. Defines the reference level below full-scale.
It is quantized in steps of 0.25dB. The valid values range from 0 (0 dBFS) to 127 (-31.75 dBFS).
It is used to reflect the average loudness of the audio in LKFS accoring to ITU-R BS 1770.
If no level has been found in the bitstream the value is -1. */
SCHAR drcPresMode; /*!< DRC presentation mode. According to ETSI TS 101 154, this field indicates whether
light (MPEG-4 Dynamic Range Control tool) or heavy compression (DVB heavy compression)
dynamic range control shall take priority on the outputs.
For details, see ETSI TS 101 154, table C.33. Possible values are: \n
-1: No corresponding metadata found in the bitstream \n
0: DRC presentation mode not indicated \n
1: DRC presentation mode 1 \n
2: DRC presentation mode 2 \n
3: Reserved */
} CStreamInfo; } CStreamInfo;
typedef struct AAC_DECODER_INSTANCE *HANDLE_AACDECODER; typedef struct AAC_DECODER_INSTANCE *HANDLE_AACDECODER; /*!< Pointer to a AAC decoder instance. */
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
......
...@@ -145,6 +145,8 @@ void aacDecoder_drcInit ( ...@@ -145,6 +145,8 @@ void aacDecoder_drcInit (
/* initial program ref level = target ref level */ /* initial program ref level = target ref level */
self->progRefLevel = pParams->targetRefLevel; self->progRefLevel = pParams->targetRefLevel;
self->progRefLevelPresent = 0;
self->presMode = -1;
} }
...@@ -572,7 +574,7 @@ static int aacDecoder_drcReadCompression ( ...@@ -572,7 +574,7 @@ static int aacDecoder_drcReadCompression (
return 0; return 0;
} }
FDKreadBits(bs, 2); /* dolby_surround_mode */ FDKreadBits(bs, 2); /* dolby_surround_mode */
FDKreadBits(bs, 2); /* presentation_mode */ pDrcBs->presMode = FDKreadBits(bs, 2); /* presentation_mode */
FDKreadBits(bs, 1); /* stereo_downmix_mode */ FDKreadBits(bs, 1); /* stereo_downmix_mode */
if (FDKreadBits(bs, 1) != 0) { /* reserved, set to 0 */ if (FDKreadBits(bs, 1) != 0) { /* reserved, set to 0 */
return 0; return 0;
...@@ -803,9 +805,15 @@ static int aacDecoder_drcExtractAndMap ( ...@@ -803,9 +805,15 @@ static int aacDecoder_drcExtractAndMap (
*/ */
if (pThreadBs->progRefLevel >= 0) { if (pThreadBs->progRefLevel >= 0) {
self->progRefLevel = pThreadBs->progRefLevel; self->progRefLevel = pThreadBs->progRefLevel;
self->progRefLevelPresent = 1;
self->prlExpiryCount = 0; /* Got a new value -> Reset counter */ self->prlExpiryCount = 0; /* Got a new value -> Reset counter */
} }
if (drcPayloadType == DVB_DRC_ANC_DATA) {
/* Announce the presentation mode of this valid thread. */
self->presMode = pThreadBs->presMode;
}
/* SCE, CPE and LFE */ /* SCE, CPE and LFE */
for (ch = 0; ch < validChannels; ch++) { for (ch = 0; ch < validChannels; ch++) {
int mapedChannel = channelMapping[ch]; int mapedChannel = channelMapping[ch];
...@@ -825,6 +833,7 @@ static int aacDecoder_drcExtractAndMap ( ...@@ -825,6 +833,7 @@ static int aacDecoder_drcExtractAndMap (
if ( (pParams->expiryFrame > 0) if ( (pParams->expiryFrame > 0)
&& (self->prlExpiryCount++ > pParams->expiryFrame) ) && (self->prlExpiryCount++ > pParams->expiryFrame) )
{ /* The program reference level is too old, so set it back to the target level. */ { /* The program reference level is too old, so set it back to the target level. */
self->progRefLevelPresent = 0;
self->progRefLevel = pParams->targetRefLevel; self->progRefLevel = pParams->targetRefLevel;
self->prlExpiryCount = 0; self->prlExpiryCount = 0;
} }
...@@ -1156,3 +1165,24 @@ int aacDecoder_drcEpilog ( ...@@ -1156,3 +1165,24 @@ int aacDecoder_drcEpilog (
return err; return err;
} }
/*
* Export relevant metadata info from bitstream payload.
*/
void aacDecoder_drcGetInfo (
HANDLE_AAC_DRC self,
SCHAR *pPresMode,
SCHAR *pProgRefLevel )
{
if (self != NULL) {
if (pPresMode != NULL) {
*pPresMode = self->presMode;
}
if (pProgRefLevel != NULL) {
if (self->progRefLevelPresent) {
*pProgRefLevel = self->progRefLevel;
} else {
*pProgRefLevel = -1;
}
}
}
}
...@@ -173,5 +173,17 @@ int aacDecoder_drcEpilog ( ...@@ -173,5 +173,17 @@ int aacDecoder_drcEpilog (
UCHAR channelMapping[], UCHAR channelMapping[],
int validChannels ); int validChannels );
/**
* \brief Get metadata information found in bitstream.
* \param self DRC module instance handle.
* \param pPresMode Pointer to field where the presentation mode will be written to.
* \param pProgRefLevel Pointer to field where the program reference level will be written to.
* \return Nothing.
*/
void aacDecoder_drcGetInfo (
HANDLE_AAC_DRC self,
SCHAR *pPresMode,
SCHAR *pProgRefLevel );
#endif /* AACDEC_DRC_H */ #endif /* AACDEC_DRC_H */
...@@ -124,6 +124,7 @@ typedef struct ...@@ -124,6 +124,7 @@ typedef struct
{ {
UINT excludedChnsMask; UINT excludedChnsMask;
SCHAR progRefLevel; SCHAR progRefLevel;
SCHAR presMode; /* Presentation mode: 0 (not indicated), 1, 2, and 3 (reserved). */
SCHAR pceInstanceTag; SCHAR pceInstanceTag;
CDrcChannelData channelData; CDrcChannelData channelData;
...@@ -156,9 +157,11 @@ typedef struct ...@@ -156,9 +157,11 @@ typedef struct
USHORT numPayloads; /* The number of DRC data payload elements found within frame */ USHORT numPayloads; /* The number of DRC data payload elements found within frame */
USHORT numThreads; /* The number of DRC data threads extracted from the found payload elements */ USHORT numThreads; /* The number of DRC data threads extracted from the found payload elements */
SCHAR progRefLevel; /* Program reference level for all channels */ SCHAR progRefLevel; /* Program reference level for all channels */
UCHAR progRefLevelPresent; /* Program reference level found in bitstream */
UINT prlExpiryCount; /* Counter that can be used to monitor the life time of the program reference level. */ UINT prlExpiryCount; /* Counter that can be used to monitor the life time of the program reference level. */
SCHAR presMode; /* Presentation mode as defined in ETSI TS 101 154 */
UCHAR dvbAncDataAvailable; /* Flag that indicates whether DVB ancillary data is present or not */ UCHAR dvbAncDataAvailable; /* Flag that indicates whether DVB ancillary data is present or not */
UINT dvbAncDataPosition; /* Used to store the DVB ancillary data payload position in the bitstream (only one per frame) */ UINT dvbAncDataPosition; /* Used to store the DVB ancillary data payload position in the bitstream (only one per frame) */
UINT drcPayloadPosition[MAX_DRC_THREADS]; /* Used to store the DRC payload positions in the bitstream */ UINT drcPayloadPosition[MAX_DRC_THREADS]; /* Used to store the DRC payload positions in the bitstream */
......
...@@ -719,6 +719,10 @@ void CStreamInfoInit(CStreamInfo *pStreamInfo) ...@@ -719,6 +719,10 @@ void CStreamInfoInit(CStreamInfo *pStreamInfo)
pStreamInfo->frameSize = 0; pStreamInfo->frameSize = 0;
pStreamInfo->outputDelay = 0; pStreamInfo->outputDelay = 0;
/* DRC */
pStreamInfo->drcProgRefLev = -1; /* set program reference level to not indicated */
pStreamInfo->drcPresMode = -1; /* default: presentation mode not indicated */
} }
/*! /*!
...@@ -1785,6 +1789,13 @@ LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame( ...@@ -1785,6 +1789,13 @@ LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame(
/* Add additional concealment delay */ /* Add additional concealment delay */
self->streamInfo.outputDelay += CConcealment_GetDelay(&self->concealCommonData) * self->streamInfo.aacSamplesPerFrame; self->streamInfo.outputDelay += CConcealment_GetDelay(&self->concealCommonData) * self->streamInfo.aacSamplesPerFrame;
/* Map DRC data to StreamInfo structure */
aacDecoder_drcGetInfo (
self->hDrcInfo,
&self->streamInfo.drcPresMode,
&self->streamInfo.drcProgRefLev
);
/* Reorder channel type information tables. */ /* Reorder channel type information tables. */
{ {
AUDIO_CHANNEL_TYPE types[(8)]; AUDIO_CHANNEL_TYPE types[(8)];
......
...@@ -110,7 +110,7 @@ amm-info@iis.fraunhofer.de ...@@ -110,7 +110,7 @@ amm-info@iis.fraunhofer.de
/* Decoder library info */ /* Decoder library info */
#define AACDECODER_LIB_VL0 2 #define AACDECODER_LIB_VL0 2
#define AACDECODER_LIB_VL1 5 #define AACDECODER_LIB_VL1 5
#define AACDECODER_LIB_VL2 8 #define AACDECODER_LIB_VL2 9
#define AACDECODER_LIB_TITLE "AAC Decoder Lib" #define AACDECODER_LIB_TITLE "AAC Decoder Lib"
#define AACDECODER_LIB_BUILD_DATE __DATE__ #define AACDECODER_LIB_BUILD_DATE __DATE__
#define AACDECODER_LIB_BUILD_TIME __TIME__ #define AACDECODER_LIB_BUILD_TIME __TIME__
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment