C++ 将MSB填充转换为LSB填充

C++ 将MSB填充转换为LSB填充,c++,ffmpeg,C++,Ffmpeg,我正在使用FFmpeg和Vulkan进行一个与视频相关的项目。问题是FFmpeg对9、10和12位格式使用MSB填充,而Vulkan接受LSB填充的像素格式 我使用下面的代码相互转换,但性能很差(每帧1秒),不能用于视频播放 if(paddingBits > 0) { //As padding bits are set to 0, using CPU words for the shifting should not affect the result assert(dst

我正在使用FFmpeg和Vulkan进行一个与视频相关的项目。问题是FFmpeg对9、10和12位格式使用MSB填充,而Vulkan接受LSB填充的像素格式

我使用下面的代码相互转换,但性能很差(每帧1秒),不能用于视频播放

if(paddingBits > 0) {
    //As padding bits are set to 0, using CPU words for the shifting should not affect the result
    assert(dstBuffers[plane].size() % sizeof(size_t) == 0);
    for(size_t i = 0; i < dstBuffers[plane].size(); i += sizeof(size_t)) {
        reinterpret_cast<size_t&>(dstBuffers[plane][i]) <<= paddingBits;
    }
}
if(填充位>0){
//由于填充位设置为0,使用CPU字进行移位不应影响结果
断言(dstBuffers[plane].size()%sizeof(size_t)==0);
对于(size_t i=0;i重新解释(平面[i])您是否验证了您的编译器对代码进行了矢量化?@Botje此测试已在调试模式下完成,因此可能编译器没有对代码进行矢量化。但是,我需要此代码也在调试模式下工作,因此在这种情况下,仅启用优化是不可行的。另一个选项可能是在FFmpeg上使用16位格式,以便填充可以被删除在LSB完成。遗憾的是,当NegotiatingGone方法可能是使用simd intrinsic手动矢量化循环时,编解码器似乎不提供此选项,我认为这应该相当简单。此外,您是否检查了此函数的生成代码?在调试模式下运行是否可以在某个地方添加边界检查或调用非内联函数?T如果每秒调用几百万次,会导致您提到的速度减慢。