mmdevicefw/mdf/src/openmax/omxcomponentimpl.h
changeset 0 40261b775718
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmdevicefw/mdf/src/openmax/omxcomponentimpl.h	Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,127 @@
+// Copyright (c) 2005-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:
+//
+
+#ifndef OMX_COMPONENTIMPL_H
+#define OMX_COMPONENTIMPL_H
+
+#include <e32msgqueue.h>
+
+class CMMFBuffer;
+
+class COmxBufferManager : public CBase
+	{
+public:
+
+	class COmxBuffer : public CBase
+		{
+	public:
+		static COmxBuffer* NewL(OMX_BUFFERHEADERTYPE* aBufferHeader, CMMFBuffer* aBuffer);
+		~COmxBuffer();
+		
+		CMMFBuffer* MmfBuffer() const;
+		OMX_BUFFERHEADERTYPE* BufferHeader() const;
+		
+		void SetInputPortCallbacks(MOmxInputPortCallbacks* aCallbacks);
+		void SetOutputPortCallbacks(MOmxOutputPortCallbacks* aCallbacks);
+		
+		MOmxInputPortCallbacks* InputPortCallbacks() const;
+		MOmxOutputPortCallbacks* OutputPortCallbacks() const;
+		
+	private:
+		COmxBuffer();
+		void ConstructL(OMX_BUFFERHEADERTYPE* aBufferHeader, CMMFBuffer* aBuffer);
+		
+		OMX_BUFFERHEADERTYPE* iBufferHeader;
+		CMMFBuffer* iMmfBuffer;
+		
+		TBool iOwnsMmfBuffer;
+		MOmxInputPortCallbacks* iInputPortCallbacks;
+		MOmxOutputPortCallbacks* iOutputPortCallbacks;
+		};
+		
+public:
+	COmxBufferManager(OMX_COMPONENTTYPE* aHandle);
+	~COmxBufferManager();
+	
+	// Buffer lookup
+	COmxBuffer* FindBuffer(const CMMFBuffer* aBuffer) const;
+	COmxBuffer* FindBuffer(OMX_BUFFERHEADERTYPE* aBuffer) const;
+	
+	// OMX Calls
+	TInt UseBuffer(CMMFBuffer& aBuffer, TUint nPortIndex);
+	CMMFBuffer* AllocateBufferL(TUint nPortIndex, TUint nSizeBytes);
+	TInt FreeBuffer(CMMFBuffer* aBuffer);
+	
+	TInt EmptyThisBuffer(const CMMFBuffer* aBuffer, MOmxInputPortCallbacks* aObserver);
+	TInt FillThisBuffer(CMMFBuffer* aBuffer, MOmxOutputPortCallbacks* aObserver);
+	
+	// Store OMX buffer pointer
+	void StoreBufferL(OMX_BUFFERHEADERTYPE* aBufferHeader, CMMFBuffer* aBuffer);
+	
+	
+private:	
+	RPointerArray<COmxBuffer> iBuffers;
+	OMX_COMPONENTTYPE* iHandle;
+	};
+
+class COmxCallbacks : public CActive
+	{
+public:
+	enum TMessageType 
+		{
+		EFillBufferCallback,
+		EEmptyBufferCallback,
+		EEventCallback
+		};	
+
+	class TEventParams
+		{
+	public:		
+	 	OMX_EVENTTYPE iEvent; 
+		TUint iData1;
+		TUint iData2;
+		TAny* iExtra;
+		};
+
+	class TOmxMessage
+		{
+	public:
+		TMessageType iType;
+		OMX_HANDLETYPE iComponent;
+		union 
+			{
+			COmxBufferManager::COmxBuffer* iBuffer;
+			TEventParams iEventParams;
+			};	
+		};
+public:
+	static COmxCallbacks* NewL(MOmxPuCallbacks& aPuCallbacks);
+	operator OMX_CALLBACKTYPE*();
+	void RunL();
+	void DoCancel();
+	TInt FillBufferDone(OMX_HANDLETYPE aComponent, COmxBufferManager::COmxBuffer* aBuffer);
+	TInt EmptyBufferDone(OMX_HANDLETYPE aComponent, COmxBufferManager::COmxBuffer* aBuffer);
+	TInt EventHandler(OMX_HANDLETYPE aComponent, TEventParams aParams);
+	virtual ~COmxCallbacks();
+private:
+	void ConstructL();
+	COmxCallbacks(MOmxPuCallbacks& aPuCallbacks);
+	int iState;
+	MOmxPuCallbacks* iPuCallbacks;
+	RMsgQueue<TOmxMessage> iMsgQueue;
+	OMX_CALLBACKTYPE iHandle;
+	};
+
+#endif // OMX_COMPONENTIMPL_H