android 4.2.2 x86,解决Android NDK编译FFmpeg 4.2.2的x86 cpu版时的问题

老规矩,编译环境:Win10 1903,WSL ubuntu,

#!/bin/bash

make clean

export NDK=/home/kres/android-ndk-r20b

TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64/

API=21

function build_android

{

echo "Compiling FFmpeg for $CPU"

./configure \

--prefix=$PREFIX \

--enable-neon \

--enable-hwaccels \

--enable-gpl \

--enable-postproc \

--enable-shared \

--enable-jni \

--enable-mediacodec \

--disable-decoders \

--enable-decoder=h264_mediacodec \

--enable-decoder=vp9 \

--enable-decoder=h264 \

--enable-decoder=mpeg4 \

--enable-decoder=aac \

--enable-decoder=aac_latm \

--enable-decoder=mjpeg \

--enable-decoder=png \

--enable-decoder=mpeg4_mediacodec \

--disable-encoders \

--enable-encoder=vp9_vaapi --enable-encoder=h264_nvenc --enable-encoder=h264_v4l2m2m --enable-encoder=hevc_nvenc \

--disable-demuxers \

--enable-demuxer=rtsp --enable-demuxer=rtp --enable-demuxer=flv --enable-demuxer=h264 \

--disable-muxers \

--enable-muxer=rtsp --enable-muxer=rtp --enable-muxer=flv --enable-muxer=h264 \

--disable-parsers \

--enable-parser=mpeg4video --enable-parser=aac --enable-parser=h264 --enable-parser=vp9 \

--disable-protocols \

--enable-protocol=rtmp --enable-protocol=rtp --enable-protocol=tcp --enable-protocol=udp \

--disable-bsfs \

--disable-indevs --enable-indev=v4l2 \

--disable-outdevs \

--disable-filters \

--disable-postproc \

--disable-static \

--disable-doc \

--disable-ffmpeg \

--disable-ffplay \

--disable-ffprobe \

--enable-avdevice \

--disable-doc \

--disable-symver \

--cross-prefix=$CROSS_PREFIX \

--target-os=android \

--arch=$ARCH \

--cpu=$CPU \

--cc=$CC \

--cxx=$CXX \

--enable-cross-compile \

--sysroot=$SYSROOT \

--extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \

--extra-ldflags="$ADDI_LDFLAGS" \

$ADDITIONAL_CONFIGURE_FLAG

make clean

make -j6

make install

echo "The Compilation of FFmpeg for $CPU is completed"

}

#armv8-a

ARCH=arm64

CPU=armv8-a

CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang

CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++

SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot

CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-

PREFIX=$(pwd)/android/$CPU

OPTIMIZE_CFLAGS="-march=$CPU"

build_android

#armv7-a

ARCH=arm

CPU=armv7-a

CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang

CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++

SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot

CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-

PREFIX=$(pwd)/android/$CPU

OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "

build_android

#x86

ARCH=x86

CPU=x86

CC=$TOOLCHAIN/bin/i686-linux-android$API-clang

CXX=$TOOLCHAIN/bin/i686-linux-android$API-clang++

SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot

CROSS_PREFIX=$TOOLCHAIN/bin/i686-linux-android-

PREFIX=$(pwd)/android/$CPU

OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"

build_android

#x86_64

ARCH=x86_64

CPU=x86-64

CC=$TOOLCHAIN/bin/x86_64-linux-android$API-clang

CXX=$TOOLCHAIN/bin/x86_64-linux-android$API-clang++

SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot

CROSS_PREFIX=$TOOLCHAIN/bin/x86_64-linux-android-

PREFIX=$(pwd)/android/$CPU

OPTIMIZE_CFLAGS="-march=$CPU -msse4.2 -mpopcnt -m64 -mtune=intel"

build_android

其中,在编译到x86 32位版时,会遇到“error: inline assembly requires more registers than available”的问题:

libavcodec/x86/cabac.h:193:9: error: inline assembly requires more registers than available

BRANCHLESS_GET_CABAC("%0", "%q0", "(%4)", "%1", "%w1",

^

libavcodec/x86/cabac.h:143:9: note: expanded from macro 'BRANCHLESS_GET_CABAC'

"movzbl "statep" , "ret" \n\t"\

^

libavcodec/x86/cabac.h:193:9: error: inline assembly requires more registers than available

libavcodec/x86/cabac.h:143:9: note: expanded from macro 'BRANCHLESS_GET_CABAC'

"movzbl "statep" , "ret" \n\t"\

^

libavcodec/x86/cabac.h:193:9: error: inline assembly requires more registers than available

libavcodec/x86/cabac.h:143:9: note: expanded from macro 'BRANCHLESS_GET_CABAC'

"movzbl "statep" , "ret" \n\t"\

^

libavcodec/x86/cabac.h:193:9: error: inline assembly requires more registers than available

libavcodec/x86/cabac.h:143:9: note: expanded from macro 'BRANCHLESS_GET_CABAC'

"movzbl "statep" , "ret" \n\t"\

^

libavcodec/x86/cabac.h:193:9: error: inline assembly requires more registers than available

libavcodec/x86/cabac.h:143:9: note: expanded from macro 'BRANCHLESS_GET_CABAC'

"movzbl "statep" , "ret" \n\t"\

^

libavcodec/x86/cabac.h:193:9: error: inline assembly requires more registers than available

libavcodec/x86/cabac.h:143:9: note: expanded from macro 'BRANCHLESS_GET_CABAC'

"movzbl "statep" , "ret" \n\t"\

^

libavcodec/x86/cabac.h:193:9: error: inline assembly requires more registers than available

libavcodec/x86/cabac.h:143:9CC libavcodec/h264_refs.o

: note: expanded from macro 'BRANCHLESS_GET_CABAC'

"movzbl "statep" , "ret" \n\t"\

各种修改编译脚本设置都无法解决,虽然https://trac.ffmpeg.org/ticket/7796 ,研读后发现“ libavutil/x86/asm.h:75”中的

#define HAVE_7REGS (ARCH_X86_64 || (HAVE_EBX_AVAILABLE && HAVE_EBP_AVAILABLE))

修改为:

#define HAVE_7REGS (ARCH_X86_64)

就可以编译通过了,先记下,后面发现副作用以及其它更新时再做补充。

文字加密小工具v3

请输入要加密的内容

博主友情提示:

如您在评论中需要提及如QQ号、电子邮件地址或其他隐私敏感信息,欢迎使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值