diff -r 000000000000 -r 1bce908db942 multimediacommscontroller/mmccamrpayloadformat/inc/amrpayloadformatwrite.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommscontroller/mmccamrpayloadformat/inc/amrpayloadformatwrite.h Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,371 @@ +/* +* Copyright (c) 2004-2007 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: Class definition for the AMR/RTP payload format plugin +* +*/ + + + + +#ifndef AMRPAYLOADFORMATWRITE_H +#define AMRPAYLOADFORMATWRITE_H + +// INCLUDES +#include +#include +#include +#include "rtpheader.h" +#include "formatstatemachine.h" +#include "amrpayloadformatter.h" +#include "mccinternalcodecs.h" + + +// FORWARD DECLARATIONS +class CAmrPayloadEncoder; +class CAmrPayloadDecoder; +class MMccRtpDataSink; + +/** +* The CAmrPayloadFormatWrite class implements the MMF format plugin for encoding of RTP payload +* format for AMR codec. Refer to IETF RFC3267. +* This class receives one or more AMR frames and converts them into payload data +* of an RTP packet. +* +* @lib Mccamrplformat.dll +* @since Series 60 3.0 +*/ +class CAmrPayloadFormatWrite : public CPayloadFormatWrite, public MPayloadFormatWrite + { + public: // Constructors and destructor + /** + * Two-phased constructor. + * + * @param aSink Datasink for the payload format write + */ + static CAmrPayloadFormatWrite* NewL ( MDataSink* aSink ); + + /** + * Destructor. + */ + virtual ~CAmrPayloadFormatWrite ( ); + + public: // New functions + + /** + * Cancel any outstanding requests. + * @since Series-60 2.1 + */ + virtual void CancelUlRequest( ); + + /** + * Empty the source buffer by formatting the AMR frames into RTP payload. + * Source buffer is given in "iBuffer". + * Called by the state machine. + * @since Series-60 2.1 + */ + void EmptySourceBufferL( ); + + /** + * Hanlde the event that source buffer has been emptied. + * Source buffer is given in "iBuffer". + * Called by the state machine. + * @since Series-60 2.1 + */ + void SourceBufferEmptiedL( ); + + /** + * Checks if codec mode change request is valid. + * @since Series 60 3.0 + * @param Desired bitrate + * @return TBool + */ + virtual TBool IsBitrateChangeValid( TInt aBitRate ); + + public: // From CMMFFormatEncode + + /** + * Funtion to return time interval for the complete frame + * + * @param aMediaType KUidMediaTypeAudio or KUidMediaTypeVideo + * + * @return time interval in micro seconds + */ + TTimeIntervalMicroSeconds FrameTimeInterval( TMediaId aMediaType ) const; + + /** *** NOT SUPPORTED *** + * Funtion to return the clip duration + * + * @param aMediaType KUidMediaTypeAudio or KUidMediaTypeVideo + * @return clip duration in micro seconds + */ + TTimeIntervalMicroSeconds Duration( TMediaId /*aMediaType*/ ) const; + + /** + * Accessor funtion to return the number of channels + * + * @return Number of channels + */ + TUint NumChannels( ); + + /** + * Accessor funtion to return the sampling rate + * + * + * @return Sampling rate + */ + TUint SampleRate( ); + + /** + * Set the packetizationrate to the given value. + * + * @param aPacketizationRate - [input] Number of AMR frame blocks per RTP packet + * + * @return error code KErrNotSupported if invalid packetizationrate, else return KErrNone + */ + TInt SetSampleRate( TUint aSampleRate ); + + + public: // From MDataSink + + /** + * Create a sink buffer for the given media + * + * @param aMediaId contains the media type KUidMediaTypeAudio or KUidMediaTypeVideo + * @param aReference value of False is returned to caller if sink buffer is created + * + * @return Pointer to sink buffer created + */ + CMMFBuffer* CreateSinkBufferL( TMediaId aMediaId, + TBool &aReference ); + + /** + * Return the sink four CC code for the given media + * + * @param aMediaId contains the media type KUidMediaTypeAudio or KUidMediaTypeVideo + * + * @return FourCC code for the mediaId + */ + TFourCC SinkDataTypeCode( TMediaId aMediaId ); + + /** + * Set the sink data type to the given four CC code for the given media + * + * @param aSinkFourCC fourCC code + * @param aMediaId contains the media type KUidMediaTypeAudio or KUidMediaTypeVideo + * + * @return error code KErrNotSupported if invalid media ID, else return KErrNone + */ + TInt SetSinkDataTypeCode( TFourCC aSinkFourCC, TMediaId aMediaId ); + + /** + * Log in to the sink thread - this funtion merely passes the command to + * its sink clip data source object. The sink clip object will handle + * the thread log on procedures. + * + * @param aEventHandler address of event handler + * @return error code returned by source clip + */ + TInt SinkThreadLogon( MAsyncEventHandler& aEventHandler ); + + /** + * Log out of the sink thread - this funtion merely passes the command to + * its sink clip data source object. The sink clip object will handle + * the thread log off procedures. + * + * + * @return None + */ + void SinkThreadLogoff( ); + + /** + * Empty the given source buffer. + * + * @param aBuffer data buffer containing encoded AMR frames + * @param aSupplier data source pointer + * @param aMediaId contains the media type KUidMediaTypeAudio or KUidMediaTypeVideo + * + */ + void EmptyBufferL( CMMFBuffer* aBuffer, + MDataSource* aSupplier, + TMediaId aMediaId ); + + /** + * Called after the data buffer is written. Update the number of bytes written + * and the current write position for the next write operation. + * + * @param aBuffer data buffer emptied + */ + void BufferEmptiedL( CMMFBuffer* aBuffer ); + + /** + * From MDataSink Primes the source. + * @since Series 60 3.0 + */ + void SinkPrimeL( ); + + /** + * From MDataSink Plays the source. + * @since Series 60 3.0 + */ + void SinkPlayL( ); + + /** + * From MDataSink Pauses the source. + * @since Series 60 3.0 + */ + void SinkPauseL( ); + + /** + * From MDataSink Stops the source. + * @since Series 60 3.0 + */ + void SinkStopL( ); + + public: + + /** + * Configures payload format with format spesific parameters. + * Leaves with KErrArgument if parameters are invalid. + * @since Series 60 3.0 + * @param aConfigParams Configuration parameters + */ + virtual void ConfigurePayloadFormatL( const TDesC8& aConfigParams, + CMccRtpMediaClock& aClock ); + + private: + + /** + * C++ default constructor. + */ + CAmrPayloadFormatWrite ( ); + + /** + * By default Symbian 2nd phase constructor is private. + * + * @param aSink Datasink for the payload format write + */ + void ConstructL( MDataSink* aSink ); + + private: // New functions + + /** + * Packetize the AMR frames received from AMR codec and deliver the packets. + * @since + * @return Returns true if current talk spurt is finished. + */ + TBool ProcessFramesL( ); + + /** + * Prepare packet header and deliver the packet to the datasink. + * @since + * @param aPayload Payload to deliver to the datasink. + */ + void DeliverPacketL( CMMFDataBuffer& aPayload ); + + /** + * Create a sink buffer of the given size. + * + * @param aSize size of sink buffer to create + * @return Pointer to sink buffer created + */ + CMMFDataBuffer* CreateSinkBufferOfSizeL( TUint aSize ); + + /** + * Update payload format with format spesific parameters. + * Leaves with KErrArgument if parameters are invalid. + * + * @since Series 60 3.0 + * @param aCodecInfo Configuration parameters + * @return void + */ + void UpdateConfigurationL( const TMccCodecInfo& aCodecInfo ); + + private: // Data + + // True if this AMR narrow band write, False if wideband + TBool iIsNb; + + // fourCC + TFourCC iFourCC; + + // Format encoding state machine + CFormatEncodeStateMachine* iStateMachine; + + // Pointer to source data buffer, passed from data path + CMMFDataBuffer* iSourceBuffer; + + // Sampling rate from clip header + TInt iSamplingRate; + + // Number of channels from clip header + TUint iChannels; + + // Payload encoder used to construct RTP AMR payload in bandwidth efficient mode + CAmrPayloadEncoder* iPayloadEncoder; + + // Current encoded channel number + TUint iCurrentChannel; + + // Flag to indicate whether to set MARK field to be 1 + // ( the first packet in a talk spurt should have MARK field set ) + TBool iFirstPacketFinished; + + // Packetization Rate + TInt iFramesPerPacket; + + // Sink buffer to hold AMR/RTP payload + CMMFDataBuffer* iSinkBuffer; + + // RTP header used for sending RTP packet + TRtpSendHeader iRtpSendHeader; + + // current media type + TMediaId iMediaId; + + TBool iNeedToFlush; + + // Counter for mode change period purpose + TUint32 iFramesEncoded; + + TBool iFirstCmrHandled; + + // Parameters relating to RTP data encoding + TMccCodecInfo iCInfo; + + // Data sink capable to receive RTP data + MMccRtpDataSink* iRtpDataSink; + + TBool iIsRtpSink; + + // Mode-set + RArray iModes; + + // Key for Rtp media clock + TUint32 iKey; + + /** + * Rtp media clock instance + * Not own. + */ + CMccRtpMediaClock* iRtpMediaClock; + + private: // Friend classes + + #ifdef TEST_EUNIT + friend class UT_CAmrPayloadFormatWrite; + #endif + + }; + +#endif //AMRPAYLOADFORMATWRITE_H