본문 바로가기

프로그래밍/Android

OpenCore Codec 연동

 

 

안드로이드 플랫폼의 코덱은 패킷비디오사의 opencore 플랫폼으로 구현되어

있고, 코덱 연동을 위해 openmax il 인터페이스 규약을 사용한다.

 

이전에 포스팅한 오픈맥스 코덱연동은

오픈코어 프레임워크상에서 오픈맥스를 구현하는 내용을 다루고 있었다.

 

단순 코덱만을 연동하고자 할때, 굳이 오픈코어 플랫폼 위에서 오픈맥스를

사용해야 하는 것은 아니다. 그러기 위해서 openmax il이 존재하는 것이니...

(oscl, pv_omx 등 신경쓸것이 많이지기도 한다..)

 

코덱만을 동적 로드해 연동하는것은 OpenCore와 분리해 적용하기는 불가능하다.

각 코덱도 몇가지 인터페이스를 노출하고 있기는 하지만 oscl_uuid 와 같은 특정 값을 통해

로드되도록 이루어져 있기 때문이다.

 

OpenCore를 배제하기 위해서는 OpenCore에서 제공하는 라이브러리 중에

OpenMAX IL Core 인터페이스가 존재하는지 살펴 보아야 한다.

 

코덱 벤더가 코덱을 만들어 openmax il로 붙이기 위해서는 해당 코덱 컴포넌트를 로드할 수 있도록

Core 인터페이스배포해야 하는데, 오픈코어 역시 해당 인터페이스를 구현해 놓았고,

아래 소스가 그 내용이다

android/external/opencore/codecs_v2/omx/omx_common/src/pv_omxcore.cpp

 

잘 살펴보면 일전 포스트에서 코덱 컴포넌트를 설정하기 위한 OMX_Master 어쩌구 류의

메쏘드들이 보이고, 그 아래로 보고 싶었던 openmax il 인터페이스들이 보인다.

 

#ifdef __cplusplus

extern "C"

{

#endif

 

    OSCL_IMPORT_REF OMX_ERRORTYPE OMX_GetComponentsOfRole(

        OMX_IN      OMX_STRING role,

        OMX_INOUT   OMX_U32 *pNumComps,

        OMX_INOUT   OMX_U8  **compNames);

 

    OSCL_IMPORT_REF OMX_ERRORTYPE OMX_APIENTRY OMX_ComponentNameEnum(

        OMX_OUT OMX_STRING cComponentName,

        OMX_IN  OMX_U32 nNameLength,

        OMX_IN  OMX_U32 nIndex);

 

    OSCL_IMPORT_REF OMX_ERRORTYPE OMX_APIENTRY OMX_FreeHandle(OMX_IN OMX_HANDLETYPE hComponent);

 

    OSCL_IMPORT_REF OMX_ERRORTYPE OMX_APIENTRY OMX_GetHandle(OMX_OUT OMX_HANDLETYPE* pHandle,

            OMX_IN  OMX_STRING cComponentName,

            OMX_IN  OMX_PTR pAppData,

            OMX_IN  OMX_CALLBACKTYPE* pCallBacks);

 

    OSCL_IMPORT_REF OMX_ERRORTYPE OMX_GetRolesOfComponent(

        OMX_IN      OMX_STRING compName,

        OMX_INOUT   OMX_U32* pNumRoles,

        OMX_OUT     OMX_U8** roles);

 

    OSCL_IMPORT_REF  OMX_ERRORTYPE OMX_SetupTunnel(

        OMX_IN  OMX_HANDLETYPE hOutput,

        OMX_IN  OMX_U32 nPortOutput,

        OMX_IN  OMX_HANDLETYPE hInput,

        OMX_IN  OMX_U32 nPortInput);

 

    OSCL_IMPORT_REF OMX_ERRORTYPE   OMX_GetContentPipe(

        OMX_OUT  OMX_HANDLETYPE *hPipe,

        OMX_IN   OMX_STRING szURI);

 

    OSCL_IMPORT_REF OMX_BOOL OMXConfigParser(

        OMX_PTR aInputParameters,

        OMX_PTR aOutputParameters);

 

 

#ifdef __cplusplus

}

#endif

 

open core 에서 각 코덱을 opencore 로 구현하고, 해당 코덱을 연동하는 파트를

openMax 인터페이스를 사용하여 코덱을 연동하도록 구성되어 있는 것이다.

그걸 다시 OMX_Master~ 와 같이 랩핑 해 놓은 것임을 알 수 있다.

 

./opencore/codecs_v2/omx/omx_common/Android.mk 를 보면

libomx_common_lib.a 라는 스택틱 라이브러리로 빌드하게 되어 있다. 웬 static?

 

./opencore/build_config/opencore_dynamic/Android_omx_sharedlibrary.mk 를 보자.

몇개의 static 라이브러리를 묶어 libomx_sharedlibrary.so 라는 공유 라이브러리를 만들고 있다.

 

libomx_sharedlibrary.so 를 동적 로드하면 우리가 원하는 오픈맥스 인터페이스를 얻을 수

있게 된다.

 

라이브러리를 로드하고, dlsym 으로 OpenMAX IL 메쏘드를 얻어온다.

 

그 이후는 일반 OpenMAX IL 규약에 맞추어 해당 코덱의 Component 를 얻어

처리하면 된다. 

 

주요 Role 이름은 "audio_decoder.mp3" "video_decoder.mpeg4" 와 같이 정의되어 있다.