diff --git a/pythonforandroid/recipes/av/__init__.py b/pythonforandroid/recipes/av/__init__.py index 816f27e35f..f189467add 100644 --- a/pythonforandroid/recipes/av/__init__.py +++ b/pythonforandroid/recipes/av/__init__.py @@ -5,11 +5,12 @@ class PyAVRecipe(CythonRecipe): name = "av" - version = "10.0.0" + version = "13.1.0" url = "https://github.com/PyAV-Org/PyAV/archive/v{version}.zip" depends = ["python3", "cython", "ffmpeg", "av_codecs"] opt_depends = ["openssl"] + patches = ['patches/compilation_syntax_errors.patch'] def get_recipe_env(self, arch, with_flags_in_cc=True): env = super().get_recipe_env(arch) diff --git a/pythonforandroid/recipes/av/patches/compilation_syntax_errors.patch b/pythonforandroid/recipes/av/patches/compilation_syntax_errors.patch new file mode 100644 index 0000000000..c9a7e9adb3 --- /dev/null +++ b/pythonforandroid/recipes/av/patches/compilation_syntax_errors.patch @@ -0,0 +1,27 @@ +diff --git a/av/container/streams.pyx b/av/container/streams.pyx +index 17e4992..502ac5a 100644 +--- a/av/container/streams.pyx ++++ b/av/container/streams.pyx +@@ -144,7 +144,7 @@ cdef class StreamContainer: + + return stream_index + +- def best(self, str type, /, Stream related = None): ++ def best(self, str type, Stream related=None): + """best(type: Literal["video", "audio", "subtitle", "attachment", "data"], /, related: Stream | None) + Finds the "best" stream in the file. Wraps :ffmpeg:`av_find_best_stream`. Example:: + +diff --git a/av/filter/context.pyx b/av/filter/context.pyx +index b820d3d..8908b56 100644 +--- a/av/filter/context.pyx ++++ b/av/filter/context.pyx +@@ -77,7 +77,8 @@ cdef class FilterContext: + + @property + def graph(self): +- if (graph := self._graph()): ++ graph = self._graph() ++ if graph: + return graph + else: + raise RuntimeError("graph is unallocated") diff --git a/pythonforandroid/recipes/ffmpeg/__init__.py b/pythonforandroid/recipes/ffmpeg/__init__.py index 9414552f0b..3bc824834f 100644 --- a/pythonforandroid/recipes/ffmpeg/__init__.py +++ b/pythonforandroid/recipes/ffmpeg/__init__.py @@ -4,20 +4,17 @@ class FFMpegRecipe(Recipe): - version = 'n4.3.1' + version = 'n6.1.2' # Moved to github.com instead of ffmpeg.org to improve download speed url = 'https://github.com/FFmpeg/FFmpeg/archive/{version}.zip' depends = ['sdl2'] # Need this to build correct recipe order - opts_depends = ['openssl', 'ffpyplayer_codecs'] + opts_depends = ['openssl', 'ffpyplayer_codecs', 'av_codecs'] patches = ['patches/configure.patch'] def should_build(self, arch): build_dir = self.get_build_dir(arch.arch) return not exists(join(build_dir, 'lib', 'libavcodec.so')) - def prebuild_arch(self, arch): - self.apply_patches(arch) - def get_recipe_env(self, arch): env = super().get_recipe_env(arch) env['NDK'] = self.ctx.ndk_dir @@ -43,7 +40,9 @@ def build_arch(self, arch): '-DOPENSSL_API_COMPAT=0x10002000L'] ldflags += ['-L' + build_dir] - if 'ffpyplayer_codecs' in self.ctx.recipe_build_order: + codecs_opts = {"ffpyplayer_codecs", "av_codecs"} + if codecs_opts.intersection(self.ctx.recipe_build_order): + # Enable GPL flags += ['--enable-gpl'] @@ -52,7 +51,9 @@ def build_arch(self, arch): build_dir = Recipe.get_recipe( 'libx264', self.ctx).get_build_dir(arch.arch) cflags += ['-I' + build_dir + '/include/'] - ldflags += ['-lx264', '-L' + build_dir + '/lib/'] + # Newer versions of FFmpeg prioritize the dynamic library and ignore + # the static one, unless the static library path is explicitly set. + ldflags += [build_dir + '/lib/' + 'libx264.a'] # libshine flags += ['--enable-libshine'] diff --git a/pythonforandroid/recipes/ffmpeg/patches/configure.patch b/pythonforandroid/recipes/ffmpeg/patches/configure.patch index cacf0294e2..e274359cb7 100644 --- a/pythonforandroid/recipes/ffmpeg/patches/configure.patch +++ b/pythonforandroid/recipes/ffmpeg/patches/configure.patch @@ -1,11 +1,22 @@ ---- ./configure 2020-10-11 19:12:16.759760904 +0200 -+++ ./configure.patch 2020-10-11 19:15:49.059533563 +0200 -@@ -6361,7 +6361,7 @@ - enabled librsvg && require_pkg_config librsvg librsvg-2.0 librsvg-2.0/librsvg/rsvg.h rsvg_handle_render_cairo +diff --git a/configure b/configure +index 5af693c954..d1d0a4f0a2 100755 +--- a/configure ++++ b/configure +@@ -6800,7 +6800,7 @@ enabled librsvg && require_pkg_config librsvg librsvg-2.0 librsvg-2.0/ enabled librtmp && require_pkg_config librtmp librtmp librtmp/rtmp.h RTMP_Socket enabled librubberband && require_pkg_config librubberband "rubberband >= 1.8.1" rubberband/rubberband-c.h rubberband_new -lstdc++ && append librubberband_extralibs "-lstdc++" + enabled libshaderc && require_pkg_config spirv_compiler "shaderc >= 2019.1" shaderc/shaderc.h shaderc_compiler_initialize -enabled libshine && require_pkg_config libshine shine shine/layer3.h shine_encode_buffer +enabled libshine && require "shine" shine/layer3.h shine_encode_buffer -lshine -lm enabled libsmbclient && { check_pkg_config libsmbclient smbclient libsmbclient.h smbc_init || require libsmbclient libsmbclient.h smbc_init -lsmbclient; } - enabled libsnappy && require libsnappy snappy-c.h snappy_compress -lsnappy -lstdc++ \ No newline at end of file + enabled libsnappy && require libsnappy snappy-c.h snappy_compress -lsnappy -lstdc++ +@@ -6850,7 +6850,7 @@ enabled libvpx && { + enabled libwebp && { + enabled libwebp_encoder && require_pkg_config libwebp "libwebp >= 0.2.0" webp/encode.h WebPGetEncoderVersion + enabled libwebp_anim_encoder && check_pkg_config libwebp_anim_encoder "libwebpmux >= 0.4.0" webp/mux.h WebPAnimEncoderOptionsInit; } +-enabled libx264 && require_pkg_config libx264 x264 "stdint.h x264.h" x264_encoder_encode && ++enabled libx264 && require "x264" "stdint.h x264.h" x264_encoder_encode && + require_cpp_condition libx264 x264.h "X264_BUILD >= 122" && { + [ "$toolchain" != "msvc" ] || + require_cpp_condition libx264 x264.h "X264_BUILD >= 158"; } &&