diff -r 000000000000 -r 1bce908db942 multimediacommscontroller/mmccamrpayloadformat/src/AmrPayloadEncoderOA.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommscontroller/mmccamrpayloadformat/src/AmrPayloadEncoderOA.cpp Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,180 @@ +/* +* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "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: +* +* Description: PayloadFormat plugin capable to read RTP payload containing +* Amr audio. +* +*/ + + + + +// INCLUDE FILES +#include "amrpayloadencoderoa.h" +#include "amrpayloadheaderoa.h" +#include "amrtocentryoa.h" + + +// ============================ MEMBER FUNCTIONS ============================= + +// --------------------------------------------------------------------------- +// CAmrPayloadEncoderOA::CAmrPayloadEncoderOA +// C++ default constructor can NOT contain any code, that +// might leave. +// --------------------------------------------------------------------------- +// +CAmrPayloadEncoderOA::CAmrPayloadEncoderOA( TBool aIsNb ) + : CAmrPayloadEncoder( aIsNb ) + { + DP_AMR_ENCODE( "CAmrPayloadEncoderOA::CAmrPayloadEncoderOA" ); + + CAmrPayloadEncoderOA::InitializeFrameEncoder( ); + } + + +// --------------------------------------------------------------------------- +// CAmrPayloadEncoderOA::ConstructL +// Symbian 2nd phase constructor can leave. +// --------------------------------------------------------------------------- +// +void CAmrPayloadEncoderOA::ConstructL() + { + DP_AMR_ENCODE( "CAmrPayloadEncoderOA::ConstructL" ); + + // Allocate memory for iHeaderEncoder and iTocEntryEncoder and set them + // to NULL to avoid codescanner errors + delete iHeaderEncoder; + iHeaderEncoder = NULL; + delete iTocEntryEncoder; + iTocEntryEncoder = NULL; + + iHeaderEncoder = CAmrPayloadHeaderOA::NewL(); + iTocEntryEncoder = CAmrTocEntryOA::NewL(); + } + + +// --------------------------------------------------------------------------- +// CAmrPayloadEncoder::NewL +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +CAmrPayloadEncoderOA* CAmrPayloadEncoderOA::NewL( TBool aIsNb ) + { + DP_AMR_ENCODE( "CAmrPayloadEncoderOA::NewL" ); + + CAmrPayloadEncoderOA* self = new( ELeave ) CAmrPayloadEncoderOA( aIsNb ); + + CleanupStack::PushL( self ); + self->ConstructL( ); + CleanupStack::Pop( self ); + + return self; + } + + +// --------------------------------------------------------------------------- +// CAmrPayloadEncoderOA::~CAmrPayloadEncoderOA +// Destructor +// --------------------------------------------------------------------------- +// +CAmrPayloadEncoderOA::~CAmrPayloadEncoderOA() + { + DP_AMR_ENCODE( "CAmrPayloadEncoderOA::~CAmrPayloadEncoderOA" ); + } + + +// --------------------------------------------------------------------------- +// CAmrPayloadEncoderOA::EncodeFrame +// Encode a received Amr frame into the payload buffer. +// --------------------------------------------------------------------------- +// +TBool CAmrPayloadEncoderOA::EncodeFrame( TInt aChannel, + TAmrFrameType aFrameType, + TUint8 aFrameQualityInd, + const TDes8& aFrameData ) + { + DP_AMR_ENCODE( "CAmrPayloadEncoderOA::EncodeFrame" ); + + TBool ret = CAmrPayloadEncoder::EncodeFrame( aChannel, aFrameType, + aFrameQualityInd, aFrameData ); + if ( EFalse == ret ) + { + // Encoding a frame data only. Payload Header and TOCs haven't been filled + // Padding frame data to Byte boundary. + if ( iFrameEncoder.BitIndex( ) != 0 ) + { + iFrameEncoder.Encode( 0, ( KBitsIn1Byte - iFrameEncoder.BitIndex( ) ) ); + } + } + else + { + InitializeFrameEncoder(); + } + + return ret; + } + + +// --------------------------------------------------------------------------- +// CAmrPayloadEncoderOA::SetChannelCount +// Set number of audio channels. +// --------------------------------------------------------------------------- +// +TInt CAmrPayloadEncoderOA::SetChannelCount( TInt aChannelCount ) + { + DP_AMR_ENCODE( "CAmrPayloadEncoderOA::SetChannelCount" ); + + TInt ret = CAmrPayloadFormatter::SetChannelCount( aChannelCount ); + InitializeFrameEncoder( ); + return ret; + } + + +// --------------------------------------------------------------------------- +// CAmrPayloadEncoderOA::SetFrameBlockCount +// Set number of Amr frame blocks included in one RTP packet. +// --------------------------------------------------------------------------- +// +TInt CAmrPayloadEncoderOA::SetFrameBlockCount( TInt aFrameblockCount ) + { + DP_AMR_ENCODE( "CAmrPayloadEncoderOA::SetFrameBlockCount" ); + + TInt ret = CAmrPayloadFormatter::SetFrameBlockCount( aFrameblockCount ); + InitializeFrameEncoder(); + return ret; + } + + +// --------------------------------------------------------------------------- +// CAmrPayloadEncoderOA::InitializeFrameEncoder +// Initialize frame encoder ( Stream Encoder ). Starting position of first +// AMR frame data is calculated. Refer to RFC3267 4.4. +// --------------------------------------------------------------------------- +// +void CAmrPayloadEncoderOA::InitializeFrameEncoder() + { + DP_AMR_ENCODE( "CAmrPayloadEncoderOA::InitializeFrameEncoder" ); + + // Total number of TOCs: iFrameCount = iChannelCount * iFrameBlockCount + // In OA mode, Bit Index always equals to Zero. + TInt numOfRedFrames( 0 ); + if ( iRedIntervalCollected ) + { + numOfRedFrames = iFrameDatas.Count(); + } + + TInt frameByteIndex = ( KHeaderBitsOA + + KTOCFieldBitsOA * ( iFrameCount + numOfRedFrames ) ) / KBitsIn1Byte; + + iFrameEncoder.Initialize( iPayload, frameByteIndex, 0 ); + }