MediaPlayer부터 NuPlayer까지 source trace 자료

  • 1,628 views
Uploaded on

Android에서 RTSP와 HTTP protocol을 사용하는 스트리밍 데이터를 재생하기 위해 사용하는 NuPlayer에 대한 source trace자료입니다.

Android에서 RTSP와 HTTP protocol을 사용하는 스트리밍 데이터를 재생하기 위해 사용하는 NuPlayer에 대한 source trace자료입니다.

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,628
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
36
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. 옆에 보이는 그림은 안드로이드 내에서 동영상을 재생하는 화면입니다. 표면적으로 View라는 클래스에 내부적으로 MediaPlayer라는 클래스 가 렌더링하도록 도와줍니다. 도식적으로 나타내면 아래와 같이 화면 View 뒤에서 MediaPlayer가 있는 개념입니다. View MediaPlayer
  • 2. MediaPlayer는 http://developer.android.com/reference/android/media/MediaPlayer.html 위 주소에 class spec이 나와있습니다. Instance 생성 후 setDataSource()를 통해 어디서 비디오 데이터를 가져올 것인지 source를 설정해줍니다. Android Version 3.0 HoneyComb 이후 HLS에서 가져올 수 있기 때문에 setDataSource(“http://~~~address.m3u8”); 이런 식으로 적어주면 작동합니다.
  • 3. MediaPlayer.java는 https://code.google.com/p/android-sourcebrowsing/source/browse/media/java/android/media/MediaPlayer.java?repo=platform-frameworks--base&name=android-4.0.1_r1 여기서 소스를 볼 수 있습니다. 아까 setDataSource(“http://~~~address.m3u8”); 이런 명령을 내렸으니까 위의 Method를 찾아가게 됩니다. Native라고 붙었는데 이것은 java 자체에서 해결되는 function이 아니라 C/C++ 소스와 연결되어 있다는 겁니다. Inteface method처럼 구현된 부분은 java파일에 없습니다.
  • 4. MediaPlayer.java 내부에 위와 같이 media_jni를 로드하겠다는 static 명령이 있습니다. 이것은 libmedia_jni.so 파일을 로드하겠다는건데 이파일은 C/C++을 컴파일 한겁니다. https://code.google.com/p/android-sourcebrowsing/source/browse/media/?repo=platform--frameworks--base&name=android4.0.1_r1#media%2Fjni -다음장~
  • 5. 컴파일할 cpp목록 위 주소로 가면 Android.mk 파일이 있는데 이를 열어보면 좌측과 같습니다. 이파일은 안드로이드 자체에서 쓰고 있는 일종의 makefile 인데 이것을 이용해서 make하면 Media/jni의 디렉토리에 있는 것들이 모두 libmedia_jni.so Include에서 쓰이는 library들 로 컴파일 됩니다. (shared) 그래서 아까의 native functio과 같이 java와 연결되어 C/C++ function에 접근 할 수 있습니다. Include에서 쓰이는 library들 (static) Library 파일 이름
  • 6. Android_media_MediaPlayer.cpp https://code.google.com/p/android-sourcebrowsing/source/browse/media/jni/android_media_MediaPlayer.cpp?repo=platform-frameworks--base&name=android-4.0.1_r1 이 파일을 보면 위와 같이 java에서의 setDataSource(String…)을 Android_media_MediaPlayer_setDataSource() 에 function pointer로 연결하고 있습니다. android_media_MediaPlayer_setDataSource
  • 7. 그래서 android_media_MediaPlayer_serDataSource()를 찾아가면 위와 같고 다시 android_media_MediaPlayer_setDataSource AndHeaders()를 찾아가면 좌측과 같습니다. sp<MediaPlayer> mp : sp는 스마트 포인터고 MediaPlayer는 C/C++ level의 MediaPlayer Class입니다. 이전에 instance화 했던 mediaPlayer를 불러오는 것. 아까 Java에서 MediaPlayer의 datasource로 주었던 path가 C/C++의 mediaPlayer로 전달됩니다.
  • 8. Mediaplayer.cpp 파일은 media/libmedia/ 디렉토리에 있고 https://code.google.com/p/android-source-browsing/source/browse/media /?repo=platform--frameworks--base&name=android-4.0.1_r1#media%2Flibmedia 위 주소로 가면 볼 수 있습니다. 그 안에 setDataSource()가 있고 IMediaPlayerService를 통해 IMediaPlayer type의 player를 만듭니다. IMediaPlayerService와 IMediaPlayer는 MediaPlayerService, MediaPlayer의 proxy class입니다.
  • 9. /include/media/ https://code.google.com/p/android-source-browsing/source/browse/ ?repo=platform--frameworks--base&name=android-4.0.3_r1#git%2Finclude%2Fmedia 에가면 IMediaPlayerService.h와 IMediaPlayer.h를 볼 수 있는데 위와 같이 각각 MediaPlayerService class와 MediaPlayer class에 연결되는걸 볼 수 있습니다. DECLARE_META_INTERFACE는 안드로이드에서 정의한 매크로로 proxy class와 원래 class를 연결해 줍니다.
  • 10. 8p의 148line에서 IMediaPlayerService instance service의 create를 실행하는데 이를 보기 위해 MediaPlayerService.cpp를 보아야 합니다. https://code.google.com/p/android-source-browsing/source/browse/media/ libmediaplayerservice/MediaPlayerService.cpp?repo=platform--frameworks--base&name=android-4.0.3_r1 MediaPlayerService::creat는 265line에서 생성된 Client를 retur하는데 Client Class는 MediaPlayerService.h에 정의돼있고 MediaPlayerService.cpp에 구현돼있습니다.
  • 11. 8p의 148line에서 IMediaPlayerService instance service의 create를 실행하는데 이를 보기 위해 MediaPlayerService.cpp를 보아야 합니다. https://code.google.com/p/android-source-browsing/source/browse/media/ libmediaplayerservice/MediaPlayerService.cpp?repo=platform--frameworks--base&name=android-4.0.3_r1 MediaPlayerService::creat는 265line에서 생성된 Client를 retur하는데 Client Class는 MediaPlayerService.h에 정의돼있고 MediaPlayerService.cpp에 구현돼있습니다.
  • 12. 결국 8p 149line에서 player->setDataSource()는 MediaPlayerService.cpp안에 구현된 Client::setDataSource()를 가리키게 됩니다. https://code.google.com/p/android-source-browsing/source/browse/media/ libmediaplayerservice/MediaPlayerService.cpp?repo=platform--frameworks--base&name=android-4.0.3_r1 698line에서 url에 의해서 playerType을 얻고 702line에서 playerType에 의해 createPlayer를 하고 마지막으로 712line에서 생성된 player에 setDataSource()로 url을 넘깁니다.
  • 13. 같은 파일 MediaPlayerService.cpp에 getPlayerType()이 있고 여기서 url에 따라서 playerType을 결정합니다. 583line에 보듯이 “.m3u8” 주소는 NU_PLAYER를 Return 하게 됩니다.
  • 14. 같은 파일 MediaPlayerService.cpp에 createPlayer()가 있고 넘겨받은 playerType에 의해 player를 creat합니다. 658line : 만든 player가 없으니까 현재 저장된 mPlayer가 null일 것이고 새로 create합니다.
  • 15. 같은 파일 MediaPlayerService.cpp에 또다른 createPlayer()를 보면 넘겨받은 playerType에 의해 player를 creat합니다. 626line : 넘겨받은 playerType이 NU_PLAYER이고 new NuPlayerDriver를 return 합니다.
  • 16. NuPlayer::setDataSource()는 NuPlayer.cpp https://code.google.com/p/android-sourcebrowsing/source/browse/media/libmediaplayerservice/nuplayer/NuPlayer.cpp?repo=p latform--frameworks--base&name=android-4.0.3_r1 에 구현이 돼있습니다. 90,96,100line : kWhatSetDataSource라는 message를 만들고 Object로 url등의 source를 넣고 post합니다. 170line : mSource에 받은 message의 object즉 Url을 담은 source을 넣고 끝냅니다.