关于linux定时器和Hi3536的VDEC解码

哗啦啦~ 2020-07-31 16:23:10 2318

最近做Hi3536的VDEC解码,由于测试需求,需要从磁盘中读视频文件,给到VDEC进行解码。

Hi3536的VDEC解码,有两种播放模式,预览模式和回放模式。

顾名思义,预览模式是实时的,VDEC尽最大努力解码,如果VPSS缓冲满了,VDEC就丢掉后续的解码帧,直道VPSS缓冲有空闲

回放模式不是实时的,根据后端的使用决定,如果后端缓冲满了,VDEC就暂停解码,保证所有帧都能送出去,不丢帧。

使用中,遇到如下一些限制,至今未能搞懂是不是我的使用有问题:

使用回放模式,VDEC的解码帧率可以通过VO来控制,但是VPSS通道不能为user模式,所以VPSS通道无法自定义分辨率,这个不能忍。

使用预览模式,VPSS可以自由设定,但是解码帧率不能用VO来控制。

当使用VDEC的pts控制解码帧率时,播放一段时间后,视频卡顿。

于是想到使用linux的定时器来控制帧率。如需要30fps,那么就定时33ms读取一次视频文件,送给VDEC进行解码。经测试可行。

以下是linux定时器的使用。

1、使用select或usleep,将时间设置为33ms。这样时间会不准确,33ms的定时是准确的,但是定时到后,需要调用发送码流给VDEC的函数,

这就需要额外的时间,所以总体上不精确。

2、使用settimer函数,用这个函数可以达到精确定时的目的,当时间到后,产生闹钟信号,就会调用信号处理函数,在信号处理函数中发送码流给VDEC

但是,这里需要产生闹钟中断信号,其他系统调用会被打断,影响软件运行。

3、使用timer_create函数,这个方法不仅可以达到settimer的精确定时目的,而且不用产生中断信号,不影响其他系统调用的运行。

代码举例如下:( COMM_VDEC_SendStream_timerProc,是发送码流给VDEC的函数)

// 设置定时器
    timer_t timerid;  
    struct sigevent evp;  
    memset(&evp, 0, sizeof(struct sigevent));       //清零初始化  

    evp.sigev_value.sival_int = 111;            //也是标识定时器的,这和timerid有什么区别?回调函数可以获得  
    evp.sigev_notify = SIGEV_THREAD;            //线程通知的方式,派驻新线程  
    evp.sigev_notify_function = COMM_VDEC_SendStream_timerProc;   //线程函数地址  

    if (timer_create(CLOCK_REALTIME, &evp, &timerid) == -1)  
    {  
        perror("fail to timer_create");  
        exit(-1);  
    }  

    // 设置定时时间
    struct itimerspec it;  
    it.it_interval.tv_sec = 0;  
    it.it_interval.tv_nsec = 33333333;  
    it.it_value.tv_sec = 0;  
    it.it_value.tv_nsec = 33333333;  

    // 启动定时器
    if (timer_settime(timerid, 0, &it, NULL) == -1)  
    {  
        perror("fail to timer_settime");  
        exit(-1);  
    }  

    while(1)
    {
        pause(); 
    }

原文链接:https://blog.csdn.net/zzw_awen/article/details/75947593

推荐阅读

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 4 2 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
哗啦啦~
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区