Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
MediaPlayer부터 NuPlayer까지 source trace 자료
1. 옆에 보이는 그림은 안드로이드 내에서 동영상을 재생하는 화면입니다.
표면적으로 View라는 클래스에 내부적으로 MediaPlayer라는 클래스
가 렌더링하도록 도와줍니다.
도식적으로 나타내면 아래와 같이 화면 View 뒤에서 MediaPlayer가
있는 개념입니다.
View
MediaPlayer
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 파일 이름
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입니다.
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 합니다.