videditor/VideoEditorCommon/inc/VeiImageClipGenerator.h
author Mikael Laine <mikael.laine@ixonos.com>
Fri, 29 Jan 2010 14:08:33 +0200
changeset 0 951a5db380a0
permissions -rw-r--r--
Committing the Video Editor package under the Eclipse Public License

/*
* 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__