diff -r 000000000000 -r 9b3e960ffc8a camcordermmfplugin/filecomposer/Inc/CamC3GPDataSinkImp.h --- /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 +#include +#include +#include <3gplibrary/mp4lib.h> +#include + +#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* iDeleteFileQueue; + + // Async file deletion on background + CIdle* iIdleDelete; + + }; + +#endif