Update contrib.
1 // Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
2 // All rights reserved.
3 // This component and the accompanying materials are made available
4 // under the terms of "Eclipse Public License v1.0"
5 // which accompanies this distribution, and is available
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
16 #ifndef __SBCENCODER_H__
17 #define __SBCENCODER_H__
20 #include <mmf/server/mmfcodec.h>
22 #include "SBCFrameParameters.h"
24 const TUint8 KSbcMaxBlocks = 16;
25 const TUint8 KSbcMaxChannels = 2;
26 const TUint8 KSbcMaxSubbands = 8;
29 This class is for manipulating (reading/writing) raw bit stream.
30 It is used in sbc encoder for generating sbc frame bit stream.
33 class CBitStreamParser : public CBase
36 static CBitStreamParser* NewLC(TDes8& aBitStream);
39 /** relative position */
40 TUint8 ReadBits(TInt aBitsToRead);
41 void WriteBits(TInt aBitsToWrite, TUint8 aBitsValue);
43 inline TUint8 ReadByte();
44 inline void WriteByte(TUint8 aByteValue);
46 /** absolute position */
47 inline void SetPosition(TUint aByteOffset, TUint8 aBitOffset);
48 inline void Position(TUint& aByteOffset, TUint8& aBitOffset) const;
51 CBitStreamParser(TDes8& aBitStream);
64 This class is for checking and generating SBC CRC code.
65 It is used in sbc encoder for generating SBC CRC check number.
68 class CSbcCRCCalculator : public CBase
74 void InputBit(TUint8 aBit);
75 void InputBits(TUint8 aBits, TUint8 aValue);
76 void InputByte(TUint8 aByte);
78 TUint8 ShiftRegister();
81 TUint8 iShiftRegister;
85 This class is for encoding one SBC frame
88 class CSBCFrameEncoder : public CBase
91 static CSBCFrameEncoder* NewL();
93 void EncodeFrameL(const TDesC8& aSrc, TDes8& aFrame);
94 void Configure(const TSBCFrameParameters& aParameters);
102 void Analyse(const TDesC8& aSrc);
103 void CalcScaleFactors();
105 void CalcBitAllocation();
108 void AnalyseMono(const TInt16 aInputSamples[]);
109 void AnalyseOneChannel(const TInt16 aInputSamples[], TUint8 aChannel);
110 void Analyse4Subbands(const TInt16 aInputSamples[], TUint8 aBlock, TUint8 aChannel);
111 void Analyse8Subbands(const TInt16 aInputSamples[], TUint8 aBlock, TUint8 aChannel);
113 void DoJoinSubbands();
115 void CalcBitAllocIndependent();
116 void CalcBitneedIndependent(TInt8 aBitneed[], const TUint8 aScaleFactors[]);
117 TInt8 MaxBitneedIndependent(const TInt8 aBitneed[]);
118 TInt8 CalcBitSlicesIndependent(const TInt8 aBitneed[], TInt& aBitCount);
119 void DistributeBitsIndependent(const TInt8 aBitneed[], TUint8 aBits[]);
121 void CalcBitAllocCombined();
122 void CalcBitneedCombined(TInt8 aBitneed[][KSbcMaxSubbands]);
123 TInt8 MaxBitneedCombined(const TInt8 aBitneed[][KSbcMaxSubbands]);
124 TInt8 CalcBitSlicesCombined(const TInt8 aBitneed[][KSbcMaxSubbands], TInt& aBitCount);
125 void DistributeBitsCombined(const TInt8 aBitneed[][KSbcMaxSubbands]);
129 /** writing result back */
130 void WriteFrameL(TDes8& aFrame);
131 void WriteHeader(CBitStreamParser& aParser);
132 void WriteScaleFactors(CBitStreamParser& aParser);
133 void WriteData(CBitStreamParser& aParser);
134 void WritePaddingL(CBitStreamParser& aParser);
137 /** input parameters, set before encode */
138 TSBCFrameParameters iParameters;
140 TInt16 iAnalysisSamples[2][KSbcMaxSubbands * 10];
141 TUint8 iScaleFactors[2][KSbcMaxSubbands];
142 TUint8 iBits[2][KSbcMaxSubbands];
143 TInt32 iOutputSamples[KSbcMaxBlocks][2][KSbcMaxSubbands];
144 TUint8 iJoin[KSbcMaxSubbands];
148 This class is for encoding one SBC frame
151 class CSBCEncoder : public CMMFCodec
154 static CMMFCodec* NewL(TAny* aInitParams);
155 virtual ~CSBCEncoder();
156 void ConfigureL(TUid aConfigType, const TDesC8& aConfigData);
157 TCodecProcessResult ProcessL(const CMMFBuffer& aSrc, CMMFBuffer& aDst);
161 void ConstructL(TAny* aInitParams);
164 TUint EncodeFrameL(const TDesC8& aSrc, TDes8& aDst);
165 TUint CachePcmSamplesL(const CMMFDataBuffer& aSrc, TUint aSrcPos);
166 TUint CachedSampleSize();
169 /** input parameters, set before encode */
170 TSBCFrameParameters iParameters;
173 /** CSBCFrameEncoder encodes each frame */
174 CSBCFrameEncoder* iSbcFrameEncoder;
175 TUint iSbcFrameLength;
177 /** pcm audio sample cach */
178 HBufC8* iPcmSampleCach;
181 #endif // __SBCENCODER_H__