khronosfws/openmax_al/src/mmf_adaptation/cmmfbackendengine.h
branchRCL_3
changeset 45 095bea5f582e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/khronosfws/openmax_al/src/mmf_adaptation/cmmfbackendengine.h	Tue Aug 31 15:43:02 2010 +0300
@@ -0,0 +1,324 @@
+/*
+ * Copyright (c) 2009 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: MMF Backend Engine Header
+ *
+ */
+
+#ifndef CMMFBackendEngine_H
+#define CMMFBackendEngine_H
+
+#define ENABLE_GRAPHICS_SURFACE_INTEGRATION
+
+#include "openmaxalwrapper.h"
+
+#ifdef __cplusplus
+
+#include <e32base.h>
+#include <mdaaudiosampleplayer.h>  
+#include <f32file.h>
+#include <videoplayer.h>
+#include <videoplayer2.h>
+#include <e32std.h>
+#include <mmf/common/mmferrors.h>
+#include <mmf/common/mmfbase.h>
+#include <MMFMetadataEventConfigConstants.h>
+#include <mmf/common/mmfstandardcustomcommands.h>
+#ifdef ENABLE_GRAPHICS_SURFACE_INTEGRATION
+#include <graphics/surface.h> //TSurfaceId
+#include <mmf/common/mmfvideo.h> //TVideoAspectRatio
+#include <mediaclientvideodisplay.h>
+#include <surfaceeventhandler.h>
+#include <mdaaudiosampleeditor.h>
+#include <AudioInput.h>
+#include "sfmrlocaltimer.h"
+#endif
+
+// MetaDataWrite Custom Command UID
+const TUid KUidMetaDataWriteCustomCommand =
+    {
+    0x10207af9
+    };
+
+#define MAX_EXTENSION_SIZE 10
+
+class CMarkerPositionTimer;
+class CPositionUpdateTimer;
+NONSHARABLE_CLASS(CMMFBackendEngine) : public CBase,
+        public MVideoPlayerUtilityObserver,
+        public MVideoLoadingObserver,
+        public MMdaAudioPlayerCallback,
+        public MMdaObjectStateChangeObserver
+    {
+public:
+    enum TFuncInUse
+        {
+                EPlay = 0, 
+                ERecord
+        };
+
+    enum TUriType
+        {
+                ELocal = 0, 
+                EStreaming
+        };
+
+    enum TMMFUtiltyInUse
+        {
+        ENoUtility,
+        EVideoPlayerUtility,
+        EAudioPlayerUtility,
+        EAudioRecorderUtility
+        };
+
+    enum TRecorderState
+        {
+                ERecorderNotReady = 0, 
+                ERecorderOpen, 
+                ERecorderRecording
+        };
+
+public:
+
+    static CMMFBackendEngine* NewL();
+    ~CMMFBackendEngine();
+
+    TInt SetFileName(char* uri, XAuint32 format, TFuncInUse func);
+    void Close();
+    void Destroy();
+    TInt SetRecorderState(TRecorderState state, XAboolean stopCalled);
+    TInt GetRecordPosition(XAuint64* position);
+    TInt SetPositionUpdatePerioed(XAmillisecond period);
+    TInt SetAdaptContext(void* adaptcontext);
+    TInt GetCodecId(XAuint32* encoderId);
+    TInt GetBitRate(XAuint32* bitrate);
+    TInt GetSampleRate(XAmilliHertz* samplerate);
+    TInt GetChannels(XAuint32* channels);
+    TInt SetDestinationBitRate(XAuint32* bitrate);
+    TInt SetDestinationSampleRate(XAmilliHertz* samplerate);
+    TInt SetDestinationChannels(XAuint32* channels);
+
+    XAresult CreateAndConfigureWindowL();
+    XAresult SetNativeDisplayInformation(void* display_info);
+    XAresult ResumePlayback();
+    XAresult PausePlayback();
+    XAresult StopPlayback();
+    XAresult GetPlayState(XAuint32 *pState);
+    XAresult GetDuration(XAmillisecond *pMsec);
+    XAresult GetPosition(XAmillisecond *pMsec);
+    XAresult SetPlayAdaptContext(void * adaptcontext);
+    XAresult RegisterCallback(xaPlayCallback cbFunction);
+    XAresult SetCallbackEventsMask(XAuint32 eventflags);
+    XAresult SetMarkerPosition(XAmillisecond mSec);
+    XAresult ClearMarkerPosition();
+    XAresult SetPositionUpdatePeriod(XAmillisecond mSec);
+
+    XAresult SetPosition(XAmillisecond pMsec);
+    XAresult SetRepeats(XAboolean repeat);
+    XAresult SetPlayWindow(XAmillisecond start, XAmillisecond end);
+
+    XAresult GetNumStreams(XAuint32* numstreams);
+    XAresult GetStreamInfo(XAuint32 streamindex, XAuint32* streamtype);
+    XAresult GetVideoFrameSize(XAuint32* height, XAuint32* width,
+            XAuint32* frameRate);
+    XAresult SetActiveState(XAuint32 streamindex, XAboolean active);
+
+    XAresult SetVolume(XAuint32 volume);
+    XAresult GetVolume(XAuint32* volume);
+    XAresult GetMaxVolume(XAuint32* maxvolume);
+
+    XAresult SetPlaybackRate(XAint16 rate);
+    XAresult GetPlaybackRateCapabilities(XAboolean* forward, XAboolean* backward);
+
+public:
+
+    // MMdaObjectStateChangeObserver
+    void MoscoStateChangeEvent(CBase* aObject, TInt aPreviousState,
+            TInt aCurrentState, TInt aErrorcCode);
+
+    //MMdaAudioPlayerCallback
+    void MapcInitComplete(TInt aError,
+            const TTimeIntervalMicroSeconds& aDuration);
+    void MapcPlayComplete(TInt aError);
+
+    //From MVidePlayerUtilityObserver
+    void MvpuoOpenComplete(TInt aError);
+    void MvpuoPrepareComplete(TInt aError);
+    void MvpuoFrameReady(CFbsBitmap& aFrame, TInt aError);
+    void MvpuoPlayComplete(TInt aError);
+    void MvpuoEvent(const TMMFEvent& aEvent);
+
+    // From MRebufferCallback
+    void MvloLoadingStarted();
+    void MvloLoadingComplete();
+
+private:
+    enum TPlayerState
+        {
+        EPlayerClosed,
+        EPlayerOpened,
+        EPlayerPrepared,
+        EPlayerPaused,
+        EPlayerPlaying,
+        };
+
+private:
+    CMMFBackendEngine();
+    void ConstructL();
+    void InitAudioRecorderUtilityL();
+    void InitAudioPlayerUtilityL();
+    void InitVideoPlayerUtilityL();
+    void InitPlayerTimersL();
+    TInt DetermineAPIToUse(char *uri, TFuncInUse aFunc);
+    XAresult DoHandlePlayItfAttributesChanged();
+    void DoPostEvent(XAuint32 event);
+    TInt InitializeURIForMMFUtil(char *uri);
+
+private:
+    CVideoPlayerUtility2* iVideoPlayer;
+    CBase* iBaseVideoPlayer;
+    CMdaAudioPlayerUtility* iAudioPlayer;
+    CBase* iBaseAudioPlayer;
+    CMdaAudioRecorderUtility* iAudioRecorder;
+    CBase* iBaseAudioRecorder;
+    TFileName iFileName;
+    TInt iAPIBeingUsed;
+    TInt iPreviousRecordState;
+    TInt iCurrentRecordState;
+    TInt iErrorCode;
+    TRecorderState iRecordState;
+    LocalTimer* iPositionUpdateTimer;
+    TUint64 iTimerDelay;
+    void* iAdaptContext;
+    XAuint32 iFileFormat;
+    TInt iPauseSupportMP4;
+    CActiveSchedulerWait* iActiveSchedulerWait;
+    CAudioInput* iAudioInputRecord;
+#ifdef USE_LOCAL_WINDOW_RESOURCES
+    CMediaClientVideoDisplay* iMediaClientVideoDisplay;
+    TRect m_clipRect;
+    TRect m_videoExtent;
+    TRect m_cropRegion;
+    TVideoAspectRatio m_pixelAspectRatio;
+    RWindow m_Window;
+    TRect m_cropRect;
+    TSurfaceId m_surfaceId;
+    TVideoRotation m_rotation;
+    TReal32 m_scaleWidth;
+    TReal32 m_scaleHeight;
+    TInt m_horizPos;
+    TInt m_vertPos;
+    TInt m_displayId;
+    /*TBool m_bWindowReferencePassed;*/
+    RWsSession m_ws;
+#endif /* USE_LOCAL_WINDOW_RESOURCES */
+
+    /* Holds duration of the media clip opend for playback */
+    TTimeIntervalMicroSeconds iMediaDuration;
+    /* Holds the playback position to be used for next play command */
+    TTimeIntervalMicroSeconds iPlaybackHead;
+    /* Holds current XA state of media player object */
+    XAuint32 iMediaPlayerState;
+    /* Owns */
+    CMarkerPositionTimer* iMarkerPositionTimer;
+    CPositionUpdateTimer* iPlayItfPositionUpdateTimer;
+    /* Owns */
+    CWsScreenDevice* m_pScr;
+    /* Holds mmf state of media player object */
+    TPlayerState iMMFPlayerState;
+
+    /* Property set by client */
+    XAuint32 iPlayItfEventFlags;
+    /* Property set by client */
+    xaPlayCallback iPlayItfCBFunction;
+    /* Property set by client */
+    XAmillisecond iMarkerPosition;
+    /* Property set by client */
+    XAmillisecond iPositionUpdatePeriod;
+    /* Property set by client (for file without file:///) */
+    HBufC* iUri; /* owns */
+    TPtr iUriPtr;
+    TUriType iUriType;
+    /* Property set by client */
+    RWsSession* m_pWs;
+    /* Property set by client */
+    RWindow* m_pWindow;
+    };
+
+#else  /* __cplusplus */
+
+extern int mmf_backend_engine_init(void** engine);
+extern int mmf_backend_engine_deinit(void* engine);
+
+extern int mmf_set_recorder_uri(void* context, char* uri, XAuint32 format);
+
+extern void mmf_close(void* context);
+
+extern int mmf_set_adapt_context(void* context, void* adaptcontext);
+
+extern int mmf_start_recording(void* context);
+
+extern int mmf_stop_recording(void* context, XAboolean stopCalled);
+
+extern int mmf_get_record_position(void* context, XAuint64* position);
+
+extern int mmf_set_record_position_update_period(void* context, XAmillisecond msec);
+
+extern int mmf_get_codec_id(void* context, XAuint32* encoderId);
+extern int mmf_get_channels(void* context, XAuint32* channelsIn);
+extern int mmf_get_samplerate(void* context, XAmilliHertz* sampleRate);
+extern int mmf_get_bitrate(void* context, XAuint32* bitRate);
+extern int mmf_set_destination_channels(void* context, XAuint32* channelsIn);
+extern int mmf_set_destination_samplerate(void* context, XAmilliHertz* sampleRate);
+extern int mmf_set_destination_bitrate(void* context, XAuint32* bitRate);
+
+extern XAresult mmf_set_play_adapt_context(void * context, void * adaptcontext);
+extern XAresult mmf_set_player_uri(void * context, char * uri, XAuint32 format);
+/*extern XAresult mmf_set_window_handle(void * context, void * display_infos);*/
+extern XAresult mmf_setup_native_display(void * context, void * display_info);
+
+/*Functions for XAPlayItf*/
+extern XAresult mmf_playitf_resume_playback(void * context);
+extern XAresult mmf_playitf_pause_playback(void * context);
+extern XAresult mmf_playitf_stop_playback(void * context);
+extern XAresult mmf_playitf_get_play_state(void * context, XAuint32 * pState);
+extern XAresult mmf_playitf_get_duration(void * context, XAmillisecond * pMsec);
+extern XAresult mmf_playitf_get_position(void * context, XAmillisecond * pMsec);
+extern XAresult mmf_playitf_register_callback(void * context, xaPlayCallback callback);
+extern XAresult mmf_playitf_set_callback_events_mask(void * context, XAuint32 eventflags);
+extern XAresult mmf_playitf_set_marker_position(void * context, XAmillisecond mSec);
+extern XAresult mmf_playitf_clear_marker_position(void * context);
+extern XAresult mmf_playitf_set_position_update_period(void * context, XAmillisecond mSec);
+
+extern XAresult mmf_seekitf_set_position(void * context, XAmillisecond mSec);
+extern XAresult mmf_seekitf_set_playwindow(void * context, XAmillisecond start, XAmillisecond end);
+extern XAresult mmf_seekitf_set_repeats(void * context, XAboolean repeat);
+
+extern XAresult mmf_streaminformationitf_get_numstreams(void * context, XAuint32* numstreams);
+extern XAresult mmf_streaminformationitf_get_streaminfo(void * context, XAuint32 streamindex,
+        XAuint32* streamtype);
+extern XAresult mmf_streaminformationitf_get_videoframesize(void * context, XAuint32* height,
+        XAuint32* width, XAuint32* frameRate);
+extern XAresult mmf_streaminformationitf_set_activestream(void * context, XAuint32 streamindex,
+        XAboolean active);
+
+extern XAresult mmf_volumeitf_set_volume(void * context, XAuint32 volume);
+extern XAresult mmf_volumeitf_get_volume(void * context, XAuint32* volume);
+extern XAresult mmf_volumeitf_get_maxvolume(void * context, XAuint32* volume);
+extern XAresult mmf_playbackrateitf_set_playbackrate(void * context, XAint16 rate);
+extern XAresult mmf_playbackrateitf_get_playbackratecaps(void * context,
+                                XAboolean* forward, XAboolean* backward);
+
+#endif /* __cplusplus */
+
+#endif /* CMMFBackendEngine_H */