diff -r 000000000000 -r 951a5db380a0 videoeditorengine/vedengine/videoprocessor/inc/VideoEncoder.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videoeditorengine/vedengine/videoprocessor/inc/VideoEncoder.h Fri Jan 29 14:08:33 2010 +0200 @@ -0,0 +1,401 @@ +/* +* Copyright (c) 2010 Ixonos Plc. +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the "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: +* Ixonos Plc +* +* Description: +* Header file for video encoder class. +* +*/ + + +#ifndef VIDEOENCODER_H +#define VIDEOENCODER_H + +// INCLUDES + +#include +#include "CTRTranscoderObserver.h" +#include "CTRTranscoder.h" +#include "CTRCommon.h" +#include "CTRVideoPictureSink.h" +#include "Vedcommon.h" + +// FORWARD DECLARATIONS + +class CStatusMonitor; +class CVedVolReader; +class CVedAVCEdit; + +class CVideoEncoder : public CActive, public MTRTranscoderObserver, + public MCMRMediaSink, public MTRVideoPictureSink + { + + public: // Constructors and destructor + + /** + * Two-phased constructor. + */ + static CVideoEncoder* NewL(CStatusMonitor *aMonitor, CVedAVCEdit* aAvcEdit, + const TPtrC8& aVideoMimeType); + + /** + * Destructor. + */ + + ~CVideoEncoder(); + + public: // Constants + + enum TErrorCode + { + EInternalAssertionFailure = -10030, + }; + + public: // Functions from base classes + + /** + * From CActive Active object running method + */ + void RunL(); + + /** + * From CActive Active object error method + */ + TInt RunError(TInt aError); + + /** + * From CActive Active object cancelling method + */ + void DoCancel(); + + /** + * From MTRTranscoderObserver + */ + void MtroInitializeComplete(TInt aError); + + /** + * From MTRTranscoderObserver + */ + void MtroFatalError(TInt aError); + + /** + * From MTRTranscoderObserver + */ + void MtroReturnCodedBuffer(CCMRMediaBuffer* aBuffer); + + /** + * From MTRTranscoderObserver + */ + void MtroSetInputFrameRate(TReal& aRate); + + /** + * From MTRTranscoderObserver + */ + void MtroAsyncStopComplete(); + + /** + * From MTRTranscoderObserver + */ + inline void MtroSuspend() { }; + + /** + * From MTRTranscoderObserver + */ + inline void MtroResume() { }; + + /** + * From MCMRMediaSink + */ + void WriteBufferL(CCMRMediaBuffer* aBuffer); + + /** + * From MCMRMediaSink + */ + TInt SetVideoFrameSize(TSize aSize); + + /** + * From MCMRMediaSink + */ + TInt SetAverageVideoBitRate(TInt aBitRate); + + /** + * From MCMRMediaSink + */ + TInt SetMaxVideoBitRate(TInt aBitRate); + + /** + * From MCMRMediaSink + */ + TInt SetAverageAudioBitRate(TInt aBitRate); + + /** + * From MTRVideoPictureSink + */ + void MtroPictureFromTranscoder(TTRVideoPicture* aPicture); + + public: // New functions + + /** + * Sets the used frame size + * + * @param aSize Frame size + * @return Error codew + */ + void SetFrameSizeL(const TSize& aSize); + + /** + * Gets the current frame size + * + * @param aSize Frame size + * @return void + */ + void FrameSize(TSize& aSize) const; + + /** + * Sets the target frame rate + * + * @param aFrameRate frame rate + * @return Error code + */ + TInt SetFrameRate(const TReal aFrameRate); + + /** + * Sets the frame rate of input sequence + * + * @param aFrameRate frame rate + * @return Error code + */ + TInt SetInputFrameRate(const TReal aFrameRate); + + /** + * Sets the target random access rate + * + * @param aRate random access rate + * @return Error code + */ + TInt SetRandomAccessRate(const TReal aRate); + + /** + * Sets the target bitrate + * + * @param aBitrate Bitrate + * @return Error code + */ + TInt SetBitrate(const TInt aBitrate); + + /** + * Initializes the encoder + * + * @param aStatus Status object for active object + * @return void + */ + void InitializeL(TRequestStatus &aStatus); + + /** + * Encodes a frame + * + * @param aYUVFrame Frame to be encoded + * @param aStatus Status object for active object + * @param Timestamp of the frame + * @return void + */ + void EncodeFrameL(TPtr8 &aYUVFrame, TRequestStatus &aStatus, TTimeIntervalMicroSeconds aTimeStamp); + + /** + * Gets the encoded bitstream + * + * @param aKeyFrame Keyframe flag, True if the frame is Intra + * @return Descriptor containing the output bitstream + */ + TPtrC8& GetBufferL(TBool& aKeyFrame); + + /** + * Return used bitstream buffer + * + * @return void + */ + void ReturnBuffer(); + + /** + * Starts the encoder + * + * @return void + */ + void Start(); + + /** + * Stops the encoder + * + * @return void + */ + void Stop(); + + /** + * Resets the encoder + * + * @param aStatus Status object for active object + * @return void + */ + void Reset(TRequestStatus &aStatus); + + /** + * Resets the encoder synchronously + * + * @return void + */ + void Reset(); + + /** + * Gets status of whether encoding has been started + * + * @return ETrue if encoding has been started + */ + inline TBool BeenStarted() const { return iStarted; } + + /** + * Gets status of whether encoding request is pending + * + * @return ETrue if encode is pending + */ + inline TBool IsEncodePending() const { return iEncodePending; } + + /** + * Gets time increment resolution used in MPEG-4 + * + * @return Time increment resolution + */ + TInt GetTimeIncrementResolution() const; + + /** + * Forces the next encoded frame to be Intra + * + */ + void SetRandomAccessPoint(); + + private: + + /** + * C++ default constructor. + */ + CVideoEncoder(); + + /** + * By default EPOC constructor is private. + */ + void ConstructL(CStatusMonitor *aMonitor, CVedAVCEdit* aAvcEdit, + const TPtrC8& aVideoMimeType); + + /** + * Interpret and store video codec MIME-type, used by ConstructL + * @return void + */ + void SetVideoCodecL(const TPtrC8& aMimeType); + + /** + * Set encoding options + * @return void + */ + void SetupEncoderL(); + + /** + * Parses and writes codec specific information, i.e + * MPEG-4 VOL header and AVC decoder configuration record + * @return void + */ + void HandleCodingStandardSpecificInfoL(); + + private: // Data + + // Transcoder + CTRTranscoder* iTranscoder; + + // is encode pending ? + TBool iEncodePending; + + // has encoding been started ? + TBool iStarted; + + // used & max frame size, and info if size can be arbitrary + TSize iFrameSize; + TSize iMaxResolution; + TBool iArbitrarySizeAllowed; + + // target and max allowed frame rate + TReal32 iFrameRate; + TReal32 iMaxFrameRate; + + // input frame rate + TReal32 iInputFrameRate; + + // target random access rate + TReal iRandomAccessRate; + + // target and max allowed bit rate + TInt iBitRate; + TInt iMaxBitRate; + + // Mime type for encoded data + TBuf8<256> iMimeType; + + // input picture + TTRVideoPicture* iInputPicture; + + // bitstream buffer + HBufC8* iDataBuffer; + + // keyframe flag for bitstream buffer + TBool iKeyFrame; + + TPtrC8 iReturnDes; + + // External status info + TRequestStatus *iResetRequestStatus; + + TRequestStatus *iEncodeRequestStatus; + + TTimeIntervalMicroSeconds iPreviousTimeStamp; + + // MPEG-4 time increment resolution + TInt iTimeIncrementResolution; + + // input YUV data + TPtr8 iInputBuffer; + + // status monitor object + CStatusMonitor *iMonitor; + + // video object layer reader + CVedVolReader *iVolReader; + + RTimer iTimer; // timer object + TBool iTimerCreated; + TBool iTimerRequestPending; + + // Timer timeout, depends on codec and resolution + TUint iMaxEncodingDelay; + + // flag to check if devvideorec methods can be called or not; they can't be called after a fatal error + TBool iFatalError; + +#ifdef _DEBUG + TTime iEncodeStartTime; +#endif + + // AVC editing module + CVedAVCEdit* iAvcEdit; + + }; + + + +#endif