videditor/SimpleCutVideo/inc/VeiSimpleCutVideoContainer.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 VEICUTVIDEOCONTAINER_H
#define VEICUTVIDEOCONTAINER_H

#include <coecntrl.h>
#include <VideoPlayer.h>
#include <VedCommon.h>
#include <VedMovie.h>
#include <aknprogressdialog.h>
#include <coedef.h>

#include "VeiVideoDisplay.h"
#include "VeiImageConverter.h"
#include "VeiRemConTarget.h"
#include "mveinavipanecontrolobserver.h" 


class CVeiSimpleCutVideoView;
class CVeiCutterBar;
class CAknsBasicBackgroundControlContext;
class CVeiErrorUI;
class CVeiVideoDisplay;
class CVeiTextDisplay;
#ifdef RD_TACTILE_FEEDBACK 
class MTouchFeedback; 
#endif /* RD_TACTILE_FEEDBACK  */

//const TInt KMinVolumeLevel = 1;			
const TInt KVeiCutBarHeight = 20;
const TInt KProgressbarFinalValue = 50;
_LIT(KEncoderType, "JPEG" );			// encoder type for image conversion	

/**
 * CVeiSimpleCutVideoContainer container control class.
 *  
 * Container for CVeiSimpleCutVideoView.
 */
class CVeiSimpleCutVideoContainer :	public CCoeControl,
								public MCoeControlObserver,
								public MVedVideoClipFrameObserver,
								public MVedVideoClipInfoObserver, 
								public MConverterController, 
								public MProgressDialogCallback,
								public MVeiVideoDisplayObserver,
								public MVeiMediakeyObserver,
						        public MVeiNaviPaneControlObserver
    {
	public:
		/**
		 * Edit state.
		 */
		enum TCutVideoState
			{
			EStateInitializing = 1,
			EStateOpening,
			EStateStoppedInitial,
			EStateStopped,
			EStatePlaying,
			EStatePlayingMenuOpen,
			EStatePaused,
			EStateGettingFrame,
			EStateBuffering,
			EStateTerminating
			};
			
		/**
		 * Start or end mark.
		 */
		enum TCutMark
			{
			ENoMark,
			EStartMark,
			EEndMark,
			EPlayHead
			};
			
    public:
		/**
		 * Creates a CVeiSimpleCutVideoContainer object, which will draw itself to aRect.
		 *
		 * @param aRect Frame rectangle for container.
		 * @param aView 
		 *
		 * @return a pointer to the created instance of CStoryboardContainer
		 */
		 static CVeiSimpleCutVideoContainer* NewL( const TRect& aRect, CVeiSimpleCutVideoView& aView, CVeiErrorUI& aErrorUI );

		/**  
		* Creates a CVeiSimpleCutVideoContainer object, which will draw itself to aRect.
		* Leaves the created object in the cleanup stack.
		*
		* @param aRect Frame rectangle for container.
		* @param aMovie  movie being edited
		*
		* @return a pointer to the created instance of CStoryboardContainer
		*/
		static CVeiSimpleCutVideoContainer* NewLC( const TRect& aRect, CVeiSimpleCutVideoView& aView, CVeiErrorUI& aErrorUI );

	     /**
         * Default constructor.
		 *
         * @param aRect  Frame rectangle for container.
		 * @param aView  pointer to the view.
         */
        void ConstructL(const TRect& aRect, CVeiSimpleCutVideoView& aView, CVeiErrorUI& aErrorUI );

        /**
        * Destructor.
        */
        virtual ~CVeiSimpleCutVideoContainer();

    public: 
		/**
		 * Takes one thumbnail bitmap from given file.
		 *
		 * @param aFilename	name of video clip file
		 */
		void GetThumbL( const TDesC& aFilename );

		/**
		 * ###Missin' description###
		 *
		 * @param aState
		 */
		void SetStateL( CVeiSimpleCutVideoContainer::TCutVideoState aState, TBool aUpdateCBA = ETrue);
		/**
		 * Starts playing.
		 *
		 * @param aStartTime
		 */
		void PlayL( const TDesC& aFilename );
		void PlayMarkedL( 	const TDesC& aFilename, 
							const TTimeIntervalMicroSeconds& aStartTime, 
							const TTimeIntervalMicroSeconds& aEndTime );
		/**
		 * Stops playing.
		 */
		void StopL();

		/**
		 * Pauses playing.
		 */
		void PauseL( TBool aUpdateCBA = ETrue );

		/**
		 * Closes the stream.
		 */
		void CloseStreamL();

		/**
		 * Returns the playback position.
		 *
		 * @return  playback position
		 */
		TTimeIntervalMicroSeconds PlaybackPositionL();

		/**
		 * Marks the in point.
		 */
		void MarkedInL();

		/**
		 * Marks the out point.
		 */
		void MarkedOutL();

		/**
		 * Sets cut in time to cut video bar.
		 *
		 * @param aTime	Cut ín time
		 */
		void SetInTime( const TTimeIntervalMicroSeconds& aTime );

		/**
		 * Sets cut out time to cut video bar.
		 *
		 * @param aTime	Cut out time
		 */
		void SetOutTime( const TTimeIntervalMicroSeconds& aTime );

		/**
		* Takes the snapshot from current frame
		*/
		void TakeSnapshotL();
		
		void MuteL();
    public: 
	
		/**
		 * Update function that is called by the static callback method.
		 */
		void DoUpdate();
		// from MVeiVideoDisplayObserver
		virtual void NotifyVideoDisplayEvent( const TPlayerEvent aEvent, const TInt& aInfo = 0 );

		virtual void NotifyVideoClipFrameCompleted(CVedVideoClipInfo& aInfo, 
											   TInt aError, 
							 				   CFbsBitmap* aFrame);
		/**
		 * Called to notify that video clip info is ready
		 * for reading.
		 *
		 * Possible error codes:
		 *	- <code>KErrNotFound</code> if there is no file with the specified name
		 *    in the specified directory (but the directory exists)
		 *	- <code>KErrPathNotFound</code> if the specified directory
		 *    does not exist
		 *	- <code>KErrUnknown</code> if the specified file is of unknown format
		 *
		 * @param aInfo   video clip info
		 * @param aError  <code>KErrNone</code> if info is ready
		 *                for reading; one of the system wide
		 *                error codes if reading file failed
		 */
		virtual void NotifyVideoClipInfoReady(CVedVideoClipInfo& aInfo, 
										  TInt aError);
		
       /**
        * From CCoeControl, OfferKeyEventL.
		*
		* @param aKeyEvent  key event
		* @param aType  event code
        */
		TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType);

		/**
		 * From MProgressDialogCallback, DialogDismissedL.
		 *
		 * @param aButtonId  button id
		 */
		virtual void DialogDismissedL( TInt aButtonId );

		/**
		 * Opens a video clip file and initializes videoplayerutility.
		 *
		 * @param aFilename  file to open
		 */
		void OpenFileL( const TDesC& aFilename/*, TBool aStartPlaying = EFalse */);
		
		/**
		 * Prepares the control for termination; stops video playback
		 * and sets the state to EStateTerminating.
		 * 
		 */
		void PrepareForTerminationL();

		// From MConverterController
		void NotifyCompletion( TInt aErr );

		void ResolveCaptionNameL( TApaAppCaption& aCaption ) const;
		
		void FocusChanged(TDrawNow aDrawNow);
    
	private: 
		/**
		 * Callback function for the timer.
		 *
		 * @param aThis  self pointer
		 *
		 * @return  dummy value
		 */
		static TInt DoAudioBarUpdate( TAny* aThis );

		/**
		* Time increment.
		*
		* @param aKeyCount number a key events
		* @return time 
		*/
		TInt TimeIncrement( TInt aKeyCount ) const;
	
		/**
		 * Constructor.
		 *
		 * @param aView	instance of cut video view
		 * @param aErrorUI instance of CVeiErrorUI
		 */
		CVeiSimpleCutVideoContainer( const TRect& aRect, CVeiSimpleCutVideoView& aView, CVeiErrorUI& aErrorUI );

		/**
		 * Gets intra frame bitmap from video clip.
		 *
		 * @param aTime	intra frame time.
		 */
		void GetThumbAtL( const TTimeIntervalMicroSeconds& aTime );

		/**
        * From CoeControl, MopSupplyObject.
		*
		* @param aId  
        */
		virtual TTypeUid::Ptr MopSupplyObject( TTypeUid aId );

       /**
        * From CoeControl, SizeChanged.
        */
        void SizeChanged();

       /**
        * From CoeControl, CountComponentControls.
		* 
		* @return  number of component controls in this control
        */
        TInt CountComponentControls() const;

        /**
        * From CCoeControl, ComponentControl.
		*
		* @param aIndex  index of the control to return
        */
        CCoeControl* ComponentControl(TInt aIndex) const;

        /**
        * From CCoeControl,Draw.
		*
		* @param aRect  region of the control to be redrawn
        */
        void Draw(const TRect& aRect) const;

        /**
         * From CCoeControl, gets the control's help context. Associates the
         * control with a particular Help file and topic in a context sensitive
         * application.
         *
         * @param aContext Control's help context.
         */
        void GetHelpContext( TCoeHelpContext& aContext ) const;

       /**
        * From CCoeControl, HandleControlEventL
        */
        void HandleControlEventL(CCoeControl* aControl,TCoeEvent aEventType);

	    /**
	    * HandlePointerEventL
	    * Handles pen inputs
	    *
	    * @param aPointerEvent  pointer event
	    */
	    void HandlePointerEventL(const TPointerEvent& aPointerEvent );

		/**
		* Handles progress bar touch events
		* @param aPBRect Current progress bar rectangle 
		* @param aPressedPoint The x coordinate value that was pressed
		* 			inside the progress bar
		* @param aDragMarks ETrue if the user drags start or end marks.
		*					EFalse otherwise
		*/
		void HandleProgressBarTouchL( TRect aPBRect, TInt aPressedPoint, TBool aDragMarks, CVeiSimpleCutVideoContainer::TCutMark aCutMark = ENoMark );

		/**
		* Rounds the parameter value to nearest second value
		* @param aMicroSecs Time value in microseconds
		* @return Rounded value in seconds
		*/
		TInt RoundMicroSecsToSecs( TTimeIntervalMicroSeconds aMicroSecs );

		/*
		* Indicates ProgressNote. 
		*
		*/
		void ShowProgressNoteL();

		/**
		 * Shows information note with given message.
		 * 
		 * @param aMessage message to show.
		 */
		void ShowInformationNoteL( const TDesC& aMessage ) const;

		/**
        * The entity of ProgressCallBackL() function
        * @return 0 when work is done, otherwise return 1.
        */
        TInt UpdateProgressNote();

		/**
		* Saves snapshot.
		*/
		void SaveSnapshotL();

		/**
		* Cancels saving of the snapshot.
		*/
		void CancelSnapshotSave();				
		
		void StopProgressDialog();
		
		void ShowGlobalErrorNote(const TInt aErr);

		/**	HandleVolumeUpL 
		*
		*   @see MVeiMediakeyObserver
		*/
		virtual void HandleVolumeUpL();	
		
		/**
		* From MVeiNaviPaneControlObserver
		*/
		void SetVolumeLevelL( TInt aVolume );			

		/**	HandleVolumeDownL 
		*
		*   @see MVeiMediakeyObserver
		*/
		virtual void HandleVolumeDownL();
		
		/** Callback function */
		static TInt AsyncTakeSnapshot(TAny* aThis);
		/** Callback function */
		static TInt AsyncSaveSnapshot(TAny* aThis);
		
	    /**	LaunchSavingDialogsL
		*   
		*	Displays Avkon file handling queries
		*
		* 	@param 
		*   @return ETrue if a file name is successfully created
		*			EFalse otherwise	 
		*	
		*/		
		TBool LaunchSavingDialogsL();

	protected:		
		// implementation
	    void HandleVideoClickedL();

    private: //data
		/** cut video view */
		CVeiSimpleCutVideoView& iView;

		/** Error UI */
		CVeiErrorUI&	iErrorUI;

		/** Video clip info*/
		CVedVideoClipInfo*	iVideoClipInfo;

		/** Current state. */
		TCutVideoState iState;
		
		/** Previous state. */
		TCutVideoState iPreviousState;

		/** Previous state. */
		TCutVideoState iPrevState;

		/** cut video bar. */
		CVeiCutterBar* iCutVideoBar;

		/** Last position. */
		TTimeIntervalMicroSeconds iLastPosition; 

		/** Video clip duration */
		TTimeIntervalMicroSeconds iDuration;

		/**
		 * Control context that provides a layout background with a 
		 * background bitmap and its layout rectangle.
		 */
		CAknsBasicBackgroundControlContext*	iBgContext;

		/** Key repeat count in seek function. */
		TInt iKeyRepeatCount;

		/** Seek thumbnail position in video clip. */
		TTimeIntervalMicroSeconds iSeekPos;

		/** Seek - flag. */
		TBool iSeeking;

		/** Frame ready - flag */
		TBool iFrameReady;

		/** Last keycode, used in OfferKeyEventL(); */
		TUint iLastKeyCode;

		/** The actuall calls to ICL are done from this image converter. */
		CVeiImageConverter* iConverter;
		
		//** Whether we need to take snapshot. */
		TBool iTakeSnapshot;

		/** Progress dialog */
		CAknProgressDialog* iProgressDialog;

		HBufC*	            iSaveToFileName;	        
		TSize               iFrameSize;
		CPeriodic*	        iVideoBarTimer;
		CVeiVideoDisplay*	iVideoDisplay;
		TRect				iDisplayRect;
		TRect				iCutTimeDisplayRect;
		CVeiTextDisplay*	iCutTimeDisplay;
		TBool				iPlayOrPlayMarked;
		
		TRect				iIconDisplayRect;
		CFbsBitmap*			iPauseBitmap;
		CFbsBitmap*			iPauseBitmapMask;
		CFbsBitmap*			iPlayBitmap;
		CFbsBitmap*			iPlayBitmapMask;
		
		/** Callback utility */
		CAsyncCallBack* 	iCallBackSaveSnapshot;
		CAsyncCallBack* 	iCallBackTakeSnapshot;

		/** Remote connection API used to handle the volume keys. */
		CVeiRemConTarget* 	iRemConTarget;
		
		TBool 				iTakeSnapshotWaiting;

		/** ETrue if user is dragging the start or end mark with a pen,
			EFalse otherwise */
		TBool iIsMarkDrag;
		
		/** ETrue if the pen is in start or end mark area when it goes down,
			EFalse otherwise */		
		TBool iIsMarkTapped;
		
		/** ETrue if the pen is in display area or in play/pause button area 
		    when it goes down, EFalse otherwise */
		TBool iIsIconOrDisplayTapped;
		
		/** Indicates which mark the user has tapped */						
		TCutMark iTappedMark;
		
		/// Point where button down event has occured.
		TPoint iButtonDownPoint;
        
		/** File name that is used when saving the snapshot */						        
        TFileName           iSnapshotFileName; 
		
    	// Feedback for screen touch:
#ifdef RD_TACTILE_FEEDBACK 
		MTouchFeedback* iTouchFeedBack;
#endif /* RD_TACTILE_FEEDBACK  */ 

#include "veicutvideocontainer.inl"

    };
#endif

// End of File