ijkplayer程序结构整理

整个程序的结构从文件:

ijkplayer_jni.c开始:

参照:

static JNINativeMethod g_methods[] = {

……

}

一、在JNI_OnLoad()/ijkplayer_jni.c调用ijkmp_global_init()/ff_ffplay.c完成ffmpeg的初始化,,调用FFmpegApi_global_init()/ffmpeg_api_jni.c中完成g_methods中函数的注册

二、IjkMediaPlayer_native_init()/ijkplayer_jni.c为空

三、IjkMediaPlayer_native_setup()/ijkplayer_jni.c

1.ijkmp_android_create()/ijkplayer_jni.c

1.1. 创建相应的结构并设置消息处理函数ijkmp_android_create()/ijkplayer_android.c—>message_loop()/ijkplayer_jni.c—>message_loop_n()/ijkplayer_jni.c

2.ijkmp_create()/ijkplayer_android.c

3.ffpipeline_create_from_android()/ffpipeline_android.c

{

……

pipeline->func_open_video_decoder= func_open_video_decoder;

……

}

4.

staticIJKFF_Pipenode *func_open_video_decoder(IJKFF_Pipeline *pipeline, FFPlayer*ffp)

{

IJKFF_Pipeline_Opaque *opaque =pipeline->opaque;

IJKFF_Pipenode *node = NULL;

if (ffp->mediacodec) //根据是否设置mediacodec参数决定是否启用硬解码

node =ffpipenode_create_video_decoder_from_android_mediacodec(ffp, pipeline,opaque->weak_vout);

if (!node) {

node =ffpipenode_create_video_decoder_from_ffplay(ffp);

}

return node;

}

四、IjkMediaPlayer_setVideoSurface()//设置surface:

1.IjkMediaPlayer_setVideoSurface()/ijkplayer_jni.c

2.ijkmp_android_set_surface()/ijkplayer_android.c

3.ijkmp_android_set_surface_l()/ijkplayer_android.c

3.1.SDL_VoutAndroid_SetAndroidSurface()/ijkplayer_android.c–>SDL_VoutAndroid_SetAndroidSurface()/ijksdl_vout_android_surface.c—>SDL_VoutAndroid_SetNativeWindow()/ijksdl_vout_android_nativewindow.c—>SDL_VoutAndroid_SetNativeWindow_l()/ijksdl_vout_android_nativewindow.c

3.2.ffpipeline_set_surface()/ffpipeline_android.c

五、IjkMediaPlayer_prepareAsync() //初始化

1. IjkMediaPlayer_prepareAsync()/ijkplayer_jni.c

2. ijkmp_prepare_async()/ijkplayer.c

3. ijkmp_prepare_async_l()/ijkplayer.c

4.mp->msg_thread = SDL_CreateThreadEx(&mp->_msg_thread,mp->msg_loop, mp, "ff_msg_loop");创建相应的消息处理线程

5.ffp_prepare_async_l()/ff_ffplay.c

6.stream_open()/ff_ffplayer.c

{

……

is->video_refresh_tid= SDL_CreateThreadEx(&is->_video_refresh_tid, video_refresh_thread, ffp,"ff_vout"); //启用相应的显示线程

……

}

6.1.video_refresh_thread()/ff_ffplay.c

6.2.ffpipenode_run_sync()/ff_ffpipenode.c

6.3.staticint func_run_sync(IJKFF_Pipenode *node)

{

IJKFF_Pipenode_Opaque *opaque =node->opaque;

returnffp_video_refresh_thread(opaque->ffp);

}//ffpipenode_ffplay_vout.c

6.4.int ffp_video_refresh_thread(FFPlayer*ffp)

{

return ffplay_video_refresh_thread(ffp);

}//ff_ffplay.c

6.5.video_refresh()/ff_ffplay.c

6.6.video_display2()/ff_ffplay.c

6.7.video_image_display2()/ff_ffplay.c

{

……

SDL_VoutDisplayYUVOverlay(ffp->vout,vp->bmp); //显示相应的数据

……

}

7.stream_open()/ff_ffplayer.c

{

……

is->read_tid= SDL_CreateThreadEx(&is->_read_tid, read_thread, ffp,"ff_read"); //创建读线程

……

}

staticint read_thread(void *arg)

{

……

stream_component_open()

……

ret = av_read_frame(ic,pkt);

……

//ifaudio

packet_queue_put(&is->audioq,pkt);

……

//ifvideo

packet_queue_put(&is->videoq,pkt);

……

}

staticint stream_component_open(FFPlayer *ffp, int stream_index)

{

……

//ifaudio 创建audio解码线程

decoder_start(&is->auddec,audio_thread, ffp, "ff_audio_dec");

//ifvideo 创建video解码线程

decoder_start(&is->viddec,video_thread, ffp, "ff_video_dec");

}

8.//声音解码线程

staticint audio_thread(void *arg)

{

……

if((got_frame = decoder_decode_frame(ffp, &is->auddec, frame, NULL)) <0)

……

frame_queue_push(&is->sampq);

……

} //

9.//视频解码线程

staticint video_thread(void *arg)

{

FFPlayer *ffp = (FFPlayer *)arg;

intret = 0;

if (ffp->node_vdec) {

ret =ffpipenode_run_sync(ffp->node_vdec);

}

return ret;

} //ff_ffplay.c

intffpipenode_run_sync(IJKFF_Pipenode *node)

{

return node->func_run_sync(node); //此处区分软硬解码部分

} //ff_ffpipenode.c

//软解码部分

staticint func_run_sync(IJKFF_Pipenode *node)

{

IJKFF_Pipenode_Opaque *opaque = node->opaque;

return ffp_video_thread(opaque->ffp);

} //ffpipenode_ffplay_vdec.c

intffp_video_thread(FFPlayer *ffp)

{

return ffplay_video_thread(ffp);

} //ff_ffplay.c

staticint ffplay_video_thread(void *arg)

{

……

for (;;) {

ret = get_video_frame(ffp, frame);

……

ret =queue_picture(ffp, frame, pts, duration, av_frame_get_pkt_pos(frame),is->viddec.pkt_serial);

……

} //ff_ffplay.c

staticint get_video_frame(FFPlayer *ffp, AVFrame *frame)

{

VideoState *is = ffp->is;

int got_picture;

if ((got_picture =decoder_decode_frame(ffp, &is->viddec, frame, NULL)) < 0) //解码相应的视频数据

return -1;

……

}//ff_ffplay.c

//硬解码部分

staticint func_run_sync(IJKFF_Pipenode *node)

{

……

人若勇敢就是自己最好的朋友

ijkplayer程序结构整理

相关文章:

你感兴趣的文章:

标签云: