--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/mmapi_qt/baseline/src/cmmavideorecordcontrol.cpp Tue May 11 16:07:20 2010 +0300
@@ -0,0 +1,374 @@
+/*
+* Copyright (c) 2002-2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "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:
+*
+* Description: This class is a RecordControl.
+*
+*/
+
+
+// INCLUDE FILES
+#include <logger.h>
+
+#include "cmmavideorecordcontrol.h"
+#include "cmmaplayer.h"
+#include "cmmammfresolver.h"
+#include "cmmacamerasound.h"
+
+const TInt KUnlimitedSize = KMaxTInt32;
+
+const TReal32 KNoUserDefinedFps = -1;
+const TInt KNoUserDefinedSize = -1;
+const TInt KNoUserDefinedRecordSize = -1;
+
+_LIT(KVideoMp4MimeType, "video/mp4");
+_LIT(KVideoH264MimeType, "video/H264");
+
+_LIT8(KMimeTypeMPEG4VSPL3, "video/mp4v-es; profile-level-id=3");
+_LIT8(KMimeTypeH264AVCBPL12, "video/H264; profile-level-id=42800C"); // Level 1.2
+
+CMMAVideoRecordControl* CMMAVideoRecordControl::NewL(CMMAPlayer* aPlayer,
+ CMMAMMFResolver* aResolver,
+ const TMMAVideoSettings& aVideoSettings,
+ CMMAAudioSettings* aAudioSettings,
+ TInt aCameraHandle)
+{
+ CMMAVideoRecordControl* self =
+ new(ELeave)CMMAVideoRecordControl(aPlayer,
+ aCameraHandle);
+ CleanupStack::PushL(self);
+
+ // SetContentType takes ownership
+ aPlayer->SetContentType(aResolver->ContentTypeOwnership());
+ self->ConstructL(*aResolver->Implementations(),
+ aVideoSettings,
+ aAudioSettings);
+
+ CleanupStack::Pop();
+ return self;
+}
+
+CMMAVideoRecordControl::CMMAVideoRecordControl(CMMAPlayer* aPlayer,
+ TInt aCameraHandle):
+ CMMARecordControl(aPlayer),
+ iRecordSizeLimit(KNoUserDefinedRecordSize)
+{
+ LOG( EJavaMMAPI, EInfo, "MMA:CMMAVideoRecordControl::CMMAVideoRecordControl");
+
+ __ASSERT_DEBUG(aCameraHandle > 0, User::Panic(
+ _L("CMMAVideoRecordControl::Invalid camera"),
+ KErrArgument));
+ __ASSERT_DEBUG(aPlayer, User::Panic(
+ _L("CMMAVideoRecordControl::Invalid player"),
+ KErrArgument));
+ iCameraHandle = aCameraHandle;
+}
+
+CMMAVideoRecordControl::~CMMAVideoRecordControl()
+{
+ LOG( EJavaMMAPI, EInfo, "MMA:CMMAVideoRecordControl::~CMMAVideoRecordControl");
+
+ delete iActiveSchedulerWait;
+
+ if (iRecorder)
+ {
+ iRecorder->Close();
+ delete iRecorder;
+ }
+}
+
+void CMMAVideoRecordControl::ConstructL(
+ RMMFControllerImplInfoArray& aControllerInfos,
+ const TMMAVideoSettings& aVideoSettings,
+ CMMAAudioSettings* aAudioSettings)
+{
+ LOG( EJavaMMAPI, EInfo, "MMA:CMMAVideoRecordControl::ConstructL +");
+ CMMARecordControl::ConstructL();
+
+ iVideoSettings = aVideoSettings;
+
+ iActiveSchedulerWait = new(ELeave) CActiveSchedulerWait();
+
+ iRecorder = CVideoRecorderUtility::NewL(*this, EMdaPriorityMin, EMdaPriorityPreferenceNone);
+
+ TUid videoControllerUid = KNullUid;
+ TUid videoFormatUid = KNullUid;
+
+ HBufC8* encoding;
+ // if wanted video encoding is H264, we must find format uid for video/mp4
+ // and set encoding later because mmf doesn't have controller for video/H264
+ if (!(iVideoSettings.iEncoding.Compare(KVideoH264MimeType) == 0))
+ {
+ encoding = HBufC8::NewLC(iVideoSettings.iEncoding.Length());
+ encoding->Des().Copy(iVideoSettings.iEncoding);
+ }
+ else
+ {
+ encoding = HBufC8::NewLC(KVideoMp4MimeType().Length());
+ encoding->Des().Copy(KVideoMp4MimeType());
+ }
+
+ // Go through controller infos to find format UID
+ TInt controllerCount = aControllerInfos.Count();
+ for (TInt cIndex = 0; cIndex < controllerCount; cIndex++)
+ {
+ const RMMFFormatImplInfoArray infoArray =
+ aControllerInfos[ cIndex ]->RecordFormats();
+
+ // Find correct format uid
+ TInt formatCount = infoArray.Count();
+ for (TInt formatIndex = 0; formatIndex < formatCount; formatIndex++)
+ {
+ if (infoArray[ formatIndex ]->SupportsMimeType(*encoding))
+ {
+ // Uids will be used to open controller
+ videoFormatUid = infoArray[ formatIndex ]->Uid();
+ videoControllerUid = aControllerInfos[ cIndex ]->Uid();
+ }
+ }
+ }
+ CleanupStack::PopAndDestroy(encoding);
+
+ if (videoFormatUid == KNullUid ||
+ videoControllerUid == KNullUid)
+ {
+ // Controller and / or format for mime was not found.
+ User::Leave(KErrNotSupported);
+ }
+
+ iFile.Close();
+ iRecorder->OpenFileL(iFilename,
+ iCameraHandle,
+ videoControllerUid,
+ videoFormatUid,
+ KNullDesC8,
+ aAudioSettings->iDataType);
+
+ // wait until MvruoOpenComplete is called
+ if (!iActiveSchedulerWait->IsStarted())
+ {
+ iActiveSchedulerWait->Start();
+ }
+ User::LeaveIfError(iError);
+
+ // if wanted video encoding is mp4, set it
+ if (iVideoSettings.iEncoding.Compare(KVideoMp4MimeType) == 0)
+ {
+ iRecorder->SetVideoTypeL(KMimeTypeMPEG4VSPL3);
+ // audio encoding with mp4 is AAC by default
+ iRecorder->SetAudioTypeL(KMMFFourCCCodeAAC);
+ }
+
+ // if wanted video encoding is H264, set it
+ if (iVideoSettings.iEncoding.Compare(KVideoH264MimeType) == 0)
+ {
+ iRecorder->SetVideoTypeL(KMimeTypeH264AVCBPL12);
+ // audio encoding with mp4 is AAC by default
+ iRecorder->SetAudioTypeL(KMMFFourCCCodeAAC);
+ }
+
+ // setting size if it is set by user
+ TSize videoSize;
+ iRecorder->GetVideoFrameSizeL(videoSize);
+ if (iVideoSettings.iHeight != KNoUserDefinedSize)
+ {
+ videoSize.iHeight = iVideoSettings.iHeight;
+ }
+
+ if (iVideoSettings.iWidth != KNoUserDefinedSize)
+ {
+ videoSize.iWidth = iVideoSettings.iWidth;
+ }
+ iRecorder->SetVideoFrameSizeL(videoSize);
+
+ LOG( EJavaMMAPI, EInfo, "MMA:CMMAVideoRecordControl::ConstructL()-");
+}
+
+void CMMAVideoRecordControl::InitializeL()
+{
+ LOG( EJavaMMAPI, EInfo, "MMA:CMMAVideoRecordControl::InitializeL()");
+ iRecorder->Prepare();
+ if (!iActiveSchedulerWait->IsStarted())
+ {
+ iActiveSchedulerWait->Start();
+ }
+ User::LeaveIfError(iError);
+
+ // setting frame rate if it is set by user
+ // record utility must be prepared to do this
+ if (iVideoSettings.iFps != KNoUserDefinedFps)
+ {
+ LOG1( EJavaMMAPI, EInfo, "MMA:CMMAVideoRecordControl::InitializeL() SetVideoFrameRateL = %d", iVideoSettings.iFps);
+ iRecorder->SetVideoFrameRateL(iVideoSettings.iFps);
+ }
+
+ LOG( EJavaMMAPI, EInfo, "MMA:CMMAVideoRecordControl::InitializeL()-");
+}
+
+void CMMAVideoRecordControl::DoStartRecordL()
+{
+ // if reset is called then file is reopened, closing it in order to prevent
+ // KErrInUse
+ iFile.Close();
+ ELOG1( EJavaMMAPI, "MMA:CMMAVideoRecordControl::DoStartRecordL() err=%d", iError);
+ User::LeaveIfError(iError);
+
+ // play sound when recording starts
+ CMMACameraSound::PlayVideoRecordSoundL();
+
+ // Set recordsize limit if needed
+ if (iRecordSizeLimit != KNoUserDefinedRecordSize)
+ {
+ DoSetRecordSizeLimitL(iRecordSizeLimit);
+ }
+
+ iRecorder->Record();
+}
+
+void CMMAVideoRecordControl::DoStopRecordL()
+{
+ LOG( EJavaMMAPI, EInfo, "MMA:CMMAVideoRecordControl::DoStopRecordL");
+ // Just paused that recording can continue
+ iRecorder->PauseL();
+}
+
+void CMMAVideoRecordControl::DoResetL()
+{
+ LOG( EJavaMMAPI, EInfo, "MMA:CMMAVideoRecordControl::ResetL");
+ TInt err = iRecorder->Stop();
+ // returns KErrCompletion when recording is finished when size limit is reached
+ // and KErrAlreadyExists if we have created file (ignoring both)
+ if ((err != KErrCompletion) &&
+ (err != KErrAlreadyExists))
+ {
+ User::LeaveIfError(err);
+ }
+ TBool isOpen(EFalse);
+ err = iFs.IsFileOpen(iFilename, isOpen);
+ if (!isOpen && (err != KErrNotFound))
+ {
+ LOG( EJavaMMAPI, EInfo, "MMA:CMMAVideoRecordControl::ResetL - Opening file");
+ // opening file for resetting (or commit)
+ User::LeaveIfError(iFile.Open(iFs, iFilename, EFileRead |
+ EFileWrite |
+ EFileShareAny));
+ }
+ else if (err == KErrNotFound)
+ {
+ LOG( EJavaMMAPI, EInfo, "MMA:CMMAVideoRecordControl::ResetL - Recreating file");
+ // record utility deletes file if nothing is recorded, creating it again
+ User::LeaveIfError(iFile.Create(iFs,
+ iFilename,
+ EFileRead |
+ EFileWrite |
+ EFileShareAny));
+ }
+ else
+ {
+ User::LeaveIfError(err);
+ }
+}
+
+void CMMAVideoRecordControl::DoSetRecordSizeLimitL(TInt aSize)
+{
+ if (aSize == KUnlimitedSize)
+ {
+ iRecorder->SetMaxClipSizeL(KMMFNoMaxClipSize);
+ }
+ else
+ {
+ LOG1( EJavaMMAPI, EInfo, "MMA:CMMAVideoRecordControl::DoSetRecordSizeLimitL %d", aSize);
+ iRecorder->SetMaxClipSizeL(aSize);
+ }
+ // reset local value
+ iRecordSizeLimit = KNoUserDefinedRecordSize;
+ // have to reprepare after setting clipsize
+ iRecorder->Prepare();
+ if (!iActiveSchedulerWait->IsStarted())
+ {
+ iActiveSchedulerWait->Start();
+ }
+ User::LeaveIfError(iError);
+}
+
+TInt CMMAVideoRecordControl::SetRecordSizeLimitL(TInt aSize)
+{
+ LOG1( EJavaMMAPI, EInfo, "MMA:CMMAVideoRecordControl::SetRecordSizeLimitL %d", aSize);
+
+ // if already recording, try to set immediately
+ if (iState == ERecordRecording)
+ {
+ DoSetRecordSizeLimitL(aSize);
+ }
+ else
+ {
+ // set record size limit when recording is started
+ iRecordSizeLimit = aSize;
+ }
+ return aSize;
+}
+
+void CMMAVideoRecordControl::MvruoOpenComplete(TInt aError)
+{
+ ELOG1( EJavaMMAPI, "MMA:CMMAVideoRecordControl::MvruoOpenComplete aError = %d", aError);
+
+ // Error situation is handled in ConstructL,
+ iError = aError;
+ if (iActiveSchedulerWait->IsStarted())
+ {
+ iActiveSchedulerWait->AsyncStop();
+ }
+}
+
+void CMMAVideoRecordControl::MvruoPrepareComplete(TInt aError)
+{
+ ELOG1( EJavaMMAPI, "MMA:CMMAVideoRecordControl::MvruoPrepareComplete aError = %d", aError);
+ // Error situation is handled in InitializeL
+ iError = aError;
+ if (iActiveSchedulerWait->IsStarted())
+ {
+ iActiveSchedulerWait->AsyncStop();
+ }
+}
+
+void CMMAVideoRecordControl::MvruoRecordComplete(TInt aError)
+{
+ ELOG1( EJavaMMAPI, "MMA:CMMAVideoRecordControl::MvruoRecordComplete aError = %d", aError);
+
+ // iState = ERecordComplete
+
+ if ((aError == KErrNone) ||
+ (aError == KErrCompletion)) // Size limit reached
+ {
+ if (aError == KErrCompletion)
+ {
+ HandleRecordSizeLimit();
+ }
+ }
+ else
+ {
+ Error(aError);
+ }
+}
+
+
+void CMMAVideoRecordControl::MvruoEvent(const TMMFEvent& aEvent)
+{
+ ELOG1( EJavaMMAPI, "MMA:CMMAVideoRecordControl::MvruoEvent event error code = %d", aEvent.iErrorCode);
+ // Only error situations needs to be considered.
+ if (aEvent.iErrorCode != KErrNone)
+ {
+ Error(aEvent.iErrorCode);
+ }
+}
+
+// END OF FILE