sl@0: // Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: #ifndef __BTSBCENCODER_H__ sl@0: #define __BTSBCENCODER_H__ sl@0: sl@0: #include sl@0: #include sl@0: sl@0: #include "BtSBCFrameParameters.h" sl@0: sl@0: const TUint8 KSbcMaxBlocks = 16; sl@0: const TUint8 KSbcMaxChannels = 2; sl@0: const TUint8 KSbcMaxSubbands = 8; sl@0: sl@0: /** sl@0: This class is for manipulating (reading/writing) raw bit stream. sl@0: It is used in sbc encoder for generating sbc frame bit stream. sl@0: @internalComponent sl@0: */ sl@0: class CBitStreamParser : public CBase sl@0: { sl@0: public: sl@0: static CBitStreamParser* NewLC(TDes8& aBitStream); sl@0: void Reset(); sl@0: sl@0: /** relative position */ sl@0: TUint8 ReadBits(TInt aBitsToRead); sl@0: void WriteBits(TInt aBitsToWrite, TUint8 aBitsValue); sl@0: sl@0: inline TUint8 ReadByte(); sl@0: inline void WriteByte(TUint8 aByteValue); sl@0: sl@0: /** absolute position */ sl@0: inline void SetPosition(TUint aByteOffset, TUint8 aBitOffset); sl@0: inline void Position(TUint& aByteOffset, TUint8& aBitOffset) const; sl@0: sl@0: private: sl@0: CBitStreamParser(TDes8& aBitStream); sl@0: ~CBitStreamParser(); sl@0: sl@0: void ConstructL(); sl@0: sl@0: private: sl@0: TDes8& iBitStream; sl@0: TUint8* iPtr; sl@0: TUint iByteOffset; sl@0: TUint8 iBitOffset; sl@0: }; sl@0: sl@0: /** sl@0: This class is for checking and generating SBC CRC code. sl@0: It is used in sbc encoder for generating SBC CRC check number. sl@0: @internalComponent sl@0: */ sl@0: class CSbcCRCCalculator : public CBase sl@0: { sl@0: public: sl@0: CSbcCRCCalculator(); sl@0: sl@0: void Reset(); sl@0: void InputBit(TUint8 aBit); sl@0: void InputBits(TUint8 aBits, TUint8 aValue); sl@0: void InputByte(TUint8 aByte); sl@0: sl@0: TUint8 ShiftRegister(); sl@0: sl@0: private: sl@0: TUint8 iShiftRegister; sl@0: }; sl@0: sl@0: /** sl@0: This class is for encoding one SBC frame sl@0: @internalComponent sl@0: */ sl@0: class CSBCFrameEncoder : public CBase sl@0: { sl@0: public: sl@0: static CSBCFrameEncoder* NewL(); sl@0: ~CSBCFrameEncoder(); sl@0: void EncodeFrameL(const TDesC8& aSrc, TDes8& aFrame); sl@0: void Configure(const TSBCFrameParameters& aParameters); sl@0: void Reset(); sl@0: sl@0: private: sl@0: CSBCFrameEncoder(); sl@0: void ConstructL(); sl@0: sl@0: /** encode frame */ sl@0: void Analyse(const TDesC8& aSrc); sl@0: void CalcScaleFactors(); sl@0: void JoinSubbands(); sl@0: void CalcBitAllocation(); sl@0: void Quantize(); sl@0: sl@0: void AnalyseMono(const TInt16 aInputSamples[]); sl@0: void AnalyseOneChannel(const TInt16 aInputSamples[], TUint8 aChannel); sl@0: void Analyse4Subbands(const TInt16 aInputSamples[], TUint8 aBlock, TUint8 aChannel); sl@0: void Analyse8Subbands(const TInt16 aInputSamples[], TUint8 aBlock, TUint8 aChannel); sl@0: sl@0: void DoJoinSubbands(); sl@0: sl@0: void CalcBitAllocIndependent(); sl@0: void CalcBitneedIndependent(TInt8 aBitneed[], const TUint8 aScaleFactors[]); sl@0: TInt8 MaxBitneedIndependent(const TInt8 aBitneed[]); sl@0: TInt8 CalcBitSlicesIndependent(const TInt8 aBitneed[], TInt& aBitCount); sl@0: void DistributeBitsIndependent(const TInt8 aBitneed[], TUint8 aBits[]); sl@0: sl@0: void CalcBitAllocCombined(); sl@0: void CalcBitneedCombined(TInt8 aBitneed[][KSbcMaxSubbands]); sl@0: TInt8 MaxBitneedCombined(const TInt8 aBitneed[][KSbcMaxSubbands]); sl@0: TInt8 CalcBitSlicesCombined(const TInt8 aBitneed[][KSbcMaxSubbands], TInt& aBitCount); sl@0: void DistributeBitsCombined(const TInt8 aBitneed[][KSbcMaxSubbands]); sl@0: sl@0: TUint8 CalcCRC(); sl@0: sl@0: /** writing result back */ sl@0: void WriteFrameL(TDes8& aFrame); sl@0: void WriteHeader(CBitStreamParser& aParser); sl@0: void WriteScaleFactors(CBitStreamParser& aParser); sl@0: void WriteData(CBitStreamParser& aParser); sl@0: void WritePaddingL(CBitStreamParser& aParser); sl@0: sl@0: private: sl@0: /** input parameters, set before encode */ sl@0: TSBCFrameParameters iParameters; sl@0: sl@0: TInt16 iAnalysisSamples[2][KSbcMaxSubbands * 10]; sl@0: TUint8 iScaleFactors[2][KSbcMaxSubbands]; sl@0: TUint8 iBits[2][KSbcMaxSubbands]; sl@0: TInt32 iOutputSamples[KSbcMaxBlocks][2][KSbcMaxSubbands]; sl@0: TUint8 iJoin[KSbcMaxSubbands]; sl@0: }; sl@0: sl@0: /** sl@0: This class is for encoding one SBC frame sl@0: @internalComponent sl@0: */ sl@0: class CSBCEncoder : public CMMFCodec sl@0: { sl@0: public: sl@0: static CMMFCodec* NewL(TAny* aInitParams); sl@0: virtual ~CSBCEncoder(); sl@0: void ConfigureL(TUid aConfigType, const TDesC8& aConfigData); sl@0: TCodecProcessResult ProcessL(const CMMFBuffer& aSrc, CMMFBuffer& aDst); sl@0: sl@0: private: sl@0: CSBCEncoder(); sl@0: void ConstructL(TAny* aInitParams); sl@0: void ResetL(); sl@0: sl@0: TUint EncodeFrameL(const TDesC8& aSrc, TDes8& aDst); sl@0: TUint CachePcmSamplesL(const CMMFDataBuffer& aSrc, TUint aSrcPos); sl@0: TUint CachedSampleSize(); sl@0: sl@0: private: sl@0: /** input parameters, set before encode */ sl@0: TSBCFrameParameters iParameters; sl@0: TUint iPcmFrameSize; sl@0: sl@0: /** CSBCFrameEncoder encodes each frame */ sl@0: CSBCFrameEncoder* iSbcFrameEncoder; sl@0: TUint iSbcFrameLength; sl@0: sl@0: /** pcm audio sample cach */ sl@0: HBufC8* iPcmSampleCach; sl@0: }; sl@0: sl@0: #endif // __BTSBCENCODER_H__ sl@0: