From b5d7c0fc06cf4c5890e0b1c442b04fe706078867 Mon Sep 17 00:00:00 2001 From: Michel Promonet Date: Sun, 14 Apr 2024 13:12:33 +0200 Subject: [PATCH] Fix build for armv6 (#688) * use ffmpeg configure for armv6 * update docker * update ffmpeg file copy * remove docker build from circleci --- .circleci/config.yml | 104 +------------------------------------------ CMakeLists.txt | 25 ++++++----- Dockerfile | 6 +-- Dockerfile.arm64 | 2 +- Dockerfile.rpi | 4 +- 5 files changed, 22 insertions(+), 119 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 1e644094..5c15f65e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -197,86 +197,6 @@ jobs: name: "Deploy to Github" command: $HOME/go/bin/ghr -t $GITHUB_TOKEN -u $CIRCLE_PROJECT_USERNAME -r $CIRCLE_PROJECT_REPONAME $CIRCLE_TAG /distrib - # ------------------------------------- - # publish docker amd64 - # ------------------------------------- - publish_docker_linuxamd64: - <<: *defaults - - steps: - - checkout - - run: git submodule update --init - - setup_remote_docker: - version: 20.10.12 - - run: - command: | - export TAG=${CIRCLE_TAG:-circle-latest} - docker login --username=$DOCKERHUB_USER --password=$DOCKERHUB_PASS - docker build --pull -t $CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME:${TAG}-amd64 -f Dockerfile . - docker push $CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME:${TAG}-amd64 - no_output_timeout: 30m - - # ------------------------------------- - # publish docker arm - # ------------------------------------- - publish_docker_linuxarm32v7: - <<: *defaults - - environment: - CROSSCOMPILER: https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Buster/GCC%2010.2.0/Raspberry%20Pi%202%2C%203/cross-gcc-10.2.0-pi_2-3.tar.gz - steps: - - checkout - - run: git submodule update --init - - setup_remote_docker: - version: 20.10.12 - - run: - command: | - export TAG=${CIRCLE_TAG:-circle-latest} - docker login --username=$DOCKERHUB_USER --password=$DOCKERHUB_PASS - docker build --build-arg ARCH=armv7l --build-arg CROSSCOMPILER=${CROSSCOMPILER} --build-arg IMAGE=balenalib/raspberry-pi2 --pull -t $CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME:${TAG}-arm32v7 -f Dockerfile.rpi . - docker push $CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME:${TAG}-arm32v7 - no_output_timeout: 30m - - # ------------------------------------- - # publish docker arm - # ------------------------------------- - publish_docker_linuxarm32v6: - <<: *defaults - - steps: - - checkout - - run: git submodule update --init - - setup_remote_docker: - version: 20.10.12 - - run: - command: | - export TAG=${CIRCLE_TAG:-circle-latest} - docker login --username=$DOCKERHUB_USER --password=$DOCKERHUB_PASS - docker build --pull -t $CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME:${TAG}-arm32v6 -f Dockerfile.rpi . - docker push $CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME:${TAG}-arm32v6 - no_output_timeout: 30m - - # ------------------------------------- - # publish docker manifest - # ------------------------------------- - publish_docker_multiarch: - <<: *defaults - - steps: - - setup_remote_docker: - version: 20.10.12 - - run: - command: | - mkdir $HOME/.docker - sh -c 'echo "{ \"experimental\": \"enabled\" }" >> $HOME/.docker/config.json' - # - docker login --username=$DOCKERHUB_USER --password=$DOCKERHUB_PASS - export TAG=${CIRCLE_TAG:-circle-latest} - docker manifest create --amend $CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME:${TAG} $CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME:${TAG}-amd64 $CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME:${TAG}-arm32v7 $CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME:${TAG}-arm32v6 - docker manifest annotate $CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME:${TAG} $CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME:${TAG}-arm32v7 --os linux --arch arm --variant v7 - docker manifest annotate $CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME:${TAG} $CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME:${TAG}-arm32v6 --os linux --arch arm --variant v6 - docker manifest push $CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME:${TAG} -p - workflows: version: 2 build: @@ -338,26 +258,4 @@ workflows: ignore: /.*/ tags: only: /.*/ - docker: - jobs: - - publish_docker_linuxamd64: - filters: - tags: - only: /.*/ - - publish_docker_linuxarm32v6: - filters: - tags: - only: /.*/ - - publish_docker_linuxarm32v7: - filters: - tags: - only: /.*/ - - publish_docker_multiarch: - requires: - - publish_docker_linuxamd64 - - publish_docker_linuxarm32v6 - - publish_docker_linuxarm32v7 - filters: - tags: - only: /.*/ - + \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 1d4d0c2f..91b943ce 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -63,16 +63,21 @@ if (NOT EXISTS ${WEBRTCOBJS}/${CMAKE_STATIC_LIBRARY_PREFIX}webrtc${CMAKE_STATIC_ set (WEBRTCARGS is_chrome_branded=true\n${WEBRTCARGS}) if (CMAKE_SYSTEM_PROCESSOR MATCHES "armv6.*") set(ENV{PATH} "${WEBRTCROOT}/src/third_party/llvm-build/Release+Asserts/bin:$ENV{PATH}") - file(READ ${WEBRTCROOT}/src/third_party/ffmpeg/chromium/scripts/build_ffmpeg.py filecontent) - string(REPLACE "--enable-armv6t2" "--disable-armv6t2" filecontent "${filecontent}") - string(REPLACE "--enable-thumb" "--disable-thumb" filecontent "${filecontent}") - string(REPLACE "--extra-cflags=-march=armv7-a" "--extra-cflags=-march=armv6" filecontent "${filecontent}") - file(WRITE ${WEBRTCROOT}/src/third_party/ffmpeg/chromium/scripts/build_ffmpeg.py "${filecontent}") - file(READ ${WEBRTCROOT}/src/third_party/ffmpeg/chromium/scripts/robo_lib/config.py filecontent) - string(REPLACE "rodete" "" filecontent "${filecontent}") - file(WRITE ${WEBRTCROOT}/src/third_party/ffmpeg/chromium/scripts/robo_lib/config.py "${filecontent}") - EXECUTE_PROCESS(WORKING_DIRECTORY ${WEBRTCROOT}/src/third_party/ffmpeg COMMAND python3 chromium/scripts/build_ffmpeg.py linux arm --config-only) - EXECUTE_PROCESS(WORKING_DIRECTORY ${WEBRTCROOT}/src/third_party/ffmpeg COMMAND chromium/scripts/copy_config.sh) + + set (CONFIGURE_ARGS --disable-everything --disable-all --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages --disable-static --enable-avcodec --enable-avformat --enable-avutil --enable-static --enable-libopus --disable-debug --disable-bzlib --disable-iconv --disable-network --disable-schannel --disable-sdl2 --disable-symver --disable-xlib --disable-zlib --disable-securetransport --disable-faan --disable-alsa --disable-autodetect --disable-error-resilience --enable-decoder=vorbis,libopus,flac --enable-decoder=pcm_u8,pcm_s16le,pcm_s24le,pcm_s32le,pcm_f32le,mp3 --enable-decoder=pcm_s16be,pcm_s24be,pcm_mulaw,pcm_alaw --enable-demuxer=ogg,matroska,wav,flac,mp3,mov --enable-parser=opus,vorbis,flac,mpegaudio,vp9 --extra-cflags=-I${WEBRTCROOT}/src/third_party/opus/src/include --disable-linux-perf --x86asmexe=nasm --optflags="-O2" --arch=arm --enable-armv6 --disable-armv6t2 --enable-vfp --disable-thumb --extra-cflags=-march=armv6 --enable-cross-compile --target-os=linux --extra-cflags=--target=arm-linux-gnueabihf --extra-ldflags=--target=arm-linux-gnueabihf --sysroot=${WEBRTCROOT}/src/build/linux/debian_bullseye_armhf-sysroot --extra-cflags=-mtune=cortex-a8 --extra-cflags=-mfloat-abi=hard --extra-cflags=-O2 --disable-neon --extra-cflags=-mfpu=vfpv3-d16 --enable-pic --cc=clang --cxx=clang++ --ld=clang --extra-ldflags=-fuse-ld=lld --enable-decoder=aac,h264 --enable-demuxer=aac --enable-parser=aac,h264) + MESSAGE("CONFIGURE_ARGS = ${CONFIGURE_ARGS}") + EXECUTE_PROCESS(WORKING_DIRECTORY ${WEBRTCROOT}/src/third_party/ffmpeg COMMAND ./configure ${CONFIGURE_ARGS}) + + file(COPY ${WEBRTCROOT}/src/third_party/ffmpeg/config.h DESTINATION ${WEBRTCROOT}/src/third_party/ffmpeg/chromium/config/Chrome/linux/arm/) + file(COPY ${WEBRTCROOT}/src/third_party/ffmpeg/config_components.h DESTINATION ${WEBRTCROOT}/src/third_party/ffmpeg/chromium/config/Chrome/linux/arm/) + file(COPY ${WEBRTCROOT}/src/third_party/ffmpeg/libavutil/avconfig.h DESTINATION ${WEBRTCROOT}/src/third_party/ffmpeg/chromium/config/Chrome/linux/arm/libavutil/) + file(COPY ${WEBRTCROOT}/src/third_party/ffmpeg/libavfilter/filter_list.c DESTINATION ${WEBRTCROOT}/src/third_party/ffmpeg/chromium/config/Chrome/linux/arm/libavutil/) + file(COPY ${WEBRTCROOT}/src/third_party/ffmpeg/libavcodec/codec_list.c DESTINATION ${WEBRTCROOT}/src/third_party/ffmpeg/chromium/config/Chrome/linux/arm/libavcodec/) + file(COPY ${WEBRTCROOT}/src/third_party/ffmpeg/libavcodec/parser_list.c DESTINATION ${WEBRTCROOT}/src/third_party/ffmpeg/chromium/config/Chrome/linux/arm/libavcodec/) + file(COPY ${WEBRTCROOT}/src/third_party/ffmpeg/libavcodec/bsf_list.c DESTINATION ${WEBRTCROOT}/src/third_party/ffmpeg/chromium/config/Chrome/linux/arm/libavcodec/) + file(COPY ${WEBRTCROOT}/src/third_party/ffmpeg/libavformat/demuxer_list.c DESTINATION ${WEBRTCROOT}/src/third_party/ffmpeg/chromium/config/Chrome/linux/arm/libavformat/) + file(COPY ${WEBRTCROOT}/src/third_party/ffmpeg/libavformat/muxer_list.c DESTINATION ${WEBRTCROOT}/src/third_party/ffmpeg/chromium/config/Chrome/linux/arm/libavformat/) + file(COPY ${WEBRTCROOT}/src/third_party/ffmpeg/libavformat/protocol_list.c DESTINATION ${WEBRTCROOT}/src/third_party/ffmpeg/chromium/config/Chrome/linux/arm/libavformat/) endif() #patch diff --git a/Dockerfile b/Dockerfile index ce1c9f09..4f2e0c77 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # build -FROM ubuntu:22.04 as builder +FROM ubuntu:24.04 as builder LABEL maintainer=michel.promonet@free.fr ARG USERNAME=dev WORKDIR /webrtc-streamer @@ -25,12 +25,12 @@ RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-ins && apt-get clean && rm -rf /var/lib/apt/lists/ # run -FROM ubuntu:22.04 +FROM ubuntu:24.04 WORKDIR /app COPY --from=builder /app/ /app/ -RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends libssl-dev libasound2 libgtk-3-0 libxtst6 libpulse0 librtmp1 avahi-utils \ +RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends libssl-dev libasound2-dev libgtk-3-0 libxtst6 libpulse0 librtmp1 avahi-utils \ && useradd -M user -G video,audio \ && apt-get clean && rm -rf /var/lib/apt/lists/ \ && ./webrtc-streamer -V diff --git a/Dockerfile.arm64 b/Dockerfile.arm64 index c6e4bdcf..8297e61d 100644 --- a/Dockerfile.arm64 +++ b/Dockerfile.arm64 @@ -1,7 +1,7 @@ ARG IMAGE=arm64v8/ubuntu # build -FROM ubuntu:22.04 as builder +FROM ubuntu:24.04 as builder LABEL maintainer=michel.promonet@free.fr ARG ARCH=arm64 diff --git a/Dockerfile.rpi b/Dockerfile.rpi index c627312b..3920cfac 100644 --- a/Dockerfile.rpi +++ b/Dockerfile.rpi @@ -1,7 +1,7 @@ ARG IMAGE=balenalib/raspberry-pi # build -FROM ubuntu:22.04 as builder +FROM ubuntu:24.04 as builder LABEL maintainer=michel.promonet@free.fr ARG ARCH=armv6l @@ -10,7 +10,7 @@ ARG CROSSCOMPILER=https://sourceforge.net/projects/raspberry-pi-cross-compilers/ WORKDIR /webrtc-streamer COPY . /webrtc-streamer -RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends ca-certificates wget git python3 python3-pkg-resources xz-utils cmake make pkg-config \ +RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends ca-certificates build-essential gcc wget git python3 python3-pkg-resources xz-utils cmake make pkg-config \ && mkdir /webrtc \ && wget -qO- ${CROSSCOMPILER} | tar xz -C /webrtc \ && export PATH=$(ls -d /webrtc/cross-pi-gcc-*/bin):$PATH \