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

相关推荐
白搞电子2 天前
ESP-Mosaico 音乐驱动动画:节拍检测、RMS 包络与预制动作编排
ffmpeg
FlightYe2 天前
视界原理之3D视频(三):解码和显示
android·linux·3d·ffmpeg·音视频·android runtime
FlightYe2 天前
linux系统编程(十七):内存管理基础
android·linux·ffmpeg·音视频·android runtime
信可维2 天前
用无头 Chrome 逐屏截图 + ffmpeg 拼竖版视频:1080×1920 全流程与 4 个坑
chrome·ffmpeg·音视频
FlightYe2 天前
音视频修炼之容器与协议(二):HLS和DASH流媒体
android·linux·ffmpeg·音视频·android runtime·dash
GreenHandBruce2 天前
基于Qt 6.12.0 + FFmpeg 9.0.2的4k视频播放器
qt·ffmpeg·音视频
Android系统攻城狮3 天前
Linux FFmpeg深度解析之avformat_open_input调用流程与实战(一)
linux·运维·ffmpeg·车载音视频·ffmpeg音视频·音视频进阶手册
开开心心就好3 天前
本地文件搜索工具,双击Ctrl就能呼出搜索
java·服务器·前端·支持向量机·ffmpeg·音视频·模拟退火算法
OH_TPC5 天前
【鸿蒙优选三方库】@ohos/ffmpeg-kit:把 FFmpeg 的全部能量带进鸿蒙
华为·ffmpeg·harmonyos·鸿蒙
是jin奥5 天前
最新 FFmpeg 安装脚本:Linux x86_64
linux·运维·ffmpeg