cwlyj001 发表于 2024-2-29 15:40:02

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

各位好,最近遇到一个奇怪的问题,如题,求教大家。具体描述下我遇到的情况
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);
    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;

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

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

      sl->cabac_state =pre;
    }
}
   

cwlyj001 发表于 2024-2-29 15:41:22

大牛们,请帮我分析下哪些因素导致了这个现象?谢谢

cwlyj001 发表于 2024-2-29 16:14:14

ffmpeg版本是4.4.2,但用ffmpeg3.4.2也是一样的现象
页: [1]
查看完整版本: ffmpeg库在飞腾2000CPU上解码奇慢