diff -r 000000000000 -r 951a5db380a0 videditor/ManualVideoEditor/src/VeiCutVideoContainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videditor/ManualVideoEditor/src/VeiCutVideoContainer.cpp Fri Jan 29 14:08:33 2010 +0200 @@ -0,0 +1,1653 @@ +/* +* 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: +* +*/ + + +// INCLUDE FILES +// System includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +// User includes +#include "VeiAppUi.h" +#include "VeiCutterBar.h" +#include "VeiCutVideoContainer.h" +#include "VeiCutVideoView.h" +#include "veitextdisplay.h" +#include "VideoEditorHelp.hlp.hrh" // Topic contexts (literals) +#include "VideoEditorCommon.h" +#include "VideoEditorUtils.h" +#include "VeiErrorUi.h" + + +// ================= MEMBER FUNCTIONS ======================= +void CleanupRarray( TAny* object ) + { + (( RImageTypeDescriptionArray*)object)->ResetAndDestroy(); + } + +CVeiCutVideoContainer* CVeiCutVideoContainer::NewL( const TRect& aRect, CVeiCutVideoView& aView, CVeiErrorUI& aErrorUI ) + { + CVeiCutVideoContainer* self = CVeiCutVideoContainer::NewLC( aRect, aView, aErrorUI ); + CleanupStack::Pop( self ); + return self; + } + +CVeiCutVideoContainer* CVeiCutVideoContainer::NewLC( const TRect& aRect, CVeiCutVideoView& aView, CVeiErrorUI& aErrorUI ) + { + CVeiCutVideoContainer* self = new (ELeave) CVeiCutVideoContainer( aRect, aView, aErrorUI ); + CleanupStack::PushL( self ); + self->ConstructL( aRect, aView, aErrorUI ); + return self; + } + +void CVeiCutVideoContainer::ConstructL( const TRect& aRect, CVeiCutVideoView& /*aView*/, CVeiErrorUI& /*aErrorUI*/ ) + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::ConstructL: in"); + CreateWindowL(); + + iInternalVolume = 0; + + iState = EStateInitializing; + iFrameReady = EFalse; + iPlayOrPlayMarked = EFalse; + + iSeekPos = TTimeIntervalMicroSeconds( 0 ); + iSeeking = EFalse; + iCutVideoBar = CVeiCutterBar::NewL( this ); + + iConverter = CVeiImageConverter::NewL( this ); + iTakeSnapshot = EFalse; + iVideoDisplay = CVeiVideoDisplay::NewL( iDisplayRect, this, *this ); + iCutTimeDisplay = CVeiTextDisplay::NewL( iCutTimeDisplayRect, this ); + + TFileName mbmPath( VideoEditorUtils::IconFileNameAndPath(KVideoEditorUiComponentsIconFileId) ); + + AknIconUtils::CreateIconL( iPauseBitmap, iPauseBitmapMask, + mbmPath, EMbmVideoeditoruicomponentsQgn_prop_ve_pause, + EMbmVideoeditoruicomponentsQgn_prop_ve_pause_mask ); + + SetRect( aRect ); + + iBgContext = CAknsBasicBackgroundControlContext::NewL( KAknsIIDQsnBgAreaMain, Rect(), EFalse ); + iVideoBarTimer = CPeriodic::NewL( CActive::EPriorityLow ); + + EnableDragEvents(); + + ActivateL(); + + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::ConstructL: out"); + } + +CVeiCutVideoContainer::CVeiCutVideoContainer( const TRect& /*aRect*/, CVeiCutVideoView& aView, CVeiErrorUI& aErrorUI ):iView( aView ), iErrorUI( aErrorUI ) + { + } + + +CVeiCutVideoContainer::~CVeiCutVideoContainer() + { + if ( iCutVideoBar ) + { + delete iCutVideoBar; + } + if ( iBgContext ) + { + delete iBgContext; + } + if ( iVideoDisplay ) + { + delete iVideoDisplay; + } + if ( iCutTimeDisplay ) + { + delete iCutTimeDisplay; + } + if ( iVideoClipInfo ) + { + delete iVideoClipInfo; + iVideoClipInfo = NULL; + } + if ( iConverter ) + { + iConverter->Cancel(); + delete iConverter; + } + if ( iVideoBarTimer ) + { + iVideoBarTimer->Cancel(); + delete iVideoBarTimer; + } + + if ( iProgressDialog ) + { + delete iProgressDialog; + iProgressDialog = NULL; + } + if ( iSaveToFileName ) + { + delete iSaveToFileName; + iSaveToFileName = NULL; + } + + delete iPauseBitmap; + delete iPauseBitmapMask; + + delete iRemConTarget; + + delete iCallBackSaveSnapshot; + delete iCallBackTakeSnapshot; + } + +void CVeiCutVideoContainer::DialogDismissedL( TInt aButtonId ) + { + if ( aButtonId == -1 ) + { // when pressing cancel button. + CancelSnapshotSave(); + } + iTakeSnapshot = EFalse; + } + +void CVeiCutVideoContainer::SizeChanged() + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::SizeChanged(): In"); + TSize videoScreenSize; + TRect rect( Rect() ); + if ( iBgContext ) + { + iBgContext->SetRect( rect ); + } + LOGFMT2(KVideoEditorLogFile, "CVeiCutVideoContainer::SizeChanged(): Rect(): %d,%d", rect.iBr.iX, rect.iBr.iY); + + // Scissor icon + TAknLayoutRect scissorsIconLayout; + scissorsIconLayout.LayoutRect(Rect(),AknLayoutScalable_Apps::main_vded_pane_g1()); + iCutVideoBar->SetComponentRect(CVeiCutterBar::EScissorsIcon, scissorsIconLayout.Rect()); + + // Progress bar + TAknLayoutRect progressBarLayout; + progressBarLayout.LayoutRect(Rect(),AknLayoutScalable_Apps::vded_slider_pane()); + iCutVideoBar->SetComponentRect(CVeiCutterBar::EProgressBar, progressBarLayout.Rect()); + + // left end of the slider when that part is unselected + TAknLayoutRect sliderLeftEndLayout; + sliderLeftEndLayout.LayoutRect( progressBarLayout.Rect(),AknLayoutScalable_Apps::vded_slider_pane_g3() ); + iCutVideoBar->SetComponentRect( CVeiCutterBar::ESliderLeftEndIcon, sliderLeftEndLayout.Rect() ); + + // middle part of the slider when that part is unselected + TAknLayoutRect sliderMiddleLayout; + sliderMiddleLayout.LayoutRect(progressBarLayout.Rect(),AknLayoutScalable_Apps::vded_slider_pane_g5()); + iCutVideoBar->SetComponentRect( CVeiCutterBar::ESliderMiddleIcon, sliderMiddleLayout.Rect() ); + + // right end of the slider when that part is unselected + TAknLayoutRect sliderRightEndLayout; + sliderRightEndLayout.LayoutRect(progressBarLayout.Rect(),AknLayoutScalable_Apps::vded_slider_pane_g4()); + iCutVideoBar->SetComponentRect( CVeiCutterBar::ESliderRightEndIcon, sliderRightEndLayout.Rect() ); + + // left end of the cut selection slider + TAknLayoutRect sliderSelectedLeftEndLayout; + sliderSelectedLeftEndLayout.LayoutRect(progressBarLayout.Rect(),AknLayoutScalable_Apps::vded_slider_pane_g3()); + iCutVideoBar->SetComponentRect( CVeiCutterBar::ESliderSelectedLeftEndIcon, sliderSelectedLeftEndLayout.Rect() ); + + // middle part of the cut selection slider + TAknLayoutRect sliderSelectedMiddleLayout; + sliderSelectedMiddleLayout.LayoutRect(progressBarLayout.Rect(),AknLayoutScalable_Apps::vded_slider_pane_g5()); + iCutVideoBar->SetComponentRect( CVeiCutterBar::ESliderSelectedMiddleIcon, sliderSelectedMiddleLayout.Rect() ); + + // right end of the cut selection slider + TAknLayoutRect sliderSelectedRightEndLayout; + sliderSelectedRightEndLayout.LayoutRect(progressBarLayout.Rect(),AknLayoutScalable_Apps::vded_slider_pane_g4()); + iCutVideoBar->SetComponentRect( CVeiCutterBar::ESliderSelectedRightEndIcon, sliderSelectedRightEndLayout.Rect() ); + + // playhead + TAknLayoutRect playheadLayout; + playheadLayout.LayoutRect(progressBarLayout.Rect(),AknLayoutScalable_Apps::vded_slider_pane_g1()); + iCutVideoBar->SetComponentRect( CVeiCutterBar::EPlayheadIcon, playheadLayout.Rect() ); + + // left/right border of cut selection slider + TAknLayoutRect cutAreaBorderLayout; + cutAreaBorderLayout.LayoutRect(progressBarLayout.Rect(),AknLayoutScalable_Apps::vded_slider_pane_g2()); + iCutVideoBar->SetComponentRect( CVeiCutterBar::ECutAreaBorderIcon, cutAreaBorderLayout.Rect() ); + + + // Start cut time text + TAknLayoutText startTimeTextLayout; + startTimeTextLayout.LayoutText(rect, AknLayoutScalable_Apps::main_vded_pane_t1() ); + iCutTimeDisplay->SetComponentRect(CVeiTextDisplay::EStartTimeText, startTimeTextLayout.TextRect()); + + // End cut time text + TAknLayoutText endTimeTextLayout; + endTimeTextLayout.LayoutText(rect, AknLayoutScalable_Apps::main_vded_pane_t2() ); + iCutTimeDisplay->SetComponentRect(CVeiTextDisplay::EEndTimeText, endTimeTextLayout.TextRect()); + + // Start cut time icon + TAknLayoutRect startTimeIconLayout; + startTimeIconLayout.LayoutRect(rect, AknLayoutScalable_Apps::main_vded_pane_g2() ); + iCutTimeDisplay->SetComponentRect(CVeiTextDisplay::EStartTimeIcon, startTimeIconLayout.Rect()); + + // End cut time icon + TAknLayoutRect endTimeIconLayout; + endTimeIconLayout.LayoutRect(rect, AknLayoutScalable_Apps::main_vded_pane_g3() ); + iCutTimeDisplay->SetComponentRect(CVeiTextDisplay::EEndTimeIcon, endTimeIconLayout.Rect()); + + // Pause icon + + + + // Video Display + TAknLayoutRect videoDisplayLayout; + videoDisplayLayout.LayoutRect(Rect(),AknLayoutScalable_Apps::vded_video_pane()); + iVideoDisplay->SetRect(videoDisplayLayout.Rect()); + + iDisplayRect = videoDisplayLayout.Rect(); + iIconDisplayRect = videoDisplayLayout.Rect(); + LOGFMT2(KVideoEditorLogFile, "CVeiCutVideoContainer::SizeChanged(): iDisplayRect: %d,%d", iDisplayRect.iBr.iX, iDisplayRect.iBr.iY); + + //CVeiCutterBar + // : Change this when LAF data is ready + TPoint cutBarTl = TPoint(STATIC_CAST( TInt, rect.iBr.iX*0.0114 ), + STATIC_CAST( TInt, rect.iBr.iY*0.875 ) ); + TSize cutBarSize = TSize(STATIC_CAST( TInt, rect.iBr.iX*0.9773 ), + STATIC_CAST( TInt, rect.iBr.iY*0.0973 ) ); + + TRect cutBarRect( cutBarTl, cutBarSize ); + iCutVideoBar->SetRect( cutBarRect ); + + //CVeiTextDisplay + // : Change this when LAF data is ready + TPoint cutTimeDisplayTl = TPoint(cutBarTl.iX, + STATIC_CAST( TInt, rect.iBr.iY*0.757 ) ); + TSize cutTimeDisplaySize = TSize(cutBarSize.iWidth, + STATIC_CAST( TInt, rect.iBr.iY*0.0903 ) ); + + iCutTimeDisplayRect = TRect( cutTimeDisplayTl, cutTimeDisplaySize ); + iCutTimeDisplay->SetRect( iCutTimeDisplayRect ); + iCutTimeDisplay->SetLayout( CVeiTextDisplay::ECutInCutOut ); + + + TInt iconWidth = STATIC_CAST( TInt, rect.iBr.iX * 0.07954545455 ); + AknIconUtils::SetSize( iPauseBitmap, TSize(iconWidth,iconWidth), EAspectRatioNotPreserved ); + + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::SizeChanged(): Out"); + } + +TTypeUid::Ptr CVeiCutVideoContainer::MopSupplyObject( TTypeUid aId ) + { + if ( aId.iUid == MAknsControlContext::ETypeId && iBgContext ) + { + return MAknsControlContext::SupplyMopObject( aId, iBgContext ); + } + return CCoeControl::MopSupplyObject( aId ); + } + +TInt CVeiCutVideoContainer::CountComponentControls() const + { + return 3; + } + +CCoeControl* CVeiCutVideoContainer::ComponentControl( TInt aIndex ) const + { + switch ( aIndex ) + { + case 0: + return iCutVideoBar; + case 1: + return iVideoDisplay; + case 2: + return iCutTimeDisplay; + default: + return NULL; + } + } + +void CVeiCutVideoContainer::Draw( const TRect& aRect ) const + { + CWindowGc& gc = SystemGc(); + // draw skin background + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + MAknsControlContext* cc = AknsDrawUtils::ControlContext( this ); + AknsDrawUtils::Background( skin, cc, this, gc, aRect ); + + if ( EStatePaused == iState ) + { + TPoint pauseIconTl = TPoint( iIconDisplayRect.iTl.iX - STATIC_CAST( TInt, Rect().iBr.iX*0.105), + iIconDisplayRect.iTl.iY + STATIC_CAST( TInt, Rect().iBr.iY*0.178 )); + gc.BitBltMasked( pauseIconTl, iPauseBitmap, + TRect( TPoint(0,0), iPauseBitmap->SizeInPixels() ), + iPauseBitmapMask, EFalse ); + } + } + + +// ---------------------------------------------------------------------------- +// CVeiCutVideoContainer::GetHelpContext(...) const +// +// Gets the control's help context. Associates the control with a particular +// Help file and topic in a context sensitive application. +// ---------------------------------------------------------------------------- +// +void CVeiCutVideoContainer::GetHelpContext( TCoeHelpContext& aContext ) const + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::GetHelpContext(): In"); + + // Set UID of the CS Help file (same as application UID). + aContext.iMajor = KUidVideoEditor; + + // Set the context/topic. + aContext.iContext = KVED_HLP_CUT_VIDEO_VIEW; + + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::GetHelpContext(): Out"); + } + + +void CVeiCutVideoContainer::HandleControlEventL( + CCoeControl* /*aControl*/,TCoeEvent /*aEventType*/) + { + } + +// ---------------------------------------------------------------------------- +// CVeiCutVideoContainer::HandlePointerEventL +// From CCoeControl +// ---------------------------------------------------------------------------- +// +void CVeiCutVideoContainer::HandlePointerEventL( const TPointerEvent& aPointerEvent ) + { + LOG( KVideoEditorLogFile, "CVeiCutVideoContainer::HandlePointerEventL(): In" ); + if( AknLayoutUtils::PenEnabled() && iCutVideoBar ) + { + CCoeControl::HandlePointerEventL( aPointerEvent ); + + switch( aPointerEvent.iType ) + { + case TPointerEvent::EButton1Down: + { + iIsMarkDrag = EFalse; + iIsMarkTapped = EFalse; + TRect startMarkRect = iCutVideoBar->StartMarkRect(); + TRect endMarkRect = iCutVideoBar->EndMarkRect(); + // check if the pen goes down inside the start mark + if (startMarkRect.Contains(aPointerEvent.iPosition)) + { + iIsMarkTapped = ETrue; + iTappedMark = EStartMark; + } + // check if the pen goes down inside the end mark + else if (endMarkRect.Contains(aPointerEvent.iPosition)) + { + iIsMarkTapped = ETrue; + iTappedMark = EEndMark; + } + + TRect progressBarRect(iCutVideoBar->ProgressBarRect()); + // check if the pen goes down inside the progress bar + if( progressBarRect.Contains( aPointerEvent.iPosition ) ) + { + iIsMarkDrag = EFalse; + } + break; + } + case TPointerEvent::EDrag: + { + + TRect progressBarRect(iCutVideoBar->ProgressBarRect()); + if ( progressBarRect.Contains( aPointerEvent.iPosition ) ) + { + + if (iIsMarkTapped) + { + iIsMarkDrag = ETrue; + HandleProgressBarTouchL( progressBarRect, + aPointerEvent.iPosition.iX, + ETrue, + iTappedMark ); + } + else + { + + HandleProgressBarTouchL( progressBarRect, + aPointerEvent.iPosition.iX, + EFalse); + } + } + break; + } + case TPointerEvent::EButton1Up: + { + // pen up event is handled if it wasn't dragged + if (!iIsMarkDrag) + { + TRect progressBarRect(iCutVideoBar->ProgressBarRect()); + // Check if pressed position is in progress bar's rect + if( progressBarRect.Contains( aPointerEvent.iPosition ) ) + { + HandleProgressBarTouchL( progressBarRect, + aPointerEvent.iPosition.iX, + EFalse); + } + } + break; + } + default: + { + break; + } + } + } + LOG( KVideoEditorLogFile, "CVeiCutVideoContainer::HandlePointerEventL(): Out" ); + } + + +// ---------------------------------------------------------------------------- +// CVeiCutVideoContainer::HandleProgressBarTouchL +// +// ---------------------------------------------------------------------------- +// +void CVeiCutVideoContainer::HandleProgressBarTouchL( TRect aPBRect, + TInt aPressedPoint, + TBool aDragMarks, + CVeiCutVideoContainer::TCutMark aCutMark ) + { + if (( AknLayoutUtils::PenEnabled() ) && ( iState!=EStateInitializing )) + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::HandleProgressBarTouchL(): In"); + + if ( iState == EStatePlaying ) + { + StopL(); + } + + // Progress Bar start and end points, and length + TInt pbEndPoint( aPBRect.iBr.iX ); + TInt pbStartPoint = ( aPBRect.iTl.iX ); + TInt totalPBLength( pbEndPoint - pbStartPoint ); + + // calculate the time position from the tapped progress bar coordinates + TTimeIntervalMicroSeconds newPosition( + ( ( aPressedPoint - pbStartPoint ) * + iVideoClipInfo->Duration().Int64() ) / + totalPBLength ); + + // move cut marks + if (aDragMarks) + { + // check that the start mark doesn't go past the end mark + // and not to the beginning + if ((aCutMark == EStartMark) && + (newPosition.Int64() > 0) && + (aPressedPoint < iCutVideoBar->EndMarkPoint() - 2*iCutVideoBar->EndMarkRect().Width())) + { + iView.MoveStartOrEndMarkL(newPosition, EStartMark); + iCutVideoBar->SetInPoint( newPosition ); + iCutTimeDisplay->SetCutIn( newPosition ); + } + // check that the end mark doesn't go before the start mark + // and not too close to the beginning + else if ((aCutMark == EEndMark) && + (newPosition.Int64() >= KMinCutVideoLength) && + (aPressedPoint > iCutVideoBar->StartMarkPoint() + 2*iCutVideoBar->StartMarkRect().Width())) + + { + iView.MoveStartOrEndMarkL(newPosition, EEndMark); + iCutVideoBar->SetOutPoint( newPosition ); + iCutTimeDisplay->SetCutOut( newPosition ); + } + } + + // move playhead + else if (( newPosition != iLastPosition ) && !aDragMarks) + { + iLastPosition = newPosition; + + iSeekPos = TTimeIntervalMicroSeconds( newPosition ); + + iCutVideoBar->SetCurrentPoint(( static_cast(iSeekPos.Int64() / 1000) )); + iVideoDisplay->SetPositionL( iSeekPos ); + GetThumbAtL( iSeekPos ); + + iView.UpdateTimeL(); + } + + LOG( KVideoEditorLogFile, "CVeiCutVideoContainer::HandleProgressBarTouchL(): Out" ); + + }// PenEnabled + + } + + + + +void CVeiCutVideoContainer::PlayL( const TDesC& aFilename ) + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::PlayL: in"); + iVideoDisplay->SetPositionL( iSeekPos ); + + if (iVideoClipInfo && !iFrameReady) + { + iVideoClipInfo->CancelFrame(); + } + iVideoDisplay->PlayL( aFilename ); + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::PlayL: out"); + } + +void CVeiCutVideoContainer::PlayMarkedL( const TDesC& aFilename, + const TTimeIntervalMicroSeconds& aStartTime, + const TTimeIntervalMicroSeconds& aEndTime ) + { + LOGFMT3(KVideoEditorLogFile, "CVeiCutVideoContainer::PlayMarkedL, In, aStartTime:%Ld, aEndTime:%Ld, aFilename:%S", aStartTime.Int64(), aEndTime.Int64(), &aFilename); + iPlayOrPlayMarked = ETrue; + + if (iVideoClipInfo && !iFrameReady) + { + iVideoClipInfo->CancelFrame(); + } + iVideoDisplay->PlayL( aFilename, aStartTime, aEndTime ); + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::PlayMarkedL, Out"); + } + +void CVeiCutVideoContainer::StopL() + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::StopL, in"); + iVideoDisplay->Stop( EFalse ); + + iSeekPos = TTimeIntervalMicroSeconds( 0 ); + + SetStateL( EStateStopped ); + PlaybackPositionL(); + + if (iVideoBarTimer) + { + iVideoBarTimer->Cancel(); + } + + iCutVideoBar->SetFinishedStatus( ETrue ); + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::StopL, in"); + } + +void CVeiCutVideoContainer::TakeSnapshotL() + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::TakeSnapshotL in"); + + if( !iVideoClipInfo || !iFrameReady ) + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::TakeSnapshotL: 1"); + if (!iFrameReady) + { + iTakeSnapshotWaiting = ETrue; + } + return; + } + + iTakeSnapshotWaiting = EFalse; + iTakeSnapshot = ETrue; + const TTimeIntervalMicroSeconds& pos = PlaybackPositionL(); + + GetThumbAtL( pos ); + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::TakeSnapshotL out"); + } + +void CVeiCutVideoContainer::PauseL( TBool aUpdateCBA ) + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::PauseL: In"); + + if (EStatePlaying == iState) + { + iLastPosition = iVideoDisplay->PositionL(); + iSeekPos = iLastPosition; + // to set next start point + iVideoDisplay->SetPositionL(iSeekPos); + } + + iVideoDisplay->PauseL(); + if (iVideoBarTimer) + { + iVideoBarTimer->Cancel(); + } + + #ifdef GET_PAUSE_THUMBNAIL + GetThumbAtL( iLastPosition ); + #endif + + if (EStateStoppedInitial == iState || EStateStopped == iState || + (EStateGettingFrame == iState && + (EStateStoppedInitial == iPreviousState || EStateStopped == iPreviousState))) + { + // just to trigger cba-update + SetStateL( iState, aUpdateCBA ); + } + else if (EStateInitializing != iState) + { + SetStateL( EStatePaused, aUpdateCBA ); + } + else + { + SetStateL( EStateStoppedInitial ); + } + + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::PauseL: Out"); + } + +void CVeiCutVideoContainer::SaveSnapshotL() + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::SaveSnapshotL: In"); + //first we have to encode bitmap + // get encoder types + RImageTypeDescriptionArray imageTypes; + iConverter->GetEncoderImageTypesL( imageTypes ); + + CleanupStack::PushL( TCleanupItem( CleanupRarray, &imageTypes ) ); + + TInt selectedIdx = 0; + + for( TInt i=0; iDescription() == KEncoderType ) + { + selectedIdx = i; + } + } + + RFs& fs = iEikonEnv->FsSession(); + + TParse file; + TFileName newname; + TFileName snapshotdir; + + TVeiSettings saveSettings; + // Get default snapshot name from settings view + + STATIC_CAST( CVeiAppUi*, iEikonEnv->AppUi() )->ReadSettingsL( saveSettings ); + + CAknMemorySelectionDialog::TMemory memory( saveSettings.MemoryInUse() ); + + newname.Append( saveSettings.DefaultSnapshotName() ); + newname.Append( _L(".JPEG") ); + file.Set( newname, NULL, NULL ); + + TInt error = KErrNone; + + snapshotdir.Zero(); + + if ( memory == CAknMemorySelectionDialog::EPhoneMemory ) + { + snapshotdir.Append( PathInfo::PhoneMemoryRootPath() ); + } + else + { + snapshotdir.Append( PathInfo::MemoryCardRootPath() ); + } + snapshotdir.Append( PathInfo::ImagesPath() ); + + error = fs.MkDirAll( file.Path() ); + if ( ( error != KErrAlreadyExists ) && ( error != KErrNone ) ) + { + return; + } + + newname.Zero(); + newname.Append( file.NameAndExt() ); + newname.Insert( 0, snapshotdir ); + CApaApplication::GenerateFileName( fs, newname ); + + //for cancellation + if ( iSaveToFileName ) + { + delete iSaveToFileName; + iSaveToFileName = NULL; + } + iSaveToFileName = HBufC::NewL( newname.Length() ); + *iSaveToFileName = newname; + + // request the actuall save/encode + // asynchronous, the result is reported via callback NotifyCompletion + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::SaveSnapshotL: 1, calling iConverter->StartToEncodeL"); + iConverter->StartToEncodeL( newname, + imageTypes[selectedIdx]->ImageType(), imageTypes[selectedIdx]->SubType()); + + CleanupStack::PopAndDestroy( &imageTypes ); + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::SaveSnapshotL: Out"); + } + +void CVeiCutVideoContainer::CancelSnapshotSave() + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::CancelSnapshotSave: in"); + if ( iConverter ) + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::CancelSnapshotSave: 1"); + iConverter->Cancel(); + iConverter->CancelEncoding(); //also close the file + } + if ( iSaveToFileName ) + { + LOGFMT(KVideoEditorLogFile, "CVeiCutVideoContainer::CancelSnapshotSave: 2, iSaveToFileName:%S", iSaveToFileName); + + RFs& fs = iEikonEnv->FsSession(); + /*TInt result =*/ fs.Delete( *iSaveToFileName ); + delete iSaveToFileName; + iSaveToFileName = NULL; + } + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::CancelSnapshotSave: out"); + } + +void CVeiCutVideoContainer::CloseStreamL() + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::CloseStreamL, in"); + if( !iFrameReady && iVideoClipInfo ) + { + iVideoClipInfo->CancelFrame(); + } + PlaybackPositionL(); + SetStateL( EStateStopped, EFalse ); + iView.UpdateCBAL(iState); + + iVideoDisplay->Stop( ETrue ); + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::CloseStreamL, out"); + } + +void CVeiCutVideoContainer::SetInTime( const TTimeIntervalMicroSeconds& aTime ) + { + if ( iCutTimeDisplay ) + { + iCutTimeDisplay->SetCutIn( aTime ); + } + if ( iCutVideoBar ) + { + iCutVideoBar->SetInPoint( aTime ); + } + } + +void CVeiCutVideoContainer::SetOutTime( const TTimeIntervalMicroSeconds& aTime ) + { + if ( iCutTimeDisplay ) + { + iCutTimeDisplay->SetCutOut( aTime ); + } + + if ( iCutVideoBar ) + { + iCutVideoBar->SetOutPoint( aTime ); + } + } + +TTimeIntervalMicroSeconds CVeiCutVideoContainer::PlaybackPositionL() + { + if ( ( iSeeking ) || ( EStateStopped == iState ) ) + { + return iSeekPos; + } + if ( iState != EStatePlaying ) + { + return iLastPosition; + } + + if ( iVideoClipInfo && (iVideoDisplay->PositionL() < iVideoClipInfo->Duration()) ) + { + iLastPosition = iVideoDisplay->PositionL(); + } + + if ( ( iLastPosition == TTimeIntervalMicroSeconds( 0 ) ) && + ( iSeekPos != TTimeIntervalMicroSeconds( 0 ) ) ) + { + return iSeekPos; + } + + return iLastPosition; + } + +TKeyResponse CVeiCutVideoContainer::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType) + { + if ( aType == EEventKeyDown ) + { + iKeyRepeatCount = 0; + + TBool shiftKeyPressed = (aKeyEvent.iModifiers & EModifierShift ); + if( shiftKeyPressed ) + { + if( iView.IsEnoughFreeSpaceToSaveL() && (iTakeSnapshot == EFalse )) + { + /*if (EStatePlaying == iState) + { + PauseL(); + } + */ + TakeSnapshotL(); + } + return EKeyWasConsumed; + } + + return EKeyWasNotConsumed; + } + else if ( aType == EEventKeyUp ) + { + if ( iSeeking == EFalse ) + { + return EKeyWasNotConsumed; + } + iLastPosition = iSeekPos; + iVideoDisplay->SetPositionL( iSeekPos ); + + iSeeking = EFalse; + + if ( ( ( EStateStopped == iState ) || ( EStateStoppedInitial == iState ) + || ( EStatePaused == iState )) && + ( ( iLastKeyCode == EKeyLeftArrow ) || ( iLastKeyCode == EKeyRightArrow ) ) ) + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::OfferKeyEventL: 1, calling GetThumbAtL()"); + GetThumbAtL( iSeekPos ); + return EKeyWasConsumed; + } + else if ( EStatePlaying == iState ) + { + if ( iVideoBarTimer->IsActive() ) + { + iVideoBarTimer->Cancel(); + } + + if ( iVideoClipInfo && (iSeekPos >= iVideoClipInfo->Duration()) ) + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::OfferKeyEventL: 2, calling iVideoDisplay->Stop"); + iVideoDisplay->Stop( EFalse ); + } + else + { + iVideoDisplay->SetPositionL( iSeekPos ); + iVideoDisplay->ShowBlackScreen(); + if (iVideoClipInfo && !iFrameReady) + { + iVideoClipInfo->CancelFrame(); + } + iVideoDisplay->Play(); + } + return EKeyWasConsumed; + } + else + { + return EKeyWasConsumed; + } + } + else if ( aType == EEventKey ) + { + iLastKeyCode = aKeyEvent.iCode; + + switch (aKeyEvent.iCode) + { + case EKeyOK: + { + iView.HandleCommandL( EAknSoftkeyOk ); + return EKeyWasConsumed; + } + case EKeyDownArrow: + case EKeyUpArrow: + { + iVideoDisplay->OfferKeyEventL( aKeyEvent, aType ); + return EKeyWasConsumed; + } + case EKeyRightArrow: + { + iKeyRepeatCount++; + + if ( (iKeyRepeatCount > 2) && (iSeeking == EFalse) ) + { + if ( EStatePlaying == iState ) + { + iSeekPos = iVideoDisplay->PositionL(); + } + + iVideoDisplay->PauseL(); + iSeeking = ETrue; + iKeyRepeatCount = 0; + } + + if ( iSeeking && ( iState!=EStateInitializing ) && + ( iState!=EStatePlayingMenuOpen ) ) + { + TInt adjustment = TimeIncrement( iKeyRepeatCount ); + + TInt64 newPos = iSeekPos.Int64() + adjustment; + if ( iVideoClipInfo && (newPos > iVideoClipInfo->Duration().Int64()) ) + { + newPos = iVideoClipInfo->Duration().Int64(); + } + + iSeekPos = TTimeIntervalMicroSeconds( newPos ); + + iCutVideoBar->SetCurrentPoint( (static_cast(iSeekPos.Int64() / 1000))); + + iView.UpdateTimeL(); + return EKeyWasConsumed; + } + return EKeyWasNotConsumed; + } + + case EKeyLeftArrow: + { + iKeyRepeatCount++; + + if ( (iKeyRepeatCount > 2) && (iSeeking == EFalse) ) + { + + if ( EStatePlaying == iState ) + { + iSeekPos = iVideoDisplay->PositionL(); + } + + iVideoDisplay->PauseL(); + iSeeking = ETrue; + iKeyRepeatCount = 0; + } + + if ( iSeeking && ( iState!=EStateInitializing ) && + ( iState!=EStatePlayingMenuOpen ) ) + { + + TInt adjustment = TimeIncrement( iKeyRepeatCount ); + + TInt64 newPos = iSeekPos.Int64() - adjustment; + if ( newPos < 0 ) + { + newPos = 0; + } + iSeekPos = TTimeIntervalMicroSeconds( newPos ); + + iCutVideoBar->SetCurrentPoint( static_cast((iSeekPos.Int64() / 1000)) ); + + iView.UpdateTimeL(); + + return EKeyWasConsumed; + } + return EKeyWasNotConsumed; + } + case EKeyBackspace: //Clear + { + if (EStatePlaying != iState) + { + iView.ClearInOutL( ETrue, ETrue ); + } + + return EKeyWasConsumed; + } + default: + { + return EKeyWasNotConsumed; + } + } + } + else + { + return EKeyWasNotConsumed; + } + } + + + +TInt CVeiCutVideoContainer::TimeIncrement(TInt aKeyCount) const + { + if ( aKeyCount < 3 ) + { + return 100000; + } + else if ( aKeyCount < 4 ) + { + return 300000; + } + else if ( aKeyCount < 5 ) + { + return 500000; + } + else if ( aKeyCount < 10 ) + { + return 1000000; + } + else if ( aKeyCount < 13 ) + { + return 2000000; + } + else if ( aKeyCount < 15 ) + { + return 3000000; + } + else + { + return 5000000; + } + } + +TInt CVeiCutVideoContainer::UpdateProgressNoteL() + { + TTime intervalTime; + intervalTime.HomeTime(); + intervalTime += TTimeIntervalMicroSeconds( 50000 ); + TTime currentTime; + currentTime.HomeTime(); + while ( intervalTime > currentTime ) + { + currentTime.HomeTime(); + } + + iProgressInfo->IncrementAndDraw( 1 ); + + if ( KProgressbarFinalValue <= iProgressInfo->CurrentValue() ) + { + return 0; + } + return 1; + } + + +void CVeiCutVideoContainer::GetThumbL( const TDesC& aFilename ) + { + if ( iVideoClipInfo ) + { + delete iVideoClipInfo; + iVideoClipInfo = NULL; + } + + /*iVideoClipInfo = */CVedVideoClipInfo::NewL( aFilename, *this ); + } + + +void CVeiCutVideoContainer::GetThumbAtL( const TTimeIntervalMicroSeconds& aTime ) + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::GetThumbAtL: In"); + if( !iVideoClipInfo || ( !iFrameReady ) ) + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::GetThumbAtL: 1"); + return; + } + + TRect clipResolution = iVideoClipInfo->Resolution(); + TSize resolution( iVideoDisplay->Size() ); + + TInt frameIndex; + TInt totalFrameCount; + + frameIndex = iVideoClipInfo->GetVideoFrameIndexL( aTime ); + totalFrameCount = iVideoClipInfo->VideoFrameCount(); + + if ( frameIndex > totalFrameCount ) + { + frameIndex = totalFrameCount; + } + + //Generates a thumbnail bitmap of the given frame from video clip + if ( iTakeSnapshot ) + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::GetThumbAtL: 2"); + TDisplayMode displayMode = ENone; + TBool enhance = ETrue; + TSize resol( clipResolution.iBr.iX, clipResolution.iBr.iY ); + + /* : + check out on every phone before releasing whether videodisplay should be stopped before starting + asynchronous GetFrameL() + see how EStateGettingFrame is handled in SetPreviewState + Stopping frees memory and it is needed in memory sensible devices + */ + iVideoClipInfo->GetFrameL( *this, frameIndex, &resol, displayMode, enhance ); + SetStateL( EStateGettingFrame ); + iFrameReady = EFalse; + ShowProgressNoteL(); + } + else + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::GetThumbAtL: 3"); + /* : + check out on every phone before releasing whether videodisplay should be stopped before starting + asynchronous GetFrameL() + see how EStateGettingFrame is handled in SetPreviewState + Stopping frees memory and it is needed in memory sensible devices + */ + iVideoClipInfo->GetFrameL( *this, frameIndex, &resolution ); + SetStateL( EStateGettingFrame ); + iFrameReady = EFalse; + } + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::GetThumbAtL: out"); + } + +void CVeiCutVideoContainer::NotifyCompletion( TInt aErr ) + { + LOGFMT(KVideoEditorLogFile, "CVeiCutVideoContainer::NotifyCompletion: In, aErr:%d", aErr); + + if (EStateTerminating == iState) + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::NotifyCompletion(): app is closing..."); + return; + } + + if ( KErrNone == aErr ) + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::NotifyCompletion: 1"); + + if (iProgressDialog) + { + TRAP_IGNORE(iProgressDialog->GetProgressInfoL()->SetAndDraw( KProgressbarFinalValue ); + iProgressDialog->ProcessFinishedL()); + } + } + else + { + if (iProgressDialog) + { + TRAP_IGNORE(iProgressDialog->GetProgressInfoL()->SetAndDraw( KProgressbarFinalValue ); + iProgressDialog->ProcessFinishedL()); + } + iErrorUI.ShowGlobalErrorNote( aErr ); + } + + // to eliminate previous (wrong) output file from being deleted in CancelSnapshotSave() + delete iSaveToFileName; + iSaveToFileName = NULL; + + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::NotifyCompletion: Out"); + } + +void CVeiCutVideoContainer::NotifyVideoClipInfoReady( CVedVideoClipInfo& aInfo, + TInt aError ) + { + LOGFMT(KVideoEditorLogFile, "CVeiCutVideoContainer::NotifyVideoClipInfoReady, In, aError:%d", aError); + if (KErrNone == aError) + { + if (iVideoClipInfo) + { + delete iVideoClipInfo; + iVideoClipInfo = NULL; + } + iVideoClipInfo = &aInfo; + + TRect clipResolution = Rect(); + iDuration = iVideoClipInfo->Duration(); + iCutVideoBar->SetTotalDuration( iDuration ); + iView.DrawTimeNaviL(); + + TSize resolution( clipResolution.iBr.iX, clipResolution.iBr.iY-KVeiCutBarHeight ); + iFrameReady = EFalse; + iVideoClipInfo->GetFrameL( *this, 0, &resolution ); + } + SetStateL( EStateStoppedInitial ); + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::NotifyVideoClipInfoReady, Out"); + } + + +void CVeiCutVideoContainer::NotifyVideoClipFrameCompleted(CVedVideoClipInfo& /*aInfo*/, + TInt aError, + CFbsBitmap* aFrame) + { + LOGFMT(KVideoEditorLogFile, "CVeiCutVideoContainer::NotifyVideoClipFrameCompleted, In, aError:%d", aError); + iFrameReady = ETrue; + + if (EStateGettingFrame == iState) + { + SetStateL(iPreviousState); + } + + if (KErrNone == aError && aFrame) + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::NotifyVideoClipFrameCompleted 1"); + + if ( iTakeSnapshot ) + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::NotifyVideoClipFrameCompleted 2"); + iConverter->SetBitmap( aFrame ); + if (! iCallBackSaveSnapshot) + { + TCallBack cb (CVeiCutVideoContainer::AsyncSaveSnapshot, this); + iCallBackSaveSnapshot = new (ELeave) CAsyncCallBack(cb, CActive::EPriorityStandard); + } + iCallBackSaveSnapshot->CallBack(); + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::NotifyVideoClipFrameCompleted 3"); + } + else + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::NotifyVideoClipFrameCompleted 4"); + TRAP_IGNORE(iVideoDisplay->ShowPictureL( *aFrame )); + delete aFrame; + aFrame = NULL; + + if (iTakeSnapshotWaiting) + { + if (! iCallBackTakeSnapshot) + { + TCallBack cb (CVeiCutVideoContainer::AsyncTakeSnapshot, this); + iCallBackTakeSnapshot = new (ELeave) CAsyncCallBack(cb, CActive::EPriorityStandard); + } + iCallBackTakeSnapshot->CallBack(); + } + } + } + else + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::NotifyVideoClipFrameCompleted 5"); + if (aFrame) + { + delete aFrame; + aFrame = NULL; + } + + if (iProgressDialog) + { + iProgressInfo->SetAndDraw( KProgressbarFinalValue ); + TRAP_IGNORE(iProgressDialog->ProcessFinishedL()); + } + } + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::NotifyVideoClipFrameCompleted, Out"); + } + +TInt CVeiCutVideoContainer::AsyncSaveSnapshot(TAny* aThis) + { + LOG( KVideoEditorLogFile, "CVeiCutVideoView::AsyncSaveSnapshot in"); + + // In the asynchronous version, trap the rest of the functions + // to make sure that the caller's TRequestStatus is always + // completed, also in case of failures. + CVeiCutVideoContainer* container = static_cast(aThis); + TInt err = KErrNone; + TRAP(err, container->SaveSnapshotL()); + LOGFMT( KVideoEditorLogFile, "CVeiEditVideoView::AsyncSaveSnapshot 2, err:%d", err); + + if (KErrNone != err) + { + container->StopProgressDialog(); + container->ShowGlobalErrorNote(err); + } + LOG( KVideoEditorLogFile, "CVeiEditVideoView::AsyncSaveSnapshot 3, returning"); + return KErrNone; + } + +void CVeiCutVideoContainer::ShowGlobalErrorNote(const TInt aErr) + { + iErrorUI.ShowGlobalErrorNote( aErr ); + } + +void CVeiCutVideoContainer::StopProgressDialog() + { + if (iProgressDialog) + { + TRAP_IGNORE(iProgressDialog->GetProgressInfoL()->SetAndDraw( KProgressbarFinalValue ); + iProgressDialog->ProcessFinishedL()); + } + } + +void CVeiCutVideoContainer::NotifyVideoDisplayEvent( const TPlayerEvent aEvent, const TInt& aInfo ) + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::NotifyVideoDisplayEvent, In"); + + if (EStateTerminating == iState) + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::NotifyVideoDisplayEvent(): app is closing..."); + return; + } + + switch (aEvent) + { + case MVeiVideoDisplayObserver::ELoadingStarted: + { + SetStateL(EStateOpening); + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::NotifyVideoDisplayEvent() MVeiVideoDisplayObserver::ELoadingStarted"); + break; + } + case MVeiVideoDisplayObserver::EOpenComplete: + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::NotifyVideoDisplayEvent, MVeiVideoDisplayObserver::EOpenComplete 1"); + iVideoDisplay->SetRotationL( EVideoRotationNone ); + TTimeIntervalMicroSeconds cutInTime = iView.GetVideoClipCutInTime(); + TTimeIntervalMicroSeconds cutOutTime = iView.GetVideoClipCutOutTime(); + + if ( iView.IsForeground() ) + { + if (iVideoClipInfo && !iFrameReady) + { + iVideoClipInfo->CancelFrame(); + } + if ( iPlayOrPlayMarked ) + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::NotifyVideoDisplayEvent, MVeiVideoDisplayObserver::EOpenComplete 2"); + iVideoDisplay->PlayMarkedL( cutInTime, cutOutTime ); + } + else + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::NotifyVideoDisplayEvent, MVeiVideoDisplayObserver::EOpenComplete 3"); + iVideoDisplay->Play(); + } + iPlayOrPlayMarked = EFalse; + } + else + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::NotifyVideoDisplayEvent() MVeiVideoDisplayObserver::EOpenComplete 4"); + PauseL(); + } + break; + } + case MVeiVideoDisplayObserver::EBufferingStarted: + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::NotifyVideoDisplayEvent() MVeiVideoDisplayObserver::EBufferingStarted"); + SetStateL( EStateBuffering ); + if ( iVideoBarTimer ) + { + iVideoBarTimer->Cancel(); + } + break; + } + case MVeiVideoDisplayObserver::ELoadingComplete: + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::NotifyVideoDisplayEvent, MVeiVideoDisplayObserver::ELoadingComplete 1"); + // if VED is put to background in the middle of the buffering + // iVideoDisplay->PauseL(); cannot be called during the buffering, so its called here + if (EStatePaused == iState) + { + iVideoDisplay->PauseL(); + } + else + { + SetStateL( EStatePlaying ); + if (iVideoClipInfo && !iFrameReady) + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::NotifyVideoDisplayEvent, MVeiVideoDisplayObserver::ELoadingComplete 2"); + iVideoClipInfo->CancelFrame(); + } + if ( !iVideoBarTimer->IsActive() ) + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::NotifyVideoDisplayEvent, MVeiVideoDisplayObserver::ELoadingComplete 3"); + const TUint delay = 100000; + iVideoBarTimer->Start( delay, delay, TCallBack( CVeiCutVideoContainer::DoAudioBarUpdate, this ) ); + } + iVideoDisplay->ShowBlackScreen(); + DrawDeferred(); + } + break; + } + case MVeiVideoDisplayObserver::EPlayComplete: + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::NotifyVideoDisplayEvent, MVeiVideoDisplayObserver::EPlayComplete"); + iVideoDisplay->SetBlackScreen( EFalse ); + iSeekPos = TTimeIntervalMicroSeconds( 0 ); + + iLastPosition = TotalLength(); + iView.StopNaviPaneUpdateL(); + iCutVideoBar->SetFinishedStatus( ETrue ); + + if (iVideoBarTimer) + { + iVideoBarTimer->Cancel(); + } + + GetThumbAtL(0); + + SetStateL( EStateStopped ); + + if (KErrNoMemory == aInfo || KErrSessionClosed == aInfo) + { + iErrorUI.ShowGlobalErrorNote( aInfo ); + StopL(); + CloseStreamL(); + } + + DrawDeferred(); + break; + } + case MVeiVideoDisplayObserver::EStop: + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::NotifyVideoDisplayEvent() MVeiVideoDisplayObserver::EStop"); + + if (EStateGettingFrame == iState) + { + break; + } + + if ( iVideoBarTimer ) + { + iVideoBarTimer->Cancel(); + } + iSeekPos = TTimeIntervalMicroSeconds( 0 ); + + GetThumbAtL(0); + iLastPosition = TotalLength(); + iView.StopNaviPaneUpdateL(); + iCutVideoBar->SetFinishedStatus( ETrue ); + + SetStateL( EStateStopped ); + DrawDeferred(); + break; + } + case MVeiVideoDisplayObserver::EVolumeLevelChanged: + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::NotifyVideoDisplayEvent, MVeiVideoDisplayObserver::EVolumeLevelChanged"); + TInt playerVolume = iVideoDisplay->Volume(); + iView.ShowVolumeLabelL( playerVolume ); + break; + } + case MVeiVideoDisplayObserver::EError: + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::NotifyVideoDisplayEvent() MVeiVideoDisplayObserver::EError"); +// iErrorUI.ShowGlobalErrorNoteL( KErrGeneral ); + SetStateL( EStateStoppedInitial ); + break; + } + default: + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::NotifyVideoDisplayEvent, MVeiVideoDisplayObserver::default"); + break; + }; + } + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::NotifyVideoDisplayEvent, Out"); + } + + +void CVeiCutVideoContainer::SetStateL(CVeiCutVideoContainer::TCutVideoState aState, TBool aUpdateCBA) + { + LOGFMT2(KVideoEditorLogFile, "CVeiCutVideoContainer::SetStateL: in, iState:%d, aState:%d", iState, aState); + if (EStateGettingFrame == aState) + { + iPreviousState = iState; + } + + iState = aState; + if (EStatePaused == iState) + { + DrawNow(); + } + + // If the foreground is lost while an arrow key is down, we do not get + // the key up -event, and iSeeking remains true. Reseting it here just in case. + iSeeking = EFalse; + + if ( aUpdateCBA ) + { + iView.UpdateCBAL( iState ); + } + + // While playing, grab the volume keys for adjusting playback volume. + // In other states let them pass e.g. to the music player. + if(EStatePlaying == iState) + { + if (!iRemConTarget) + { + iRemConTarget = CVeiRemConTarget::NewL( *this ); + } + } + else + { + delete iRemConTarget; + iRemConTarget = NULL; + } + + if (EStateGettingFrame == aState) + { + /* : + check out on every phone before releasing whether videodisplay should be stopped before starting + asynchronous GetFrameL() + see how EStateGettingFrame is handled in SetPreviewState + Stopping frees memory and it is needed in memory sensible devices + */ + //iVideoDisplay->Stop(ETrue); + } + + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::SetStateL:: out"); + } + +void CVeiCutVideoContainer::MarkedInL() + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::MarkedInL, In"); + if ( EStateInitializing == iState ) + { + return; + } + const TTimeIntervalMicroSeconds& position = PlaybackPositionL(); + iSeekPos = position; + + LOGFMT(KVideoEditorLogFile, "CVeiCutVideoContainer::MarkedInL, 2, setting cutINpoint:%Ld", position.Int64()); + iCutVideoBar->SetInPoint( position ); + iCutTimeDisplay->SetCutIn( position ); + PauseL(); + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::MarkedInL, Out"); + } + +void CVeiCutVideoContainer::MarkedOutL() + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::MarkedOutL, In"); + if ( EStateInitializing == iState ) + { + return; + } + const TTimeIntervalMicroSeconds& position = PlaybackPositionL(); + iSeekPos = position; + + LOGFMT(KVideoEditorLogFile, "CVeiCutVideoContainer::MarkedOutL, 2, setting cutOUTpoint:%Ld", position.Int64()); + iCutVideoBar->SetOutPoint( position ); + iCutTimeDisplay->SetCutOut( position ); + + PauseL(); + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::MarkedOutL, Out"); + } + +void CVeiCutVideoContainer::ShowInformationNoteL( const TDesC& aMessage ) const + { + CAknInformationNote* note = new ( ELeave ) CAknInformationNote( ETrue ); + note->ExecuteLD( aMessage ); + } + +void CVeiCutVideoContainer::ShowProgressNoteL() + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::ShowProgressNoteL, in"); + iProgressDialog = new ( ELeave ) CAknProgressDialog( REINTERPRET_CAST( CEikDialog**, + &iProgressDialog ), ETrue); + iProgressDialog->SetCallback( this ); + iProgressDialog->PrepareLC( R_VEI_PROGRESS_NOTE_WITH_CANCEL ); + + HBufC* stringholder = StringLoader::LoadL( R_VEI_PROGRESS_NOTE_SAVING_IMAGE, iEikonEnv ); + CleanupStack::PushL( stringholder ); + + iProgressDialog->SetTextL( *stringholder ); + CleanupStack::PopAndDestroy( stringholder ); + + iProgressInfo = iProgressDialog->GetProgressInfoL(); + iProgressInfo->SetFinalValue( KProgressbarFinalValue ); + iProgressDialog->RunLD(); + + iProgressInfo->SetAndDraw( 50 ); + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::ShowProgressNoteL, Out"); + } + +TInt CVeiCutVideoContainer::DoAudioBarUpdate( TAny* aThis ) + { + STATIC_CAST( CVeiCutVideoContainer*, aThis )->DoUpdate(); + return 42; + } + +void CVeiCutVideoContainer::DoUpdate() + { + TTimeIntervalMicroSeconds time; + time = iVideoDisplay->PositionL(); + if ( iSeeking ) + { + time = iSeekPos; + LOGFMT(KVideoEditorLogFile, "CVeiCutVideoContainer::DoUpdate(): 1, time:%Ld", time.Int64()); + } + else + { + LOGFMT(KVideoEditorLogFile, "CVeiCutVideoContainer::DoUpdate(): 2, time:%Ld", time.Int64()); + } + iCutVideoBar->SetCurrentPoint( static_cast((time.Int64() / 1000))); + iCutVideoBar->DrawDeferred(); + } +void CVeiCutVideoContainer::MuteL() + { + iVideoDisplay->SetMuteL( ETrue ); + } + +//============================================================================= +void CVeiCutVideoContainer::HandleVolumeUpL() + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::HandleVolumeUpL: in"); + + iVideoDisplay->AdjustVolumeL( 1 ); + + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::HandleVolumeUpL: out"); + } + +//============================================================================= +void CVeiCutVideoContainer::HandleVolumeDownL() + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::HandleVolumeDownL: in"); + + iVideoDisplay->AdjustVolumeL( -1 ); + + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::HandleVolumeDownL: out"); + } + +//============================================================================= +void CVeiCutVideoContainer::PrepareForTerminationL() + { + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::PrepareForTerminationL: in"); + + SetStateL( EStateTerminating ); + + if( !iFrameReady && iVideoClipInfo ) + { + iVideoClipInfo->CancelFrame(); + } + iState = EStateTerminating; + iVideoDisplay->Stop( ETrue ); + + LOG(KVideoEditorLogFile, "CVeiCutVideoContainer::PrepareForTerminationL: out"); + } + + +TInt CVeiCutVideoContainer::AsyncTakeSnapshot(TAny* aThis) + { + LOG( KVideoEditorLogFile, "CVeiCutVideoContainer::AsyncTakeSnapshot"); + + // In the asynchronous version, trap the rest of the functions + // to make sure that the caller's TRequestStatus is always + // completed, also in case of failures. + CVeiCutVideoContainer* container = static_cast(aThis); + TInt err = KErrNone; + TRAP(err, container->TakeSnapshotL()); + LOGFMT( KVideoEditorLogFile, "CVeiCutVideoContainer::AsyncTakeSnapshot 1, err:%d", err); + User::LeaveIfError(err); + return KErrNone; + } +// End of File