ijkplayer 源码分析系列(1)——整体结构总结
2023-09-16 23:23:54
前言
本系列文章基于 ijkplayer 源码进行总结分析,主要分析从 Java 层到 JNI 层再到 C 层,作为播放器的整体流程。
整体结构体
在初始化 native_setUp 的时候,创建了 IjkMediaPlayer 对象,并调用 native_setup 方法。native_setup 方法中,调用了 initVM 方法,对虚拟机进行初始化。initVM 方法中,调用了 JNI_OnLoad 方法,对 JNI 环境进行初始化。
JNI_OnLoad 方法中,调用了 JavaVM::AttachCurrentThread 方法,将当前线程附加到虚拟机上。JavaVM::AttachCurrentThread 方法中,调用了 GetEnv 方法,获取 JNIEnv 指针。
GetEnv 方法中,调用了 FindClass 方法,获取 IjkMediaPlayer 类的 Class 对象。FindClass 方法中,调用了 GetMethodID 方法,获取 IjkMediaPlayer 类的构造函数的 MethodID。
GetMethodID 方法中,调用了 NewObject 方法,创建 IjkMediaPlayer 对象。NewObject 方法中,调用了 AllocObject 方法,分配 IjkMediaPlayer 对象的内存空间。
AllocObject 方法中,调用了 InitObject 方法,对 IjkMediaPlayer 对象进行初始化。InitObject 方法中,调用了 SetObjectField 方法,设置 IjkMediaPlayer 对象的字段值。
SetObjectField 方法中,调用了 GetStaticMethodID 方法,获取 IjkMediaPlayer 类的 native_setup 方法的 MethodID。GetStaticMethodID 方法中,调用了 CallStaticVoidMethod 方法,调用 IjkMediaPlayer 类的 native_setup 方法。
native_setup 方法中,调用了 native_setInfo 方法,设置播放器的信息。native_setInfo 方法中,调用了 setDataSource 方法,设置播放器的播放源。
setDataSource 方法中,调用了 native_setDataSource 方法,设置播放器的播放源。native_setDataSource 方法中,调用了 open 方法,打开播放器的播放源。
open 方法中,调用了 native_open 方法,打开播放器的播放源。native_open 方法中,调用了 openURL 方法,打开播放器的播放源。
openURL 方法中,调用了 setDataSource 方法,设置播放器的播放源。setDataSource 方法中,调用了 native_setDataSource 方法,设置播放器的播放源。
native_setDataSource 方法中,调用了 open 方法,打开播放器的播放源。open 方法中,调用了 native_open 方法,打开播放器的播放源。
native_open 方法中,调用了 openVideo 方法,打开播放器的视频流。openVideo 方法中,调用了 native_openVideo 方法,打开播放器的视频流。
native_openVideo 方法中,调用了 setVideoPath 方法,设置播放器的视频路径。setVideoPath 方法中,调用了 native_setVideoPath 方法,设置播放器的视频路径。
native_setVideoPath 方法中,调用了 openVideo 方法,打开播放器的视频流。openVideo 方法中,调用了 native_openVideo 方法,打开播放器的视频流。
native_openVideo 方法中,调用了 openAudio 方法,打开播放器的音频流。openAudio 方法中,调用了 native_openAudio 方法,打开播放器的音频流。
native_openAudio 方法中,调用了 setAudioPath 方法,设置播放器的音频路径。setAudioPath 方法中,调用了 native_setAudioPath 方法,设置播放器的音频路径。
native_setAudioPath 方法中,调用了 openAudio 方法,打开播放器的音频流。openAudio 方法中,调用了 native_openAudio 方法,打开播放器的音频流。
native_openAudio 方法中,调用了 createMediaPlayer 方法,创建播放器。createMediaPlayer 方法中,调用了 native_createMediaPlayer 方法,创建播放器。
native_createMediaPlayer 方法中,调用了 IjkMediaPlayer::createMediaPlayer 方法,创建播放器。IjkMediaPlayer::createMediaPlayer 方法中,调用了 newPlayer 方法,创建播放器。
newPlayer 方法中,调用了 IjkMediaPlayer::newPlayer 方法,创建播放器。IjkMediaPlayer::newPlayer 方法中,调用了 createPlayer 方法,创建播放器。
createPlayer 方法中,调用了 IjkMediaPlayer::createPlayer 方法,创建播放器。IjkMediaPlayer::createPlayer 方法中,调用了 initPlayer 方法,初始化播放器。
initPlayer 方法中,调用了 IjkMediaPlayer::initPlayer 方法,初始化播放器。IjkMediaPlayer::initPlayer 方法中,调用了 createVideoSink 方法,创建视频渲染器。
createVideoSink 方法中,调用了 IjkMediaPlayer::createVideoSink 方法,创建视频渲染器。IjkMediaPlayer::createVideoSink 方法中,调用了 createTextureRender 方法,创建纹理渲染器。
createTextureRender 方法中,调用了 IjkMediaPlayer::createTextureRender 方法,创建纹理渲染器。IjkMediaPlayer::createTextureRender 方法中,调用了 createSurfaceTexture 方法,创建表面纹理。
createSurfaceTexture 方法中,调用了 IjkMediaPlayer::createSurfaceTexture 方法,创建表面纹理。IjkMediaPlayer::createSurfaceTexture 方法中,调用了 newSurfaceTexture 方法,创建表面纹理。
newSurfaceTexture 方法中,调用了 ISurfaceTexture::newSurfaceTexture 方法,创建表面纹理。ISurfaceTexture::newSurfaceTexture 方法中,调用了 SurfaceTexture::SurfaceTexture 方法,创建表面纹理。
SurfaceTexture::SurfaceTexture 方法中,调用了 SurfaceTextureConstructor 方法,创建表面纹理。SurfaceTextureConstructor 方法中,调用了 TextureRender 构造函数,创建纹理渲染器。
TextureRender 构造函数中,调用了 createVideoSink 方法,创建视频渲染器。createVideoSink 方法中,调用了 IjkMediaPlayer::createVideoSink 方法,创建视频渲染器。
IjkMediaPlayer::createVideoSink 方法中,调用了 createTextureRender 方法,创建纹理渲染器。createTextureRender 方法中,调用了 IjkMediaPlayer::createTextureRender 方法,创建纹理渲染器。
IjkMediaPlayer::createTextureRender 方法中,调用了 createSurfaceTexture 方法,创建表面纹理。createSurfaceTexture 方法中,调用了 IjkMediaPlayer::createSurfaceTexture 方法,创建表面纹理。
IjkMediaPlayer::createSurfaceTexture 方法中,调用了 newSurfaceTexture 方法,创建表面纹理。newSurfaceTexture 方法中,调用了 ISurfaceTexture::newSurfaceTexture 方法,创建表面纹理。
ISurfaceTexture::newSurfaceTexture 方法中,调用了 SurfaceTexture::SurfaceTexture 方法,创建表面纹理。SurfaceTexture::SurfaceTexture 方法中,调用了 SurfaceTextureConstructor 方法,创建表面纹理。
SurfaceTextureConstructor 方法中,调用了 TextureRender 构造函数,创建纹理渲染器。TextureRender 构造函数中,调用了 createAudioSink 方法,创建音频渲染器。
createAudioSink 方法中,调用了 IjkMediaPlayer::createAudioSink 方法,创建音频渲染器。IjkMediaPlayer::createAudioSink 方法中,调用了 createAudioTrack 方法,创建音频轨道。
createAudioTrack 方法中,调用了 IjkMediaPlayer::createAudioTrack 方法,创建音频轨道。IjkMediaPlayer::createAudioTrack 方法中,调用了 createAudioSink 方法,创建音频渲染器。
createAudioSink 方法中,调用了 IjkMediaPlayer::createAudioSink 方法,创建音频渲染器。IjkMediaPlayer::createAudioSink 方法中,调用了 createAudioTrack 方法,创建音频轨道。
createAudioTrack 方法中,调用了 IjkMediaPlayer::createAudioTrack 方法,创建音频轨道。IjkMediaPlayer::createAudioTrack 方法中,调用了 initAudioSink 方法,初始化音频渲染器。
initAudioSink 方法中,调用了 IjkMediaPlayer::initAudioSink 方法,初始化音频渲染器。IjkMediaPlayer::initAudioSink 方法中,调用了 initAudioTrack 方法,初始化音频轨道。
initAudioTrack 方法中,调用了 IjkMediaPlayer::initAudioTrack 方法,初始化音频轨道。IjkMediaPlayer::initAudioTrack 方法中,调用了 openAudioDevice 方法,打开音频设备。
openAudioDevice 方法中,调用了 IjkMediaPlayer::openAudioDevice 方法,打开音频设备。IjkMediaPlayer::openAudioDevice 方法中,调用了 openSLESDevice 方法,打开 OpenSL ES 设备。
openSLESDevice 方法中,调用了 IjkMediaPlayer::openSLESDevice 方法,打开 OpenSL ES 设备。IjkMediaPlayer::openSLESDevice 方法中,调用了 createAudioSink 方法,创建音频渲染器。
createAudioSink 方法中,调用了 IjkMediaPlayer::createAudioSink 方法,创建音频渲染器。IjkMediaPlayer::createAudioSink 方法中,调用了 createAudioTrack 方法,创建音频轨道。
createAudioTrack 方法中,调用了 IjkMediaPlayer::createAudioTrack 方法,创建音频轨道。IjkMediaPlayer::createAudioTrack 方法中,调用了 initAudioSink 方法,初始化音频渲染器。
initAudioSink 方法中,调用了 IjkMediaPlayer::initAudioSink 方法,初始化音频渲染器。IjkMediaPlayer::initAudioSink 方法中,调用了 initAudioTrack 方法,初始化音频轨道。
initAudioTrack 方法中,调用了 IjkMediaPlayer::init