본문 바로가기

프로그래밍/Android

오픈코어 코덱 연동 시퀀스

 

 

향후 정리가 끝나면 포스팅할 예정이지만 대략적인 절차에

대해서만 기술해 둔다~ 현재는 opencore node 쪽을 살펴보느라 진도가

나가질 않는다...쩝

 

베이스 코드는 /external/opencore/codecs_v2/omx/omx_testapp

 

오픈코어에 포함된 omx il 은 패킷 비디오 오픈맥스 관련 인터페이스로

래핑되어 있다.

따라서, 실제 사용하는 omx_core 함수들과 약간 차이가 있고,

추가적인 구조체 등을 정의해 사용하는 경우도 있다.

 

OMX_Master~ 류로 시작되는 메쏘드들은 OMX_Core.h가 아닌 pv_omxcore.h 에 정의된

메쏘드 들이다. 하지만 결국 하는일은 openmax il 규격의 omx_core 관련 메쏘드를

호출하게 된다.

 

일단 전체 내용은 추후 기술하고, 필요한 함수명, enum, struct 등만 기술해 둔다.

 

Component 얻기

OMX_MasterGetComponentsOfRole( role name, comp count, comp names )

mp3의 경우 role name 은 "audio_decoder.mp3" 이며, 각 벤더마다 해당 네임을

제공하게 된다.

 

Config 정보

        OMX_MasterConfigParser()

        struct OMXConfigParserInputs

        struct AudioOMXConfigParserOutputs

        struct VideoOMXConfigParserOutputs

롤 이름과 위에서 얻은 컴포넌트 이름으로 컴포넌트에 기본 설정된 입출력 정보를

얻는다.

 

핸들 얻기

        OMX_MasterGetHandle()

        OMX_HandleType

컴포넌트의 핸들을 얻는다.

 

Parameter 설정 시퀀스

init 을 제외한 모든 설정은 OMX_GetParameter() / OMX_SetParameter() 의

쌍으로 구성된다. 파라미터 설정을 변경할 때도 OMX_GetParameter() 이후에 OMX_SetParameter()를

진행해야 한다.

 

audio init

OMX_GetParameter()

OMX_PORT_PARAM_TYPE , OMX_IndexParamAudioInit

 

 

port definition

buffer수, buffer 사이즈 등 정보 획득

OMX_GetParameter()

OMX_PARAM_PORTDEFINITIONTYPE , OMX_IndexParamPortDefinition (input)

OMX_PARAM_PORTDEFINITIONTYPE , OMX_IndexParamPortDefinition (output)

 

Codec specifition

코덱 정보

OMX_GetParameter()

OMX_AUDIO_PARAM_MP3TYPE , OMX_IndexParamAudioMp3 (input port)

OMX_AUDIO_PARAM_PCMMODETYPE , OMX_IndexParamAudioPcm (output port)

 

input format

OMX_GetParameter()

OMX_AUDIO_PARAM_PORTFORMATTYPE , OMX_IndexParamAudioPortFormat

 

 

allocate memory

port definition 의 버퍼수 , 버퍼 사이즈를 참고로 버퍼 할당

OMX_BUFFERHEADERTYPE , malloc ( input buffer )

OMX_BUFFERHEADERTYPE , malloc ( output buffer )

 

change state

OMX_SendCommand() , OMX_CommandStateSet, OMX_StateIdle

 

idle state

        OMX_FillThisBuffer() , handle, outputBuffer

        OMX_SendCommand(), OMX_CommandStateSet, OMX_StateExecuting

 

executing state

        OMX_FillThisBuffer() , handle, outputBuffer

        OMX_EmptyThisBuffer(), handle, inputBuffer

 

요렇게 input buffer에 압축된 스트림을 넣고, output buffer에 디코딩된 raw 데이터를

받아 처리하면 된다.

 

위는 오픈코어를 플랫폼을 사용해 openmax 를 연동하는 방법에 대해서 다루었다.

다음 포스트에서는 opencore 를 제외한 순수 openmax il 만을 사용해 코덱을 연동하는 내용을

포스팅할 예정이다.

 

샘플 프로젝트도 작성해야 하는데~ 쩝..시간이 읍따~ T_T