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,64 @@
1
+ // Copyright (c) 2016 The WebM project authors. All Rights Reserved.
2
+ //
3
+ // Use of this source code is governed by a BSD-style license
4
+ // that can be found in the LICENSE file in the root of the source
5
+ // tree. An additional intellectual property rights grant can be found
6
+ // in the file PATENTS. All contributing project authors may
7
+ // be found in the AUTHORS file in the root of the source tree.
8
+ #ifndef SRC_PARSER_UTILS_H_
9
+ #define SRC_PARSER_UTILS_H_
10
+
11
+ #include <cassert>
12
+ #include <cstdint>
13
+ #include <type_traits>
14
+
15
+ #include "webm/reader.h"
16
+ #include "webm/status.h"
17
+
18
+ namespace webm {
19
+
20
+ // Reads a single byte from the reader, and returns the status of the read. If
21
+ // the status is not Status::kOkCompleted, then no data was read.
22
+ Status ReadByte(Reader* reader, std::uint8_t* byte);
23
+
24
+ // Accumulates bytes from the reader into the integer. The integer will be
25
+ // extracted as a big-endian integer and stored with the native
26
+ // host-endianness. num_bytes_remaining is the number of bytes to
27
+ template <typename T>
28
+ Status AccumulateIntegerBytes(int num_to_read, Reader* reader, T* integer,
29
+ std::uint64_t* num_actually_read) {
30
+ static_assert(std::is_integral<T>::value || std::is_enum<T>::value,
31
+ "T must be an integer or enum type");
32
+ // Use unsigned integers for bitwise arithmetic because it's well-defined (as
33
+ // opposed to signed integers, where left shifting a negative integer is
34
+ // undefined, for example).
35
+ using UnsignedT = typename std::make_unsigned<T>::type;
36
+
37
+ assert(reader != nullptr);
38
+ assert(integer != nullptr);
39
+ assert(num_actually_read != nullptr);
40
+ assert(num_to_read >= 0);
41
+ assert(static_cast<std::size_t>(num_to_read) <= sizeof(T));
42
+
43
+ *num_actually_read = 0;
44
+
45
+ if (num_to_read < 0 || static_cast<std::size_t>(num_to_read) > sizeof(T)) {
46
+ return Status(Status::kInvalidElementSize);
47
+ }
48
+
49
+ for (; num_to_read > 0; --num_to_read) {
50
+ std::uint8_t byte;
51
+ const Status status = ReadByte(reader, &byte);
52
+ if (!status.completed_ok()) {
53
+ return status;
54
+ }
55
+ ++*num_actually_read;
56
+ *integer = static_cast<T>((static_cast<UnsignedT>(*integer) << 8) | byte);
57
+ }
58
+
59
+ return Status(Status::kOkCompleted);
60
+ }
61
+
62
+ } // namespace webm
63
+
64
+ #endif // SRC_PARSER_UTILS_H_
@@ -0,0 +1,40 @@
1
+ // Copyright (c) 2016 The WebM project authors. All Rights Reserved.
2
+ //
3
+ // Use of this source code is governed by a BSD-style license
4
+ // that can be found in the LICENSE file in the root of the source
5
+ // tree. An additional intellectual property rights grant can be found
6
+ // in the file PATENTS. All contributing project authors may
7
+ // be found in the AUTHORS file in the root of the source tree.
8
+ #ifndef SRC_PROJECTION_PARSER_H_
9
+ #define SRC_PROJECTION_PARSER_H_
10
+
11
+ #include "src/byte_parser.h"
12
+ #include "src/float_parser.h"
13
+ #include "src/int_parser.h"
14
+ #include "src/master_value_parser.h"
15
+ #include "webm/dom_types.h"
16
+ #include "webm/id.h"
17
+
18
+ namespace webm {
19
+
20
+ // Spec reference:
21
+ // https://github.com/google/spatial-media/blob/master/docs/spherical-video-v2-rfc.md#projection-master-element
22
+ class ProjectionParser : public MasterValueParser<Projection> {
23
+ public:
24
+ ProjectionParser()
25
+ : MasterValueParser(
26
+ MakeChild<IntParser<ProjectionType>>(Id::kProjectionType,
27
+ &Projection::type),
28
+ MakeChild<BinaryParser>(Id::kProjectionPrivate,
29
+ &Projection::projection_private),
30
+ MakeChild<FloatParser>(Id::kProjectionPoseYaw,
31
+ &Projection::pose_yaw),
32
+ MakeChild<FloatParser>(Id::kProjectionPosePitch,
33
+ &Projection::pose_pitch),
34
+ MakeChild<FloatParser>(Id::kProjectionPoseRoll,
35
+ &Projection::pose_roll)) {}
36
+ };
37
+
38
+ } // namespace webm
39
+
40
+ #endif // SRC_PROJECTION_PARSER_H_
@@ -0,0 +1,93 @@
1
+ // Copyright (c) 2016 The WebM project authors. All Rights Reserved.
2
+ //
3
+ // Use of this source code is governed by a BSD-style license
4
+ // that can be found in the LICENSE file in the root of the source
5
+ // tree. An additional intellectual property rights grant can be found
6
+ // in the file PATENTS. All contributing project authors may
7
+ // be found in the AUTHORS file in the root of the source tree.
8
+ #ifndef SRC_RECURSIVE_PARSER_H_
9
+ #define SRC_RECURSIVE_PARSER_H_
10
+
11
+ #include <cassert>
12
+ #include <cstdint>
13
+ #include <memory>
14
+ #include <utility>
15
+
16
+ #include "src/element_parser.h"
17
+ #include "webm/callback.h"
18
+ #include "webm/reader.h"
19
+ #include "webm/status.h"
20
+
21
+ namespace webm {
22
+
23
+ // Lazily instantiates a parser of type T, and uses that parser to handle all
24
+ // parsing operations. The parser is allocated when Init is called. This class
25
+ // is intended to be used with recursive elements, where a parser needs to
26
+ // recursively instantiate parsers of the same type.
27
+ template <typename T>
28
+ class RecursiveParser : public ElementParser {
29
+ public:
30
+ explicit RecursiveParser(std::size_t max_recursion_depth = 25)
31
+ : max_recursion_depth_(max_recursion_depth) {};
32
+
33
+ RecursiveParser(RecursiveParser&&) = default;
34
+ RecursiveParser& operator=(RecursiveParser&&) = default;
35
+
36
+ RecursiveParser(const RecursiveParser&) = delete;
37
+ RecursiveParser& operator=(const RecursiveParser&) = delete;
38
+
39
+ Status Init(const ElementMetadata& metadata,
40
+ std::uint64_t max_size) override {
41
+ assert(metadata.size == kUnknownElementSize || metadata.size <= max_size);
42
+
43
+ if (max_recursion_depth_ == 0) {
44
+ return Status(Status::kExceededRecursionDepthLimit);
45
+ }
46
+
47
+ if (!impl_) {
48
+ impl_.reset(new T(max_recursion_depth_ - 1));
49
+ }
50
+
51
+ return impl_->Init(metadata, max_size);
52
+ }
53
+
54
+ void InitAfterSeek(const Ancestory& child_ancestory,
55
+ const ElementMetadata& child_metadata) override {
56
+ assert(max_recursion_depth_ > 0);
57
+ if (!impl_) {
58
+ impl_.reset(new T(max_recursion_depth_ - 1));
59
+ }
60
+
61
+ impl_->InitAfterSeek(child_ancestory, child_metadata);
62
+ }
63
+
64
+ Status Feed(Callback* callback, Reader* reader,
65
+ std::uint64_t* num_bytes_read) override {
66
+ assert(callback != nullptr);
67
+ assert(reader != nullptr);
68
+ assert(num_bytes_read != nullptr);
69
+ assert(impl_ != nullptr);
70
+
71
+ return impl_->Feed(callback, reader, num_bytes_read);
72
+ }
73
+
74
+ decltype(std::declval<T>().value()) value() const {
75
+ assert(impl_ != nullptr);
76
+
77
+ return impl_->value();
78
+ }
79
+
80
+ decltype(std::declval<T>().mutable_value()) mutable_value() {
81
+ assert(impl_ != nullptr);
82
+
83
+ return impl_->mutable_value();
84
+ }
85
+
86
+ private:
87
+ std::unique_ptr<T> impl_;
88
+ std::size_t max_recursion_depth_;
89
+ };
90
+
91
+ } // namespace webm
92
+
93
+ #endif // SRC_RECURSIVE_PARSER_H_
@@ -0,0 +1,27 @@
1
+ // Copyright (c) 2016 The WebM project authors. All Rights Reserved.
2
+ //
3
+ // Use of this source code is governed by a BSD-style license
4
+ // that can be found in the LICENSE file in the root of the source
5
+ // tree. An additional intellectual property rights grant can be found
6
+ // in the file PATENTS. All contributing project authors may
7
+ // be found in the AUTHORS file in the root of the source tree.
8
+ #ifndef SRC_SEEK_HEAD_PARSER_H_
9
+ #define SRC_SEEK_HEAD_PARSER_H_
10
+
11
+ #include "src/master_parser.h"
12
+ #include "src/seek_parser.h"
13
+ #include "webm/id.h"
14
+
15
+ namespace webm {
16
+
17
+ // Spec reference:
18
+ // http://matroska.org/technical/specs/index.html#SeekHead
19
+ // http://www.webmproject.org/docs/container/#SeekHead
20
+ class SeekHeadParser : public MasterParser {
21
+ public:
22
+ SeekHeadParser() : MasterParser(MakeChild<SeekParser>(Id::kSeek)) {}
23
+ };
24
+
25
+ } // namespace webm
26
+
27
+ #endif // SRC_SEEK_HEAD_PARSER_H_
@@ -0,0 +1,37 @@
1
+ // Copyright (c) 2016 The WebM project authors. All Rights Reserved.
2
+ //
3
+ // Use of this source code is governed by a BSD-style license
4
+ // that can be found in the LICENSE file in the root of the source
5
+ // tree. An additional intellectual property rights grant can be found
6
+ // in the file PATENTS. All contributing project authors may
7
+ // be found in the AUTHORS file in the root of the source tree.
8
+ #ifndef SRC_SEEK_PARSER_H_
9
+ #define SRC_SEEK_PARSER_H_
10
+
11
+ #include "src/id_element_parser.h"
12
+ #include "src/int_parser.h"
13
+ #include "src/master_value_parser.h"
14
+ #include "webm/dom_types.h"
15
+ #include "webm/id.h"
16
+
17
+ namespace webm {
18
+
19
+ // Spec reference:
20
+ // http://matroska.org/technical/specs/index.html#Seek
21
+ // http://www.webmproject.org/docs/container/#Seek
22
+ class SeekParser : public MasterValueParser<Seek> {
23
+ public:
24
+ SeekParser()
25
+ : MasterValueParser<Seek>(
26
+ MakeChild<IdElementParser>(Id::kSeekId, &Seek::id),
27
+ MakeChild<UnsignedIntParser>(Id::kSeekPosition, &Seek::position)) {}
28
+
29
+ protected:
30
+ Status OnParseCompleted(Callback* callback) override {
31
+ return callback->OnSeek(metadata(Id::kSeek), value());
32
+ }
33
+ };
34
+
35
+ } // namespace webm
36
+
37
+ #endif // SRC_SEEK_PARSER_H_
@@ -0,0 +1,86 @@
1
+ // Copyright (c) 2016 The WebM project authors. All Rights Reserved.
2
+ //
3
+ // Use of this source code is governed by a BSD-style license
4
+ // that can be found in the LICENSE file in the root of the source
5
+ // tree. An additional intellectual property rights grant can be found
6
+ // in the file PATENTS. All contributing project authors may
7
+ // be found in the AUTHORS file in the root of the source tree.
8
+ #include "src/segment_parser.h"
9
+
10
+ #include "src/chapters_parser.h"
11
+ #include "src/cluster_parser.h"
12
+ #include "src/cues_parser.h"
13
+ #include "src/info_parser.h"
14
+ #include "src/seek_head_parser.h"
15
+ #include "src/skip_callback.h"
16
+ #include "src/tags_parser.h"
17
+ #include "src/tracks_parser.h"
18
+ #include "webm/id.h"
19
+
20
+ namespace webm {
21
+
22
+ SegmentParser::SegmentParser()
23
+ : MasterParser(MakeChild<ChaptersParser>(Id::kChapters),
24
+ MakeChild<ClusterParser>(Id::kCluster),
25
+ MakeChild<CuesParser>(Id::kCues),
26
+ MakeChild<InfoParser>(Id::kInfo),
27
+ MakeChild<SeekHeadParser>(Id::kSeekHead),
28
+ MakeChild<TagsParser>(Id::kTags),
29
+ MakeChild<TracksParser>(Id::kTracks)) {}
30
+
31
+ Status SegmentParser::Init(const ElementMetadata& metadata,
32
+ std::uint64_t max_size) {
33
+ assert(metadata.size == kUnknownElementSize || metadata.size <= max_size);
34
+
35
+ begin_done_ = false;
36
+ parse_completed_ = false;
37
+ return MasterParser::Init(metadata, max_size);
38
+ }
39
+
40
+ void SegmentParser::InitAfterSeek(const Ancestory& child_ancestory,
41
+ const ElementMetadata& child_metadata) {
42
+ MasterParser::InitAfterSeek(child_ancestory, child_metadata);
43
+
44
+ begin_done_ = true;
45
+ parse_completed_ = false;
46
+ action_ = Action::kRead;
47
+ }
48
+
49
+ Status SegmentParser::Feed(Callback* callback, Reader* reader,
50
+ std::uint64_t* num_bytes_read) {
51
+ assert(callback != nullptr);
52
+ assert(reader != nullptr);
53
+ assert(num_bytes_read != nullptr);
54
+
55
+ *num_bytes_read = 0;
56
+
57
+ if (!begin_done_) {
58
+ const ElementMetadata metadata{Id::kSegment, header_size(), size(),
59
+ position()};
60
+ const Status status = callback->OnSegmentBegin(metadata, &action_);
61
+ if (!status.completed_ok()) {
62
+ return status;
63
+ }
64
+ begin_done_ = true;
65
+ }
66
+
67
+ SkipCallback skip_callback;
68
+ if (action_ == Action::kSkip) {
69
+ callback = &skip_callback;
70
+ }
71
+
72
+ if (!parse_completed_) {
73
+ const Status status = MasterParser::Feed(callback, reader, num_bytes_read);
74
+ if (!status.completed_ok()) {
75
+ return status;
76
+ }
77
+ parse_completed_ = true;
78
+ }
79
+
80
+ return callback->OnSegmentEnd(
81
+ {Id::kSegment, header_size(), size(), position()});
82
+ }
83
+
84
+ bool SegmentParser::WasSkipped() const { return action_ == Action::kSkip; }
85
+
86
+ } // namespace webm
@@ -0,0 +1,53 @@
1
+ // Copyright (c) 2016 The WebM project authors. All Rights Reserved.
2
+ //
3
+ // Use of this source code is governed by a BSD-style license
4
+ // that can be found in the LICENSE file in the root of the source
5
+ // tree. An additional intellectual property rights grant can be found
6
+ // in the file PATENTS. All contributing project authors may
7
+ // be found in the AUTHORS file in the root of the source tree.
8
+ #ifndef SRC_SEGMENT_PARSER_H_
9
+ #define SRC_SEGMENT_PARSER_H_
10
+
11
+ #include <cstdint>
12
+
13
+ #include "src/master_parser.h"
14
+ #include "webm/callback.h"
15
+ #include "webm/reader.h"
16
+ #include "webm/status.h"
17
+
18
+ namespace webm {
19
+
20
+ // Parses Segment elements from a WebM byte stream. This class adheres to the
21
+ // ElementParser interface; see element_parser.h for further documentation on
22
+ // how it should be used.
23
+ // Spec reference:
24
+ // http://matroska.org/technical/specs/index.html#Segment
25
+ // http://www.webmproject.org/docs/container/#Segment
26
+ class SegmentParser : public MasterParser {
27
+ public:
28
+ SegmentParser();
29
+
30
+ Status Init(const ElementMetadata& metadata, std::uint64_t max_size) override;
31
+
32
+ void InitAfterSeek(const Ancestory& child_ancestory,
33
+ const ElementMetadata& child_metadata) override;
34
+
35
+ Status Feed(Callback* callback, Reader* reader,
36
+ std::uint64_t* num_bytes_read) override;
37
+
38
+ bool WasSkipped() const override;
39
+
40
+ private:
41
+ // Set to true iff Callback::OnSegmentBegin has completed.
42
+ bool begin_done_;
43
+
44
+ // Set to true iff the base class has completed parsing.
45
+ bool parse_completed_;
46
+
47
+ // The action requested by Callback::OnSegmentBegin.
48
+ Action action_ = Action::kRead;
49
+ };
50
+
51
+ } // namespace webm
52
+
53
+ #endif // SRC_SEGMENT_PARSER_H_
@@ -0,0 +1,37 @@
1
+ // Copyright (c) 2016 The WebM project authors. All Rights Reserved.
2
+ //
3
+ // Use of this source code is governed by a BSD-style license
4
+ // that can be found in the LICENSE file in the root of the source
5
+ // tree. An additional intellectual property rights grant can be found
6
+ // in the file PATENTS. All contributing project authors may
7
+ // be found in the AUTHORS file in the root of the source tree.
8
+ #ifndef SRC_SIMPLE_TAG_PARSER_H_
9
+ #define SRC_SIMPLE_TAG_PARSER_H_
10
+
11
+ #include "src/bool_parser.h"
12
+ #include "src/byte_parser.h"
13
+ #include "src/master_value_parser.h"
14
+ #include "webm/dom_types.h"
15
+ #include "webm/id.h"
16
+
17
+ namespace webm {
18
+
19
+ // Spec reference:
20
+ // http://matroska.org/technical/specs/index.html#SimpleTag
21
+ // http://www.webmproject.org/docs/container/#SimpleTag
22
+ class SimpleTagParser : public MasterValueParser<SimpleTag> {
23
+ public:
24
+ SimpleTagParser(std::size_t max_recursive_depth = 25)
25
+ : MasterValueParser<SimpleTag>(
26
+ MakeChild<StringParser>(Id::kTagName, &SimpleTag::name),
27
+ MakeChild<StringParser>(Id::kTagLanguage, &SimpleTag::language),
28
+ MakeChild<BoolParser>(Id::kTagDefault, &SimpleTag::is_default),
29
+ MakeChild<StringParser>(Id::kTagString, &SimpleTag::string),
30
+ MakeChild<BinaryParser>(Id::kTagBinary, &SimpleTag::binary),
31
+ MakeChild<SimpleTagParser>(Id::kSimpleTag, &SimpleTag::tags,
32
+ max_recursive_depth)) {}
33
+ };
34
+
35
+ } // namespace webm
36
+
37
+ #endif // SRC_SIMPLE_TAG_PARSER_H_
@@ -0,0 +1,56 @@
1
+ // Copyright (c) 2016 The WebM project authors. All Rights Reserved.
2
+ //
3
+ // Use of this source code is governed by a BSD-style license
4
+ // that can be found in the LICENSE file in the root of the source
5
+ // tree. An additional intellectual property rights grant can be found
6
+ // in the file PATENTS. All contributing project authors may
7
+ // be found in the AUTHORS file in the root of the source tree.
8
+ #include "src/size_parser.h"
9
+
10
+ #include <cassert>
11
+ #include <cstdint>
12
+ #include <limits>
13
+
14
+ #include "src/bit_utils.h"
15
+ #include "src/parser_utils.h"
16
+ #include "webm/element.h"
17
+ #include "webm/reader.h"
18
+ #include "webm/status.h"
19
+
20
+ namespace webm {
21
+
22
+ // Spec references:
23
+ // http://matroska.org/technical/specs/index.html#EBML_ex
24
+ // https://github.com/Matroska-Org/ebml-specification/blob/master/specification.markdown#element-data-size
25
+ Status SizeParser::Feed(Callback* callback, Reader* reader,
26
+ std::uint64_t* num_bytes_read) {
27
+ assert(callback != nullptr);
28
+ assert(reader != nullptr);
29
+ assert(num_bytes_read != nullptr);
30
+
31
+ // Within the EBML header, the size can be encoded with 1-4 octets. After
32
+ // the EBML header, the size can be encoded with 1-8 octets (though not more
33
+ // than EBMLMaxSizeLength).
34
+
35
+ Status status = uint_parser_.Feed(callback, reader, num_bytes_read);
36
+
37
+ if (status.code == Status::kInvalidElementValue) {
38
+ status.code = Status::kInvalidElementSize;
39
+ }
40
+
41
+ return status;
42
+ }
43
+
44
+ std::uint64_t SizeParser::size() const {
45
+ // If all data bits are set, then it represents an unknown element size.
46
+ const std::uint64_t data_bits =
47
+ std::numeric_limits<std::uint64_t>::max() >>
48
+ (57 - 7 * (uint_parser_.encoded_length() - 1));
49
+ if (uint_parser_.value() == data_bits) {
50
+ return kUnknownElementSize;
51
+ }
52
+
53
+ return uint_parser_.value();
54
+ }
55
+
56
+ } // namespace webm
@@ -0,0 +1,43 @@
1
+ // Copyright (c) 2016 The WebM project authors. All Rights Reserved.
2
+ //
3
+ // Use of this source code is governed by a BSD-style license
4
+ // that can be found in the LICENSE file in the root of the source
5
+ // tree. An additional intellectual property rights grant can be found
6
+ // in the file PATENTS. All contributing project authors may
7
+ // be found in the AUTHORS file in the root of the source tree.
8
+ #ifndef SRC_SIZE_PARSER_H_
9
+ #define SRC_SIZE_PARSER_H_
10
+
11
+ #include <cstdint>
12
+
13
+ #include "src/parser.h"
14
+ #include "src/var_int_parser.h"
15
+ #include "webm/callback.h"
16
+ #include "webm/reader.h"
17
+ #include "webm/status.h"
18
+
19
+ namespace webm {
20
+
21
+ class SizeParser : public Parser {
22
+ public:
23
+ SizeParser() = default;
24
+ SizeParser(SizeParser&&) = default;
25
+ SizeParser& operator=(SizeParser&&) = default;
26
+
27
+ SizeParser(const SizeParser&) = delete;
28
+ SizeParser& operator=(const SizeParser&) = delete;
29
+
30
+ Status Feed(Callback* callback, Reader* reader,
31
+ std::uint64_t* num_bytes_read) override;
32
+
33
+ // Gets the parsed size. This must not be called until the parse had been
34
+ // successfully completed.
35
+ std::uint64_t size() const;
36
+
37
+ private:
38
+ VarIntParser uint_parser_;
39
+ };
40
+
41
+ } // namespace webm
42
+
43
+ #endif // SRC_SIZE_PARSER_H_
@@ -0,0 +1,63 @@
1
+ // Copyright (c) 2016 The WebM project authors. All Rights Reserved.
2
+ //
3
+ // Use of this source code is governed by a BSD-style license
4
+ // that can be found in the LICENSE file in the root of the source
5
+ // tree. An additional intellectual property rights grant can be found
6
+ // in the file PATENTS. All contributing project authors may
7
+ // be found in the AUTHORS file in the root of the source tree.
8
+ #ifndef SRC_SKIP_CALLBACK_H_
9
+ #define SRC_SKIP_CALLBACK_H_
10
+
11
+ #include "webm/callback.h"
12
+ #include "webm/dom_types.h"
13
+ #include "webm/reader.h"
14
+ #include "webm/status.h"
15
+
16
+ namespace webm {
17
+
18
+ // An implementation of Callback that skips all elements. Every method that
19
+ // yields an action will yield Action::kSkip, and Reader::Skip will be called
20
+ // if the callback ever needs to process data from the byte stream.
21
+ class SkipCallback : public Callback {
22
+ public:
23
+ Status OnElementBegin(const ElementMetadata& /* metadata */,
24
+ Action* action) override {
25
+ *action = Action::kSkip;
26
+ return Status(Status::kOkCompleted);
27
+ }
28
+
29
+ Status OnSegmentBegin(const ElementMetadata& /* metadata */,
30
+ Action* action) override {
31
+ *action = Action::kSkip;
32
+ return Status(Status::kOkCompleted);
33
+ }
34
+
35
+ Status OnClusterBegin(const ElementMetadata& /* metadata */,
36
+ const Cluster& /* cluster */, Action* action) override {
37
+ *action = Action::kSkip;
38
+ return Status(Status::kOkCompleted);
39
+ }
40
+
41
+ Status OnSimpleBlockBegin(const ElementMetadata& /* metadata */,
42
+ const SimpleBlock& /* simple_block */,
43
+ Action* action) override {
44
+ *action = Action::kSkip;
45
+ return Status(Status::kOkCompleted);
46
+ }
47
+
48
+ Status OnBlockGroupBegin(const ElementMetadata& /* metadata */,
49
+ Action* action) override {
50
+ *action = Action::kSkip;
51
+ return Status(Status::kOkCompleted);
52
+ }
53
+
54
+ Status OnBlockBegin(const ElementMetadata& /* metadata */,
55
+ const Block& /* block */, Action* action) override {
56
+ *action = Action::kSkip;
57
+ return Status(Status::kOkCompleted);
58
+ }
59
+ };
60
+
61
+ } // namespace webm
62
+
63
+ #endif // SRC_SKIP_CALLBACK_H_
@@ -0,0 +1,59 @@
1
+ // Copyright (c) 2016 The WebM project authors. All Rights Reserved.
2
+ //
3
+ // Use of this source code is governed by a BSD-style license
4
+ // that can be found in the LICENSE file in the root of the source
5
+ // tree. An additional intellectual property rights grant can be found
6
+ // in the file PATENTS. All contributing project authors may
7
+ // be found in the AUTHORS file in the root of the source tree.
8
+ #include "src/skip_parser.h"
9
+
10
+ #include <cassert>
11
+ #include <cstdint>
12
+
13
+ #include "webm/element.h"
14
+ #include "webm/reader.h"
15
+ #include "webm/status.h"
16
+
17
+ namespace webm {
18
+
19
+ Status SkipParser::Init(const ElementMetadata& metadata,
20
+ std::uint64_t max_size) {
21
+ assert(metadata.size == kUnknownElementSize || metadata.size <= max_size);
22
+
23
+ if (metadata.size == kUnknownElementSize) {
24
+ return Status(Status::kInvalidElementSize);
25
+ }
26
+
27
+ num_bytes_remaining_ = metadata.size;
28
+
29
+ return Status(Status::kOkCompleted);
30
+ }
31
+
32
+ Status SkipParser::Feed(Callback* callback, Reader* reader,
33
+ std::uint64_t* num_bytes_read) {
34
+ assert(callback != nullptr);
35
+ assert(reader != nullptr);
36
+ assert(num_bytes_read != nullptr);
37
+
38
+ *num_bytes_read = 0;
39
+
40
+ if (num_bytes_remaining_ == 0) {
41
+ return Status(Status::kOkCompleted);
42
+ }
43
+
44
+ Status status;
45
+ do {
46
+ std::uint64_t local_num_bytes_read = 0;
47
+ status = reader->Skip(num_bytes_remaining_, &local_num_bytes_read);
48
+ assert((status.completed_ok() &&
49
+ local_num_bytes_read == num_bytes_remaining_) ||
50
+ (status.ok() && local_num_bytes_read < num_bytes_remaining_) ||
51
+ (!status.ok() && local_num_bytes_read == 0));
52
+ *num_bytes_read += local_num_bytes_read;
53
+ num_bytes_remaining_ -= local_num_bytes_read;
54
+ } while (status.code == Status::kOkPartial);
55
+
56
+ return status;
57
+ }
58
+
59
+ } // namespace webm