mmfenh/advancedaudiocontroller/audiocontrollerpluginsvariant/AdvancedAudioController/Inc/AdvancedAudioUtility.h
changeset 0 71ca22bcf22a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmfenh/advancedaudiocontroller/audiocontrollerpluginsvariant/AdvancedAudioController/Inc/AdvancedAudioUtility.h	Tue Feb 02 01:08:46 2010 +0200
@@ -0,0 +1,424 @@
+/*
+* 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:  This class provides utility functions such as parsing of header
+*				 information for VBR type clips.
+*
+*/
+
+
+#ifndef CADVANCEDAUDIOUTILITY_H
+#define CADVANCEDAUDIOUTILITY_H
+
+//  INCLUDES
+#include "AdvancedAudioHelper.h"        // for MAdvancedAudioDecoderUtilityObserver
+#include <e32base.h>
+#include <mmfdatabuffer.h>
+#include <f32file.h>
+
+// FORWARD DECARATION
+class CAdvancedAudioDecoder;
+class CMMFClip;
+// CLASS DECLARATION
+
+/**
+*  The TTimePos class is used to record the byte position and the corresponding
+*  time position in an audio clip and the length of the frame which starts
+*  from the byte position.
+*
+*  @lib AdvancedAudioController.lib
+*  @since 3.0
+*/
+class TTimePos
+    {
+	public:
+		TTimePos() : iTimePos(0), iBytePos(0), iFrameLen(0)
+			{}
+		TTimePos(TInt64 aTimePos, TInt aBytePos, TInt aFrameLen)
+			: iTimePos(aTimePos), iBytePos(aBytePos), iFrameLen((TInt16)aFrameLen)
+			{}
+	public:
+		TInt64 iTimePos;    // time position (microseconds)
+		TInt iBytePos;     // byte position
+		TInt16 iFrameLen;  // frame length
+    };
+
+/**
+*  Frame info struct.
+*
+*  @lib AdvancedAudioController.lib
+*  @since 3.0
+*/
+class TAudioFrameInfo
+    {
+	public:
+		TInt iMode;            // encoding mode
+		TInt iBitRate;         // bitrate (bit/s)
+		TInt iSamplingRate;    // sampling frequency (Hz)
+		TInt iChannels;        // number of channels
+		TInt iFrameSize;       // encoded size (bytes)
+		TInt iFrameSamples;    // samples per frame
+		TInt iSamplingRateOut; // sampling frequency after conversion (Hz)
+		TInt iChannelsOut;     // number of audio channels after conversion (1 or 2)
+		TInt iFrameSamplesOut; // decoded size after conversion (samples per frame)
+		TInt iPadding;         // padding flag (TRUE or FALSE, TRUE if p slot exists)
+		TInt iId;              // id of algorithm (1 MPEG-1, 0 MPEG-2)
+    };
+    
+class MAdvancedAudioUtilityObserver
+    {
+    public:
+
+        /**
+        * Callback function from CAdvancedAudioUtility when bitrate changed situation occurs
+        * @param   aFilledBuffer  data buffer filled with converted data
+        * @return  void
+        */
+        virtual void BitRateChanged() = 0;
+        virtual void SeekPositionReached(TUint aTimeMs) = 0;
+		virtual void PlayWindowEndPositionReached() = 0;
+    };
+
+/**
+*  Utility class for Advanced Audio Controller Plugins.
+*
+*  @lib AdvancedAudioController.lib
+*  @since 3.0
+*/
+class CAdvancedAudioUtility : public CBase,
+                              public MAdvancedAudioDecoderUtilityObserver
+    {
+	public:  // Constructors and destructor
+
+		/**
+		* Destructor.
+		*/
+		IMPORT_C virtual ~CAdvancedAudioUtility();
+
+        /**
+        * C++ default constructor.
+        */
+		IMPORT_C CAdvancedAudioUtility();
+
+    public: // New functions
+
+		/**
+		* Scans source buffer, frame by frame to update the frame count,
+		* byte count and duration.
+		* @param aClip the source clip, must be primed before calling this function
+		* @param aBuf buffer containing the header data
+		* @param aScanThisBufferOnly indication to scan only the contents in aBuf
+		* @return TInt bytes scannes
+		*/
+		IMPORT_C virtual TInt ScanFramesL(CMMFClip* aClip, CMMFDataBuffer* aBuf,
+			TBool aScanThisBufferOnly = EFalse, TInt aSourceReadPosition = 0);
+
+		/**
+        * Scans header information
+		* @param aDataBuf
+		* @return void
+		*/
+		IMPORT_C virtual void ScanHeaderL(CMMFDataBuffer* aDataBuf);
+
+		/**
+		* Scans source buffer, frame by frame to update the frame count,
+		* byte count and duration.
+		* @param aBuf buffer containing the header data
+		* @param aScanThisBufferOnly indication to scan only the contents in aBuf
+		* @return TInt bytes scannes
+		*/
+		IMPORT_C virtual TInt ScanFramesL(CMMFDataBuffer* aBuf,
+			TBool aScanThisBufferOnly = EFalse, TInt aSourceReadPosition = 0);
+
+		/**
+		* Finds the byte position of the frame at given time position.
+		* NOTE: This routine works accurately for time positions smaller than
+		* 2^32 microseconds (~71min 34seconds) only, since the time stamps
+		* use 32 bit unsigned integers. If the given time position is greater
+		* than this, then this routine returns the position of the frame at
+		* 2^32 microseconds.
+		* @param aTimePos time position to find (microseconds)
+		* @param aClip pointer to data clip
+		* @return position of the frame header; KErrNotFound if not found
+		*/
+		IMPORT_C virtual TInt FindFramePos(const TInt64& aTimePos, CMMFClip* aClip = NULL);
+
+		/**
+		* Returns the byte position of the first frame.
+		* @param aBuf Pointer to the data
+		* @param aBufLen Length of the data
+		* @return byte position of the first frame
+		*/
+		IMPORT_C virtual TInt SeekSync(CMMFDataBuffer* aBuf, TInt aBufLen) = 0;
+
+		/**
+		* Returns frame info.
+		* @param aBuf Pointer to the data
+		* @param aBufLen Length of the data
+		* @param aInfo Contains the frame info on return
+		* @return frame length
+		*/
+		IMPORT_C virtual TInt FrameInfo(const TUint8* aBuf, TInt aBufLen, TAudioFrameInfo& aInfo);
+
+		/**
+		* Returns the sample rate.
+		* @param none
+		* @return sample rate
+		*/
+		IMPORT_C TInt SampleRate();
+
+		/**
+		* Returns the bit rate in bits/sec.
+		* @param none
+		* @return bit rate
+		*/
+		IMPORT_C virtual TInt BitRate();
+
+		/**
+		* Returns the number of channels.
+		* @param none
+		* @return number of channels
+		*/
+		IMPORT_C TInt Channels();
+
+		/**
+		* Returns the number of channels out of decoder.
+		* @param none
+		* @return number of channels
+		*/
+		IMPORT_C TInt ChannelsOut();
+
+		/**
+		* Returns the scanned duration.
+		* @param none
+		* @return scanned duration
+		*/
+		IMPORT_C TInt64 ScanDuration();
+
+		/**
+		* Returns the duration.
+		* @param none
+		* @return duration
+		*/
+		IMPORT_C virtual TInt64 Duration();
+
+		/**
+		* Returns the header offset.
+		* @param none
+		* @return header offset
+		*/
+		IMPORT_C TInt HeaderOffset();
+
+		/**
+		* Returns the Sync offset e.g. ID3 header length
+		*
+		* @return  TInt
+		*/
+		IMPORT_C TInt SyncOffset();
+		
+		/**
+		* Sets the codec config sample rate.
+		* @param aCodecConfig codec's configuration data
+		* @return void
+		*/
+		IMPORT_C virtual void SetCodecConfigData(RArray<TInt>& aCodecConfig);
+		
+        /**
+		* Set the Observer for Callback
+		* @param CAdvancedAudioPlayController& reference to MAdvancedAudioUtilityObserver object for callback
+		* @return void
+		*/
+		IMPORT_C void SetObserver(MAdvancedAudioUtilityObserver& aObserver);
+		
+		/**
+		* Set the Decoder Object
+        * @param none
+		* @return void
+		*/
+		IMPORT_C void SetDecoder(CAdvancedAudioDecoder& aDecoder);
+		
+		/**
+		* De-reference decoder object from SetDecoderL, should always be called for safety before CAdvancedAudioOutput is deleted
+        * @param none
+		* @return void
+		*/
+		IMPORT_C void DeReferenceDecoder();
+
+		/**
+		* Returns frame header size.
+		* @param none
+		* @return frame header size
+		*/
+		IMPORT_C virtual TInt FrameHeaderSize();
+
+        /**
+        * Gets the drive number from drivename
+        * @since 3.0
+        * @param aDriveName
+        * @return TDriveNumber
+        */
+        IMPORT_C TDriveNumber GetDriveNumber(const TDesC& aDriveName);
+
+        /**
+		* Set/Update the iClipSize varilable
+		* @param TUint the new ClipSize
+		* @return void
+		*/
+		IMPORT_C virtual void SetClipSizeL(TUint aSize);
+		
+        /**
+		* Enable bitrate change callback, would trigger a BitRateChanged callback when bitrate changes occurs
+		* @param TInt interval in Milliseconds of callback to happen, 0 means callback on any changes, -1 means no callback
+		* @return void
+		*/
+		IMPORT_C virtual void EnableBitRateChangedEventL(TInt aIntervalInMilliSeconds = -1);
+		
+        /**
+        * Sets the Source Position based on Time
+        * @since 3.0
+        * @param aTime
+        * @param aPos
+        * @return TDriveNumber
+        */
+        IMPORT_C virtual TInt SetSourceReference(TUint aTimeMs, TUint aPos);
+        
+        /**
+        * Find the closest Frame's position from a given time (millisec) in frametable
+        * added to support AAC optimization
+        * @since 3.2
+        * @param aTimeMs    Time to search from in millisec
+        * @param aPos       Bytes Position found in frametable if return is KErrNone
+        * return TInt       standard system error
+        */
+		IMPORT_C virtual TInt FindFramePosFromTime(TUint& aTimeMs, TUint& aPos);
+		
+		IMPORT_C virtual TInt FindFrameTimeFromPos(TUint& aTimeMs, TUint& aPos);
+		
+		/**
+        * Find the last record Frame's position in frametable
+        * added to support AAC optimization
+        * @since 3.2
+        * @param aPos       Bytes Position found in frametable if return is KErrNone
+        * return TInt       standard system error
+        */
+		IMPORT_C virtual TInt LastFramePos(TUint& aPos);
+		
+		/*
+        * Find the last Frame's position relative time (millisec) in frametable
+        * added to support AAC optimization
+        * @since 3.2
+        * @param aTimeMs    Time of the last Frame in millisec if return is KErrNone
+        * return TInt       standard system error
+        */
+		IMPORT_C virtual TInt LastFrameTime(TUint& aTimeMs);
+		
+		/*
+        * Reset the frame table
+        * added to support AAC optimization
+        * @since 3.2
+        * return TInt       standard system error
+        */
+		IMPORT_C virtual TInt ResetTable();
+		
+		/**
+        * Cause FrameTable to generate an event when the desire Position is recorded in FrameTable
+        * added to support AAC optimization
+        * @since 3.2
+        * @param aTimeMs    Time to be Seek to when callback occurs in millisec
+        * return TInt       standard system error
+        */
+		IMPORT_C virtual TInt SeekToTimeMs(TUint aTimeMs);
+		IMPORT_C virtual TInt SetPlayWindowEndTimeMs(TUint aTimeMs);
+
+	protected:      // new functions
+
+		/**
+		* Records the timestamp into iPosArr.
+		* @param aFrameLength frame length of the next frame in clip
+		* @return void
+		*/
+		IMPORT_C virtual void RecordTimeStampL(TInt aFrameLength);
+
+		/**
+		* Finds the length of the ID3 header
+		* @param aBuf
+		* @return TInt
+		*/
+        IMPORT_C TInt ID3HeaderLength(const CMMFDataBuffer* aBuf);
+
+		/**
+		* Creates a buffer
+		* @param aSize
+		* @return Pointer to the buffer
+		*/
+        IMPORT_C CMMFDataBuffer* CreateBufferOfSizeLC(TUint aSize);
+        
+    public:         // from MAdvancedAudioDecoderUtilityObserver
+		IMPORT_C virtual void DecodeIntervalEvent();
+        IMPORT_C virtual void SeekPositionReached(TUint aTimeMs);
+		IMPORT_C virtual TInt GetOffsets(TInt& aOffsets);
+		IMPORT_C virtual void PlayWindowEndPositionReached();
+
+	protected:      // Data
+
+		// Frame byte position, time position, and length
+		CArrayFixSeg<TTimePos>* iPosArr;
+		// Sampling rate found in header
+		TInt iSamplingRate;
+		// Bit rate (bps) found in header
+		TInt iBitRate;
+		// Number of channels found in header
+		TInt iChannels;
+		// Number of channels after decoding
+		TInt iChannelsOut;
+		// Samples per frame
+		TInt iSamplesPerFrame;
+		// Scanned Duration of the clip
+		TInt64 iScanDuration;
+		// Duration of the clip
+		TInt64 iDurationUs;
+		// Bytes scanned
+		TInt iScanByteCount;
+		// Bytes since last frame
+		TInt iScanInvByteCount;
+		// Saved length
+		TInt iSavedLength;
+		
+		// clip size
+		TUint iClipSize;
+		
+		// Header offset position
+		TInt iHeaderOffset;
+		// Header 2 offset position
+        TInt iSyncOffset;
+        // Indicates the header is read - is to be used to process buffers for calculating bitrate without corrupting the offset calculations
+        TBool iHdrIsRead;
+		// For Average Bitrate Calculation
+		TInt 	iNumFrames;
+		TInt64 	iSumBitRate;
+		
+		// Length of MetaData found in file
+		TInt iLenMetaData;
+		
+		MAdvancedAudioUtilityObserver* iObserver;   // new for Streaming/PDL, call back to controller when average bitrate changes
+		TInt iFrameTimeMs;                          // remember how many millisec per frame contains
+		TUint iReferenceBitRate;                    // new for Streaming/PDL, remember the last return/callback bitrate
+        TBool iScannedOnce;                         // new for Streaming/PDL, remember whether the first frame has already been scanned
+        
+        CAdvancedAudioDecoder* iDecoder;            // pointer to decoder object own the play controller, does not have ownership
+        TBool iBitRateFrozen;
+        TInt iTotalFrameBytes;
+        TInt iTotalFrames;
+    };
+
+#endif 		// CADVANCEDAUDIOUTILITY_H