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