From 65209a91489268aef389985e928f4a896e1b3910 Mon Sep 17 00:00:00 2001 From: truong Date: Thu, 10 Jan 2019 13:54:37 +0000 Subject: [PATCH] refine: remove all DLL --- DllOMX.h | 124 --- DynamicDll.cpp | 95 -- DynamicDll.h | 497 --------- Makefile | 1 - OMXCore.cpp | 2535 ++++++++++++++++++++++----------------------- OMXCore.h | 298 +++--- omxtranscoder.cpp | 1 - 7 files changed, 1392 insertions(+), 2159 deletions(-) delete mode 100644 DllOMX.h delete mode 100644 DynamicDll.cpp delete mode 100644 DynamicDll.h diff --git a/DllOMX.h b/DllOMX.h deleted file mode 100644 index d1505e7..0000000 --- a/DllOMX.h +++ /dev/null @@ -1,124 +0,0 @@ -#pragma once -/* - * Copyright (C) 2005-2010 Team XBMC - * http://www.xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * http://www.gnu.org/copyleft/gpl.html - * - */ - -#if defined(HAVE_OMXLIB) - -#if (defined HAVE_CONFIG_H) && (!defined WIN32) - #include "config.h" -#endif -#ifndef __GNUC__ -#pragma warning(push) -#pragma warning(disable:4244) -#endif - -#include "DynamicDll.h" -#include "utils/log.h" - -#include -#include -#include -#include -#include -#include - -//////////////////////////////////////////////////////////////////////////////////////////// - -class DllOMXInterface -{ -public: - virtual ~DllOMXInterface() {} - - virtual OMX_ERRORTYPE OMX_Init(void) = 0; - virtual OMX_ERRORTYPE OMX_Deinit(void) = 0; - virtual OMX_ERRORTYPE OMX_GetHandle(OMX_HANDLETYPE *pHandle, OMX_STRING cComponentName, OMX_PTR pAppData, OMX_CALLBACKTYPE *pCallBacks) = 0; - virtual OMX_ERRORTYPE OMX_FreeHandle(OMX_HANDLETYPE hComponent) = 0; - virtual OMX_ERRORTYPE OMX_GetComponentsOfRole(OMX_STRING role, OMX_U32 *pNumComps, OMX_U8 **compNames) = 0; - virtual OMX_ERRORTYPE OMX_GetRolesOfComponent(OMX_STRING compName, OMX_U32 *pNumRoles, OMX_U8 **roles) = 0; - virtual OMX_ERRORTYPE OMX_ComponentNameEnum(OMX_STRING cComponentName, OMX_U32 nNameLength, OMX_U32 nIndex) = 0; - virtual OMX_ERRORTYPE OMX_SetupTunnel(OMX_HANDLETYPE hOutput, OMX_U32 nPortOutput, OMX_HANDLETYPE hInput, OMX_U32 nPortInput) = 0; - -}; - -#if (defined USE_EXTERNAL_OMX) -class DllOMX : public DllDynamic, DllOMXInterface -{ -public: - virtual OMX_ERRORTYPE OMX_Init(void) - { return ::OMX_Init(); }; - virtual OMX_ERRORTYPE OMX_Deinit(void) - { return ::OMX_Deinit(); }; - virtual OMX_ERRORTYPE OMX_GetHandle(OMX_HANDLETYPE *pHandle, OMX_STRING cComponentName, OMX_PTR pAppData, OMX_CALLBACKTYPE *pCallBacks) - { return ::OMX_GetHandle(pHandle, cComponentName, pAppData, pCallBacks); }; - virtual OMX_ERRORTYPE OMX_FreeHandle(OMX_HANDLETYPE hComponent) - { return ::OMX_FreeHandle(hComponent); }; - virtual OMX_ERRORTYPE OMX_GetComponentsOfRole(OMX_STRING role, OMX_U32 *pNumComps, OMX_U8 **compNames) - { return ::OMX_GetComponentsOfRole(role, pNumComps, compNames); }; - virtual OMX_ERRORTYPE OMX_GetRolesOfComponent(OMX_STRING compName, OMX_U32 *pNumRoles, OMX_U8 **roles) - { return ::OMX_GetRolesOfComponent(compName, pNumRoles, roles); }; - virtual OMX_ERRORTYPE OMX_ComponentNameEnum(OMX_STRING cComponentName, OMX_U32 nNameLength, OMX_U32 nIndex) - { return ::OMX_ComponentNameEnum(cComponentName, nNameLength, nIndex); }; - virtual OMX_ERRORTYPE OMX_SetupTunnel(OMX_HANDLETYPE hOutput, OMX_U32 nPortOutput, OMX_HANDLETYPE hInput, OMX_U32 nPortInput) - { return ::OMX_SetupTunnel(hOutput, nPortOutput, hInput, nPortInput); }; - virtual bool ResolveExports() - { return true; } - virtual bool Load() - { - CLog::Log(LOGDEBUG, "DllOMX: Using omx system library"); - return true; - } - virtual void Unload() {} - static DllOMX *GetDllOMX() { static DllOMX static_dll_omx; return &static_dll_omx; } -}; -#else -class DllOMX : public DllDynamic, DllOMXInterface -{ - //DECLARE_DLL_WRAPPER(DllLibOpenMax, "/usr/lib/libnvomx.so") - DECLARE_DLL_WRAPPER(DllOMX, "/opt/vc/lib/libopenmaxil.so") - - DEFINE_METHOD0(OMX_ERRORTYPE, OMX_Init) - DEFINE_METHOD0(OMX_ERRORTYPE, OMX_Deinit) - DEFINE_METHOD4(OMX_ERRORTYPE, OMX_GetHandle, (OMX_HANDLETYPE *p1, OMX_STRING p2, OMX_PTR p3, OMX_CALLBACKTYPE *p4)) - DEFINE_METHOD1(OMX_ERRORTYPE, OMX_FreeHandle, (OMX_HANDLETYPE p1)) - DEFINE_METHOD3(OMX_ERRORTYPE, OMX_GetComponentsOfRole, (OMX_STRING p1, OMX_U32 *p2, OMX_U8 **p3)) - DEFINE_METHOD3(OMX_ERRORTYPE, OMX_GetRolesOfComponent, (OMX_STRING p1, OMX_U32 *p2, OMX_U8 **p3)) - DEFINE_METHOD3(OMX_ERRORTYPE, OMX_ComponentNameEnum, (OMX_STRING p1, OMX_U32 p2, OMX_U32 p3)) - DEFINE_METHOD4(OMX_ERRORTYPE, OMX_SetupTunnel, (OMX_HANDLETYPE p1, OMX_U32 p2, OMX_HANDLETYPE p3, OMX_U32 p4)); - BEGIN_METHOD_RESOLVE() - RESOLVE_METHOD(OMX_Init) - RESOLVE_METHOD(OMX_Deinit) - RESOLVE_METHOD(OMX_GetHandle) - RESOLVE_METHOD(OMX_FreeHandle) - RESOLVE_METHOD(OMX_GetComponentsOfRole) - RESOLVE_METHOD(OMX_GetRolesOfComponent) - RESOLVE_METHOD(OMX_ComponentNameEnum) - RESOLVE_METHOD(OMX_SetupTunnel) - END_METHOD_RESOLVE() - -public: - virtual bool Load() - { - return DllDynamic::Load(); - } -}; -#endif - -#endif diff --git a/DynamicDll.cpp b/DynamicDll.cpp deleted file mode 100644 index 5c15130..0000000 --- a/DynamicDll.cpp +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (C) 2005-2008 Team XBMC - * http://www.xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * http://www.gnu.org/copyleft/gpl.html - * - */ - -#include "DynamicDll.h" -#include "utils/log.h" - -DllDynamic::DllDynamic() -{ - m_dll=NULL; - m_DelayUnload=true; -} - -DllDynamic::DllDynamic(const CStdString& strDllName) -{ - m_strDllName=strDllName; - m_dll=NULL; - m_DelayUnload=true; -} - -DllDynamic::~DllDynamic() -{ - Unload(); -} - -bool DllDynamic::Load() -{ - if (m_dll) - return true; - - /* - if (!(m_dll=CSectionLoader::LoadDLL(m_strDllName, m_DelayUnload, LoadSymbols()))) - return false; - - if (!ResolveExports()) - { - CLog::Log(LOGERROR, "Unable to resolve exports from dll %s", m_strDllName.c_str()); - Unload(); - return false; - } - */ - - return true; -} - -void DllDynamic::Unload() -{ - /* - if(m_dll) - CSectionLoader::UnloadDLL(m_strDllName); - */ - m_dll=NULL; -} - -bool DllDynamic::CanLoad() -{ - return true; -} - -bool DllDynamic::EnableDelayedUnload(bool bOnOff) -{ - if (m_dll) - return false; - - m_DelayUnload=bOnOff; - - return true; -} - -bool DllDynamic::SetFile(const CStdString& strDllName) -{ - if (m_dll) - return false; - - m_strDllName=strDllName; - return true; -} - diff --git a/DynamicDll.h b/DynamicDll.h deleted file mode 100644 index c2d29fd..0000000 --- a/DynamicDll.h +++ /dev/null @@ -1,497 +0,0 @@ -#pragma once - -/* - * Copyright (C) 2005-2008 Team XBMC - * http://www.xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * http://www.gnu.org/copyleft/gpl.html - * - */ - -#include "utils/StdString.h" - -/////////////////////////////////////////////////////////// -// -// DECLARE_DLL_WRAPPER -// -// Declares the constructor of the wrapper class. -// This must be followed by one or more -// DEFINE_METHODX/DEFINE_METHOD_LINKAGEX and -// one BEGIN_METHOD_RESOLVE/END_METHOD_RESOLVE block. -// -// classname: name of the wrapper class to construct -// dllname: file including path of the dll to wrap - -#define DECLARE_DLL_WRAPPER(classname, dllname) \ -XDECLARE_DLL_WRAPPER(classname,dllname) - -#define XDECLARE_DLL_WRAPPER(classname, dllname) \ -public: \ - classname () : DllDynamic( dllname ) {} - -/////////////////////////////////////////////////////////// -// -// DECLARE_DLL_WRAPPER_TEMPLATE_BEGIN -// -// Declares the constructor of the wrapper class. -// The method SetFile(strDllName) can be used to set the -// dll of this wrapper. -// This must be followed by one or more -// DEFINE_METHODX/DEFINE_METHOD_LINKAGEX and -// one BEGIN_METHOD_RESOLVE/END_METHOD_RESOLVE block. -// -// classname: name of the wrapper class to construct -// -#define DECLARE_DLL_WRAPPER_TEMPLATE(classname) \ -public: \ - classname () {} \ - - -/////////////////////////////////////////////////////////// -// -// LOAD_SYMBOLS -// -// Tells the dllloader to load Debug symblos when possible -#define LOAD_SYMBOLS() \ - protected: \ - virtual bool LoadSymbols() { return true; } - -/////////////////////////////////////////////////////////// -// -// DEFINE_GLOBAL -// -// Defines a global for export from the dll as well as -// a function for accessing it (Get_name). -// -// type: The variables type. -// name: Name of the variable. -// - -#define DEFINE_GLOBAL_PTR(type, name) \ - protected: \ - union { \ - type* m_##name; \ - void* m_##name##_ptr; \ - }; \ - public: \ - virtual type* Get_##name (void) \ - { \ - return m_##name; \ - } - -#define DEFINE_GLOBAL(type, name) \ - protected: \ - union { \ - type* m_##name; \ - void* m_##name##_ptr; \ - }; \ - public: \ - virtual type Get_##name (void) \ - { \ - return *m_##name; \ - } - -/////////////////////////////////////////////////////////// -// -// DEFINE_METHOD_LINKAGE -// -// Defines a function for an export from a dll, if the -// calling convention is not __cdecl. -// Use DEFINE_METHOD_LINKAGE for each function to be resolved. -// -// result: Result of the function -// linkage: Calling convention of the function -// name: Name of the function -// args: Arguments of the function, enclosed in parentheses -// -#define DEFINE_METHOD_LINKAGE_FP(result, linkage, name, args) \ - protected: \ - typedef result (linkage * name##_METHOD) args; \ - public: \ - union { \ - name##_METHOD name; \ - void* name##_ptr; \ - }; - -#define DEFINE_METHOD_LINKAGE_BASE(result, linkage, name, args, args2) \ - protected: \ - typedef result (linkage * name##_METHOD) args; \ - union { \ - name##_METHOD m_##name; \ - void* m_##name##_ptr; \ - }; \ - public: \ - virtual result name args \ - { \ - return m_##name args2; \ - } - -#define DEFINE_METHOD_LINKAGE0(result, linkage, name) \ - DEFINE_METHOD_LINKAGE_BASE(result, linkage, name, () , ()) - -#define DEFINE_METHOD_LINKAGE1(result, linkage, name, args) \ - DEFINE_METHOD_LINKAGE_BASE(result, linkage, name, args, (p1)) - -#define DEFINE_METHOD_LINKAGE2(result, linkage, name, args) \ - DEFINE_METHOD_LINKAGE_BASE(result, linkage, name, args, (p1, p2)) - -#define DEFINE_METHOD_LINKAGE3(result, linkage, name, args) \ - DEFINE_METHOD_LINKAGE_BASE(result, linkage, name, args, (p1, p2, p3)) - -#define DEFINE_METHOD_LINKAGE4(result, linkage, name, args) \ - DEFINE_METHOD_LINKAGE_BASE(result, linkage, name, args, (p1, p2, p3, p4)) - -#define DEFINE_METHOD_LINKAGE5(result, linkage, name, args) \ - DEFINE_METHOD_LINKAGE_BASE(result, linkage, name, args, (p1, p2, p3, p4, p5)) - -#define DEFINE_METHOD_LINKAGE6(result, linkage, name, args) \ - DEFINE_METHOD_LINKAGE_BASE(result, linkage, name, args, (p1, p2, p3, p4, p5, p6)) - -#define DEFINE_METHOD_LINKAGE7(result, linkage, name, args) \ - DEFINE_METHOD_LINKAGE_BASE(result, linkage, name, args, (p1, p2, p3, p4, p5, p6, p7)) - -#define DEFINE_METHOD_LINKAGE8(result, linkage, name, args) \ - DEFINE_METHOD_LINKAGE_BASE(result, linkage, name, args, (p1, p2, p3, p4, p5, p6, p7, p8)) - -#define DEFINE_METHOD_LINKAGE9(result, linkage, name, args) \ - DEFINE_METHOD_LINKAGE_BASE(result, linkage, name, args, (p1, p2, p3, p4, p5, p6, p7, p8, p9)) - -#define DEFINE_METHOD_LINKAGE10(result, linkage, name, args) \ - DEFINE_METHOD_LINKAGE_BASE(result, linkage, name, args, (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10)) - -#define DEFINE_METHOD_LINKAGE11(result, linkage, name, args) \ - DEFINE_METHOD_LINKAGE_BASE(result, linkage, name, args, (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11)) - -/////////////////////////////////////////////////////////// -// -// DEFINE_METHOD_FP -// -// Defines a function for an export from a dll as a fuction pointer. -// Use DEFINE_METHOD_FP for each function to be resolved. Functions -// defined like this are not listed by IntelliSence. -// -// result: Result of the function -// name: Name of the function -// args: Arguments of the function, enclosed in parentheses -// The parameter names can be anything -// -#define DEFINE_METHOD_FP(result, name, args) DEFINE_METHOD_LINKAGE_FP(result, __cdecl, name, args) - -/////////////////////////////////////////////////////////// -// -// DEFINE_METHODX -// -// Defines a function for an export from a dll. -// Use DEFINE_METHODX for each function to be resolved. -// where X is the number of parameter the function has. -// -// result: Result of the function -// name: Name of the function -// args: Arguments of the function, enclosed in parentheses -// The parameter names have to be renamed to px, where -// x is the number of the parameter -// -#define DEFINE_METHOD0(result, name) DEFINE_METHOD_LINKAGE0(result, __cdecl, name) -#define DEFINE_METHOD1(result, name, args) DEFINE_METHOD_LINKAGE1(result, __cdecl, name, args) -#define DEFINE_METHOD2(result, name, args) DEFINE_METHOD_LINKAGE2(result, __cdecl, name, args) -#define DEFINE_METHOD3(result, name, args) DEFINE_METHOD_LINKAGE3(result, __cdecl, name, args) -#define DEFINE_METHOD4(result, name, args) DEFINE_METHOD_LINKAGE4(result, __cdecl, name, args) -#define DEFINE_METHOD5(result, name, args) DEFINE_METHOD_LINKAGE5(result, __cdecl, name, args) -#define DEFINE_METHOD6(result, name, args) DEFINE_METHOD_LINKAGE6(result, __cdecl, name, args) -#define DEFINE_METHOD7(result, name, args) DEFINE_METHOD_LINKAGE7(result, __cdecl, name, args) -#define DEFINE_METHOD8(result, name, args) DEFINE_METHOD_LINKAGE8(result, __cdecl, name, args) -#define DEFINE_METHOD9(result, name, args) DEFINE_METHOD_LINKAGE9(result, __cdecl, name, args) -#define DEFINE_METHOD10(result, name, args) DEFINE_METHOD_LINKAGE10(result, __cdecl, name, args) -#define DEFINE_METHOD11(result, name, args) DEFINE_METHOD_LINKAGE11(result, __cdecl, name, args) - -/////////////////////////////////////////////////////////// -// -// DEFINE_FUNC_ALIGNED 0-X -// -// Defines a function for an export from a dll, wich -// require a aligned stack on function call -// Use DEFINE_FUNC_ALIGNED for each function to be resolved. -// -// result: Result of the function -// linkage: Calling convention of the function -// name: Name of the function -// args: Argument types of the function -// -// Actual function call will expand to something like this -// this will align the stack (esp) at the point of function -// entry as required by gcc compiled dlls, it is abit abfuscated -// to allow for different sized variables -// -// __int64 test(__int64 p1, char p2, char p3) -// { -// int o,s = ((sizeof(p1)+3)&~3)+((sizeof(p2)+3)&~3)+((sizeof(p3)+3)&~3); -// __asm mov [o],esp; -// __asm sub esp, [s]; -// __asm and esp, ~15; -// __asm add esp, [s] -// m_test(p1, p2, p3); //return value will still be correct aslong as we don't mess with it -// __asm mov esp,[o]; -// }; - -#define ALS(a) ((sizeof(a)+3)&~3) -#define DEFINE_FUNC_PART1(result, linkage, name, args) \ - private: \ - typedef result (linkage * name##_type)##args; \ - union { \ - name##_type m_##name; \ - void* m_##name##_ptr; \ - }; \ - public: \ - virtual result name##args - -#define DEFINE_FUNC_PART2(size) \ - { \ - int o,s = size; \ - __asm { \ - __asm mov [o], esp \ - __asm sub esp, [s] \ - __asm and esp, ~15 \ - __asm add esp, [s] \ - } - -#define DEFINE_FUNC_PART3(name,args) \ - m_##name##args; \ - __asm { \ - __asm mov esp,[o] \ - } \ - } - -#define DEFINE_FUNC_ALIGNED0(result, linkage, name) \ - DEFINE_FUNC_PART1(result, linkage, name, ()) \ - DEFINE_FUNC_PART2(0) \ - DEFINE_FUNC_PART3(name,()) - -#define DEFINE_FUNC_ALIGNED1(result, linkage, name, t1) \ - DEFINE_FUNC_PART1(result, linkage, name, (t1 p1)) \ - DEFINE_FUNC_PART2(ALS(p1)) \ - DEFINE_FUNC_PART3(name,(p1)) - -#define DEFINE_FUNC_ALIGNED2(result, linkage, name, t1, t2) \ - DEFINE_FUNC_PART1(result, linkage, name, (t1 p1, t2 p2)) \ - DEFINE_FUNC_PART2(ALS(p1)+ALS(p2)) \ - DEFINE_FUNC_PART3(name,(p1, p2)) - -#define DEFINE_FUNC_ALIGNED3(result, linkage, name, t1, t2, t3) \ - DEFINE_FUNC_PART1(result, linkage, name, (t1 p1, t2 p2, t3 p3)) \ - DEFINE_FUNC_PART2(ALS(p1)+ALS(p2)+ALS(p3)) \ - DEFINE_FUNC_PART3(name,(p1, p2, p3)) - -#define DEFINE_FUNC_ALIGNED4(result, linkage, name, t1, t2, t3, t4) \ - DEFINE_FUNC_PART1(result, linkage, name, (t1 p1, t2 p2, t3 p3, t4 p4)) \ - DEFINE_FUNC_PART2(ALS(p1)+ALS(p2)+ALS(p3)+ALS(p4)) \ - DEFINE_FUNC_PART3(name,(p1, p2, p3, p4)) - -#define DEFINE_FUNC_ALIGNED5(result, linkage, name, t1, t2, t3, t4, t5) \ - DEFINE_FUNC_PART1(result, linkage, name, (t1 p1, t2 p2, t3 p3, t4 p4, t5 p5)) \ - DEFINE_FUNC_PART2(ALS(p1)+ALS(p2)+ALS(p3)+ALS(p4)+ALS(p5)) \ - DEFINE_FUNC_PART3(name,(p1, p2, p3, p4, p5)) - -#define DEFINE_FUNC_ALIGNED6(result, linkage, name, t1, t2, t3, t4, t5, t6) \ - DEFINE_FUNC_PART1(result, linkage, name, (t1 p1, t2 p2, t3 p3, t4 p4, t5 p5, t6 p6)) \ - DEFINE_FUNC_PART2(ALS(p1)+ALS(p2)+ALS(p3)+ALS(p4)+ALS(p5)+ALS(p6)) \ - DEFINE_FUNC_PART3(name,(p1, p2, p3, p4, p5, p6)) - -#define DEFINE_FUNC_ALIGNED7(result, linkage, name, t1, t2, t3, t4, t5, t6, t7) \ - DEFINE_FUNC_PART1(result, linkage, name, (t1 p1, t2 p2, t3 p3, t4 p4, t5 p5, t6 p6, t7 p7)) \ - DEFINE_FUNC_PART2(ALS(p1)+ALS(p2)+ALS(p3)+ALS(p4)+ALS(p5)+ALS(p6)+ALS(p7)) \ - DEFINE_FUNC_PART3(name,(p1, p2, p3, p4, p5, p6, p7)) - -#define DEFINE_FUNC_ALIGNED8(result, linkage, name, t1, t2, t3, t4, t5, t6, t7, t8) \ - DEFINE_FUNC_PART1(result, linkage, name, (t1 p1, t2 p2, t3 p3, t4 p4, t5 p5, t6 p6, t7 p7, t8 p8)) \ - DEFINE_FUNC_PART2(ALS(p1)+ALS(p2)+ALS(p3)+ALS(p4)+ALS(p5)+ALS(p6)+ALS(p7)+ALS(p8)) \ - DEFINE_FUNC_PART3(name,(p1, p2, p3, p4, p5, p6, p7, p8)) - -#define DEFINE_FUNC_ALIGNED9(result, linkage, name, t1, t2, t3, t4, t5, t6, t7, t8, t9) \ - DEFINE_FUNC_PART1(result, linkage, name, (t1 p1, t2 p2, t3 p3, t4 p4, t5 p5, t6 p6, t7 p7, t8 p8, t9 p9)) \ - DEFINE_FUNC_PART2(ALS(p1)+ALS(p2)+ALS(p3)+ALS(p4)+ALS(p5)+ALS(p6)+ALS(p7)+ALS(p8)+ALS(p9)) \ - DEFINE_FUNC_PART3(name,(p1, p2, p3, p4, p5, p6, p7, p8, p9)) - -/////////////////////////////////////////////////////////// -// -// BEGIN_METHOD_RESOLVE/END_METHOD_RESOLVE -// -// Defines a method that resolves the exported functions -// defined with DEFINE_METHOD or DEFINE_METHOD_LINKAGE. -// There must be a RESOLVE_METHOD or RESOLVE_METHOD_RENAME -// for each DEFINE_METHOD or DEFINE_METHOD_LINKAGE within this -// block. This block must be followed by an END_METHOD_RESOLVE. -// -#define BEGIN_METHOD_RESOLVE() \ - protected: \ - virtual bool ResolveExports() \ - { \ - return ( - -#define END_METHOD_RESOLVE() \ - 1 \ - ); \ - } - -/////////////////////////////////////////////////////////// -// -// RESOLVE_METHOD -// -// Resolves a method from a dll -// -// method: Name of the method defined with DEFINE_METHOD -// or DEFINE_METHOD_LINKAGE -// -#define RESOLVE_METHOD(method) \ - m_dll->ResolveExport( #method , & m_##method##_ptr ) && - -#define RESOLVE_METHOD_FP(method) \ - m_dll->ResolveExport( #method , & method##_ptr ) && - -/////////////////////////////////////////////////////////// -// -// RESOLVE_METHOD_RENAME -// -// Resolves a method from a dll -// -// dllmethod: Name of the function exported from the dll -// method: Name of the method defined with DEFINE_METHOD -// or DEFINE_METHOD_LINKAGE -// -#define RESOLVE_METHOD_RENAME(dllmethod, method) \ - m_dll->ResolveExport( #dllmethod , & m_##method##_ptr ) && - -#define RESOLVE_METHOD_RENAME_FP(dllmethod, method) \ - m_dll->ResolveExport( #dllmethod , & method##_ptr ) && - - -//////////////////////////////////////////////////////////////////// -// -// Example declaration of a dll wrapper class -// -// 1. Define a class with pure virtual functions with all functions -// exported from the dll. This is needed to use the IntelliSence -// feature of the Visual Studio Editor. -// -// class DllExampleInterface -// { -// public: -// virtual void foo (unsigned int type, char* szTest)=0; -// virtual void bar (char* szTest, unsigned int type)=0; -// }; -// -// 2. Define a class, derived from DllDynamic and the previously defined -// interface class. Define the constructor of the class using the -// DECLARE_DLL_WRAPPER macro. Use the DEFINE_METHODX/DEFINE_METHOD_LINKAGEX -// macros to define the functions from the interface above, where X is number of -// parameters the function has. The function parameters -// have to be enclosed in parentheses. The parameter names have to be changed to px -// where x is the number on which position the parameter appears. -// Use the RESOLVE_METHOD/RESOLVE_METHOD_RENAME to do the actually resolve the functions -// from the dll when it's loaded. The RESOLVE_METHOD/RESOLVE_METHOD_RENAME have to -// be between the BEGIN_METHOD_RESOLVE/END_METHOD_RESOLVE block. -// -// class DllExample : public DllDynamic, DllExampleInterface -// { -// DECLARE_DLL_WRAPPER(DllExample, special://xbmcbin/system/Example.dll) -// LOAD_SYMBOLS() // add this if you want to load debug symbols for the dll -// DEFINE_METHOD2(void, foo, (int p1, char* p2)) -// DEFINE_METHOD_LINKAGE2(void, __stdcall, bar, (char* p1, int p2)) -// DEFINE_METHOD_FP(void, foobar, (int type, char* szTest)) // No need to define this function in the -// // interface class, as it's a function pointer. -// // But its not recognised by IntelliSence -// BEGIN_METHOD_RESOLVE() -// RESOLVE_METHOD(foo) -// RESOLVE_METHOD_RENAME("_bar@8", bar) -// RESOLVE_METHOD_FP(foobar) -// END_METHOD_RESOLVE() -// }; -// -// The above macros will expand to a class that will look like this -// -// class DllExample : public DllDynamic, DllExampleInterface -// { -// public: -// DllExample() : DllDynamic( "special://xbmcbin/system/Example.dll" ) {} -// protected: -// virtual bool LoadSymbols() { return true; } -// protected: -// typedef void (* foo_METHOD) ( int p1, char* p2 ); -// foo_METHOD m_foo; -// public: -// virtual void foo( int p1, char* p2 ) -// { -// return m_foo(p1, p2); -// } -// protected: -// typedef void (__stdcall * bar_METHOD) ( char* p1, int p2 ); -// bar_METHOD m_bar; -// public: -// virtual void bar( char* p1, int p2 ) -// { -// return m_bar(p1, p2); -// } -// protected: -// typedef void (* foobar_METHOD) (int type, char* szTest); -// public: -// foobar_METHOD foobar; -// protected: -// virtual bool ResolveExports() -// { -// return ( -// m_dll->ResolveExport( "foo", (void**)& m_foo ) && -// m_dll->ResolveExport( "_bar@8", (void**)& m_bar ) && -// m_dll->ResolveExport( "foobar" , (void**)& foobar ) && -// 1 -// ); -// } -// }; -// -// Usage of the class -// -// DllExample dll; -// dll.Load(); -// if (dll.IsLoaded()) -// { -// dll.foo(1, "bar"); -// dll.Unload(); -// } -// - -/////////////////////////////////////////////////////////// -// -// Baseclass for a Dynamically loaded dll -// use the above macros to create a dll wrapper -// -class DllDynamic -{ -public: - DllDynamic(); - DllDynamic(const CStdString& strDllName); - virtual ~DllDynamic(); - virtual bool Load(); - virtual void Unload(); - virtual bool IsLoaded() { return m_dll!=NULL; } - bool CanLoad(); - bool EnableDelayedUnload(bool bOnOff); - bool SetFile(const CStdString& strDllName); - -protected: - virtual bool ResolveExports()=0; - virtual bool LoadSymbols() { return false; } - bool m_DelayUnload; - void *m_dll; - CStdString m_strDllName; -}; diff --git a/Makefile b/Makefile index e91eec7..2ec366d 100644 --- a/Makefile +++ b/Makefile @@ -77,7 +77,6 @@ SRC= linux/XMemUtils.cpp \ utils/PCMRemap.cpp \ utils/RegExp.cpp \ BitstreamConverter.cpp \ - DynamicDll.cpp \ OMXThread.cpp \ OMXReader.cpp \ OMXStreamInfo.cpp \ diff --git a/OMXCore.cpp b/OMXCore.cpp index 9a4d86d..12d6513 100644 --- a/OMXCore.cpp +++ b/OMXCore.cpp @@ -19,7 +19,7 @@ */ #if (defined HAVE_CONFIG_H) && (!defined TARGET_WINDOWS) - #include "config.h" +#include "config.h" #elif defined(TARGET_WINDOWS) #include "system.h" #endif @@ -47,23 +47,23 @@ static void add_timespecs(struct timespec &time, long millisecs) { - long long nsec = time.tv_nsec + (long long)millisecs * 1000000; - while (nsec > 1000000000) - { - time.tv_sec += 1; - nsec -= 1000000000; - } - time.tv_nsec = nsec; + long long nsec = time.tv_nsec + (long long)millisecs * 1000000; + while (nsec > 1000000000) + { + time.tv_sec += 1; + nsec -= 1000000000; + } + time.tv_nsec = nsec; } COMXCoreTunel::COMXCoreTunel() { - m_src_component = NULL; - m_dst_component = NULL; - m_src_port = 0; - m_dst_port = 0; - m_tunnel_set = false; + m_src_component = NULL; + m_dst_component = NULL; + m_src_port = 0; + m_dst_port = 0; + m_tunnel_set = false; } COMXCoreTunel::~COMXCoreTunel() @@ -72,1767 +72,1730 @@ COMXCoreTunel::~COMXCoreTunel() void COMXCoreTunel::Initialize(COMXCoreComponent *src_component, unsigned int src_port, COMXCoreComponent *dst_component, unsigned int dst_port) { - m_src_component = src_component; - m_src_port = src_port; - m_dst_component = dst_component; - m_dst_port = dst_port; + m_src_component = src_component; + m_src_port = src_port; + m_dst_component = dst_component; + m_dst_port = dst_port; } OMX_ERRORTYPE COMXCoreTunel::Deestablish(bool noWait) { - if(!m_src_component || !m_dst_component || !IsInitialized()) - return OMX_ErrorUndefined; + if(!m_src_component || !m_dst_component || !IsInitialized()) + return OMX_ErrorUndefined; - OMX_ERRORTYPE omx_err = OMX_ErrorNone; + OMX_ERRORTYPE omx_err = OMX_ErrorNone; - if(m_src_component->GetComponent()) - { - omx_err = m_src_component->DisablePort(m_src_port, false); - if(omx_err != OMX_ErrorNone) + if(m_src_component->GetComponent()) { - CLog::Log(LOGERROR, "COMXCoreTunel::Deestablish - Error disable port %d on component %s omx_err(0x%08x)", - m_src_port, m_src_component->GetName().c_str(), (int)omx_err); + omx_err = m_src_component->DisablePort(m_src_port, false); + if(omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreTunel::Deestablish - Error disable port %d on component %s omx_err(0x%08x)", + m_src_port, m_src_component->GetName().c_str(), (int)omx_err); + } } - } - if(m_dst_component->GetComponent()) - { - omx_err = m_dst_component->DisablePort(m_dst_port, false); - if(omx_err != OMX_ErrorNone) + if(m_dst_component->GetComponent()) { - CLog::Log(LOGERROR, "COMXCoreTunel::Deestablish - Error disable port %d on component %s omx_err(0x%08x)", - m_dst_port, m_dst_component->GetName().c_str(), (int)omx_err); + omx_err = m_dst_component->DisablePort(m_dst_port, false); + if(omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreTunel::Deestablish - Error disable port %d on component %s omx_err(0x%08x)", + m_dst_port, m_dst_component->GetName().c_str(), (int)omx_err); + } } - } - if(m_src_component->GetComponent()) - { - omx_err = m_src_component->WaitForCommand(OMX_CommandPortDisable, m_src_port); - if(omx_err != OMX_ErrorNone) + if(m_src_component->GetComponent()) { - CLog::Log(LOGERROR, "COMXCoreTunel::Deestablish - Error WaitForCommand port %d on component %s omx_err(0x%08x)", - m_dst_port, m_src_component->GetName().c_str(), (int)omx_err); - return omx_err; + omx_err = m_src_component->WaitForCommand(OMX_CommandPortDisable, m_src_port); + if(omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreTunel::Deestablish - Error WaitForCommand port %d on component %s omx_err(0x%08x)", + m_dst_port, m_src_component->GetName().c_str(), (int)omx_err); + return omx_err; + } } - } - if(m_dst_component->GetComponent()) - { - omx_err = m_dst_component->WaitForCommand(OMX_CommandPortDisable, m_dst_port); - if(omx_err != OMX_ErrorNone) + if(m_dst_component->GetComponent()) { - CLog::Log(LOGERROR, "COMXCoreTunel::Deestablish - Error WaitForCommand port %d on component %s omx_err(0x%08x)", - m_dst_port, m_dst_component->GetName().c_str(), (int)omx_err); - return omx_err; + omx_err = m_dst_component->WaitForCommand(OMX_CommandPortDisable, m_dst_port); + if(omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreTunel::Deestablish - Error WaitForCommand port %d on component %s omx_err(0x%08x)", + m_dst_port, m_dst_component->GetName().c_str(), (int)omx_err); + return omx_err; + } } - } - if(m_src_component->GetComponent()) - { - omx_err = OMX_SetupTunnel(m_src_component->GetComponent(), m_src_port, NULL, 0); - if(omx_err != OMX_ErrorNone) + if(m_src_component->GetComponent()) { - CLog::Log(LOGERROR, "COMXCoreTunel::Deestablish - could not unset tunnel on comp src %s port %d omx_err(0x%08x)\n", - m_src_component->GetName().c_str(), m_src_port, (int)omx_err); + omx_err = OMX_SetupTunnel(m_src_component->GetComponent(), m_src_port, NULL, 0); + if(omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreTunel::Deestablish - could not unset tunnel on comp src %s port %d omx_err(0x%08x)\n", + m_src_component->GetName().c_str(), m_src_port, (int)omx_err); + } } - } - if(m_dst_component->GetComponent()) - { - omx_err = OMX_SetupTunnel(m_dst_component->GetComponent(), m_dst_port, NULL, 0); - if(omx_err != OMX_ErrorNone) + if(m_dst_component->GetComponent()) { - CLog::Log(LOGERROR, "COMXCoreTunel::Deestablish - could not unset tunnel on comp dst %s port %d omx_err(0x%08x)\n", - m_dst_component->GetName().c_str(), m_dst_port, (int)omx_err); + omx_err = OMX_SetupTunnel(m_dst_component->GetComponent(), m_dst_port, NULL, 0); + if(omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreTunel::Deestablish - could not unset tunnel on comp dst %s port %d omx_err(0x%08x)\n", + m_dst_component->GetName().c_str(), m_dst_port, (int)omx_err); + } } - } - m_tunnel_set = false; + m_tunnel_set = false; - return OMX_ErrorNone; + return OMX_ErrorNone; } OMX_ERRORTYPE COMXCoreTunel::Establish(bool enable_ports /* = true */, bool disable_ports /* = false */) { - OMX_ERRORTYPE omx_err = OMX_ErrorNone; - OMX_PARAM_U32TYPE param; - OMX_INIT_STRUCTURE(param); - - if(!m_src_component || !m_dst_component) - { - return OMX_ErrorUndefined; - } - - //TODO(truong): investigate why need change to Idle state? - // if(m_src_component->GetState() == OMX_StateLoaded) - // { - // omx_err = m_src_component->SetStateForComponent(OMX_StateIdle); - // if(omx_err != OMX_ErrorNone) - // { - // CLog::Log(LOGERROR, "COMXCoreTunel::Establish - Error setting state to idle %s omx_err(0x%08x)", - // m_src_component->GetName().c_str(), (int)omx_err); - // return omx_err; - // } - // } - - if(m_src_component->GetComponent() && disable_ports) - { - omx_err = m_src_component->DisablePort(m_src_port, false); - if(omx_err != OMX_ErrorNone) + OMX_ERRORTYPE omx_err = OMX_ErrorNone; + OMX_PARAM_U32TYPE param; + OMX_INIT_STRUCTURE(param); + + if(!m_src_component || !m_dst_component) { - CLog::Log(LOGERROR, "COMXCoreTunel::Establish - Error disable port %d on component %s omx_err(0x%08x)", - m_src_port, m_src_component->GetName().c_str(), (int)omx_err); + return OMX_ErrorUndefined; } - } - if(m_dst_component->GetComponent() && disable_ports) - { - omx_err = m_dst_component->DisablePort(m_dst_port, false); - if(omx_err != OMX_ErrorNone) + //TODO(truong): investigate why need change to Idle state? + // if(m_src_component->GetState() == OMX_StateLoaded) + // { + // omx_err = m_src_component->SetStateForComponent(OMX_StateIdle); + // if(omx_err != OMX_ErrorNone) + // { + // CLog::Log(LOGERROR, "COMXCoreTunel::Establish - Error setting state to idle %s omx_err(0x%08x)", + // m_src_component->GetName().c_str(), (int)omx_err); + // return omx_err; + // } + // } + + if(m_src_component->GetComponent() && disable_ports) { - CLog::Log(LOGERROR, "COMXCoreTunel::Establish - Error disable port %d on component %s omx_err(0x%08x)", - m_dst_port, m_dst_component->GetName().c_str(), (int)omx_err); + omx_err = m_src_component->DisablePort(m_src_port, false); + if(omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreTunel::Establish - Error disable port %d on component %s omx_err(0x%08x)", + m_src_port, m_src_component->GetName().c_str(), (int)omx_err); + } } - } - if(m_src_component->GetComponent() && disable_ports) - { - omx_err = m_src_component->WaitForCommand(OMX_CommandPortDisable, m_src_port); - if(omx_err != OMX_ErrorNone) + if(m_dst_component->GetComponent() && disable_ports) { - CLog::Log(LOGERROR, "COMXCoreTunel::Establish - Error WaitForCommand port %d on component %s omx_err(0x%08x)", - m_dst_port, m_src_component->GetName().c_str(), (int)omx_err); - return omx_err; + omx_err = m_dst_component->DisablePort(m_dst_port, false); + if(omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreTunel::Establish - Error disable port %d on component %s omx_err(0x%08x)", + m_dst_port, m_dst_component->GetName().c_str(), (int)omx_err); + } } - } - if(m_dst_component->GetComponent() && disable_ports) - { - omx_err = m_dst_component->WaitForCommand(OMX_CommandPortDisable, m_dst_port); - if(omx_err != OMX_ErrorNone) + if(m_src_component->GetComponent() && disable_ports) + { + omx_err = m_src_component->WaitForCommand(OMX_CommandPortDisable, m_src_port); + if(omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreTunel::Establish - Error WaitForCommand port %d on component %s omx_err(0x%08x)", + m_dst_port, m_src_component->GetName().c_str(), (int)omx_err); + return omx_err; + } + } + + if(m_dst_component->GetComponent() && disable_ports) { - CLog::Log(LOGERROR, "COMXCoreTunel::Establish - Error WaitForCommand port %d on component %s omx_err(0x%08x)", - m_dst_port, m_dst_component->GetName().c_str(), (int)omx_err); - return omx_err; + omx_err = m_dst_component->WaitForCommand(OMX_CommandPortDisable, m_dst_port); + if(omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreTunel::Establish - Error WaitForCommand port %d on component %s omx_err(0x%08x)", + m_dst_port, m_dst_component->GetName().c_str(), (int)omx_err); + return omx_err; + } } - } - if(m_src_component->GetComponent() && m_dst_component->GetComponent()) - { - omx_err = OMX_SetupTunnel(m_src_component->GetComponent(), m_src_port, m_dst_component->GetComponent(), m_dst_port); - if(omx_err != OMX_ErrorNone) + if(m_src_component->GetComponent() && m_dst_component->GetComponent()) { - CLog::Log(LOGERROR, "COMXCoreTunel::Establish - could not setup tunnel src %s port %d dst %s port %d omx_err(0x%08x)\n", - m_src_component->GetName().c_str(), m_src_port, m_dst_component->GetName().c_str(), m_dst_port, (int)omx_err); - return omx_err; - } - } - else - { - CLog::Log(LOGERROR, "COMXCoreTunel::Establish - could not setup tunnel\n"); - return OMX_ErrorUndefined; - } - - m_tunnel_set = true; - - if(m_src_component->GetComponent() && enable_ports) - { - omx_err = m_src_component->EnablePort(m_src_port, false); - if(omx_err != OMX_ErrorNone) + omx_err = OMX_SetupTunnel(m_src_component->GetComponent(), m_src_port, m_dst_component->GetComponent(), m_dst_port); + if(omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreTunel::Establish - could not setup tunnel src %s port %d dst %s port %d omx_err(0x%08x)\n", + m_src_component->GetName().c_str(), m_src_port, m_dst_component->GetName().c_str(), m_dst_port, (int)omx_err); + return omx_err; + } + } + else { - CLog::Log(LOGERROR, "COMXCoreTunel::Establish - Error enable port %d on component %s omx_err(0x%08x)", - m_src_port, m_src_component->GetName().c_str(), (int)omx_err); - return omx_err; + CLog::Log(LOGERROR, "COMXCoreTunel::Establish - could not setup tunnel\n"); + return OMX_ErrorUndefined; } - } - if(m_dst_component->GetComponent() && enable_ports) - { - omx_err = m_dst_component->EnablePort(m_dst_port, false); - if(omx_err != OMX_ErrorNone) + m_tunnel_set = true; + + if(m_src_component->GetComponent() && enable_ports) { - CLog::Log(LOGERROR, "COMXCoreTunel::Establish - Error enable port %d on component %s omx_err(0x%08x)", - m_dst_port, m_dst_component->GetName().c_str(), (int)omx_err); - return omx_err; + omx_err = m_src_component->EnablePort(m_src_port, false); + if(omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreTunel::Establish - Error enable port %d on component %s omx_err(0x%08x)", + m_src_port, m_src_component->GetName().c_str(), (int)omx_err); + return omx_err; + } } - } - if(m_dst_component->GetComponent() && enable_ports) - { - omx_err = m_dst_component->WaitForCommand(OMX_CommandPortEnable, m_dst_port); - if(omx_err != OMX_ErrorNone) + if(m_dst_component->GetComponent() && enable_ports) { - return omx_err; + omx_err = m_dst_component->EnablePort(m_dst_port, false); + if(omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreTunel::Establish - Error enable port %d on component %s omx_err(0x%08x)", + m_dst_port, m_dst_component->GetName().c_str(), (int)omx_err); + return omx_err; + } } - // if(m_dst_component->GetState() == OMX_StateLoaded) - // { - // omx_err = m_dst_component->SetStateForComponent(OMX_StateIdle); - // if(omx_err != OMX_ErrorNone) - // { - // CLog::Log(LOGERROR, "COMXCoreComponent::Establish - Error setting state to idle %s omx_err(0x%08x)", - // m_src_component->GetName().c_str(), (int)omx_err); - // return omx_err; - // } - // } - } + if(m_dst_component->GetComponent() && enable_ports) + { + omx_err = m_dst_component->WaitForCommand(OMX_CommandPortEnable, m_dst_port); + if(omx_err != OMX_ErrorNone) + { + return omx_err; + } - if(m_src_component->GetComponent() && enable_ports) - { - omx_err = m_src_component->WaitForCommand(OMX_CommandPortEnable, m_src_port); - if(omx_err != OMX_ErrorNone) + // if(m_dst_component->GetState() == OMX_StateLoaded) + // { + // omx_err = m_dst_component->SetStateForComponent(OMX_StateIdle); + // if(omx_err != OMX_ErrorNone) + // { + // CLog::Log(LOGERROR, "COMXCoreComponent::Establish - Error setting state to idle %s omx_err(0x%08x)", + // m_src_component->GetName().c_str(), (int)omx_err); + // return omx_err; + // } + // } + } + + if(m_src_component->GetComponent() && enable_ports) { - return omx_err; + omx_err = m_src_component->WaitForCommand(OMX_CommandPortEnable, m_src_port); + if(omx_err != OMX_ErrorNone) + { + return omx_err; + } } - } - return OMX_ErrorNone; + return OMX_ErrorNone; } //////////////////////////////////////////////////////////////////////////////////////////// COMXCoreComponent::COMXCoreComponent() { - m_input_port = 0; - m_output_port = 0; - m_handle = NULL; + m_input_port = 0; + m_output_port = 0; + m_handle = NULL; - m_input_alignment = 0; - m_input_buffer_size = 0; - m_input_buffer_count = 0; + m_input_alignment = 0; + m_input_buffer_size = 0; + m_input_buffer_count = 0; - m_output_alignment = 0; - m_output_buffer_size = 0; - m_output_buffer_count = 0; - m_flush_input = false; - m_flush_output = false; - m_resource_error = false; + m_output_alignment = 0; + m_output_buffer_size = 0; + m_output_buffer_count = 0; + m_flush_input = false; + m_flush_output = false; + m_resource_error = false; - m_eos = false; + m_eos = false; - m_exit = false; + m_exit = false; - m_omx_input_use_buffers = false; - m_omx_output_use_buffers = false; + m_omx_input_use_buffers = false; + m_omx_output_use_buffers = false; - m_omx_events.clear(); - m_ignore_error = OMX_ErrorNone; + m_omx_events.clear(); + m_ignore_error = OMX_ErrorNone; - pthread_mutex_init(&m_omx_input_mutex, NULL); - pthread_mutex_init(&m_omx_output_mutex, NULL); - pthread_mutex_init(&m_omx_event_mutex, NULL); - pthread_mutex_init(&m_omx_eos_mutex, NULL); - pthread_cond_init(&m_input_buffer_cond, NULL); - pthread_cond_init(&m_output_buffer_cond, NULL); - pthread_cond_init(&m_omx_event_cond, NULL); + pthread_mutex_init(&m_omx_input_mutex, NULL); + pthread_mutex_init(&m_omx_output_mutex, NULL); + pthread_mutex_init(&m_omx_event_mutex, NULL); + pthread_mutex_init(&m_omx_eos_mutex, NULL); + pthread_cond_init(&m_input_buffer_cond, NULL); + pthread_cond_init(&m_output_buffer_cond, NULL); + pthread_cond_init(&m_omx_event_cond, NULL); } COMXCoreComponent::~COMXCoreComponent() { - Deinitialize(); - - pthread_mutex_destroy(&m_omx_input_mutex); - pthread_mutex_destroy(&m_omx_output_mutex); - pthread_mutex_destroy(&m_omx_event_mutex); - pthread_mutex_destroy(&m_omx_eos_mutex); - pthread_cond_destroy(&m_input_buffer_cond); - pthread_cond_destroy(&m_output_buffer_cond); - pthread_cond_destroy(&m_omx_event_cond); + Deinitialize(); + + pthread_mutex_destroy(&m_omx_input_mutex); + pthread_mutex_destroy(&m_omx_output_mutex); + pthread_mutex_destroy(&m_omx_event_mutex); + pthread_mutex_destroy(&m_omx_eos_mutex); + pthread_cond_destroy(&m_input_buffer_cond); + pthread_cond_destroy(&m_output_buffer_cond); + pthread_cond_destroy(&m_omx_event_cond); } void COMXCoreComponent::TransitionToStateLoaded() { - if(!m_handle) - return; + if(!m_handle) + return; - if(GetState() != OMX_StateLoaded && GetState() != OMX_StateIdle) - SetStateForComponent(OMX_StateIdle); + if(GetState() != OMX_StateLoaded && GetState() != OMX_StateIdle) + SetStateForComponent(OMX_StateIdle); - if(GetState() != OMX_StateLoaded) - SetStateForComponent(OMX_StateLoaded); + if(GetState() != OMX_StateLoaded) + SetStateForComponent(OMX_StateLoaded); } OMX_ERRORTYPE COMXCoreComponent::EmptyThisBuffer(OMX_BUFFERHEADERTYPE *omx_buffer) { - OMX_ERRORTYPE omx_err = OMX_ErrorNone; - - #if defined(OMX_DEBUG_EVENTHANDLER) - CLog::Log(LOGDEBUG, "COMXCoreComponent::EmptyThisBuffer component(%s) %p\n", m_componentName.c_str(), omx_buffer); - #endif - if(!m_handle || !omx_buffer) - return OMX_ErrorUndefined; - - omx_err = OMX_EmptyThisBuffer(m_handle, omx_buffer); - if (omx_err != OMX_ErrorNone) - { - CLog::Log(LOGERROR, "COMXCoreComponent::EmptyThisBuffer component(%s) - failed with result(0x%x)\n", - m_componentName.c_str(), omx_err); - } - - return omx_err; + OMX_ERRORTYPE omx_err = OMX_ErrorNone; + +#if defined(OMX_DEBUG_EVENTHANDLER) + CLog::Log(LOGDEBUG, "COMXCoreComponent::EmptyThisBuffer component(%s) %p\n", m_componentName.c_str(), omx_buffer); +#endif + if(!m_handle || !omx_buffer) + return OMX_ErrorUndefined; + + omx_err = OMX_EmptyThisBuffer(m_handle, omx_buffer); + if (omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreComponent::EmptyThisBuffer component(%s) - failed with result(0x%x)\n", + m_componentName.c_str(), omx_err); + } + + return omx_err; } OMX_ERRORTYPE COMXCoreComponent::FillThisBuffer(OMX_BUFFERHEADERTYPE *omx_buffer) { - OMX_ERRORTYPE omx_err = OMX_ErrorNone; - - #if defined(OMX_DEBUG_EVENTHANDLER) - CLog::Log(LOGDEBUG, "COMXCoreComponent::FillThisBuffer component(%s) %p\n", m_componentName.c_str(), omx_buffer); - #endif - if(!m_handle || !omx_buffer) - return OMX_ErrorUndefined; - - omx_err = OMX_FillThisBuffer(m_handle, omx_buffer); - if (omx_err != OMX_ErrorNone) - { - CLog::Log(LOGERROR, "COMXCoreComponent::FillThisBuffer component(%s) - failed with result(0x%x)\n", - m_componentName.c_str(), omx_err); - } - - return omx_err; + OMX_ERRORTYPE omx_err = OMX_ErrorNone; + +#if defined(OMX_DEBUG_EVENTHANDLER) + CLog::Log(LOGDEBUG, "COMXCoreComponent::FillThisBuffer component(%s) %p\n", m_componentName.c_str(), omx_buffer); +#endif + if(!m_handle || !omx_buffer) + return OMX_ErrorUndefined; + + omx_err = OMX_FillThisBuffer(m_handle, omx_buffer); + if (omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreComponent::FillThisBuffer component(%s) - failed with result(0x%x)\n", + m_componentName.c_str(), omx_err); + } + + return omx_err; } OMX_ERRORTYPE COMXCoreComponent::FreeOutputBuffer(OMX_BUFFERHEADERTYPE *omx_buffer) { - OMX_ERRORTYPE omx_err = OMX_ErrorNone; + OMX_ERRORTYPE omx_err = OMX_ErrorNone; - if(!m_handle || !omx_buffer) - return OMX_ErrorUndefined; + if(!m_handle || !omx_buffer) + return OMX_ErrorUndefined; - omx_err = OMX_FreeBuffer(m_handle, m_output_port, omx_buffer); - if (omx_err != OMX_ErrorNone) - { - CLog::Log(LOGERROR, "COMXCoreComponent::FreeOutputBuffer component(%s) - failed with result(0x%x)\n", - m_componentName.c_str(), omx_err); - } + omx_err = OMX_FreeBuffer(m_handle, m_output_port, omx_buffer); + if (omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreComponent::FreeOutputBuffer component(%s) - failed with result(0x%x)\n", + m_componentName.c_str(), omx_err); + } - return omx_err; + return omx_err; } void COMXCoreComponent::FlushAll() { - FlushInput(); - FlushOutput(); + FlushInput(); + FlushOutput(); } void COMXCoreComponent::FlushInput() { - if(!m_handle || m_resource_error) - return; - - OMX_ERRORTYPE omx_err = OMX_ErrorNone; - - omx_err = OMX_SendCommand(m_handle, OMX_CommandFlush, m_input_port, NULL); - - if(omx_err != OMX_ErrorNone) - { - CLog::Log(LOGERROR, "COMXCoreComponent::FlushInput - Error on component %s omx_err(0x%08x)", - m_componentName.c_str(), (int)omx_err); - } - omx_err = WaitForCommand(OMX_CommandFlush, m_input_port); - if(omx_err != OMX_ErrorNone) - { - CLog::Log(LOGERROR, "COMXCoreComponent::FlushInput - %s WaitForCommand omx_err(0x%08x)", - m_componentName.c_str(), (int)omx_err); - } + if(!m_handle || m_resource_error) + return; + + OMX_ERRORTYPE omx_err = OMX_ErrorNone; + + omx_err = OMX_SendCommand(m_handle, OMX_CommandFlush, m_input_port, NULL); + + if(omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreComponent::FlushInput - Error on component %s omx_err(0x%08x)", + m_componentName.c_str(), (int)omx_err); + } + omx_err = WaitForCommand(OMX_CommandFlush, m_input_port); + if(omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreComponent::FlushInput - %s WaitForCommand omx_err(0x%08x)", + m_componentName.c_str(), (int)omx_err); + } } void COMXCoreComponent::FlushOutput() { - if(!m_handle || m_resource_error) - return; - - OMX_ERRORTYPE omx_err = OMX_ErrorNone; - - omx_err = OMX_SendCommand(m_handle, OMX_CommandFlush, m_output_port, NULL); - - if(omx_err != OMX_ErrorNone) - { - CLog::Log(LOGERROR, "COMXCoreComponent::FlushOutput - Error on component %s omx_err(0x%08x)", - m_componentName.c_str(), (int)omx_err); - } - omx_err = WaitForCommand(OMX_CommandFlush, m_output_port); - if(omx_err != OMX_ErrorNone) - { - CLog::Log(LOGERROR, "COMXCoreComponent::FlushOutput - %s WaitForCommand omx_err(0x%08x)", - m_componentName.c_str(), (int)omx_err); - } + if(!m_handle || m_resource_error) + return; + + OMX_ERRORTYPE omx_err = OMX_ErrorNone; + + omx_err = OMX_SendCommand(m_handle, OMX_CommandFlush, m_output_port, NULL); + + if(omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreComponent::FlushOutput - Error on component %s omx_err(0x%08x)", + m_componentName.c_str(), (int)omx_err); + } + omx_err = WaitForCommand(OMX_CommandFlush, m_output_port); + if(omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreComponent::FlushOutput - %s WaitForCommand omx_err(0x%08x)", + m_componentName.c_str(), (int)omx_err); + } } // timeout in milliseconds OMX_BUFFERHEADERTYPE *COMXCoreComponent::GetInputBuffer(long timeout /*=200*/) { - OMX_BUFFERHEADERTYPE *omx_input_buffer = NULL; - - if(!m_handle) - return NULL; - - pthread_mutex_lock(&m_omx_input_mutex); - struct timespec endtime; - clock_gettime(CLOCK_REALTIME, &endtime); - add_timespecs(endtime, timeout); - while (!m_flush_input) - { - if (m_resource_error) - break; - if(!m_omx_input_avaliable.empty()) - { - omx_input_buffer = m_omx_input_avaliable.front(); - m_omx_input_avaliable.pop(); - break; - } - - int retcode = pthread_cond_timedwait(&m_input_buffer_cond, &m_omx_input_mutex, &endtime); - if (retcode != 0) { - if (timeout != 0) - CLog::Log(LOGERROR, "COMXCoreComponent::GetInputBuffer %s wait event timeout\n", m_componentName.c_str()); - break; - } - } - pthread_mutex_unlock(&m_omx_input_mutex); - return omx_input_buffer; + OMX_BUFFERHEADERTYPE *omx_input_buffer = NULL; + + if(!m_handle) + return NULL; + + pthread_mutex_lock(&m_omx_input_mutex); + struct timespec endtime; + clock_gettime(CLOCK_REALTIME, &endtime); + add_timespecs(endtime, timeout); + while (!m_flush_input) + { + if (m_resource_error) + break; + if(!m_omx_input_avaliable.empty()) + { + omx_input_buffer = m_omx_input_avaliable.front(); + m_omx_input_avaliable.pop(); + break; + } + + int retcode = pthread_cond_timedwait(&m_input_buffer_cond, &m_omx_input_mutex, &endtime); + if (retcode != 0) { + if (timeout != 0) + CLog::Log(LOGERROR, "COMXCoreComponent::GetInputBuffer %s wait event timeout\n", m_componentName.c_str()); + break; + } + } + pthread_mutex_unlock(&m_omx_input_mutex); + return omx_input_buffer; } OMX_BUFFERHEADERTYPE *COMXCoreComponent::GetOutputBuffer(long timeout /*=200*/) { - OMX_BUFFERHEADERTYPE *omx_output_buffer = NULL; - if(!m_handle) - return NULL; - - pthread_mutex_lock(&m_omx_output_mutex); - struct timespec endtime; - clock_gettime(CLOCK_REALTIME, &endtime); - add_timespecs(endtime, timeout); - while (!m_flush_output) - { - if (m_resource_error) - break; - if(!m_omx_output_available.empty()) - { - omx_output_buffer = m_omx_output_available.front(); - m_omx_output_available.pop(); - break; - } - - int retcode = pthread_cond_timedwait(&m_output_buffer_cond, &m_omx_output_mutex, &endtime); - if (retcode != 0) { - if (timeout != 0) - CLog::Log(LOGERROR, "COMXCoreComponent::GetOutputBuffer %s wait event timeout\n", m_componentName.c_str()); - break; - } - } - pthread_mutex_unlock(&m_omx_output_mutex); - - return omx_output_buffer; + OMX_BUFFERHEADERTYPE *omx_output_buffer = NULL; + if(!m_handle) + return NULL; + + pthread_mutex_lock(&m_omx_output_mutex); + struct timespec endtime; + clock_gettime(CLOCK_REALTIME, &endtime); + add_timespecs(endtime, timeout); + while (!m_flush_output) + { + if (m_resource_error) + break; + if(!m_omx_output_available.empty()) + { + omx_output_buffer = m_omx_output_available.front(); + m_omx_output_available.pop(); + break; + } + + int retcode = pthread_cond_timedwait(&m_output_buffer_cond, &m_omx_output_mutex, &endtime); + if (retcode != 0) { + if (timeout != 0) + CLog::Log(LOGERROR, "COMXCoreComponent::GetOutputBuffer %s wait event timeout\n", m_componentName.c_str()); + break; + } + } + pthread_mutex_unlock(&m_omx_output_mutex); + + return omx_output_buffer; } OMX_ERRORTYPE COMXCoreComponent::WaitForInputDone(long timeout /*=200*/) { - OMX_ERRORTYPE omx_err = OMX_ErrorNone; - - pthread_mutex_lock(&m_omx_input_mutex); - struct timespec endtime; - clock_gettime(CLOCK_REALTIME, &endtime); - add_timespecs(endtime, timeout); - while (m_input_buffer_count != m_omx_input_avaliable.size()) - { - if (m_resource_error) - break; - int retcode = pthread_cond_timedwait(&m_input_buffer_cond, &m_omx_input_mutex, &endtime); - if (retcode != 0) { - if (timeout != 0) - CLog::Log(LOGERROR, "COMXCoreComponent::WaitForInputDone %s wait event timeout\n", m_componentName.c_str()); - omx_err = OMX_ErrorTimeout; - break; - } - } - pthread_mutex_unlock(&m_omx_input_mutex); - return omx_err; + OMX_ERRORTYPE omx_err = OMX_ErrorNone; + + pthread_mutex_lock(&m_omx_input_mutex); + struct timespec endtime; + clock_gettime(CLOCK_REALTIME, &endtime); + add_timespecs(endtime, timeout); + while (m_input_buffer_count != m_omx_input_avaliable.size()) + { + if (m_resource_error) + break; + int retcode = pthread_cond_timedwait(&m_input_buffer_cond, &m_omx_input_mutex, &endtime); + if (retcode != 0) { + if (timeout != 0) + CLog::Log(LOGERROR, "COMXCoreComponent::WaitForInputDone %s wait event timeout\n", m_componentName.c_str()); + omx_err = OMX_ErrorTimeout; + break; + } + } + pthread_mutex_unlock(&m_omx_input_mutex); + return omx_err; } OMX_ERRORTYPE COMXCoreComponent::WaitForOutputDone(long timeout /*=200*/) { - OMX_ERRORTYPE omx_err = OMX_ErrorNone; - - pthread_mutex_lock(&m_omx_output_mutex); - struct timespec endtime; - clock_gettime(CLOCK_REALTIME, &endtime); - add_timespecs(endtime, timeout); - while (m_output_buffer_count != m_omx_output_available.size()) - { - if (m_resource_error) - break; - int retcode = pthread_cond_timedwait(&m_output_buffer_cond, &m_omx_output_mutex, &endtime); - if (retcode != 0) { - if (timeout != 0) - CLog::Log(LOGERROR, "COMXCoreComponent::WaitForOutputDone %s wait event timeout\n", m_componentName.c_str()); - omx_err = OMX_ErrorTimeout; - break; - } - } - pthread_mutex_unlock(&m_omx_output_mutex); - return omx_err; + OMX_ERRORTYPE omx_err = OMX_ErrorNone; + + pthread_mutex_lock(&m_omx_output_mutex); + struct timespec endtime; + clock_gettime(CLOCK_REALTIME, &endtime); + add_timespecs(endtime, timeout); + while (m_output_buffer_count != m_omx_output_available.size()) + { + if (m_resource_error) + break; + int retcode = pthread_cond_timedwait(&m_output_buffer_cond, &m_omx_output_mutex, &endtime); + if (retcode != 0) { + if (timeout != 0) + CLog::Log(LOGERROR, "COMXCoreComponent::WaitForOutputDone %s wait event timeout\n", m_componentName.c_str()); + omx_err = OMX_ErrorTimeout; + break; + } + } + pthread_mutex_unlock(&m_omx_output_mutex); + return omx_err; } OMX_ERRORTYPE COMXCoreComponent::AllocInputBuffers(bool use_buffers /* = false **/) { - OMX_ERRORTYPE omx_err = OMX_ErrorNone; - - m_omx_input_use_buffers = use_buffers; + OMX_ERRORTYPE omx_err = OMX_ErrorNone; - if(!m_handle) - return OMX_ErrorUndefined; + m_omx_input_use_buffers = use_buffers; - OMX_PARAM_PORTDEFINITIONTYPE portFormat; - OMX_INIT_STRUCTURE(portFormat); - portFormat.nPortIndex = m_input_port; + if(!m_handle) + return OMX_ErrorUndefined; - omx_err = OMX_GetParameter(m_handle, OMX_IndexParamPortDefinition, &portFormat); - if(omx_err != OMX_ErrorNone) - return omx_err; + OMX_PARAM_PORTDEFINITIONTYPE portFormat; + OMX_INIT_STRUCTURE(portFormat); + portFormat.nPortIndex = m_input_port; - if(GetState() != OMX_StateIdle) - { - if(GetState() != OMX_StateLoaded) - SetStateForComponent(OMX_StateLoaded); + omx_err = OMX_GetParameter(m_handle, OMX_IndexParamPortDefinition, &portFormat); + if(omx_err != OMX_ErrorNone) + return omx_err; - SetStateForComponent(OMX_StateIdle); - } + if(GetState() != OMX_StateIdle) + { + if(GetState() != OMX_StateLoaded) + SetStateForComponent(OMX_StateLoaded); - omx_err = EnablePort(m_input_port, false); - if(omx_err != OMX_ErrorNone) - return omx_err; + SetStateForComponent(OMX_StateIdle); + } - m_input_alignment = portFormat.nBufferAlignment; - m_input_buffer_count = portFormat.nBufferCountActual; - m_input_buffer_size = portFormat.nBufferSize; + omx_err = EnablePort(m_input_port, false); + if(omx_err != OMX_ErrorNone) + return omx_err; - CLog::Log(LOGDEBUG, "COMXCoreComponent::AllocInputBuffers component(%s) - port(%d), nBufferCountMin(%u), nBufferCountActual(%u), nBufferSize(%u), nBufferAlignmen(%u)\n", - m_componentName.c_str(), GetInputPort(), portFormat.nBufferCountMin, - portFormat.nBufferCountActual, portFormat.nBufferSize, portFormat.nBufferAlignment); + m_input_alignment = portFormat.nBufferAlignment; + m_input_buffer_count = portFormat.nBufferCountActual; + m_input_buffer_size = portFormat.nBufferSize; - for (size_t i = 0; i < portFormat.nBufferCountActual; i++) - { - OMX_BUFFERHEADERTYPE *buffer = NULL; - OMX_U8* data = NULL; + CLog::Log(LOGDEBUG, "COMXCoreComponent::AllocInputBuffers component(%s) - port(%d), nBufferCountMin(%u), nBufferCountActual(%u), nBufferSize(%u), nBufferAlignmen(%u)\n", + m_componentName.c_str(), GetInputPort(), portFormat.nBufferCountMin, + portFormat.nBufferCountActual, portFormat.nBufferSize, portFormat.nBufferAlignment); - if(m_omx_input_use_buffers) - { - data = (OMX_U8*)_aligned_malloc(portFormat.nBufferSize, m_input_alignment); - omx_err = OMX_UseBuffer(m_handle, &buffer, m_input_port, NULL, portFormat.nBufferSize, data); - } - else + for (size_t i = 0; i < portFormat.nBufferCountActual; i++) { - omx_err = OMX_AllocateBuffer(m_handle, &buffer, m_input_port, NULL, portFormat.nBufferSize); - } - if(omx_err != OMX_ErrorNone) - { - CLog::Log(LOGERROR, "COMXCoreComponent::AllocInputBuffers component(%s) - OMX_UseBuffer failed with omx_err(0x%x)\n", - m_componentName.c_str(), omx_err); + OMX_BUFFERHEADERTYPE *buffer = NULL; + OMX_U8* data = NULL; + + if(m_omx_input_use_buffers) + { + data = (OMX_U8*)_aligned_malloc(portFormat.nBufferSize, m_input_alignment); + omx_err = OMX_UseBuffer(m_handle, &buffer, m_input_port, NULL, portFormat.nBufferSize, data); + } + else + { + omx_err = OMX_AllocateBuffer(m_handle, &buffer, m_input_port, NULL, portFormat.nBufferSize); + } + if(omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreComponent::AllocInputBuffers component(%s) - OMX_UseBuffer failed with omx_err(0x%x)\n", + m_componentName.c_str(), omx_err); - if(m_omx_input_use_buffers && data) - _aligned_free(data); + if(m_omx_input_use_buffers && data) + _aligned_free(data); - return omx_err; + return omx_err; + } + buffer->nInputPortIndex = m_input_port; + buffer->nFilledLen = 0; + buffer->nOffset = 0; + buffer->pAppPrivate = (void*)i; + m_omx_input_buffers.push_back(buffer); + m_omx_input_avaliable.push(buffer); } - buffer->nInputPortIndex = m_input_port; - buffer->nFilledLen = 0; - buffer->nOffset = 0; - buffer->pAppPrivate = (void*)i; - m_omx_input_buffers.push_back(buffer); - m_omx_input_avaliable.push(buffer); - } - omx_err = WaitForCommand(OMX_CommandPortEnable, m_input_port); - if(omx_err != OMX_ErrorNone) - { - CLog::Log(LOGERROR, "COMXCoreComponent::AllocInputBuffers WaitForCommand:OMX_CommandPortEnable failed on %s omx_err(0x%08x)\n", m_componentName.c_str(), omx_err); - return omx_err; - } + omx_err = WaitForCommand(OMX_CommandPortEnable, m_input_port); + if(omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreComponent::AllocInputBuffers WaitForCommand:OMX_CommandPortEnable failed on %s omx_err(0x%08x)\n", m_componentName.c_str(), omx_err); + return omx_err; + } - m_flush_input = false; + m_flush_input = false; - return omx_err; + return omx_err; } OMX_ERRORTYPE COMXCoreComponent::AllocOutputBuffers(bool use_buffers /* = false */) { - OMX_ERRORTYPE omx_err = OMX_ErrorNone; - - if(!m_handle) - return OMX_ErrorUndefined; + OMX_ERRORTYPE omx_err = OMX_ErrorNone; - m_omx_output_use_buffers = use_buffers; + if(!m_handle) + return OMX_ErrorUndefined; - OMX_PARAM_PORTDEFINITIONTYPE portFormat; - OMX_INIT_STRUCTURE(portFormat); - portFormat.nPortIndex = m_output_port; + m_omx_output_use_buffers = use_buffers; - omx_err = OMX_GetParameter(m_handle, OMX_IndexParamPortDefinition, &portFormat); - if(omx_err != OMX_ErrorNone) - return omx_err; + OMX_PARAM_PORTDEFINITIONTYPE portFormat; + OMX_INIT_STRUCTURE(portFormat); + portFormat.nPortIndex = m_output_port; - if(GetState() != OMX_StateIdle) - { - if(GetState() != OMX_StateLoaded) - SetStateForComponent(OMX_StateLoaded); + omx_err = OMX_GetParameter(m_handle, OMX_IndexParamPortDefinition, &portFormat); + if(omx_err != OMX_ErrorNone) + return omx_err; - SetStateForComponent(OMX_StateIdle); - } + if(GetState() != OMX_StateIdle) + { + if(GetState() != OMX_StateLoaded) + SetStateForComponent(OMX_StateLoaded); - omx_err = EnablePort(m_output_port, false); - if(omx_err != OMX_ErrorNone) - return omx_err; + SetStateForComponent(OMX_StateIdle); + } - m_output_alignment = portFormat.nBufferAlignment; - m_output_buffer_count = portFormat.nBufferCountActual; - m_output_buffer_size = portFormat.nBufferSize; + omx_err = EnablePort(m_output_port, false); + if(omx_err != OMX_ErrorNone) + return omx_err; - CLog::Log(LOGDEBUG, "COMXCoreComponent::AllocOutputBuffers component(%s) - port(%d), nBufferCountMin(%u), nBufferCountActual(%u), nBufferSize(%u) nBufferAlignmen(%u)\n", - m_componentName.c_str(), m_output_port, portFormat.nBufferCountMin, - portFormat.nBufferCountActual, portFormat.nBufferSize, portFormat.nBufferAlignment); + m_output_alignment = portFormat.nBufferAlignment; + m_output_buffer_count = portFormat.nBufferCountActual; + m_output_buffer_size = portFormat.nBufferSize; - for (size_t i = 0; i < portFormat.nBufferCountActual; i++) - { - OMX_BUFFERHEADERTYPE *buffer = NULL; - OMX_U8* data = NULL; + CLog::Log(LOGDEBUG, "COMXCoreComponent::AllocOutputBuffers component(%s) - port(%d), nBufferCountMin(%u), nBufferCountActual(%u), nBufferSize(%u) nBufferAlignmen(%u)\n", + m_componentName.c_str(), m_output_port, portFormat.nBufferCountMin, + portFormat.nBufferCountActual, portFormat.nBufferSize, portFormat.nBufferAlignment); - if(m_omx_output_use_buffers) - { - data = (OMX_U8*)_aligned_malloc(portFormat.nBufferSize, m_output_alignment); - omx_err = OMX_UseBuffer(m_handle, &buffer, m_output_port, NULL, portFormat.nBufferSize, data); - } - else - { - omx_err = OMX_AllocateBuffer(m_handle, &buffer, m_output_port, NULL, portFormat.nBufferSize); - } - if(omx_err != OMX_ErrorNone) + for (size_t i = 0; i < portFormat.nBufferCountActual; i++) { - CLog::Log(LOGERROR, "COMXCoreComponent::AllocOutputBuffers component(%s) - OMX_UseBuffer failed with omx_err(0x%x)\n", - m_componentName.c_str(), omx_err); + OMX_BUFFERHEADERTYPE *buffer = NULL; + OMX_U8* data = NULL; + + if(m_omx_output_use_buffers) + { + data = (OMX_U8*)_aligned_malloc(portFormat.nBufferSize, m_output_alignment); + omx_err = OMX_UseBuffer(m_handle, &buffer, m_output_port, NULL, portFormat.nBufferSize, data); + } + else + { + omx_err = OMX_AllocateBuffer(m_handle, &buffer, m_output_port, NULL, portFormat.nBufferSize); + } + if(omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreComponent::AllocOutputBuffers component(%s) - OMX_UseBuffer failed with omx_err(0x%x)\n", + m_componentName.c_str(), omx_err); - if(m_omx_output_use_buffers && data) - _aligned_free(data); + if(m_omx_output_use_buffers && data) + _aligned_free(data); - return omx_err; + return omx_err; + } + buffer->nOutputPortIndex = m_output_port; + buffer->nFilledLen = 0; + buffer->nOffset = 0; + buffer->pAppPrivate = (void*)i; + m_omx_output_buffers.push_back(buffer); + m_omx_output_available.push(buffer); } - buffer->nOutputPortIndex = m_output_port; - buffer->nFilledLen = 0; - buffer->nOffset = 0; - buffer->pAppPrivate = (void*)i; - m_omx_output_buffers.push_back(buffer); - m_omx_output_available.push(buffer); - } - omx_err = WaitForCommand(OMX_CommandPortEnable, m_output_port); - if(omx_err != OMX_ErrorNone) - { - CLog::Log(LOGERROR, "COMXCoreComponent::AllocOutputBuffers WaitForCommand:OMX_CommandPortEnable failed on %s omx_err(0x%08x)\n", m_componentName.c_str(), omx_err); - return omx_err; - } + omx_err = WaitForCommand(OMX_CommandPortEnable, m_output_port); + if(omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreComponent::AllocOutputBuffers WaitForCommand:OMX_CommandPortEnable failed on %s omx_err(0x%08x)\n", m_componentName.c_str(), omx_err); + return omx_err; + } - m_flush_output = false; + m_flush_output = false; - return omx_err; + return omx_err; } OMX_ERRORTYPE COMXCoreComponent::FreeInputBuffers() { - OMX_ERRORTYPE omx_err = OMX_ErrorNone; + OMX_ERRORTYPE omx_err = OMX_ErrorNone; - if(!m_handle) - return OMX_ErrorUndefined; + if(!m_handle) + return OMX_ErrorUndefined; - if(m_omx_input_buffers.empty()) - return OMX_ErrorNone; + if(m_omx_input_buffers.empty()) + return OMX_ErrorNone; + + m_flush_input = true; - m_flush_input = true; + omx_err = DisablePort(m_input_port, false); - omx_err = DisablePort(m_input_port, false); + pthread_mutex_lock(&m_omx_input_mutex); + pthread_cond_broadcast(&m_input_buffer_cond); - pthread_mutex_lock(&m_omx_input_mutex); - pthread_cond_broadcast(&m_input_buffer_cond); + for (size_t i = 0; i < m_omx_input_buffers.size(); i++) + { + uint8_t *buf = m_omx_input_buffers[i]->pBuffer; - for (size_t i = 0; i < m_omx_input_buffers.size(); i++) - { - uint8_t *buf = m_omx_input_buffers[i]->pBuffer; + omx_err = OMX_FreeBuffer(m_handle, m_input_port, m_omx_input_buffers[i]); - omx_err = OMX_FreeBuffer(m_handle, m_input_port, m_omx_input_buffers[i]); + if(m_omx_input_use_buffers && buf) + _aligned_free(buf); - if(m_omx_input_use_buffers && buf) - _aligned_free(buf); + if(omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreComponent::FreeInputBuffers error deallocate omx input buffer on component %s omx_err(0x%08x)\n", m_componentName.c_str(), omx_err); + } + } + pthread_mutex_unlock(&m_omx_input_mutex); + omx_err = WaitForCommand(OMX_CommandPortDisable, m_input_port); if(omx_err != OMX_ErrorNone) { - CLog::Log(LOGERROR, "COMXCoreComponent::FreeInputBuffers error deallocate omx input buffer on component %s omx_err(0x%08x)\n", m_componentName.c_str(), omx_err); + CLog::Log(LOGERROR, "COMXCoreComponent::FreeInputBuffers WaitForCommand:OMX_CommandPortDisable failed on %s omx_err(0x%08x)\n", m_componentName.c_str(), omx_err); } - } - pthread_mutex_unlock(&m_omx_input_mutex); - - omx_err = WaitForCommand(OMX_CommandPortDisable, m_input_port); - if(omx_err != OMX_ErrorNone) - { - CLog::Log(LOGERROR, "COMXCoreComponent::FreeInputBuffers WaitForCommand:OMX_CommandPortDisable failed on %s omx_err(0x%08x)\n", m_componentName.c_str(), omx_err); - } - WaitForInputDone(1000); + WaitForInputDone(1000); - pthread_mutex_lock(&m_omx_input_mutex); - assert(m_omx_input_buffers.size() == m_omx_input_avaliable.size()); + pthread_mutex_lock(&m_omx_input_mutex); + assert(m_omx_input_buffers.size() == m_omx_input_avaliable.size()); - m_omx_input_buffers.clear(); + m_omx_input_buffers.clear(); - while (!m_omx_input_avaliable.empty()) - m_omx_input_avaliable.pop(); + while (!m_omx_input_avaliable.empty()) + m_omx_input_avaliable.pop(); - m_input_alignment = 0; - m_input_buffer_size = 0; - m_input_buffer_count = 0; + m_input_alignment = 0; + m_input_buffer_size = 0; + m_input_buffer_count = 0; - pthread_mutex_unlock(&m_omx_input_mutex); + pthread_mutex_unlock(&m_omx_input_mutex); - return omx_err; + return omx_err; } OMX_ERRORTYPE COMXCoreComponent::FreeOutputBuffers() { - OMX_ERRORTYPE omx_err = OMX_ErrorNone; + OMX_ERRORTYPE omx_err = OMX_ErrorNone; - if(!m_handle) - return OMX_ErrorUndefined; + if(!m_handle) + return OMX_ErrorUndefined; - if(m_omx_output_buffers.empty()) - return OMX_ErrorNone; + if(m_omx_output_buffers.empty()) + return OMX_ErrorNone; - m_flush_output = true; + m_flush_output = true; - omx_err = DisablePort(m_output_port, false); + omx_err = DisablePort(m_output_port, false); - pthread_mutex_lock(&m_omx_output_mutex); - pthread_cond_broadcast(&m_output_buffer_cond); + pthread_mutex_lock(&m_omx_output_mutex); + pthread_cond_broadcast(&m_output_buffer_cond); - for (size_t i = 0; i < m_omx_output_buffers.size(); i++) - { - uint8_t *buf = m_omx_output_buffers[i]->pBuffer; + for (size_t i = 0; i < m_omx_output_buffers.size(); i++) + { + uint8_t *buf = m_omx_output_buffers[i]->pBuffer; - omx_err = OMX_FreeBuffer(m_handle, m_output_port, m_omx_output_buffers[i]); + omx_err = OMX_FreeBuffer(m_handle, m_output_port, m_omx_output_buffers[i]); - if(m_omx_output_use_buffers && buf) - _aligned_free(buf); + if(m_omx_output_use_buffers && buf) + _aligned_free(buf); + if(omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreComponent::FreeOutputBuffers error deallocate omx output buffer on component %s omx_err(0x%08x)\n", m_componentName.c_str(), omx_err); + } + } + pthread_mutex_unlock(&m_omx_output_mutex); + + omx_err = WaitForCommand(OMX_CommandPortDisable, m_output_port); if(omx_err != OMX_ErrorNone) { - CLog::Log(LOGERROR, "COMXCoreComponent::FreeOutputBuffers error deallocate omx output buffer on component %s omx_err(0x%08x)\n", m_componentName.c_str(), omx_err); + CLog::Log(LOGERROR, "COMXCoreComponent::FreeOutputBuffers WaitForCommand:OMX_CommandPortDisable failed on %s omx_err(0x%08x)\n", m_componentName.c_str(), omx_err); } - } - pthread_mutex_unlock(&m_omx_output_mutex); - - omx_err = WaitForCommand(OMX_CommandPortDisable, m_output_port); - if(omx_err != OMX_ErrorNone) - { - CLog::Log(LOGERROR, "COMXCoreComponent::FreeOutputBuffers WaitForCommand:OMX_CommandPortDisable failed on %s omx_err(0x%08x)\n", m_componentName.c_str(), omx_err); - } - WaitForOutputDone(1000); + WaitForOutputDone(1000); - pthread_mutex_lock(&m_omx_output_mutex); - assert(m_omx_output_buffers.size() == m_omx_output_available.size()); + pthread_mutex_lock(&m_omx_output_mutex); + assert(m_omx_output_buffers.size() == m_omx_output_available.size()); - m_omx_output_buffers.clear(); + m_omx_output_buffers.clear(); - while (!m_omx_output_available.empty()) - m_omx_output_available.pop(); + while (!m_omx_output_available.empty()) + m_omx_output_available.pop(); - m_output_alignment = 0; - m_output_buffer_size = 0; - m_output_buffer_count = 0; + m_output_alignment = 0; + m_output_buffer_size = 0; + m_output_buffer_count = 0; - pthread_mutex_unlock(&m_omx_output_mutex); + pthread_mutex_unlock(&m_omx_output_mutex); - return omx_err; + return omx_err; } OMX_ERRORTYPE COMXCoreComponent::DisableAllPorts() { - if(!m_handle) - return OMX_ErrorUndefined; - - OMX_ERRORTYPE omx_err = OMX_ErrorNone; - - OMX_INDEXTYPE idxTypes[] = { - OMX_IndexParamAudioInit, - OMX_IndexParamImageInit, - OMX_IndexParamVideoInit, - OMX_IndexParamOtherInit - }; - - OMX_PORT_PARAM_TYPE ports; - OMX_INIT_STRUCTURE(ports); - - int i; - for(i=0; i < 4; i++) - { - omx_err = OMX_GetParameter(m_handle, idxTypes[i], &ports); - if(omx_err == OMX_ErrorNone) { - - uint32_t j; - for(j=0; j::iterator it = m_omx_events.begin(); it != m_omx_events.end(); ) - { - omx_event event = *it; - - if(event.eEvent == eEvent && event.nData1 == nData1 && event.nData2 == nData2) + for (std::vector::iterator it = m_omx_events.begin(); it != m_omx_events.end(); ) { - it = m_omx_events.erase(it); - continue; + omx_event event = *it; + + if(event.eEvent == eEvent && event.nData1 == nData1 && event.nData2 == nData2) + { + it = m_omx_events.erase(it); + continue; + } + ++it; } - ++it; - } } OMX_ERRORTYPE COMXCoreComponent::AddEvent(OMX_EVENTTYPE eEvent, OMX_U32 nData1, OMX_U32 nData2) { - omx_event event; + omx_event event; - event.eEvent = eEvent; - event.nData1 = nData1; - event.nData2 = nData2; + event.eEvent = eEvent; + event.nData1 = nData1; + event.nData2 = nData2; - pthread_mutex_lock(&m_omx_event_mutex); - RemoveEvent(eEvent, nData1, nData2); - m_omx_events.push_back(event); - // this allows (all) blocked tasks to be awoken - pthread_cond_broadcast(&m_omx_event_cond); - pthread_mutex_unlock(&m_omx_event_mutex); + pthread_mutex_lock(&m_omx_event_mutex); + RemoveEvent(eEvent, nData1, nData2); + m_omx_events.push_back(event); + // this allows (all) blocked tasks to be awoken + pthread_cond_broadcast(&m_omx_event_cond); + pthread_mutex_unlock(&m_omx_event_mutex); #ifdef OMX_DEBUG_EVENTS - CLog::Log(LOGDEBUG, "COMXCoreComponent::AddEvent %s add event event.eEvent 0x%08x event.nData1 0x%08x event.nData2 %d\n", - m_componentName.c_str(), (int)event.eEvent, (int)event.nData1, (int)event.nData2); + CLog::Log(LOGDEBUG, "COMXCoreComponent::AddEvent %s add event event.eEvent 0x%08x event.nData1 0x%08x event.nData2 %d\n", + m_componentName.c_str(), (int)event.eEvent, (int)event.nData1, (int)event.nData2); #endif - return OMX_ErrorNone; + return OMX_ErrorNone; } // timeout in milliseconds OMX_ERRORTYPE COMXCoreComponent::WaitForEvent(OMX_EVENTTYPE eventType, long timeout) { #ifdef OMX_DEBUG_EVENTS - CLog::Log(LOGDEBUG, "COMXCoreComponent::WaitForEvent %s wait event 0x%08x\n", - m_componentName.c_str(), (int)eventType); + CLog::Log(LOGDEBUG, "COMXCoreComponent::WaitForEvent %s wait event 0x%08x\n", + m_componentName.c_str(), (int)eventType); #endif - pthread_mutex_lock(&m_omx_event_mutex); - struct timespec endtime; - clock_gettime(CLOCK_REALTIME, &endtime); - add_timespecs(endtime, timeout); - while(true) - { - for (std::vector::iterator it = m_omx_events.begin(); it != m_omx_events.end(); it++) + pthread_mutex_lock(&m_omx_event_mutex); + struct timespec endtime; + clock_gettime(CLOCK_REALTIME, &endtime); + add_timespecs(endtime, timeout); + while(true) { - omx_event event = *it; + for (std::vector::iterator it = m_omx_events.begin(); it != m_omx_events.end(); it++) + { + omx_event event = *it; #ifdef OMX_DEBUG_EVENTS - CLog::Log(LOGDEBUG, "COMXCoreComponent::WaitForEvent %s inlist event event.eEvent 0x%08x event.nData1 0x%08x event.nData2 %d\n", - m_componentName.c_str(), (int)event.eEvent, (int)event.nData1, (int)event.nData2); + CLog::Log(LOGDEBUG, "COMXCoreComponent::WaitForEvent %s inlist event event.eEvent 0x%08x event.nData1 0x%08x event.nData2 %d\n", + m_componentName.c_str(), (int)event.eEvent, (int)event.nData1, (int)event.nData2); #endif - if(event.eEvent == OMX_EventError && event.nData1 == (OMX_U32)OMX_ErrorSameState && event.nData2 == 1) - { + if(event.eEvent == OMX_EventError && event.nData1 == (OMX_U32)OMX_ErrorSameState && event.nData2 == 1) + { #ifdef OMX_DEBUG_EVENTS - CLog::Log(LOGDEBUG, "COMXCoreComponent::WaitForEvent %s remove event event.eEvent 0x%08x event.nData1 0x%08x event.nData2 %d\n", - m_componentName.c_str(), (int)event.eEvent, (int)event.nData1, (int)event.nData2); + CLog::Log(LOGDEBUG, "COMXCoreComponent::WaitForEvent %s remove event event.eEvent 0x%08x event.nData1 0x%08x event.nData2 %d\n", + m_componentName.c_str(), (int)event.eEvent, (int)event.nData1, (int)event.nData2); #endif - m_omx_events.erase(it); - pthread_mutex_unlock(&m_omx_event_mutex); - return OMX_ErrorNone; - } - else if(event.eEvent == OMX_EventError) - { - m_omx_events.erase(it); - pthread_mutex_unlock(&m_omx_event_mutex); - return (OMX_ERRORTYPE)event.nData1; - } - else if(event.eEvent == eventType) - { + m_omx_events.erase(it); + pthread_mutex_unlock(&m_omx_event_mutex); + return OMX_ErrorNone; + } + else if(event.eEvent == OMX_EventError) + { + m_omx_events.erase(it); + pthread_mutex_unlock(&m_omx_event_mutex); + return (OMX_ERRORTYPE)event.nData1; + } + else if(event.eEvent == eventType) + { #ifdef OMX_DEBUG_EVENTS - CLog::Log(LOGDEBUG, "COMXCoreComponent::WaitForEvent %s remove event event.eEvent 0x%08x event.nData1 0x%08x event.nData2 %d\n", - m_componentName.c_str(), (int)event.eEvent, (int)event.nData1, (int)event.nData2); + CLog::Log(LOGDEBUG, "COMXCoreComponent::WaitForEvent %s remove event event.eEvent 0x%08x event.nData1 0x%08x event.nData2 %d\n", + m_componentName.c_str(), (int)event.eEvent, (int)event.nData1, (int)event.nData2); #endif - m_omx_events.erase(it); - pthread_mutex_unlock(&m_omx_event_mutex); - return OMX_ErrorNone; - } - } + m_omx_events.erase(it); + pthread_mutex_unlock(&m_omx_event_mutex); + return OMX_ErrorNone; + } + } - if (m_resource_error) - break; - int retcode = pthread_cond_timedwait(&m_omx_event_cond, &m_omx_event_mutex, &endtime); - if (retcode != 0) - { - if (timeout > 0) - CLog::Log(LOGERROR, "COMXCoreComponent::WaitForEvent %s wait event 0x%08x timeout %ld\n", + if (m_resource_error) + break; + int retcode = pthread_cond_timedwait(&m_omx_event_cond, &m_omx_event_mutex, &endtime); + if (retcode != 0) + { + if (timeout > 0) + CLog::Log(LOGERROR, "COMXCoreComponent::WaitForEvent %s wait event 0x%08x timeout %ld\n", m_componentName.c_str(), (int)eventType, timeout); - pthread_mutex_unlock(&m_omx_event_mutex); - return OMX_ErrorTimeout; + pthread_mutex_unlock(&m_omx_event_mutex); + return OMX_ErrorTimeout; + } } - } - pthread_mutex_unlock(&m_omx_event_mutex); - return OMX_ErrorNone; + pthread_mutex_unlock(&m_omx_event_mutex); + return OMX_ErrorNone; } // timeout in milliseconds OMX_ERRORTYPE COMXCoreComponent::WaitForCommand(OMX_U32 command, OMX_U32 nData2, long timeout) { #ifdef OMX_DEBUG_EVENTS - CLog::Log(LOGDEBUG, "COMXCoreComponent::WaitForCommand %s wait event.eEvent 0x%08x event.command 0x%08x event.nData2 %d\n", - m_componentName.c_str(), (int)OMX_EventCmdComplete, (int)command, (int)nData2); + CLog::Log(LOGDEBUG, "COMXCoreComponent::WaitForCommand %s wait event.eEvent 0x%08x event.command 0x%08x event.nData2 %d\n", + m_componentName.c_str(), (int)OMX_EventCmdComplete, (int)command, (int)nData2); #endif - pthread_mutex_lock(&m_omx_event_mutex); - struct timespec endtime; - clock_gettime(CLOCK_REALTIME, &endtime); - add_timespecs(endtime, timeout); - while(true) - { - for (std::vector::iterator it = m_omx_events.begin(); it != m_omx_events.end(); it++) + pthread_mutex_lock(&m_omx_event_mutex); + struct timespec endtime; + clock_gettime(CLOCK_REALTIME, &endtime); + add_timespecs(endtime, timeout); + while(true) { - omx_event event = *it; + for (std::vector::iterator it = m_omx_events.begin(); it != m_omx_events.end(); it++) + { + omx_event event = *it; #ifdef OMX_DEBUG_EVENTS - CLog::Log(LOGDEBUG, "COMXCoreComponent::WaitForCommand %s inlist event event.eEvent 0x%08x event.nData1 0x%08x event.nData2 %d\n", - m_componentName.c_str(), (int)event.eEvent, (int)event.nData1, (int)event.nData2); + CLog::Log(LOGDEBUG, "COMXCoreComponent::WaitForCommand %s inlist event event.eEvent 0x%08x event.nData1 0x%08x event.nData2 %d\n", + m_componentName.c_str(), (int)event.eEvent, (int)event.nData1, (int)event.nData2); #endif - if(event.eEvent == OMX_EventError && event.nData1 == (OMX_U32)OMX_ErrorSameState && event.nData2 == 1) - { + if(event.eEvent == OMX_EventError && event.nData1 == (OMX_U32)OMX_ErrorSameState && event.nData2 == 1) + { #ifdef OMX_DEBUG_EVENTS - CLog::Log(LOGDEBUG, "COMXCoreComponent::WaitForCommand %s remove event event.eEvent 0x%08x event.nData1 0x%08x event.nData2 %d\n", - m_componentName.c_str(), (int)event.eEvent, (int)event.nData1, (int)event.nData2); + CLog::Log(LOGDEBUG, "COMXCoreComponent::WaitForCommand %s remove event event.eEvent 0x%08x event.nData1 0x%08x event.nData2 %d\n", + m_componentName.c_str(), (int)event.eEvent, (int)event.nData1, (int)event.nData2); #endif - m_omx_events.erase(it); - pthread_mutex_unlock(&m_omx_event_mutex); - return OMX_ErrorNone; - } - else if(event.eEvent == OMX_EventError) - { - m_omx_events.erase(it); - pthread_mutex_unlock(&m_omx_event_mutex); - return (OMX_ERRORTYPE)event.nData1; - } - else if(event.eEvent == OMX_EventCmdComplete && event.nData1 == command && event.nData2 == nData2) - { + m_omx_events.erase(it); + pthread_mutex_unlock(&m_omx_event_mutex); + return OMX_ErrorNone; + } + else if(event.eEvent == OMX_EventError) + { + m_omx_events.erase(it); + pthread_mutex_unlock(&m_omx_event_mutex); + return (OMX_ERRORTYPE)event.nData1; + } + else if(event.eEvent == OMX_EventCmdComplete && event.nData1 == command && event.nData2 == nData2) + { #ifdef OMX_DEBUG_EVENTS - CLog::Log(LOGDEBUG, "COMXCoreComponent::WaitForCommand %s remove event event.eEvent 0x%08x event.nData1 0x%08x event.nData2 %d\n", - m_componentName.c_str(), (int)event.eEvent, (int)event.nData1, (int)event.nData2); + CLog::Log(LOGDEBUG, "COMXCoreComponent::WaitForCommand %s remove event event.eEvent 0x%08x event.nData1 0x%08x event.nData2 %d\n", + m_componentName.c_str(), (int)event.eEvent, (int)event.nData1, (int)event.nData2); #endif - m_omx_events.erase(it); - pthread_mutex_unlock(&m_omx_event_mutex); - return OMX_ErrorNone; - } - } + m_omx_events.erase(it); + pthread_mutex_unlock(&m_omx_event_mutex); + return OMX_ErrorNone; + } + } - if (m_resource_error) - break; - int retcode = pthread_cond_timedwait(&m_omx_event_cond, &m_omx_event_mutex, &endtime); - if (retcode != 0) { - CLog::Log(LOGERROR, "COMXCoreComponent::WaitForCommand %s wait timeout event.eEvent 0x%08x event.command 0x%08x event.nData2 %d\n", - m_componentName.c_str(), (int)OMX_EventCmdComplete, (int)command, (int)nData2); + if (m_resource_error) + break; + int retcode = pthread_cond_timedwait(&m_omx_event_cond, &m_omx_event_mutex, &endtime); + if (retcode != 0) { + CLog::Log(LOGERROR, "COMXCoreComponent::WaitForCommand %s wait timeout event.eEvent 0x%08x event.command 0x%08x event.nData2 %d\n", + m_componentName.c_str(), (int)OMX_EventCmdComplete, (int)command, (int)nData2); - pthread_mutex_unlock(&m_omx_event_mutex); - return OMX_ErrorTimeout; + pthread_mutex_unlock(&m_omx_event_mutex); + return OMX_ErrorTimeout; + } } - } - pthread_mutex_unlock(&m_omx_event_mutex); - return OMX_ErrorNone; + pthread_mutex_unlock(&m_omx_event_mutex); + return OMX_ErrorNone; } OMX_ERRORTYPE COMXCoreComponent::SetStateForComponent(OMX_STATETYPE state) { - if(!m_handle) - return OMX_ErrorUndefined; + if(!m_handle) + return OMX_ErrorUndefined; - OMX_ERRORTYPE omx_err = OMX_ErrorNone; - OMX_STATETYPE state_actual = OMX_StateMax; + OMX_ERRORTYPE omx_err = OMX_ErrorNone; + OMX_STATETYPE state_actual = OMX_StateMax; - if(state == state_actual) - return OMX_ErrorNone; + if(state == state_actual) + return OMX_ErrorNone; - omx_err = OMX_SendCommand(m_handle, OMX_CommandStateSet, state, 0); - if (omx_err != OMX_ErrorNone) - { - if(omx_err == OMX_ErrorSameState) - { - CLog::Log(LOGERROR, "COMXCoreComponent::SetStateForComponent - %s same state\n", - m_componentName.c_str()); - omx_err = OMX_ErrorNone; - } - else + omx_err = OMX_SendCommand(m_handle, OMX_CommandStateSet, state, 0); + if (omx_err != OMX_ErrorNone) { - CLog::Log(LOGERROR, "COMXCoreComponent::SetStateForComponent - %s failed with omx_err(0x%x)\n", - m_componentName.c_str(), omx_err); + if(omx_err == OMX_ErrorSameState) + { + CLog::Log(LOGERROR, "COMXCoreComponent::SetStateForComponent - %s same state\n", + m_componentName.c_str()); + omx_err = OMX_ErrorNone; + } + else + { + CLog::Log(LOGERROR, "COMXCoreComponent::SetStateForComponent - %s failed with omx_err(0x%x)\n", + m_componentName.c_str(), omx_err); + } } - } - else - { - omx_err = WaitForCommand(OMX_CommandStateSet, state); - if (omx_err != OMX_ErrorNone) + else { - CLog::Log(LOGERROR, "COMXCoreComponent::WaitForCommand - %s failed with omx_err(0x%x)\n", - m_componentName.c_str(), omx_err); + omx_err = WaitForCommand(OMX_CommandStateSet, state); + if (omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreComponent::WaitForCommand - %s failed with omx_err(0x%x)\n", + m_componentName.c_str(), omx_err); + } } - } - return omx_err; + return omx_err; } OMX_STATETYPE COMXCoreComponent::GetState() const { - if(!m_handle) - return (OMX_STATETYPE)0; - - OMX_STATETYPE state; - - OMX_ERRORTYPE omx_err = OMX_GetState(m_handle, &state); - if (omx_err != OMX_ErrorNone) - { - CLog::Log(LOGERROR, "COMXCoreComponent::GetState - %s failed with omx_err(0x%x)\n", - m_componentName.c_str(), omx_err); - } - return state; + if(!m_handle) + return (OMX_STATETYPE)0; + + OMX_STATETYPE state; + + OMX_ERRORTYPE omx_err = OMX_GetState(m_handle, &state); + if (omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreComponent::GetState - %s failed with omx_err(0x%x)\n", + m_componentName.c_str(), omx_err); + } + return state; } OMX_ERRORTYPE COMXCoreComponent::SetParameter(OMX_INDEXTYPE paramIndex, OMX_PTR paramStruct) { - if(!m_handle) - return OMX_ErrorUndefined; - - OMX_ERRORTYPE omx_err; - - omx_err = OMX_SetParameter(m_handle, paramIndex, paramStruct); - if(omx_err != OMX_ErrorNone) - { - CLog::Log(LOGERROR, "COMXCoreComponent::SetParameter - %s failed with omx_err(0x%x)\n", - m_componentName.c_str(), omx_err); - } - return omx_err; + if(!m_handle) + return OMX_ErrorUndefined; + + OMX_ERRORTYPE omx_err; + + omx_err = OMX_SetParameter(m_handle, paramIndex, paramStruct); + if(omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreComponent::SetParameter - %s failed with omx_err(0x%x)\n", + m_componentName.c_str(), omx_err); + } + return omx_err; } OMX_ERRORTYPE COMXCoreComponent::GetParameter(OMX_INDEXTYPE paramIndex, OMX_PTR paramStruct) const { - if(!m_handle) - return OMX_ErrorUndefined; - - OMX_ERRORTYPE omx_err; - - omx_err = OMX_GetParameter(m_handle, paramIndex, paramStruct); - if(omx_err != OMX_ErrorNone) - { - CLog::Log(LOGERROR, "COMXCoreComponent::GetParameter - %s failed with omx_err(0x%x)\n", - m_componentName.c_str(), omx_err); - } - return omx_err; + if(!m_handle) + return OMX_ErrorUndefined; + + OMX_ERRORTYPE omx_err; + + omx_err = OMX_GetParameter(m_handle, paramIndex, paramStruct); + if(omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreComponent::GetParameter - %s failed with omx_err(0x%x)\n", + m_componentName.c_str(), omx_err); + } + return omx_err; } OMX_ERRORTYPE COMXCoreComponent::SetConfig(OMX_INDEXTYPE configIndex, OMX_PTR configStruct) { - if(!m_handle) - return OMX_ErrorUndefined; - - OMX_ERRORTYPE omx_err; - - omx_err = OMX_SetConfig(m_handle, configIndex, configStruct); - if(omx_err != OMX_ErrorNone) - { - CLog::Log(LOGERROR, "COMXCoreComponent::SetConfig - %s failed with omx_err(0x%x)\n", - m_componentName.c_str(), omx_err); - } - return omx_err; + if(!m_handle) + return OMX_ErrorUndefined; + + OMX_ERRORTYPE omx_err; + + omx_err = OMX_SetConfig(m_handle, configIndex, configStruct); + if(omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreComponent::SetConfig - %s failed with omx_err(0x%x)\n", + m_componentName.c_str(), omx_err); + } + return omx_err; } OMX_ERRORTYPE COMXCoreComponent::GetConfig(OMX_INDEXTYPE configIndex, OMX_PTR configStruct) const { - if(!m_handle) - return OMX_ErrorUndefined; - - OMX_ERRORTYPE omx_err; - - omx_err = OMX_GetConfig(m_handle, configIndex, configStruct); - if(omx_err != OMX_ErrorNone) - { - CLog::Log(LOGERROR, "COMXCoreComponent::GetConfig - %s failed with omx_err(0x%x)\n", - m_componentName.c_str(), omx_err); - } - return omx_err; + if(!m_handle) + return OMX_ErrorUndefined; + + OMX_ERRORTYPE omx_err; + + omx_err = OMX_GetConfig(m_handle, configIndex, configStruct); + if(omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreComponent::GetConfig - %s failed with omx_err(0x%x)\n", + m_componentName.c_str(), omx_err); + } + return omx_err; } OMX_ERRORTYPE COMXCoreComponent::SendCommand(OMX_COMMANDTYPE cmd, OMX_U32 cmdParam, OMX_PTR cmdParamData) { - if(!m_handle) - return OMX_ErrorUndefined; - - OMX_ERRORTYPE omx_err; - - omx_err = OMX_SendCommand(m_handle, cmd, cmdParam, cmdParamData); - if(omx_err != OMX_ErrorNone) - { - CLog::Log(LOGERROR, "COMXCoreComponent::SendCommand - %s failed with omx_err(0x%x)\n", - m_componentName.c_str(), omx_err); - } - return omx_err; + if(!m_handle) + return OMX_ErrorUndefined; + + OMX_ERRORTYPE omx_err; + + omx_err = OMX_SendCommand(m_handle, cmd, cmdParam, cmdParamData); + if(omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreComponent::SendCommand - %s failed with omx_err(0x%x)\n", + m_componentName.c_str(), omx_err); + } + return omx_err; } OMX_ERRORTYPE COMXCoreComponent::EnablePort(unsigned int port, bool wait) { - if(!m_handle) - return OMX_ErrorUndefined; + if(!m_handle) + return OMX_ErrorUndefined; - OMX_ERRORTYPE omx_err = OMX_ErrorNone; + OMX_ERRORTYPE omx_err = OMX_ErrorNone; - OMX_PARAM_PORTDEFINITIONTYPE portFormat; - OMX_INIT_STRUCTURE(portFormat); - portFormat.nPortIndex = port; + OMX_PARAM_PORTDEFINITIONTYPE portFormat; + OMX_INIT_STRUCTURE(portFormat); + portFormat.nPortIndex = port; - omx_err = OMX_GetParameter(m_handle, OMX_IndexParamPortDefinition, &portFormat); - if(omx_err != OMX_ErrorNone) - { - CLog::Log(LOGERROR, "COMXCoreComponent::EnablePort - Error get port %d status on component %s omx_err(0x%08x)", - port, m_componentName.c_str(), (int)omx_err); - } - - if(portFormat.bEnabled == OMX_FALSE) - { - omx_err = OMX_SendCommand(m_handle, OMX_CommandPortEnable, port, NULL); + omx_err = OMX_GetParameter(m_handle, OMX_IndexParamPortDefinition, &portFormat); if(omx_err != OMX_ErrorNone) { - CLog::Log(LOGERROR, "COMXCoreComponent::EnablePort - Error enable port %d on component %s omx_err(0x%08x)", - port, m_componentName.c_str(), (int)omx_err); - return omx_err; + CLog::Log(LOGERROR, "COMXCoreComponent::EnablePort - Error get port %d status on component %s omx_err(0x%08x)", + port, m_componentName.c_str(), (int)omx_err); } - else + + if(portFormat.bEnabled == OMX_FALSE) { - if(wait) - omx_err = WaitForCommand(OMX_CommandPortEnable, port); + omx_err = OMX_SendCommand(m_handle, OMX_CommandPortEnable, port, NULL); + if(omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreComponent::EnablePort - Error enable port %d on component %s omx_err(0x%08x)", + port, m_componentName.c_str(), (int)omx_err); + return omx_err; + } + else + { + if(wait) + omx_err = WaitForCommand(OMX_CommandPortEnable, port); + } } - } - return omx_err; + return omx_err; } OMX_ERRORTYPE COMXCoreComponent::DisablePort(unsigned int port, bool wait) { - if(!m_handle) - return OMX_ErrorUndefined; + if(!m_handle) + return OMX_ErrorUndefined; - OMX_ERRORTYPE omx_err = OMX_ErrorNone; + OMX_ERRORTYPE omx_err = OMX_ErrorNone; - OMX_PARAM_PORTDEFINITIONTYPE portFormat; - OMX_INIT_STRUCTURE(portFormat); - portFormat.nPortIndex = port; + OMX_PARAM_PORTDEFINITIONTYPE portFormat; + OMX_INIT_STRUCTURE(portFormat); + portFormat.nPortIndex = port; - omx_err = OMX_GetParameter(m_handle, OMX_IndexParamPortDefinition, &portFormat); - if(omx_err != OMX_ErrorNone) - { - CLog::Log(LOGERROR, "COMXCoreComponent::DisablePort - Error get port %d status on component %s omx_err(0x%08x)", - port, m_componentName.c_str(), (int)omx_err); - } - - if(portFormat.bEnabled == OMX_TRUE) - { - omx_err = OMX_SendCommand(m_handle, OMX_CommandPortDisable, port, NULL); + omx_err = OMX_GetParameter(m_handle, OMX_IndexParamPortDefinition, &portFormat); if(omx_err != OMX_ErrorNone) { - CLog::Log(LOGERROR, "COMXCoreComponent::DIsablePort - Error disable port %d on component %s omx_err(0x%08x)", - port, m_componentName.c_str(), (int)omx_err); - return omx_err; + CLog::Log(LOGERROR, "COMXCoreComponent::DisablePort - Error get port %d status on component %s omx_err(0x%08x)", + port, m_componentName.c_str(), (int)omx_err); } - else + + if(portFormat.bEnabled == OMX_TRUE) { - if(wait) - omx_err = WaitForCommand(OMX_CommandPortDisable, port); + omx_err = OMX_SendCommand(m_handle, OMX_CommandPortDisable, port, NULL); + if(omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreComponent::DIsablePort - Error disable port %d on component %s omx_err(0x%08x)", + port, m_componentName.c_str(), (int)omx_err); + return omx_err; + } + else + { + if(wait) + omx_err = WaitForCommand(OMX_CommandPortDisable, port); + } } - } - return omx_err; + return omx_err; } OMX_ERRORTYPE COMXCoreComponent::UseEGLImage(OMX_BUFFERHEADERTYPE** ppBufferHdr, OMX_U32 nPortIndex, OMX_PTR pAppPrivate, void* eglImage) { -if (m_callbacks.FillBufferDone == &COMXCoreComponent::DecoderFillBufferDoneCallback) -{ - OMX_ERRORTYPE omx_err = OMX_ErrorNone; + if (m_callbacks.FillBufferDone == &COMXCoreComponent::DecoderFillBufferDoneCallback) + { + OMX_ERRORTYPE omx_err = OMX_ErrorNone; - if(!m_handle) - return OMX_ErrorUndefined; + if(!m_handle) + return OMX_ErrorUndefined; - m_omx_output_use_buffers = false; + m_omx_output_use_buffers = false; - OMX_PARAM_PORTDEFINITIONTYPE portFormat; - OMX_INIT_STRUCTURE(portFormat); - portFormat.nPortIndex = m_output_port; + OMX_PARAM_PORTDEFINITIONTYPE portFormat; + OMX_INIT_STRUCTURE(portFormat); + portFormat.nPortIndex = m_output_port; - omx_err = OMX_GetParameter(m_handle, OMX_IndexParamPortDefinition, &portFormat); - if(omx_err != OMX_ErrorNone) - return omx_err; + omx_err = OMX_GetParameter(m_handle, OMX_IndexParamPortDefinition, &portFormat); + if(omx_err != OMX_ErrorNone) + return omx_err; - if(GetState() != OMX_StateIdle) - { - if(GetState() != OMX_StateLoaded) - SetStateForComponent(OMX_StateLoaded); + if(GetState() != OMX_StateIdle) + { + if(GetState() != OMX_StateLoaded) + SetStateForComponent(OMX_StateLoaded); - SetStateForComponent(OMX_StateIdle); - } + SetStateForComponent(OMX_StateIdle); + } - omx_err = EnablePort(m_output_port, false); - if(omx_err != OMX_ErrorNone) - { - CLog::Log(LOGERROR, "%s::%s - %s EnablePort failed with omx_err(0x%x)", CLASSNAME, __func__, - m_componentName.c_str(), omx_err); - return omx_err; - } + omx_err = EnablePort(m_output_port, false); + if(omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "%s::%s - %s EnablePort failed with omx_err(0x%x)", CLASSNAME, __func__, + m_componentName.c_str(), omx_err); + return omx_err; + } - m_output_alignment = portFormat.nBufferAlignment; - m_output_buffer_count = portFormat.nBufferCountActual; - m_output_buffer_size = portFormat.nBufferSize; + m_output_alignment = portFormat.nBufferAlignment; + m_output_buffer_count = portFormat.nBufferCountActual; + m_output_buffer_size = portFormat.nBufferSize; - if (portFormat.nBufferCountActual != 1) - { - CLog::Log(LOGERROR, "%s::%s - %s nBufferCountActual unexpected %d", CLASSNAME, __func__, - m_componentName.c_str(), portFormat.nBufferCountActual); - return omx_err; - } + if (portFormat.nBufferCountActual != 1) + { + CLog::Log(LOGERROR, "%s::%s - %s nBufferCountActual unexpected %d", CLASSNAME, __func__, + m_componentName.c_str(), portFormat.nBufferCountActual); + return omx_err; + } - CLog::Log(LOGDEBUG, "%s::%s component(%s) - port(%d), nBufferCountMin(%u), nBufferCountActual(%u), nBufferSize(%u) nBufferAlignmen(%u)\n", - CLASSNAME, __func__, m_componentName.c_str(), m_output_port, portFormat.nBufferCountMin, - portFormat.nBufferCountActual, portFormat.nBufferSize, portFormat.nBufferAlignment); + CLog::Log(LOGDEBUG, "%s::%s component(%s) - port(%d), nBufferCountMin(%u), nBufferCountActual(%u), nBufferSize(%u) nBufferAlignmen(%u)\n", + CLASSNAME, __func__, m_componentName.c_str(), m_output_port, portFormat.nBufferCountMin, + portFormat.nBufferCountActual, portFormat.nBufferSize, portFormat.nBufferAlignment); - for (size_t i = 0; i < portFormat.nBufferCountActual; i++) - { - omx_err = OMX_UseEGLImage(m_handle, ppBufferHdr, nPortIndex, pAppPrivate, eglImage); - if(omx_err != OMX_ErrorNone) - { - CLog::Log(LOGERROR, "%s::%s - %s failed with omx_err(0x%x)\n", - CLASSNAME, __func__, m_componentName.c_str(), omx_err); - return omx_err; - } - - OMX_BUFFERHEADERTYPE *buffer = *ppBufferHdr; - buffer->nOutputPortIndex = m_output_port; - buffer->nFilledLen = 0; - buffer->nOffset = 0; - buffer->pAppPrivate = (void*)i; - m_omx_output_buffers.push_back(buffer); - m_omx_output_available.push(buffer); - } - - omx_err = WaitForCommand(OMX_CommandPortEnable, m_output_port); - if(omx_err != OMX_ErrorNone) - { - CLog::Log(LOGERROR, " %s::%s - %s EnablePort failed with omx_err(0x%x)\n", - CLASSNAME, __func__, m_componentName.c_str(), omx_err); - return omx_err; - } - m_flush_output = false; - - return omx_err; -} -else -{ - OMX_ERRORTYPE omx_err; - omx_err = OMX_UseEGLImage(m_handle, ppBufferHdr, nPortIndex, pAppPrivate, eglImage); - if(omx_err != OMX_ErrorNone) + for (size_t i = 0; i < portFormat.nBufferCountActual; i++) + { + omx_err = OMX_UseEGLImage(m_handle, ppBufferHdr, nPortIndex, pAppPrivate, eglImage); + if(omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "%s::%s - %s failed with omx_err(0x%x)\n", + CLASSNAME, __func__, m_componentName.c_str(), omx_err); + return omx_err; + } + + OMX_BUFFERHEADERTYPE *buffer = *ppBufferHdr; + buffer->nOutputPortIndex = m_output_port; + buffer->nFilledLen = 0; + buffer->nOffset = 0; + buffer->pAppPrivate = (void*)i; + m_omx_output_buffers.push_back(buffer); + m_omx_output_available.push(buffer); + } + + omx_err = WaitForCommand(OMX_CommandPortEnable, m_output_port); + if(omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, " %s::%s - %s EnablePort failed with omx_err(0x%x)\n", + CLASSNAME, __func__, m_componentName.c_str(), omx_err); + return omx_err; + } + m_flush_output = false; + + return omx_err; + } + else { - CLog::Log(LOGERROR, "%s::%s - %s failed with omx_err(0x%x)\n", - CLASSNAME, __func__, m_componentName.c_str(), omx_err); - return omx_err; + OMX_ERRORTYPE omx_err; + omx_err = OMX_UseEGLImage(m_handle, ppBufferHdr, nPortIndex, pAppPrivate, eglImage); + if(omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "%s::%s - %s failed with omx_err(0x%x)\n", + CLASSNAME, __func__, m_componentName.c_str(), omx_err); + return omx_err; + } + return omx_err; } - return omx_err; -} } void COMXCoreComponent::SetPrivateCallBack(enc_done_cbk cb) { - m_enc_private_cb = cb; + m_enc_private_cb = cb; } bool COMXCoreComponent::Initialize( const std::string &component_name, OMX_INDEXTYPE index, OMX_CALLBACKTYPE *callbacks) { - OMX_ERRORTYPE omx_err; + OMX_ERRORTYPE omx_err; - m_input_port = 0; - m_output_port = 0; - m_handle = NULL; + m_input_port = 0; + m_output_port = 0; + m_handle = NULL; - m_input_alignment = 0; - m_input_buffer_size = 0; - m_input_buffer_count = 0; + m_input_alignment = 0; + m_input_buffer_size = 0; + m_input_buffer_count = 0; - m_output_alignment = 0; - m_output_buffer_size = 0; - m_output_buffer_count = 0; - m_flush_input = false; - m_flush_output = false; - m_resource_error = false; + m_output_alignment = 0; + m_output_buffer_size = 0; + m_output_buffer_count = 0; + m_flush_input = false; + m_flush_output = false; + m_resource_error = false; - m_eos = false; + m_eos = false; - m_exit = false; + m_exit = false; - m_omx_input_use_buffers = false; - m_omx_output_use_buffers = false; + m_omx_input_use_buffers = false; + m_omx_output_use_buffers = false; - m_omx_events.clear(); - m_ignore_error = OMX_ErrorNone; + m_omx_events.clear(); + m_ignore_error = OMX_ErrorNone; - m_componentName = component_name; + m_componentName = component_name; - m_callbacks.EventHandler = &COMXCoreComponent::DecoderEventHandlerCallback; - m_callbacks.EmptyBufferDone = &COMXCoreComponent::DecoderEmptyBufferDoneCallback; - m_callbacks.FillBufferDone = &COMXCoreComponent::DecoderFillBufferDoneCallback; - - if (callbacks && callbacks->EventHandler) - m_callbacks.EventHandler = callbacks->EventHandler; - if (callbacks && callbacks->EmptyBufferDone) - m_callbacks.EmptyBufferDone = callbacks->EmptyBufferDone; - if (callbacks && callbacks->FillBufferDone) - m_callbacks.FillBufferDone = callbacks->FillBufferDone; - - // Get video component handle setting up callbacks, component is in loaded state on return. - if(!m_handle) - { + m_callbacks.EventHandler = &COMXCoreComponent::DecoderEventHandlerCallback; + m_callbacks.EmptyBufferDone = &COMXCoreComponent::DecoderEmptyBufferDoneCallback; + m_callbacks.FillBufferDone = &COMXCoreComponent::DecoderFillBufferDoneCallback; + + if (callbacks && callbacks->EventHandler) + m_callbacks.EventHandler = callbacks->EventHandler; + if (callbacks && callbacks->EmptyBufferDone) + m_callbacks.EmptyBufferDone = callbacks->EmptyBufferDone; + if (callbacks && callbacks->FillBufferDone) + m_callbacks.FillBufferDone = callbacks->FillBufferDone; + + // Get video component handle setting up callbacks, component is in loaded state on return. + if(!m_handle) + { #ifdef TARGET_LINUX - if (strncmp("OMX.alsa.", component_name.c_str(), 9) == 0) - omx_err = OMXALSA_GetHandle(&m_handle, (char*) component_name.c_str(), this, &m_callbacks); - else + if (strncmp("OMX.alsa.", component_name.c_str(), 9) == 0) + omx_err = OMXALSA_GetHandle(&m_handle, (char*) component_name.c_str(), this, &m_callbacks); + else #endif - omx_err = OMX_GetHandle(&m_handle, (char*)component_name.c_str(), this, &m_callbacks); - if (!m_handle || omx_err != OMX_ErrorNone) - { - CLog::Log(LOGERROR, "COMXCoreComponent::Initialize - could not get component handle for %s omx_err(0x%08x)\n", - component_name.c_str(), (int)omx_err); - Deinitialize(); - return false; + omx_err = OMX_GetHandle(&m_handle, (char*)component_name.c_str(), this, &m_callbacks); + if (!m_handle || omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreComponent::Initialize - could not get component handle for %s omx_err(0x%08x)\n", + component_name.c_str(), (int)omx_err); + Deinitialize(); + return false; + } } - } - OMX_PORT_PARAM_TYPE port_param; - OMX_INIT_STRUCTURE(port_param); + OMX_PORT_PARAM_TYPE port_param; + OMX_INIT_STRUCTURE(port_param); - omx_err = OMX_GetParameter(m_handle, index, &port_param); - if (omx_err != OMX_ErrorNone) - { - CLog::Log(LOGERROR, "COMXCoreComponent::Initialize - could not get port_param for component %s omx_err(0x%08x)\n", - component_name.c_str(), (int)omx_err); - } + omx_err = OMX_GetParameter(m_handle, index, &port_param); + if (omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreComponent::Initialize - could not get port_param for component %s omx_err(0x%08x)\n", + component_name.c_str(), (int)omx_err); + } - omx_err = DisableAllPorts(); - if (omx_err != OMX_ErrorNone) - { - CLog::Log(LOGERROR, "COMXCoreComponent::Initialize - error disable ports on component %s omx_err(0x%08x)\n", - component_name.c_str(), (int)omx_err); - } + omx_err = DisableAllPorts(); + if (omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreComponent::Initialize - error disable ports on component %s omx_err(0x%08x)\n", + component_name.c_str(), (int)omx_err); + } - m_input_port = port_param.nStartPortNumber; - m_output_port = m_input_port + 1; + m_input_port = port_param.nStartPortNumber; + m_output_port = m_input_port + 1; - if(m_componentName == "OMX.broadcom.audio_mixer") - { - m_input_port = port_param.nStartPortNumber + 1; - m_output_port = port_param.nStartPortNumber; - } + if(m_componentName == "OMX.broadcom.audio_mixer") + { + m_input_port = port_param.nStartPortNumber + 1; + m_output_port = port_param.nStartPortNumber; + } - if (m_output_port > port_param.nStartPortNumber+port_param.nPorts-1) - m_output_port = port_param.nStartPortNumber+port_param.nPorts-1; + if (m_output_port > port_param.nStartPortNumber+port_param.nPorts-1) + m_output_port = port_param.nStartPortNumber+port_param.nPorts-1; - CLog::Log(LOGDEBUG, "COMXCoreComponent::Initialize %s input port %d output port %d m_handle %p\n", - m_componentName.c_str(), m_input_port, m_output_port, m_handle); + CLog::Log(LOGDEBUG, "COMXCoreComponent::Initialize %s input port %d output port %d m_handle %p\n", + m_componentName.c_str(), m_input_port, m_output_port, m_handle); - m_exit = false; - m_flush_input = false; - m_flush_output = false; + m_exit = false; + m_flush_input = false; + m_flush_output = false; - return true; + return true; } void COMXCoreComponent::ResetEos() { - pthread_mutex_lock(&m_omx_eos_mutex); - m_eos = false; - pthread_mutex_unlock(&m_omx_eos_mutex); + pthread_mutex_lock(&m_omx_eos_mutex); + m_eos = false; + pthread_mutex_unlock(&m_omx_eos_mutex); } bool COMXCoreComponent::Deinitialize() { - OMX_ERRORTYPE omx_err; + OMX_ERRORTYPE omx_err; - m_exit = true; + m_exit = true; - m_flush_input = true; - m_flush_output = true; + m_flush_input = true; + m_flush_output = true; - if(m_handle) - { - FlushAll(); + if(m_handle) + { + FlushAll(); - FreeOutputBuffers(); - FreeInputBuffers(); + FreeOutputBuffers(); + FreeInputBuffers(); - TransitionToStateLoaded(); + TransitionToStateLoaded(); - CLog::Log(LOGDEBUG, "COMXCoreComponent::Deinitialize : %s handle %p\n", - m_componentName.c_str(), m_handle); + CLog::Log(LOGDEBUG, "COMXCoreComponent::Deinitialize : %s handle %p\n", + m_componentName.c_str(), m_handle); #ifdef TARGET_LINUX - if (strncmp("OMX.alsa.", m_componentName.c_str(), 9) == 0) - omx_err = OMXALSA_FreeHandle(m_handle); - else + if (strncmp("OMX.alsa.", m_componentName.c_str(), 9) == 0) + omx_err = OMXALSA_FreeHandle(m_handle); + else #endif - omx_err = OMX_FreeHandle(m_handle); - if (omx_err != OMX_ErrorNone) - { - CLog::Log(LOGERROR, "COMXCoreComponent::Deinitialize - failed to free handle for component %s omx_err(0x%08x)", - m_componentName.c_str(), omx_err); - } - m_handle = NULL; + omx_err = OMX_FreeHandle(m_handle); + if (omx_err != OMX_ErrorNone) + { + CLog::Log(LOGERROR, "COMXCoreComponent::Deinitialize - failed to free handle for component %s omx_err(0x%08x)", + m_componentName.c_str(), omx_err); + } + m_handle = NULL; - m_input_port = 0; - m_output_port = 0; - m_componentName = ""; - m_resource_error = false; - } + m_input_port = 0; + m_output_port = 0; + m_componentName = ""; + m_resource_error = false; + } - return true; + return true; } /////////////////////////////////////////////////////////////////////////////////////////// // DecoderEventHandler -- OMX event callback OMX_ERRORTYPE COMXCoreComponent::DecoderEventHandlerCallback( - OMX_HANDLETYPE hComponent, - OMX_PTR pAppData, - OMX_EVENTTYPE eEvent, - OMX_U32 nData1, - OMX_U32 nData2, - OMX_PTR pEventData) + OMX_HANDLETYPE hComponent, + OMX_PTR pAppData, + OMX_EVENTTYPE eEvent, + OMX_U32 nData1, + OMX_U32 nData2, + OMX_PTR pEventData) { - if(!pAppData) - return OMX_ErrorNone; + if(!pAppData) + return OMX_ErrorNone; - COMXCoreComponent *ctx = static_cast(pAppData); - return ctx->DecoderEventHandler(hComponent, eEvent, nData1, nData2, pEventData); + COMXCoreComponent *ctx = static_cast(pAppData); + return ctx->DecoderEventHandler(hComponent, eEvent, nData1, nData2, pEventData); } // DecoderEmptyBufferDone -- OMXCore input buffer has been emptied OMX_ERRORTYPE COMXCoreComponent::DecoderEmptyBufferDoneCallback( - OMX_HANDLETYPE hComponent, - OMX_PTR pAppData, - OMX_BUFFERHEADERTYPE* pBuffer) + OMX_HANDLETYPE hComponent, + OMX_PTR pAppData, + OMX_BUFFERHEADERTYPE* pBuffer) { - if(!pAppData) - return OMX_ErrorNone; + if(!pAppData) + return OMX_ErrorNone; - COMXCoreComponent *ctx = static_cast(pAppData); - return ctx->DecoderEmptyBufferDone( hComponent, pBuffer); + COMXCoreComponent *ctx = static_cast(pAppData); + return ctx->DecoderEmptyBufferDone( hComponent, pBuffer); } // DecoderFillBufferDone -- OMXCore output buffer has been filled OMX_ERRORTYPE COMXCoreComponent::DecoderFillBufferDoneCallback( - OMX_HANDLETYPE hComponent, - OMX_PTR pAppData, - OMX_BUFFERHEADERTYPE* pBuffer) + OMX_HANDLETYPE hComponent, + OMX_PTR pAppData, + OMX_BUFFERHEADERTYPE* pBuffer) { - if(!pAppData) - return OMX_ErrorNone; + if(!pAppData) + return OMX_ErrorNone; - COMXCoreComponent *ctx = static_cast(pAppData); - return ctx->DecoderFillBufferDone(hComponent, pBuffer); + COMXCoreComponent *ctx = static_cast(pAppData); + return ctx->DecoderFillBufferDone(hComponent, pBuffer); } OMX_ERRORTYPE COMXCoreComponent::DecoderEmptyBufferDone(OMX_HANDLETYPE hComponent, OMX_BUFFERHEADERTYPE* pBuffer) { - if(m_exit) - return OMX_ErrorNone; + if(m_exit) + return OMX_ErrorNone; - #if defined(OMX_DEBUG_EVENTHANDLER) - CLog::Log(LOGDEBUG, "COMXCoreComponent::DecoderEmptyBufferDone component(%s) %p %d/%d\n", m_componentName.c_str(), pBuffer, m_omx_input_avaliable.size(), m_input_buffer_count); - #endif - pthread_mutex_lock(&m_omx_input_mutex); - m_omx_input_avaliable.push(pBuffer); +#if defined(OMX_DEBUG_EVENTHANDLER) + CLog::Log(LOGDEBUG, "COMXCoreComponent::DecoderEmptyBufferDone component(%s) %p %d/%d\n", m_componentName.c_str(), pBuffer, m_omx_input_avaliable.size(), m_input_buffer_count); +#endif + pthread_mutex_lock(&m_omx_input_mutex); + m_omx_input_avaliable.push(pBuffer); - // this allows (all) blocked tasks to be awoken - pthread_cond_broadcast(&m_input_buffer_cond); + // this allows (all) blocked tasks to be awoken + pthread_cond_broadcast(&m_input_buffer_cond); - pthread_mutex_unlock(&m_omx_input_mutex); + pthread_mutex_unlock(&m_omx_input_mutex); - return OMX_ErrorNone; + return OMX_ErrorNone; } OMX_ERRORTYPE COMXCoreComponent::DecoderFillBufferDone(OMX_HANDLETYPE hComponent, OMX_BUFFERHEADERTYPE* pBuffer) { - if(m_exit) - return OMX_ErrorNone; + if(m_exit) + return OMX_ErrorNone; - if (0 == strcmp(m_componentName.c_str(),"OMX.broadcom.video_encode")) - { - if (NULL != m_enc_private_cb) + if (0 == strcmp(m_componentName.c_str(),"OMX.broadcom.video_encode")) { - m_enc_private_cb(pBuffer); - } + if (NULL != m_enc_private_cb) + { + m_enc_private_cb(pBuffer); + } - } + } - #if defined(OMX_DEBUG_EVENTHANDLER) - CLog::Log(LOGDEBUG, "COMXCoreComponent::DecoderFillBufferDone component(%s) %p %d/%d\n", m_componentName.c_str(), pBuffer, m_omx_output_available.size(), m_output_buffer_count); - #endif - pthread_mutex_lock(&m_omx_output_mutex); - m_omx_output_available.push(pBuffer); +#if defined(OMX_DEBUG_EVENTHANDLER) + CLog::Log(LOGDEBUG, "COMXCoreComponent::DecoderFillBufferDone component(%s) %p %d/%d\n", m_componentName.c_str(), pBuffer, m_omx_output_available.size(), m_output_buffer_count); +#endif + pthread_mutex_lock(&m_omx_output_mutex); + m_omx_output_available.push(pBuffer); - // this allows (all) blocked tasks to be awoken - pthread_cond_broadcast(&m_output_buffer_cond); + // this allows (all) blocked tasks to be awoken + pthread_cond_broadcast(&m_output_buffer_cond); - pthread_mutex_unlock(&m_omx_output_mutex); + pthread_mutex_unlock(&m_omx_output_mutex); - return OMX_ErrorNone; + return OMX_ErrorNone; } // DecoderEmptyBufferDone -- OMXCore input buffer has been emptied //////////////////////////////////////////////////////////////////////////////////////////// // Component event handler -- OMX event callback OMX_ERRORTYPE COMXCoreComponent::DecoderEventHandler( - OMX_HANDLETYPE hComponent, - OMX_EVENTTYPE eEvent, - OMX_U32 nData1, - OMX_U32 nData2, - OMX_PTR pEventData) + OMX_HANDLETYPE hComponent, + OMX_EVENTTYPE eEvent, + OMX_U32 nData1, + OMX_U32 nData2, + OMX_PTR pEventData) { #ifdef OMX_DEBUG_EVENTS - CLog::Log(LOGDEBUG, - "COMXCoreComponent::%s - %s eEvent(0x%x), nData1(0x%x), nData2(0x%x), pEventData(0x%p)\n", - __func__, GetName().c_str(), eEvent, nData1, nData2, pEventData); + CLog::Log(LOGDEBUG, + "COMXCoreComponent::%s - %s eEvent(0x%x), nData1(0x%x), nData2(0x%x), pEventData(0x%p)\n", + __func__, GetName().c_str(), eEvent, nData1, nData2, pEventData); #endif - // if the error is expected, then we can skip it - if (eEvent == OMX_EventError && (OMX_S32)nData1 == m_ignore_error) - { - CLog::Log(LOGDEBUG, - "COMXCoreComponent::%s - %s Ignoring expected event: eEvent(0x%x), nData1(0x%x), nData2(0x%x), pEventData(0x%p)\n", - __func__, GetName().c_str(), eEvent, nData1, nData2, pEventData); - m_ignore_error = OMX_ErrorNone; - return OMX_ErrorNone; - } - AddEvent(eEvent, nData1, nData2); + // if the error is expected, then we can skip it + if (eEvent == OMX_EventError && (OMX_S32)nData1 == m_ignore_error) + { + CLog::Log(LOGDEBUG, + "COMXCoreComponent::%s - %s Ignoring expected event: eEvent(0x%x), nData1(0x%x), nData2(0x%x), pEventData(0x%p)\n", + __func__, GetName().c_str(), eEvent, nData1, nData2, pEventData); + m_ignore_error = OMX_ErrorNone; + return OMX_ErrorNone; + } + AddEvent(eEvent, nData1, nData2); - switch (eEvent) - { + switch (eEvent) + { case OMX_EventCmdComplete: - switch(nData1) - { + switch(nData1) + { case OMX_CommandStateSet: - switch ((int)nData2) - { + switch ((int)nData2) + { case OMX_StateInvalid: - #if defined(OMX_DEBUG_EVENTHANDLER) - CLog::Log(LOGDEBUG, "%s::%s %s - OMX_StateInvalid\n", CLASSNAME, __func__, GetName().c_str()); - #endif - break; +#if defined(OMX_DEBUG_EVENTHANDLER) + CLog::Log(LOGDEBUG, "%s::%s %s - OMX_StateInvalid\n", CLASSNAME, __func__, GetName().c_str()); +#endif + break; case OMX_StateLoaded: - #if defined(OMX_DEBUG_EVENTHANDLER) - CLog::Log(LOGDEBUG, "%s::%s %s - OMX_StateLoaded\n", CLASSNAME, __func__, GetName().c_str()); - #endif - break; +#if defined(OMX_DEBUG_EVENTHANDLER) + CLog::Log(LOGDEBUG, "%s::%s %s - OMX_StateLoaded\n", CLASSNAME, __func__, GetName().c_str()); +#endif + break; case OMX_StateIdle: - #if defined(OMX_DEBUG_EVENTHANDLER) - CLog::Log(LOGDEBUG, "%s::%s %s - OMX_StateIdle\n", CLASSNAME, __func__, GetName().c_str()); - #endif - break; +#if defined(OMX_DEBUG_EVENTHANDLER) + CLog::Log(LOGDEBUG, "%s::%s %s - OMX_StateIdle\n", CLASSNAME, __func__, GetName().c_str()); +#endif + break; case OMX_StateExecuting: - #if defined(OMX_DEBUG_EVENTHANDLER) - CLog::Log(LOGDEBUG, "%s::%s %s - OMX_StateExecuting\n", CLASSNAME, __func__, GetName().c_str()); - #endif - break; +#if defined(OMX_DEBUG_EVENTHANDLER) + CLog::Log(LOGDEBUG, "%s::%s %s - OMX_StateExecuting\n", CLASSNAME, __func__, GetName().c_str()); +#endif + break; case OMX_StatePause: - #if defined(OMX_DEBUG_EVENTHANDLER) - CLog::Log(LOGDEBUG, "%s::%s %s - OMX_StatePause\n", CLASSNAME, __func__, GetName().c_str()); - #endif - break; +#if defined(OMX_DEBUG_EVENTHANDLER) + CLog::Log(LOGDEBUG, "%s::%s %s - OMX_StatePause\n", CLASSNAME, __func__, GetName().c_str()); +#endif + break; case OMX_StateWaitForResources: - #if defined(OMX_DEBUG_EVENTHANDLER) - CLog::Log(LOGDEBUG, "%s::%s %s - OMX_StateWaitForResources\n", CLASSNAME, __func__, GetName().c_str()); - #endif - break; +#if defined(OMX_DEBUG_EVENTHANDLER) + CLog::Log(LOGDEBUG, "%s::%s %s - OMX_StateWaitForResources\n", CLASSNAME, __func__, GetName().c_str()); +#endif + break; default: - #if defined(OMX_DEBUG_EVENTHANDLER) - CLog::Log(LOGDEBUG, - "%s::%s %s - Unknown OMX_Statexxxxx, state(%d)\n", CLASSNAME, __func__, GetName().c_str(), (int)nData2); - #endif +#if defined(OMX_DEBUG_EVENTHANDLER) + CLog::Log(LOGDEBUG, + "%s::%s %s - Unknown OMX_Statexxxxx, state(%d)\n", CLASSNAME, __func__, GetName().c_str(), (int)nData2); +#endif + break; + } break; - } - break; case OMX_CommandFlush: - #if defined(OMX_DEBUG_EVENTHANDLER) - CLog::Log(LOGDEBUG, "%s::%s %s - OMX_CommandFlush, port %d\n", CLASSNAME, __func__, GetName().c_str(), (int)nData2); - #endif - break; +#if defined(OMX_DEBUG_EVENTHANDLER) + CLog::Log(LOGDEBUG, "%s::%s %s - OMX_CommandFlush, port %d\n", CLASSNAME, __func__, GetName().c_str(), (int)nData2); +#endif + break; case OMX_CommandPortDisable: - #if defined(OMX_DEBUG_EVENTHANDLER) - CLog::Log(LOGDEBUG, "%s::%s %s - OMX_CommandPortDisable, nData1(0x%x), port %d\n", CLASSNAME, __func__, GetName().c_str(), nData1, (int)nData2); - #endif - break; +#if defined(OMX_DEBUG_EVENTHANDLER) + CLog::Log(LOGDEBUG, "%s::%s %s - OMX_CommandPortDisable, nData1(0x%x), port %d\n", CLASSNAME, __func__, GetName().c_str(), nData1, (int)nData2); +#endif + break; case OMX_CommandPortEnable: - #if defined(OMX_DEBUG_EVENTHANDLER) - CLog::Log(LOGDEBUG, "%s::%s %s - OMX_CommandPortEnable, nData1(0x%x), port %d\n", CLASSNAME, __func__, GetName().c_str(), nData1, (int)nData2); - #endif - break; - #if defined(OMX_DEBUG_EVENTHANDLER) +#if defined(OMX_DEBUG_EVENTHANDLER) + CLog::Log(LOGDEBUG, "%s::%s %s - OMX_CommandPortEnable, nData1(0x%x), port %d\n", CLASSNAME, __func__, GetName().c_str(), nData1, (int)nData2); +#endif + break; +#if defined(OMX_DEBUG_EVENTHANDLER) case OMX_CommandMarkBuffer: - CLog::Log(LOGDEBUG, "%s::%s %s - OMX_CommandMarkBuffer, nData1(0x%x), port %d\n", CLASSNAME, __func__, GetName().c_str(), nData1, (int)nData2); + CLog::Log(LOGDEBUG, "%s::%s %s - OMX_CommandMarkBuffer, nData1(0x%x), port %d\n", CLASSNAME, __func__, GetName().c_str(), nData1, (int)nData2); + break; +#endif + } break; - #endif - } - break; case OMX_EventBufferFlag: - #if defined(OMX_DEBUG_EVENTHANDLER) - CLog::Log(LOGDEBUG, "%s::%s %s - OMX_EventBufferFlag(input)\n", CLASSNAME, __func__, GetName().c_str()); - #endif - if(nData2 & OMX_BUFFERFLAG_EOS) - { - pthread_mutex_lock(&m_omx_eos_mutex); - m_eos = true; - pthread_mutex_unlock(&m_omx_eos_mutex); - } - break; +#if defined(OMX_DEBUG_EVENTHANDLER) + CLog::Log(LOGDEBUG, "%s::%s %s - OMX_EventBufferFlag(input)\n", CLASSNAME, __func__, GetName().c_str()); +#endif + if(nData2 & OMX_BUFFERFLAG_EOS) + { + pthread_mutex_lock(&m_omx_eos_mutex); + m_eos = true; + pthread_mutex_unlock(&m_omx_eos_mutex); + } + break; case OMX_EventPortSettingsChanged: - #if defined(OMX_DEBUG_EVENTHANDLER) - CLog::Log(LOGDEBUG, "%s::%s %s - OMX_EventPortSettingsChanged(output)\n", CLASSNAME, __func__, GetName().c_str()); - #endif - break; +#if defined(OMX_DEBUG_EVENTHANDLER) + CLog::Log(LOGDEBUG, "%s::%s %s - OMX_EventPortSettingsChanged(output)\n", CLASSNAME, __func__, GetName().c_str()); +#endif + break; case OMX_EventParamOrConfigChanged: - #if defined(OMX_DEBUG_EVENTHANDLER) - CLog::Log(LOGDEBUG, "%s::%s %s - OMX_EventParamOrConfigChanged(output)\n", CLASSNAME, __func__, GetName().c_str()); - #endif - break; - #if defined(OMX_DEBUG_EVENTHANDLER) +#if defined(OMX_DEBUG_EVENTHANDLER) + CLog::Log(LOGDEBUG, "%s::%s %s - OMX_EventParamOrConfigChanged(output)\n", CLASSNAME, __func__, GetName().c_str()); +#endif + break; +#if defined(OMX_DEBUG_EVENTHANDLER) case OMX_EventMark: - CLog::Log(LOGDEBUG, "%s::%s %s - OMX_EventMark\n", CLASSNAME, __func__, GetName().c_str()); - break; + CLog::Log(LOGDEBUG, "%s::%s %s - OMX_EventMark\n", CLASSNAME, __func__, GetName().c_str()); + break; case OMX_EventResourcesAcquired: - CLog::Log(LOGDEBUG, "%s::%s %s- OMX_EventResourcesAcquired\n", CLASSNAME, __func__, GetName().c_str()); - break; - #endif + CLog::Log(LOGDEBUG, "%s::%s %s- OMX_EventResourcesAcquired\n", CLASSNAME, __func__, GetName().c_str()); + break; +#endif case OMX_EventError: - switch((OMX_S32)nData1) - { + switch((OMX_S32)nData1) + { case OMX_ErrorSameState: - //#if defined(OMX_DEBUG_EVENTHANDLER) - //CLog::Log(LOGERROR, "%s::%s %s - OMX_ErrorSameState, same state\n", CLASSNAME, __func__, GetName().c_str()); - //#endif - break; + //#if defined(OMX_DEBUG_EVENTHANDLER) + //CLog::Log(LOGERROR, "%s::%s %s - OMX_ErrorSameState, same state\n", CLASSNAME, __func__, GetName().c_str()); + //#endif + break; case OMX_ErrorInsufficientResources: - CLog::Log(LOGERROR, "%s::%s %s - OMX_ErrorInsufficientResources, insufficient resources\n", CLASSNAME, __func__, GetName().c_str()); - m_resource_error = true; - break; + CLog::Log(LOGERROR, "%s::%s %s - OMX_ErrorInsufficientResources, insufficient resources\n", CLASSNAME, __func__, GetName().c_str()); + m_resource_error = true; + break; case OMX_ErrorFormatNotDetected: - CLog::Log(LOGERROR, "%s::%s %s - OMX_ErrorFormatNotDetected, cannot parse input stream\n", CLASSNAME, __func__, GetName().c_str()); - break; + CLog::Log(LOGERROR, "%s::%s %s - OMX_ErrorFormatNotDetected, cannot parse input stream\n", CLASSNAME, __func__, GetName().c_str()); + break; case OMX_ErrorPortUnpopulated: - CLog::Log(LOGWARNING, "%s::%s %s - OMX_ErrorPortUnpopulated port %d\n", CLASSNAME, __func__, GetName().c_str(), (int)nData2); - break; + CLog::Log(LOGWARNING, "%s::%s %s - OMX_ErrorPortUnpopulated port %d\n", CLASSNAME, __func__, GetName().c_str(), (int)nData2); + break; case OMX_ErrorStreamCorrupt: - CLog::Log(LOGERROR, "%s::%s %s - OMX_ErrorStreamCorrupt, Bitstream corrupt\n", CLASSNAME, __func__, GetName().c_str()); - m_resource_error = true; - break; + CLog::Log(LOGERROR, "%s::%s %s - OMX_ErrorStreamCorrupt, Bitstream corrupt\n", CLASSNAME, __func__, GetName().c_str()); + m_resource_error = true; + break; case OMX_ErrorUnsupportedSetting: - CLog::Log(LOGERROR, "%s::%s %s - OMX_ErrorUnsupportedSetting, unsupported setting\n", CLASSNAME, __func__, GetName().c_str()); - break; + CLog::Log(LOGERROR, "%s::%s %s - OMX_ErrorUnsupportedSetting, unsupported setting\n", CLASSNAME, __func__, GetName().c_str()); + break; default: - CLog::Log(LOGERROR, "%s::%s %s - OMX_EventError detected, nData1(0x%x), port %d\n", CLASSNAME, __func__, GetName().c_str(), nData1, (int)nData2); + CLog::Log(LOGERROR, "%s::%s %s - OMX_EventError detected, nData1(0x%x), port %d\n", CLASSNAME, __func__, GetName().c_str(), nData1, (int)nData2); + break; + } + // wake things up + if (m_resource_error) + { + pthread_cond_broadcast(&m_output_buffer_cond); + pthread_cond_broadcast(&m_input_buffer_cond); + pthread_cond_broadcast(&m_omx_event_cond); + } break; - } - // wake things up - if (m_resource_error) - { - pthread_cond_broadcast(&m_output_buffer_cond); - pthread_cond_broadcast(&m_input_buffer_cond); - pthread_cond_broadcast(&m_omx_event_cond); - } - break; default: - CLog::Log(LOGWARNING, "%s::%s %s - Unknown eEvent(0x%x), nData1(0x%x), port %d\n", CLASSNAME, __func__, GetName().c_str(), eEvent, nData1, (int)nData2); - break; - } - - return OMX_ErrorNone; -} - -//////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////// -COMXCore::COMXCore() -{ - m_is_open = false; -} - -COMXCore::~COMXCore() -{ -} - -bool COMXCore::Initialize() -{ - - OMX_ERRORTYPE omx_err = OMX_Init(); - if (omx_err != OMX_ErrorNone) - { - CLog::Log(LOGERROR, "COMXCore::Initialize - OMXCore failed to init, omx_err(0x%08x)", omx_err); - return false; - } - - m_is_open = true; - return true; -} + CLog::Log(LOGWARNING, "%s::%s %s - Unknown eEvent(0x%x), nData1(0x%x), port %d\n", CLASSNAME, __func__, GetName().c_str(), eEvent, nData1, (int)nData2); + break; + } -void COMXCore::Deinitialize() -{ - if(m_is_open) - { - OMX_ERRORTYPE omx_err = OMX_Deinit(); - if (omx_err != OMX_ErrorNone) - { - CLog::Log(LOGERROR, "COMXCore::Deinitialize - OMXCore failed to deinit, omx_err(0x%08x)", omx_err); - } - } + return OMX_ErrorNone; } #endif diff --git a/OMXCore.h b/OMXCore.h index 777c7b9..1e5f307 100644 --- a/OMXCore.h +++ b/OMXCore.h @@ -29,7 +29,12 @@ #define OMX_SKIP64BIT #endif -#include "DllOMX.h" +#include +#include +#include +#include +#include +#include #include @@ -40,23 +45,22 @@ #define OMX_DEBUG_EVENTHANDLER #endif -#define OMX_INIT_STRUCTURE(a) \ - memset(&(a), 0, sizeof(a)); \ - (a).nSize = sizeof(a); \ - (a).nVersion.s.nVersionMajor = OMX_VERSION_MAJOR; \ - (a).nVersion.s.nVersionMinor = OMX_VERSION_MINOR; \ - (a).nVersion.s.nRevision = OMX_VERSION_REVISION; \ - (a).nVersion.s.nStep = OMX_VERSION_STEP +#define OMX_INIT_STRUCTURE(a) \ + memset(&(a), 0, sizeof(a)); \ + (a).nSize = sizeof(a); \ + (a).nVersion.s.nVersionMajor = OMX_VERSION_MAJOR; \ + (a).nVersion.s.nVersionMinor = OMX_VERSION_MINOR; \ + (a).nVersion.s.nRevision = OMX_VERSION_REVISION; \ + (a).nVersion.s.nStep = OMX_VERSION_STEP #define OMX_MAX_PORTS 10 typedef struct omx_event { - OMX_EVENTTYPE eEvent; - OMX_U32 nData1; - OMX_U32 nData2; + OMX_EVENTTYPE eEvent; + OMX_U32 nData1; + OMX_U32 nData2; } omx_event; -class COMXCore; class COMXCoreComponent; class COMXCoreTunel; class COMXCoreClock; @@ -64,20 +68,19 @@ class COMXCoreClock; class COMXCoreTunel { public: - COMXCoreTunel(); - ~COMXCoreTunel(); + COMXCoreTunel(); + ~COMXCoreTunel(); - void Initialize(COMXCoreComponent *src_component, unsigned int src_port, COMXCoreComponent *dst_component, unsigned int dst_port); - bool IsInitialized() const { return m_tunnel_set; } - OMX_ERRORTYPE Deestablish(bool noWait = false); - OMX_ERRORTYPE Establish(bool enable_ports = true, bool disable_ports = false); + void Initialize(COMXCoreComponent *src_component, unsigned int src_port, COMXCoreComponent *dst_component, unsigned int dst_port); + bool IsInitialized() const { return m_tunnel_set; } + OMX_ERRORTYPE Deestablish(bool noWait = false); + OMX_ERRORTYPE Establish(bool enable_ports = true, bool disable_ports = false); private: - COMXCoreComponent *m_src_component; - COMXCoreComponent *m_dst_component; - unsigned int m_src_port; - unsigned int m_dst_port; - DllOMX *m_DllOMX; - bool m_tunnel_set; + COMXCoreComponent *m_src_component; + COMXCoreComponent *m_dst_component; + unsigned int m_src_port; + unsigned int m_dst_port; + bool m_tunnel_set; }; typedef void (*enc_done_cbk) (OMX_BUFFERHEADERTYPE* pBuffer); @@ -85,141 +88,126 @@ typedef void (*enc_done_cbk) (OMX_BUFFERHEADERTYPE* pBuffer); class COMXCoreComponent { public: - COMXCoreComponent(); - ~COMXCoreComponent(); - - OMX_HANDLETYPE GetComponent() const { return m_handle; } - unsigned int GetInputPort() const { return m_input_port; } - unsigned int GetOutputPort() const { return m_output_port; } - std::string GetName() const { return m_componentName; } - - OMX_ERRORTYPE DisableAllPorts(); - void RemoveEvent(OMX_EVENTTYPE eEvent, OMX_U32 nData1, OMX_U32 nData2); - OMX_ERRORTYPE AddEvent(OMX_EVENTTYPE eEvent, OMX_U32 nData1, OMX_U32 nData2); - OMX_ERRORTYPE WaitForEvent(OMX_EVENTTYPE event, long timeout = 300); - OMX_ERRORTYPE WaitForCommand(OMX_U32 command, OMX_U32 nData2, long timeout = 2000); - OMX_ERRORTYPE SetStateForComponent(OMX_STATETYPE state); - OMX_STATETYPE GetState() const; - OMX_ERRORTYPE SetParameter(OMX_INDEXTYPE paramIndex, OMX_PTR paramStruct); - OMX_ERRORTYPE GetParameter(OMX_INDEXTYPE paramIndex, OMX_PTR paramStruct) const; - OMX_ERRORTYPE SetConfig(OMX_INDEXTYPE configIndex, OMX_PTR configStruct); - OMX_ERRORTYPE GetConfig(OMX_INDEXTYPE configIndex, OMX_PTR configStruct) const; - OMX_ERRORTYPE SendCommand(OMX_COMMANDTYPE cmd, OMX_U32 cmdParam, OMX_PTR cmdParamData); - OMX_ERRORTYPE EnablePort(unsigned int port, bool wait = true); - OMX_ERRORTYPE DisablePort(unsigned int port, bool wait = true); - OMX_ERRORTYPE UseEGLImage(OMX_BUFFERHEADERTYPE** ppBufferHdr, OMX_U32 nPortIndex, OMX_PTR pAppPrivate, void* eglImage); - void SetPrivateCallBack(enc_done_cbk cb); - - bool Initialize( const std::string &component_name, OMX_INDEXTYPE index, OMX_CALLBACKTYPE *callbacks = NULL); - bool IsInitialized() const { return m_handle != NULL; } - bool Deinitialize(); - - // OMXCore Decoder delegate callback routines. - static OMX_ERRORTYPE DecoderEventHandlerCallback(OMX_HANDLETYPE hComponent, OMX_PTR pAppData, - OMX_EVENTTYPE eEvent, OMX_U32 nData1, OMX_U32 nData2, OMX_PTR pEventData); - static OMX_ERRORTYPE DecoderEmptyBufferDoneCallback( - OMX_HANDLETYPE hComponent, OMX_PTR pAppData, OMX_BUFFERHEADERTYPE* pBuffer); - static OMX_ERRORTYPE DecoderFillBufferDoneCallback( - OMX_HANDLETYPE hComponent, OMX_PTR pAppData, OMX_BUFFERHEADERTYPE* pBufferHeader); - - // OMXCore decoder callback routines. - OMX_ERRORTYPE DecoderEventHandler(OMX_HANDLETYPE hComponent, - OMX_EVENTTYPE eEvent, OMX_U32 nData1, OMX_U32 nData2, OMX_PTR pEventData); - OMX_ERRORTYPE DecoderEmptyBufferDone( - OMX_HANDLETYPE hComponent, OMX_BUFFERHEADERTYPE* pBuffer); - OMX_ERRORTYPE DecoderFillBufferDone( - OMX_HANDLETYPE hComponent, OMX_BUFFERHEADERTYPE* pBuffer); - - void TransitionToStateLoaded(); - - OMX_ERRORTYPE EmptyThisBuffer(OMX_BUFFERHEADERTYPE *omx_buffer); - OMX_ERRORTYPE FillThisBuffer(OMX_BUFFERHEADERTYPE *omx_buffer); - OMX_ERRORTYPE FreeOutputBuffer(OMX_BUFFERHEADERTYPE *omx_buffer); - - unsigned int GetInputBufferSize() const { return m_input_buffer_count * m_input_buffer_size; } - unsigned int GetOutputBufferSize() const { return m_output_buffer_count * m_output_buffer_size; } - - unsigned int GetInputBufferSpace() const { return m_omx_input_avaliable.size() * m_input_buffer_size; } - unsigned int GetOutputBufferSpace() const { return m_omx_output_available.size() * m_output_buffer_size; } - - void FlushAll(); - void FlushInput(); - void FlushOutput(); - - OMX_BUFFERHEADERTYPE *GetInputBuffer(long timeout=200); - OMX_BUFFERHEADERTYPE *GetOutputBuffer(long timeout=200); - - OMX_ERRORTYPE AllocInputBuffers(bool use_buffers = false); - OMX_ERRORTYPE AllocOutputBuffers(bool use_buffers = false); - - OMX_ERRORTYPE FreeInputBuffers(); - OMX_ERRORTYPE FreeOutputBuffers(); - - OMX_ERRORTYPE WaitForInputDone(long timeout=200); - OMX_ERRORTYPE WaitForOutputDone(long timeout=200); - - bool IsEOS() const { return m_eos; } - bool BadState() const { return m_resource_error; } - void ResetEos(); - void IgnoreNextError(OMX_S32 error) { m_ignore_error = error; } + COMXCoreComponent(); + ~COMXCoreComponent(); + + OMX_HANDLETYPE GetComponent() const { return m_handle; } + unsigned int GetInputPort() const { return m_input_port; } + unsigned int GetOutputPort() const { return m_output_port; } + std::string GetName() const { return m_componentName; } + + OMX_ERRORTYPE DisableAllPorts(); + void RemoveEvent(OMX_EVENTTYPE eEvent, OMX_U32 nData1, OMX_U32 nData2); + OMX_ERRORTYPE AddEvent(OMX_EVENTTYPE eEvent, OMX_U32 nData1, OMX_U32 nData2); + OMX_ERRORTYPE WaitForEvent(OMX_EVENTTYPE event, long timeout = 300); + OMX_ERRORTYPE WaitForCommand(OMX_U32 command, OMX_U32 nData2, long timeout = 2000); + OMX_ERRORTYPE SetStateForComponent(OMX_STATETYPE state); + OMX_STATETYPE GetState() const; + OMX_ERRORTYPE SetParameter(OMX_INDEXTYPE paramIndex, OMX_PTR paramStruct); + OMX_ERRORTYPE GetParameter(OMX_INDEXTYPE paramIndex, OMX_PTR paramStruct) const; + OMX_ERRORTYPE SetConfig(OMX_INDEXTYPE configIndex, OMX_PTR configStruct); + OMX_ERRORTYPE GetConfig(OMX_INDEXTYPE configIndex, OMX_PTR configStruct) const; + OMX_ERRORTYPE SendCommand(OMX_COMMANDTYPE cmd, OMX_U32 cmdParam, OMX_PTR cmdParamData); + OMX_ERRORTYPE EnablePort(unsigned int port, bool wait = true); + OMX_ERRORTYPE DisablePort(unsigned int port, bool wait = true); + OMX_ERRORTYPE UseEGLImage(OMX_BUFFERHEADERTYPE** ppBufferHdr, OMX_U32 nPortIndex, OMX_PTR pAppPrivate, void* eglImage); + void SetPrivateCallBack(enc_done_cbk cb); + + bool Initialize( const std::string &component_name, OMX_INDEXTYPE index, OMX_CALLBACKTYPE *callbacks = NULL); + bool IsInitialized() const { return m_handle != NULL; } + bool Deinitialize(); + + // OMXCore Decoder delegate callback routines. + static OMX_ERRORTYPE DecoderEventHandlerCallback(OMX_HANDLETYPE hComponent, OMX_PTR pAppData, + OMX_EVENTTYPE eEvent, OMX_U32 nData1, OMX_U32 nData2, OMX_PTR pEventData); + static OMX_ERRORTYPE DecoderEmptyBufferDoneCallback( + OMX_HANDLETYPE hComponent, OMX_PTR pAppData, OMX_BUFFERHEADERTYPE* pBuffer); + static OMX_ERRORTYPE DecoderFillBufferDoneCallback( + OMX_HANDLETYPE hComponent, OMX_PTR pAppData, OMX_BUFFERHEADERTYPE* pBufferHeader); + + // OMXCore decoder callback routines. + OMX_ERRORTYPE DecoderEventHandler(OMX_HANDLETYPE hComponent, + OMX_EVENTTYPE eEvent, OMX_U32 nData1, OMX_U32 nData2, OMX_PTR pEventData); + OMX_ERRORTYPE DecoderEmptyBufferDone( + OMX_HANDLETYPE hComponent, OMX_BUFFERHEADERTYPE* pBuffer); + OMX_ERRORTYPE DecoderFillBufferDone( + OMX_HANDLETYPE hComponent, OMX_BUFFERHEADERTYPE* pBuffer); + + void TransitionToStateLoaded(); + + OMX_ERRORTYPE EmptyThisBuffer(OMX_BUFFERHEADERTYPE *omx_buffer); + OMX_ERRORTYPE FillThisBuffer(OMX_BUFFERHEADERTYPE *omx_buffer); + OMX_ERRORTYPE FreeOutputBuffer(OMX_BUFFERHEADERTYPE *omx_buffer); + + unsigned int GetInputBufferSize() const { return m_input_buffer_count * m_input_buffer_size; } + unsigned int GetOutputBufferSize() const { return m_output_buffer_count * m_output_buffer_size; } + + unsigned int GetInputBufferSpace() const { return m_omx_input_avaliable.size() * m_input_buffer_size; } + unsigned int GetOutputBufferSpace() const { return m_omx_output_available.size() * m_output_buffer_size; } + + void FlushAll(); + void FlushInput(); + void FlushOutput(); + + OMX_BUFFERHEADERTYPE *GetInputBuffer(long timeout=200); + OMX_BUFFERHEADERTYPE *GetOutputBuffer(long timeout=200); + + OMX_ERRORTYPE AllocInputBuffers(bool use_buffers = false); + OMX_ERRORTYPE AllocOutputBuffers(bool use_buffers = false); + + OMX_ERRORTYPE FreeInputBuffers(); + OMX_ERRORTYPE FreeOutputBuffers(); + + OMX_ERRORTYPE WaitForInputDone(long timeout=200); + OMX_ERRORTYPE WaitForOutputDone(long timeout=200); + + bool IsEOS() const { return m_eos; } + bool BadState() const { return m_resource_error; } + void ResetEos(); + void IgnoreNextError(OMX_S32 error) { m_ignore_error = error; } private: - OMX_HANDLETYPE m_handle; - unsigned int m_input_port; - unsigned int m_output_port; - std::string m_componentName; - pthread_mutex_t m_omx_event_mutex; - pthread_mutex_t m_omx_eos_mutex; - std::vector m_omx_events; - OMX_S32 m_ignore_error; - - OMX_CALLBACKTYPE m_callbacks; - - // OMXCore input buffers (demuxer packets) - pthread_mutex_t m_omx_input_mutex; - std::queue m_omx_input_avaliable; - std::vector m_omx_input_buffers; - unsigned int m_input_alignment; - unsigned int m_input_buffer_size; - unsigned int m_input_buffer_count; - bool m_omx_input_use_buffers; - - // OMXCore output buffers (video frames) - pthread_mutex_t m_omx_output_mutex; - std::queue m_omx_output_available; - std::vector m_omx_output_buffers; - unsigned int m_output_alignment; - unsigned int m_output_buffer_size; - unsigned int m_output_buffer_count; - bool m_omx_output_use_buffers; - - bool m_exit; - pthread_cond_t m_input_buffer_cond; - pthread_cond_t m_output_buffer_cond; - pthread_cond_t m_omx_event_cond; - bool m_eos; - bool m_flush_input; - bool m_flush_output; - bool m_resource_error; - //Only for encoder - enc_done_cbk m_enc_private_cb; + OMX_HANDLETYPE m_handle; + unsigned int m_input_port; + unsigned int m_output_port; + std::string m_componentName; + pthread_mutex_t m_omx_event_mutex; + pthread_mutex_t m_omx_eos_mutex; + std::vector m_omx_events; + OMX_S32 m_ignore_error; + + OMX_CALLBACKTYPE m_callbacks; + + // OMXCore input buffers (demuxer packets) + pthread_mutex_t m_omx_input_mutex; + std::queue m_omx_input_avaliable; + std::vector m_omx_input_buffers; + unsigned int m_input_alignment; + unsigned int m_input_buffer_size; + unsigned int m_input_buffer_count; + bool m_omx_input_use_buffers; + + // OMXCore output buffers (video frames) + pthread_mutex_t m_omx_output_mutex; + std::queue m_omx_output_available; + std::vector m_omx_output_buffers; + unsigned int m_output_alignment; + unsigned int m_output_buffer_size; + unsigned int m_output_buffer_count; + bool m_omx_output_use_buffers; + + bool m_exit; + pthread_cond_t m_input_buffer_cond; + pthread_cond_t m_output_buffer_cond; + pthread_cond_t m_omx_event_cond; + bool m_eos; + bool m_flush_input; + bool m_flush_output; + bool m_resource_error; + //Only for encoder + enc_done_cbk m_enc_private_cb; }; -class COMXCore -{ -public: - COMXCore(); - ~COMXCore(); - - // initialize OMXCore and get decoder component - bool Initialize(); - void Deinitialize(); - DllOMX *GetDll() { return m_DllOMX; } - -protected: - bool m_is_open; - DllOMX *m_DllOMX; -}; #endif diff --git a/omxtranscoder.cpp b/omxtranscoder.cpp index 5a89647..f236988 100644 --- a/omxtranscoder.cpp +++ b/omxtranscoder.cpp @@ -55,7 +55,6 @@ extern "C" { #include "OMXReader.h" #include "OMXTranscoderVideo.h" #include "OMXMuxer.h" -#include "DllOMX.h" #include "Srt.h" #include "utils/Strprintf.h"