camcordermmfplugin/mediarecorder/Inc/CCMRMediaRecorderImp.h
changeset 0 9b3e960ffc8a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/camcordermmfplugin/mediarecorder/Inc/CCMRMediaRecorderImp.h	Thu Dec 17 08:51:24 2009 +0200
@@ -0,0 +1,435 @@
+/*
+* Copyright (c) 2004 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:  Media recorder implementation header
+*
+*/
+
+
+#ifndef CCMRMEDIARECORDERIMP_H
+#define CCMRMEDIARECORDERIMP_H
+
+//  INCLUDES
+#include "CCMRMediaRecorder.h"
+#include "CCMRVideoRecorderClient.h"
+#include "CCMRAudioRecorder.h"
+#include "CCMRActiveOutput.h"
+
+// FORWARD DECLARATION
+class CCMRPerfMonitor;
+class CCMRConfigManager;
+
+
+// CLASS DECLARATION
+
+/**
+*  Media recorder implementation
+*
+*  @lib CAMCMEDIARECORDER.LIB
+*  @since 2.1
+*/
+
+class CCMRMediaRecorderImp : public CCMRMediaRecorder, public MCMRVideoRecorderObserver,
+                             public MCMRAudioRecorderObserver, public MCMRActiveOutputObserver
+    {
+
+    public:  // Constants
+
+        // Error codes
+        enum TErrorCode
+            {
+            EInternalAssertionFailure = -10000
+            };
+
+    public:  // Constructors and destructor
+        
+        /**
+        * C++ default constructor.
+        */
+        CCMRMediaRecorderImp();
+
+        /**
+        * Symbian 2nd phase constructor
+        */
+        void ConstructL();                
+        
+        /**
+        * Destructor.
+        */
+        ~CCMRMediaRecorderImp();    
+
+    public: // new functions
+
+        /**
+        *  Internal class for reporting errors to observer using active object
+        *  Needed to break the callback chain since controller may call MR::StopL from this callback
+        */
+        class CCMRErrorReporter : public CActive
+            {
+            public: // Constants
+                enum TErrorType
+                    {
+                    EErrorFatal,
+                    EErrorTemp
+                    };
+
+                class TCMRError
+                    {
+                    public:
+                        TCMRError(TInt aError, TErrorType aType) : iErrorCode(aError), iErrorType(aType) {};
+
+                    public: //data
+                        // Error code from the client to be passed
+                        TInt iErrorCode;
+                        // Error types (fatal/temporary)
+                        TErrorType iErrorType;
+                    };
+
+
+            public: // Constructors and destructor
+                /**
+                * C++ default constructor.
+                */
+                CCMRErrorReporter(MCMRMediaRecorderObserver *aObserver);
+                /**
+                * Destructor.
+                */
+                ~CCMRErrorReporter();
+
+            public: // New functions
+                /**
+                * Report fatal error to the observer
+                */
+                void FatalError(TInt aError);
+                /**
+                * Report temporary error to the observer
+                */
+                void TemporaryError(TInt aError);
+
+            protected: // from baseclass
+
+                /**
+                * From CActive Does the required action (calls the observer)
+                */
+                void RunL();
+                /**
+                * From CActive Cancels pending actions
+                */
+                void DoCancel();
+
+            private: // data
+                // List of error codes from the client to be passed
+                RArray<TCMRError> iErrors;
+                // Observer for whom to report the error
+                MCMRMediaRecorderObserver *iObserver;
+                // ETrue if RunL of the active object is running => another AO can't change the contents of the object
+                TBool iRunning;
+            };
+
+    public: // Functions from base classes
+        
+        /**
+        * From CCMRMediaRecorder 
+        */        
+        void OpenL(MCMRMediaRecorderObserver *aObserver, 
+                   MDataSource *aAudioSource, 
+                   MCMRMediaSink *aSink, TInt aCameraHandle, 
+                   const TDesC8& aVideoMimeType = KNullDesC8,  // video codec to use     
+                   TFourCC aAudioType = KFourCCNULL); // audio codec to use
+        
+        /**
+        * From CCMRMediaRecorder Return current state
+        */ 
+        inline TRecorderState State() { return iState; }
+        
+        // Settings
+        
+        /**
+        * From CCMRMediaRecorder Set video codec to be used (overrides the one given in OpenL)
+        */
+        void SetVideoCodecL( const TDesC8& aVideoMimeType );
+
+        /**
+        * From CCMRMediaRecorder Get the used video codec
+        */
+        void GetVideoCodecL( TDes8& aVideoMimeType );
+
+        /**
+        * From CCMRMediaRecorder Get the supported & installed video codecs
+        */
+        void GetSupportedVideoCodecsL( CDesC8Array& aVideoMimeTypes );
+
+        /**
+        * From CCMRMediaRecorder Set audio codec to be used (overrides the one given in OpenL)
+        */
+        void SetAudioCodecL( const TFourCC& aAudioType );
+        
+        /**
+        * From CCMRMediaRecorder Get the used audio codec
+        */
+        void GetAudioCodecL( TFourCC& aAudioType );
+        
+        /**
+        * From CCMRMediaRecorder Get the supported & installed audio codecs
+        */
+        void GetSupportedAudioCodecsL( RArray<TFourCC>& aAudioTypes );
+
+        /**
+        * From CCMRMediaRecorder Set new maximum total (audio+video) bitrate
+        */
+        inline void SetMaxTotalBitRateL(TInt aBitRate) { iMaxTargetBitRate = aBitRate; }
+
+        /**
+        * From CCMRMediaRecorder Get current maximum total (audio+video) bitrate
+        */
+        inline TInt MaxTotalBitRateL() const { return iMaxTargetBitRate; }
+
+        /**
+        * From CCMRMediaRecorder Set new video frame rate
+        */
+        void SetVideoFrameRateL(TReal32 aFrameRate);
+        
+        /**
+        * From CCMRMediaRecorder Get current video frame rate
+        */
+        TReal32 VideoFrameRateL();
+
+        /**
+        * From CCMRMediaRecorder Set new video frame size
+        */
+        void SetVideoFrameSizeL(const TSize& aSize);
+
+        /**
+        * From CCMRMediaRecorder Get current video frame size
+        */
+        void GetVideoFrameSizeL(TSize& aSize) const;
+
+        /**
+        * From CCMRMediaRecorder Set new target video bitrate
+        */
+        void SetVideoBitRateL(TInt aBitRate);
+
+        /**
+        * From CCMRMediaRecorder Get current target video bitrate
+        */
+        TInt VideoBitRateL();
+
+        /**
+        * From CCMRMediaRecorder Set misc video coding options
+        */
+        void SetVideoCodingOptionsL(const TCCMRVideoCodingOptions& aOptions);
+
+        /**
+        * From CCMRMediaRecorder Set video rate control options
+        */
+    	void SetVideoRateControlOptionsL(const TRateControlOptions& aOptions);        
+        
+        /**
+        * From CCMRMediaRecorder Get video rate control options
+        */
+        void GetVideoRateControlOptionsL(TRateControlOptions& aOptions);        
+    	
+        /**
+        * From CCMRMediaRecorder Set new target audio bitrate
+        */
+        void SetAudioBitRateL(TInt aBitRate);
+
+        /**
+        * From CCMRMediaRecorder Gets the current target audio bitrate  
+        */
+        TInt AudioBitRateL();
+
+        /**
+        * From CCMRMediaRecorder Toggles audio recording on/off
+        */
+        void SetAudioEnabledL(TBool aEnabled);
+
+        /**
+        * From CCMRMediaRecorder Query whether audio recording is enabled
+        */
+        TBool AudioEnabledL() const;                
+        
+        /**
+        * From CCMRMediaRecorder Set new audio recording input gain
+        */
+        void SetGainL(TInt aGain);
+
+        /**
+        * From CCMRMediaRecorder Get current audio recording gain
+        */
+        TInt GainL() const;
+
+        /**
+        * From CCMRMediaRecorder Get maximum audio recording gain
+        */
+        TInt MaxGainL() const;   
+        
+        /**
+        * From CCMRMediaRecorder Set audio priority settings
+        */
+        void SetAudioPriorityL(const TMMFPrioritySettings& aPrioritySettings);
+
+
+        // Recording control
+     
+        /**
+        * From CCMRMediaRecorder Prepares the recorder for recording
+        */
+        void PrepareL();
+
+        /**
+        * From CCMRMediaRecorder Starts recording audio and video
+        */
+        void RecordL();
+      
+        /**
+        * From CCMRMediaRecorder Stops recording audio and video
+        */
+        void StopL();
+       
+        /**
+        * From CCMRMediaRecorder Pauses recording
+        */
+        void PauseL();
+
+        /**
+        * From CCMRMediaRecorder Resumes recording
+        */
+        void ResumeL();
+
+        /**
+        * From CCMRMediaRecorder Called when video recorder state has changed
+        */
+        void MvroStateChange(CCMRRecorderBase::TRecorderState aState);
+
+        /**
+        * From CCMRMediaRecorder Called when an error has occurred in the video recorder
+        */
+        void MvroError(TInt aError);    
+
+
+        /**
+        * From MCMRAudioRecorderObserver Informs that audio recorder has changed its state
+        */
+        void MaroStateChange(CCMRRecorderBase::TRecorderState aState);
+
+        /**
+        * From MCMRAudioRecorderObserver Informs about error in audio recorder
+        */
+        void MaroError(TInt aError);
+
+        /**
+        * From MCMRActiveOutputObserver Informs about error in active output
+        */
+        void MaooError(TInt aError);
+
+        // Video encoder overrides
+
+        /**
+        * Set video encoder using its UID. Usage optional.
+        * This overrides Media Recorder internal search for encoder based on set video mime type ( SetVideoCodecL() ).
+        *
+        * @since 3.2.3
+        * @param    "aEncoder"  "Video encoder UID."
+        * @return void
+        */
+        void SetPreferredVideoEncoderL(TUid& aEncoder);
+
+        /**
+        * Set video encoder output format encapsulation. Usage optional.
+        * This overrides Media Recorder internal default preferences for TVideoDataUnitEncapsulation with H.264/AVC video output.
+        * if used encoder supports multiple encapsulations.
+        *
+        * Default for H.264 / AVC is EDuGenericPayload
+        * Possible values: EDuGenericPayload or EDuElementaryStream
+        *
+        * @since 3.2.3
+        * @param    "aCapsulation"  "Encapsulation for coded video data units."
+        * @return void
+        */
+        void SetPreferredVideoEncapsulationL(TVideoDataUnitEncapsulation aCapsulation);
+        
+        /**
+        * Set video encoder target segment size. Usage optional.
+        * @since 5.2
+        * @param  TUint aLayer              Layer number
+        * @param  TUint aSizeBytes          Segment target size in bytes
+        * @param  TUint aSizeMacroblocks    Segment target size in number of macroblocks per segment
+        * @return TBool
+        */            
+        void SetSegmentTargetSizeL(TUint aLayer, TUint aSizeBytes, TUint aSizeMacroblocks );        
+
+    private:  // Data
+
+        // internal state
+        TRecorderState iState;
+
+        // observer for callbacks
+        MCMRMediaRecorderObserver* iObserver;
+
+        // media sink, e.g. 3GP file composer
+        MCMRMediaSink* iSink;
+
+        // active objects taking care of video and audio output
+        CCMRActiveOutput* iAudioOutput;
+        CCMRActiveOutput* iVideoOutput;
+
+        // MMF audio input, given as parameter
+        MDataSource *iAudioSource;
+
+        // video recorder
+        CCMRVideoRecorderClient* iVideoRecorder; 
+
+        // audio recorder
+        CCMRAudioRecorder* iAudioRecorder; 
+
+        // is video recording being prepared ?
+        TBool iVideoRecorderPreparing;  
+
+        // is audio recording being prepared ?
+        TBool iAudioRecorderPreparing;  
+
+        // audio recording flag (on/off)
+        TBool iAudioEnabled;  
+
+        // Max bitrate, -1 if not set (=> won't be checked when setting A/V bitrates)       
+        TInt iMaxTargetBitRate;  
+        // target bitrate, used only to store the actual value when asked from audio/videorecorder
+        TInt iTargetBitRate;
+        // video frame rate, used only to store the actual value when asked from videorecorder
+        TReal32 iFrameRate;
+
+        // Error code saved while waiting for a completion of an async operation
+        TInt iErrorCode;
+
+        // Flags used when waiting async stoppings to complete
+        TBool iVideoStopped;
+        TBool iAudioStopped;
+        
+        // Status for EOS / streamend marker
+        TInt iVideoEOSReached;
+
+        // Active object to report errors to the observer. Needed to break the callback chain since the observer may call e.g. MR::Stop in the callback
+        CCMRErrorReporter* iErrorReporter;
+
+        // Performance monitor object
+        CCMRPerfMonitor *iPerfMonitor;
+        
+        // Mediarecorder / CamcorderMMFPlugin config manager.
+        CCMRConfigManager* iConfig;
+    };
+
+
+#endif // CCMRMEDIARECORDERIMP_H
+
+// End of file