T-DMB lipsync issue 검토

Similar documents
<C0CCBCBCBFB52DC1A4B4EBBFF82DBCAEBBE7B3EDB9AE2D D382E687770>

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

JMF3_심빈구.PDF

모바일 안드로이드 아키텍처

C# Programming Guide - Types

PCServerMgmt7

, N-. N- DLNA(Digital Living Network Alliance).,. DLNA DLNA. DLNA,, UPnP, IPv4, HTTP DLNA. DLNA, DLNA [1]. DLNA DLNA DLNA., [2]. DLNA UPnP. DLNA DLNA.

Microsoft PowerPoint UI-Event.Notification(1.5h).pptx

FMX M JPG 15MB 320x240 30fps, 160Kbps 11MB View operation,, seek seek Random Access Average Read Sequential Read 12 FMX () 2

Chapter #01 Subject

cam_IG.book

¨ìÃÊÁ¡2

1217 WebTrafMon II

( )부록

인켈(국문)pdf.pdf

화판_미용성형시술 정보집.0305

Building Mobile AR Web Applications in HTML5 - Google IO 2012

Windows Embedded Compact 2013 [그림 1]은 Windows CE 로 알려진 Microsoft의 Windows Embedded Compact OS의 history를 보여주고 있다. [표 1] 은 각 Windows CE 버전들의 주요 특징들을 담고

UI TASK & KEY EVENT

untitled

PowerPoint 프레젠테이션

untitled

01.Android-gingerbread-multimedia-framework-structure

목차 BUG offline replicator 에서유효하지않은로그를읽을경우비정상종료할수있다... 3 BUG 각 partition 이서로다른 tablespace 를가지고, column type 이 CLOB 이며, 해당 table 을 truncate

HW-F450-KOR-IB_New Remocon.indd

bn2019_2

제품 소개 및 특징 제품 사용 시 주의사항 본 제품은 차량 사고 발생시의 영상과 음성을 저장하여 사고 원인을 분석하는데 도 움을 주는 차량용 영상 기록 장치입니다.! 본 제품은 개인적인 용도로만 사용하여야 하며, 사용설명서에 명시된 사 항 외에 다른 목적으로 제품을 사

untitled

LCD Display


PowerPoint Presentation

Microsoft Word - 01.android_multimedia_구조_ _0.docx

歯이시홍).PDF

RVC Robot Vaccum Cleaner

3주차_Core Audio_ key

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

디지털TV솔루션 브로셔

GNVR(Greenia defined NVR system) 제안서 NVR : Network Video Recorder

API 매뉴얼

untitled

Switching

rmi_박준용_final.PDF

Assign an IP Address and Access the Video Stream - Installation Guide

2009년도 한국멀티미디어학회 춘계학술발표대회 논문집 12권1호 1. 서론 게임을 개발하는 과정에서 게임 엔진은 자동차의 엔진과 같은 역할이다. 자동차의 가치를 평가하는 요소 중에 어떤 엔진을 적용 했는가는 자동차를 평가하는데 중요하다. 게임도 게임 개발 기술 중 엔진

Contents 1 소개 설치 및 사용방법 21 다운로드 22 라이브러리 등록 23 Android Menifest 정의 간단한 31 플레이어 생성 32 이벤트 리스너 정의 33 Surface 할당 3

20주년용



UI VoC Process 안

Axxon_Next_Brochure_1_Lee

45호_N스크린 추진과정과 주체별 서비스 전략 분석.hwp

Microsoft Word - FunctionCall

(SW3704) Gingerbread Source Build & Working Guide

Microsoft Word - [2017SMA][T8]OOPT_Stage_2040 ver2.docx

Network Security - Wired Sniffing 실습 ICNS Lab. Kyung Hee University

1. What is AX1 AX1 Program은 WIZnet 사의 Hardwired TCP/IP Chip인 iinchip 들의성능평가및 Test를위해제작된 Windows 기반의 PC Program이다. AX1은 Internet을통해 iinchip Evaluation

개요 AXSR5 레코더에 연결 시 NEXFS700 전용 RAW 포맷으로 변환되어 AXSR5 에서 녹화됩니다(PMWF55, F65 용 RAW 포맷과 다름). 또한 이 제품의 간단한 플레이백 기능을 사용하여 AXSR5에서 레코딩 된 비디오를 볼 수 있습니다. 플레이백 되는

PowerPoint 프레젠테이션

API STORE 키발급및 API 사용가이드 Document Information 문서명 : API STORE 언어별 Client 사용가이드작성자 : 작성일 : 업무영역 : 버전 : 1 st Draft. 서브시스템 : 문서번호 : 단계 : Docum

UI TASK & KEY EVENT


chungo_story_2013.pdf

*중1부

2

Çѱ¹ÀÇ ¼º°øº¥Ã³µµÅ¥

...._


전반부-pdf

<4D F736F F F696E74202D20312E20B0E6C1A6C0FCB8C15F3136B3E2C7CFB9DDB1E25F325FC6ED28C0BA292E >

_

12월월간보고서내지편집3

에너지포커스 2007년 가을호


01_당선자공약_서울

인권문예대회_작품집4-2




목차

A°ø¸ðÀü ³»Áö1-¼öÁ¤

±¹³»°æÁ¦ º¹»ç1

¿¡³ÊÁö ÀÚ¿ø-Âü°í ³»Áö.PDF

전반부-pdf

뉴스레터6호

Microsoft PowerPoint 하반기 크레딧 전망_V3.pptx

50차 본문 최종

³»Áöc03âš

fsb9¿ù³»ÁöÃÖÁ¾Ãâ

¾ç¼º-¾÷¹«Æí¶÷-³»¿ëÃà¼Ò4

전도대회자료집

< DBAB4B9ABC3BB5FBAB9B9ABB0FCB8AEB8C5B4BABEF32D33B1C72E706466>

<3344C7C1B8B0C6C320BFE4BEE02D E706466>

µ¶ÀÏÅëÀÏÁý1~2Æíq36£02Ð


자식농사웹완


표1.4출력

003-p.ps

중앙도서관소식지겨울내지33

양성내지b72뼈訪?303逞

Transcription:

Android Stagefright Overview chunghan.yi@gmail.com, slowboot

본문서는 Android stagefright(gingerbread 기준 ) 의기본구조를파악하기위해작성한문서로, 인터넷에떠도는다양한그림이미지를활용하였으며, 특히아래 awesome 문서를참조하였음을밝힌다 ( 원저자의허락없이, 이미지를복사하여사용하였음. 문제가된다면말씀해주세요 ^^). 1) 01.Android-gingerbread-multimedia-framework-structure.pdf[ 이솝임베디드포럼의고현철님 ] 2) AndroidMMF-Details_v04.pdf[windriver 의김태용님 ] 3) Inside_of_Stagefright.pdf[windriver 의김정호님 ]

Revision 작성자비고 0.1 이충한 최초작성 10/13/2011 0.2 이충한 10/19/2011 0.3 이충한 10/20/2011

Contents 1. mediaserver overview 2. Stagefright 전체구조 3. Audio/Video flow 4. Audio Player 5. Video Player 6. Event Queue 7. A/V Sync 8. OMXCodec 9. Streaming Player TODO References

1. Mediaserver overview/1 mediaserver Application (Java) Call Media API(RPC) Mediaserver main (C/C++) Audio Flinger Camera Service TDMB Service( 추가가능 ) Media Player Service Audio Policy Service JNI (3) (1) (2) HAL library (4) Userspace kernel Binder Driver Audio/Video Decoder Driver

1. Mediaserver overview/2 Java appl (UI) JNI Binder RPC mediaserver (C++) OpenMAX IL Video/Audio encoding/decoding driver Userspace kernel

1. Mediaserver overview/3 Audio/Video 재생 Recording Media scanning???

1. Mediaserver overview/4 (*) StagefrightPlayer/AudioFlinger/SurfaceFlinger 간의관계를가장잘표현한그림 ^^

1. Mediaserver overview/5

2. stagefright 전체구조 /1 (*) StagefrightPlayer 가진입포인트이며, AwesomePlayer 가 main 역할! (*) Video 는 AwesomeRenderer 가 Audio 는 AudioPlayer 가담당

2. stagefright 전체구조 /2

2. stagefright 전체구조 /3 (*) 문제의중심은 OMXCodec, onvideoevent(video), fillbuffer(audio), 그리고, 이들을연결하는 event queue!!! (*) AwesomeEvent 와 AudioPlayer 는 decoding 된 data 를처리하는코드임.

2. stagefright 전체구조 /3 - 계속 0) 주체및연결고리 OMXCodec(Decoder 포함 ) : encoding 된 data 를 decoding 해줌. Decoding 된 data 를 Video, Audio Player 에게전달함 ( 실제 decoding 은하부단에서진행 ^^). AwesomeEvent(onVideoEvent) : decoding 된 video data 를읽어, renderer 에전달함 AudioPlayer(fillBuffer): decoding 된 audio data 를읽어 audioflinger 에전달 Event Queue: OMXCodec 과 Audio/Video player 간의 event 교환용도 마지막으로재생할 media(file 혹은 stream) 가있어야겠지요 ^^ 1) Encoding 된 data(mediasource) 가 OMXCodec(decoder 와연결 ) 으로들어간다. Media Extractor 를통과한 Video, Audio data 가 OMXCodec 으로전달된다. 이과정에서 OMXCodec 과 EMPTY_BUFFER 를주고받는다. 즉, encoding 된 data 를 decoding 할수있는상태가되었으니, buffer 를채워달라는의미로.. 2) AwesomePlayer 중 onvideoevent 함수와 AudioPlayer 코드는 decoding 을거친 data 를 Video Renderer 와 AudioFlinger 로넘기는역할을수행한다. onvideoevent( ) method 에서는 decoding video data 를 read 하여, video renderer 로전달하며, fillbuffer( ) method 에서는 decoding 된 audio data 를 read(fillbuffer 함수에서 ) 하여, 이를 audio flinger 로전달한다. 이과정에서 OMXCodec 과 FILL_BUFFER 를주고받는다. 즉, decoding 된 data 이있으니, 읽어가라는의미로

2. stagefright 전체구조 /3 - 계속 요부분에서 decoding 이진행된다고보면됨! 요부분은이미 data 가 Decoding 된상태

2. stagefright 전체구조 /4 얘들은 decoding 된 data 를처리함! 4 가지 event 중요함! Encoded data Decoded data (*) audio/video data 의흐름

2. stagefright 전체구조 /5 (*) HTTP 로실시간 stream 을 download 받아 Play 할경우의흐름도임 ^^ (file play 의경우도크게다르지않음 )

2. stagefright 전체구조 /6

2. stagefright 전체구조 /7 Media Playing/Data Source/Codec

2. stagefright 전체구조 /8 Media Recording/1

2. stagefright 전체구조 /8 Media Recording/2

3. Audio/Video flow(1) : Video 의경우 (*) audio flow 의경우도비슷함!

3. Audio/Video flow(2) (*) 그림이좀이상함 ( 특히화살표 ^^). 아래부분에서 read() 는 Decoding 이끝난 data 를읽어가는것을의미하며, 각각의 data 는 Video renderer 와 audio flinger 로전달될것임. A/V 동기를맞춤

3. Audio/Video flow(3)

4. Audio Player(fillBuffer)/1 (*) 그림 ( 화살표 ) 이좀이상함! 아래그림에서 fillbuffer 는 OMXCodec 으로부터 Decoding 된 data 를읽어가는것을의미함! 읽은후, 그림에는없으나, 이를 audioflinger 로던짐! (*) 관련파일 : AudioPlayer.cpp Audio Decoder

4. Audio Player(fillBuffer)/2 요부분이 fillbuffer 에해당함 ^^ Encoded data

5. Video Player(1) (*) video 관련 event 가발생할때, 호출되는 method (*) video event 를발생시킴 (*) decoding 된 video data 를읽음 (*) video 를화면에출력함 (*) audio 와동기를맞춤

5. Video Player(2) OMX.qcom.video.decoder.* Video data 추출 Video Decoding Video Rendering (*) media file MediaExtractor mvideotrack Vide Decoder(H/W) OMXCodec read(decoded video data) mvideosouce mvideorenderer render 의순으로 Video data 가흘러가게됨.

5. Video Player(3) : onvideoevent (*) play 시작시, event 발생 (*) event 가발생하면, decoding 된결과를 read( ) 하여, render( ) 한후, Video event 발생 (*) event 는 mqueue 형태로관리!!! (*) mvideosource->read() : decoding 된 video data 를 rendering 하기위해읽어감을의미 onvideoevent 그림의녹색사각형은 VideoDecoder 와연관이있으며, 다음페이지를참조하기바람. (*) mvideorenderer->render(): 위의 read() 함수를통해읽어드린, buffer 내용을화면에출력함을의미 (*) 관련파일 : AwesomePlayer.cpp

5. Video Player(4) OMXCodec FILL_BUFFER/EMPTRY_BUFFER Renderer OMX.qcom.video.decoder.* (*) FILL_BUFFER_DONE: Video decoder 에서 decoding 된 data 를 buffer 에채운후, 발생시키는 event. 이렇게채워진 data 는 read() 과정을거쳐, 화면에출력 (rendering) 하게됨. momx->fillbuffer( ) (*) EMPTY_BUFFER_DONE: decoding 할 data 가필요할때, 즉, 이미이전 data 를모두 decoding 완료하여새로운 data 가필요할때, video decoder 가상위모듈에요청하는 event 로보임! momx->emptybuffer( ) (*) 관련파일 : OMXCodec.cpp

6. Event Queue/1 요부분은좀이상함. mlistener

6. Event Queue/2 AwesomePlayer start/stop/play/pause/ UI appl postevent cancelevent Control Routine onxxxx (event processing routine) pause To renderer Decoded data postevent removeevent & fire OMX Codec Event Queue TimedEventQueue Thread Encoded data (*) event driven 방식이므로, 초기화 (event queue 생성및 event handler 등록및각종루틴초기화 ) 후, event 가발생할때마다이를처리하고, 처리과정에서다시새로운 event 를발생시키는형태로운용된다고보면될듯 ^^ <onxxxx> onvideoevent onstreamdone onbufferingupdate oncheckaudiostatus onprepareasyncevent

6. Event Queue/3 UI appl start/stop/play/pause/ AwesomePlayer Encoded data Start/stop canceevent Control Routine pause initialize play AudioPlayer onvideoevent Read decoded data OMX Codec Event loop(thread) onstreamdone postevent onbufferingupdate renderer removeevent & fire oncheckaudiostatus Some events

6. Event Queue/4 1) TimedEventQueue 를상속받은 AwesomePlayer 는 event loop(for loop) 을돌며, event queue 로들어온, event 를하나씩꺼내어처리한다. 2) Event queue 에서꺼내온 event 의 type 에따라, 각각 onvideoevent, onstreamdone, onbufferingupdate, oncheckaudiostatus method 가호출되는데, 3) 이중, onvideoevent 는 OMXcodec 으로부터 decoding 된 data 를읽어서, renderer 에게넘겨주는역할을하며, 자체적으로 VideoEvent 를다시발생시킨다. 4) onstreamdone 은재생중이던 stream 이 play 를종료하고자할때에호출되며, 따라서최종적으로 pause_l( ) 함수를호출하게된다. 5) 또한, onbufferingupdate 는 streaming play 시, buffer 내용이갱신될때마다호출되며, buffer pause 상태 ( 재생할 data 가없는상태 ) 등도감지하는역할을한다. 6) 마지막으로 oncheckaudiostatus 는글짜그대로 audio 의상태를체크하기위해호출된다. 7) AwesomePlayer 는 event loop 을돌며, event 를처리하는것이외에도, binder 를통해 application 으로부터전달된, 각종 playback command(start, stop, play, pause, prepare ) 도받아처리한다. 앞서기술한 event 를처리하고있는도중에, playback command 가도달할경우, 현재처리중이던 event 를처리한후, playback 명령이처리되는것으로보임.

7. A/V Sync(1) Audio Video Sync Audio time is used as reference. In Stagefright, awesome player uses Audio Player for playing out audio. This player implements an interface for providing time data. Awesome player uses this for rendering Video. Basically Video frames are rendered when their presentation time matches with that of audio sample being played.

7. A/V Sync(2) size_t AudioPlayer::fillBuffer(data, size) {... msource->read(&minputbuffer,...); minputbuffer->meta_data()->findint64(kkeytime, &mpositiontimemediaus); mpositiontimerealus = ((mnumframesplayed + size_done / mframesize) * 1000000) / msamplerate; 여기서계산한시간을 video 쪽에서이용하여동기를맞춤!!... }

7. A/V Sync(3) void AwesomePlayer::onVideoEvent() { mvideosource->read(&mvideobuffer, &options); [Check Timestamp] maudioplayer- >getmediatimemapping(&realtimeus, &mediatimeus) 이함수안에서, AudioPlayer에서계산한 mpositiontimerealus 값을참조하여, realtimeus를계산하게됨. 이후, 아래코드에서 realtimeus를사용하여, frame을 drop하는등의처리진행!... mvideorenderer->render(mvideobuffer); } postvideoevent_l();

8. OMXCodec(1)

8. OMXCodec(2) : FILL_BUFFER/EMPTRY_BUFFER Decoding 된 data 를읽어가는부분 (rendering 을위해 ) Encoding 되어있는 Data 를읽어서 decoder 에넣는부분

9. Streaming Player(1) HTTP/1 (*) 사용자가 progress bar 를앞으로움직인후, pause 버튼을눌렀는데, ANR 이발생한다면, 요부분을의심해봐야하지않나! cancelevents( ) maudioplayer->pause( ) UI appl SurfaceFlinger AwesomePlayer start, play, pause, stop, AudioFlinger Playback commands handling BufferingEvent AwesomeEvent (Video Player) Read decoded video data AudioPlayer Read decoded audio data HTTP Stream (NuCachedSource2) OMXCodec Streaming server Socket open connect Recv close MediaExtractor Read encoded video/audio data

9. Streaming Player(1) HTTP/2 < 네트워크상태가안좋은상태에서, 프로그래스바를앞으로전진한후, Pause 버튼을선택할경우, AwesomePlayer 에서하고있는일 > 1) HTTP connection 을새로맺고, data 를 recv 한다. Recv timeout 이 30 초로되어있음. 2) Video Player 는 decoding 된 data 을읽어 renderer 에게전달하고있음. 네트워크상태가안좋을경우, underrun 에가까운상황이발생하게되므로, renderer 에게전달하는것도매우느려질것임. OMXCodec 으로부터 event 발생이느려질것임. 3) Audio Player 도 decoding 된 data 를읽어 audio flinger 에게전달하고있음. 네트워크상태가안좋을경우, underrun 에가까운상황이발생하게되므로, audioflinger 에게전달하는것도매우느려질것임. OMXCodec 으로부터 event 발생이느려질것임. 4) OMXCodec 은 Media Extractor 에서추출한 video/audio data 를계속읽어들여, decoder 에전달하고있음. 네트워크상태가안좋다면, 역시이과정역시지지부진할터.. < 동시에진행되어야할부분 > HTTP stream reading OMXCodec(decoding) 얘는 binder 로구분되어있음 ( 독립적으로진행 ) Event Queue processing 얘는 pthread 로되어있음. VideoPlayer AudioPlayer 얘는 video 쪽에서시작시킴 Playback 명령처리 얘는 binder 로받으니, 독립적으로진행될듯함. <BufferingEvent> 테스트해보니, Pause 명령을받고, pause 되는것이아니라, buffer pause 되면서, pause 가되고있음. (*) 테스트해보니, ANR 이발생하는이유가 socket connect 후, recv 등에서 blocking 이되면서발생하는것같다.

9. Streaming Player(2) RTSP/1 (*) 좀더분석해야함.

9. Streaming Player(2) RTSP/2 (*) 아래부분이생략된그림임.

TODO Extractor Codecs Mpeg2ts Thanks a lot!

References 1) 01.Android-gingerbread-multimedia-framework-structure.pdf[by 고현철 ] 2) AndroidMMF-Details_v04.pdf[by 김태용 windriver] 3) Inside_of_Stagefright.pdf[by 김정호 windriver] 4) Internet[china sites for some images] 5) EF14L_Dev_Guide_MMF2.ppt[by 이충한 ] 6) The_OpenMAX_Integration_Layer_standard.pdf[by Giulio Urlini Advanced System Technology)