ff_compute_frame_duration() 代码注释

/**
 * 输入参数: s(格式上下文), st(流), pc(分析器上下文), pkt(包)
 * 输出参数: pnum(分子地址),pden(分母地址)
 * 描述: 返回 frame 时长,秒值,用分数表达. 得不到时长时返回 0(*pnum=0,*pden=0);

 */
void ff_compute_frame_duration(AVFormatContext *s, int *pnum, int *pden, AVStream *st,
                               AVCodecParserContext *pc, AVPacket *pkt)
{
    //取得帧率, avctx->framerate 或计算得到
    //实例: st->internal->avctx->ticks_per_frame = 2, st->internal->avctx->time_base = {1,50}, st->internal->avctx->framerate={25,1}
    //则不管s->iformat 是否为真,codec_framerate 都为{25,1}

    AVRational codec_framerate = s->iformat ? st->internal->avctx->framerate :
                                              av_mul_q(av_inv_q(st->internal->avctx->time_base), (AVRational){1, st->internal->avctx->ticks_per_frame});
    int frame_size, sample_rate;

#if FF_API_LAVF_AVCTX
FF_DISABLE_DEPRECATION_WARNINGS
    //当没有得到有效的codec_framerate 时,我们再换一种方法计算(由st->codec->time_base 及 st->codec->ticks_per_frame(此例为2) 计算
    if ((!codec_framerate.den || !codec_framerate.num) && st->codec->time_base.den && st->codec->time_base.num)
        codec_framerate = av_mul_q(av_inv_q(st->codec->time_base), (AVRational){1, st->codec->ticks_per_frame});
FF_ENABLE_DEPRECATION_WARNINGS
#endif

    //初始化输出
    *pnum = 0;
    *pden = 0;
    switch (st->codecpar->codec_type) {
    case AVMEDIA_TYPE_VIDEO:
        if (st->r_frame_rate.num && !pc && s->iformat) {
            *pnum = st->r_frame_rate.den; //返回 stream 的额定帧率
            *pden = st->r_frame_rate.num;
        } else if (st->time_base.num * 1000LL > st->time_base.den) { //分子,分母不超过1000倍时
            *pnum = st->time_base.num; //返回 stream 的时基
            *pden = st->time_base.den;
        } else if (codec_framerate.den * 1000LL > codec_framerate.num) {
            av_assert0(st->internal->avctx->ticks_per_frame); //av_asser0()是断言条件不为0
            av_reduce(pnum, pden,  // 返回简化的codec_framerate
                      codec_framerate.den,
                      codec_framerate.num * (int64_t)st->internal->avctx->ticks_per_frame,
                      INT_MAX);

            if (pc && pc->repeat_pict) { // pc 为真, pc->repeat_pict = 1
                av_assert0(s->iformat); // this may be wrong for interlaced encoding but its not used for that case
                av_reduce(pnum, pden,  //约简 *pnum*2/ *pden, 返回 {1,25}
                          (*pnum) * (1LL + pc->repeat_pict),
                          (*pden),
                          INT_MAX);
            }
            /* If this codec can be interlaced or progressive then we need
             * a parser to compute duration of a packet. Thus if we have
             * no parser in such case leave duration undefined. */
            if (st->internal->avctx->ticks_per_frame > 1 && !pc)
                *pnum = *pden = 0;
        }
        break;
    case AVMEDIA_TYPE_AUDIO: // 音频未注释, 它是从其它地方获取值
        if (st->internal->avctx_inited) {
            frame_size = av_get_audio_frame_duration(st->internal->avctx, pkt->size);
            sample_rate = st->internal->avctx->sample_rate;
        } else {
            frame_size = av_get_audio_frame_duration2(st->codecpar, pkt->size);
            sample_rate = st->codecpar->sample_rate;
        }
        if (frame_size <= 0 || sample_rate <= 0)
            break;
        *pnum = frame_size;
        *pden = sample_rate;
        break;
    default:
        break;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SM2算法是由中国国家密码管理局研究所设计的一种公钥密码算法,与国际上使用广泛的RSA和ECC算法不同,SM2算法采用了国密体系所定义的椭圆曲线密码体系,并加入了大量的安全机制,使得它在国内文化背景下具有很高的安全性和可靠性。 在SM2算法中,sm2_compute_id_digest函数是用于计算消息摘要的函数。它采用了国密体系中定义的哈希算法,将原始消息转化为一个长度为256位的固定长度摘要。sm2_compute_id_digest函数的具体实现步骤如下: 1. 读入输入的消息数据,计算数据的长度,以便于之后的拼接和填充操作。 2. 采用SM3哈希算法对输入消息进行处理,并将处理结果保存在buf1缓冲区中。 3. 用掩码随机化过程进行填充,将buf1缓冲区中的处理结果拼接在掩码随机值的末尾。填充过程需要满足国密体系所定义的填充规则,以确保填充后的消息在安全上是可靠的。 4. 使用SM3哈希算法再次对填充过后的消息进行处理,得到256位的摘要值,并将其保存在buf2缓冲区中。 5. 返回计算得到的消息摘要值。 总的来说,sm2_compute_id_digest函数是SM2算法中一个非常重要的组成部分之一,它的计算结果对于算法的安全性和可靠性具有关键的影响。在使用SM2算法进行加密和签名操作时,都需要调用sm2_compute_id_digest函数计算消息摘要,以确保加密和签名结果的正确性和安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值