免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1171 | 回复: 0
打印 上一主题 下一主题

VLC视频处理代码浅析 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-11 12:18 |只看该作者 |倒序浏览


一  序言

         最近看了vlc代码(版本0.5.0)视频处理播放过程,写个总结把视频数据主要流程整理一下。Vlc视频处理及播放的过程主要是三个循环:demux ,  decoder,  display.


二  视频处理播放过程介绍

     1,demux循环

     在src/input/input.c中__input_CreateThread()创建一个线程RunThread()。该线程中的while()循环,起到一个守护作用,例如对seek的处理等;其中的p_input->pf_demux( p_input )函数进行demux处理。该函数是在InitThread()时,由p_input->p_demux = module_Need( p_input, "demux",p_input->psz_demux );进行关联的。以TS流为例,demux/mpeg/ts.c 中的activate()会被激活,进而设置p_input->pf_demux = Demux; 所以,TS.C中的Demux()为执行demux的函数。其中的p_demux->mpeg.pf_read_ts和p_demux->mpeg.pf_demux_ts是在activate()时由p_demux->p_module = module_Need( p_input, "mpeg-system", NULL )关联到mpeg/system.c中的Readts()和Demuxts()。


     2,decoder循环

  在Demux()函数执行时会调用PSI_CALLBACK宏,通过调用该宏最终会调用src/input/input_program.c中的input_SelectEs()函数。该函数会调用src/input/input_dec.c中的input_RunDecoder()。input_RunDecoder()中会创建Decoder线程RunDecoder( ) (见ffmpeg/ffmpeg.c) 。RunDecoder( )包含一个while( )循环,在循环中如果数据为VIDEO_ES,会调用codec/ffmpeg/video.c中的void  E_( DecodeThread_Video )( vdec_thread_t *p_vdec )函数进行解码,该函数会调用ffmpeg_CreateVout()来创建视频输出线程。


     3,display循环


  ffmpeg_CreateVout()函数会调用vout_request( )函数,进而通过vlc_thread_create( p_vout, "video output", RunThread,
                           VLC_THREAD_PRIORITY_OUTPUT, VLC_FALSE )创建线程RunThread()。该线程中的while( )中循环执行的函数的主要功能如下:1)找到最近的需要显示的图像,2)rendering 图像 ,3)睡眠到显示图像的时间,4)显示图像, 5)事件处理。其中p_vout->pf_render( )是由src/video_output/video_output.c文件__vout_create( )函数中module_Need()关联的。

三  其它

1,关于VLC的音视频同步

对于音频数据,前面的过程跟视频类似 ,不同的是音频输出环节。视频播放处理是在一个线程内循环完成的,但音频播放的不同模块运行在不同的线程上。音视频的同步完全是按照demux后音视频各自的PTS进行的,原理上跟mplayer  的同步机制完全不同。

2,   该文是本人的学习笔记,难免有错误之处,欢迎指正交流。
   



本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/72365/showart_1404944.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP