mpv core_thread pipeline
级别 | 函数 | 文件 | 行号 |
---|---|---|---|
1 | vo_queue_frame | vo.c | 881 |
2 | write_video | video.c | 1273 |
3 | run_playloop | playloop.c | 1268 |
4 | play_current_file | loadfile.c | 1914 |
5 | mp_play_files | loadfile.c | 2100 |
6 | core_thread | client.c | 599 |
7 | start_thread | pthreadcreat… | 442 |
8 | clone3 | clone3.S | 81 |
这展示了 MPV 多媒体播放器中一个核心线程(core_thread)在播放文件时的函数调用栈(Call Stack)。
我们从最深层(栈底) 开始解读,向上追踪到最终执行的动作(栈顶):
-
起点:创建线程 (clone3 & start_thread)
-
运行播放器核心线程 (core_thread)
◦ 级别 6: core_thread (in client.c:5): 这是 MPV 自己实现的线程函数。可以认为是播放器核心逻辑的“主循环”或运行入口点。 -
核心播放逻辑 (mp_play_files & family)
◦ 级别 5: mp_play_files (in loadfile.c:2): 这是 开始播放一个或多个文件的关键入口点。它被core_thread调用。◦ 级别 4: play_current_file (in loadfile.c:1): 这个函数专注于播放当前选定文件的具体逻辑。它被mp_play_files调用。
◦ 级别 3: run_playloop (in playloop.c:1): 这是 MPV 播放事件循环的核心。它不断地处理用户输入、解码帧、控制同步、渲染输出等任务,直到播放结束或被中断。
-
视频输出流水线 (write_video & vo_queue_frame)
◦ 级别 2: write_video (in video.c:1): 这个函数负责处理解码后的视频帧。它可能涉及格式转换、滤镜处理等操作,最终目的是将准备好的视频帧交给视频输出 (VO) 模块。◦ 级别 1: vo_queue_frame (in vo.c:8): 这是调用栈的顶端(即当前正在执行或最近执行的点)。它是 VO (Video Output) 模块的核心函数,负责将write_video提交过来的视频帧加入渲染队列。VO 模块随后会将这些帧从队列中取出,使用系统资源(如 OpenGL, Vulkan, DirectX, X11, Wayland 等)将其最终绘制到屏幕上。
总结执行流程:
系统创建线程 (clone3/start_thread) ➔ MPV 核心线程启动 (core_thread) ➔ 调用开始播放函数 (mp_play_files) ➔ 播放当前文件 (play_current_file) ➔ 进入主播放循环 (run_playloop) ➔ 处理视频帧 (write_video) ➔ 将帧提交给视频输出模块渲染 (vo_queue_frame)。