【VLC核心二】clock管理流程

一、前言

clock管理是vlc播放音视频的重要部分,从live555收流到decoder解码到render渲染,整个播放过程中均需依赖clock机制。

二、涉及的类文件

src\input\input.c

modules\access\live555.cpp

src\input\es_out.c

src\input\decoder.c

src\input\clock.c

三、clock核心点备注

1、live555::CmdExecuteControl(ES_OUT_SET_PCR,p_sys->i_pcr+1)

注:p_sys->i_pcr+1作为input_clock_Update的i_ck_stream参数传入。p_sys->i_pcr在live555的StreamRead函数中赋值

2、clock中i_cr_average值的来源

clock中i_cr_average=配置文件中读取默认40ms * i_pts_delay / DEFAULT_PTS_DELAY;
DEFAULT_PTS_DELAY = 3*CLOCK_FREQ/10

3、当准备收流或回放拖动时,会触发设置PCR动作,对应ES_OUT_SET_PCR,继而调用clock::input_clock_Update(i_pcr, mdate()),更新clock机制,其核心处理如下

a、判断当前流时戳与上一帧时戳差值是否大于MAX_GAP,如果大于MAX_GAP,说明收到的帧已经跳变过大,则重置clock值ResetClock。(MAX_GAP宏的值为60s,可以调整宏代码,此值过大,应该调整为1s以内,否则在回放拖动时有bug,后续文章详解);

b、每隔20ms调用AvgUpdate计算一次 stream clock 和system clock间的漂移;

typedef struct
{
    mtime_t i_value;
    int     i_residue; //残余

    int     i_count;
    int     i_divider; // 分割;分配
} average_t;

AvgUpdate详解:
//将当前mdate时间转换为流时戳
const mtime_t i_converted = ClockSystemToStream( cl, i_ck_system );
//用转换的流时戳-真实流时戳作为ivalue
AvgUpdate( &cl->drift, i_converted - i_ck_stream );

static void AvgUpdate( average_t *p_avg, mtime_t i_value )
{
    const int i_f0 = __MIN( p_avg->i_divider - 1, p_avg->i_count );//i_f0记录当前已存值的个数
    const int i_f1 = p_avg->i_divider - i_f0;//剩余个数
	//统计总值=已存个数*平均value + 剩余个数*新来i_value + 余数
	// 好处是:未存满值的时候,剩余个数均使用新的i_value填充
    const mtime_t i_tmp = i_f0 * p_avg->i_value + i_f1 * i_value + p_avg->i_residue;
	// 计算新平均值和余数
    p_avg->i_value   = i_tmp / p_avg->i_divider;
    p_avg->i_residue = i_tmp % p_avg->i_divider;

    p_avg->i_count++;
}

c、计算当前帧是否来晚了

当前系统时戳即mdate的当前时间- (当前系统时戳将流时戳+平均偏移,转换为系统时戳)。如果大于零,说明改帧比期望它到的时间来晚了。来晚了就更新到数组里。VLC缓存了三个late的值,为后续GetJitter获取的时候可以计算平均的late值。

摘录:如果late,存储到数组中
if( i_late > 0 )
    {
        cl->late.pi_value[cl->late.i_index] = i_late;
        cl->late.i_index = ( cl->late.i_index + 1 ) % INPUT_CLOCK_LATE_COUNT;
    }

摘录:input_clock_GetJitter
寻找中间的late值,这种方法可以规避掉bad values
const mtime_t *p = cl->late.pi_value;
    mtime_t i_late_median = p[0] + p[1] + p[2] - __MIN(__MIN(p[0],p[1]),p[2]) - __MAX(__MAX(p[0],p[1]),p[2]);
    mtime_t i_pts_delay = cl->i_pts_delay ;

d、如果晚了,在es_out.c中,调用clock::input_clock_GetJitter统计抖动,并调用clock:: input_clock_Reset和input_clock_SetJitter重置clock,重新调节计算漂移的参数。这样就可以重新缓存待解码的数据。

4、缓存数据的核心流程

a、每次es_out.c中SET_PCR中调用EsOutDecodersStopBuffering 如果是缓冲状态, 判断是否缓冲完?

1)计算流缓存时间:调用input_clock_GetState检查i_stream_duration值得到流缓存的时间
2)计算预设缓存时间:
const mtime_t i_buffering_duration = p_sys->i_pts_delay + i_preroll_duration + p_sys->i_buffering_extra_stream - p_sys->i_buffering_extra_initial;
实测中i_buffering_duration  = p_sys->i_pts_delay = 1000;其它值为0,待研究什么情况下其它值不为零。
3)如果i_stream_duration<i_buffering_duration,则继续缓冲,否则已缓冲满。

b、input_DecoderWaitBuffering缓冲完通知decoder模块。解码模块队列中循环解码,可参考文章《【VLC核心一】播放流程梳理

5、clock在live555收流拼帧部分相关工作

a、拼帧完成后送SteamRead,SteamRead中的处理

int64_t i_pts = (int64_t)pts.tv_sec * INT64_C(1000000) +(int64_t)pts.tv_usec;
i_pts &= INT64_C(0x00ffffffffffffff);

if( p_sys->i_pcr < i_pts )
{
    p_sys->i_pcr = i_pts;
}

四、核心流程时序图

时间: 2024-09-22 05:48:02

【VLC核心二】clock管理流程的相关文章

【VLC核心一】播放流程梳理-&amp;gt;live555收流+ffmpeg:AVCodec解码

一.前言 VLC播放音视频的核心流程梳理,从live555收流到ffmpeg解码的整套流程 涉及到MultiFramedRTPSource.RTPSource.FramedSource.live555.es_out.decoder.video.clock.video_output.araw.mtime.dec.input.output.filters.directx等核心类. 二.核心点备注 1.RTPSource中使用报文时间戳与当前时间计算抖动的核心代码 unsigned arrival =

互联网产品需求管理:产品管理流程

  对于互联网公司而言,产品需求管理是产品研发的核心环节,产品需求的正确与否直接影响产品开发周期.产品开发成本.产品运营成本,甚至直接决定了产品市场竞争力.根据统计:产品开发中40%-60%的问题都是在需求阶段埋下的"祸根" ,在测试阶段及运营阶段发现需求阶段植入的问题,解决的代价是需求阶段发现问题的68-200倍.      关于需求管理的故事很多,列举一些常见问题: 某天老板问起:我很久以前提过一个需求,提过以后就没下文了.产品经理无辜地说:有提过吗,是给我提的吗? 某个销售谈起:

林正刚:什么是管理流程?

林正刚:前思科中国总裁.刚逸领导力公司CEO:企业教练和管理专家管理流程是管理层为部门之间与员工之间的沟通路线,如果部门之间及员工之间能自动自发作出适当的沟通,那管理流程就没有存在的必要.过分的管理流程会降低员工积极性,缺乏管理流程就会乱套,管理层整天就是在这两者之间纠结,并要取得一个平衡.管理流程这个词与商业模型一样,是一个能造成大量误解的词汇.每个人对这个词都可能有一个不同的理解,甚至一个人的理解也会不断有变化,所以你可以想象,用它来作沟通会产生多么混乱的场面.为什么我们要在意"管理流程&q

解析什么是真正的IT服务管理流程?

IT如何与业务更好地融合?通常在IT管理中都会遇到这样的情况,IT部门在整个企业架构中人员都相对较少,专业人员缺乏,这是IT部门经常反映比较多的问题.通过对IT部门关注点进行了调研,发现50%以上IT部门人员认为,就是害怕业务中断,会影响业务部门以及领导对IT部门的绩效考核.企业领导.业务部门.IT部门,从三方角度来考虑IT系统建设时候出现这么多问题,怎么办?有没有很好的方法可以去解决这些问题? 实际上在1989年的时候,英国政府已经推出所谓的ITIL实施流程,这套IT服务管理理念方法和标准,已

优化百度推广账户优化管理流程精细化

做百度竞价推广的人员应该都知道,优化http://www.aliyun.com/zixun/aggregation/11238.html">百度推广账户最主要的目标就是在高流量的基础之上提高访客精准度,在一定的程度上来减少甚至是避免无效点击,这一目 标实现的过程即为优化管理流程精细化,这样不仅在对话质量上有所提高,还可以降 低成本,总体上来说是可做的.到底如何才能做到管理的精细化呢?下面望奎根 据自身的实战经验分享一下 几点,希望望奎的分享对大家有所帮助, 小脑袋竞价助手今天给您详细说明一

OA系统和CRM客户关系管理 流程是核心

客户关系管理CRM系统,主要是帮助企业对客户资源进行有效管理,帮助对客户进行跟踪以及回访,管理客户信息,促进成单,为客户管理的发展提供参考,同时起到监督作用.是企业管理的重要环节.而流程,则是OA系统和CRM是否好用的关键因素.(该资料由10oa提供,转自:www.10oa.com) 二进制软件公司10oa协同办公系统的CRM客户关系管理子系统,和10oa系统一样,是以BPM(业务流程管理)为内核,实现客户.人员.商机.销售.跟单.回款.合同.服务等的全面协同,提高企业收益,加强员工管理,增强跟

管理-流程及流程步骤(不用流框架)新手求解 -- 在线等 ??

问题描述 流程及流程步骤(不用流框架)新手求解 -- 在线等 ?? 现在做了一个仓库管理的流程及步骤管理.因为没有学过流框架,有没有经验的大神,告知一下思路?我有流程表.流程步骤管理表现在多加了一张专门业务处理的表,单据(多张不同)引用这业务处理的id,在进行单据审批时,我有如下的困惑?1.如果我改变了单据(本身没有状态字段)引用表的状态,业务处理表的状态会改变吗?2.因为有多个流程步骤,如果我第一步骤已通过审批,第二步骤在审批的时候怎么处理(因为每个具体的步骤由不同的人审批,)?现在怎么一步一

Git 在小团队中的管理流程(转)

  目标读者:了解 Git 的基本概念,能够使用 Git 进行基本的本地和远程操作. 有关 Git 的基础知识可以参见 知乎回答-怎样使用 GitHub?,天猪(刘勇)给出了一些很好的学习资料. 本文介绍了小团队中 Git 管理的基本使用流程.小团队的代码管理可以采用这样一种方式:项目存在一个中心远程仓库,作为团队成员进行代码交流的主要场所.同时可以存在一些成员远程仓库,用于局限在团队中部分成员间的代码交流.并将成员分成以下几类不同的角色:负责人.普通组员.预发布责任人 和 版本修复责任人.下面

国内银行的IT运维管理亟待管理流程化

进入21世纪,积极推进数据大集中是国内银行业的一项重大举措,目的是实现银行集约化管理,降低经营风险.然而,数据大集中就像是将全世界的桥梁都整合成一座桥梁一样,它在方便银行经营管理的同时,也给银行的IT运维提出了巨大的挑战.一方面数据中心集中了几乎所有的应用和系统,技术复杂度和关联度今非昔比:另一方面运维人员的高度集中和专业化也带来了运维管理的高度复杂性. 虽然这些年银行在安全设备的应用上越来越多,安全手段的采用也越来越多,但安全状况却不见好转.一些银行的IT管理人员经常纳闷:我们已经在安全方面投