--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/omxilvideocomps/omxilgraphicsink/src/omxilgraphicsinkprocessingfunction.h Fri Oct 08 22:09:17 2010 +0100
@@ -0,0 +1,246 @@
+/*
+* Copyright (c) 2008-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:
+*
+*/
+
+/**
+ @file
+ @internalComponent
+*/
+
+#ifndef OMXILGRAPHICSINKPROCESSINGFUNCTION_H
+#define OMXILGRAPHICSINKPROCESSINGFUNCTION_H
+
+#include <e32msgqueue.h>
+#include <openmax/il/common/omxilprocessingfunction.h>
+#include <openmax/il/extensions/omxilsymbianvideographicsinkextensions.h>
+#include <openmax/il/khronos/v1_x/OMX_Video.h>
+#include <graphics/surface.h>
+#include <graphics/surfacemanager.h>
+#include <graphics/surfaceupdateclient.h>
+#include <graphics/surfaceconfiguration.h>
+#include "mmfbuffershared.h"
+
+
+class COmxILGraphicSinkVPB0Port;
+/**
+The class for GraphicSink processing functions. This provides the main processing engine behind the graphic sink.
+*/
+class COmxILGraphicSinkProcessingFunction :
+ public COmxILProcessingFunction
+ {
+private:
+ class TGraphicSurfaceSettings
+ {
+ public:
+ TGraphicSurfaceSettings() : iSurfaceAttributes(iSurfaceAttributesBuf()) {};
+
+ public:
+ // Surface configuration
+ TSurfaceConfiguration iSurfaceConfig;
+ // A package for surface attribute.
+ RSurfaceManager::TSurfaceCreationAttributesBuf iSurfaceAttributesBuf;
+ // A surface attribute.
+ RSurfaceManager::TSurfaceCreationAttributes& iSurfaceAttributes;
+ } iGraphicSurfaceSettings;
+
+public:
+ static COmxILGraphicSinkProcessingFunction* NewL(
+ MOmxILCallbackNotificationIf& aCallbacks);
+
+ ~COmxILGraphicSinkProcessingFunction();
+
+ OMX_ERRORTYPE StateTransitionIndication(TStateIndex aNewState);
+
+ OMX_ERRORTYPE BufferFlushingIndication(TUint32 aPortIndex,
+ OMX_DIRTYPE aDirection);
+
+ OMX_ERRORTYPE ParamIndication(OMX_INDEXTYPE aParamIndex,
+ const TAny* apComponentParameterStructure);
+
+ OMX_ERRORTYPE ConfigIndication(OMX_INDEXTYPE aConfigIndex,
+ const TAny* apComponentConfigStructure);
+
+ OMX_ERRORTYPE BufferIndication(
+ OMX_BUFFERHEADERTYPE* apBufferHeader,
+ OMX_DIRTYPE aDirection);
+
+ OMX_BOOL BufferRemovalIndication(
+ OMX_BUFFERHEADERTYPE* apBufferHeader,
+ OMX_DIRTYPE aDirection);
+
+ void CreateBufferL(OMX_U8*& aPortSpecificBuffer, OMX_PTR& aPortPrivate, OMX_U32 aBufferCountActual);
+ void DestroyBuffer(OMX_PTR apPortPrivate);
+ void InitBufferL(OMX_U32 aSizeBytes, OMX_U8* apBuffer, OMX_U32 aBufferCountActual);
+ void DeInitBuffer();
+ void WaitForTransitionToPauseToFinish();
+ void TransitionToPauseFinished();
+
+ TUidPixelFormat ConvertPixelFormat(OMX_COLOR_FORMATTYPE aColorFormat);
+
+ // Access private member (read and write)
+ inline MOmxILCallbackNotificationIf& GetCallbacks();
+ inline TSurfaceConfiguration& GetSurfaceConfiguration();
+ inline RPointerArray<OMX_BUFFERHEADERTYPE>& BuffersToEmpty();
+ inline TGraphicSurfaceSettings& GraphicSurfaceSettings();
+ inline OMX_STATETYPE State();
+ inline void SetState(OMX_STATETYPE aState);
+ inline RSurfaceManager& SurfaceManager();
+ inline TInt GetFastCounterFrequency();
+
+ void SetSharedChunkBufConfig(TMMSharedChunkBufConfig aSharedChunkBufConfig);
+ void GetSharedChunkMetadata(OMX_U32& aHandleId, OMX_U64& aThreadId) const;
+
+public:
+ //Not own, just points to related graphic sink port, so set it to public data member.
+ COmxILGraphicSinkVPB0Port* iGraphicSinkPort;
+private:
+ COmxILGraphicSinkProcessingFunction(MOmxILCallbackNotificationIf& aCallbacks);
+ void ConstructL();
+
+ void InitSurfaceAttributes();
+
+private:
+ RPointerArray<OMX_BUFFERHEADERTYPE> iBuffersToEmpty;
+ OMX_BUFFERHEADERTYPE* iBufferOnScreen;
+ RMutex iBufferMutex;
+ OMX_STATETYPE iState;
+ TInt iFastCounterFrequency;
+ // A surface manager.
+ RSurfaceManager iSurfaceManager;
+ TThreadId iOwnerThreadId;
+ CActiveSchedulerWait* iTransitionToPauseWait;
+ RSemaphore iTransitionToPauseWaitSemaphore;
+
+ /**
+ * Mediates access to the RSurfaceUpdateSession.
+ */
+ class CGraphicSurfaceAccess : public CActive
+ {
+ public:
+ static CGraphicSurfaceAccess* NewL(COmxILGraphicSinkProcessingFunction& aParent);
+ ~CGraphicSurfaceAccess();
+
+ // from CActive
+ void RunL();
+ void DoCancel();
+
+ TInt OpenDevice();
+ void CloseDevice();
+ TInt Execute();
+ TInt Pause();
+ TInt Stop();
+
+ void CreateBufferL(OMX_U8*& aPortSpecificBuffer, OMX_PTR& aPortPrivate, OMX_U32 aBufferCountActual);
+ void InitBufferL(OMX_U32 aSizeBytes, OMX_U8* apBuffer, OMX_U32 aBufferCountActual);
+
+ TInt ProcessNextBuffer();
+
+ void ResetSurfaceId();
+ void CloseChunk();
+
+ public:
+ TInt iSharedChunkHandleId;
+ TUint64 iSharedChunkThreadId;
+ TMMSharedChunkBufConfig iSharedChunkBufConfig;
+ TBool iIsLocalChunk;
+
+ private:
+ CGraphicSurfaceAccess(COmxILGraphicSinkProcessingFunction& aParent);
+
+ public:
+ TInt iBufferIdGenerator;
+
+ private:
+ OMX_BUFFERHEADERTYPE* iCurrentBuffer;
+ COmxILGraphicSinkProcessingFunction& iParent;
+
+ // Memory chunk
+ RChunk iChunk;
+
+ #ifdef ILCOMPONENTCONFORMANCE
+ // These are added for the ILComponentConformance Suite
+ // Handles copy of data in case of Non-buffer supplier, while running IL Component conformance suite
+ TBool iIsBufferSupplier;
+ // Conformance suite does not handle chunks therefore offsets from base chunk address are held in this array
+ RArray<TInt> iArrayOffsets;
+ #endif
+
+ // Surface Id
+ TSurfaceId iSurfaceId;
+ // A surface update session.
+ RSurfaceUpdateSession iSurfaceUpdateSession;
+ // Time stamp of the display notification event
+ TTimeStamp iTimeStamp;
+ // An indicator for first frame displayed
+ TBool iFirstFrameDisplayed;
+
+ RArray<TInt> iOffsetArray;
+
+ } *iGraphicSurfaceAccess;
+
+ /**
+ * Serializes operations into the 'main' thread hosting the Active Scheduler.
+ */
+ class CPFHelper : public CActive
+ {
+ public:
+ static CPFHelper* NewL(COmxILGraphicSinkProcessingFunction& aParent, CGraphicSurfaceAccess& aGraphicSurfaceAccess);
+ ~CPFHelper();
+
+ // from CActive
+ void RunL();
+ void DoCancel();
+
+ OMX_ERRORTYPE OpenDevice();
+ OMX_ERRORTYPE CloseDevice();
+ OMX_ERRORTYPE ExecuteAsync();
+ OMX_ERRORTYPE StopAsync();
+ OMX_ERRORTYPE StopSync();
+ OMX_ERRORTYPE Pause();
+ OMX_ERRORTYPE BufferIndication();
+
+ enum TMessageType
+ {
+ EOpenDevice,
+ ECloseDevice,
+ EExecuteCommand,
+ EStopCommand,
+ EPauseCommand,
+ EBufferIndication
+ };
+
+ RMsgQueue<TMessageType> iMsgQueue;
+
+ private:
+ CPFHelper(COmxILGraphicSinkProcessingFunction& aParent, CGraphicSurfaceAccess& aGraphicSurfaceAccess);
+ void ConstructL();
+
+ TInt ProcessQueue();
+
+ OMX_ERRORTYPE ConvertError(TInt aError);
+
+ private:
+ static const TInt KMaxMsgQueueEntries = 25;
+
+ COmxILGraphicSinkProcessingFunction& iParent;
+ CGraphicSurfaceAccess& iGraphicSurfaceAccess;
+ } *iPFHelper;
+ };
+
+#include "omxilgraphicsinkprocessingfunction.inl"
+
+#endif // OMXILGRAPHICSINKPROCESSINGFUNCTION_H
+