--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/camcordermmfplugin/filecomposer/Inc/CamC3GPDataSinkImp.h Thu Dec 17 08:51:24 2009 +0200
@@ -0,0 +1,404 @@
+/*
+* Copyright (c) 2002 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: 3GP data sink implementation class
+*
+*/
+
+
+#ifndef __CAMC3GPDATASINKIMP_H__
+#define __CAMC3GPDATASINKIMP_H__
+
+// INCLUDES
+
+#include <e32base.h>
+#include <e32std.h>
+#include <f32file.h>
+#include <3gplibrary/mp4lib.h>
+#include <mmf/common/mmffourcc.h>
+
+#include "CCMRMediaSink.h"
+#include "CamC3GPDataSink.h"
+
+// FORWARD DECLARATIONS
+class CMMFFile;
+
+// CLASS DECLARATION
+
+/**
+* CCamC3GPDataSinkImp class.
+* This class implements the 3GP data sink methods.
+*
+* @lib camc3gpsink
+* @since 2.1
+*/
+class CCamC3GPDataSinkImp : public CCamC3GPDataSink, public M3GPMP4LibAsyncTempFileRemoverObserver
+ {
+ public: // Methods called internally or by the controller
+
+ /**
+ * Default constructor.
+ */
+ CCamC3GPDataSinkImp() : CCamC3GPDataSink() {};
+
+ /**
+ * Destructor.
+ */
+ ~CCamC3GPDataSinkImp(void);
+
+ /**
+ * Constructor.
+ */
+ void ConstructL(M3GPDataSinkObserver *aObserver);
+
+ /**
+ * Open a file for writing.
+ * @since 2.1
+ * @param aFileName File name
+ * @param aAudioCodecType Four CC code of the used audio codec
+ * @param aVideoCodecType Four CC code of the used video codec
+ * @param aFileFormat Used file format TCamCSinkFileFormat
+ * @return No return value
+ */
+ void OpenFileL(TFileName aFileName, TFourCC aAudioCodecType, const TDesC8& aVideoCodecType, TCamCSinkFileFormat aFileFormat );
+
+ /**
+ * Open a 3GP file for writing.
+ * @since 3.2
+ * @param aMMFFile CMMFFile from MMF
+ * @param aAudioCodecType Four CC code of the used audio codec
+ * @param aVideoCodecType Four CC code of the used video codec
+ * @param aFileFormat Used file format TCamCSinkFileFormat
+ * @return No return value
+ */
+ void OpenFileL(CMMFFile* aMMFFile, TFourCC aAudioCodecType, const TDesC8& aVideoCodecType, TCamCSinkFileFormat aFileFormat );
+
+ /**
+ * Order the sink to finalize and close the current 3GP file.
+ * @since 2.1
+ * @param None
+ * @return No return value
+ */
+ void SinkStopL();
+
+ /**
+ * Set size limit of the 3GP file to be recorded in bytes.
+ * @since 2.1
+ * @param aSize Limit
+ * @return No return value
+ */
+ void SetSizeLimit(TUint aSize);
+
+ /**
+ * Return the amount of time recording has been on in microseconds.
+ * @since 2.1
+ * @param None
+ * @return Elapsed time
+ */
+ TTimeIntervalMicroSeconds GetElapsedTime();
+
+ /**
+ * Return the estimated remaining time for the recording in microseconds.
+ * @since 2.1
+ * @param None
+ * @return Remaining time
+ */
+ TTimeIntervalMicroSeconds GetRemainingTimeL();
+
+
+ public: // Methods called from MCMRMediaSink
+
+ /**
+ * Give video frame size to sink.
+ * @since 2.1
+ * @param aSize Frame size
+ * @return Error code
+ */
+ TInt SetVideoFrameSize(TSize aSize);
+
+ /**
+ * Give average video bitrate to sink.
+ * @since 2.1
+ * @param aBitRate Average bitrate
+ * @return Error code
+ */
+ TInt SetAverageVideoBitRate(TInt aBitRate);
+
+ /**
+ * Give maximum video bitrate to sink.
+ * @since 2.1
+ * @param aBitRate Maximum bitrate
+ * @return Error code
+ */
+ TInt SetMaxVideoBitRate(TInt aBitRate);
+
+ /**
+ * Give average audio bitrate to sink.
+ * @since 2.1
+ * @param aBitRate Average bitrate
+ * @return Error code
+ */
+ TInt SetAverageAudioBitRate(TInt aBitRate);
+
+ /**
+ * Write an audio/video buffer to the sink.
+ * @since 2.1
+ * @param aBuffer Buffer containing audio/video data
+ * @return Errorcode
+ */
+ void WriteBufferL(CCMRMediaBuffer* aBuffer);
+
+
+ public: // Methods from M3GPMP4LibAsyncTempFileRemoverObserver
+ void M3GPMP4LibDeleteTempFileName( MP4FileName tempFileName );
+
+ private: // Private methods
+
+ /**
+ * Estimate current file size
+ * @since 2.1
+ * @param None
+ * @return File size
+ */
+ TUint CurrentFileSize() const;
+
+ /**
+ * Estimate current metadata size
+ * @since 2.1
+ * @param None
+ * @return File size
+ */
+ TUint CurrentMetadataSize() const;
+
+ /**
+ * Calculate free space on a drive in bytes.
+ * @since 2.1
+ * @param None
+ * @return File size
+ */
+ TInt64 DriveFreeSpaceL();
+
+ /**
+ * Determines AAC audio frame duration.
+ * @since 2.8
+ * @param Incoming buffer with audio dec spec info
+ * @return None
+ */
+ void DetermineAACFrameDurationL(CCMRMediaBuffer* aBuffer);
+
+ /**
+ * Convert AVC specific decoder config info from NAL (GenericPayload) encapsulation to
+ * AVC Decoder Configuration Record -format
+ * @since 3.2
+ * @param Source buffer with AVC specific decoder config info.
+ * @param Destination buffer to write AVC Decoder Configuration Record.
+ * @return None
+ */
+ void ConvertAVCHeaderNALL( CCMRMediaBuffer* aBuffer, TDes8& aDstBuf );
+
+ /**
+ * Convert AVC specific decoder config info from Bytestream (ElementaryStream) encapsulation to
+ * AVC Decoder Configuration Record -format
+ * @since 3.2
+ * @param Source buffer with AVC specific decoder config info.
+ * @param Destination buffer to write AVC Decoder Configuration Record.
+ * @return None
+ */
+ void ConvertAVCHeaderByteStreamL( CCMRMediaBuffer* aBuffer, TDes8& aDstBuf );
+
+ /**
+ * Converts AVC frame from Bytestream (ElementaryStream) encapsulation to
+ * file format AVC sample structure by replacing bytestream headers with NAL unit sizes.
+ * @since 5.0
+ * @param Source buffer with one or more bytestream header seperated NAL units.
+ * @return None
+ */
+ void ConvertBytestreamHeadersToNALSizes( CCMRMediaBuffer* aBuffer );
+
+ /**
+ * Converts AVC frame from NAL (EGenericPayload) encapsulation to
+ * file format AVC sample structure by replacing NAL encapsulation with NAL unit sizes.
+ * @since 5.0
+ * @param Source buffer with one or more NAL header seperated NAL units.
+ * @param Destination buffer to write NAL units with length information.
+ * @param Destination buffer size.
+ * @return None
+ */
+ void ConvertNALEncapsulationToNALSizes( CCMRMediaBuffer* aBuffer );
+
+ private:
+
+ static TInt IdleDelete( TAny* aCont );
+
+ public:
+
+ TInt DoIdleDelete();
+
+ private:
+
+ // Observer to inform controller
+ M3GPDataSinkObserver *iObserver;
+
+ // 3GP library handle
+ MP4Handle iMP4Handle;
+
+ // Number of bytes received from media recorder
+ TUint iBytesReceived;
+
+ // Number of bytes of metadata currently accumulated
+ TUint iBytesOfMetadata;
+
+ // Horizontal resolution of video
+ TInt iVideoXResolution;
+
+ // Vertical resolution of video
+ TInt iVideoYResolution;
+
+ // Average bitrate of video
+ TInt iVideoAverageBitRate;
+
+ // Maximum bitrate of video
+ TInt iVideoMaxBitRate;
+
+ // Average bitrate of audio
+ TInt iAudioAverageBitRate;
+
+ // Type of buffer coming from media recorder
+ CCMRMediaBuffer::TBufferType iBufferType;
+
+ // Size of buffer coming from media recorder
+ TInt iBufferSize;
+
+ // Types of codecs used in the output file
+ TUint iFileCodecType;
+
+ // Timestamp of video frame coming from media recorder
+ TTimeIntervalMicroSeconds iVideoTimestamp;
+
+ // Timestamp of video frame buffered in the sink
+ TTimeIntervalMicroSeconds iVideoBufferTimestamp;
+
+ // Timestamp of the first video frame
+ TTimeIntervalMicroSeconds iFirstVideoFrameTimestamp;
+
+ // Duration of the video frame buffered in the sink
+ TUint iVideoFrameDuration;
+
+ // Is current video frame a random access point
+ TBool iVideoRandomAccessPoint;
+
+ // Is the buffered video frame a random access point
+ TBool iVideoBufferRandomAccessPoint;
+
+ // Sink buffers one video frame in this buffer
+ TUint8* iVideoBuffer;
+
+ // Size of buffered video frame
+ TUint iVideoBufferFrameSize;
+
+ // Size of video buffer
+ TUint iVideoBufferSize;
+
+ // Number of video frames
+ TUint iVideoFrameNumber;
+
+ // Number of intra video frames
+ TUint iVideoIntraFrameNumber;
+
+ // Video decoder specific info size
+ TInt iVideoDecSpecInfoSize;
+
+ // Audio decoder specific info size
+ TInt iAudioDecSpecInfoSize;
+
+ // Sink buffers audio frames in this buffer
+ TUint8* iAudioBuffer;
+
+ // Size of buffered audio frames
+ TUint iAudioBufferFrameSize;
+
+ // Size of audio buffer
+ TUint iAudioBufferSize;
+
+ // Number of audio frames
+ TUint iAudioFrameNumber;
+
+ // Number of audio frames in the buffer
+ TUint iAudioFramesInBuffer;
+
+ // Size limit of the file in bytes
+ TInt64 iSizeLimit;
+
+ // Has file size limit bee reached?
+ TBool iFileSizeLimitReached;
+
+ // File server session handle
+ RFs* iFS;
+
+ // Drive number of the output file
+ TInt iDriveNumber;
+
+ // Has the disk been filled to the safety limit?
+ TBool iDiskFull;
+
+ // Output filename
+ TFileName iFileName;
+
+ // Temporary filename
+ TFileName iTmpFileName;
+
+ // MMF resource to acquire file handle
+ CMMFFile* iMMFFile;
+
+ // File handle from MMF
+ RFile * iFile;
+
+ // Used to determine whether file handles or descriptors are used
+ TBool iFileHandleExists;
+
+ // Amount of remaining recording time
+ TTimeIntervalMicroSeconds iRemainingTime;
+
+ // Remaining free disk space
+ TInt64 iFreeDiskSpace;
+
+ // Counter to check the real free disk space
+ TInt iFreeDiskSpaceCounter;
+
+ // Available space on disk at start of recording
+ TInt64 iAvailableSpaceAtStart;
+
+ // Avarage of end time
+ TTimeIntervalMicroSeconds iAvarageEndTime;
+
+ // Duration of AAC frame
+ TInt iAudioAACFrameDuration;
+
+ // AAC Audio Samplerate
+ TInt iAudioAACSamplerate;
+
+ // AVC video level id
+ TInt iAVCOutputLevel;
+
+ // Critical level for current target disk
+ TInt iCriticalDiskVal;
+
+ // File name queue for the temporary meta data files to be deleted.
+ RPointerArray<MP4FileName>* iDeleteFileQueue;
+
+ // Async file deletion on background
+ CIdle* iIdleDelete;
+
+ };
+
+#endif