ijkPlayer
2016-05-26 17:32:50 7 举报
ijkPlayer
作者其他创作
大纲/内容
seek操作
+ - 清空包队列- 设置时钟clock- send FFP_MSG_SEEK_COMPLETE message.
ffp_seek_to_l
post_event--J4AC_IjkMediaPlayer__postEventFromNative
message_loop_n
if support hw
video_refresh
reek_req
ijkplayer_android.c
ijkmp_android_create
ffp_queue_picture
ffpipienode_android_mediacodec_vcdec.c
...
主体是一个循环里轮询是否需要更新视频帧video_refresh 函数计算同步剩余时间和显示
FFP_REQ_SEEK
创建解码器流程
ijksdl_codec_android_mediacodec_java.c acodec-opaque_class = &g_amediacodec_class; acodec-func_delete = SDL_AMediaCodecJava_delete; acodec-func_configure = NULL; acodec-func_configure_surface = SDL_AMediaCodecJava_configure_surface; acodec-func_start = SDL_AMediaCodecJava_start; acodec-func_stop = SDL_AMediaCodecJava_stop; acodec-func_flush = SDL_AMediaCodecJava_flush;//....
ijkmp_get_msg将AVMessage(来自ffplay) 转为我们的自定义message.
解码线程(硬解)
if (pkt == &flush_pkt) q-serial++;
ijksdl_vout_overlay_ffmpeg.c
SDL_VoutAndroid_releaseBufferProxyP
ff_ffplay.c
ffpipienode_android_mediacodec_vcdec.c#func_run_sync
软解也有对应的func_run_sync .主要循环调用:
实际read_thread的for循环有更多处理.主要与包队列有关.包括pause/resume/seek等操作.
ffpipeline_android.c
IJKFF_Pipeline *ffpipeline_create_from_android(FFPlayer *ffp) pipeline-func_destroy = func_destroy; pipeline-func_open_video_decoder = func_open_video_decoder; pipeline-func_open_audio_output = func_open_audio_output;
if (lastvp-serial != vp-serial && !redisplay) is-frame_timer = av_gettime_relative() / 1000000.0;
ijk_player.c
IjkMediaPlayer_native_setup
if (vp-serial != is-videoq.serial) { frame_queue_next(&is-pictq); redisplay = 0; goto retry; }
把解码后的帧放入帧队列.在这之前有一个很重要的处理:SDL_VoutFillFrameYUVOverlay
packet_queue_flush(&is-subtitleq);packet_queue_put
ff_ffplay.c#read_thread#seek_req
接收线程
消息系统
seek 操作示例
read_thread
av_usleep((int)(int64_t)(remaining_time * 1000000.0));
ijksdl_vout_android_nativewindow.c
func_display_overlay
stream_seek
is-seek_pos = pos; is-seek_rel = rel; is-seek_req = 1; SDL_CondSignal(is-continue_read_thread);
输入线程EnqueueBuffer
ffp_toggle_buffering
ff_ffplay.c#video_refresh
video_refresh_thread
关于flush_pkt: av_init_packet(&flush_pkt); flush_pkt.data = (uint8_t *)&flush_pkt;关于serial: if (pkt == &flush_pkt) q-serial++; pkt1-serial = q-serial;
ijkplayer_jni.c
stream_open
packet_queue_put
渲染线程
ffpipenode_androdi_mediacodec_vdec.c#enqueue_thread_func
#stream_component_opencall when stream available
接口
何时更新 frame_timer?
0 条评论
下一页