react-native-alpha-video 0.0.0-stage → 1.0.1

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.
Files changed (283) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +908 -2
  3. package/THIRD_PARTY_NOTICES.md +30 -0
  4. package/android/av1/build.gradle +67 -0
  5. package/android/av1/consumer-rules.pro +4 -0
  6. package/android/av1/src/main/cpp/Av1Codec_jni.cpp +8 -0
  7. package/android/av1/src/main/cpp/CMakeLists.txt +34 -0
  8. package/android/av1/src/main/java/dev/mediacache/alphavideo/av1/Av1Codec.java +21 -0
  9. package/android/build.gradle +90 -0
  10. package/android/consumer-rules.pro +2 -0
  11. package/android/gradle.properties +1 -0
  12. package/android/publish.gradle +82 -0
  13. package/android/settings.gradle +5 -0
  14. package/android/src/main/AndroidManifest.xml +1 -0
  15. package/android/src/main/cpp/CMakeLists.txt +59 -0
  16. package/android/src/main/java/dev/mediacache/alphavideo/AlphaVideoCodecs.java +73 -0
  17. package/android/src/main/java/dev/mediacache/alphavideo/AlphaVideoView.java +1982 -0
  18. package/android/src/main/java/dev/mediacache/alphavideo/BufferedDualStreamPlayer.java +978 -0
  19. package/android/src/main/java/dev/mediacache/alphavideo/Fetcher.java +37 -0
  20. package/android/src/main/java/dev/mediacache/alphavideo/HttpFetcher.java +156 -0
  21. package/android/src/main/java/dev/mediacache/alphavideo/MediaCodecColor.java +47 -0
  22. package/android/src/main/java/dev/mediacache/alphavideo/MediaCodecDecoders.java +135 -0
  23. package/android/src/main/java/dev/mediacache/alphavideo/RangeSourceLink.java +54 -0
  24. package/android/src/main/java/dev/mediacache/alphavideo/SourceReader.java +174 -0
  25. package/android/src/main/java/dev/mediacache/alphavideo/SurfaceTextureVideoDecoder.java +802 -0
  26. package/android/src/main/java/dev/mediacache/alphavideo/WebMAlphaPlayerNative.java +95 -0
  27. package/android/src/main/java/dev/mediacache/alphavideo/WebMFrame.java +54 -0
  28. package/android/src/main/java/dev/mediacache/alphavideo/WebMSource.java +160 -0
  29. package/android/src/rangesource/java/dev/mediacache/alphavideo/AppDataSource.java +50 -0
  30. package/android/vpx/build.gradle +67 -0
  31. package/android/vpx/consumer-rules.pro +4 -0
  32. package/android/vpx/src/main/cpp/CMakeLists.txt +34 -0
  33. package/android/vpx/src/main/cpp/VpxCodec_jni.cpp +8 -0
  34. package/android/vpx/src/main/java/dev/mediacache/alphavideo/vpx/VpxCodec.java +21 -0
  35. package/codecs/av1/Dav1dDecoderPlugin.cpp +157 -0
  36. package/codecs/av1/Dav1dDecoderPlugin.h +17 -0
  37. package/codecs/vpx/VpxDecoderPlugin.cpp +103 -0
  38. package/codecs/vpx/VpxDecoderPlugin.h +17 -0
  39. package/cpp/AlphaDemuxer.cpp +984 -0
  40. package/cpp/AlphaDemuxer.h +123 -0
  41. package/cpp/AlphaVideoDecoderPlugin.h +84 -0
  42. package/cpp/Av1SequenceHeader.cpp +175 -0
  43. package/cpp/Av1SequenceHeader.h +25 -0
  44. package/cpp/ByteSource.cpp +116 -0
  45. package/cpp/ByteSource.h +59 -0
  46. package/cpp/RangeSourceClient.h +40 -0
  47. package/cpp/VideoDecoder.cpp +157 -0
  48. package/cpp/VideoDecoder.h +83 -0
  49. package/cpp/WebMAlphaPlayer.cpp +1666 -0
  50. package/cpp/WebMAlphaPlayer.h +389 -0
  51. package/cpp/WebMAlphaPlayer_jni.cpp +1380 -0
  52. package/cpp/YuvToRgb.cpp +39 -0
  53. package/cpp/YuvToRgb.h +40 -0
  54. package/ios/Sources/AlphaVideo/AlphaVideoCodecs.mm +63 -0
  55. package/ios/Sources/AlphaVideo/AlphaVideoInternal.h +70 -0
  56. package/ios/Sources/AlphaVideo/AlphaVideoPlayer.mm +994 -0
  57. package/ios/Sources/AlphaVideo/AlphaVideoSource.mm +476 -0
  58. package/ios/Sources/AlphaVideo/AlphaVideoView.mm +374 -0
  59. package/ios/Sources/AlphaVideo/include/AlphaVideo.h +303 -0
  60. package/ios/Sources/AlphaVideoAV1/AlphaVideoAV1Codec.mm +16 -0
  61. package/ios/Sources/AlphaVideoAV1/include/AlphaVideoAV1.h +18 -0
  62. package/ios/Sources/AlphaVideoVPX/AlphaVideoVPXCodec.mm +16 -0
  63. package/ios/Sources/AlphaVideoVPX/include/AlphaVideoVPX.h +17 -0
  64. package/lib/commonjs/AlphaVideoView.js +187 -0
  65. package/lib/commonjs/AlphaVideoView.js.map +1 -0
  66. package/lib/commonjs/AlphaVideoViewNativeComponent.js +47 -0
  67. package/lib/commonjs/AlphaVideoViewNativeComponent.js.map +1 -0
  68. package/lib/commonjs/AlphaVideoViewNativeComponent.web.js +11 -0
  69. package/lib/commonjs/AlphaVideoViewNativeComponent.web.js.map +1 -0
  70. package/lib/commonjs/NativeAlphaVideoModule.js +10 -0
  71. package/lib/commonjs/NativeAlphaVideoModule.js.map +1 -0
  72. package/lib/commonjs/NativeAlphaVideoModule.web.js +9 -0
  73. package/lib/commonjs/NativeAlphaVideoModule.web.js.map +1 -0
  74. package/lib/commonjs/WebPlayer.js +12 -0
  75. package/lib/commonjs/WebPlayer.js.map +1 -0
  76. package/lib/commonjs/WebPlayer.web.js +115 -0
  77. package/lib/commonjs/WebPlayer.web.js.map +1 -0
  78. package/lib/commonjs/index.js +124 -0
  79. package/lib/commonjs/index.js.map +1 -0
  80. package/lib/module/AlphaVideoView.js +187 -0
  81. package/lib/module/AlphaVideoView.js.map +1 -0
  82. package/lib/module/AlphaVideoViewNativeComponent.js +47 -0
  83. package/lib/module/AlphaVideoViewNativeComponent.js.map +1 -0
  84. package/lib/module/AlphaVideoViewNativeComponent.web.js +11 -0
  85. package/lib/module/AlphaVideoViewNativeComponent.web.js.map +1 -0
  86. package/lib/module/NativeAlphaVideoModule.js +10 -0
  87. package/lib/module/NativeAlphaVideoModule.js.map +1 -0
  88. package/lib/module/NativeAlphaVideoModule.web.js +9 -0
  89. package/lib/module/NativeAlphaVideoModule.web.js.map +1 -0
  90. package/lib/module/WebPlayer.js +12 -0
  91. package/lib/module/WebPlayer.js.map +1 -0
  92. package/lib/module/WebPlayer.web.js +115 -0
  93. package/lib/module/WebPlayer.web.js.map +1 -0
  94. package/lib/module/index.js +124 -0
  95. package/lib/module/index.js.map +1 -0
  96. package/lib/typescript/react-native/src/AlphaVideoView.d.ts +189 -0
  97. package/lib/typescript/react-native/src/AlphaVideoView.d.ts.map +1 -0
  98. package/lib/typescript/react-native/src/AlphaVideoViewNativeComponent.d.ts +109 -0
  99. package/lib/typescript/react-native/src/AlphaVideoViewNativeComponent.d.ts.map +1 -0
  100. package/lib/typescript/react-native/src/AlphaVideoViewNativeComponent.web.d.ts +5 -0
  101. package/lib/typescript/react-native/src/AlphaVideoViewNativeComponent.web.d.ts.map +1 -0
  102. package/lib/typescript/react-native/src/NativeAlphaVideoModule.d.ts +21 -0
  103. package/lib/typescript/react-native/src/NativeAlphaVideoModule.d.ts.map +1 -0
  104. package/lib/typescript/react-native/src/NativeAlphaVideoModule.web.d.ts +3 -0
  105. package/lib/typescript/react-native/src/NativeAlphaVideoModule.web.d.ts.map +1 -0
  106. package/lib/typescript/react-native/src/WebPlayer.d.ts +3 -0
  107. package/lib/typescript/react-native/src/WebPlayer.d.ts.map +1 -0
  108. package/lib/typescript/react-native/src/WebPlayer.web.d.ts +9 -0
  109. package/lib/typescript/react-native/src/WebPlayer.web.d.ts.map +1 -0
  110. package/lib/typescript/react-native/src/index.d.ts +77 -0
  111. package/lib/typescript/react-native/src/index.d.ts.map +1 -0
  112. package/licenses/dav1d-COPYING.txt +23 -0
  113. package/licenses/libvpx-LICENSE.txt +31 -0
  114. package/licenses/libvpx-PATENTS.txt +23 -0
  115. package/licenses/libwebm-LICENSE.txt +30 -0
  116. package/licenses/libwebm-PATENTS.txt +23 -0
  117. package/package.json +152 -4
  118. package/prebuilt/android/arm64-v8a/lib/libdav1d.a +0 -0
  119. package/prebuilt/android/arm64-v8a/lib/libvpx.a +0 -0
  120. package/prebuilt/android/armeabi-v7a/lib/libdav1d.a +0 -0
  121. package/prebuilt/android/armeabi-v7a/lib/libvpx.a +0 -0
  122. package/prebuilt/android/x86_64/lib/libdav1d.a +0 -0
  123. package/prebuilt/android/x86_64/lib/libvpx.a +0 -0
  124. package/prebuilt/include/dav1d/common.h +94 -0
  125. package/prebuilt/include/dav1d/data.h +117 -0
  126. package/prebuilt/include/dav1d/dav1d.h +329 -0
  127. package/prebuilt/include/dav1d/headers.h +440 -0
  128. package/prebuilt/include/dav1d/picture.h +157 -0
  129. package/prebuilt/include/dav1d/version.h +50 -0
  130. package/prebuilt/include/vpx/vp8.h +136 -0
  131. package/prebuilt/include/vpx/vp8dx.h +228 -0
  132. package/prebuilt/include/vpx/vpx_codec.h +475 -0
  133. package/prebuilt/include/vpx/vpx_decoder.h +365 -0
  134. package/prebuilt/include/vpx/vpx_frame_buffer.h +83 -0
  135. package/prebuilt/include/vpx/vpx_image.h +209 -0
  136. package/prebuilt/include/vpx/vpx_integer.h +40 -0
  137. package/prebuilt/ios/lib/libdav1d.a +0 -0
  138. package/prebuilt/ios/lib/libvpx.a +0 -0
  139. package/prebuilt/ios-simulator/include/dav1d/common.h +94 -0
  140. package/prebuilt/ios-simulator/include/dav1d/data.h +117 -0
  141. package/prebuilt/ios-simulator/include/dav1d/dav1d.h +329 -0
  142. package/prebuilt/ios-simulator/include/dav1d/headers.h +440 -0
  143. package/prebuilt/ios-simulator/include/dav1d/picture.h +157 -0
  144. package/prebuilt/ios-simulator/include/dav1d/version.h +50 -0
  145. package/prebuilt/ios-simulator/include/vpx/vp8.h +136 -0
  146. package/prebuilt/ios-simulator/include/vpx/vp8dx.h +228 -0
  147. package/prebuilt/ios-simulator/include/vpx/vpx_codec.h +475 -0
  148. package/prebuilt/ios-simulator/include/vpx/vpx_decoder.h +365 -0
  149. package/prebuilt/ios-simulator/include/vpx/vpx_frame_buffer.h +83 -0
  150. package/prebuilt/ios-simulator/include/vpx/vpx_image.h +209 -0
  151. package/prebuilt/ios-simulator/include/vpx/vpx_integer.h +40 -0
  152. package/prebuilt/ios-simulator/lib/libdav1d.a +0 -0
  153. package/prebuilt/ios-simulator/lib/libvpx.a +0 -0
  154. package/react-native/android/CMakeLists.txt +14 -0
  155. package/react-native/android/build.gradle +113 -0
  156. package/react-native/android/src/main/AndroidManifest.xml +1 -0
  157. package/react-native/android/src/main/java/dev/mediacache/alphavideo/reactnative/AlphaVideoModule.java +102 -0
  158. package/react-native/android/src/main/java/dev/mediacache/alphavideo/reactnative/AlphaVideoPackage.java +50 -0
  159. package/react-native/android/src/main/java/dev/mediacache/alphavideo/reactnative/AlphaVideoViewManager.java +317 -0
  160. package/react-native/android/src/newarch/java/dev/mediacache/alphavideo/reactnative/AlphaVideoModuleSpec.java +10 -0
  161. package/react-native/android/src/newarch/java/dev/mediacache/alphavideo/reactnative/AlphaVideoViewManagerSpec.java +23 -0
  162. package/react-native/android/src/norangesource/java/dev/mediacache/alphavideo/AppDataSource.java +15 -0
  163. package/react-native/android/src/oldarch/java/dev/mediacache/alphavideo/reactnative/AlphaVideoModuleSpec.java +30 -0
  164. package/react-native/android/src/oldarch/java/dev/mediacache/alphavideo/reactnative/AlphaVideoViewManagerSpec.java +61 -0
  165. package/react-native/ios/RNAlphaVideoViewComponentView.mm +173 -0
  166. package/react-native/ios/RNAlphaVideoViewManager.mm +147 -0
  167. package/react-native/src/AlphaVideoView.tsx +329 -0
  168. package/react-native/src/AlphaVideoViewNativeComponent.ts +132 -0
  169. package/react-native/src/AlphaVideoViewNativeComponent.web.ts +5 -0
  170. package/react-native/src/NativeAlphaVideoModule.ts +22 -0
  171. package/react-native/src/NativeAlphaVideoModule.web.ts +2 -0
  172. package/react-native/src/WebPlayer.tsx +7 -0
  173. package/react-native/src/WebPlayer.web.tsx +87 -0
  174. package/react-native/src/index.tsx +144 -0
  175. package/react-native-alpha-video.podspec +99 -0
  176. package/react-native.config.js +12 -0
  177. package/scripts/build_codecs_android.sh +246 -0
  178. package/scripts/build_codecs_ios.sh +31 -0
  179. package/scripts/build_codecs_ios_device.sh +210 -0
  180. package/scripts/build_codecs_ios_simulator.sh +256 -0
  181. package/scripts/build_wasm.sh +230 -0
  182. package/scripts/build_xcframework.sh +49 -0
  183. package/scripts/fetch-prebuilt.sh +48 -0
  184. package/scripts/package_release.sh +107 -0
  185. package/scripts/publish-android.sh +85 -0
  186. package/scripts/vendor_range_source.sh +47 -0
  187. package/third_party/libwebm/AUTHORS.TXT +5 -0
  188. package/third_party/libwebm/LICENSE.TXT +30 -0
  189. package/third_party/libwebm/PATENTS.TXT +23 -0
  190. package/third_party/libwebm/README.md +7 -0
  191. package/third_party/libwebm/webm_parser/include/webm/buffer_reader.h +138 -0
  192. package/third_party/libwebm/webm_parser/include/webm/callback.h +363 -0
  193. package/third_party/libwebm/webm_parser/include/webm/dom_types.h +1781 -0
  194. package/third_party/libwebm/webm_parser/include/webm/element.h +208 -0
  195. package/third_party/libwebm/webm_parser/include/webm/file_reader.h +103 -0
  196. package/third_party/libwebm/webm_parser/include/webm/id.h +1085 -0
  197. package/third_party/libwebm/webm_parser/include/webm/istream_reader.h +99 -0
  198. package/third_party/libwebm/webm_parser/include/webm/reader.h +94 -0
  199. package/third_party/libwebm/webm_parser/include/webm/status.h +166 -0
  200. package/third_party/libwebm/webm_parser/include/webm/webm_parser.h +133 -0
  201. package/third_party/libwebm/webm_parser/src/ancestory.cc +334 -0
  202. package/third_party/libwebm/webm_parser/src/ancestory.h +83 -0
  203. package/third_party/libwebm/webm_parser/src/audio_parser.h +84 -0
  204. package/third_party/libwebm/webm_parser/src/bit_utils.cc +26 -0
  205. package/third_party/libwebm/webm_parser/src/bit_utils.h +24 -0
  206. package/third_party/libwebm/webm_parser/src/block_additions_parser.h +30 -0
  207. package/third_party/libwebm/webm_parser/src/block_group_parser.h +71 -0
  208. package/third_party/libwebm/webm_parser/src/block_header_parser.cc +76 -0
  209. package/third_party/libwebm/webm_parser/src/block_header_parser.h +65 -0
  210. package/third_party/libwebm/webm_parser/src/block_more_parser.h +32 -0
  211. package/third_party/libwebm/webm_parser/src/block_parser.cc +285 -0
  212. package/third_party/libwebm/webm_parser/src/block_parser.h +126 -0
  213. package/third_party/libwebm/webm_parser/src/bool_parser.h +95 -0
  214. package/third_party/libwebm/webm_parser/src/buffer_reader.cc +110 -0
  215. package/third_party/libwebm/webm_parser/src/byte_parser.h +144 -0
  216. package/third_party/libwebm/webm_parser/src/callback.cc +155 -0
  217. package/third_party/libwebm/webm_parser/src/chapter_atom_parser.h +42 -0
  218. package/third_party/libwebm/webm_parser/src/chapter_display_parser.h +34 -0
  219. package/third_party/libwebm/webm_parser/src/chapters_parser.h +28 -0
  220. package/third_party/libwebm/webm_parser/src/cluster_parser.h +48 -0
  221. package/third_party/libwebm/webm_parser/src/colour_parser.h +55 -0
  222. package/third_party/libwebm/webm_parser/src/content_enc_aes_settings_parser.h +32 -0
  223. package/third_party/libwebm/webm_parser/src/content_encoding_parser.h +38 -0
  224. package/third_party/libwebm/webm_parser/src/content_encodings_parser.h +30 -0
  225. package/third_party/libwebm/webm_parser/src/content_encryption_parser.h +37 -0
  226. package/third_party/libwebm/webm_parser/src/cue_point_parser.h +38 -0
  227. package/third_party/libwebm/webm_parser/src/cue_track_positions_parser.h +39 -0
  228. package/third_party/libwebm/webm_parser/src/cues_parser.h +27 -0
  229. package/third_party/libwebm/webm_parser/src/date_parser.cc +72 -0
  230. package/third_party/libwebm/webm_parser/src/date_parser.h +64 -0
  231. package/third_party/libwebm/webm_parser/src/ebml_parser.h +48 -0
  232. package/third_party/libwebm/webm_parser/src/edition_entry_parser.h +35 -0
  233. package/third_party/libwebm/webm_parser/src/element_parser.h +102 -0
  234. package/third_party/libwebm/webm_parser/src/file_reader.cc +142 -0
  235. package/third_party/libwebm/webm_parser/src/float_parser.cc +77 -0
  236. package/third_party/libwebm/webm_parser/src/float_parser.h +65 -0
  237. package/third_party/libwebm/webm_parser/src/id_element_parser.cc +49 -0
  238. package/third_party/libwebm/webm_parser/src/id_element_parser.h +56 -0
  239. package/third_party/libwebm/webm_parser/src/id_parser.cc +75 -0
  240. package/third_party/libwebm/webm_parser/src/id_parser.h +45 -0
  241. package/third_party/libwebm/webm_parser/src/info_parser.h +44 -0
  242. package/third_party/libwebm/webm_parser/src/int_parser.h +121 -0
  243. package/third_party/libwebm/webm_parser/src/istream_reader.cc +133 -0
  244. package/third_party/libwebm/webm_parser/src/master_parser.cc +298 -0
  245. package/third_party/libwebm/webm_parser/src/master_parser.h +230 -0
  246. package/third_party/libwebm/webm_parser/src/master_value_parser.h +533 -0
  247. package/third_party/libwebm/webm_parser/src/mastering_metadata_parser.h +57 -0
  248. package/third_party/libwebm/webm_parser/src/parser.h +34 -0
  249. package/third_party/libwebm/webm_parser/src/parser_utils.cc +34 -0
  250. package/third_party/libwebm/webm_parser/src/parser_utils.h +64 -0
  251. package/third_party/libwebm/webm_parser/src/projection_parser.h +40 -0
  252. package/third_party/libwebm/webm_parser/src/recursive_parser.h +93 -0
  253. package/third_party/libwebm/webm_parser/src/seek_head_parser.h +27 -0
  254. package/third_party/libwebm/webm_parser/src/seek_parser.h +37 -0
  255. package/third_party/libwebm/webm_parser/src/segment_parser.cc +86 -0
  256. package/third_party/libwebm/webm_parser/src/segment_parser.h +53 -0
  257. package/third_party/libwebm/webm_parser/src/simple_tag_parser.h +37 -0
  258. package/third_party/libwebm/webm_parser/src/size_parser.cc +56 -0
  259. package/third_party/libwebm/webm_parser/src/size_parser.h +43 -0
  260. package/third_party/libwebm/webm_parser/src/skip_callback.h +63 -0
  261. package/third_party/libwebm/webm_parser/src/skip_parser.cc +59 -0
  262. package/third_party/libwebm/webm_parser/src/skip_parser.h +35 -0
  263. package/third_party/libwebm/webm_parser/src/slices_parser.h +30 -0
  264. package/third_party/libwebm/webm_parser/src/tag_parser.h +37 -0
  265. package/third_party/libwebm/webm_parser/src/tags_parser.h +27 -0
  266. package/third_party/libwebm/webm_parser/src/targets_parser.h +35 -0
  267. package/third_party/libwebm/webm_parser/src/time_slice_parser.h +30 -0
  268. package/third_party/libwebm/webm_parser/src/track_entry_parser.h +65 -0
  269. package/third_party/libwebm/webm_parser/src/tracks_parser.h +27 -0
  270. package/third_party/libwebm/webm_parser/src/unknown_parser.cc +49 -0
  271. package/third_party/libwebm/webm_parser/src/unknown_parser.h +38 -0
  272. package/third_party/libwebm/webm_parser/src/var_int_parser.cc +71 -0
  273. package/third_party/libwebm/webm_parser/src/var_int_parser.h +56 -0
  274. package/third_party/libwebm/webm_parser/src/video_parser.h +122 -0
  275. package/third_party/libwebm/webm_parser/src/virtual_block_parser.cc +72 -0
  276. package/third_party/libwebm/webm_parser/src/virtual_block_parser.h +69 -0
  277. package/third_party/libwebm/webm_parser/src/void_parser.cc +49 -0
  278. package/third_party/libwebm/webm_parser/src/void_parser.h +41 -0
  279. package/third_party/libwebm/webm_parser/src/webm_parser.cc +282 -0
  280. package/third_party/range-source/LICENSE +21 -0
  281. package/third_party/range-source/README.md +8 -0
  282. package/third_party/range-source/include/range_source.h +395 -0
  283. 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[@]}"