当前位置: 首页 > article >正文

FFmpeg源码:avpriv_set_pts_info函数分析

一、avpriv_set_pts_info函数的声明

avpriv_set_pts_info函数声明在FFmpeg源码(本文演示用的FFmpeg源码版本为7.0.1)的头文件libavformat/internal.h中:

/**
 * Set the time base and wrapping info for a given stream. This will be used
 * to interpret the stream's timestamps. If the new time base is invalid
 * (numerator or denominator are non-positive), it leaves the stream
 * unchanged.
 *
 * @param st stream
 * @param pts_wrap_bits number of bits effectively used by the pts
 *        (used for wrap control)
 * @param pts_num time base numerator
 * @param pts_den time base denominator
 */
void avpriv_set_pts_info(AVStream *st, int pts_wrap_bits,
                         unsigned int pts_num, unsigned int pts_den);

该函数的作用是:设置AVStream的time_base。

形参st:输出型参数,指向一个AVStream对象。执行avpriv_set_pts_info函数后,st->time_base和st->pts_wrap_bits会被设置。

形参pts_wrap_bits:输入型参数,pts有效使用的位数。执行avpriv_set_pts_info函数后,st->pts_wrap_bits的值会被设置为pts_wrap_bits。

形参pts_num:输入型参数。time_base的分子。

形参pts_den:输入型参数。time_base的分母。

二、avpriv_set_pts_info函数的定义

avpriv_set_pts_info函数定义在源文件libavformat/avformat.c中:

void avpriv_set_pts_info(AVStream *st, int pts_wrap_bits,
                         unsigned int pts_num, unsigned int pts_den)
{
    FFStream *const sti = ffstream(st);
    AVRational new_tb;
    if (av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)) {
        if (new_tb.num != pts_num)
            av_log(NULL, AV_LOG_DEBUG,
                   "st:%d removing common factor %d from timebase\n",
                   st->index, pts_num / new_tb.num);
    } else
        av_log(NULL, AV_LOG_WARNING,
               "st:%d has too large timebase, reducing\n", st->index);

    if (new_tb.num <= 0 || new_tb.den <= 0) {
        av_log(NULL, AV_LOG_ERROR,
               "Ignoring attempt to set invalid timebase %d/%d for st:%d\n",
               new_tb.num, new_tb.den,
               st->index);
        return;
    }
    st->time_base     = new_tb;
    if (sti->avctx)
        sti->avctx->pkt_timebase = new_tb;
    st->pts_wrap_bits = pts_wrap_bits;
}

 关于av_reduce函数可以参考:《FFmpeg源码:av_reduce函数分析》。avpriv_set_pts_info函数的核心就是通过调用av_reduce函数对有理数进行化简:

av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)


http://www.kler.cn/news/292680.html

相关文章:

  • SpringBoot 实战:SpringBoot整合Flink CDC,实时追踪mysql数据变动
  • Java简单实现服务器客户端通信
  • 0to1使用JWT实现登录认证
  • ubuntu24下安装pytorch3d
  • ARM 伪指令 (26)
  • 2024年高教社杯数学建模国赛赛题浅析——助攻快速选题
  • 【系统架构设计师】论文:论SOA在企业集成架构设计中的应用
  • 【Rust光年纪】探索Rust嵌入式开发利器:从硬件访问到USB绑定
  • Ubuntu设置
  • Spring Boot实现License生成和校验
  • Java中的Stream流
  • wsl2 安装qt5
  • gdb使用
  • 【运维监控】influxdb 2.0+telegraf 监控tomcat 8.5运行情况(2)
  • 使用文件系统管理硬件设备
  • 深入探索 Go 语言的编译器与垃圾回收机制
  • 深圳又有5家企业高新企业资质被取消?
  • Redis在服务器启动的日志问题
  • RestTemplateRibbonOpenFeign
  • Java 可变参数
  • Canvas 在 微信小程序-uni-APP 和 H5 中的使用差异
  • JavaWeb - Mybatis - 动态SQL
  • STM32 系列MCU 开发利器 STM32CubeIDE
  • webview无法加载http流量及Expo修改Android权限
  • MyBatis 一级缓存原理
  • 启动spring boot项目时,第三方jar包扫描不到的问题
  • 异步编程学习
  • Java项目:142 基于springboot的实习管理系统
  • flutter Image
  • 浏览器百科:网页存储篇-如何在Chrome中打开Cookie(二)