Files
qt5/coin/provisioning/common/linux/install-ffmpeg-linux.sh
Artem Dyomin b8deff00ef Update nv-codec-headers version to 11.1.5.3
Change-Id: I63283fa327188226f6027c38a18bad1dfebdf2f8
Pick-to: 6.11 6.10 6.8
Reviewed-by: Artem Dyomin <artem.dyomin@qt.io>
Reviewed-by: Nils Petter Skålerud <nils.petter.skalerud@qt.io>
Reviewed-by: Tim Blechmann <tim.blechmann@qt.io>
2026-04-01 06:44:28 +00:00

106 lines
3.7 KiB
Bash
Executable File

#!/usr/bin/env bash
# Copyright (C) 2024 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
# This script builds and installs FFmpeg static or shared (default) libs
# It can take an optional output parameter for installation:
#
# install-ffmpeg-linx.sh shared ~/my/install/path
set -ex
source "${BASH_SOURCE%/*}/../unix/ffmpeg-installation-utils.sh"
build_type=$(get_ffmpeg_build_type "$1")
ffmpeg_source_dir=$(download_ffmpeg)
ffmpeg_name=$(basename "$ffmpeg_source_dir")
ffmpeg_config_options=$(get_ffmpeg_config_options "$build_type")
default_prefix="/usr/local/$ffmpeg_name"
prefix="${2:-$default_prefix}"
pkgconfig_path="$PKG_CONFIG_PATH"
install_ff_nvcodec_headers() {
local nv_codec_version="11.1.5.3" # use 11.x.x.x to ensure compatibility with 470 nvidia drivers; might be upated to 12.0
local nv_codec_url_public="https://github.com/FFmpeg/nv-codec-headers/archive/refs/tags/n$nv_codec_version.zip"
local nv_codec_url_cached="http://ci-files01-hki.ci.qt.io/input/ffmpeg/nv-codec-headers/nv-codec-headers-$nv_codec_version.zip"
local nv_codec_sha1="78715d521de102362e553dc92577bbe81905a321"
#nv_codec_sha1="4f30539f8dd31945da4c3da32e66022f9ca59c08" // 12.0
local target_dir="$HOME"
local nv_codec_dir="$target_dir/nv-codec-headers-n$nv_codec_version"
if [ ! -d "$nv_codec_dir" ]; then
source "${BASH_SOURCE%/*}/../unix/InstallFromCompressedFileFromURL.sh"
InstallFromCompressedFileFromURL "$nv_codec_url_cached" "$nv_codec_url_public" "$nv_codec_sha1" "$target_dir" ""
fi
sudo make -C "$nv_codec_dir" install -j
# Might be not detected by default on RHEL
pkgconfig_path="$pkgconfig_path:/usr/local/lib/pkgconfig"
}
fix_openssl3_pc_files() {
# On RHEL 8, openssl3 pc files are libopenssl3.pc, libssl3.pc, libcrypto3.pc,
# and FFmpeg cannot find them. Instead, it finds FFmpeg 1.x.x if it's installed.
# The function fixes the files with copying them to a custom directory
# assign to 'local' to ignore failure exit codes
local -r openssl3_pcfiledir=$(pkg-config --variable=pcfiledir openssl3)
if [ -z "$openssl3_pcfiledir" ]; then
return
fi
local pcfiles=("libssl" "libcrypto" "openssl")
for pcfile in "${pcfiles[@]}"; do
if [ ! -f "$openssl3_pcfiledir/${pcfile}3.pc" ]; then
echo "pkgconfig has found openssl3 but the file $openssl3_pcfiledir/${pcfile}3.pc does't exist"
return
fi
done
local new_pkgconfig_dir="$ffmpeg_source_dir/openssl3_pkgconfig"
mkdir -p "$new_pkgconfig_dir"
for pcfile in "${pcfiles[@]}"; do
sed -E '/^Requires(\.private)?:/s/ (libssl|libcrypto)3/ \1/g;' "$openssl3_pcfiledir/${pcfile}3.pc" > "$new_pkgconfig_dir/${pcfile}.pc"
done
pkgconfig_path="$new_pkgconfig_dir:$pkgconfig_path"
}
build_ffmpeg() {
local build_dir="$ffmpeg_source_dir/build"
mkdir -p "$build_dir"
pushd "$build_dir"
# shellcheck disable=SC2086
PKG_CONFIG_PATH="$pkgconfig_path" "$ffmpeg_source_dir/configure" $ffmpeg_config_options --prefix="$prefix"
# shellcheck disable=
# on RHEL patchelf is not visible under sudo, so we install to a temporary directory
make install DESTDIR="$build_dir/installed" -j
popd
}
ffmpeg_config_options+=" --enable-openssl"
fix_openssl3_pc_files
echo "pkg-config openssl version: $(pkg-config --modversion openssl)"
install_ff_nvcodec_headers
build_ffmpeg
output_dir="$ffmpeg_source_dir/build/installed/$prefix"
if [ "$build_type" == "shared" ]; then
fix_dependencies="${BASH_SOURCE%/*}/../shared/fix_ffmpeg_dependencies.sh"
"$fix_dependencies" "$output_dir"
fi
sudo mkdir -p "$prefix"
sudo mv "$output_dir"/* "$prefix"
set_ffmpeg_dir_env_var "FFMPEG_DIR" "$prefix"