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


    错误如下:

    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 编译过程中的出现上面错误
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    分析:

    这些错误是由于汇编代码中存在类型不匹配的错误,导致无法通过汇编阶段编译。
    具体是因为什么我也不是太清楚,我是在Windows下的MSYS2中make编译,我猜测是gcc版本的问题,我的ffmpeg源码比较老,是2018年的,我通过MSYS2下载了 mingw64 编译工具链,其中的gcc版本为:13.2.0在这里插入图片描述

    解决方法一:

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

    #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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    #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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

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

    解决方法二:

    将ffmpeg源码中 mathops.h 中的如下代码做一个修改,其实在新版本的ffmpeg中已经修复了这个问题,可以去查看一下最新版的ffmpeg中 libavcodec/x86/mathops.h 中的修改,然后将我们的mathops.h 修改为如下:

    #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), "c"((uint8_t)shift)
        );
        return rt;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    #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)
             : "c" ((uint8_t)(-s))
        );
        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)
             : "c" ((uint8_t)(-s))
        );
        return a;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  • 相关阅读:
    馈仪&森泽农场‖2022新米年度套餐震撼来袭,全年新米,用“鲜”守护!
    过滤器Filter
    MySQL 和 SQL Server之间的数据迁移方法
    【自动驾驶】针对低速无人车的线控底盘技术
    Spring自动装配
    linux-adnroid 键值枚举与注释
    vue相关面试题:computed和watch区别
    2023年电赛---运动目标控制与自动追踪系统(E题)OpenMV方案
    基于Quartz实现动态定时任务
    python命名空间字典
  • 原文地址:https://blog.csdn.net/qq_47733361/article/details/132901423