javauis/mmapi_akn/baseline/src.dsa/cmmacameraplayerfactory.cpp
branchRCL_3
changeset 24 6c158198356e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/mmapi_akn/baseline/src.dsa/cmmacameraplayerfactory.cpp	Thu Aug 19 09:48:13 2010 +0300
@@ -0,0 +1,224 @@
+/*
+* 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 used for creating camera players.
+*
+*/
+
+
+//  INCLUDE FILES
+#include <e32std.h>
+#include <jdebug.h>
+
+#include "cmmacameraplayerfactory.h"
+#include "cmmacameraplayer.h"
+#include "cmmavideocontrol.h"
+#include "cmmavideorecordcontrol.h"
+#include "cmmastoptimecontrol.h"
+#include "cmmaplayerproperties.h"
+#include "cmmammfresolver.h"
+
+_LIT(KDefaultVideo, "video");
+//is the main camera
+_LIT(KDevcamZero,  "devcam0");
+// the secondary camera
+_LIT(KDevcamOne,  "devcam1");
+
+_LIT(KEncodingProperty, "encoding");
+
+_LIT(KVideoMp4MimeType, "video/mp4");
+_LIT(KVideoH264MimeType, "video/H264");
+
+CMMACameraPlayerFactory* CMMACameraPlayerFactory::NewLC()
+{
+    CMMACameraPlayerFactory* pFactory =
+        new(ELeave) CMMACameraPlayerFactory();
+    CleanupStack::PushL(pFactory);
+    return pFactory;
+}
+
+
+CMMACameraPlayerFactory::CMMACameraPlayerFactory()
+{
+}
+
+
+CMMACameraPlayerFactory::~CMMACameraPlayerFactory()
+{
+    delete iAudioSettings;
+}
+
+CMMAPlayer* CMMACameraPlayerFactory::CreatePlayerL(
+    CMMAMMFResolver* aResolver)
+{
+    DEBUG("MMA::CMMACameraPlayerFactory::CreatePlayerL( aResolver )+");
+    CMMACameraPlayer* player = CMMACameraPlayer::NewLC(iCameraIndex);
+
+    /* Add VideoControl */
+    CMMAVideoControl* videoControl = new(ELeave)CMMAVideoControl(player);
+
+    CleanupStack::PushL(videoControl);
+    player->AddControlL(videoControl);
+    CleanupStack::Pop(videoControl);
+
+    /* Add RecordControl */
+    CMMAVideoRecordControl* videoRecordControl =
+        CMMAVideoRecordControl::NewL(player,
+                                     aResolver,
+                                     iVideoSettings,
+                                     iAudioSettings,
+                                     player->CameraHandle());
+    CleanupStack::PushL(videoRecordControl);
+    player->AddControlL(videoRecordControl);
+    // ownership transfered to player
+    CleanupStack::Pop(videoRecordControl);
+
+    // With record control view finder can't be stopped,
+    // because it can not be restarted.
+    player->SetViewFinderMode(EFalse);
+
+    CleanupStack::Pop(player);
+    return player;
+}
+
+
+void CMMACameraPlayerFactory::MediaIdsL(RArray<TUid>& aMediaIds)
+{
+    CleanupClosePushL(aMediaIds);
+    User::LeaveIfError(aMediaIds.Append(KUidMediaTypeVideo));
+    CleanupStack::Pop();
+}
+
+void CMMACameraPlayerFactory::PreparePluginSelectionParametersL(
+    CMMAMMFResolver* aResolver,
+    CMMFFormatSelectionParameters* aFormatSelection)
+{
+    // We are creating record type player
+    aResolver->SetRequiredRecordFormatSupportL(*aFormatSelection);
+}
+
+CMMAPlayer* CMMACameraPlayerFactory::CreatePlayerL(const TDesC&)
+{
+    // record player cannot be created from conten-type, since this is used only
+    // when we have also data
+    return NULL;
+}
+
+
+CMMAPlayer* CMMACameraPlayerFactory::CreatePlayerL(const TDesC8&)
+{
+    // record player cannot be created with header data
+    return NULL;
+}
+
+CMMAPlayer* CMMACameraPlayerFactory::CreatePlayerL(
+    const TDesC& aProtocol,
+    const TDesC& aMiddlePart,
+    const TDesC& aParameters)
+{
+    DEBUG_STR("MMA::CMMACameraPlayerFactory::CreatePlayerL aParameters = %S", aParameters);
+    // check that locator is capture:://audio
+    if (aProtocol != KMMACaptureProtocol)
+    {
+        return NULL;
+    }
+
+    iCameraIndex = KErrNotFound;
+
+    // If the device supports multiple cameras then "capture://devcam0" is the
+    // main camera pointing outwards from the user. "capture://devcam1" is the
+    // secondary camera pointing e.g. towards the user. "capture://video" is
+    // the default camera locator pointing to the same camera as "devcam0"
+    if ((aMiddlePart == KDefaultVideo) ||
+            (aMiddlePart == KDevcamZero))
+    {
+        // First camera
+        iCameraIndex = 0;
+    }
+    else if (aMiddlePart == KDevcamOne)
+    {
+        // Second camera.
+        iCameraIndex = 1;
+    }
+    else
+    {
+        // not supported type
+        return NULL;
+    }
+
+    CMMAAudioSettings* audioSettings = new(ELeave) CMMAAudioSettings;
+    audioSettings->iDataType = KMMFFourCCCodeNULL;
+    delete iAudioSettings;
+    iAudioSettings = audioSettings;
+
+    if (aParameters.Length() == 0)
+    {
+        // getting defaults from validator
+        iVideoSettings = TMMAParameterValidator::ValidateVideoPropertiesL(aParameters);
+    }
+    else
+    {
+        // we accept either video or mixed parameters, so properties must contain encoding 2 times for mixed and
+        // 1 time for video.
+        // making tmp des without first "encoding"
+        TInt lengthWithoutEncoding = aParameters.Length() - KEncodingProperty().Length();
+        if (lengthWithoutEncoding < 0)
+        {
+            User::Leave(KErrArgument);
+        }
+        TPtrC tmp = aParameters.Right(lengthWithoutEncoding);
+        // finding second "encoding"
+        TInt videoPropertiesStartPos = tmp.Find(KEncodingProperty);
+        if (videoPropertiesStartPos == KErrNotFound)
+        {
+            // there is not another encoding, so assuming that there is only video parameters
+            iVideoSettings = TMMAParameterValidator::ValidateVideoPropertiesL(aParameters);
+        }
+        else
+        {
+            // there is mixed parameters
+            videoPropertiesStartPos += KEncodingProperty().Length();
+
+            // skipping '&' char
+            TPtrC audioProperties = aParameters.Left(videoPropertiesStartPos - 1);
+            TPtrC videoProperties = aParameters.Mid(videoPropertiesStartPos);
+            iVideoSettings = TMMAParameterValidator::ValidateVideoPropertiesL(videoProperties);
+
+            CMMAAudioSettings* audioSettings = TMMAParameterValidator::ValidateAudioPropertiesL(audioProperties);
+            delete iAudioSettings;
+            iAudioSettings = audioSettings;
+        }
+    }
+
+    // if wanted video capture encoding is H264, we must create player with video/mp4
+    // because mmf doesn't have controller for H264
+    if (iVideoSettings.iEncoding.Compare(KVideoH264MimeType) == 0)
+    {
+        return CMMAMMFPlayerFactory::CreatePlayerL(KVideoMp4MimeType);
+    }
+
+    // Find controller with content-type
+    return CMMAMMFPlayerFactory::CreatePlayerL(iVideoSettings.iEncoding);
+}
+
+void CMMACameraPlayerFactory::GetSupportedProtocolsL(
+    const TDesC& aContentType,
+    CDesC16Array& aProtocolArray)
+{
+    if (IsSupportedContentTypeL(aContentType))
+    {
+        aProtocolArray.AppendL(KMMACaptureProtocol);
+    }
+}
+
+//  END OF FILE