1. 안드로이드멀티미디어구조 1.1 안드로이드멀티미디어개요 여기언급되는모든내용은사용에제한이없습니다. 마음대로사용하시기바랍니다. 2011/07/02 AESOP Embedded Forum 고도리 ( 본명은비밀??? ㅎ ) 안드로이드의멀티미디어는어느 OS 혹은 platform에서와마찬가지로가장어려운부분에속한다. 일반리눅스의경우에서는 mplayer, ffmpeg, VLC player, xine 등과같은자기자신만의구조를갖는멀티미디어엔진의경우와 GStreamer와같은멀티미디어프레임워크구조를갖는엔진으로나뉠수있다. 윈도우즈계열에서도이와비슷하게 Direct show filter 등을이용한멀티미디어엔진과독자적인멀티미디어엔진을갖는플레이어들이존재한다. 안드로이드멀티미디어엔진은기존의 OS등에서사용되는멀티미디어엔진과는다른구조를보여준다. 기본적인구조는멀티미디어프레임워크구조가이미구성되어있고, 이기본적인구조에독자적인멀티미디어엔진을만들어서붙일수있는구조이다. 즉, 표준인터페이스가존재하고, 멀티미디어엔진은표준인터페이스만맞춘다면어떤것을장착해도상관이없도록되어있다. 이러한멀티미디어엔진에대한구글의해답은 2.1 버전까지는 OpenCORE에있었으며 2.2까지는 OpenCORE와 Stagefright를선택해서쓸수있는구조였고, 2.3에서부터는 Stagefright가기본적인안드로이드멀티미디어엔진으로사용되고있다. 위에서설명하였듯이 Android에서의멀티미디어는일반적인 PC에서의멀티미디어처리와는약간의거리가있게구성되어있다. 안드로이드의초기버전의경우 2.1 버전까지주로통신용인 Qualcomm 사의칩만을타겟으로제작한부분이많이보인다. 이는멀티미디어엔진을기존의통신용멀티미디어업체인 PacketVideo사의 OpenCORE를채용한것만보더라도안드로이드멀티미디어의구조는그방향이정해졌다고볼수있다. 하지만, 다행스러운일은안드로이드멀티미디어프레임워크의하부구조인멀티미디어엔진은고정된엔진을쓰도록강요하지지않고독자적인멀티미디어엔진을구성할수있도록개방된구조로되어있다. 이러한부분들을보면안드로이드의초기설계에있어서얼마나향후의발전에신경을썼는지, 소프트웨어개발사들의독자솔루션개발에대해개방적인구조를갖을수있도록새로운멀티미디어엔진에대한가능성을열어두었는지알수있는부분이다. 안드로이드멀티미디어엔진은기본적으로릴리즈될때서부터 OpenCORE를기반으로하고있다. 하지만 2.0 elcair 버전서부터는 OpenCORE의대안으로 stagefright를같이안드로이드소스에탑재하기시작했으며, 2.2 froyo 버전에서도 OpenCORE와 stagefright를선택해
서사용할수있도록제공을하였으나, 현재 (2011년 03월 ) 의시점에서의안드로이드버전인 Gingerbread(Android 2.3) 에서는기본적으로는 stagefright를사용할수있도록한상태이다. OpenCORE의경우소스에포함되어있지않지만, Froyo 버전의엔진을그대로사용할수는있다 ( 이는개발사의능력에따라서이다 ). 안드로이드멀티미디어의기본적인구현은안드로이드를지원하는대부분의 SoC 회사가 Linux BSP와 OpenMAX IL형식의 Hardware Codec을지원한다. 특정 SoC회사의경우에는커스터마이징된 OpenCORE까지도제공하거나별도의멀티미디어엔진을제공한다 (nvidia Tegra2의경우 ). 칩벤더에서제공하는대부분의상용멀티미디어엔진은많은종류의 demuxer/composer를지원할뿐아니라, Media Scanner, DRM Support까지도지원할수있도록구성을해놓았지만, 상용화에는부족함이있는경우가있기때문에실제로상용화까지가기위해서는전문적인솔루션회사의제품을이용하는것도하나의길이될수있다. OpenCORE는 Android를확장하려는구글의전략에가장치명적인약점이었고여러 SoC 제조사와단말제조사들이이러한부분을인력과시간을투입해서 Android 2.2 버전까지해결해왔지만 2.3 Gingerbread버전서부터는 stagefright에그자리를내주었다. 하지만, 이는또한여러 SoC 제조사와여러제품제조사들, 그리고 OpenCORE solution 제공회사들에게괴로운숙제를다시던져준것이되었고, OpenCORE 보다는간단한구조로되어있기는하지만, stagefright 그자체도그다지쉬운구조는아니어서아주난감한일이아닐수없다 ( 필자개인적으로도닭쫓던개지붕쳐다보는격이라고생각한다 ). 안드로이드멀티미디어엔진의경우실제적용에서는두방향의적용방식을볼수있는데하나는통신을위주로하는제품에의적용이고 ( 기본적으로 Qualcomm chip을기반으로한제품 ), 나머지하나는멀티미디어 Application Processor(Samsung System LSI의 S5PC110/V210) 를탑재한제품으로나눌수있다. Qualcomm chip을기반으로한제품은 Qualcomm 칩의원래의한계로인하여제한적인멀티미디어기능만을사용하는경우가많다 ( 이는필자의경험상 DualCore의경우도비슷하다고보여진다 ). 하지만, 멀티미디어 Application Processor(ex> S5PC110/V210) 를기반으로하는제품의경우통신은기본적으로지원하고, 통신이외에도 PC급의멀티미디어를지원할수있는성능을보여주고있다. 멀티미디어에그비중을많이둔제품의개발에서는상대적으로멀티미디어의 PC레벨의호환성을요구하게되므로많은노력과비용이들게된다. 하지만, 이러한제품이이미출시되었고점점이러한기능이기본적으로요구되고있기때문에앞으로나오게되는안드로이드제품은강력한멀티미디어기능을탑재해야할시장에서이미출시되어있는제품과경쟁할수있다. 이러한기능을갖추지못한제품은상대적으로통신위주의저가형시장을공략할수밖에없는상황이될것이다.
1.2 안드로이드멀티미디어에서구조와지원사양 안드로이드에서의멀티미디어프레임워크구조는크게네개의기본구성요소로나눌수있다. - Client - Server - Multimedia Engine - Codec interface 여기서 Codec Interface는다시 2가지계층으로나눌수있다. - OpenMAX IL - Hardware 혹은 Software codec 그림 1.01 안드로이드멀티미디어계층구조 안드로이드구조를그린그림 1.01에서 Libraries(Native Framework이라고한다 ) 쪽에있는 Media Framework는위에서설명한네개의부분에서 server, media engine, codec interface 세부분을하나로통틀어표현하는것이다. 안드로이드멀티미디어프레임워크구조부분을조금자세하게그린다면다음과같은그림 1.02처럼그려볼수있다. 여기서 Media engine이라고되어있는부분은 OpenCORE,
stagefright 혹은독자적인멀티미디어엔진으로교체될수있는부분이다. 멀티미디어프레임워크부분을구성하는가장중요한멀티미디어엔진부분에대한부분은뒤쪽에서다시자세하게설명한다. 여기서는멀티미디어엔진의기본적인구성요소만을나타내도록그림을구성하였다. 그림 1.02 안드로이드멀티미디어구조와멀티미디어엔진 안드로이드는멀티미디어프레임워크의구조와멀티미디어엔진의기본적인뼈대만을제공한다. 멀티미디어엔진의많은부분들은칩벤더, 제품제조사혹은멀티미디어솔루션제작사등이직접작성하도록구성되어있다. 안드로이드에서기본적으로지원하는파일의형식과포맷은다음과같다. - 이부분은 excel 파일에서추출한표를입력할것. 표 1.01 안드로이드멀티미디어엔진에서기본적으로지원하는코덱형식형식 Codec 기록읽기지원형식 AAC LC/LTP O 3GPP (.3gp) 및 MPEG-4 (.mp4,.m4a).raw 오디오 HE-AACv1 (AAC+) O AAC 미지원 (.aac) HE-AACv2 O
이미지 비디오 (enhanced AAC+) AMR-NB O O 3GPP (.3gp) AMR-WB O 3GPP (.3gp) MP3 O MP3 (.mp3) MIDI O 타입 0/1 (.mid,.xmf,.mxmf).rtttl/rtx (.rtttl,.rtx), OTA (.ota),imelody (.imy) Ogg Vorbis O Ogg (.ogg) PCM/Wave O WAVE (.wav) JPEG O O JPEG (.jpg) GIF O GIF (.gif) PNG O PNG (.png) BMP O BMP (.bmp) H.263 O O 3GPP (.3gp) H.264 O O 3GPP (.3gp) and MPEG-4 (.mp4) MPEG4 SP 3GPP (.3gp) 표 1.01을보면대부분통신용에가깝게포맷과형식이지원되고있는것을볼수있다. 여기서특이한점은 Ogg Vorbis의지원이다. 안드로이드내부에서사용되는대부분의음원은 mp3의형태가아니라 ogg file의형태를갖고있다. 위의지원형태에도볼수있듯이대부분의동영상엔진의지원은 software codec을위주로지원하도록되어있다. Gingerbread 소스의경우는레퍼런스폰인 Nexus-S에사용된 Samsung S.LSI의 S5PC110(POP type) 혹은이와동일한칩인 S5PV210(Single type) 의멀티미디어하드웨어코덱인 MFC(Multi-Fuction Codec) 을 OpenMAX IL을통해서지원할수있도록하고있다. 하지만, Audio/Video codec부분은여전히제한적으로지원하고있으며이와마찬가지로, 동영상을갖고있는 container(demuxer 혹은 parser) 와 composer(muxer) 등도제한적으로지원하고있다. 이와같은점은 PC등에서사용하는멀티미디어포맷의많은부분을지원하지않는것으로볼수있다. 상용화에는많은걸림돌이존재하며소프트웨어솔루션회사입장에서는이와같은점을이용해서틈새시장을창출할수있는기회가될수도있다. 현존하는 PC용의파일포맷들과코덱들을지원하고자한다면 Hardware 혹은많이최적화된 Software codec을이용한 video codec을지원하여야하며, 많은 parser들이 Android 멀티미디어엔진으로포팅되어있어야한다. 밑의표 1.02 는안드로이드에서확장으로지원해야할리스트를보여준다 ( 멀티미디어기기
로적용하기위한 ). 표 1.02 안드로이드에서지원하는멀티미디어형식과지원하지않는형식 Fileformat(Demuxer) Video Codec Audio Codec Video Output.MP4 H.264 AAC Software Renderer.MP3 H.263 MP3 Android 기본지.OGG MPEG4-SP AMR 원.MID Vorbis.WAV.AVI H264(H/W codec) Dolby-AC3 Hardware Renderer 확장지원부분.MKV H.263(H/W codec) DTS.WMV(.ASF) MPEG4-SP(H/W codec) WMV7/8 FLAC APE WMV9(H/W codec) WMA1/2(WMA7/8 ) 1.3 멀티미디어응용프로그램의함수호출과정 그림 1.03 안드로이더멀티미디어응용프로그램의간단한함수흐름도
안드로이드멀티미디어어플리케이션의함수호출흐름은그림 1.03에서보는것과같다. 앞에서언급한안드로이드멀티미디어구조의네부분에맞춰서설명하면다음과같다. 1> client 부분 - Multimedia Application - Multimedia JAVA API: Application Framework - Mutimedia JNI interface(libmedia_jni.so) - Multimedia Native client library(libmedia.so) 2> server 부분 - Multimedia Native server library(libmediaplayerservice.so) - Multimedia engine(midifile, libstagefrighplayer) Multimedia Engine의경우미디어파일혹은 URL에따라 Multimedia Engine은 MidiFile, Stagefright(libstagefrightplayer.so) 등으로구분될수있는데, 이는 2.3 Gingerbread 버전의경우이며, 2.2 froyo의경우는 MidiFile, Vorbis player, OpenCORE (libopencoreplayer.so) 로나누어볼수있다. 이러한부분을 Class 를기반으로그구조를그려보면다음과같다. 그림 1.04 안드로이드멀티미디어 Client/Server 의클래스구조
그림 1.04는위에서설명한멀티미디어응용프로그램에서의함수흐름을 Class별로구성을바꾼것이다. 여기서눈여겨봐야할부분은 MediaPlayer, MediaPlayerService, StagefrightPlayer 표현된안드로이드멀티미디어의기본구성요소들이다. 그리고, 이와더불어유심히봐야할부분은 MediaPlayer 클래스와 MediaPlayerService 클래스사이의통신구조인 Binder연결이다. MediaPlayer 클래스는 libmedia.so 소속으로안드로이드멀티미디어클라이언트부분의최종단부분을담당한다. 여기서부터 Binder통신을이용하여 MediaPlayerService에멀티미디어의기능을사용할수있도록요청하는역할을담당한다. MediaPlayerService 클래스는 libmediaplayerservice.so 1 를구성하는기본클래스로안드로이드멀티미디어서버부분의기본구조를담당하는클래스이다. 실제로이클래스가안드로이드멀티미디어프레임워크라고불리는부분이라고볼수있다. 이클래스는멀티미디어서비스의전체뼈대를구성하는클래스로구성요소들로는클라이언트와의인터페이스, 여러미디어타입에따른처리를담당하는멀티미디어엔진들이있다. 그림 1.04에서는그멀티미디어엔진의하나로 StagefrightPlayer 클래스를표시하고있으며, 이와같은엔진으로는 1 libmediaplayerservice.so 는안드로이드 mediaserver 를구성하는서버라이브러리들중하 나이다.
MidiFile 클래스, 2.2 froyo의경우는 PVPlayer 클래스와 VorbisPlayer 클래스등이존재한다. 물론이멀티미디어엔진은제조사에따라독자적인엔진으로구성할수도있다. 안드로이드멀티미디어프레임워크를이해하기위해서는기본적으로안드로이드멀티미디어응용프로그램이이벤트구동방식으로동작한다는것을이해해야하며, 각이벤트에따른상태의움직임을명확하게알고있어야한다. 이상태에따라멀티미디어서비스와그밑의멀티미디어엔진의함수호출과그함수의내용을어떻게구성하는지가결정된다. 다음의그림 1.05 2 는멀티미디어응용프로그램의상태다이어그램을보여준다. 여기서는 Application Framework에서의함수호출과이에따른서버로부터의응답을처리하는 Listener등에대해서다이어그램이그려져있다. 그림 1.05 안드로이드 MediaPlayer 클래스의상태변화도 2 이그림은 Google developer site에서참고한것이다. http://developer.android.com/reference/android/media/mediaplayer.html
그림에있는각상태에서상태의변화를일으키기위해호출되는함수들은 client(application) 에서 server(media player service - server) 쪽으로 binder를이용해서호출되는함수들의이름들이다. 위의상태다이어그램을다시자세하게 Native Framework에서의클라이언트서부터서버로의함수호출과이에따른서버로부터클라이언트로전달되는메시지를포함한그림은다음절에서설명된다. 1.4 안드로이드멀티미디어플레이어의구조 이절에서는안드로이드멀티미디어플레이어가어떻게클라이언트서버구조로동작하는
지에대한설명을실제코드를보면서설명한다. 여기서사용하는멀티미디어플레이어는일반적인응용프로그램의형태는아니다. 즉, JAVA 로작성된코드가아니다. JAVA 에서하는기능을그대로사용할수있도록클라이언트쪽의라이브러리인 libmedia.so의 MediaPlayer 클래스를 C++ 코드를이용해서작성한것이다. 하지만일반플레이어에서동작하는것과같이동일한역할을수행하는 Native console application이다. 멀티미디어플레이어의구조는두부분으로나누어서정리할수있는데클라이언트부분은 libmedia.so를사용해서 MediaPlayerService 클래스로접근하는 gvideo라는응용프로그램을위주로살펴버고서버쪽의경우는안드로이드멀티미디어서비스인 mediaserver를시작으로 MediaPlayerService 클래스의동작에대해서살펴본다. 그림 1.06 안드로이드미디어플레이어생성시함수호출 그림 1.07 안드로이드미디어플레이어에서의 setdatasource() 호출흐름
그림 1.08 미디어플레이어생성후미디어플레이어의 start 함수호출시함수의흐름
일단클라이언트와서버의동작을함수단위의호출흐름으로설명하면그림 1.06 ~ 1.08과같은그림이된다. 여기서는 MediaPlayer의초기화와 MediaPlayer를 start시켜서미디어컨텐츠 play를시작하는간단한 flow를나타낸다. 물론여기의함수흐름보다는좀더많은흐름이있으나이그림에서는클라이언트의함수호출중중요한 2가지인 setdatasource와 start 함수위주로설명하였다. 더자세한코드의흐름은밑에서설명한다. 이프로그램은 Android native console multimedia player이고, 작성된이유는안드로이드에서멀티미디어엔진을작성할때자바응용프로그램을사용하지않고, 서버단의멀티미디어엔진의기능을하나하나테스트할수있도록작성된테스트프로그램이다. 이프로그램을사용하는잇점은 JAVA 엔지니어의도움없이 C/C++ 을주로다루게되는네이티브프레임워크엔지니어혼자서멀티미디어엔진을작성할수있다. 그리고 UI를이용하는 JAVA 어플리케이션보다콘솔에서명령어를이용해서멀티미디어엔진을구동할수있는프로그램이다. 이코드는개발용코드이고, 두가지버전이존재한다. - gvideo1: 오직멀티미디어플레이어서버와엔진을구동시켜서동작을확인하는응용프로그램 - gvideo2: gvideo1 프로그램을확장해서서버에서클라이언트쪽으로보내는이벤트메시지처리루틴을추가한버전 소스는