diff -r 000000000000 -r 951a5db380a0 videoeditorengine/mp3aacManipLib/AACGain/inc/sbr_codec.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videoeditorengine/mp3aacManipLib/AACGain/inc/sbr_codec.h Fri Jan 29 14:08:33 2010 +0200 @@ -0,0 +1,314 @@ +/* +* Copyright (c) 2010 Ixonos Plc. +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - Initial contribution +* +* Contributors: +* Ixonos Plc +* +* Description: +* +*/ + + +/* + \file + \brief SBR codec interface $Revision: 1.1.1.1.4.1 $ +*/ + +/************************************************************************** + sbr_codec.h - SBR codec interface. + + Author(s): Juha Ojanpera + Copyright (c) 2004 by Nokia Research Center, Multimedia Technologies. + *************************************************************************/ + +#ifndef SBR_CODEC_H_ +#define SBR_CODEC_H_ + +/*-- Project Headers. --*/ +#include "nok_bits.h" +#include "defines.h" + +#pragma warning( disable : 4244) + +#define SBR_EXTENSION (13) /*-- 1101 --*/ +#define SBR_EXTENSION_CRC (14) /*-- 1110 --*/ +#define MAX_NR_ELEMENTS (2) +#define MAX_SBR_BYTES (128) + +/** + * Error codes for SBR processing. + */ +typedef enum +{ + SBRDEC_OK = 0, + SBRDEC_CONCEAL, + SBRDEC_NOSYNCH, + SBRDEC_ILLEGAL_PROGRAM, + SBRDEC_ILLEGAL_TAG, + SBRDEC_ILLEGAL_CHN_CONFIG, + SBRDEC_ILLEGAL_SECTION, + SBRDEC_ILLEGAL_SCFACTORS, + SBRDEC_ILLEGAL_PULSE_DATA, + SBRDEC_MAIN_PROFILE_NOT_IMPLEMENTED, + SBRDEC_GC_NOT_IMPLEMENTED, + SBRDEC_ILLEGAL_PLUS_ELE_ID, + SBRDEC_CREATE_ERROR, + SBRDEC_NOT_INITIALIZED + +} SBR_ERROR; + +/** + * SBR element tags, these are the same as used in AAC also. + */ +typedef enum +{ + SBR_ID_SCE = 0, + SBR_ID_CPE, + SBR_ID_CCE, + SBR_ID_LFE, + SBR_ID_DSE, + SBR_ID_PCE, + SBR_ID_FIL, + SBR_ID_END + +} SBR_ELEMENT_ID; + +/** + * Bitstream element for SBR payload data. + */ +typedef struct +{ + /** + * Length of payload data. + */ + int16 Payload; + + /** + * Channel element ID for the associated SBR data. + */ + int16 ElementID; + + /** + * Offset to the start of the channel element, in bits. + */ + int32 elementOffset; + + /** + * Length of the channel element, in bits. + */ + int32 chElementLen; + + /** + * Decoding status of SBR header. + */ + uint8 headerStatus; + + /** + * Type of SBR element (with or without CRC codeword). + */ + int16 ExtensionType; + + /** + * SBR bitstream data. + */ + uint8 *Data; + +} SbrElementStream; + +typedef struct +{ + int16 NrElements; + SbrElementStream sbrElement[MAX_NR_ELEMENTS]; + +} SbrBitStream; + +/** + * SBR handle. + */ +typedef struct SBR_Decoder_Instance SBR_Decoder; + +/** + * Creates SBR bitstream handle. + * + * Possible leave codes: + * - KErrNoMemory if memory allocation fails + * + * @return Handle to SBR bitstream handle + * + */ +SbrBitStream * +OpenSBRBitStreamL(void); + +/** + * Closes SBR bitstream handle. + * + * @param Bitstr Handle to SBR bitstream to be deleted + * @return NULL + * + */ +SbrBitStream * +CloseSBRBitStream(SbrBitStream *Bitstr); + +/** + * Creates SBR decoding/parsing handle. + * + * Possible leave codes: + * - KErrNoMemory if memory allocation fails + * + * @param sampleRate Sample rate of the AAC bitstream + * @param samplesPerFrame Frame length of the AAC stream (1024 or 960) + * @param isStereo 1 if stereo AAC stream, 0 otherwise (=mono) + * @param isDualMono 1 if two single channel elements present in the AAC bistream, 0 otherwise + * @return Handle to SBR decoding/parsing handle + * + */ +SBR_Decoder * +OpenSBRDecoderL(int32 sampleRate, + int16 samplesPerFrame, + uint8 isStereo, + uint8 isDualMono); + +/** + * Closes SBR decoding handle. + * + * @param Bitstr Handle to SBR decoding/parsing to be deleted + * @return NULL + * + */ +SBR_Decoder * +CloseSBR(SBR_Decoder *self); + +/** + * Parses the SBR payload data and writes the modified bitstream element(s) + * to output AAC bitstream. + * + * @param bsIn Handle to AAC input bitstream + * @param bsOut Handle to AAC output bitstream + * @param self Handle to SBR parser + * @param Bitstr Handle to SBR bitstream element(s) + * @param decVal Volume level adjustment factor + * @return Number of bytes written to output bitstream + * + */ +int16 +ParseSBR(TBitStream *bsIn, + TBitStream *bsOut, + SBR_Decoder *self, + SbrBitStream *Bitstr, + int16 decVal); + +/** + * Chacks whether parametric stereo tool is enabled in the SBR elements. + * + * @param self Handle to SBR parser + * @param Bitstr Handle to SBR bitstream element(s) + * @return 1 if parametric stereo found, 0 otherwise + * + */ +uint8 +IsSBRParametricStereoEnabled(SBR_Decoder *self, SbrBitStream *Bitstr); + +/** + * Chacks whether SBR elements present in the bistream. + * + * @param Bitstr Handle to SBR bitstream element(s) + * @return 1 if SBR elements found, 0 otherwise + * + */ +uint8 +IsSBREnabled(SbrBitStream *Bitstr); + +/** + * Reads SBR payload data from AAC bitstream into SBR bitstream handle. + * + * @param bs Handle to AAC bitstream + * @param streamSBR Handle to SBR bitstream handle + * @param extension_type SBR payload type + * @param prev_element Channel element type prior the fill element + * @param dataCount Length of SBR payload data, in bytes + * @return 1 if SBR read, 0 otherwise (in which case the callee should read the data) + * + */ +int16 +ReadSBRExtensionData(TBitStream *bs, + SbrBitStream *streamSBR, + int16 extension_type, + int16 prev_element, + int16 dataCount); + +/** + * Initializes SBR handle for silence data generation. + * + * @param sbrDec Handle to SBR decoder + * @param isStereo 1 if stereo AAC stream, 0 otherwise (=mono) + * @param isParametricStereo 1 if parametric stereo should be included in the SBR data + * + */ +void +InitSBRSilenceData(SBR_Decoder *sbrDec, uint8 isStereo, uint8 isParametricStereo); + +/** + * Writes silence to SBR channel element. Please note that this method is supposed + * to be called inside AAC bitstream multiplexer and is therefore part of encoding. + * If you want to upgrade plain AAC bitstream to eAAC+, use 'GenerateSBRSilenceDataL()' + * first to generate the silence bits for SBR, then parse the AAC bitstream (so that the + * channel element positions and their length are known) and finally call + * 'WriteSBRSilence()' to write the output eAAC+ bitstream. + * + * @param sbrDecoder Handle to SBR codec + * @param bsOut Handle to output (AAC) bitstream + * @param isStereo 1 if stereo AAC stream, 0 otherwise (=mono) + * @return Length of SBR silence data, in bits + * + */ +int16 +WriteSBRSilenceElement(SBR_Decoder *sbrDecoder, TBitStream *bsOut, uint8 isStereo); + +/** + * Generates silence bits for SBR bitstream. + * + * Possible leave codes: + * - KErrNoMemory if memory allocation fails + * + * @param OutBuffer Output buffer receiving silence data bits + * @param OutBufferSize Size of output buffer + * @param sampleRate Sample rate of the AAC bitstream + * @param isStereo 1 if stereo AAC stream, 0 otherwise (=mono) + * @param isParametricStereo 1 if parametric stereo should be included in the SBR data + * @return Length of SBR silence data, in bits + * + */ +int16 +GenerateSBRSilenceDataL(uint8 *OutBuffer, + int16 OutBufferSize, + int32 sampleRate, + uint8 isStereo, + uint8 isParametricStereo); + +/** + * Writes silence to the SBR part of the AAC bitstream. + * + * @param bsIn AAC input bitstream + * @param bsOut Output bitstream (AAC + SBR) + * @param streamSBR Handle to SBR bitstream element + * @param SbrBuffer Payload data to generate SBR silence + * @param SbrBits Length of SBR silence, in bits + * @return Length of AAC + SBR bitstream, in bytes + * + */ +int16 +WriteSBRSilence(TBitStream *bsIn, + TBitStream *bsOut, + SbrBitStream *streamSBR, + uint8 *SbrBuffer, + int16 SbrBits); + +#endif /*-- SBR_CODEC_H_ --*/