ffmpeg编译 Error: operand type mismatch for `shr‘

错误如下:

C 复制代码
D:\msys2\tmp\ccUxvBjQ.s: Assembler messages:
D:\msys2\tmp\ccUxvBjQ.s:345: Error: operand type mismatch for `shr'
D:\msys2\tmp\ccUxvBjQ.s:410: Error: operand type mismatch for `shr'
D:\msys2\tmp\ccUxvBjQ.s:470: Error: operand type mismatch for `shr'
D:\msys2\tmp\ccUxvBjQ.s:645: Error: operand type mismatch for `shr'
D:\msys2\tmp\ccUxvBjQ.s:713: Error: operand type mismatch for `shr'
D:\msys2\tmp\ccUxvBjQ.s:781: Error: operand type mismatch for `shr'
D:\msys2\tmp\ccUxvBjQ.s:866: Error: operand type mismatch for `shr'
D:\msys2\tmp\ccUxvBjQ.s:951: Error: operand type mismatch for `shr'
D:\msys2\tmp\ccUxvBjQ.s:1036: Error: operand type mismatch for `shr'
D:\msys2\tmp\ccUxvBjQ.s:1133: Error: operand type mismatch for `shr'
D:\msys2\tmp\ccUxvBjQ.s:1405: Error: operand type mismatch for `shr'
D:\msys2\tmp\ccUxvBjQ.s:1514: Error: operand type mismatch for `shr'
D:\msys2\tmp\ccUxvBjQ.s:1638: Error: operand type mismatch for `shr'
D:\msys2\tmp\ccUxvBjQ.s:1797: Error: operand type mismatch for `shr'
D:\msys2\tmp\ccUxvBjQ.s:2137: Error: operand type mismatch for `shr'
D:\msys2\tmp\ccUxvBjQ.s:2242: Error: operand type mismatch for `shr'
D:\msys2\tmp\ccUxvBjQ.s:2368: Error: operand type mismatch for `shr'
D:\msys2\tmp\ccUxvBjQ.s:2553: Error: operand type mismatch for `shr'
D:\msys2\tmp\ccUxvBjQ.s:2703: Error: operand type mismatch for `shr'
make: *** [ffbuild/common.mak:60: libavformat/adtsenc.o] Error 1
make 编译过程中的出现上面错误

分析:

这些错误是由于汇编代码中存在类型不匹配的错误,导致无法通过汇编阶段编译。

具体是因为什么我也不是太清楚,我是在Windows下的MSYS2中make编译,我猜测是gcc版本的问题,我的ffmpeg源码比较老,是2018年的,我通过MSYS2下载了 mingw64 编译工具链,其中的gcc版本为:13.2.0

解决:

将ffmpeg源码中 mathops.h 中的如下代码做一个修改。

cpp 复制代码
#define MULL MULL
static av_always_inline av_const int MULL(int a, int b, unsigned shift)
{
    int rt, dummy;
    __asm__ (
        "imull %3               \n\t"
        "shrdl %4, %%edx, %%eax \n\t"
        :"=a"(rt), "=d"(dummy)
        // :"a"(a), "rm"(b), "ci"((uint8_t)shift)
        :"a"(a), "rm"(b), "i"(shift & 0x1F)
    );
    return rt;
}
cpp 复制代码
#define NEG_SSR32 NEG_SSR32
static inline  int32_t NEG_SSR32( int32_t a, int8_t s){
    __asm__ ("sarl %1, %0\n\t"
         : "+r" (a)
        //  : "ic" ((uint8_t)(-s))
         : "i" (-s & 0x1F)
    );
    return a;
}

#define NEG_USR32 NEG_USR32
static inline uint32_t NEG_USR32(uint32_t a, int8_t s){
    __asm__ ("shrl %1, %0\n\t"
         : "+r" (a)
        //  : "ic" ((uint8_t)(-s))
         : "i" (-s & 0x1F)
    );
    return a;
}

参考链接:https://fftrac-bg.ffmpeg.org/ticket/10405

相关推荐
彷徨而立1 天前
【FFmpeg】对比 d3d12va 、d3d11va、dxva2 这三种视频硬解方案
ffmpeg
jjjxxxhhh1232 天前
【学习】USB摄像头 -> FFmpeg -> H264 -> AI模型
人工智能·学习·ffmpeg
给大佬递杯卡布奇诺2 天前
FFmpeg 基本API avformat_open_input函数内部调用流程分析
c++·ffmpeg·音视频
aqi002 天前
FFmpeg开发笔记(八十三)国产的视频裁剪框架AndroidVideoTrimmer
android·ffmpeg·音视频·流媒体
彷徨而立2 天前
【win32】FFmpeg 硬件解码器
windows·ffmpeg
dddddppppp1233 天前
linux sdl图形编程之helloworld.
linux·运维·ffmpeg
给大佬递杯卡布奇诺3 天前
FFmpeg 基本API avio_read函数内部调用流程分析
c++·ffmpeg·音视频
华仔啊3 天前
别再用在线工具转GIF了!FFmpeg实现高清无损转换,这才是真优雅
ffmpeg
落淼喵_G3 天前
ffmpeg转化mp3至wav格式
ffmpeg