首先从MediaPlayer的setDisplay方法开始:
//frameworks/base/media/java/android/media/MediaPlayer.java
public class MediaPlayer extends PlayerBase implements SubtitleController.Listener, VolumeAutomation, AudioRouting
{
public void setDisplay(SurfaceHolder sh) {
mSurfaceHolder = sh; //给Surface设置一个控制器,用于展示视频图像
Surface surface;
if (sh != null) {
surface = sh.getSurface(); //取得surface
} else {
surface = null;
}
_setVideoSurface(surface); //给视频设置Surface,带_的函数是native函数
updateSurfaceScreenOn(); //更新Surface到屏幕上
}
}
上面方法主要处理如下:
调用_setVideoSurface方法,设置Video Surface。
调用updateSurfaceScreenOn方法,更新Surface到屏幕上。
下面分别分析:
_setVideoSurface
_setVideoSurface是一个native方法,经过查询调用的是android_media_MediaPlayer_setVideoSurface方法:
//frameworks/base/media/jni/android_media_MediaPlayer.cpp
static void android_media_MediaPlayer_setVideoSurface(JNIEnv *env, jobject thiz, jobject jsurface)
{
setVideoSurface(env, thiz, jsurface, true /* mediaPlayerMustBeAlive */);
}
调用setVideoSurface方法:
//frameworks/base/media/jni/android_media_MediaPlayer.cpp
static void setVideoSurface(JNIEnv *env, jobject thiz, jobje