diff -r 000000000000 -r 1bce908db942 multimediacommscontroller/mmccg729payloadformat/inc/g729payloadformatwrite.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommscontroller/mmccg729payloadformat/inc/g729payloadformatwrite.h Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,389 @@ +/* +* 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: Writes RTP payload format containing G729 data. +* +*/ + + + +#ifndef G729PAYLOADFORMATWRITE_H +#define G729PAYLOADFORMATWRITE_H + +// INCLUDES +#include +#include +#include +#include "rtpheader.h" +#include "formatstatemachine.h" +#include "mccinternalcodecs.h" + +// FORWARD DECLARATIONS +class MMccRtpDataSink; +class CMccRtpMediaClock; + + +// CLASS DECLARATION +/** +* Packetizes RTP payload containing G729 data. +* +* @lib ?library +* @since Series 60 3.0 +*/ +class CG729PayloadFormatWrite : public CPayloadFormatWrite, + public MAsyncEventHandler, + public MPayloadFormatWrite + { + public: // Constructors and destructor + /** + * Two-phased constructor. + * @param aSource Data source configuration parameters + */ + static CG729PayloadFormatWrite* NewL (MDataSink* aSink); + + /** + * Destructor. + */ + virtual ~CG729PayloadFormatWrite (); + + public: + + /** + * Configures payload format with format spesific parameters. + * Leaves with KErrArgument if parameters are invalid. + * + * @since Series 60 3.0 + * @param aConfigParams Configuration parameters + * @return void + */ + virtual void ConfigurePayloadFormatL( const TDesC8& aConfigParams, + CMccRtpMediaClock& aClock ); + + public: // From CMMFFormatEncode + + /** + * Funtion to return time interval for the complete frame + * + * @param aMediaType KUidMediaTypeAudio or KUidMediaTypeVideo + * + * @return time interval in micro seconds + */ + virtual TTimeIntervalMicroSeconds FrameTimeInterval( + TMediaId aMediaType) const; + + /** *** NOT SUPPORTED *** + * Function to return the clip duration + * + * @param aMediaType KUidMediaTypeAudio or KUidMediaTypeVideo + * + * @return clip duration in micro seconds + */ + virtual TTimeIntervalMicroSeconds Duration( + TMediaId /*aMediaType*/) const; + + /** + * 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 + */ + virtual 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 + */ + virtual TFourCC SinkDataTypeCode(TMediaId aMediaId); + + /** + * Set the sink data type to the given four CC code for the given media + * + * @param aSourceFourCC fourCC code + * @param aMediaId contains the media type KUidMediaTypeAudio or + * KUidMediaTypeVideo + * @return error code KErrNotSupported if invalid media + * ID, else return KErrNone + */ + virtual 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 + */ + virtual 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. + * + * @param + * + * @return + */ + virtual void SinkThreadLogoff(); + + /** + * Empty the given source buffer. + * + * @param aBuffer data buffer containing G.711 frames + * @param aSupplier data source pointer + * @param aMediaId contains the media type KUidMediaTypeAudio or + * KUidMediaTypeVideo + * @return + */ + virtual 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 + * + * @return + */ + virtual void BufferEmptiedL(CMMFBuffer* aBuffer); + + /** + * Accessor funtion to return the number of channels + * + * @param + * + * @return Number of channels + */ + virtual TUint NumChannels(); + + /** + * Accessor funtion to return the sampling rate + * + * @param + * + * @return Sampling rate + */ + virtual TUint SampleRate(); + + /** + * Set the samplerate to the given value. + * + * @param aSampleRate + * + * @return error code KErrNotSupported if invalid samplerate, else + * return KErrNone + */ + virtual TInt SetSampleRate(TUint aSampleRate); + + /** + * No implementation required for encoder. + * + * @param Not used + * + * @return KErrNone + */ + virtual TInt SendEventToClient(const TMMFEvent& /*aEvent*/) + {return KErrNone;} + + public: // From MDataSink + + /** + * From MDataSink Primes the source. + * @since + * @param + * @return + */ + virtual void SinkPrimeL(); + + /** + * From MDataSink Plays the source. + * @since + * @param + * @return + */ + virtual void SinkPlayL(); + + /** + * From MDataSink Pauses the source. + * @since + * @param + * @return + */ + virtual void SinkPauseL(); + + /** + * From MDataSink Stops the source. + * @since + * @param + * @return + */ + virtual void SinkStopL(); + + public: // From MPayloadFormatWrite + + /** + * Empty the source buffer by formatting the iLBC frames into RTP payload. + * Source buffer is given in "iBuffer". + * Called by the state machine. + * @since + * @param None + */ + void EmptySourceBufferL(); + + /** + * Hanlde the event that source buffer has been emptied. + * Source buffer is given in "iBuffer". + * Called by the state machine. + * @since + * @param None + */ + void SourceBufferEmptiedL(); + + protected: // New functions + + protected: // Functions from base classes + + private: // New functions + + /** + * Prepare packet header and deliver the packet to the datasink. + * @since + * @param aPayload Payload to deliver to the datasink. + * @return + */ + 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); + + + /** + * Does bit-packing for encoded speech parameters got from encoder so + * that codec data conforms to G729 RTP payload format. + * @since Series 60 3.0 + * @param aSourceBuf Source buffer where to read from + * @param aDestBuf Destination buffer where to place bit-packed data + * @param aIsCNoise Indicates does source buf contain comfort noise + * @return System wide error code. + */ + TInt DoBitPacking( const TDesC8& aSourceBuf, + TDes8& aDestBuf, + TBool aIsCNoise ) const; + + /** + * 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: + /** + * C++ default constructor. + */ + CG729PayloadFormatWrite (); + + /** + * By default Symbian 2nd phase constructor is private. + * + * @param aConf Decoder Configuration params + */ + void ConstructL (MDataSink* aSource); + + private: // Data + + // fourCC + TFourCC iFourCC; + + // Format encoding state machine + CFormatEncodeStateMachine* iStateMachine; + + // Pointer to source data buffer, passed from MCPDataPath + CMMFDataBuffer* iSourceBuffer; + + // Sink buffer to hold G729/RTP payload + CMMFDataBuffer* iSinkBuffer; + + // RTP header used for sending RTP packet + TRtpSendHeader iRtpSendHeader; + + // Data sink capable to receive RTP data + MMccRtpDataSink* iRtpDataSink; + + // Frames per RTP packet (packetization rate) + TUint iFramesPerPacket; + + // Counter for determining are all frames/samples got for RTP packet + TInt iFrameIndex; + + // Frame time interval in micro seconds + TTimeIntervalMicroSeconds iFrameTimeInterval; + + // Current media type + TMediaId iMediaId; + + // 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; + + // Redundancy encoder used to construct redundancy RTP format packet + CMMFFormatEncode* iRedEncoder; + + // Parameters relating to RTP data encoding + TMccCodecInfo iCInfo; + + // Rtp Sink + TBool iIsRtpSink; + + // Key for Rtp media clock + TUint32 iKey; + + /** + * Rtp media clock instance + * Not own. + */ + CMccRtpMediaClock* iRtpMediaClock; + + // Friend class + #ifdef TEST_EUNIT + friend class UT_CG729PayloadFormatWrite; + #endif + }; + +#endif //G729PAYLOADFORMATWRITE_H + +// End of File