mmserv/voipaudioservices/JitterBufferUtility/inc/JitterBufferImpl.h
changeset 0 71ca22bcf22a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmserv/voipaudioservices/JitterBufferUtility/inc/JitterBufferImpl.h	Tue Feb 02 01:08:46 2010 +0200
@@ -0,0 +1,336 @@
+/*
+* Copyright (c) 2008 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:  Jitter buffer for Audio frames.
+*  Interface   : VoIPJitterBuffer.lib
+*
+*/
+
+
+
+#ifndef __VOIPJITTERBUFFERIMPL_H
+#define __VOIPJITTERBUFFERIMPL_H
+
+//  INCLUDES
+#include <voipjitterbufferintfc.h>
+
+// FORWARD DECLARATIONS
+class CVoIPCNGenerator;
+class MJitterBufferObserver;
+
+// CLASS DECLARATION
+
+/**
+ *  Jitter buffer element including packet received.
+ *
+ *  @lib VoIPJitterBuffer.lib
+ *  @since Series 60 5.0
+ */
+class TJitterBufferElement
+    {
+public: // Constructor
+    inline TJitterBufferElement() : iDataFrame(NULL),
+                                    iSequenceNumber(-1),
+                                    iTimeStamp(-1) {}
+
+public: // Methods
+
+    /**
+     * Compares two elements based on their sequence number
+     * @since Series 60 5.0
+     * @param aElem1 First element
+     * @param aElem2 Second element
+     * @return TInt
+     */
+    static TInt CompareSeqNum(const TJitterBufferElement& aElem1,
+                              const TJitterBufferElement& aElem2);
+
+    /**
+     * Compares two elements based on their stamps
+     * @since Series 60 5.0
+     * @param aElem1 First element
+     * @param aElem2 Second element
+     * @return TInt
+     */
+    static TInt CompareStamp(const TJitterBufferElement& aElem1,
+                             const TJitterBufferElement& aElem2);
+
+public: // Data members
+    // Data
+    CMMFDataBuffer* iDataFrame;
+
+    // Data packet number
+    TInt64 iSequenceNumber;
+
+    // Time stamp
+    TInt64 iTimeStamp;
+
+    };
+
+
+/**
+ *  Jitter buffer.
+ *
+ *  @lib VoIPJitterBuffer.lib
+ *  @since Series 60 5.0
+ */
+class CVoIPJitterBufferImpl : public CBase
+    {
+public: // Constructors and destructor
+
+    /**
+     * Two-phased constructor.
+     */
+    static CVoIPJitterBufferImpl* NewL(MJitterBufferObserver* aObserver);
+
+    /**
+     * Destructor.
+     */
+    virtual ~CVoIPJitterBufferImpl();
+
+public: // Methods
+
+    /**
+     * Setup jitterbuffer
+     * @since Series 60 5.0
+     * @param parameters
+     * @return void
+     */
+    void SetupL(const TFourCC aCodec, const TVoIPJBConfig& aJBConfig);
+
+    /**
+     * Reset buffer
+     * @since Series 60 5.0
+     * @param aPlayTone ETrue, if tone is to played
+     * @return void
+     */
+    void ResetBuffer(TBool aPlayTone = ETrue);
+
+    /**
+     * Add DataFrame to buffer
+     * @since Series 60 5.0
+     * @param aBuffer Buffer to read data from
+     * @return void
+     */
+    TInt AddDataFrame(CMMFBuffer* aDataBuffer);
+
+    /**
+     * Get DataFrame from buffer
+     * @since Series 60 5.0
+     * @param aBuffer Buffer to write data to
+     * @return TInt
+     */
+    TInt GetDataFrame(CMMFBuffer* aBuffer);
+
+    /**
+     * Get Current Codec
+     * @since Series 60 5.0
+     * @param None
+     * @return TFourCC
+     */
+    TFourCC CurrentCodec() const;
+
+    /**
+     * Delay Up
+     * @since Series 60 5.0
+     * @param None
+     * @return void
+     */
+    void DelayUpL();
+
+    /**
+     * Decreases jitter buffer delay
+     * @since Series 60 5.0
+     * @param None
+     * @return void
+     */
+    void DelayDownL();
+
+    /**
+     * ?Description
+     * @since Series 60 5.0
+     * @param None
+     * @return TTimeIntervalMicroSeconds32
+     */
+    TTimeIntervalMicroSeconds32 CalculateDelay() const;
+
+    /**
+     * Get the length of jitter buffer, in terms of number of packets.
+     * @since Series 60 5.0
+     * @param none
+     * @return buffer lenght.
+     */
+    TInt BufferLength() const;
+
+    /**
+     * Get number of packets that are currently inside the buffer.
+     * @since Series 60 5.0
+     * @param none
+     * @return Number of packet in buffer.
+     */
+    TInt PacketCount() const;
+
+    /**
+     * Fills the given event with statistics of the jitterbuffer
+     * @since Series 60 5.0
+     * @param aEvent Event into which set the statistics
+     * @return void
+     */
+    void GenerateStatistics(/*TJBStats& aStats*/) const;
+
+private:
+
+    /**
+     * C++ default constructor.
+     */
+    CVoIPJitterBufferImpl(MJitterBufferObserver* aObserver);
+
+    /**
+     * By default Symbian 2nd phase constructor is private.
+     */
+    void ConstructL();
+
+private: // New functions
+
+    /**
+     * Is sequence number wrapped around TUint16 65535->0
+     * @since Series 60 5.0
+     * @param TInt aSeqNum1 is oldest packet sequence number in buffer
+     * @param TInt aSeqNum2 is new element sequence number to buffer
+     * @return detect the wrap-around condition.
+     */
+    TBool IsSeqNumWrappedAround(TInt64 aSeqNum1, TInt64 aSeqNum2) const;
+
+    /**
+     * Find Largest SequenceNumber
+     * @since Series 60 5.0
+     * @param None
+     * @return TUint Largest sequence number
+     */
+    TUint FindLargestSeqNum();
+
+    /**
+     * Inserts a databuffer into the jitter buffer
+     * @since Series 60 5.0
+     * @param aBuffer Buffer containing the data
+     * @param aLargestSeqNum Largest sequence number returned by
+     *                       FindLargestSeqNum()
+     * @return void
+     */
+    void InsertBufferElement(const TDesC8& aBuffer, TInt64 aLargestSeqNum);
+
+    /**
+     * Is jitter buffer full?
+     * @since Series 60 5.0
+     * @param none
+     * @return True if full.
+     */
+    TBool IsFull() const;
+
+    /**
+     * Is jitter buffer empty?
+     * @since Series 60 5.0
+     * @param none
+     * @return True if empty.
+     */
+    TBool IsEmpty() const;
+
+    /**
+     * CheckThresholdBufferLength
+     * @since Series 60 5.0
+     * @param none
+     * @return void
+     */
+    void CheckThresholdBufferLength(TInt& aBufferLength,
+                                    const TInt aTreshhold) const;
+
+private: // Data
+
+    // Playout thresholds
+    TInt iCurrentPlayThreshold;
+    TInt iOriginalPlayThreshold;
+
+    // Buffer length
+    TInt iBufferLength;
+
+    // Jitter buffer array (queue)
+    RArray<TJitterBufferElement> iBuffer;
+
+    // Instance of comfort noise generator
+    CVoIPCNGenerator* iCNGenerator;
+
+    // Frame SequenceNumber
+    TInt64 iCurrentSeqNum;
+
+    // Sequence number of previously played frame
+    TInt64 iLastPlayedSeqNum;
+    TInt64 iLargestSeqNum;
+
+    // Jitter buffer sorting objects
+    TLinearOrder<TJitterBufferElement> iBufStampSorter;
+    TLinearOrder<TJitterBufferElement> iBufSequenceSorter;
+
+    // JB configuration parameters
+    TVoIPJBConfig iJBConfig;
+
+    // Codec frame size
+    TInt  iFrameSize;
+
+    // Encoded frame sample interval
+    TInt  iSampleInterval;
+
+    // Increment in frame sequence number
+    TUint iSeqNumIncrement;
+    
+    TBool iIsWrappedAround;
+
+    MJitterBufferObserver* iObserver;
+    CMMFDataBuffer* iDataBuffer;
+
+// These are mainly for statistical purpose
+
+    // Number of frames totally lost
+    TUint iFramesLost;
+
+    // Number of frames received
+    TUint iFramesReceived;
+
+    // Number of frames removed by adaptation or because of overflows
+    TUint iFramesRemoved;
+
+    // Number of frames played
+    TUint iFramesPlayed;
+
+    // Number of frames arrived late
+    TUint iNumOfLateFrames;
+
+    // Number of packets in buffer
+    TInt iPacketsInBuffer;
+
+    // Buffer overflow counter
+    TUint iOverflowCounter;
+
+    // Jitter buffer inctivity time
+    TInt  iInactivityTime;
+
+// These are for tone playback
+    TInt  iPlayToneInterval;
+    TTime iTonePlayTime;
+    TInt  iSampleRate;
+    TBool iPlay;
+
+    };
+
+#endif  //__VOIPJITTERBUFFERIMPL_H
+
+// End of file