--- /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 <e32base.h>
+#include <fbs.h>
+
+#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 <code>KErrNone</code> 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;
+ * <code>NULL</code> 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 <code>ETrue</code>, if this generator has been
+ * inserted; <code>EFalse</code>, otherwise
+ */
+ IMPORT_C TBool IsInserted() const;
+
+
+ /**
+ * Returns the movie this generator is associated with.
+ * Panics with <code>EVideoClipGeneratorNotInserted</code>
+ * 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 <code>EVideoClipGeneratorNotInserted</code>
+ * 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
+ * <code>EVideoClipGeneratorNotInserted</code> if this generator
+ * has not been inserted to a movie yet.
+ *
+ * @return <code>ETrue</code>, if this generator is owned by
+ * the video clip; <code>EFalse</code>, 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:
+ * - <code>KErrNoMemory</code> if memory allocation fails
+ * - <code>KErrNotSupported</code>, 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
+ * <code>NULL</code> if the frame should be
+ * in the original resolution
+ * @param aDisplayMode desired display mode; or <code>ENone</code> 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 <emph>always</emph> 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 <emph>always</emph> 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 <emph>always</emph> 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 <code>VideoFirstFrameComplexityFactor</code>
+ * 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
+ * <code>EVideoClipGeneratorAlreadyInserted</code> if the video clip
+ * has already been set.
+ *
+ * @param aVideoClip video clip
+ * @param aIsOwnedByVideoClip <code>ETrue</code>, if the clip is responsible
+ * for deleting this generator; <code>EFalse</code>,
+ * 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__
+