diff -r 000000000000 -r 951a5db380a0 videoeditor_plat/video_editor_engine_api/inc/VedVideoClipGenerator.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videoeditor_plat/video_editor_engine_api/inc/VedVideoClipGenerator.h Fri Jan 29 14:08:33 2010 +0200 @@ -0,0 +1,331 @@ +/* +* 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 __VEDVIDEOCLIPGENERATOR_H__ +#define __VEDVIDEOCLIPGENERATOR_H__ + +#include +#include + +#include "VedVideoClipInfo.h" + +class CVedMovie; +class CVedVideoClip; +class CVedVideoClipGenerator; + + +/** + * Observer for notifying that video clip frame has been completed. + * + * @see CVedVideoClipGenerator + */ +class MVedVideoClipGeneratorFrameObserver + { +public: + /** + * Called to notify that a video clip frame has been completed. + * + * @param aGenerator video clip generator + * @param aError KErrNone if frame was + * completed successfully; one of the system wide + * error codes if generating frame failed + * @param aFrame pointer to frame if it was completed successfully; + * NULL if generating frame failed + */ + virtual void NotifyVideoClipGeneratorFrameCompleted(CVedVideoClipGenerator& aGenerator, + TInt aError, + CFbsBitmap* aFrame) = 0; + }; + + +/** + * Abstract base class for video clip frame generators. Frame generators + * can be used to create video clips from bitmaps generated by the application + * (for example, by drawing with GDI). + */ +class CVedVideoClipGenerator : public CBase + { +public: + + /** + * Destructor. + */ + IMPORT_C virtual ~CVedVideoClipGenerator(); + + /** + * Returns whether this generator has been inserted to a movie + * or not. + * + * @return ETrue, if this generator has been + * inserted; EFalse, otherwise + */ + IMPORT_C TBool IsInserted() const; + + + /** + * Returns the movie this generator is associated with. + * Panics with EVideoClipGeneratorNotInserted + * if this generator has not been inserted to a movie yet. + * + * @return movie + */ + IMPORT_C CVedMovie* Movie() const; + + /** + * Returns the index of the video clip this generator is + * associated with.Panics with EVideoClipGeneratorNotInserted + * if this generator has not been inserted to a movie yet. + * + * @return video clip index + */ + IMPORT_C TInt VideoClipIndex() const; + + /** + * Returns whether this generator is owned by the video clip + * it is associated with (i.e., whether the video clip is responsible + * for deleting this generator). Panics with + * EVideoClipGeneratorNotInserted if this generator + * has not been inserted to a movie yet. + * + * @return ETrue, if this generator is owned by + * the video clip; EFalse, otherwise + */ + IMPORT_C TBool IsOwnedByVideoClip() const; + + /** + * Returns the uid of the frame generator. The use of the uid is + * entirely application specific. It can be used for example to + * identify the frame generator type. The uid is not used in + * any way by the video editor engine. + * + * @return uid of the frame generator + */ + virtual TUid Uid() const = 0; + + /** + * Returns a descriptive name for the clip. + * + * @return descriptive name of the clip + */ + virtual TPtrC DescriptiveName() const = 0; + + /** + * Returns the duration of the clip in microseconds. + * + * @return duration of the clip + */ + virtual TTimeIntervalMicroSeconds Duration() const = 0; + + + /* Video frame property methods. */ + + /** + * Returns the number of video frames in this clip. Panics if the + * clip is not ready. + * + * @return number of video frames in this clip + */ + virtual TInt VideoFrameCount() const = 0; + + /** + * Returns the start time of the video frame at the specified index. + * Panics if the index is illegal or if the clip is not ready. + * + * @param aIndex index + * + * @return start time of the video frame at the specified index in microseconds + */ + virtual TTimeIntervalMicroSeconds VideoFrameStartTime(TInt aIndex) const = 0; + + /** + * Returns the end time of the video frame at the specified index. + * Panics if the index is illegal or the clip is not ready. + * + * @param aIndex index + * + * @return end time of the video frame at the specified index in microseconds + */ + virtual TTimeIntervalMicroSeconds VideoFrameEndTime(TInt aIndex) const = 0; + + /** + * Returns the duration of the video frame at the specified index. + * Panics if the index is illegal or the clip is not ready. + * + * @param aIndex index + * + * @return duration of the video frame at the specified index in microseconds + */ + virtual TTimeIntervalMicroSeconds VideoFrameDuration(TInt aIndex) const = 0; + + /** + * Returns the complexity factor of the first video frame. The complexity factor + * should be in the range between 0 to 1000. 0 means no variation at all (a + * blank frame), 1000 means a highly complex frame. + * + * @see CalculateFrameComplexityFactor + * + * @return complexity factor, range 0...1000 + */ + virtual TInt VideoFirstFrameComplexityFactor() const = 0; + + + /** + * Returns the difference factor of the video frame at the specified + * index. The difference factor describes how different the frame is + * from the previous frame. The difference factor should be in the range between + * 0 to 1000 (0 means that the frame is identical to the previous one, 1000 + * means that the frame is completely different from the previous one.) + * Panics if the index is illegal or the clip is not yet ready. + * + * @param aIndex index (starting from 1) + * + * @return difference factor, range 0...1000 + */ + virtual TInt VideoFrameDifferenceFactor(TInt aIndex) const = 0; + + /** + * Returns the video frame index at the specified time. Panics if info is not yet + * ready for reading or the time is illegal. + * + * @param aTime time + * + * @return video frame index at the specified time + */ + virtual TInt GetVideoFrameIndex(TTimeIntervalMicroSeconds aTime) const = 0; + + + /* Frame methods. */ + + /** + * Generates a bitmap of the given frame. The frame bitmap is scaled + * to the specified resolution and converted to the specified display + * mode. This method is asynchronous. The frame is generated in the + * background and the observer is notified when the frame is complete. + * This method panics if the resolution is illegal. + * + * Possible leave codes: + * - KErrNoMemory if memory allocation fails + * - KErrNotSupported, if the specified combination of + * parameters is not supported + * + * @param aObserver observer to be notified when the frame is completed + * @param aIndex index of frame, or KFrameIndexBestThumb to look for + * the most suitable thumbnail frame. + * @param aResolution resolution of the desired frame bitmap, or + * NULL if the frame should be + * in the original resolution + * @param aDisplayMode desired display mode; or ENone if + * any display mode is acceptable + * @param aEnhance apply image enhancement algorithms to improve + * frame quality; note that this may considerably + * increase the processing time needed to prepare + * the frame + * @param aPriority priority of the frame generation + */ + virtual void GetFrameL(MVedVideoClipGeneratorFrameObserver& aObserver, + TInt aIndex = KFrameIndexBestThumb, + TSize* const aResolution = 0, + TDisplayMode aDisplayMode = ENone, + TBool aEnhance = EFalse, + TInt aPriority = CActive::EPriorityIdle) = 0; + + /** + * Cancels frame generation. If no frame is currently being + * generated, the function does nothing. + */ + virtual void CancelFrame() = 0; + +protected: // constructors and methods + + /** + * Constructor. + */ + IMPORT_C CVedVideoClipGenerator(); + + /** + * Reports to the base class that the duration of the generated clip has + * changed. This method should always be called when the + * settings of the generated clip change so that the duration of the + * clip is affected. + */ + IMPORT_C void ReportDurationChanged() const; + + /** + * Reports to the base class that some settings of the generated clip have + * changed but the duration of the clip has remained the same. + * This method should always be called when any settings + * of the generated clip change but the duration of the clip is not affected. + */ + IMPORT_C void ReportSettingsChanged() const; + + /** + * Reports to the base class that descriptive name of the generated + * clip has changed. This method should always be called + * when the descriptive name of the generated clip has changed but no + * other changes have occurred. + */ + IMPORT_C void ReportDescriptiveNameChanged() const; + + /** + * Calculates the complexity of a frame. This method is meant for calculating + * frame complexity factors returned by VideoFirstFrameComplexityFactor + * method. + * + * @see VideoFirstFrameComplexityFactor + * + * @param aFrame frame to analyze + * + * @return complexity factor + */ + IMPORT_C TInt CalculateFrameComplexityFactor(CFbsBitmap* aFrame) const; + +private: // methods + + /** + * Sets the video clip this generator is associated with and whether + * the clip owns this generator or not. Note that these properties can + * be set only once during the lifetime of a generator when the + * generator is inserted to a movie. Panics with + * EVideoClipGeneratorAlreadyInserted if the video clip + * has already been set. + * + * @param aVideoClip video clip + * @param aIsOwnedByVideoClip ETrue, if the clip is responsible + * for deleting this generator; EFalse, + * otherwise + */ + void SetVideoClip(CVedVideoClip& aVideoClip, TBool aIsOwnedByVideoClip); + + +private: + // Member variables + + CVedVideoClip* iVideoClip; + TBool iIsOwnedByVideoClip; + + TInt iMaximumFramerate; + + friend class CVedMovieAddClipOperation; + friend class CVideoEditorTest; + + }; + +#endif // __VEDVIDEOCLIPGENERATOR_H__ +