본문 바로가기

프로그래밍/Android

오픈코어~오픈맥스 디코더 추가

 

오픈코어에서 OpenMax 관련 오브젝트가 등록되는 흐름을 대략 살펴본다.

이미 포함되어 있는 mp3 코덱에 대해 어떤 모습으로 프로젝트가 구성되어 있는지

확인하면 좋을듯 싶다~ 단순히 openmax

 

1. UUID 만들기

 ANDROID_PATH/exernal/opencore/codecs_v2/omx/omx_common/include/pv_omxcore.h

파일을 열어 uuid를 등록한다. 

파일에 #if USE_DYNAMIC_LOAD_OMX_COMPONENTS 부분에 보면

가 uuid 를 define 하고 있는데, 여기에 등록할 새 코덱의 uuid 를 등록해 준다.

 

 

2. 디코더 라이브러리 추가 및 인터페이스 헤더 추가

ANDROID_PATH/external/opencore/codecs_v2/ 폴더아래 폴더를 만들고 코덱 파일들을

복사한다.

 

3. Android.mk 작성

디코더 관련 make파일을 작성한다.

* 샘플( mp3 디코더)의 Android.mk 참조

 

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

 

LOCAL_SRC_FILES := \

    src/pvmp3_normalize.cpp \

     src/pvmp3_alias_reduction.cpp \

     src/pvmp3_crc.cpp \

     src/pvmp3_decode_header.cpp \

     src/pvmp3_decode_huff_cw.cpp \

     src/pvmp3_decoder.cpp \

     src/pvmp3_getbits.cpp \

     src/pvmp3_dequantize_sample.cpp \

     src/pvmp3_framedecoder.cpp \

     src/pvmp3_get_main_data_size.cpp \

     src/pvmp3_get_side_info.cpp \

     src/pvmp3_get_scale_factors.cpp \

     src/pvmp3_mpeg2_get_scale_data.cpp \

     src/pvmp3_mpeg2_get_scale_factors.cpp \

     src/pvmp3_mpeg2_stereo_proc.cpp \

     src/pvmp3_huffman_decoding.cpp \

     src/pvmp3_huffman_parsing.cpp \

     src/pvmp3_tables.cpp \

     src/pvmp3_imdct_synth.cpp \

     src/pvmp3_mdct_6.cpp \

     src/pvmp3_dct_6.cpp \

     src/pvmp3_poly_phase_synthesis.cpp \

     src/pvmp3_equalizer.cpp \

     src/pvmp3_seek_synch.cpp \

     src/pvmp3_stereo_proc.cpp \

     src/pvmp3_reorder.cpp \

     src/pvmp3_polyphase_filter_window.cpp \

     src/pvmp3_mdct_18.cpp \

     src/pvmp3_dct_9.cpp \

     src/pvmp3_dct_16.cpp

 

ifeq ($(TARGET_ARCH),arm)

LOCAL_SRC_FILES += \

    src/asm/pvmp3_polyphase_filter_window_gcc.s \

     src/asm/pvmp3_mdct_18_gcc.s \

     src/asm/pvmp3_dct_9_gcc.s \

    src/asm/pvmp3_dct_16_gcc.s

endif

 

 

LOCAL_MODULE := libpvmp3

 

LOCAL_CFLAGS :=  $(PV_CFLAGS)

 

LOCAL_ARM_MODE := arm

 

LOCAL_STATIC_LIBRARIES := 

 

LOCAL_SHARED_LIBRARIES := 

 

LOCAL_C_INCLUDES := \

    $(PV_TOP)/codecs_v2/audio/mp3/dec/src \

     $(PV_TOP)/codecs_v2/audio/mp3/dec/include \

     $(PV_INCLUDES)

 

LOCAL_COPY_HEADERS_TO := $(PV_COPY_HEADERS_TO)

 

LOCAL_COPY_HEADERS := \

    include/pvmp3_decoder.h \

     include/pvmp3decoder_api.h \

     include/pvmp3_audio_type_defs.h

 

include $(BUILD_STATIC_LIBRARY)

 

 

4. 오픈맥스 인터페이스 생성

코덱(디코더)은 구성했으니 이젠 오픈맥스 인터페이스와 연결해야 한다.

ANDROID_PATH/external/opencore/codecs_v2/omx/your_codec 폴더를 만든다.

 

디코더 라이브러리 연동을 위한 클래스와

오픈맥스 인터페이스 클래스를 만든다.

 

오픈코어에서 공유 라이브러리를 접근하기 위해 공통적인 export 템플릿을 제공하고 있다.

ANDROID_PATH/external/opencore/codecs_v2/omx/omx_sharedlibrary/interface/src/pv_omx_interface.cpp

ANDROID_PATH/external/opencore/codecs_v2/omx/omx_core_plugins/template/src/pv_omx_interface.cpp

를 참조하면 라이브러리를 어떻게 사용하는지 알 수 있다.

 

반대로 구현측에서는 저러한 인터페이스를 만들어 주어야 한다는 소리이다~

 

기본 인터페이스는 PVGetInterface() / PVReleaseInterface() 이다.

즉, 오픈코어의 shared library는 위 메쏘드가 export 되어 있다는 소리다.

 

 

* MP3의 경우 mp3_dec.cpp / mp3_dec.h , omx_mp3_component.cpp / omx_mp3_component.h

로 구성하는데, mp3_dec 의 경우 디코더를 연동하기 위한 클래스이고,

Omx component는 OmxComponentAudio 혹은 OmxComponentVideo 클래스를 상속받은

OpenMax 연동 클래스가 된다.

 

* 디코더와 오픈맥스 컴포넌트는 모두 스택틱 빌드로 구성된다.

 

* ANDROID_PATH/external/opencore/codecs_v2/omx/omx_mp3/Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

 

LOCAL_SRC_FILES := \

    src/mp3_dec.cpp \

     src/omx_mp3_component.cpp \

     src/mp3_timestamp.cpp

 

 

LOCAL_MODULE := libomx_mp3_component_lib

 

LOCAL_CFLAGS :=  $(PV_CFLAGS)

 

LOCAL_ARM_MODE := arm

 

LOCAL_STATIC_LIBRARIES := 

 

LOCAL_SHARED_LIBRARIES := 

 

LOCAL_C_INCLUDES := \

    $(PV_TOP)/codecs_v2/omx/omx_mp3/src \

     $(PV_TOP)/codecs_v2/omx/omx_mp3/include \

     $(PV_TOP)/extern_libs_v2/khronos/openmax/include \

     $(PV_TOP)/codecs_v2/omx/omx_baseclass/include \

     $(PV_TOP)/codecs_v2/audio/mp3/dec/src \

     $(PV_TOP)/codecs_v2/audio/mp3/dec/include \

     $(PV_INCLUDES)

 

LOCAL_COPY_HEADERS_TO := $(PV_COPY_HEADERS_TO)

 

LOCAL_COPY_HEADERS := \

    include/mp3_dec.h \

     include/omx_mp3_component.h \

     include/mp3_timestamp.h

 

include $(BUILD_STATIC_LIBRARY)

 

5. 위 두 라이브러리를 하나의 공유 라이브러리로 합친다.

안드로이드 공유라이브러리 설정 make 파일 작성.

ANDROID_PATH/external/opencore/build_config/opencore_dynamic/your_omx_decoder_sharedlibrary.mk

이곳에서 위에서 생성한 static 라이브러리를 합쳐 빌드하게 된다.

 

* mp3 의 경우를 살펴보면 각 라이브러리를 LOCAL_WHOLE_STATIC_LIBRARIES 에 추가하고,

별도의 shared library 를 만들고 있다.

 

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

 

LOCAL_WHOLE_STATIC_LIBRARIES := \

    libomx_mp3_component_lib \

     libpvmp3

 

LOCAL_MODULE := libomx_mp3dec_sharedlibrary

 

-include $(PV_TOP)/Android_platform_extras.mk

 

-include $(PV_TOP)/Android_system_extras.mk

 

LOCAL_SHARED_LIBRARIES +=   libomx_sharedlibrary libopencore_common

 

include $(BUILD_SHARED_LIBRARY)

include   $(PV_TOP)/codecs_v2/omx/omx_mp3/Android.mk

include   $(PV_TOP)/codecs_v2/audio/mp3/dec/Android.mk

 

6. 공유 라이브러리 등록

ANDROID_PATH/external/opencore/codecs_v2/omx/omx_common/src/pv_omxregistry.cpp

파일에 다른 코덱들을 참조해 등록 함수를 작성한다.

 

 

음....일단은 이렇다 -_-;;;