在学习NuPlayer创建Decoder和Renderer之前,得先看下video数据最终生产到什么地方去?答案是Surface,而且Surface是NuPlayer创建Decoder的条件。
APP会创建一层SurfaceView来显示视频层,同时内部会创建一个BLASTBufferQueue,它的生产者会挂载到我们的Decoder,枢纽就是BpGraphicBufferProducer,它的消费者是SurfaceFlinger,会把这个APP的Layer(SurfaceView在SurfaceFlinger中的对应概念)同其他APP的图层一起合成送显上屏。
在JAVA层经过层层传递最终在MediaPlayer中会拿到Surface,然后再传递到JNI层中,这里会剥离出BpGraphicBufferProducer一路传递到NuPlayer中保存起来。
JAVA和JNI层的代码还是比较简单的,这里罗列下代码路径和函数名:
//frameworks/base/media/java/android/media/MediaPlayer.java
public static MediaPlayer create(Context context, Uri uri, SurfaceHolder holder,
AudioAttributes audioAttributes, int audioSessionId)
//frameworks/base/media/jni/android_media_MediaPlayer.cpp
static void
android_media_MediaPlayer_setVideoSurface(JNIEnv *env, jobject thiz, jobject jsurface)
调用到NuPlayer中的接口为setVideoSurfaceTextureAsync()。
简单画个分层结构图: