From 7a0b5f663f951596a525856736387de79a0f4b65 Mon Sep 17 00:00:00 2001 From: Dmitrii Okunev Date: Sat, 20 Sep 2025 21:41:43 +0100 Subject: [PATCH] Rebuild ffmpeg --- .gitignore | 4 +- Makefile | 1 + docker/termux/Dockerfile | 84 +++++++++++++++---- .../termux/ffmpeg_mediacodec_q_params.patch | 51 ++++++----- .../ffmpeg_mediacodec_set_parameters.patch | 17 ++-- 5 files changed, 105 insertions(+), 52 deletions(-) diff --git a/.gitignore b/.gitignore index 215a633..3c0f0a2 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,6 @@ rcc*.cpp *.qrc .vscode termux-packages -priv \ No newline at end of file +priv +.cache +.ccache diff --git a/Makefile b/Makefile index f0b74bc..5484086 100644 --- a/Makefile +++ b/Makefile @@ -140,6 +140,7 @@ dockerbuilder-android-arm64: --init \ --name $(DOCKER_CONTAINER_NAME) \ --volume ".:/project" \ + --volume "$(PWD)/.cache:/home/builder/.cache" \ --tty \ $(DOCKER_IMAGE) >/dev/null 2>&1 || /bin/true diff --git a/docker/termux/Dockerfile b/docker/termux/Dockerfile index 3b2e88d..89cd27f 100644 --- a/docker/termux/Dockerfile +++ b/docker/termux/Dockerfile @@ -1,8 +1,18 @@ FROM ghcr.io/termux/package-builder:latest -RUN sudo apt update && sudo apt dist-upgrade -fy && sudo apt clean +RUN sudo apt update && sudo apt dist-upgrade -fy && sudo apt install -y ccache && sudo apt clean USER builder +ENV CCACHE_DIR=/home/builder/.cache/ccache +ENV CCACHE_MAXSIZE=20G +ENV CCACHE_COMPRESS=1 +ENV PATH="/usr/lib/ccache:${PATH}" +ENV SCCACHE_DIR=/home/builder/.cache/sccache +ENV SCCACHE_CACHE_SIZE=20G +ENV RUSTC_WRAPPER=/usr/bin/sccache +ENV CARGO_HOME=/home/builder/.cargo +ENV CARGO_TARGET_DIR=/home/builder/.cargo-target + WORKDIR /home/builder RUN git clone https://github.com/xaionaro/termux-packages WORKDIR /home/builder/termux-packages @@ -11,28 +21,72 @@ RUN ./scripts/setup-android-sdk.sh # downloading dependencies (e.g. we do not need ccls, # but we need the most of the dependencies of ccls) -RUN ./build-package.sh -I gettext || /bin/true -RUN ./build-package.sh -I ccls || /bin/true -RUN ./build-package.sh -I termux-api || /bin/true -RUN ./build-package.sh -I xdotool || /bin/true -RUN ./build-package.sh -I xdg-utils || /bin/true +RUN ./build-package.sh -I -d gettext || /bin/true +RUN ./build-package.sh -I -d ccls || /bin/true +RUN ./build-package.sh -I -d termux-api || /bin/true +RUN ./build-package.sh -I -d xdotool || /bin/true +RUN ./build-package.sh -I -d xdg-utils || /bin/true # checkout the version we need -RUN git fetch && git checkout be9385040dfbbe00cd74fd3889c1dd2126e9eca9 +RUN git fetch && git checkout b2d245ec19e5d5d8a0b60f1d31decaad7b1beca7 # building what we need -RUN rm -f /data/data/.built-packages/liblzma && ./build-package.sh -I liblzma -RUN rm -f /data/data/.built-packages/libiconv && ./build-package.sh -I libiconv -RUN rm -f /data/data/.built-packages/libx11 && ./build-package.sh -I libx11 -RUN rm -f /data/data/.built-packages/libxxf86vm && ./build-package.sh libxxf86vm -#RUN rm -f /data/data/.built-packages/vlc && ./build-package.sh vlc -RUN rm -f /data/data/.built-packages/openssl && ./build-package.sh openssl -RUN rm -f /data/data/.built-packages/libandroid-posix-semaphore && ./build-package.sh -I libandroid-posix-semaphore +RUN rm -f /data/data/.built-packages/liblzma && ./build-package.sh -d -I liblzma +RUN rm -f /data/data/.built-packages/libiconv && ./build-package.sh -d -I libiconv +RUN rm -f /data/data/.built-packages/libx11 && ./build-package.sh -d -I libx11 +RUN rm -f /data/data/.built-packages/libxxf86vm && ./build-package.sh -d libxxf86vm +RUN rm -f /data/data/.built-packages/openssl && ./build-package.sh -d openssl +RUN rm -f /data/data/.built-packages/libandroid-posix-semaphore && ./build-package.sh -d -I libandroid-posix-semaphore + +# finicky dependencies of ffmpeg +RUN sed -e 's/make -f Makefile$/make -f Makefile-libbz2_so/' -i ./packages/libbz2/build.sh +RUN cat ./packages/libbz2/build.sh && ./build-package.sh -I -d libbz2 + +# to generate: +# awk -F = '{if($1=="TERMUX_PKG_DEPENDS"){print $2}}' < packages/ffmpeg/build.sh | tr -d '",' | tr " " "\n" | awk '{print "RUN ./build-package.sh "$1}' +RUN ./build-package.sh -d fontconfig +RUN ./build-package.sh -d freetype +RUN ./build-package.sh -d fribidi +RUN ./build-package.sh -d game-music-emu +RUN ./build-package.sh -d harfbuzz +RUN ./build-package.sh -d libaom +RUN ./build-package.sh -d libandroid-glob +RUN ./build-package.sh -d libandroid-stub +RUN ./build-package.sh -d libass +RUN ./build-package.sh -d libbluray +RUN ./build-package.sh -d libbz2 +RUN ./build-package.sh -d libgnutls +RUN ./build-package.sh -d libiconv +RUN ./build-package.sh -d liblzma +RUN ./build-package.sh -d libmp3lame +RUN ./build-package.sh -d libopencore-amr +RUN ./build-package.sh -d libopenmpt +RUN ./build-package.sh -d libopus +RUN ./build-package.sh -d libsoxr +RUN ./build-package.sh -d libsrt +RUN ./build-package.sh -d libv4l +RUN ./build-package.sh -d libvidstab +RUN ./build-package.sh -d libvmaf +RUN ./build-package.sh -d libvo-amrwbenc +RUN ./build-package.sh -d libvorbis +RUN ./build-package.sh -d libvpx +RUN ./build-package.sh -d libwebp +RUN ./build-package.sh -d libx264 +RUN ./build-package.sh -d libx265 +RUN ./build-package.sh -d libxml2 +RUN ./build-package.sh -d libzimg +RUN ./build-package.sh -d libzmq +RUN ./build-package.sh -d littlecms +RUN ./build-package.sh -d ocl-icd +RUN ./build-package.sh -d pulseaudio +RUN ./build-package.sh -d svt-av1 +RUN ./build-package.sh -d xvidcore +RUN ./build-package.sh -d zlib # build custom ffmpeg COPY ffmpeg_mediacodec_set_parameters.patch /home/builder/termux-packages/packages/ffmpeg/mediacodec_set_parameters.patch COPY ffmpeg_mediacodec_q_params.patch /home/builder/termux-packages/packages/ffmpeg/mediacodec_q_params.patch -RUN ./build-package.sh ffmpeg +RUN ./build-package.sh -I -d ffmpeg # installing fyne RUN sudo apt install -y golang-go diff --git a/docker/termux/ffmpeg_mediacodec_q_params.patch b/docker/termux/ffmpeg_mediacodec_q_params.patch index 79843d5..f5d86b7 100644 --- a/docker/termux/ffmpeg_mediacodec_q_params.patch +++ b/docker/termux/ffmpeg_mediacodec_q_params.patch @@ -7,10 +7,24 @@ Date: Fri Jan 10 16:47:23 2025 +0800 Signed-off-by: Zhao Zhili diff --git a/libavcodec/mediacodecenc.c b/libavcodec/mediacodecenc.c -index bcd5f865fa..8f44cd5b12 100644 +index e76ea81236..89041199e4 100644 --- a/libavcodec/mediacodecenc.c +++ b/libavcodec/mediacodecenc.c -@@ -121,6 +121,39 @@ static int mediacodec_init_bsf(AVCodecContext *avctx) +@@ -76,6 +76,13 @@ typedef struct MediaCodecEncContext { + int level; + int pts_as_dts; + int extract_extradata; ++ ++ int qp_i_min; ++ int qp_p_min; ++ int qp_b_min; ++ int qp_i_max; ++ int qp_p_max; ++ int qp_b_max; + } MediaCodecEncContext; + + enum { +@@ -185,6 +192,39 @@ static int mediacodec_init_bsf(AVCodecContext *avctx) static int mediacodec_generate_extradata(AVCodecContext *avctx); @@ -50,16 +64,17 @@ index bcd5f865fa..8f44cd5b12 100644 static av_cold int mediacodec_init(AVCodecContext *avctx) { const char *codec_mime = NULL; -@@ -261,6 +294,8 @@ static av_cold int mediacodec_init(AVCodecContext *avctx) - #endif //__ANDROID_API__ >= 26 +@@ -313,6 +353,9 @@ static av_cold int mediacodec_init(AVCodecContext *avctx) + if (s->bitrate_mode == BITRATE_MODE_CQ && avctx->global_quality > 0) + ff_AMediaFormat_setInt32(format, "quality", avctx->global_quality); } - ++ + mediacodec_set_qp_range(avctx, format); + // frame-rate and i-frame-interval are required to configure codec if (avctx->framerate.num >= avctx->framerate.den && avctx->framerate.den > 0) { s->fps = avctx->framerate.num / avctx->framerate.den; -@@ -734,6 +769,12 @@ static const AVCodecHWConfigInternal *const mediacodec_hw_configs[] = { +@@ -734,6 +777,12 @@ static const AVCodecHWConfigInternal *const mediacodec_hw_configs[] = { NULL }; @@ -72,7 +87,7 @@ index bcd5f865fa..8f44cd5b12 100644 #define OFFSET(x) offsetof(MediaCodecEncContext, x) #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM #define COMMON_OPTION \ -@@ -756,7 +797,18 @@ static const AVCodecHWConfigInternal *const mediacodec_hw_configs[] = { +@@ -754,7 +803,18 @@ static const AVCodecHWConfigInternal *const mediacodec_hw_configs[] = { { "pts_as_dts", "Use PTS as DTS. It is enabled automatically if avctx max_b_frames <= 0, " \ "since most of Android devices don't output B frames by default.", \ OFFSET(pts_as_dts), AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, VE }, \ @@ -92,29 +107,11 @@ index bcd5f865fa..8f44cd5b12 100644 #define MEDIACODEC_ENCODER_CLASS(name) \ static const AVClass name ## _mediacodec_class = { \ -@@ -778,6 +830,7 @@ const FFCodec ff_ ## short_name ## _mediacodec_encoder = { \ - AV_CODEC_CAP_ENCODER_FLUSH, \ +@@ -777,6 +837,7 @@ const FFCodec ff_ ## short_name ## _mediacodec_encoder = { \ .priv_data_size = sizeof(MediaCodecEncContext), \ .p.pix_fmts = avc_pix_fmts, \ + .color_ranges = AVCOL_RANGE_MPEG | AVCOL_RANGE_JPEG, \ + .defaults = mediacodec_defaults, \ .init = mediacodec_init, \ FF_CODEC_RECEIVE_PACKET_CB(mediacodec_encode), \ .close = mediacodec_close, \ -diff --git a/libavcodec/mediacodecenc.h b/libavcodec/mediacodecenc.h -index 8915c99f54..8860148f41 100644 ---- a/libavcodec/mediacodecenc.h -+++ b/libavcodec/mediacodecenc.h -@@ -67,6 +67,13 @@ typedef struct MediaCodecEncContext { - int pts_as_dts; - int extract_extradata; - -+ int qp_i_min; -+ int qp_p_min; -+ int qp_b_min; -+ int qp_i_max; -+ int qp_p_max; -+ int qp_b_max; -+ - #if __ANDROID_API__ >= 26 - MediaCodecEncControlContext ctrl_ctx; - #endif //__ANDROID_API__ >= 26 diff --git a/docker/termux/ffmpeg_mediacodec_set_parameters.patch b/docker/termux/ffmpeg_mediacodec_set_parameters.patch index a3685c9..552e322 100644 --- a/docker/termux/ffmpeg_mediacodec_set_parameters.patch +++ b/docker/termux/ffmpeg_mediacodec_set_parameters.patch @@ -3,9 +3,8 @@ Author: Dmitrii Okunev Date: Sun Apr 20 17:54:21 2025 +0100 Add MediaCodec function setParameters - diff --git a/libavcodec/mediacodec_wrapper.c b/libavcodec/mediacodec_wrapper.c -index 283bbe72d6..660adf4d40 100644 +index 96c886666a..b63a60a292 100644 --- a/libavcodec/mediacodec_wrapper.c +++ b/libavcodec/mediacodec_wrapper.c @@ -192,6 +192,8 @@ struct JNIAMediaCodecFields { @@ -52,7 +51,7 @@ index 283bbe72d6..660adf4d40 100644 static int mediacodec_jni_start(FFAMediaCodec* ctx) { int ret = 0; -@@ -1826,6 +1849,8 @@ static const FFAMediaCodec media_codec_jni = { +@@ -1818,6 +1841,8 @@ static const FFAMediaCodec media_codec_jni = { .getBufferFlagEndOfStream = mediacodec_jni_getBufferFlagEndOfStream, .getBufferFlagKeyFrame = mediacodec_jni_getBufferFlagKeyFrame, @@ -61,7 +60,7 @@ index 283bbe72d6..660adf4d40 100644 .getConfigureFlagEncode = mediacodec_jni_getConfigureFlagEncode, .cleanOutputBuffers = mediacodec_jni_cleanOutputBuffers, .signalEndOfInputStream = mediacodec_jni_signalEndOfInputStream, -@@ -2219,6 +2244,21 @@ static int mediacodec_ndk_configure(FFAMediaCodec* ctx, +@@ -2178,6 +2203,21 @@ static int mediacodec_ndk_configure(FFAMediaCodec* ctx, return 0; } @@ -83,7 +82,7 @@ index 283bbe72d6..660adf4d40 100644 #define MEDIACODEC_NDK_WRAPPER(method) \ static int mediacodec_ndk_ ## method(FFAMediaCodec* ctx) \ { \ -@@ -2522,6 +2562,8 @@ static const FFAMediaCodec media_codec_ndk = { +@@ -2393,6 +2433,8 @@ static const FFAMediaCodec media_codec_ndk = { .getBufferFlagEndOfStream = mediacodec_ndk_getBufferFlagEndOfStream, .getBufferFlagKeyFrame = mediacodec_ndk_getBufferFlagKeyFrame, @@ -93,10 +92,10 @@ index 283bbe72d6..660adf4d40 100644 .cleanOutputBuffers = mediacodec_ndk_cleanOutputBuffers, .signalEndOfInputStream = mediacodec_ndk_signalEndOfInputStream, diff --git a/libavcodec/mediacodec_wrapper.h b/libavcodec/mediacodec_wrapper.h -index 18d0796445..e8feb6bf8e 100644 +index 11a4260497..804349ea2c 100644 --- a/libavcodec/mediacodec_wrapper.h +++ b/libavcodec/mediacodec_wrapper.h -@@ -233,6 +233,9 @@ struct FFAMediaCodec { +@@ -217,6 +217,9 @@ struct FFAMediaCodec { int (*cleanOutputBuffers)(FFAMediaCodec *codec); @@ -105,8 +104,8 @@ index 18d0796445..e8feb6bf8e 100644 + // For encoder with FFANativeWindow as input. int (*signalEndOfInputStream)(FFAMediaCodec *); - -@@ -259,6 +262,12 @@ static inline int ff_AMediaCodec_configure(FFAMediaCodec *codec, + }; +@@ -238,6 +241,12 @@ static inline int ff_AMediaCodec_configure(FFAMediaCodec *codec, return codec->configure(codec, format, surface, crypto, flags); }