ChinaFFmpeg

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 140|回复: 2

[源码] ffmpeg库在飞腾2000CPU上解码奇慢

[复制链接]
发表于 2024-2-29 15:40:02 | 显示全部楼层 |阅读模式
各位好,最近遇到一个奇怪的问题,如题,求教大家。具体描述下我遇到的情况
1、我的开发工具是freepascal + lazarus, 通过调用ffmpeg动态库利用CPU解码h264 1080p文件。
2、简单的demo在x86架构的windows和linux都工作正常(效率是10毫秒/秒),但在飞腾2000 CPU + UOS机器
     上(aarch64架构)解码奇慢,效率只有70毫秒/秒。更奇怪的是用qt写个同样逻辑和功能的demo却效率正常。
3、调试ffmpeg avcodec_decode_video2的源代码,涉及的文件主要包括h264dec.c、 h264_slice.c、  
     h264_cabac.c。主要功能是h264_decode_frame->decodedeal_units->decode_slice。
     耗时最长的函数是decode_slice。decode_slice函数内部简要流程:
     ff_init_cabac_decoder->ff_h264_init_cebac_states->ff_h264_Decode_mbm_cabac。
     在freepascal+lazarus环境中,ff_h264_init_cabac_states和ff_h264_decode_mbm_cabac的执行效率仅为  
     QT环境中的1/6。贴出ff_h264_init_cabac_states的源代码,主要在for循环上花费时间。
     确切地说,ff_h264_decode_mb_cabac也处于大量的for循环中,因为h264帧由许多宏块组成,
     ff_h264_decode_mb_cabac只是完成单个宏块的解码。有n个宏块就在for循环中调用n次  
     ff_h264_decode_mb_cabac。
     在qt下,ff_h264_init_cabac_states的for循环耗时为6个clock_t,而在freepascal下,耗时为36个clock_t。

void ff_h264_init_cabac_states(const H264Context *h, H264SliceContext *sl)
{
    int ii;
    const int8_t (*tab)[2];
    const int slice_qp = av_clip(sl->qscale - 6*(h->ps.sps->bit_depth_luma-8), 0, 51);

    if (sl->slice_type_nos == AV_PICTURE_TYPE_I)
          tab = cabac_context_init_I;
    else                              
          tab = cabac_context_init_PB[sl->cabac_init_idc];

    //calculate pre-state
    for( ii= 0; ii < 1024; ii++ ) {
        int pre = 2*(((tab[ii][0] * slice_qp) >>4 ) + tab[ii][1]) - 127;

        pre^= pre>>31;
        if(pre > 124)
            pre= 124 + (pre&1);

        sl->cabac_state[ii] =  pre;
    }
}
   
回复

使用道具 举报

 楼主| 发表于 2024-2-29 15:41:22 | 显示全部楼层
大牛们,请帮我分析下哪些因素导致了这个现象?谢谢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-29 16:14:14 | 显示全部楼层
ffmpeg版本是4.4.2,但用ffmpeg3.4.2也是一样的现象
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|Archiver|ChinaFFmpeg

GMT+8, 2024-5-2 10:45 , Processed in 0.050792 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表