videditor/VideoEditorCommon/inc/VeiImageClipGenerator.h
changeset 0 951a5db380a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/videditor/VideoEditorCommon/inc/VeiImageClipGenerator.h	Fri Jan 29 14:08:33 2010 +0200
@@ -0,0 +1,446 @@
+/*
+* 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: 
+*
+*/
+
+
+
+#ifndef __VEIIMAGECLIPGENERATOR_H__
+#define __VEIIMAGECLIPGENERATOR_H__
+
+#include <e32base.h>
+
+#include <VedVideoClipGenerator.h>
+
+/*
+ * UID of this generator. The Uids are only used to identify generators
+ * in UI, the Engine does not use Uids for any purpose.
+ */
+#define KUidImageClipGenerator TUid::Uid(0x00000001)
+
+
+// Forward declarations
+class CVeiImageClipFrameOperation;
+class CVeiImageClipDecodeOperation;
+class CFbsBitmap;
+class CImageDecoder;
+class CVeiImageClipGenerator;
+class CBitmapScaler;
+
+
+/**
+ * Image clip generator observer.
+ */
+class MVeiImageClipGeneratorObserver
+	{
+public:
+	/**
+	 * Callback method to notify that the image clip generator initialization
+	 * is complete.
+	 *
+	 * @param aGenerator  generator that caused the event
+	 * @param aError	  error code
+	 */
+	virtual void NotifyImageClipGeneratorInitializationComplete(
+		CVeiImageClipGenerator& aGenerator, TInt aError) = 0;
+	};
+
+
+/**
+ * Image clip generator.
+ */
+class CVeiImageClipGenerator : public CVedVideoClipGenerator
+	{
+public:
+
+	/* Constructors / destructors. */
+
+	/**
+	 * Factory method. Creates a new image clip generator.
+	 * 
+	 * @param aFilename		  filename for the image
+	 * @param aMaxResolution  maximum resolution that will be used
+	 * @param aDuration		  duration of the image frame
+	 * @param aBackgroundColor  background color
+	 * @param aMaxDisplayMode	display mode in which the bitmap is stored
+	 * @param aFs			  RFs session to use for loading the image
+	 * @param aObserver		  observer that will be notified when the
+	 *						  initialization is complete
+	 *
+	 * @return  constructed image clip generator
+	 */
+	IMPORT_C static CVeiImageClipGenerator* NewL(const TDesC& aFilename,
+												 const TSize& aMaxResolution, 
+												 const TTimeIntervalMicroSeconds& aDuration, 
+												 const TRgb& aBackgroundColor,
+												 TDisplayMode aMaxDisplayMode,
+												 RFs& aFs,
+												 MVeiImageClipGeneratorObserver& aObserver);
+		
+	/**
+	 * Factory method. Creates a new image clip generator and leaves it
+	 * in the cleanup stack.
+	 * 
+	 * @param aFilename		    filename for the image
+	 * @param aMaxResolution    maximum resolution that will be used
+	 * @param aDuration		    duration of the image frame
+	 * @param aBackgroundColor  background color
+	 * @param aMaxDisplayMode	display mode in which the bitmap is stored
+	 * @param aFs			    RFs session to use for loading the image
+	 * @param aObserver		    observer that will be notified when the
+	 *						    initialization is complete
+	 *
+	 * @return  constructed image clip generator
+	 */
+	IMPORT_C static CVeiImageClipGenerator* NewLC(const TDesC& aFilename,
+												  const TSize& aMaxResolution,
+												  const TTimeIntervalMicroSeconds& aDuration, 
+												  const TRgb& aBackgroundColor,
+												  TDisplayMode aMaxDisplayMode,
+ 												  RFs& aFs,
+												  MVeiImageClipGeneratorObserver& aObserver);
+
+	/**
+	 * Destructor.
+	 */
+	IMPORT_C virtual ~CVeiImageClipGenerator();
+
+
+	/* Property methods. */
+
+	IMPORT_C virtual TPtrC DescriptiveName() const;
+
+	IMPORT_C virtual TUid Uid() const;
+
+    IMPORT_C virtual TTimeIntervalMicroSeconds Duration() const;
+
+
+	/* Video frame property methods. */
+
+    IMPORT_C virtual TInt VideoFrameCount() const ;
+
+	IMPORT_C virtual TTimeIntervalMicroSeconds VideoFrameStartTime(TInt aIndex) const;
+
+	IMPORT_C virtual TTimeIntervalMicroSeconds VideoFrameEndTime(TInt aIndex) const;
+
+	IMPORT_C virtual TTimeIntervalMicroSeconds VideoFrameDuration(TInt aIndex) const;
+
+	IMPORT_C virtual TBool VideoFrameIsIntra(TInt aIndex) const;
+
+	IMPORT_C virtual TInt VideoFirstFrameComplexityFactor() const;
+
+	IMPORT_C virtual TInt VideoFrameDifferenceFactor(TInt aIndex) const;
+
+    IMPORT_C virtual TInt GetVideoFrameIndex(TTimeIntervalMicroSeconds aTime) const;
+
+
+	/* Frame methods. */
+
+	IMPORT_C virtual void GetFrameL(MVedVideoClipGeneratorFrameObserver& aObserver,
+                           TInt aIndex,
+		                   TSize* const aResolution,
+						   TDisplayMode aDisplayMode,
+						   TBool aEnhance,
+						   TInt aPriority);
+    
+	IMPORT_C virtual void CancelFrame();
+
+
+	/* New methods. */
+
+	/**
+	 * Sets the duration.
+	 *
+	 * @param aDuration  duration
+	 */
+	IMPORT_C void SetDuration(const TTimeIntervalMicroSeconds& aDuration);
+
+	/**
+	 * Sets the background color.
+	 *
+	 * @param aBackgroundColor
+	 */
+	IMPORT_C void SetBackgroundColor(const TRgb& aBackgroundColor);
+
+	/**
+	 * Gets the background color.
+	 * 
+	 * @return  background color
+	 */
+	IMPORT_C const TRgb& BackgroundColor() const;
+
+	/**
+	 * Returns the image file name.
+	 *
+	 * @return  filename
+	 */
+	IMPORT_C TPtrC ImageFilename() const;
+
+private: // constructors
+	
+	/**
+	 * First-phase constructor.
+	 * 
+	 * @param aDuration        duration
+	 * @param aBackgroundColor background color 
+	 * @param aMaxResolution   maximum resolution
+	 */
+	CVeiImageClipGenerator(const TTimeIntervalMicroSeconds& aDuration, 
+						   const TRgb& aBackgroundColor,
+						   const TSize& aMaxResolution);
+
+	/**
+	 * Second-phase constructor.
+	 * 
+	 * @param aFilename       filename of the image
+	 * @param aObserver       observer
+	 * @param aMaxDisplyMode  display mode
+	 * @param aFs             RFs session
+	 */
+	void ConstructL(const TDesC& aFilename, 
+					MVeiImageClipGeneratorObserver& aObserver,
+					TDisplayMode aMaxDisplayMode, RFs& aFs);
+
+	
+private:
+	/**
+	 * Updates the first frame complexity factor.
+	 */
+	void UpdateFirstFrameComplexityFactorL();
+
+private:
+    // Member variables
+
+	/** Flag for readiness indication. */
+	TBool iReady;
+
+	/** First frame complexity factor. */
+	TInt iFirstFrameComplexityFactor;
+
+	/** Resolution. */
+	TSize iMaxResolution;
+
+	/** Duration. */
+	TTimeIntervalMicroSeconds iDuration;
+
+	/** Background color. */
+	TRgb iBackgroundColor;
+
+	/** Image decode operation. */
+	CVeiImageClipDecodeOperation* iDecodeOperation;
+
+	/** Frame generating operation. */
+	CVeiImageClipFrameOperation* iFrameOperation;
+
+	/** Descriptive name. */
+	HBufC* iDescriptiveName;
+
+	/** Image filename */
+	HBufC* iFilename;
+	
+	/** Bitmap. */
+	CFbsBitmap* iBitmap;
+
+	/** Mask. */
+	CFbsBitmap* iMask;
+
+	/** Is the generator initializing? */
+	TBool iInitializing;
+
+	/** Frame count. */
+	TInt iFrameCount;
+
+	friend class CVeiImageClipDecodeOperation;
+	};
+
+
+/**
+ * Image decode operation. Helper class for decoding the image and 
+ * performing first-stage resizing.
+ */
+class CVeiImageClipDecodeOperation : public CActive
+	{
+	public: 
+		/**
+		 * Factory constructor. 
+		 * 
+		 * @param aGenerator  generator that owns this operation
+		 * @param aFilename	  filename for the image
+		 * @param aObserver	  observer that will be notified when the
+		 *					  operation completes
+		 * @param aFs		  RFs session to use for loading the image
+		 * @param aPriority   priority of the active object
+		 *
+		 * @return  constructed image clip decode operation
+		 */
+		static CVeiImageClipDecodeOperation* NewL(CVeiImageClipGenerator& aGenerator,
+												  const TDesC& aFilename, 
+												  MVeiImageClipGeneratorObserver& aObserver,
+												  RFs& aFs,
+												  TInt aPriority = CActive::EPriorityStandard);
+		/**
+		 * Destructor.
+		 */
+		virtual ~CVeiImageClipDecodeOperation();
+
+		virtual void RunL();
+		virtual void DoCancel();
+		virtual TInt RunError(TInt aError);
+
+		/**
+		 * Starts the operation.
+		 * 
+		 * @param aMaxResolution  maximum resolution that will be used
+		 * @param aDisplayMode	  display mode
+		 */
+		void StartOperationL(const TSize& aMaxResolution, TDisplayMode aDisplayMode);
+
+	private: // methods
+
+		/**
+		 * First-phase constructor.
+		 *
+		 * @param aGenerator  generator that owns this operation
+		 * @param aObserver	  observer that will be notified when the
+		 *					  operation completes
+		 * @param aPriority   priority of the active object
+		 */
+		CVeiImageClipDecodeOperation(CVeiImageClipGenerator& aGenerator, 
+									 MVeiImageClipGeneratorObserver& aObserver,
+									 TInt aPriority);
+
+		/**
+		 * Second-phase constructor.
+		 *
+ 		 * @param aFilename	  filename for the image
+		 * @param aFs		  RFs session to use for loading the image
+		 */
+
+		void ConstructL(const TDesC& aFilename, RFs& aFs);
+
+	private: // members
+
+		/** Generator that owns this operation*/
+		CVeiImageClipGenerator& iGenerator;
+
+		/** Observer to be notified when the operation completes. */
+		MVeiImageClipGeneratorObserver& iObserver;
+
+		/** Decoder. */
+		CImageDecoder* iDecoder;
+
+		/** Bitmap. */
+		CFbsBitmap* iBitmap;
+
+		/** Mask. */
+		CFbsBitmap* iMask;
+	};
+
+
+/**
+ * Image frame operation.
+ */
+class CVeiImageClipFrameOperation : public CActive
+	{
+	public: 
+		/**
+		 * Factory constructor. 
+		 * 
+		 * @param aGenerator  generator that owns this operation
+		 *
+		 * @return  constructed image clip frame operation
+		 */
+		static CVeiImageClipFrameOperation* NewL(CVeiImageClipGenerator& aGenerator);
+
+		/**
+		 * Destructor. 
+		 */
+		virtual ~CVeiImageClipFrameOperation();
+
+		/**
+		 * Starts the operation.
+		 *
+		 * @param aObserver      observer to notify when the frame is complete
+		 * @param aIndex         index of the frame to generate
+		 * @param aEnhance       <code>ETrue</code> to produce better results
+		 *                       but slower, <code>EFalse</code> to be as fast
+		 *                       as possible.
+		 * @param aSourceBitmap  source bitmap
+		 * @param aDestBitmap    destination bitmap
+		 * @param aSourceMask    source mask
+		 * @param aPriority      priority for the active object
+		 *
+		 */
+		void StartOperationL(MVedVideoClipGeneratorFrameObserver* aObserver, 
+			TInt aIndex, TBool aEnhance, CFbsBitmap* aSourceBitmap, 
+			CFbsBitmap* aDestBitmap, CFbsBitmap* aSourceMask, TInt aPriority);
+
+		virtual void RunL();
+		virtual void DoCancel();
+		virtual TInt RunError(TInt aError);
+
+	private: // methods
+		/**
+		 * First-phase constructor.
+		 * 
+		 * @param aGenerator  generator that owns this operation
+		 */
+		CVeiImageClipFrameOperation(CVeiImageClipGenerator& aGenerator);
+
+		/**
+		 * Second-phase constructor.
+		 */
+		void ConstructL();
+
+	private: // members
+		/** Generator. */
+		CVeiImageClipGenerator& iGenerator;
+
+		/** Index of the frame being generated. */
+		TInt iIndex;
+
+		/** Whether to be fast or do quality work. */
+		TBool iEnhance;
+
+		/** Source bitmap. */
+		CFbsBitmap* iSourceBitmap;
+
+		/** Destination bitmap. */
+		CFbsBitmap* iDestBitmap;
+
+		/** Scaled bitmap. */
+		CFbsBitmap* iScaledBitmap;
+
+		/** Scaled mask. */
+		CFbsBitmap* iScaledMask;
+
+		/** Source mask. */
+		CFbsBitmap* iSourceMask;
+
+		/** Scaler. */
+		CBitmapScaler* iScaler;
+
+		/** Flag for no scaling. */
+		TBool iNoScaling;
+
+		/** Observer. */
+		MVedVideoClipGeneratorFrameObserver* iObserver;
+	};
+
+
+
+#endif // __VEIIMAGECLIPGENERATOR_H__
+