react-native-alpha-video 0.0.0-stage → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +903 -2
- package/THIRD_PARTY_NOTICES.md +30 -0
- package/android/av1/build.gradle +67 -0
- package/android/av1/consumer-rules.pro +4 -0
- package/android/av1/src/main/cpp/Av1Codec_jni.cpp +8 -0
- package/android/av1/src/main/cpp/CMakeLists.txt +34 -0
- package/android/av1/src/main/java/dev/mediacache/alphavideo/av1/Av1Codec.java +21 -0
- package/android/build.gradle +85 -0
- package/android/consumer-rules.pro +2 -0
- package/android/gradle.properties +1 -0
- package/android/publish.gradle +82 -0
- package/android/settings.gradle +5 -0
- package/android/src/main/AndroidManifest.xml +1 -0
- package/android/src/main/cpp/CMakeLists.txt +59 -0
- package/android/src/main/java/dev/mediacache/alphavideo/AlphaVideoCodecs.java +73 -0
- package/android/src/main/java/dev/mediacache/alphavideo/AlphaVideoView.java +1966 -0
- package/android/src/main/java/dev/mediacache/alphavideo/BufferedDualStreamPlayer.java +978 -0
- package/android/src/main/java/dev/mediacache/alphavideo/Fetcher.java +37 -0
- package/android/src/main/java/dev/mediacache/alphavideo/HttpFetcher.java +156 -0
- package/android/src/main/java/dev/mediacache/alphavideo/MediaCodecColor.java +47 -0
- package/android/src/main/java/dev/mediacache/alphavideo/MediaCodecDecoders.java +135 -0
- package/android/src/main/java/dev/mediacache/alphavideo/RangeSourceLink.java +54 -0
- package/android/src/main/java/dev/mediacache/alphavideo/SourceReader.java +174 -0
- package/android/src/main/java/dev/mediacache/alphavideo/SurfaceTextureVideoDecoder.java +802 -0
- package/android/src/main/java/dev/mediacache/alphavideo/WebMAlphaPlayerNative.java +95 -0
- package/android/src/main/java/dev/mediacache/alphavideo/WebMFrame.java +54 -0
- package/android/src/main/java/dev/mediacache/alphavideo/WebMSource.java +160 -0
- package/android/src/rangesource/java/dev/mediacache/alphavideo/AppDataSource.java +50 -0
- package/android/vpx/build.gradle +67 -0
- package/android/vpx/consumer-rules.pro +4 -0
- package/android/vpx/src/main/cpp/CMakeLists.txt +34 -0
- package/android/vpx/src/main/cpp/VpxCodec_jni.cpp +8 -0
- package/android/vpx/src/main/java/dev/mediacache/alphavideo/vpx/VpxCodec.java +21 -0
- package/codecs/av1/Dav1dDecoderPlugin.cpp +157 -0
- package/codecs/av1/Dav1dDecoderPlugin.h +17 -0
- package/codecs/vpx/VpxDecoderPlugin.cpp +103 -0
- package/codecs/vpx/VpxDecoderPlugin.h +17 -0
- package/cpp/AlphaDemuxer.cpp +984 -0
- package/cpp/AlphaDemuxer.h +123 -0
- package/cpp/AlphaVideoDecoderPlugin.h +84 -0
- package/cpp/Av1SequenceHeader.cpp +175 -0
- package/cpp/Av1SequenceHeader.h +25 -0
- package/cpp/ByteSource.cpp +116 -0
- package/cpp/ByteSource.h +59 -0
- package/cpp/RangeSourceClient.h +40 -0
- package/cpp/VideoDecoder.cpp +157 -0
- package/cpp/VideoDecoder.h +83 -0
- package/cpp/WebMAlphaPlayer.cpp +1666 -0
- package/cpp/WebMAlphaPlayer.h +389 -0
- package/cpp/WebMAlphaPlayer_jni.cpp +1380 -0
- package/cpp/YuvToRgb.cpp +39 -0
- package/cpp/YuvToRgb.h +40 -0
- package/ios/Sources/AlphaVideo/AlphaVideoCodecs.mm +63 -0
- package/ios/Sources/AlphaVideo/AlphaVideoInternal.h +70 -0
- package/ios/Sources/AlphaVideo/AlphaVideoPlayer.mm +994 -0
- package/ios/Sources/AlphaVideo/AlphaVideoSource.mm +476 -0
- package/ios/Sources/AlphaVideo/AlphaVideoView.mm +374 -0
- package/ios/Sources/AlphaVideo/include/AlphaVideo.h +303 -0
- package/ios/Sources/AlphaVideoAV1/AlphaVideoAV1Codec.mm +16 -0
- package/ios/Sources/AlphaVideoAV1/include/AlphaVideoAV1.h +18 -0
- package/ios/Sources/AlphaVideoVPX/AlphaVideoVPXCodec.mm +16 -0
- package/ios/Sources/AlphaVideoVPX/include/AlphaVideoVPX.h +17 -0
- package/lib/commonjs/AlphaVideoView.js +187 -0
- package/lib/commonjs/AlphaVideoView.js.map +1 -0
- package/lib/commonjs/AlphaVideoViewNativeComponent.js +47 -0
- package/lib/commonjs/AlphaVideoViewNativeComponent.js.map +1 -0
- package/lib/commonjs/AlphaVideoViewNativeComponent.web.js +11 -0
- package/lib/commonjs/AlphaVideoViewNativeComponent.web.js.map +1 -0
- package/lib/commonjs/NativeAlphaVideoModule.js +10 -0
- package/lib/commonjs/NativeAlphaVideoModule.js.map +1 -0
- package/lib/commonjs/NativeAlphaVideoModule.web.js +9 -0
- package/lib/commonjs/NativeAlphaVideoModule.web.js.map +1 -0
- package/lib/commonjs/WebPlayer.js +12 -0
- package/lib/commonjs/WebPlayer.js.map +1 -0
- package/lib/commonjs/WebPlayer.web.js +92 -0
- package/lib/commonjs/WebPlayer.web.js.map +1 -0
- package/lib/commonjs/index.js +124 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/module/AlphaVideoView.js +187 -0
- package/lib/module/AlphaVideoView.js.map +1 -0
- package/lib/module/AlphaVideoViewNativeComponent.js +47 -0
- package/lib/module/AlphaVideoViewNativeComponent.js.map +1 -0
- package/lib/module/AlphaVideoViewNativeComponent.web.js +11 -0
- package/lib/module/AlphaVideoViewNativeComponent.web.js.map +1 -0
- package/lib/module/NativeAlphaVideoModule.js +10 -0
- package/lib/module/NativeAlphaVideoModule.js.map +1 -0
- package/lib/module/NativeAlphaVideoModule.web.js +9 -0
- package/lib/module/NativeAlphaVideoModule.web.js.map +1 -0
- package/lib/module/WebPlayer.js +12 -0
- package/lib/module/WebPlayer.js.map +1 -0
- package/lib/module/WebPlayer.web.js +92 -0
- package/lib/module/WebPlayer.web.js.map +1 -0
- package/lib/module/index.js +124 -0
- package/lib/module/index.js.map +1 -0
- package/lib/typescript/react-native/src/AlphaVideoView.d.ts +189 -0
- package/lib/typescript/react-native/src/AlphaVideoView.d.ts.map +1 -0
- package/lib/typescript/react-native/src/AlphaVideoViewNativeComponent.d.ts +109 -0
- package/lib/typescript/react-native/src/AlphaVideoViewNativeComponent.d.ts.map +1 -0
- package/lib/typescript/react-native/src/AlphaVideoViewNativeComponent.web.d.ts +5 -0
- package/lib/typescript/react-native/src/AlphaVideoViewNativeComponent.web.d.ts.map +1 -0
- package/lib/typescript/react-native/src/NativeAlphaVideoModule.d.ts +21 -0
- package/lib/typescript/react-native/src/NativeAlphaVideoModule.d.ts.map +1 -0
- package/lib/typescript/react-native/src/NativeAlphaVideoModule.web.d.ts +3 -0
- package/lib/typescript/react-native/src/NativeAlphaVideoModule.web.d.ts.map +1 -0
- package/lib/typescript/react-native/src/WebPlayer.d.ts +3 -0
- package/lib/typescript/react-native/src/WebPlayer.d.ts.map +1 -0
- package/lib/typescript/react-native/src/WebPlayer.web.d.ts +9 -0
- package/lib/typescript/react-native/src/WebPlayer.web.d.ts.map +1 -0
- package/lib/typescript/react-native/src/index.d.ts +77 -0
- package/lib/typescript/react-native/src/index.d.ts.map +1 -0
- package/licenses/dav1d-COPYING.txt +23 -0
- package/licenses/libvpx-LICENSE.txt +31 -0
- package/licenses/libvpx-PATENTS.txt +23 -0
- package/licenses/libwebm-LICENSE.txt +30 -0
- package/licenses/libwebm-PATENTS.txt +23 -0
- package/package.json +150 -4
- package/prebuilt/android/arm64-v8a/lib/libdav1d.a +0 -0
- package/prebuilt/android/arm64-v8a/lib/libvpx.a +0 -0
- package/prebuilt/android/armeabi-v7a/lib/libdav1d.a +0 -0
- package/prebuilt/android/armeabi-v7a/lib/libvpx.a +0 -0
- package/prebuilt/android/x86_64/lib/libdav1d.a +0 -0
- package/prebuilt/android/x86_64/lib/libvpx.a +0 -0
- package/prebuilt/include/dav1d/common.h +94 -0
- package/prebuilt/include/dav1d/data.h +117 -0
- package/prebuilt/include/dav1d/dav1d.h +329 -0
- package/prebuilt/include/dav1d/headers.h +440 -0
- package/prebuilt/include/dav1d/picture.h +157 -0
- package/prebuilt/include/dav1d/version.h +50 -0
- package/prebuilt/include/vpx/vp8.h +136 -0
- package/prebuilt/include/vpx/vp8dx.h +228 -0
- package/prebuilt/include/vpx/vpx_codec.h +475 -0
- package/prebuilt/include/vpx/vpx_decoder.h +365 -0
- package/prebuilt/include/vpx/vpx_frame_buffer.h +83 -0
- package/prebuilt/include/vpx/vpx_image.h +209 -0
- package/prebuilt/include/vpx/vpx_integer.h +40 -0
- package/prebuilt/ios/lib/libdav1d.a +0 -0
- package/prebuilt/ios/lib/libvpx.a +0 -0
- package/prebuilt/ios-simulator/include/dav1d/common.h +94 -0
- package/prebuilt/ios-simulator/include/dav1d/data.h +117 -0
- package/prebuilt/ios-simulator/include/dav1d/dav1d.h +329 -0
- package/prebuilt/ios-simulator/include/dav1d/headers.h +440 -0
- package/prebuilt/ios-simulator/include/dav1d/picture.h +157 -0
- package/prebuilt/ios-simulator/include/dav1d/version.h +50 -0
- package/prebuilt/ios-simulator/include/vpx/vp8.h +136 -0
- package/prebuilt/ios-simulator/include/vpx/vp8dx.h +228 -0
- package/prebuilt/ios-simulator/include/vpx/vpx_codec.h +475 -0
- package/prebuilt/ios-simulator/include/vpx/vpx_decoder.h +365 -0
- package/prebuilt/ios-simulator/include/vpx/vpx_frame_buffer.h +83 -0
- package/prebuilt/ios-simulator/include/vpx/vpx_image.h +209 -0
- package/prebuilt/ios-simulator/include/vpx/vpx_integer.h +40 -0
- package/prebuilt/ios-simulator/lib/libdav1d.a +0 -0
- package/prebuilt/ios-simulator/lib/libvpx.a +0 -0
- package/react-native/android/CMakeLists.txt +14 -0
- package/react-native/android/build.gradle +110 -0
- package/react-native/android/src/main/AndroidManifest.xml +1 -0
- package/react-native/android/src/main/java/dev/mediacache/alphavideo/reactnative/AlphaVideoModule.java +102 -0
- package/react-native/android/src/main/java/dev/mediacache/alphavideo/reactnative/AlphaVideoPackage.java +50 -0
- package/react-native/android/src/main/java/dev/mediacache/alphavideo/reactnative/AlphaVideoViewManager.java +317 -0
- package/react-native/android/src/newarch/java/dev/mediacache/alphavideo/reactnative/AlphaVideoModuleSpec.java +10 -0
- package/react-native/android/src/newarch/java/dev/mediacache/alphavideo/reactnative/AlphaVideoViewManagerSpec.java +23 -0
- package/react-native/android/src/norangesource/java/dev/mediacache/alphavideo/AppDataSource.java +15 -0
- package/react-native/android/src/oldarch/java/dev/mediacache/alphavideo/reactnative/AlphaVideoModuleSpec.java +30 -0
- package/react-native/android/src/oldarch/java/dev/mediacache/alphavideo/reactnative/AlphaVideoViewManagerSpec.java +61 -0
- package/react-native/ios/RNAlphaVideoViewComponentView.mm +173 -0
- package/react-native/ios/RNAlphaVideoViewManager.mm +147 -0
- package/react-native/src/AlphaVideoView.tsx +329 -0
- package/react-native/src/AlphaVideoViewNativeComponent.ts +132 -0
- package/react-native/src/AlphaVideoViewNativeComponent.web.ts +5 -0
- package/react-native/src/NativeAlphaVideoModule.ts +22 -0
- package/react-native/src/NativeAlphaVideoModule.web.ts +2 -0
- package/react-native/src/WebPlayer.tsx +7 -0
- package/react-native/src/WebPlayer.web.tsx +60 -0
- package/react-native/src/index.tsx +144 -0
- package/react-native-alpha-video.podspec +99 -0
- package/react-native.config.js +12 -0
- package/scripts/build_codecs_android.sh +246 -0
- package/scripts/build_codecs_ios.sh +31 -0
- package/scripts/build_codecs_ios_device.sh +210 -0
- package/scripts/build_codecs_ios_simulator.sh +256 -0
- package/scripts/build_wasm.sh +230 -0
- package/scripts/build_xcframework.sh +49 -0
- package/scripts/fetch-prebuilt.sh +48 -0
- package/scripts/package_release.sh +107 -0
- package/scripts/publish-android.sh +85 -0
- package/scripts/vendor_range_source.sh +47 -0
- package/third_party/libwebm/AUTHORS.TXT +5 -0
- package/third_party/libwebm/LICENSE.TXT +30 -0
- package/third_party/libwebm/PATENTS.TXT +23 -0
- package/third_party/libwebm/README.md +7 -0
- package/third_party/libwebm/webm_parser/include/webm/buffer_reader.h +138 -0
- package/third_party/libwebm/webm_parser/include/webm/callback.h +363 -0
- package/third_party/libwebm/webm_parser/include/webm/dom_types.h +1781 -0
- package/third_party/libwebm/webm_parser/include/webm/element.h +208 -0
- package/third_party/libwebm/webm_parser/include/webm/file_reader.h +103 -0
- package/third_party/libwebm/webm_parser/include/webm/id.h +1085 -0
- package/third_party/libwebm/webm_parser/include/webm/istream_reader.h +99 -0
- package/third_party/libwebm/webm_parser/include/webm/reader.h +94 -0
- package/third_party/libwebm/webm_parser/include/webm/status.h +166 -0
- package/third_party/libwebm/webm_parser/include/webm/webm_parser.h +133 -0
- package/third_party/libwebm/webm_parser/src/ancestory.cc +334 -0
- package/third_party/libwebm/webm_parser/src/ancestory.h +83 -0
- package/third_party/libwebm/webm_parser/src/audio_parser.h +84 -0
- package/third_party/libwebm/webm_parser/src/bit_utils.cc +26 -0
- package/third_party/libwebm/webm_parser/src/bit_utils.h +24 -0
- package/third_party/libwebm/webm_parser/src/block_additions_parser.h +30 -0
- package/third_party/libwebm/webm_parser/src/block_group_parser.h +71 -0
- package/third_party/libwebm/webm_parser/src/block_header_parser.cc +76 -0
- package/third_party/libwebm/webm_parser/src/block_header_parser.h +65 -0
- package/third_party/libwebm/webm_parser/src/block_more_parser.h +32 -0
- package/third_party/libwebm/webm_parser/src/block_parser.cc +285 -0
- package/third_party/libwebm/webm_parser/src/block_parser.h +126 -0
- package/third_party/libwebm/webm_parser/src/bool_parser.h +95 -0
- package/third_party/libwebm/webm_parser/src/buffer_reader.cc +110 -0
- package/third_party/libwebm/webm_parser/src/byte_parser.h +144 -0
- package/third_party/libwebm/webm_parser/src/callback.cc +155 -0
- package/third_party/libwebm/webm_parser/src/chapter_atom_parser.h +42 -0
- package/third_party/libwebm/webm_parser/src/chapter_display_parser.h +34 -0
- package/third_party/libwebm/webm_parser/src/chapters_parser.h +28 -0
- package/third_party/libwebm/webm_parser/src/cluster_parser.h +48 -0
- package/third_party/libwebm/webm_parser/src/colour_parser.h +55 -0
- package/third_party/libwebm/webm_parser/src/content_enc_aes_settings_parser.h +32 -0
- package/third_party/libwebm/webm_parser/src/content_encoding_parser.h +38 -0
- package/third_party/libwebm/webm_parser/src/content_encodings_parser.h +30 -0
- package/third_party/libwebm/webm_parser/src/content_encryption_parser.h +37 -0
- package/third_party/libwebm/webm_parser/src/cue_point_parser.h +38 -0
- package/third_party/libwebm/webm_parser/src/cue_track_positions_parser.h +39 -0
- package/third_party/libwebm/webm_parser/src/cues_parser.h +27 -0
- package/third_party/libwebm/webm_parser/src/date_parser.cc +72 -0
- package/third_party/libwebm/webm_parser/src/date_parser.h +64 -0
- package/third_party/libwebm/webm_parser/src/ebml_parser.h +48 -0
- package/third_party/libwebm/webm_parser/src/edition_entry_parser.h +35 -0
- package/third_party/libwebm/webm_parser/src/element_parser.h +102 -0
- package/third_party/libwebm/webm_parser/src/file_reader.cc +142 -0
- package/third_party/libwebm/webm_parser/src/float_parser.cc +77 -0
- package/third_party/libwebm/webm_parser/src/float_parser.h +65 -0
- package/third_party/libwebm/webm_parser/src/id_element_parser.cc +49 -0
- package/third_party/libwebm/webm_parser/src/id_element_parser.h +56 -0
- package/third_party/libwebm/webm_parser/src/id_parser.cc +75 -0
- package/third_party/libwebm/webm_parser/src/id_parser.h +45 -0
- package/third_party/libwebm/webm_parser/src/info_parser.h +44 -0
- package/third_party/libwebm/webm_parser/src/int_parser.h +121 -0
- package/third_party/libwebm/webm_parser/src/istream_reader.cc +133 -0
- package/third_party/libwebm/webm_parser/src/master_parser.cc +298 -0
- package/third_party/libwebm/webm_parser/src/master_parser.h +230 -0
- package/third_party/libwebm/webm_parser/src/master_value_parser.h +533 -0
- package/third_party/libwebm/webm_parser/src/mastering_metadata_parser.h +57 -0
- package/third_party/libwebm/webm_parser/src/parser.h +34 -0
- package/third_party/libwebm/webm_parser/src/parser_utils.cc +34 -0
- package/third_party/libwebm/webm_parser/src/parser_utils.h +64 -0
- package/third_party/libwebm/webm_parser/src/projection_parser.h +40 -0
- package/third_party/libwebm/webm_parser/src/recursive_parser.h +93 -0
- package/third_party/libwebm/webm_parser/src/seek_head_parser.h +27 -0
- package/third_party/libwebm/webm_parser/src/seek_parser.h +37 -0
- package/third_party/libwebm/webm_parser/src/segment_parser.cc +86 -0
- package/third_party/libwebm/webm_parser/src/segment_parser.h +53 -0
- package/third_party/libwebm/webm_parser/src/simple_tag_parser.h +37 -0
- package/third_party/libwebm/webm_parser/src/size_parser.cc +56 -0
- package/third_party/libwebm/webm_parser/src/size_parser.h +43 -0
- package/third_party/libwebm/webm_parser/src/skip_callback.h +63 -0
- package/third_party/libwebm/webm_parser/src/skip_parser.cc +59 -0
- package/third_party/libwebm/webm_parser/src/skip_parser.h +35 -0
- package/third_party/libwebm/webm_parser/src/slices_parser.h +30 -0
- package/third_party/libwebm/webm_parser/src/tag_parser.h +37 -0
- package/third_party/libwebm/webm_parser/src/tags_parser.h +27 -0
- package/third_party/libwebm/webm_parser/src/targets_parser.h +35 -0
- package/third_party/libwebm/webm_parser/src/time_slice_parser.h +30 -0
- package/third_party/libwebm/webm_parser/src/track_entry_parser.h +65 -0
- package/third_party/libwebm/webm_parser/src/tracks_parser.h +27 -0
- package/third_party/libwebm/webm_parser/src/unknown_parser.cc +49 -0
- package/third_party/libwebm/webm_parser/src/unknown_parser.h +38 -0
- package/third_party/libwebm/webm_parser/src/var_int_parser.cc +71 -0
- package/third_party/libwebm/webm_parser/src/var_int_parser.h +56 -0
- package/third_party/libwebm/webm_parser/src/video_parser.h +122 -0
- package/third_party/libwebm/webm_parser/src/virtual_block_parser.cc +72 -0
- package/third_party/libwebm/webm_parser/src/virtual_block_parser.h +69 -0
- package/third_party/libwebm/webm_parser/src/void_parser.cc +49 -0
- package/third_party/libwebm/webm_parser/src/void_parser.h +41 -0
- package/third_party/libwebm/webm_parser/src/webm_parser.cc +282 -0
- package/third_party/range-source/LICENSE +21 -0
- package/third_party/range-source/README.md +8 -0
- package/third_party/range-source/include/range_source.h +395 -0
- package/third_party/range-source/include/range_source_download.h +309 -0
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
#
|
|
3
|
+
# build_codecs_ios_device.sh
|
|
4
|
+
# Builds the decoders for iOS Device (arm64 only): libvpx for VP9 and dav1d for AV1 (8- and
|
|
5
|
+
# 10/12-bit), as static libraries in prebuilt/ios/lib
|
|
6
|
+
# Needs meson and ninja for dav1d (brew install meson ninja)
|
|
7
|
+
#
|
|
8
|
+
|
|
9
|
+
set -e
|
|
10
|
+
|
|
11
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
12
|
+
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
|
|
13
|
+
LIBVPX_VERSION="1.14.0"
|
|
14
|
+
DAV1D_VERSION="1.5.1"
|
|
15
|
+
BUILD_DIR="$SCRIPT_DIR/build/ios-device"
|
|
16
|
+
OUTPUT_DIR="$PROJECT_DIR/prebuilt/ios"
|
|
17
|
+
|
|
18
|
+
# iOS deployment target
|
|
19
|
+
IOS_MIN_VERSION="13.0"
|
|
20
|
+
|
|
21
|
+
# libvpx embeds its configure line in the library, so installs are staged with DESTDIR; no
|
|
22
|
+
# local paths end up in it.
|
|
23
|
+
INSTALL_PREFIX="/usr/local"
|
|
24
|
+
# libvpx and dav1d install into one staging root
|
|
25
|
+
DEPS_STAGE="$BUILD_DIR/deps-arm64"
|
|
26
|
+
|
|
27
|
+
echo "🔧 Building libvpx $LIBVPX_VERSION and dav1d $DAV1D_VERSION for iOS Device (arm64)"
|
|
28
|
+
echo " Build dir: $BUILD_DIR"
|
|
29
|
+
echo " Output dir: $OUTPUT_DIR"
|
|
30
|
+
|
|
31
|
+
mkdir -p "$BUILD_DIR"
|
|
32
|
+
mkdir -p "$OUTPUT_DIR/lib"
|
|
33
|
+
mkdir -p "$OUTPUT_DIR/include"
|
|
34
|
+
|
|
35
|
+
# Download libvpx source
|
|
36
|
+
download_libvpx() {
|
|
37
|
+
if [ ! -d "$BUILD_DIR/libvpx-$LIBVPX_VERSION" ]; then
|
|
38
|
+
echo "📥 Downloading libvpx $LIBVPX_VERSION..."
|
|
39
|
+
cd "$BUILD_DIR"
|
|
40
|
+
curl -L "https://github.com/webmproject/libvpx/archive/refs/tags/v$LIBVPX_VERSION.tar.gz" -o libvpx.tar.gz
|
|
41
|
+
tar xf libvpx.tar.gz
|
|
42
|
+
rm libvpx.tar.gz
|
|
43
|
+
fi
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
# Download dav1d source
|
|
47
|
+
download_dav1d() {
|
|
48
|
+
if [ ! -d "$BUILD_DIR/dav1d-$DAV1D_VERSION" ]; then
|
|
49
|
+
echo "📥 Downloading dav1d $DAV1D_VERSION..."
|
|
50
|
+
cd "$BUILD_DIR"
|
|
51
|
+
curl -L "https://github.com/videolan/dav1d/archive/refs/tags/$DAV1D_VERSION.tar.gz" -o dav1d.tar.gz
|
|
52
|
+
tar xf dav1d.tar.gz
|
|
53
|
+
rm dav1d.tar.gz
|
|
54
|
+
fi
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
# Build libvpx for iOS Device
|
|
58
|
+
build_libvpx_device() {
|
|
59
|
+
echo "🔨 Building libvpx for iOS Device (arm64)..."
|
|
60
|
+
|
|
61
|
+
cd "$BUILD_DIR/libvpx-$LIBVPX_VERSION"
|
|
62
|
+
|
|
63
|
+
local STAGE="$DEPS_STAGE"
|
|
64
|
+
|
|
65
|
+
# Clean previous build
|
|
66
|
+
make clean 2>/dev/null || true
|
|
67
|
+
|
|
68
|
+
local SDK_PATH=$(xcrun --sdk iphoneos --show-sdk-path)
|
|
69
|
+
local CC="$(xcrun --sdk iphoneos -f clang)"
|
|
70
|
+
local CXX="$(xcrun --sdk iphoneos -f clang++)"
|
|
71
|
+
|
|
72
|
+
local CFLAGS="-arch arm64 -isysroot $SDK_PATH -mios-version-min=$IOS_MIN_VERSION"
|
|
73
|
+
local LDFLAGS="-arch arm64 -isysroot $SDK_PATH"
|
|
74
|
+
|
|
75
|
+
# Export compiler environment for libvpx
|
|
76
|
+
export CC="$CC"
|
|
77
|
+
export CXX="$CXX"
|
|
78
|
+
export CFLAGS="$CFLAGS"
|
|
79
|
+
export CXXFLAGS="$CFLAGS"
|
|
80
|
+
export LDFLAGS="$LDFLAGS"
|
|
81
|
+
export CROSS="$SDK_PATH"
|
|
82
|
+
|
|
83
|
+
export AR="$(xcrun --sdk iphoneos --find ar)"
|
|
84
|
+
export RANLIB="$(xcrun --sdk iphoneos --find ranlib)"
|
|
85
|
+
export NM="$(xcrun --sdk iphoneos --find nm)"
|
|
86
|
+
|
|
87
|
+
./configure \
|
|
88
|
+
--prefix="$INSTALL_PREFIX" \
|
|
89
|
+
--target=arm64-darwin-gcc \
|
|
90
|
+
--disable-examples \
|
|
91
|
+
--disable-tools \
|
|
92
|
+
--disable-docs \
|
|
93
|
+
--disable-unit-tests \
|
|
94
|
+
--enable-vp8-decoder \
|
|
95
|
+
--enable-vp9-decoder \
|
|
96
|
+
--disable-vp8-encoder \
|
|
97
|
+
--disable-vp9-encoder \
|
|
98
|
+
--enable-pic \
|
|
99
|
+
--enable-static \
|
|
100
|
+
--disable-shared
|
|
101
|
+
|
|
102
|
+
make -j$(sysctl -n hw.ncpu)
|
|
103
|
+
make install DESTDIR="$STAGE"
|
|
104
|
+
|
|
105
|
+
echo "✅ libvpx device build complete: $STAGE"
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
# Build dav1d for iOS Device: the AV1 decoder, 8-bit and 10/12-bit (16bpc)
|
|
109
|
+
build_dav1d_device() {
|
|
110
|
+
echo "🔨 Building dav1d for iOS Device (arm64)..."
|
|
111
|
+
|
|
112
|
+
local BUILD="$BUILD_DIR/dav1d-build-arm64"
|
|
113
|
+
local CROSS_FILE="$BUILD_DIR/dav1d-arm64.meson"
|
|
114
|
+
rm -rf "$BUILD"
|
|
115
|
+
|
|
116
|
+
local SDK_PATH=$(xcrun --sdk iphoneos --show-sdk-path)
|
|
117
|
+
local CC="$(xcrun --sdk iphoneos -f clang)"
|
|
118
|
+
|
|
119
|
+
cat > "$CROSS_FILE" <<EOF
|
|
120
|
+
[binaries]
|
|
121
|
+
c = ['$CC', '-arch', 'arm64', '-isysroot', '$SDK_PATH']
|
|
122
|
+
ar = '$(xcrun --sdk iphoneos --find ar)'
|
|
123
|
+
strip = '$(xcrun --sdk iphoneos --find strip)'
|
|
124
|
+
|
|
125
|
+
[built-in options]
|
|
126
|
+
c_args = ['-mios-version-min=$IOS_MIN_VERSION']
|
|
127
|
+
c_link_args = ['-mios-version-min=$IOS_MIN_VERSION']
|
|
128
|
+
|
|
129
|
+
[properties]
|
|
130
|
+
needs_exe_wrapper = true
|
|
131
|
+
|
|
132
|
+
[host_machine]
|
|
133
|
+
system = 'darwin'
|
|
134
|
+
subsystem = 'ios'
|
|
135
|
+
kernel = 'xnu'
|
|
136
|
+
cpu_family = 'aarch64'
|
|
137
|
+
cpu = 'aarch64'
|
|
138
|
+
endian = 'little'
|
|
139
|
+
EOF
|
|
140
|
+
|
|
141
|
+
# The flags libvpx exported are for iOS; meson would apply them to the build machine's compiler.
|
|
142
|
+
env -u CC -u CXX -u CFLAGS -u CXXFLAGS -u LDFLAGS \
|
|
143
|
+
meson setup "$BUILD" "$BUILD_DIR/dav1d-$DAV1D_VERSION" \
|
|
144
|
+
--cross-file "$CROSS_FILE" \
|
|
145
|
+
--prefix="$INSTALL_PREFIX" \
|
|
146
|
+
--libdir=lib \
|
|
147
|
+
--buildtype=release \
|
|
148
|
+
--default-library=static \
|
|
149
|
+
-Dbitdepths=8,16 \
|
|
150
|
+
-Denable_tools=false \
|
|
151
|
+
-Denable_tests=false
|
|
152
|
+
ninja -C "$BUILD"
|
|
153
|
+
DESTDIR="$DEPS_STAGE" meson install -C "$BUILD" --no-rebuild
|
|
154
|
+
|
|
155
|
+
echo "✅ dav1d device build complete: $DEPS_STAGE"
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
# Copy outputs to final directory
|
|
159
|
+
copy_outputs() {
|
|
160
|
+
echo "📦 Copying libraries to output directory..."
|
|
161
|
+
|
|
162
|
+
local DEPS_PREFIX="$DEPS_STAGE$INSTALL_PREFIX"
|
|
163
|
+
local COMMON_INCLUDE="$PROJECT_DIR/prebuilt/include"
|
|
164
|
+
|
|
165
|
+
# Clear output lib dir
|
|
166
|
+
rm -rf "$OUTPUT_DIR/lib"
|
|
167
|
+
mkdir -p "$OUTPUT_DIR/lib"
|
|
168
|
+
|
|
169
|
+
# Copy libvpx and dav1d static libraries
|
|
170
|
+
cp "$DEPS_PREFIX/lib/"*.a "$OUTPUT_DIR/lib/"
|
|
171
|
+
|
|
172
|
+
# Copy headers to common prebuilt/include (shared by all platforms)
|
|
173
|
+
rm -rf "$COMMON_INCLUDE"
|
|
174
|
+
mkdir -p "$COMMON_INCLUDE"
|
|
175
|
+
cp -R "$DEPS_PREFIX/include/"* "$COMMON_INCLUDE/"
|
|
176
|
+
|
|
177
|
+
echo "📋 Libraries built:"
|
|
178
|
+
ls -la "$OUTPUT_DIR/lib/"
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
# Main build process
|
|
182
|
+
main() {
|
|
183
|
+
echo "🚀 Starting iOS Device libvpx + dav1d build..."
|
|
184
|
+
echo ""
|
|
185
|
+
|
|
186
|
+
for tool in meson ninja; do
|
|
187
|
+
if ! command -v "$tool" >/dev/null 2>&1; then
|
|
188
|
+
echo "❌ $tool not found on PATH; dav1d needs it (brew install meson ninja)"
|
|
189
|
+
exit 1
|
|
190
|
+
fi
|
|
191
|
+
done
|
|
192
|
+
|
|
193
|
+
download_libvpx
|
|
194
|
+
download_dav1d
|
|
195
|
+
|
|
196
|
+
rm -rf "$DEPS_STAGE"
|
|
197
|
+
build_libvpx_device
|
|
198
|
+
build_dav1d_device
|
|
199
|
+
|
|
200
|
+
copy_outputs
|
|
201
|
+
|
|
202
|
+
echo ""
|
|
203
|
+
echo "✅ iOS Device libvpx + dav1d build complete!"
|
|
204
|
+
echo " Output: $OUTPUT_DIR"
|
|
205
|
+
echo ""
|
|
206
|
+
echo "📝 Libraries built for: arm64 (iOS Device)"
|
|
207
|
+
echo " Use prebuilt/ios-simulator/ for simulator builds"
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
main "$@"
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
#
|
|
3
|
+
# build_codecs_ios_simulator.sh
|
|
4
|
+
# Builds the decoders for iOS Simulator (universal: arm64 + x86_64): libvpx for VP9 and dav1d for
|
|
5
|
+
# AV1 (8- and 10/12-bit), as static libraries in prebuilt/ios-simulator/lib
|
|
6
|
+
# Needs meson and ninja for dav1d (brew install meson ninja), and nasm for x86_64
|
|
7
|
+
#
|
|
8
|
+
|
|
9
|
+
set -e
|
|
10
|
+
|
|
11
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
12
|
+
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
|
|
13
|
+
LIBVPX_VERSION="1.14.0"
|
|
14
|
+
DAV1D_VERSION="1.5.1"
|
|
15
|
+
BUILD_DIR="$SCRIPT_DIR/build/ios-simulator"
|
|
16
|
+
OUTPUT_DIR="$PROJECT_DIR/prebuilt/ios-simulator"
|
|
17
|
+
|
|
18
|
+
# iOS deployment target
|
|
19
|
+
IOS_MIN_VERSION="13.0"
|
|
20
|
+
|
|
21
|
+
# Architectures to build for simulator
|
|
22
|
+
ARCHS=("arm64" "x86_64")
|
|
23
|
+
|
|
24
|
+
# libvpx embeds its configure line in the library, so installs are staged with DESTDIR; no
|
|
25
|
+
# local paths end up in it.
|
|
26
|
+
INSTALL_PREFIX="/usr/local"
|
|
27
|
+
|
|
28
|
+
# libvpx and dav1d install into one staging root per architecture
|
|
29
|
+
deps_stage() {
|
|
30
|
+
echo "$BUILD_DIR/deps-$1-sim"
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
echo "🔧 Building libvpx $LIBVPX_VERSION and dav1d $DAV1D_VERSION for iOS Simulator (arm64 + x86_64)"
|
|
34
|
+
echo " Build dir: $BUILD_DIR"
|
|
35
|
+
echo " Output dir: $OUTPUT_DIR"
|
|
36
|
+
|
|
37
|
+
mkdir -p "$BUILD_DIR"
|
|
38
|
+
mkdir -p "$OUTPUT_DIR/lib"
|
|
39
|
+
mkdir -p "$OUTPUT_DIR/include"
|
|
40
|
+
|
|
41
|
+
# Download libvpx source
|
|
42
|
+
download_libvpx() {
|
|
43
|
+
if [ ! -d "$BUILD_DIR/libvpx-$LIBVPX_VERSION" ]; then
|
|
44
|
+
echo "📥 Downloading libvpx $LIBVPX_VERSION..."
|
|
45
|
+
cd "$BUILD_DIR"
|
|
46
|
+
curl -L "https://github.com/webmproject/libvpx/archive/refs/tags/v$LIBVPX_VERSION.tar.gz" -o libvpx.tar.gz
|
|
47
|
+
tar xf libvpx.tar.gz
|
|
48
|
+
rm libvpx.tar.gz
|
|
49
|
+
fi
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
# Download dav1d source
|
|
53
|
+
download_dav1d() {
|
|
54
|
+
if [ ! -d "$BUILD_DIR/dav1d-$DAV1D_VERSION" ]; then
|
|
55
|
+
echo "📥 Downloading dav1d $DAV1D_VERSION..."
|
|
56
|
+
cd "$BUILD_DIR"
|
|
57
|
+
curl -L "https://github.com/videolan/dav1d/archive/refs/tags/$DAV1D_VERSION.tar.gz" -o dav1d.tar.gz
|
|
58
|
+
tar xf dav1d.tar.gz
|
|
59
|
+
rm dav1d.tar.gz
|
|
60
|
+
fi
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
# Build libvpx for a specific architecture
|
|
64
|
+
build_libvpx_arch() {
|
|
65
|
+
local ARCH=$1
|
|
66
|
+
echo "🔨 Building libvpx for iOS Simulator ($ARCH)..."
|
|
67
|
+
|
|
68
|
+
cd "$BUILD_DIR/libvpx-$LIBVPX_VERSION"
|
|
69
|
+
|
|
70
|
+
local STAGE="$(deps_stage "$ARCH")"
|
|
71
|
+
|
|
72
|
+
# Clean previous build
|
|
73
|
+
make clean 2>/dev/null || true
|
|
74
|
+
|
|
75
|
+
local SDK_PATH=$(xcrun --sdk iphonesimulator --show-sdk-path)
|
|
76
|
+
local CC="$(xcrun --sdk iphonesimulator -f clang)"
|
|
77
|
+
local CXX="$(xcrun --sdk iphonesimulator -f clang++)"
|
|
78
|
+
|
|
79
|
+
local CFLAGS="-arch $ARCH -isysroot $SDK_PATH -mios-simulator-version-min=$IOS_MIN_VERSION -target $ARCH-apple-ios$IOS_MIN_VERSION-simulator"
|
|
80
|
+
local LDFLAGS="-arch $ARCH -isysroot $SDK_PATH -target $ARCH-apple-ios$IOS_MIN_VERSION-simulator"
|
|
81
|
+
|
|
82
|
+
# Export compiler environment for libvpx
|
|
83
|
+
export CC="$CC"
|
|
84
|
+
export CXX="$CXX"
|
|
85
|
+
export CFLAGS="$CFLAGS"
|
|
86
|
+
export CXXFLAGS="$CFLAGS"
|
|
87
|
+
export LDFLAGS="$LDFLAGS"
|
|
88
|
+
export AR="$(xcrun --sdk iphonesimulator --find ar)"
|
|
89
|
+
export RANLIB="$(xcrun --sdk iphonesimulator --find ranlib)"
|
|
90
|
+
export NM="$(xcrun --sdk iphonesimulator --find nm)"
|
|
91
|
+
|
|
92
|
+
# Use generic-gnu target for libvpx cross-compile to simulator
|
|
93
|
+
./configure \
|
|
94
|
+
--prefix="$INSTALL_PREFIX" \
|
|
95
|
+
--target=generic-gnu \
|
|
96
|
+
--disable-examples \
|
|
97
|
+
--disable-tools \
|
|
98
|
+
--disable-docs \
|
|
99
|
+
--disable-unit-tests \
|
|
100
|
+
--enable-vp8-decoder \
|
|
101
|
+
--enable-vp9-decoder \
|
|
102
|
+
--disable-vp8-encoder \
|
|
103
|
+
--disable-vp9-encoder \
|
|
104
|
+
--enable-pic \
|
|
105
|
+
--enable-static \
|
|
106
|
+
--disable-shared \
|
|
107
|
+
--extra-cflags="$CFLAGS" \
|
|
108
|
+
--extra-cxxflags="$CFLAGS"
|
|
109
|
+
|
|
110
|
+
make -j$(sysctl -n hw.ncpu)
|
|
111
|
+
make install DESTDIR="$STAGE"
|
|
112
|
+
|
|
113
|
+
echo "✅ libvpx $ARCH simulator build complete: $STAGE"
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
# Build dav1d for a specific architecture: the AV1 decoder, 8-bit and 10/12-bit
|
|
117
|
+
# (16bpc)
|
|
118
|
+
build_dav1d_arch() {
|
|
119
|
+
local ARCH=$1
|
|
120
|
+
echo "🔨 Building dav1d for iOS Simulator ($ARCH)..."
|
|
121
|
+
|
|
122
|
+
local BUILD="$BUILD_DIR/dav1d-build-$ARCH-sim"
|
|
123
|
+
local CROSS_FILE="$BUILD_DIR/dav1d-$ARCH-sim.meson"
|
|
124
|
+
rm -rf "$BUILD"
|
|
125
|
+
|
|
126
|
+
local SDK_PATH=$(xcrun --sdk iphonesimulator --show-sdk-path)
|
|
127
|
+
local CC="$(xcrun --sdk iphonesimulator -f clang)"
|
|
128
|
+
local CPU_FAMILY="$ARCH"
|
|
129
|
+
[ "$ARCH" = "arm64" ] && CPU_FAMILY="aarch64"
|
|
130
|
+
|
|
131
|
+
cat > "$CROSS_FILE" <<EOF
|
|
132
|
+
[binaries]
|
|
133
|
+
c = ['$CC', '-arch', '$ARCH', '-isysroot', '$SDK_PATH']
|
|
134
|
+
ar = '$(xcrun --sdk iphonesimulator --find ar)'
|
|
135
|
+
strip = '$(xcrun --sdk iphonesimulator --find strip)'
|
|
136
|
+
|
|
137
|
+
[built-in options]
|
|
138
|
+
c_args = ['-target', '$ARCH-apple-ios$IOS_MIN_VERSION-simulator']
|
|
139
|
+
c_link_args = ['-target', '$ARCH-apple-ios$IOS_MIN_VERSION-simulator']
|
|
140
|
+
|
|
141
|
+
[properties]
|
|
142
|
+
needs_exe_wrapper = true
|
|
143
|
+
|
|
144
|
+
[host_machine]
|
|
145
|
+
system = 'darwin'
|
|
146
|
+
subsystem = 'ios-simulator'
|
|
147
|
+
kernel = 'xnu'
|
|
148
|
+
cpu_family = '$CPU_FAMILY'
|
|
149
|
+
cpu = '$CPU_FAMILY'
|
|
150
|
+
endian = 'little'
|
|
151
|
+
EOF
|
|
152
|
+
|
|
153
|
+
# The flags libvpx exported are for the simulator; meson would apply them to the build
|
|
154
|
+
# machine's compiler.
|
|
155
|
+
env -u CC -u CXX -u CFLAGS -u CXXFLAGS -u LDFLAGS \
|
|
156
|
+
meson setup "$BUILD" "$BUILD_DIR/dav1d-$DAV1D_VERSION" \
|
|
157
|
+
--cross-file "$CROSS_FILE" \
|
|
158
|
+
--prefix="$INSTALL_PREFIX" \
|
|
159
|
+
--libdir=lib \
|
|
160
|
+
--buildtype=release \
|
|
161
|
+
--default-library=static \
|
|
162
|
+
-Dbitdepths=8,16 \
|
|
163
|
+
-Denable_tools=false \
|
|
164
|
+
-Denable_tests=false
|
|
165
|
+
ninja -C "$BUILD"
|
|
166
|
+
DESTDIR="$(deps_stage "$ARCH")" meson install -C "$BUILD" --no-rebuild
|
|
167
|
+
|
|
168
|
+
echo "✅ dav1d $ARCH simulator build complete"
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
# Create universal (fat) libraries using lipo
|
|
172
|
+
create_universal_libs() {
|
|
173
|
+
echo "🔗 Creating universal (fat) libraries..."
|
|
174
|
+
|
|
175
|
+
# Clear output lib dir
|
|
176
|
+
rm -rf "$OUTPUT_DIR/lib"
|
|
177
|
+
mkdir -p "$OUTPUT_DIR/lib"
|
|
178
|
+
|
|
179
|
+
# Get list of libraries from first arch
|
|
180
|
+
local FIRST_ARCH="${ARCHS[0]}"
|
|
181
|
+
local DEPS_LIBS=$(ls "$(deps_stage "$FIRST_ARCH")$INSTALL_PREFIX/lib/"*.a 2>/dev/null | xargs -n1 basename)
|
|
182
|
+
|
|
183
|
+
# Create fat libvpx and dav1d libraries
|
|
184
|
+
for lib in $DEPS_LIBS; do
|
|
185
|
+
local inputs=""
|
|
186
|
+
for arch in "${ARCHS[@]}"; do
|
|
187
|
+
inputs="$inputs $(deps_stage "$arch")$INSTALL_PREFIX/lib/$lib"
|
|
188
|
+
done
|
|
189
|
+
echo " Creating universal $lib..."
|
|
190
|
+
lipo -create $inputs -output "$OUTPUT_DIR/lib/$lib"
|
|
191
|
+
done
|
|
192
|
+
|
|
193
|
+
# Copy headers (same for all archs)
|
|
194
|
+
rm -rf "$OUTPUT_DIR/include"
|
|
195
|
+
mkdir -p "$OUTPUT_DIR/include"
|
|
196
|
+
cp -R "$(deps_stage "$FIRST_ARCH")$INSTALL_PREFIX/include/"* "$OUTPUT_DIR/include/"
|
|
197
|
+
|
|
198
|
+
echo "📋 Universal libraries built:"
|
|
199
|
+
for lib in "$OUTPUT_DIR/lib/"*.a; do
|
|
200
|
+
echo " $(basename $lib): $(lipo -archs $lib)"
|
|
201
|
+
done
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
# Sync headers to canonical prebuilt/include for Xcode compatibility
|
|
205
|
+
sync_common_includes() {
|
|
206
|
+
local COMMON_INCLUDE_DIR="$PROJECT_DIR/prebuilt/include"
|
|
207
|
+
echo "🔄 Syncing headers to canonical include dir: $COMMON_INCLUDE_DIR"
|
|
208
|
+
mkdir -p "$COMMON_INCLUDE_DIR"
|
|
209
|
+
if command -v rsync >/dev/null 2>&1; then
|
|
210
|
+
rsync -a "$OUTPUT_DIR/include/" "$COMMON_INCLUDE_DIR/"
|
|
211
|
+
else
|
|
212
|
+
cp -R "$OUTPUT_DIR/include/." "$COMMON_INCLUDE_DIR/"
|
|
213
|
+
fi
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
# Main build process
|
|
217
|
+
main() {
|
|
218
|
+
echo "🚀 Starting iOS Simulator libvpx + dav1d build (universal)..."
|
|
219
|
+
echo ""
|
|
220
|
+
|
|
221
|
+
for tool in meson ninja; do
|
|
222
|
+
if ! command -v "$tool" >/dev/null 2>&1; then
|
|
223
|
+
echo "❌ $tool not found on PATH; dav1d needs it (brew install meson ninja)"
|
|
224
|
+
exit 1
|
|
225
|
+
fi
|
|
226
|
+
done
|
|
227
|
+
|
|
228
|
+
download_libvpx
|
|
229
|
+
download_dav1d
|
|
230
|
+
|
|
231
|
+
# Build each architecture
|
|
232
|
+
for arch in "${ARCHS[@]}"; do
|
|
233
|
+
echo ""
|
|
234
|
+
echo "================================================"
|
|
235
|
+
echo "Building for $arch..."
|
|
236
|
+
echo "================================================"
|
|
237
|
+
rm -rf "$(deps_stage "$arch")"
|
|
238
|
+
build_libvpx_arch "$arch"
|
|
239
|
+
build_dav1d_arch "$arch"
|
|
240
|
+
done
|
|
241
|
+
|
|
242
|
+
# Create universal libraries
|
|
243
|
+
echo ""
|
|
244
|
+
echo "================================================"
|
|
245
|
+
create_universal_libs
|
|
246
|
+
sync_common_includes
|
|
247
|
+
|
|
248
|
+
echo ""
|
|
249
|
+
echo "✅ iOS Simulator libvpx + dav1d build complete!"
|
|
250
|
+
echo " Output: $OUTPUT_DIR"
|
|
251
|
+
echo ""
|
|
252
|
+
echo "📝 Universal libraries built for: ${ARCHS[*]}"
|
|
253
|
+
echo " Supports both Apple Silicon and Intel Macs"
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
main "$@"
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
#
|
|
3
|
+
# build_wasm.sh
|
|
4
|
+
# The WebAssembly modules of alpha-video-web (web/), each with its .wasm inlined so the npm
|
|
5
|
+
# package has no files to host:
|
|
6
|
+
# web/src/wasm/demuxer.mjs the core's demuxer (cpp/AlphaDemuxer, on libwebm's parser), reading
|
|
7
|
+
# through JavaScript so files stream in by range, and the shared
|
|
8
|
+
# colour conversion (cpp/YuvToRgb), for the WebCodecs and software
|
|
9
|
+
# engines
|
|
10
|
+
# web/src/wasm/software-vpx.mjs FFmpeg's VP8 and VP9 decoders, single-threaded, run in a Web
|
|
11
|
+
# Worker per stream by the software engine; loaded only for VP8
|
|
12
|
+
# and VP9 streams
|
|
13
|
+
# web/src/wasm/software-av1.mjs dav1d through the av1 codec module's plugin (codecs/av1), as on
|
|
14
|
+
# Android and iOS; no FFmpeg. Loaded only for AV1 streams
|
|
15
|
+
# web/src/wasm/software-*-mt.mjs the same with threads (FFmpeg's frame threads, dav1d's own),
|
|
16
|
+
# for cross-origin isolated pages, where SharedArrayBuffer exists
|
|
17
|
+
#
|
|
18
|
+
# Needs Emscripten, meson and ninja (brew install emscripten meson ninja).
|
|
19
|
+
|
|
20
|
+
set -euo pipefail
|
|
21
|
+
|
|
22
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
23
|
+
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
|
|
24
|
+
|
|
25
|
+
FFMPEG_VERSION="6.1"
|
|
26
|
+
DAV1D_VERSION="1.5.1"
|
|
27
|
+
|
|
28
|
+
BUILD_DIR="$SCRIPT_DIR/build/wasm"
|
|
29
|
+
OUT_DIR="$PROJECT_DIR/web/src/wasm"
|
|
30
|
+
JOBS="$(sysctl -n hw.ncpu 2>/dev/null || nproc)"
|
|
31
|
+
|
|
32
|
+
for tool in emcc em++ emconfigure emmake meson ninja pkg-config; do
|
|
33
|
+
if ! command -v "$tool" >/dev/null; then
|
|
34
|
+
echo "❌ $tool not found on PATH (brew install emscripten meson ninja pkg-config)"
|
|
35
|
+
exit 1
|
|
36
|
+
fi
|
|
37
|
+
done
|
|
38
|
+
|
|
39
|
+
mkdir -p "$BUILD_DIR"
|
|
40
|
+
|
|
41
|
+
download() {
|
|
42
|
+
local name=$1 url=$2 android_copy=$3
|
|
43
|
+
if [ -d "$BUILD_DIR/$name" ]; then return; fi
|
|
44
|
+
# The Android build downloads the same releases; reuse them when they're there
|
|
45
|
+
if [ -d "$SCRIPT_DIR/build/android/$android_copy" ]; then
|
|
46
|
+
cp -R "$SCRIPT_DIR/build/android/$android_copy" "$BUILD_DIR/$name"
|
|
47
|
+
return
|
|
48
|
+
fi
|
|
49
|
+
echo "📥 Downloading $name..."
|
|
50
|
+
mkdir -p "$BUILD_DIR/$name"
|
|
51
|
+
curl -L "$url" | tar xz --strip-components=1 -C "$BUILD_DIR/$name" 2>/dev/null \
|
|
52
|
+
|| curl -L "$url" | tar xJ --strip-components=1 -C "$BUILD_DIR/$name"
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
# build_dav1d <variant> [-pthread]: into stage-<variant>
|
|
56
|
+
build_dav1d() {
|
|
57
|
+
local variant=$1 pthread=${2:-}
|
|
58
|
+
local stage="$BUILD_DIR/stage-$variant"
|
|
59
|
+
if [ -f "$stage/lib/libdav1d.a" ]; then return; fi
|
|
60
|
+
echo "🔨 Building dav1d $DAV1D_VERSION for WebAssembly ($variant)..."
|
|
61
|
+
local cross="$BUILD_DIR/$variant-emscripten.meson"
|
|
62
|
+
local flags="'-Oz', '-flto'${pthread:+, '$pthread'}"
|
|
63
|
+
cat > "$cross" <<EOF
|
|
64
|
+
[binaries]
|
|
65
|
+
c = 'emcc'
|
|
66
|
+
ar = 'emar'
|
|
67
|
+
ranlib = 'emranlib'
|
|
68
|
+
|
|
69
|
+
[built-in options]
|
|
70
|
+
c_args = [$flags]
|
|
71
|
+
c_link_args = [$flags]
|
|
72
|
+
|
|
73
|
+
[properties]
|
|
74
|
+
needs_exe_wrapper = true
|
|
75
|
+
|
|
76
|
+
[host_machine]
|
|
77
|
+
system = 'emscripten'
|
|
78
|
+
cpu_family = 'wasm32'
|
|
79
|
+
cpu = 'wasm32'
|
|
80
|
+
endian = 'little'
|
|
81
|
+
EOF
|
|
82
|
+
rm -rf "$BUILD_DIR/$variant-build"
|
|
83
|
+
# Meson's threads dependency always adds -pthread, which needs SharedArrayBuffer at run time;
|
|
84
|
+
# the cross file adds it for the threaded variant only. Single-threaded, the plugin is given
|
|
85
|
+
# one thread, so dav1d starts none.
|
|
86
|
+
sed -i '' "s/^ thread_dependency = dependency('threads')$/ thread_dependency = host_machine.system() == 'emscripten' ? declare_dependency() : dependency('threads')/" \
|
|
87
|
+
"$BUILD_DIR/dav1d-$DAV1D_VERSION/meson.build"
|
|
88
|
+
meson setup "$BUILD_DIR/$variant-build" "$BUILD_DIR/dav1d-$DAV1D_VERSION" \
|
|
89
|
+
--cross-file "$cross" \
|
|
90
|
+
--prefix="$stage" \
|
|
91
|
+
--libdir=lib \
|
|
92
|
+
--buildtype=release \
|
|
93
|
+
--default-library=static \
|
|
94
|
+
-Denable_asm=false \
|
|
95
|
+
-Dbitdepths=8,16 \
|
|
96
|
+
-Dlogging=false \
|
|
97
|
+
-Denable_tools=false \
|
|
98
|
+
-Denable_tests=false
|
|
99
|
+
ninja -C "$BUILD_DIR/$variant-build"
|
|
100
|
+
meson install -C "$BUILD_DIR/$variant-build" --no-rebuild
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
# build_ffmpeg <variant> <configure flags...>: out of tree in ffmpeg-<variant>, installed to stage-<variant>
|
|
104
|
+
build_ffmpeg() {
|
|
105
|
+
local variant=$1
|
|
106
|
+
shift
|
|
107
|
+
local stage="$BUILD_DIR/stage-$variant"
|
|
108
|
+
if [ -f "$stage/lib/libavcodec.a" ]; then return; fi
|
|
109
|
+
echo "🔨 Building FFmpeg $FFMPEG_VERSION for WebAssembly ($variant)..."
|
|
110
|
+
local build="$BUILD_DIR/ffmpeg-$variant"
|
|
111
|
+
rm -rf "$build"
|
|
112
|
+
mkdir -p "$build"
|
|
113
|
+
cd "$build"
|
|
114
|
+
# Without threads unless a variant enables them (later flags win), so pages need no
|
|
115
|
+
# cross-origin isolation
|
|
116
|
+
emconfigure "$BUILD_DIR/ffmpeg-$FFMPEG_VERSION/configure" \
|
|
117
|
+
--prefix="$stage" \
|
|
118
|
+
--target-os=none \
|
|
119
|
+
--arch=x86_32 \
|
|
120
|
+
--enable-cross-compile \
|
|
121
|
+
--cc=emcc \
|
|
122
|
+
--cxx=em++ \
|
|
123
|
+
--ar=emar \
|
|
124
|
+
--ranlib=emranlib \
|
|
125
|
+
--nm="$(command -v llvm-nm || echo emnm)" \
|
|
126
|
+
--pkg-config=pkg-config \
|
|
127
|
+
--extra-cflags="-Oz -flto" \
|
|
128
|
+
--extra-ldflags="-flto" \
|
|
129
|
+
--disable-asm \
|
|
130
|
+
--disable-inline-asm \
|
|
131
|
+
--disable-x86asm \
|
|
132
|
+
--disable-stripping \
|
|
133
|
+
--disable-programs \
|
|
134
|
+
--disable-doc \
|
|
135
|
+
--disable-debug \
|
|
136
|
+
--disable-network \
|
|
137
|
+
--disable-gpl \
|
|
138
|
+
--disable-everything \
|
|
139
|
+
--disable-autodetect \
|
|
140
|
+
--disable-iconv \
|
|
141
|
+
--disable-pthreads \
|
|
142
|
+
--disable-w32threads \
|
|
143
|
+
--disable-os2threads \
|
|
144
|
+
--disable-avdevice \
|
|
145
|
+
--disable-avfilter \
|
|
146
|
+
--disable-swresample \
|
|
147
|
+
--disable-swscale \
|
|
148
|
+
--enable-demuxer=matroska,webm \
|
|
149
|
+
--enable-static \
|
|
150
|
+
--disable-shared \
|
|
151
|
+
"$@"
|
|
152
|
+
emmake make -j"$JOBS"
|
|
153
|
+
emmake make install
|
|
154
|
+
cd "$PROJECT_DIR"
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
# link_module <output> <sources, libraries and flags...>
|
|
158
|
+
link_module() {
|
|
159
|
+
local output=$1
|
|
160
|
+
shift
|
|
161
|
+
echo "🔨 Linking $output..."
|
|
162
|
+
mkdir -p "$OUT_DIR"
|
|
163
|
+
# web,worker only: the node environment adds import("node:module"), which webpack can't
|
|
164
|
+
# resolve for the browser. Base64, not the raw-byte string, so bundlers pass it through intact.
|
|
165
|
+
em++ -std=c++17 -Oz -flto \
|
|
166
|
+
"$@" \
|
|
167
|
+
-sMODULARIZE=1 -sEXPORT_ES6=1 -sEXPORT_NAME=createModule \
|
|
168
|
+
-sSINGLE_FILE=1 -sSINGLE_FILE_BINARY_ENCODE=0 -sENVIRONMENT=web,worker \
|
|
169
|
+
-sDYNAMIC_EXECUTION=0 \
|
|
170
|
+
-sALLOW_MEMORY_GROWTH=1 -sFILESYSTEM=0 \
|
|
171
|
+
-sEXPORTED_FUNCTIONS=_malloc,_free \
|
|
172
|
+
-sEXPORTED_RUNTIME_METHODS=HEAPU8,HEAP32,HEAPF32,HEAPF64,wasmMemory \
|
|
173
|
+
-o "$OUT_DIR/$output"
|
|
174
|
+
echo "✅ $(du -h "$OUT_DIR/$output" | cut -f1) $OUT_DIR/$output"
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
download "ffmpeg-$FFMPEG_VERSION" "https://ffmpeg.org/releases/ffmpeg-$FFMPEG_VERSION.tar.xz" "ffmpeg-$FFMPEG_VERSION"
|
|
178
|
+
download "dav1d-$DAV1D_VERSION" "https://github.com/videolan/dav1d/archive/refs/tags/$DAV1D_VERSION.tar.gz" "dav1d-$DAV1D_VERSION"
|
|
179
|
+
# An in-tree configure (the Android build's copy) blocks out-of-tree builds
|
|
180
|
+
if [ -f "$BUILD_DIR/ffmpeg-$FFMPEG_VERSION/config.h" ] || [ -f "$BUILD_DIR/ffmpeg-$FFMPEG_VERSION/ffbuild/config.mak" ]; then
|
|
181
|
+
(cd "$BUILD_DIR/ffmpeg-$FFMPEG_VERSION" && make distclean >/dev/null 2>&1 || true)
|
|
182
|
+
rm -f "$BUILD_DIR/ffmpeg-$FFMPEG_VERSION/config.h"
|
|
183
|
+
fi
|
|
184
|
+
|
|
185
|
+
build_dav1d dav1d
|
|
186
|
+
build_dav1d dav1d-mt -pthread
|
|
187
|
+
build_ffmpeg software-vpx --disable-avformat --enable-decoder=vp8,vp9
|
|
188
|
+
build_ffmpeg software-vpx-mt --disable-avformat --enable-decoder=vp8,vp9 \
|
|
189
|
+
--enable-pthreads --extra-cflags=-pthread --extra-ldflags=-pthread
|
|
190
|
+
|
|
191
|
+
WEBM_PARSER="$PROJECT_DIR/third_party/libwebm/webm_parser"
|
|
192
|
+
link_module demuxer.mjs \
|
|
193
|
+
-I"$PROJECT_DIR/cpp" -I"$WEBM_PARSER" -I"$WEBM_PARSER/include" \
|
|
194
|
+
"$PROJECT_DIR/web/wasm/demuxer_bindings.cpp" "$PROJECT_DIR/cpp/AlphaDemuxer.cpp" \
|
|
195
|
+
"$PROJECT_DIR/cpp/Av1SequenceHeader.cpp" "$PROJECT_DIR/cpp/YuvToRgb.cpp" "$WEBM_PARSER"/src/*.cc \
|
|
196
|
+
-sMALLOC=emmalloc -sINITIAL_MEMORY=16777216
|
|
197
|
+
|
|
198
|
+
# vpx_module <output> <FFmpeg variant> <flags...>
|
|
199
|
+
vpx_module() {
|
|
200
|
+
local output=$1 stage="$BUILD_DIR/stage-$2"
|
|
201
|
+
shift 2
|
|
202
|
+
link_module "$output" \
|
|
203
|
+
-I"$stage/include" "$PROJECT_DIR/web/wasm/decoder_bindings.cpp" \
|
|
204
|
+
"$stage/lib/libavcodec.a" "$stage/lib/libavutil.a" \
|
|
205
|
+
-sINITIAL_MEMORY=33554432 "$@"
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
# av1_module <output> <dav1d variant> <flags...>
|
|
209
|
+
av1_module() {
|
|
210
|
+
local output=$1 stage="$BUILD_DIR/stage-$2"
|
|
211
|
+
shift 2
|
|
212
|
+
link_module "$output" \
|
|
213
|
+
-I"$PROJECT_DIR/cpp" -I"$PROJECT_DIR/codecs/av1" -I"$stage/include" \
|
|
214
|
+
"$PROJECT_DIR/web/wasm/plugin_bindings.cpp" "$PROJECT_DIR/codecs/av1/Dav1dDecoderPlugin.cpp" \
|
|
215
|
+
"$stage/lib/libdav1d.a" \
|
|
216
|
+
-sINITIAL_MEMORY=33554432 "$@"
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
# The pool is created when the module starts, sized by its pthreadPoolSize option: a thread
|
|
220
|
+
# started later would wait for a Worker to load while its creator blocks. Running out is an
|
|
221
|
+
# error rather than a hang. Its Workers load mainScriptUrlOrBlob, the decode Worker's own blob:
|
|
222
|
+
# URL, as there is no module file next to the code.
|
|
223
|
+
# Shared memory can't move, so browsers reserve its maximum up front; WebKit runs out of address
|
|
224
|
+
# space after a few at the default 2 GB.
|
|
225
|
+
THREADED=(-pthread -sPTHREAD_POOL_SIZE=Module.pthreadPoolSize -sPTHREAD_POOL_SIZE_STRICT=2
|
|
226
|
+
-sINCOMING_MODULE_JS_API=mainScriptUrlOrBlob -sMAXIMUM_MEMORY=1073741824)
|
|
227
|
+
vpx_module software-vpx.mjs software-vpx -sMALLOC=emmalloc
|
|
228
|
+
vpx_module software-vpx-mt.mjs software-vpx-mt "${THREADED[@]}"
|
|
229
|
+
av1_module software-av1.mjs dav1d -sMALLOC=emmalloc
|
|
230
|
+
av1_module software-av1-mt.mjs dav1d-mt "${THREADED[@]}"
|