javauis/mmapi_akn/baseline/inc.nga/cmmacameraplayer.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 19 Aug 2010 09:48:13 +0300
branchRCL_3
changeset 60 6c158198356e
permissions -rw-r--r--
Revision: v2.2.9 Kit: 201033

/*
* 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 playing camera.
*
*/


#ifndef CMMACAMERAPLAYER_H
#define CMMACAMERAPLAYER_H

//  INCLUDES
#include <sensrvdatalistener.h>
#include <sensrvchannel.h>
#include <sensrvorientationsensor.h>
#include <ECamOrientationCustomInterface2.h>
#include <ECamUIOrientationOverrideCustomAPI.h>
#include <ecam.h>
#include "cmmaplayer.h"
#include "mmmaguiplayer.h"
#include "mmmasnapshot.h"
#include "cmmacamerawindow.h"

// CONSTANTS
_LIT(KMMACameraPlayer, "CameraPlayer");

enum TCamActiveCamera
{
  ECamActiveCameraPrimary,
  ECamActiveCameraSecondary,
  ECamActiveCameraNone
};


enum TCamImageOrientation
{
  ECamOrientation0,
  ECamOrientation90,
  ECamOrientation180,
  ECamOrientation270,
  ECamOrientationIgnore,
  ECamOrientationCount
};

//  CLASS DECLARATION
/**
*   This class is used for playing camera.
*
*
*/

NONSHARABLE_CLASS(CMMACameraPlayer): public CMMAPlayer,
        public MMMAGuiPlayer,
        public MMMASnapshot,
        public MCameraObserver2,
        public MSensrvDataListener
{
public: // Construction
    /**
     * Creates new CMMACameraPlayer for the camera at certain index.
     * Index must be smaller CCamera::CamerasAvailable().
     * @param aCameraIndex Index of the camera.
     */
    static CMMACameraPlayer* NewLC(TCamActiveCamera aCameraIndex);

    //   Destructor
    ~CMMACameraPlayer();

protected:
    //   C++ constructor
    CMMACameraPlayer(TCamActiveCamera aCameraIndex);
    void ConstructL(TCamActiveCamera aCameraIndex);

private: // new methods
    TInt64 CurrentTime();
    void ResolveViewFinderSizeL(TSize& aSize);
    void ResolveScreenSizeL(TSize& aSize);
    void ResolveCaptureSizes(const CCamera::TFormat aFormat,
                             const TInt aNumImageSizesSupported,
                             const TSize& aRequestSize,
                             TSize& aSourceSize,
                             TInt& aSourceIndex,
                             TInt& aLargestIndex);
    /**
     * Registers and start listening to sensor channel.
     */
    void UpdateSensorInfoL();

    /**
     * Copies bitmap image from camerabuffer to iSnapshotBitmap
     */
    void HandleBitmapCopyL(MCameraBuffer& aCameraBuffer,
                           CFbsBitmap* aSrcBitmap);

    /**
     * Determines amount of image rotation required for the given sensor
     * orientation input.
     */
    static TCamImageOrientation MapSensorOrientatio2CamOrientation( 
        const TSensrvOrientationData::TSensrvDeviceOrientation& aSensorOrientation, 
        TCamImageOrientation aLastImageOrientation,
        TCamActiveCamera aActiveCameraIndex);

    /**
     * Convert UI orienation setting value of type TCamImageOrientation
     * to MCameraOrientation TOrientation value.
     */
    static MCameraOrientation::TOrientation 
      Map2CameraOrientation(const TCamImageOrientation& aSettingOrientation);

public: // from CMMAPlayer
    void StartL(TBool aPostEvent);
    void StopL(TBool aPostEvent);
    void DeallocateL();
    void RealizeL();
    void PrefetchL();
    void GetDuration(TInt64* aDuration);
    void SetMediaTimeL(TInt64* aTime);
    void GetMediaTime(TInt64* aMediaTime);
    void CloseL();
    const TDesC& Type();
public: // From MCameraObserver2
    void HandleEvent(const TECAMEvent& aEvent);
    void ViewFinderReady(MCameraBuffer& aCameraBuffer,TInt aError);
    void ImageBufferReady(MCameraBuffer& aCameraBuffer,TInt aError);
    void VideoBufferReady(MCameraBuffer& aCameraBuffer,TInt aError);

public: // From MMMAGuiPlayer
    void SetDisplayL(MMMADisplay* aDisplay);
    TSize SourceSize();
    void NotifyWithStringEvent(CMMAPlayerEvent::TEventType aEventType,
                               const TDesC& aStringEventData);
    MMMASnapshot* SnapshoterL();

public: // From MMMASnapshot
    MMMASnapshot::TEncoding TakeSnapshotL(TRequestStatus* aStatus,
                                          const TSize& aSize,
                                          const CMMAImageSettings& aSettings);
    CFbsBitmap* SnapshotBitmap();
    HBufC8* SnapshotEncoded();

private: // From MSensrvDataListener
    void DataReceived(CSensrvChannel& aChannel,
                       TInt aCount, 
                       TInt aDataLost);
    void DataError(CSensrvChannel& aChannel,
                    TSensrvErrorSeverity aError);
    void GetDataListenerInterfaceL(TUid aInterfaceUid,
                                    TAny*& aInterface);

public: // New methods
    TInt CameraHandle();
    /**
     * Disables or enables viewfinder stopping.
     * Needed when using recording.
     *
     * @param aStopViewFinder If true viewfinder will be really stopped.
     */
    void SetViewFinderMode(TBool aStopViewFinder);

private: // Data
    /**
      * Window used to render viewfinder.
      * Owned.
      */
    CMMACameraWindow* iWindow;

    /**
     * Camera instance used for taking snapshots and recording.
     * iWindow uses this to create duplicated camera instance.
     * Owned.
     */
    CCamera* iCamera;
    MMMADisplay* iDisplay;

    // index to be used for size enumeration
    TInt iSourceSizeIndex;

    TInt64 iMediaTime;
    TInt64 iStartTime;

    TRequestStatus* iSnapshotStatus;

    // Owned.
    CFbsBitmap* iSnapshotBitmap;
    HBufC8* iSnapshotEncoded;

    TSize iSize;
    TBool iStopViewFinder;

    // inner class for waiting realize, owned
    class CRealizeWait : public CActiveSchedulerWait
    {
    public:
        TInt iError;
    };
    CRealizeWait* iRealizeWait;

    TCamActiveCamera iActiveCameraIndex;
    TCamImageOrientation  iImageOrientation;
    TCamImageOrientation  iLastImageOrientation;
    // owned
    CSensrvChannel* iAccSensorChannel;
    // not owned
    MCameraOrientation* iCustomInterfaceOrientation;
    // not owned
    MCameraUIOrientationOverride* iCustomInterfaceUIOrientationOverride;
};

#endif // CMMACAMERAPLAYER_H