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.
Files changed (283) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +903 -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 +85 -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 +1966 -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 +92 -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 +92 -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 +150 -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 +110 -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 +60 -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,157 @@
1
+ #include "VideoDecoder.h"
2
+
3
+ #include <algorithm>
4
+ #include <mutex>
5
+ #include <vector>
6
+
7
+ namespace webm {
8
+
9
+ namespace {
10
+
11
+ // Constructed on first use, so that modules can register from static initializers
12
+ std::vector<const AlphaVideoDecoderPlugin*>& registry() {
13
+ static std::vector<const AlphaVideoDecoderPlugin*> plugins;
14
+ return plugins;
15
+ }
16
+
17
+ std::mutex registryMutex;
18
+
19
+ const char* codecName(int codec) {
20
+ return codec == ALPHA_VIDEO_CODEC_AV1 ? "AV1" : codec == ALPHA_VIDEO_CODEC_VP8 ? "VP8" : "VP9";
21
+ }
22
+
23
+ const char* codecModuleName(int codec) {
24
+ return codec == ALPHA_VIDEO_CODEC_AV1 ? "av1" : "vpx";
25
+ }
26
+
27
+ AlphaVideoStreamInfo pluginStreamInfo(const AlphaDemuxer::StreamInfo& stream, int width, int height) {
28
+ AlphaVideoStreamInfo info = {};
29
+ info.codec = stream.codec;
30
+ info.profile = stream.profile;
31
+ info.bitDepth = stream.bitDepth;
32
+ info.width = width;
33
+ info.height = height;
34
+ info.codecPrivate = stream.codecPrivate.empty() ? nullptr : stream.codecPrivate.data();
35
+ info.codecPrivateSize = stream.codecPrivate.size();
36
+ return info;
37
+ }
38
+
39
+ const AlphaVideoDecoderPlugin* findPlugin(const AlphaVideoStreamInfo& stream, std::string* whyNot) {
40
+ std::lock_guard<std::mutex> lock(registryMutex);
41
+ const AlphaVideoDecoderPlugin* refusing = nullptr;
42
+ for (const AlphaVideoDecoderPlugin* plugin : registry()) {
43
+ if (plugin->codec != stream.codec) continue;
44
+ if (plugin->supports(&stream)) return plugin;
45
+ if (!refusing) refusing = plugin;
46
+ }
47
+ if (refusing) {
48
+ *whyNot = std::string(refusing->name) + " doesn't decode " + codecName(stream.codec) + " profile " +
49
+ std::to_string(stream.profile) + ", " + std::to_string(stream.bitDepth) + "-bit";
50
+ } else {
51
+ *whyNot = std::string("no ") + codecName(stream.codec) + " decoder is installed (the " +
52
+ codecModuleName(stream.codec) + " codec module)";
53
+ }
54
+ return nullptr;
55
+ }
56
+
57
+ } // namespace
58
+
59
+ bool registerDecoderPlugin(const AlphaVideoDecoderPlugin* plugin, std::string* error) {
60
+ if (plugin->abi != ALPHA_VIDEO_DECODER_ABI || plugin->structSize < sizeof(AlphaVideoDecoderPlugin)) {
61
+ *error = "A codec module from another alpha-video release (decoder ABI " + std::to_string(plugin->abi) +
62
+ ", plugin size " + std::to_string(plugin->structSize) + "; this core's ABI " +
63
+ std::to_string(ALPHA_VIDEO_DECODER_ABI) + ", size " + std::to_string(sizeof(AlphaVideoDecoderPlugin)) +
64
+ "): use the codec modules of this release";
65
+ return false;
66
+ }
67
+ std::lock_guard<std::mutex> lock(registryMutex);
68
+ std::vector<const AlphaVideoDecoderPlugin*>& plugins = registry();
69
+ if (std::find(plugins.begin(), plugins.end(), plugin) == plugins.end()) plugins.push_back(plugin);
70
+ return true;
71
+ }
72
+
73
+ bool registerDecoderPlugins(AlphaVideoDecoderPluginList list, std::string* error) {
74
+ int count = 0;
75
+ const AlphaVideoDecoderPlugin* const* plugins = list(&count);
76
+ bool registered = true;
77
+ for (int i = 0; i < count; i++) {
78
+ if (!registerDecoderPlugin(plugins[i], error)) registered = false;
79
+ }
80
+ return registered;
81
+ }
82
+
83
+ const AlphaVideoDecoderPlugin* findDecoderPlugin(const AlphaDemuxer::StreamInfo& stream, int width, int height,
84
+ std::string* whyNot) {
85
+ return findPlugin(pluginStreamInfo(stream, width, height), whyNot);
86
+ }
87
+
88
+ std::vector<std::string> registeredDecoders() {
89
+ std::lock_guard<std::mutex> lock(registryMutex);
90
+ std::vector<std::string> versions;
91
+ for (const AlphaVideoDecoderPlugin* plugin : registry()) {
92
+ std::string version = std::string(plugin->name) + " " + plugin->version;
93
+ if (std::find(versions.begin(), versions.end(), version) == versions.end()) versions.push_back(version);
94
+ }
95
+ return versions;
96
+ }
97
+
98
+ std::string decoderLibraryVersions() {
99
+ std::string joined;
100
+ for (const std::string& version : registeredDecoders()) joined += (joined.empty() ? "" : ", ") + version;
101
+ return joined;
102
+ }
103
+
104
+ std::unique_ptr<VideoDecoder> VideoDecoder::create(const AlphaDemuxer::StreamInfo& stream, int width, int height,
105
+ int threads, std::string* error) {
106
+ const AlphaVideoStreamInfo info = pluginStreamInfo(stream, width, height);
107
+ const AlphaVideoDecoderPlugin* plugin = findPlugin(info, error);
108
+ if (!plugin) return nullptr;
109
+ char message[256] = "";
110
+ void* decoder = plugin->open(&info, threads, message, sizeof(message));
111
+ if (!decoder) {
112
+ *error = message[0] ? message : std::string(plugin->name) + ": failed to open";
113
+ return nullptr;
114
+ }
115
+ return std::unique_ptr<VideoDecoder>(new VideoDecoder(plugin, decoder));
116
+ }
117
+
118
+ VideoDecoder::~VideoDecoder() {
119
+ plugin_->close(decoder_);
120
+ }
121
+
122
+ bool VideoDecoder::send(const uint8_t* data, int size, int64_t ptsUs) {
123
+ return plugin_->send(decoder_, data, size, ptsUs) != 0;
124
+ }
125
+
126
+ bool VideoDecoder::receive(Picture* out) {
127
+ AlphaVideoPicture picture = {};
128
+ if (!plugin_->receive(decoder_, &picture)) return false;
129
+ for (int i = 0; i < 3; i++) {
130
+ out->planes[i] = picture.planes[i];
131
+ out->strides[i] = picture.strides[i];
132
+ }
133
+ out->width = picture.width;
134
+ out->height = picture.height;
135
+ out->chromaShiftX = picture.chromaShiftX;
136
+ out->chromaShiftY = picture.chromaShiftY;
137
+ out->bitDepth = picture.bitDepth;
138
+ out->colorRange = picture.colorRange;
139
+ out->rgb = picture.rgb != 0;
140
+ out->monochrome = picture.monochrome != 0;
141
+ out->ptsUs = picture.ptsUs;
142
+ return true;
143
+ }
144
+
145
+ void VideoDecoder::drain() {
146
+ plugin_->drain(decoder_);
147
+ }
148
+
149
+ void VideoDecoder::flush() {
150
+ plugin_->flush(decoder_);
151
+ }
152
+
153
+ const char* VideoDecoder::name() const {
154
+ return plugin_->name;
155
+ }
156
+
157
+ } // namespace webm
@@ -0,0 +1,83 @@
1
+ #pragma once
2
+
3
+ #include "AlphaDemuxer.h"
4
+ #include "AlphaVideoDecoderPlugin.h"
5
+
6
+ #include <cstdint>
7
+ #include <memory>
8
+ #include <string>
9
+ #include <vector>
10
+
11
+ namespace webm {
12
+
13
+ /** A decoded frame, in the decoder's own buffers: valid until the decoder's next call. */
14
+ struct Picture {
15
+ const uint8_t* planes[3] = {}; // Y, U, V; G, B, R when rgb. U and V are null when monochrome.
16
+ int strides[3] = {};
17
+ int width = 0;
18
+ int height = 0;
19
+ int chromaShiftX = 1; // 4:2:0 is 1, 1; 4:2:2 is 1, 0; 4:4:4 is 0, 0
20
+ int chromaShiftY = 1;
21
+ int bitDepth = 8; // Deeper samples are 16 bits each
22
+ int colorRange = 1; // ColorRange (YuvToRgb.h)
23
+ bool rgb = false;
24
+ bool monochrome = false;
25
+ int64_t ptsUs = 0;
26
+ };
27
+
28
+ /**
29
+ * Registers a codec module's decoders with every player in the process. False, with `error` set,
30
+ * for a plugin built for another ABI; the others in the list are still registered. Registering a
31
+ * plugin again does nothing.
32
+ */
33
+ bool registerDecoderPlugins(AlphaVideoDecoderPluginList list, std::string* error);
34
+ bool registerDecoderPlugin(const AlphaVideoDecoderPlugin* plugin, std::string* error);
35
+
36
+ /**
37
+ * The first registered plugin that decodes `stream`, or null with `whyNot` set: "no VP9 decoder
38
+ * is installed (the vpx codec module)", or "libvpx doesn't decode VP9 profile 2, 10-bit".
39
+ */
40
+ const AlphaVideoDecoderPlugin* findDecoderPlugin(const AlphaDemuxer::StreamInfo& stream, int width, int height,
41
+ std::string* whyNot);
42
+
43
+ /** The registered decoders, each "<name> <version>" once: {"libvpx v1.14.0", "dav1d 1.5.1"}. */
44
+ std::vector<std::string> registeredDecoders();
45
+
46
+ /** registeredDecoders(), comma-separated: "libvpx v1.14.0, dav1d 1.5.1"; empty with none. */
47
+ std::string decoderLibraryVersions();
48
+
49
+ /**
50
+ * Decodes one VP9 or AV1 bitstream with a registered plugin. Not thread-safe.
51
+ *
52
+ * send() a packet, then receive() until it returns false. Frames come out in order, perhaps
53
+ * some packets late (dav1d's frame threads); drain() at the end of the stream lets receive()
54
+ * return the frames still held.
55
+ */
56
+ class VideoDecoder {
57
+ public:
58
+ /** Null with `error` set if no plugin decodes the stream, or the plugin's decoder can't open. */
59
+ static std::unique_ptr<VideoDecoder> create(const AlphaDemuxer::StreamInfo& stream, int width, int height,
60
+ int threads, std::string* error);
61
+
62
+ ~VideoDecoder();
63
+ VideoDecoder(const VideoDecoder&) = delete;
64
+ VideoDecoder& operator=(const VideoDecoder&) = delete;
65
+
66
+ /** False if the packet can't be decoded. */
67
+ bool send(const uint8_t* data, int size, int64_t ptsUs);
68
+ bool receive(Picture* out);
69
+ void drain();
70
+ /** Drops the frames held and in progress, for a seek. */
71
+ void flush();
72
+
73
+ /** The plugin's name: "libvpx" or "dav1d" */
74
+ const char* name() const;
75
+
76
+ private:
77
+ VideoDecoder(const AlphaVideoDecoderPlugin* plugin, void* decoder) : plugin_(plugin), decoder_(decoder) {}
78
+
79
+ const AlphaVideoDecoderPlugin* plugin_;
80
+ void* decoder_;
81
+ };
82
+
83
+ } // namespace webm