@libmedia/avutil 0.12.0 → 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 (572) hide show
  1. package/dist/cjs/{AVStream.js → AVStream.cjs} +5 -5
  2. package/dist/cjs/AVStream.js.map +1 -1
  3. package/dist/cjs/audiosamplefmt.js.map +1 -1
  4. package/dist/cjs/avformat.js.map +1 -1
  5. package/dist/cjs/codec.js.map +1 -1
  6. package/dist/cjs/codecs/{aac.js → aac.cjs} +2 -8
  7. package/dist/cjs/codecs/aac.js.map +1 -1
  8. package/dist/cjs/codecs/{ac3.js → ac3.cjs} +2 -8
  9. package/dist/cjs/codecs/ac3.js.map +1 -1
  10. package/dist/cjs/codecs/{av1.js → av1.cjs} +6 -10
  11. package/dist/cjs/codecs/av1.js.map +1 -1
  12. package/dist/cjs/codecs/{dts.js → dts.cjs} +3 -9
  13. package/dist/cjs/codecs/dts.js.map +1 -1
  14. package/dist/cjs/codecs/{flac.js → flac.cjs} +2 -8
  15. package/dist/cjs/codecs/flac.js.map +1 -1
  16. package/dist/cjs/codecs/{h264.js → h264.cjs} +20 -23
  17. package/dist/cjs/codecs/h264.js.map +1 -1
  18. package/dist/cjs/codecs/{hevc.js → hevc.cjs} +23 -23
  19. package/dist/cjs/codecs/hevc.js.map +1 -1
  20. package/dist/cjs/codecs/{mp3.js → mp3.cjs} +1 -1
  21. package/dist/cjs/codecs/mp3.js.map +1 -1
  22. package/dist/cjs/codecs/{mpeg4.js → mpeg4.cjs} +1 -1
  23. package/dist/cjs/codecs/mpeg4.js.map +1 -1
  24. package/dist/cjs/codecs/{mpegvideo.js → mpegvideo.cjs} +1 -1
  25. package/dist/cjs/codecs/mpegvideo.js.map +1 -1
  26. package/dist/cjs/codecs/{opus.js → opus.cjs} +3 -9
  27. package/dist/cjs/codecs/opus.js.map +1 -1
  28. package/dist/cjs/codecs/ttml.cjs +51 -0
  29. package/dist/cjs/codecs/ttml.js.map +1 -1
  30. package/dist/cjs/codecs/{vp8.js → vp8.cjs} +2 -8
  31. package/dist/cjs/codecs/vp8.js.map +1 -1
  32. package/dist/cjs/codecs/{vp9.js → vp9.cjs} +4 -10
  33. package/dist/cjs/codecs/vp9.js.map +1 -1
  34. package/dist/cjs/codecs/{vvc.js → vvc.cjs} +25 -25
  35. package/dist/cjs/codecs/vvc.js.map +1 -1
  36. package/dist/cjs/{constant.js → constant.cjs} +6 -7
  37. package/dist/cjs/constant.js.map +1 -1
  38. package/dist/cjs/{enum.js → enum.cjs} +3 -1
  39. package/dist/cjs/enum.js.map +1 -1
  40. package/dist/cjs/error.js.map +1 -1
  41. package/dist/cjs/function/analyzeAVFormat.js.map +1 -1
  42. package/dist/cjs/function/analyzeUrlIOLoader.cjs +66 -0
  43. package/dist/cjs/function/analyzeUrlIOLoader.js.map +1 -1
  44. package/dist/cjs/function/{audioData2AVFrame.js → audioData2AVFrame.cjs} +9 -9
  45. package/dist/cjs/function/audioData2AVFrame.js.map +1 -1
  46. package/dist/cjs/function/{avPCMBuffer2AVFrame.js → avPCMBuffer2AVFrame.cjs} +20 -20
  47. package/dist/cjs/function/avPCMBuffer2AVFrame.js.map +1 -1
  48. package/dist/cjs/function/{avframe2AudioData.js → avframe2AudioData.cjs} +7 -7
  49. package/dist/cjs/function/avframe2AudioData.js.map +1 -1
  50. package/dist/cjs/function/avframe2VideoFrame.cjs +48 -0
  51. package/dist/cjs/function/avframe2VideoFrame.js.map +1 -1
  52. package/dist/cjs/function/{avpacket2EncodedAudioChunk.js → avpacket2EncodedAudioChunk.cjs} +3 -3
  53. package/dist/cjs/function/avpacket2EncodedAudioChunk.js.map +1 -1
  54. package/dist/cjs/function/{avpacket2EncodedVideoChunk.js → avpacket2EncodedVideoChunk.cjs} +3 -3
  55. package/dist/cjs/function/avpacket2EncodedVideoChunk.js.map +1 -1
  56. package/dist/cjs/function/compileResource.cjs +19 -0
  57. package/dist/cjs/function/compileResource.js.map +1 -1
  58. package/dist/cjs/function/constant/webcodecs.cjs +50 -0
  59. package/dist/cjs/function/constant/webcodecs.js.map +1 -0
  60. package/dist/cjs/function/encodedAudioChunk2AVPacket.cjs +23 -0
  61. package/dist/cjs/function/encodedAudioChunk2AVPacket.js.map +1 -1
  62. package/dist/cjs/function/{encodedVideoChunk2AVPacket.js → encodedVideoChunk2AVPacket.cjs} +8 -8
  63. package/dist/cjs/function/encodedVideoChunk2AVPacket.js.map +1 -1
  64. package/dist/cjs/function/{getAudioCodec.js → getAudioCodec.cjs} +1 -1
  65. package/dist/cjs/function/getAudioCodec.js.map +1 -1
  66. package/dist/cjs/function/getAudioMimeType.cjs +19 -0
  67. package/dist/cjs/function/getAudioMimeType.js.map +1 -0
  68. package/dist/cjs/function/getHardwarePreference.cjs +10 -0
  69. package/dist/cjs/function/getHardwarePreference.js.map +1 -1
  70. package/dist/cjs/function/{getVideoCodec.js → getVideoCodec.cjs} +12 -12
  71. package/dist/cjs/function/getVideoCodec.js.map +1 -1
  72. package/dist/cjs/function/getVideoMimeType.cjs +18 -0
  73. package/dist/cjs/function/getVideoMimeType.js.map +1 -0
  74. package/dist/cjs/function/{getWasmUrl.js → getWasmUrl.cjs} +2 -3
  75. package/dist/cjs/function/getWasmUrl.js.map +1 -1
  76. package/dist/cjs/function/{hasAlphaChannel.js → hasAlphaChannel.cjs} +1 -1
  77. package/dist/cjs/function/hasAlphaChannel.js.map +1 -1
  78. package/dist/cjs/function/{isHdr.js → isHdr.cjs} +1 -1
  79. package/dist/cjs/function/isHdr.js.map +1 -1
  80. package/dist/cjs/function/videoFrame2AVFrame.cjs +51 -0
  81. package/dist/cjs/function/videoFrame2AVFrame.js.map +1 -1
  82. package/dist/cjs/implement/AVFramePoolImpl.cjs +28 -0
  83. package/dist/cjs/implement/AVFramePoolImpl.js.map +1 -1
  84. package/dist/cjs/implement/AVPCMBufferPoolImpl.cjs +27 -0
  85. package/dist/cjs/implement/AVPCMBufferPoolImpl.js.map +1 -1
  86. package/dist/cjs/implement/AVPacketPoolImpl.cjs +29 -0
  87. package/dist/cjs/implement/AVPacketPoolImpl.js.map +1 -1
  88. package/dist/cjs/index.cjs +840 -0
  89. package/dist/cjs/index.js.map +1 -0
  90. package/dist/cjs/internal.cjs +283 -0
  91. package/dist/cjs/internal.js.map +1 -0
  92. package/dist/cjs/{pixelFormatDescriptor.js → pixelFormatDescriptor.cjs} +2 -0
  93. package/dist/cjs/pixelFormatDescriptor.js.map +1 -1
  94. package/dist/cjs/pixfmt.js.map +1 -1
  95. package/dist/cjs/sampleFormatDescriptor.js.map +1 -1
  96. package/dist/cjs/{stringEnum.js → stringEnum.cjs} +4 -1
  97. package/dist/cjs/stringEnum.js.map +1 -1
  98. package/dist/cjs/struct/{audiosample.js → audiosample.cjs} +13 -13
  99. package/dist/cjs/struct/audiosample.js.map +1 -1
  100. package/dist/cjs/struct/{avbuffer.js → avbuffer.cjs} +18 -18
  101. package/dist/cjs/struct/avbuffer.js.map +1 -1
  102. package/dist/cjs/struct/{avcodecparameters.js → avcodecparameters.cjs} +11 -11
  103. package/dist/cjs/struct/avcodecparameters.js.map +1 -1
  104. package/dist/cjs/struct/{avdict.js → avdict.cjs} +9 -9
  105. package/dist/cjs/struct/avdict.js.map +1 -1
  106. package/dist/cjs/struct/{avframe.js → avframe.cjs} +30 -30
  107. package/dist/cjs/struct/avframe.js.map +1 -1
  108. package/dist/cjs/struct/{avpacket.js → avpacket.cjs} +19 -19
  109. package/dist/cjs/struct/avpacket.js.map +1 -1
  110. package/dist/cjs/struct/{avpcmbuffer.js → avpcmbuffer.cjs} +9 -9
  111. package/dist/cjs/struct/avpcmbuffer.js.map +1 -1
  112. package/dist/cjs/struct/avsubtitle.js.map +1 -1
  113. package/dist/cjs/struct/{encryption.js → encryption.cjs} +13 -13
  114. package/dist/cjs/struct/encryption.js.map +1 -1
  115. package/dist/cjs/struct/rational.cjs +43 -0
  116. package/dist/cjs/struct/rational.js.map +1 -1
  117. package/dist/cjs/util/{amf.js → amf.cjs} +7 -38
  118. package/dist/cjs/util/amf.js.map +1 -1
  119. package/dist/cjs/util/av1syntax.js.map +1 -1
  120. package/dist/cjs/util/avbuffer.cjs +122 -0
  121. package/dist/cjs/util/avbuffer.js.map +1 -1
  122. package/dist/cjs/util/avdict.cjs +75 -0
  123. package/dist/cjs/util/avdict.js.map +1 -1
  124. package/dist/cjs/util/{avframe.js → avframe.cjs} +82 -87
  125. package/dist/cjs/util/avframe.js.map +1 -1
  126. package/dist/cjs/util/{avpacket.js → avpacket.cjs} +58 -58
  127. package/dist/cjs/util/avpacket.js.map +1 -1
  128. package/dist/cjs/util/{channel.js → channel.cjs} +7 -7
  129. package/dist/cjs/util/channel.js.map +1 -1
  130. package/dist/cjs/util/codecparameters.cjs +95 -0
  131. package/dist/cjs/util/codecparameters.js.map +1 -1
  132. package/dist/cjs/util/common.js.map +1 -1
  133. package/dist/cjs/util/{encryption.js → encryption.cjs} +5 -11
  134. package/dist/cjs/util/encryption.js.map +1 -1
  135. package/dist/cjs/util/expgolomb.js.map +1 -1
  136. package/dist/cjs/util/{intread.js → intread.cjs} +1 -1
  137. package/dist/cjs/util/intread.js.map +1 -1
  138. package/dist/cjs/util/{intwrite.js → intwrite.cjs} +1 -1
  139. package/dist/cjs/util/intwrite.js.map +1 -1
  140. package/dist/cjs/util/mem.cjs +23 -0
  141. package/dist/cjs/util/mem.js.map +1 -1
  142. package/dist/cjs/util/{nalu.js → nalu.cjs} +7 -42
  143. package/dist/cjs/util/nalu.js.map +1 -1
  144. package/dist/cjs/util/ntp.js.map +1 -1
  145. package/dist/cjs/util/pcm.js.map +1 -1
  146. package/dist/cjs/util/{pixel.js → pixel.cjs} +26 -30
  147. package/dist/cjs/util/pixel.js.map +1 -1
  148. package/dist/cjs/util/{rational.js → rational.cjs} +5 -11
  149. package/dist/cjs/util/rational.js.map +1 -1
  150. package/dist/cjs/util/{sample.js → sample.cjs} +6 -12
  151. package/dist/cjs/util/sample.js.map +1 -1
  152. package/dist/cjs/util/{serialize.js → serialize.cjs} +40 -42
  153. package/dist/cjs/util/serialize.js.map +1 -1
  154. package/dist/esm/AVStream.d.ts +7 -7
  155. package/dist/esm/AVStream.js +10 -12
  156. package/dist/esm/AVStream.js.map +1 -1
  157. package/dist/esm/audiosamplefmt.js.map +1 -1
  158. package/dist/esm/avformat.js.map +1 -1
  159. package/dist/esm/codec.js.map +1 -1
  160. package/dist/esm/codecs/aac.d.ts +10 -5
  161. package/dist/esm/codecs/aac.js +2 -2
  162. package/dist/esm/codecs/aac.js.map +1 -1
  163. package/dist/esm/codecs/ac3.d.ts +1 -1
  164. package/dist/esm/codecs/ac3.js +1 -1
  165. package/dist/esm/codecs/ac3.js.map +1 -1
  166. package/dist/esm/codecs/av1.d.ts +3 -3
  167. package/dist/esm/codecs/av1.js +4 -6
  168. package/dist/esm/codecs/av1.js.map +1 -1
  169. package/dist/esm/codecs/dts.d.ts +1 -1
  170. package/dist/esm/codecs/dts.js +2 -2
  171. package/dist/esm/codecs/dts.js.map +1 -1
  172. package/dist/esm/codecs/flac.d.ts +3 -3
  173. package/dist/esm/codecs/flac.js +1 -1
  174. package/dist/esm/codecs/flac.js.map +1 -1
  175. package/dist/esm/codecs/h264.d.ts +5 -5
  176. package/dist/esm/codecs/h264.js +13 -18
  177. package/dist/esm/codecs/h264.js.map +1 -1
  178. package/dist/esm/codecs/hevc.d.ts +5 -5
  179. package/dist/esm/codecs/hevc.js +16 -15
  180. package/dist/esm/codecs/hevc.js.map +1 -1
  181. package/dist/esm/codecs/mp3.d.ts +4 -4
  182. package/dist/esm/codecs/mp3.js +1 -1
  183. package/dist/esm/codecs/mp3.js.map +1 -1
  184. package/dist/esm/codecs/mpeg4.d.ts +1 -1
  185. package/dist/esm/codecs/mpeg4.js +1 -1
  186. package/dist/esm/codecs/mpeg4.js.map +1 -1
  187. package/dist/esm/codecs/mpegvideo.d.ts +1 -1
  188. package/dist/esm/codecs/mpegvideo.js +1 -1
  189. package/dist/esm/codecs/mpegvideo.js.map +1 -1
  190. package/dist/esm/codecs/opus.d.ts +3 -3
  191. package/dist/esm/codecs/opus.js +2 -4
  192. package/dist/esm/codecs/opus.js.map +1 -1
  193. package/dist/esm/codecs/ttml.js +5 -11
  194. package/dist/esm/codecs/ttml.js.map +1 -1
  195. package/dist/esm/codecs/vp8.d.ts +4 -4
  196. package/dist/esm/codecs/vp8.js +2 -2
  197. package/dist/esm/codecs/vp8.js.map +1 -1
  198. package/dist/esm/codecs/vp9.d.ts +4 -4
  199. package/dist/esm/codecs/vp9.js +8 -10
  200. package/dist/esm/codecs/vp9.js.map +1 -1
  201. package/dist/esm/codecs/vvc.d.ts +5 -5
  202. package/dist/esm/codecs/vvc.js +16 -17
  203. package/dist/esm/codecs/vvc.js.map +1 -1
  204. package/dist/esm/constant.d.ts +5 -7
  205. package/dist/esm/constant.js +5 -9
  206. package/dist/esm/constant.js.map +1 -1
  207. package/dist/esm/enum.d.ts +9 -1
  208. package/dist/esm/enum.js +3 -1
  209. package/dist/esm/enum.js.map +1 -1
  210. package/dist/esm/error.js.map +1 -1
  211. package/dist/esm/function/analyzeAVFormat.d.ts +2 -2
  212. package/dist/esm/function/analyzeAVFormat.js.map +1 -1
  213. package/dist/esm/function/analyzeUrlIOLoader.d.ts +2 -2
  214. package/dist/esm/function/analyzeUrlIOLoader.js +2 -10
  215. package/dist/esm/function/analyzeUrlIOLoader.js.map +1 -1
  216. package/dist/esm/function/audioData2AVFrame.d.ts +1 -1
  217. package/dist/esm/function/audioData2AVFrame.js +6 -6
  218. package/dist/esm/function/audioData2AVFrame.js.map +1 -1
  219. package/dist/esm/function/avPCMBuffer2AVFrame.d.ts +2 -2
  220. package/dist/esm/function/avPCMBuffer2AVFrame.js +9 -9
  221. package/dist/esm/function/avPCMBuffer2AVFrame.js.map +1 -1
  222. package/dist/esm/function/avframe2AudioData.d.ts +1 -1
  223. package/dist/esm/function/avframe2AudioData.js +6 -8
  224. package/dist/esm/function/avframe2AudioData.js.map +1 -1
  225. package/dist/esm/function/avframe2VideoFrame.d.ts +3 -3
  226. package/dist/esm/function/avframe2VideoFrame.js +14 -79
  227. package/dist/esm/function/avframe2VideoFrame.js.map +1 -1
  228. package/dist/esm/function/avpacket2EncodedAudioChunk.d.ts +1 -1
  229. package/dist/esm/function/avpacket2EncodedAudioChunk.js +5 -7
  230. package/dist/esm/function/avpacket2EncodedAudioChunk.js.map +1 -1
  231. package/dist/esm/function/avpacket2EncodedVideoChunk.d.ts +1 -1
  232. package/dist/esm/function/avpacket2EncodedVideoChunk.js +5 -7
  233. package/dist/esm/function/avpacket2EncodedVideoChunk.js.map +1 -1
  234. package/dist/esm/function/compileResource.d.ts +1 -1
  235. package/dist/esm/function/compileResource.js +2 -4
  236. package/dist/esm/function/compileResource.js.map +1 -1
  237. package/dist/esm/function/constant/webcodecs.d.ts +5 -0
  238. package/dist/esm/function/constant/webcodecs.js +51 -0
  239. package/dist/esm/function/constant/webcodecs.js.map +1 -0
  240. package/dist/esm/function/encodedAudioChunk2AVPacket.d.ts +1 -1
  241. package/dist/esm/function/encodedAudioChunk2AVPacket.js +6 -6
  242. package/dist/esm/function/encodedAudioChunk2AVPacket.js.map +1 -1
  243. package/dist/esm/function/encodedVideoChunk2AVPacket.d.ts +1 -1
  244. package/dist/esm/function/encodedVideoChunk2AVPacket.js +7 -7
  245. package/dist/esm/function/encodedVideoChunk2AVPacket.js.map +1 -1
  246. package/dist/esm/function/getAudioCodec.d.ts +1 -1
  247. package/dist/esm/function/getAudioCodec.js +2 -2
  248. package/dist/esm/function/getAudioCodec.js.map +1 -1
  249. package/dist/esm/function/getAudioMimeType.d.ts +2 -0
  250. package/dist/esm/function/getAudioMimeType.js +12 -0
  251. package/dist/esm/function/getAudioMimeType.js.map +1 -0
  252. package/dist/esm/function/getHardwarePreference.js +1 -1
  253. package/dist/esm/function/getHardwarePreference.js.map +1 -1
  254. package/dist/esm/function/getVideoCodec.d.ts +1 -1
  255. package/dist/esm/function/getVideoCodec.js +11 -13
  256. package/dist/esm/function/getVideoCodec.js.map +1 -1
  257. package/dist/esm/function/getVideoMimeType.d.ts +2 -0
  258. package/dist/esm/function/getVideoMimeType.js +8 -0
  259. package/dist/esm/function/getVideoMimeType.js.map +1 -0
  260. package/dist/esm/function/getWasmUrl.d.ts +1 -1
  261. package/dist/esm/function/getWasmUrl.js +2 -2
  262. package/dist/esm/function/getWasmUrl.js.map +1 -1
  263. package/dist/esm/function/hasAlphaChannel.d.ts +1 -1
  264. package/dist/esm/function/hasAlphaChannel.js +2 -2
  265. package/dist/esm/function/hasAlphaChannel.js.map +1 -1
  266. package/dist/esm/function/isHdr.d.ts +1 -1
  267. package/dist/esm/function/isHdr.js +2 -2
  268. package/dist/esm/function/isHdr.js.map +1 -1
  269. package/dist/esm/function/videoFrame2AVFrame.d.ts +6 -6
  270. package/dist/esm/function/videoFrame2AVFrame.js +13 -74
  271. package/dist/esm/function/videoFrame2AVFrame.js.map +1 -1
  272. package/dist/esm/implement/AVFramePoolImpl.d.ts +3 -4
  273. package/dist/esm/implement/AVFramePoolImpl.js +5 -7
  274. package/dist/esm/implement/AVFramePoolImpl.js.map +1 -1
  275. package/dist/esm/implement/AVPCMBufferPoolImpl.d.ts +3 -4
  276. package/dist/esm/implement/AVPCMBufferPoolImpl.js +4 -6
  277. package/dist/esm/implement/AVPCMBufferPoolImpl.js.map +1 -1
  278. package/dist/esm/implement/AVPacketPoolImpl.d.ts +3 -4
  279. package/dist/esm/implement/AVPacketPoolImpl.js +5 -7
  280. package/dist/esm/implement/AVPacketPoolImpl.js.map +1 -1
  281. package/dist/esm/index.d.ts +54 -0
  282. package/dist/esm/index.js +98 -0
  283. package/dist/esm/index.js.map +1 -0
  284. package/dist/esm/internal.d.ts +26 -0
  285. package/dist/esm/internal.js +52 -0
  286. package/dist/esm/internal.js.map +1 -0
  287. package/dist/esm/pixelFormatDescriptor.d.ts +1 -1
  288. package/dist/esm/pixelFormatDescriptor.js +2 -0
  289. package/dist/esm/pixelFormatDescriptor.js.map +1 -1
  290. package/dist/esm/pixfmt.d.ts +9 -1
  291. package/dist/esm/pixfmt.js.map +1 -1
  292. package/dist/esm/sampleFormatDescriptor.d.ts +1 -1
  293. package/dist/esm/sampleFormatDescriptor.js.map +1 -1
  294. package/dist/esm/stringEnum.d.ts +5 -5
  295. package/dist/esm/stringEnum.js +4 -1
  296. package/dist/esm/stringEnum.js.map +1 -1
  297. package/dist/esm/struct/audiosample.d.ts +1 -1
  298. package/dist/esm/struct/audiosample.js +2 -2
  299. package/dist/esm/struct/audiosample.js.map +1 -1
  300. package/dist/esm/struct/avbuffer.d.ts +1 -1
  301. package/dist/esm/struct/avbuffer.js +4 -4
  302. package/dist/esm/struct/avbuffer.js.map +1 -1
  303. package/dist/esm/struct/avcodecparameters.d.ts +9 -9
  304. package/dist/esm/struct/avcodecparameters.js +14 -16
  305. package/dist/esm/struct/avcodecparameters.js.map +1 -1
  306. package/dist/esm/struct/avdict.js +2 -2
  307. package/dist/esm/struct/avdict.js.map +1 -1
  308. package/dist/esm/struct/avframe.d.ts +12 -12
  309. package/dist/esm/struct/avframe.js +18 -22
  310. package/dist/esm/struct/avframe.js.map +1 -1
  311. package/dist/esm/struct/avpacket.d.ts +4 -4
  312. package/dist/esm/struct/avpacket.js +7 -9
  313. package/dist/esm/struct/avpacket.js.map +1 -1
  314. package/dist/esm/struct/avpcmbuffer.d.ts +1 -1
  315. package/dist/esm/struct/avpcmbuffer.js +2 -2
  316. package/dist/esm/struct/avpcmbuffer.js.map +1 -1
  317. package/dist/esm/struct/avsubtitle.d.ts +2 -2
  318. package/dist/esm/struct/avsubtitle.js.map +1 -1
  319. package/dist/esm/struct/encryption.js +2 -2
  320. package/dist/esm/struct/encryption.js.map +1 -1
  321. package/dist/esm/struct/rational.d.ts +1 -1
  322. package/dist/esm/struct/rational.js +4 -4
  323. package/dist/esm/struct/rational.js.map +1 -1
  324. package/dist/esm/util/amf.d.ts +1 -4
  325. package/dist/esm/util/amf.js +1 -5
  326. package/dist/esm/util/amf.js.map +1 -1
  327. package/dist/esm/util/av1syntax.d.ts +1 -1
  328. package/dist/esm/util/av1syntax.js.map +1 -1
  329. package/dist/esm/util/avbuffer.d.ts +2 -2
  330. package/dist/esm/util/avbuffer.js +7 -15
  331. package/dist/esm/util/avbuffer.js.map +1 -1
  332. package/dist/esm/util/avdict.d.ts +2 -2
  333. package/dist/esm/util/avdict.js +12 -16
  334. package/dist/esm/util/avdict.js.map +1 -1
  335. package/dist/esm/util/avframe.d.ts +2 -2
  336. package/dist/esm/util/avframe.js +22 -24
  337. package/dist/esm/util/avframe.js.map +1 -1
  338. package/dist/esm/util/avpacket.d.ts +3 -3
  339. package/dist/esm/util/avpacket.js +11 -13
  340. package/dist/esm/util/avpacket.js.map +1 -1
  341. package/dist/esm/util/channel.d.ts +1 -1
  342. package/dist/esm/util/channel.js +6 -6
  343. package/dist/esm/util/channel.js.map +1 -1
  344. package/dist/esm/util/codecparameters.d.ts +3 -1
  345. package/dist/esm/util/codecparameters.js +16 -12
  346. package/dist/esm/util/codecparameters.js.map +1 -1
  347. package/dist/esm/util/common.js.map +1 -1
  348. package/dist/esm/util/encryption.d.ts +2 -2
  349. package/dist/esm/util/encryption.js +1 -3
  350. package/dist/esm/util/encryption.js.map +1 -1
  351. package/dist/esm/util/expgolomb.d.ts +1 -2
  352. package/dist/esm/util/expgolomb.js.map +1 -1
  353. package/dist/esm/util/intread.js +1 -1
  354. package/dist/esm/util/intread.js.map +1 -1
  355. package/dist/esm/util/intwrite.js +1 -1
  356. package/dist/esm/util/intwrite.js.map +1 -1
  357. package/dist/esm/util/mem.js +7 -7
  358. package/dist/esm/util/mem.js.map +1 -1
  359. package/dist/esm/util/nalu.d.ts +1 -1
  360. package/dist/esm/util/nalu.js +3 -5
  361. package/dist/esm/util/nalu.js.map +1 -1
  362. package/dist/esm/util/ntp.js.map +1 -1
  363. package/dist/esm/util/pcm.d.ts +1 -1
  364. package/dist/esm/util/pcm.js.map +1 -1
  365. package/dist/esm/util/pixel.d.ts +1 -1
  366. package/dist/esm/util/pixel.js +8 -10
  367. package/dist/esm/util/pixel.js.map +1 -1
  368. package/dist/esm/util/rational.d.ts +10 -10
  369. package/dist/esm/util/rational.js +4 -4
  370. package/dist/esm/util/rational.js.map +1 -1
  371. package/dist/esm/util/sample.d.ts +1 -1
  372. package/dist/esm/util/sample.js +7 -7
  373. package/dist/esm/util/sample.js.map +1 -1
  374. package/dist/esm/util/serialize.d.ts +9 -9
  375. package/dist/esm/util/serialize.js +6 -6
  376. package/dist/esm/util/serialize.js.map +1 -1
  377. package/package.json +23 -390
  378. package/src/AVStream.ts +677 -0
  379. package/src/audiosamplefmt.ts +302 -0
  380. package/src/avformat.ts +96 -0
  381. package/src/codec.ts +1016 -0
  382. package/src/codecs/aac.ts +429 -0
  383. package/src/codecs/ac3.ts +309 -0
  384. package/src/codecs/av1.ts +503 -0
  385. package/src/codecs/dts.ts +100 -0
  386. package/src/codecs/flac.ts +118 -0
  387. package/src/codecs/h264.ts +1013 -0
  388. package/src/codecs/hevc.ts +1049 -0
  389. package/src/codecs/mp3.ts +172 -0
  390. package/src/codecs/mpeg4.ts +37 -0
  391. package/src/codecs/mpegvideo.ts +49 -0
  392. package/src/codecs/opus.ts +148 -0
  393. package/src/codecs/ttml.ts +158 -0
  394. package/src/codecs/vp8.ts +91 -0
  395. package/src/codecs/vp9.ts +213 -0
  396. package/src/codecs/vvc.ts +1086 -0
  397. package/src/constant.ts +72 -0
  398. package/src/enum.ts +47 -0
  399. package/src/error.ts +45 -0
  400. package/src/function/analyzeAVFormat.ts +94 -0
  401. package/src/function/analyzeUrlIOLoader.ts +166 -0
  402. package/src/function/audioData2AVFrame.ts +82 -0
  403. package/src/function/avPCMBuffer2AVFrame.ts +111 -0
  404. package/src/function/avframe2AudioData.ts +131 -0
  405. package/src/function/avframe2VideoFrame.ts +88 -0
  406. package/src/function/avpacket2EncodedAudioChunk.ts +39 -0
  407. package/src/function/avpacket2EncodedVideoChunk.ts +39 -0
  408. package/src/function/compileResource.ts +57 -0
  409. package/src/function/constant/webcodecs.ts +81 -0
  410. package/src/function/encodedAudioChunk2AVPacket.ts +62 -0
  411. package/src/function/encodedVideoChunk2AVPacket.ts +86 -0
  412. package/src/function/getAudioCodec.ts +45 -0
  413. package/src/function/getAudioMimeType.ts +44 -0
  414. package/src/function/getHardwarePreference.ts +45 -0
  415. package/src/function/getVideoCodec.ts +244 -0
  416. package/src/function/getVideoMimeType.ts +35 -0
  417. package/src/function/getWasmUrl.ts +190 -0
  418. package/src/function/hasAlphaChannel.ts +37 -0
  419. package/src/function/isHdr.ts +44 -0
  420. package/src/function/videoFrame2AVFrame.ts +95 -0
  421. package/src/implement/AVFramePoolImpl.ts +83 -0
  422. package/src/implement/AVPCMBufferPoolImpl.ts +79 -0
  423. package/src/implement/AVPacketPoolImpl.ts +82 -0
  424. package/src/index.ts +264 -0
  425. package/src/internal.ts +71 -0
  426. package/src/pixelFormatDescriptor.ts +819 -0
  427. package/src/pixfmt.ts +1400 -0
  428. package/src/sampleFormatDescriptor.ts +57 -0
  429. package/src/stringEnum.ts +366 -0
  430. package/src/struct/audiosample.ts +95 -0
  431. package/src/struct/avbuffer.ts +139 -0
  432. package/src/struct/avcodecparameters.ts +243 -0
  433. package/src/struct/avdict.ts +44 -0
  434. package/src/struct/avframe.ts +663 -0
  435. package/src/struct/avpacket.ts +178 -0
  436. package/src/struct/avpcmbuffer.ts +77 -0
  437. package/src/struct/avsubtitle.ts +59 -0
  438. package/src/struct/encryption.ts +180 -0
  439. package/src/struct/rational.ts +43 -0
  440. package/src/util/amf.ts +178 -0
  441. package/src/util/av1syntax.ts +112 -0
  442. package/src/util/avbuffer.ts +294 -0
  443. package/src/util/avdict.ts +171 -0
  444. package/src/util/avframe.ts +520 -0
  445. package/src/util/avpacket.ts +313 -0
  446. package/src/util/channel.ts +66 -0
  447. package/src/util/codecparameters.ts +148 -0
  448. package/src/util/common.ts +42 -0
  449. package/src/util/encryption.ts +154 -0
  450. package/src/util/expgolomb.ts +170 -0
  451. package/src/util/intread.ts +60 -0
  452. package/src/util/intwrite.ts +71 -0
  453. package/src/util/mem.ts +60 -0
  454. package/src/util/nalu.ts +297 -0
  455. package/src/util/ntp.ts +32 -0
  456. package/src/util/pcm.ts +161 -0
  457. package/src/util/pixel.ts +381 -0
  458. package/src/util/rational.ts +152 -0
  459. package/src/util/sample.ts +136 -0
  460. package/src/util/serialize.ts +268 -0
  461. package/dist/cjs/AVStream.d.ts +0 -577
  462. package/dist/cjs/audiosamplefmt.d.ts +0 -248
  463. package/dist/cjs/avformat.d.ts +0 -66
  464. package/dist/cjs/codec.d.ts +0 -927
  465. package/dist/cjs/codecs/aac.d.ts +0 -121
  466. package/dist/cjs/codecs/ac3.d.ts +0 -72
  467. package/dist/cjs/codecs/av1.d.ts +0 -75
  468. package/dist/cjs/codecs/dts.d.ts +0 -17
  469. package/dist/cjs/codecs/flac.d.ts +0 -46
  470. package/dist/cjs/codecs/h264.d.ts +0 -188
  471. package/dist/cjs/codecs/hevc.d.ts +0 -220
  472. package/dist/cjs/codecs/mp3.d.ts +0 -17
  473. package/dist/cjs/codecs/mpeg4.d.ts +0 -7
  474. package/dist/cjs/codecs/mpegvideo.d.ts +0 -7
  475. package/dist/cjs/codecs/opus.d.ts +0 -26
  476. package/dist/cjs/codecs/ttml.d.ts +0 -9
  477. package/dist/cjs/codecs/ttml.js +0 -87
  478. package/dist/cjs/codecs/vp8.d.ts +0 -31
  479. package/dist/cjs/codecs/vp9.d.ts +0 -45
  480. package/dist/cjs/codecs/vvc.d.ts +0 -235
  481. package/dist/cjs/constant.d.ts +0 -36
  482. package/dist/cjs/enum.d.ts +0 -3285
  483. package/dist/cjs/error.d.ts +0 -10
  484. package/dist/cjs/function/analyzeAVFormat.d.ts +0 -3
  485. package/dist/cjs/function/analyzeUrlIOLoader.d.ts +0 -7
  486. package/dist/cjs/function/analyzeUrlIOLoader.js +0 -101
  487. package/dist/cjs/function/audioData2AVFrame.d.ts +0 -2
  488. package/dist/cjs/function/avPCMBuffer2AVFrame.d.ts +0 -3
  489. package/dist/cjs/function/avframe2AudioData.d.ts +0 -2
  490. package/dist/cjs/function/avframe2VideoFrame.d.ts +0 -5
  491. package/dist/cjs/function/avframe2VideoFrame.js +0 -146
  492. package/dist/cjs/function/avpacket2EncodedAudioChunk.d.ts +0 -2
  493. package/dist/cjs/function/avpacket2EncodedVideoChunk.d.ts +0 -2
  494. package/dist/cjs/function/compileResource.d.ts +0 -2
  495. package/dist/cjs/function/compileResource.js +0 -53
  496. package/dist/cjs/function/encodedAudioChunk2AVPacket.d.ts +0 -2
  497. package/dist/cjs/function/encodedAudioChunk2AVPacket.js +0 -23
  498. package/dist/cjs/function/encodedVideoChunk2AVPacket.d.ts +0 -7
  499. package/dist/cjs/function/getAudioCodec.d.ts +0 -2
  500. package/dist/cjs/function/getHardwarePreference.d.ts +0 -1
  501. package/dist/cjs/function/getHardwarePreference.js +0 -16
  502. package/dist/cjs/function/getVideoCodec.d.ts +0 -2
  503. package/dist/cjs/function/getWasmUrl.d.ts +0 -2
  504. package/dist/cjs/function/hasAlphaChannel.d.ts +0 -2
  505. package/dist/cjs/function/isHdr.d.ts +0 -2
  506. package/dist/cjs/function/videoFrame2AVFrame.d.ts +0 -7
  507. package/dist/cjs/function/videoFrame2AVFrame.js +0 -113
  508. package/dist/cjs/implement/AVFramePoolImpl.d.ts +0 -11
  509. package/dist/cjs/implement/AVFramePoolImpl.js +0 -59
  510. package/dist/cjs/implement/AVPCMBufferPoolImpl.d.ts +0 -11
  511. package/dist/cjs/implement/AVPCMBufferPoolImpl.js +0 -57
  512. package/dist/cjs/implement/AVPacketPoolImpl.d.ts +0 -11
  513. package/dist/cjs/implement/AVPacketPoolImpl.js +0 -60
  514. package/dist/cjs/pixelFormatDescriptor.d.ts +0 -100
  515. package/dist/cjs/pixfmt.d.ts +0 -1293
  516. package/dist/cjs/sampleFormatDescriptor.d.ts +0 -6
  517. package/dist/cjs/stringEnum.d.ts +0 -161
  518. package/dist/cjs/struct/audiosample.d.ts +0 -64
  519. package/dist/cjs/struct/avbuffer.d.ts +0 -85
  520. package/dist/cjs/struct/avcodecparameters.d.ts +0 -181
  521. package/dist/cjs/struct/avdict.d.ts +0 -17
  522. package/dist/cjs/struct/avframe.d.ts +0 -559
  523. package/dist/cjs/struct/avpacket.d.ts +0 -124
  524. package/dist/cjs/struct/avpcmbuffer.d.ts +0 -49
  525. package/dist/cjs/struct/avsubtitle.d.ts +0 -30
  526. package/dist/cjs/struct/encryption.d.ts +0 -137
  527. package/dist/cjs/struct/rational.d.ts +0 -15
  528. package/dist/cjs/struct/rational.js +0 -43
  529. package/dist/cjs/util/amf.d.ts +0 -10
  530. package/dist/cjs/util/av1syntax.d.ts +0 -9
  531. package/dist/cjs/util/avbuffer.d.ts +0 -18
  532. package/dist/cjs/util/avbuffer.js +0 -153
  533. package/dist/cjs/util/avdict.d.ts +0 -9
  534. package/dist/cjs/util/avdict.js +0 -111
  535. package/dist/cjs/util/avframe.d.ts +0 -21
  536. package/dist/cjs/util/avpacket.d.ts +0 -24
  537. package/dist/cjs/util/channel.d.ts +0 -5
  538. package/dist/cjs/util/codecparameters.d.ts +0 -4
  539. package/dist/cjs/util/codecparameters.js +0 -70
  540. package/dist/cjs/util/common.d.ts +0 -3
  541. package/dist/cjs/util/crypto.d.ts +0 -1
  542. package/dist/cjs/util/crypto.js +0 -8
  543. package/dist/cjs/util/crypto.js.map +0 -1
  544. package/dist/cjs/util/encryption.d.ts +0 -6
  545. package/dist/cjs/util/expgolomb.d.ts +0 -26
  546. package/dist/cjs/util/intread.d.ts +0 -9
  547. package/dist/cjs/util/intwrite.d.ts +0 -9
  548. package/dist/cjs/util/mem.d.ts +0 -5
  549. package/dist/cjs/util/mem.js +0 -54
  550. package/dist/cjs/util/nalu.d.ts +0 -32
  551. package/dist/cjs/util/ntp.d.ts +0 -1
  552. package/dist/cjs/util/pcm.d.ts +0 -4
  553. package/dist/cjs/util/pixel.d.ts +0 -11
  554. package/dist/cjs/util/rational.d.ts +0 -58
  555. package/dist/cjs/util/sample.d.ts +0 -7
  556. package/dist/cjs/util/serialize.d.ts +0 -63
  557. package/dist/esm/util/crypto.d.ts +0 -1
  558. package/dist/esm/util/crypto.js +0 -4
  559. package/dist/esm/util/crypto.js.map +0 -1
  560. /package/dist/cjs/{audiosamplefmt.js → audiosamplefmt.cjs} +0 -0
  561. /package/dist/cjs/{avformat.js → avformat.cjs} +0 -0
  562. /package/dist/cjs/{codec.js → codec.cjs} +0 -0
  563. /package/dist/cjs/{error.js → error.cjs} +0 -0
  564. /package/dist/cjs/function/{analyzeAVFormat.js → analyzeAVFormat.cjs} +0 -0
  565. /package/dist/cjs/{pixfmt.js → pixfmt.cjs} +0 -0
  566. /package/dist/cjs/{sampleFormatDescriptor.js → sampleFormatDescriptor.cjs} +0 -0
  567. /package/dist/cjs/struct/{avsubtitle.js → avsubtitle.cjs} +0 -0
  568. /package/dist/cjs/util/{av1syntax.js → av1syntax.cjs} +0 -0
  569. /package/dist/cjs/util/{common.js → common.cjs} +0 -0
  570. /package/dist/cjs/util/{expgolomb.js → expgolomb.cjs} +0 -0
  571. /package/dist/cjs/util/{ntp.js → ntp.cjs} +0 -0
  572. /package/dist/cjs/util/{pcm.js → pcm.cjs} +0 -0
@@ -0,0 +1,1049 @@
1
+ /*
2
+ * libmedia hevc util
3
+ *
4
+ * 版权所有 (C) 2024 赵高兴
5
+ * Copyright (C) 2024 Gaoxing Zhao
6
+ *
7
+ * 此文件是 libmedia 的一部分
8
+ * This file is part of libmedia.
9
+ *
10
+ * libmedia 是自由软件;您可以根据 GNU Lesser General Public License(GNU LGPL)3.1
11
+ * 或任何其更新的版本条款重新分发或修改它
12
+ * libmedia is free software; you can redistribute it and/or
13
+ * modify it under the terms of the GNU Lesser General Public
14
+ * License as published by the Free Software Foundation; either
15
+ * version 3.1 of the License, or (at your option) any later version.
16
+ *
17
+ * libmedia 希望能够为您提供帮助,但不提供任何明示或暗示的担保,包括但不限于适销性或特定用途的保证
18
+ * 您应自行承担使用 libmedia 的风险,并且需要遵守 GNU Lesser General Public License 中的条款和条件。
19
+ * libmedia is distributed in the hope that it will be useful,
20
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
21
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22
+ * Lesser General Public License for more details.
23
+ *
24
+ */
25
+
26
+ import type AVPacket from '../struct/avpacket'
27
+ import { AVPacketFlags } from '../struct/avpacket'
28
+ import { AVPacketSideDataType } from '../codec'
29
+ import * as naluUtil from '../util/nalu'
30
+ import { avMalloc } from '../util/mem'
31
+ import * as expgolomb from '../util/expgolomb'
32
+ import * as intread from '../util/intread'
33
+ import * as intwrite from '../util/intwrite'
34
+ import { AVPixelFormat } from '../pixfmt'
35
+ import type AVCodecParameters from '../struct/avcodecparameters'
36
+
37
+ import {
38
+ mapUint8Array
39
+ } from '@libmedia/cheap'
40
+
41
+ import {
42
+ type Data,
43
+ array
44
+ } from '@libmedia/common'
45
+
46
+ import {
47
+ BitReader,
48
+ BufferReader,
49
+ BufferWriter,
50
+ type Uint8ArrayInterface
51
+ } from '@libmedia/common/io'
52
+
53
+ export const HEVC_MAX_DPB_FRAMES = 16
54
+
55
+ export const enum HEVCProfile {
56
+ Main = 1,
57
+ Main10,
58
+ MainStillPicture,
59
+ Main444
60
+ }
61
+
62
+ export const HEVCProfile2Name: Record<HEVCProfile, string> = {
63
+ [HEVCProfile.Main]: 'Main',
64
+ [HEVCProfile.Main10]: 'Main10',
65
+ [HEVCProfile.MainStillPicture]: 'MainStillPicture',
66
+ [HEVCProfile.Main444]: 'Main444'
67
+ }
68
+
69
+ export const LevelCapabilities = [
70
+ { level: 10, maxLumaSamplesPerSecond: 552960, maxLumaPictureSize: 36864, maxBitRate: { main: 128, main10: 150 } },
71
+ { level: 20, maxLumaSamplesPerSecond: 3686400, maxLumaPictureSize: 122880, maxBitRate: { main: 1500, main10: 1875 } },
72
+ { level: 21, maxLumaSamplesPerSecond: 7372800, maxLumaPictureSize: 245760, maxBitRate: { main: 3000, main10: 3750 } },
73
+ { level: 30, maxLumaSamplesPerSecond: 16588800, maxLumaPictureSize: 552960, maxBitRate: { main: 6000, main10: 7500 } },
74
+ { level: 31, maxLumaSamplesPerSecond: 33177600, maxLumaPictureSize: 983040, maxBitRate: { main: 10000, main10: 12500 } },
75
+ { level: 40, maxLumaSamplesPerSecond: 66846720, maxLumaPictureSize: 2228224, maxBitRate: { main: 12000, main10: 15000 } },
76
+ { level: 41, maxLumaSamplesPerSecond: 133693440, maxLumaPictureSize: 2228224, maxBitRate: { main: 20000, main10: 25000 } },
77
+ { level: 50, maxLumaSamplesPerSecond: 267386880, maxLumaPictureSize: 8912896, maxBitRate: { main: 25000, main10: 40000 } },
78
+ { level: 51, maxLumaSamplesPerSecond: 534773760, maxLumaPictureSize: 8912896, maxBitRate: { main: 40000, main10: 60000 } },
79
+ { level: 52, maxLumaSamplesPerSecond: 1069547520, maxLumaPictureSize: 35651584, maxBitRate: { main: 60000, main10: 100000 } },
80
+ { level: 60, maxLumaSamplesPerSecond: 1069547520, maxLumaPictureSize: 35651584, maxBitRate: { main: 60000, main10: 100000 } },
81
+ { level: 61, maxLumaSamplesPerSecond: 2139095040, maxLumaPictureSize: 89128960, maxBitRate: { main: 120000, main10: 240000 } },
82
+ { level: 62, maxLumaSamplesPerSecond: 4278190080, maxLumaPictureSize: 356515840, maxBitRate: { main: 240000, main10: 480000 } }
83
+ ]
84
+
85
+ export function getLevelByResolution(profile: number, width: number, height: number, fps: number, bitrate: number) {
86
+
87
+ bitrate /= 1000
88
+
89
+ const selectedProfile = profile === HEVCProfile.Main ? 'main' : 'main10'
90
+ const lumaSamplesPerSecond = width * height * fps
91
+ for (const level of LevelCapabilities) {
92
+ if (lumaSamplesPerSecond <= level.maxLumaSamplesPerSecond && width * height <= level.maxLumaPictureSize && bitrate <= level.maxBitRate[selectedProfile]) {
93
+ return level.level
94
+ }
95
+ }
96
+ }
97
+
98
+ const NALULengthSizeMinusOne = 3
99
+
100
+ export const enum HEVCNaluType {
101
+ kSliceTRAIL_N = 0,
102
+ kSliceTRAIL_R = 1,
103
+ kSliceTSA_N = 2,
104
+ kSliceTSA_R = 3,
105
+ kSliceSTSA_N = 4,
106
+ kSliceSTSA_R = 5,
107
+ kSliceRADL_N = 6,
108
+ kSliceRADL_R = 7,
109
+ kSliceRASL_N = 8,
110
+ kSliceRASL_R = 9,
111
+ kSliceBLA_W_LP = 16,
112
+ kSliceBLA_W_RADL = 17,
113
+ kSliceBLA_N_LP = 18,
114
+ kSliceIDR_W_RADL = 19,
115
+ kSliceIDR_N_LP = 20,
116
+ kSliceCRA_NUT = 21,
117
+ kSliceVPS = 32,
118
+ kSliceSPS = 33,
119
+ kSlicePPS = 34,
120
+ kSliceAUD = 35,
121
+ kSliceEOS_NUT = 36,
122
+ kSliceEOB_NUT = 37,
123
+ kSliceFD_NUT = 38,
124
+ kSliceSEI_PREFIX = 39,
125
+ kSliceSEI_SUFFIX = 40
126
+ }
127
+
128
+
129
+ export const enum HEVCSliceType {
130
+ kSliceNone = -1,
131
+ kSliceB = 0,
132
+ kSliceP = 1,
133
+ kSliceI = 2
134
+ }
135
+
136
+ /**
137
+ *
138
+ * avcc 格式的 extradata 转 annexb vps sps pps
139
+ *
140
+ * bits
141
+ * - 8 configurationVersion( 固定 1)
142
+ * - 2 general_profile_space
143
+ * - 1 general_tier_flag
144
+ * - 5 general_profile_idc
145
+ * - 32 general_profile_compatibility_flags
146
+ * - 48 general_constraint_indicator_flags (6 个 字节)
147
+ * - 8 general_level_idc
148
+ * - 4 reserved1 (1111)
149
+ * - 4 min_spatial_segmentation_idc_L
150
+ * - 8 min_spatial_segmentation_idc_H
151
+ * - 6 reserved2 (111111)
152
+ * - 2 parallelismType
153
+ * - 6 reserved3 (111111)
154
+ * - 2 chromaFormat
155
+ * - 5 reserved4 (11111)
156
+ * - 3 bitDepthLumaMinus8
157
+ * - 5 reserved5(11111)
158
+ * - 3 bitDepthChromaMinus8
159
+ * - 16 avgFrameRate
160
+ * - 2 constantFrameRate
161
+ * - 3 numTemporalLayers
162
+ * - 1 temporalIdNested
163
+ * - 2 lengthSizeMinusOne
164
+ * - 8 numOfArrays
165
+ * - repeated of array (vps/sps/pps)
166
+ * - 1 array_completeness
167
+ * - 1 reserved (0)
168
+ * - 6 NAL_unit_type
169
+ * - 16 numNalus
170
+ * - repeated once per NAL
171
+ * - 16 nalUnitLength
172
+ * - N NALU data
173
+ *
174
+ */
175
+ export function extradata2VpsSpsPps(extradata: Uint8ArrayInterface) {
176
+ const bufferReader = new BufferReader(extradata, true)
177
+ bufferReader.skip(22)
178
+
179
+ let vpss: Uint8ArrayInterface[] = []
180
+ let spss: Uint8ArrayInterface[] = []
181
+ let ppss: Uint8ArrayInterface[] = []
182
+
183
+ const arrayLen = bufferReader.readUint8()
184
+
185
+ for (let i = 0; i < arrayLen; i++) {
186
+ const naluType = bufferReader.readUint8() & 0x3f
187
+ const count = bufferReader.readUint16()
188
+ const list = []
189
+
190
+ for (let j = 0; j < count; j++) {
191
+ const len = bufferReader.readUint16()
192
+ list.push(bufferReader.readBuffer(len))
193
+ }
194
+
195
+ if (naluType === HEVCNaluType.kSliceVPS) {
196
+ vpss = list
197
+ }
198
+ else if (naluType === HEVCNaluType.kSliceSPS) {
199
+ spss = list
200
+ }
201
+ else if (naluType === HEVCNaluType.kSlicePPS) {
202
+ ppss = list
203
+ }
204
+ }
205
+
206
+ return {
207
+ vpss,
208
+ spss,
209
+ ppss
210
+ }
211
+ }
212
+
213
+ /**
214
+ * annexb vps sps pps 转 avcc 格式的 extradata
215
+ *
216
+ * @param vpss
217
+ * @param spss
218
+ * @param ppss
219
+ * @returns
220
+ */
221
+ export function vpsSpsPps2Extradata(vpss: Uint8ArrayInterface[], spss: Uint8ArrayInterface[], ppss: Uint8ArrayInterface[]) {
222
+
223
+ const sps = spss[0]
224
+
225
+ let length = 23
226
+
227
+
228
+ if (vpss.length) {
229
+ // type + count
230
+ length += 3
231
+ length = vpss.reduce((prev, value) => {
232
+ // length + data
233
+ return prev + 2 + value.length
234
+ }, length)
235
+ }
236
+
237
+ if (spss.length) {
238
+ // type + count
239
+ length += 3
240
+ length = spss.reduce((prev, value) => {
241
+ // length + data
242
+ return prev + 2 + value.length
243
+ }, length)
244
+ }
245
+
246
+ if (ppss.length) {
247
+ // type + count
248
+ length += 3
249
+ length = ppss.reduce((prev, value) => {
250
+ // length + data
251
+ return prev + 2 + value.length
252
+ }, length)
253
+ }
254
+
255
+ const buffer = new Uint8Array(length)
256
+ const bufferWriter = new BufferWriter(buffer, true)
257
+ const spsData = parseSPS(sps)
258
+
259
+ bufferWriter.writeUint8(0x01)
260
+ bufferWriter.writeUint8(sps[1])
261
+ bufferWriter.writeUint8(sps[2])
262
+ bufferWriter.writeUint8(sps[3])
263
+ bufferWriter.writeUint8(sps[4])
264
+ bufferWriter.writeUint8(sps[5])
265
+
266
+ // general_constraint_indicator_flags
267
+ bufferWriter.writeUint8(sps[6])
268
+ bufferWriter.writeUint8(sps[7])
269
+ bufferWriter.writeUint8(sps[8])
270
+ bufferWriter.writeUint8(sps[9])
271
+ bufferWriter.writeUint8(sps[10])
272
+ bufferWriter.writeUint8(sps[11])
273
+
274
+ bufferWriter.writeUint8(spsData.level)
275
+
276
+ // min_spatial_segmentation_idc
277
+ bufferWriter.writeUint8((0xff << 2) | 0)
278
+ bufferWriter.writeUint8(0)
279
+
280
+ // parallelismType
281
+ bufferWriter.writeUint8((0xff << 6) | 0)
282
+
283
+ // chromaFormat
284
+ bufferWriter.writeUint8((0xff << 6) | spsData.chroma_format_idc)
285
+
286
+ // bitDepthLumaMinus8
287
+ bufferWriter.writeUint8((0xff << 5) | spsData.bit_depth_luma_minus8)
288
+
289
+ // bitDepthChromaMinus8
290
+ bufferWriter.writeUint8((0xff << 5) | spsData.bit_depth_chroma_minus8)
291
+
292
+ // avgFrameRate
293
+ bufferWriter.writeUint16(0)
294
+
295
+ // constantFrameRate numTemporalLayers temporalIdNested lengthSizeMinusOne
296
+ bufferWriter.writeUint8((0 << 6) | (1 << 3) | ((sps[0] & 0x01) << 2) | NALULengthSizeMinusOne)
297
+
298
+ // numOfArrays
299
+ let numOfArrays = 0
300
+ if (vpss.length) {
301
+ numOfArrays++
302
+ }
303
+ if (spss.length) {
304
+ numOfArrays++
305
+ }
306
+ if (ppss.length) {
307
+ numOfArrays++
308
+ }
309
+ bufferWriter.writeUint8(numOfArrays)
310
+
311
+ // vps
312
+ if (vpss.length) {
313
+ bufferWriter.writeUint8((1 << 7) | HEVCNaluType.kSliceVPS)
314
+ bufferWriter.writeUint16(vpss.length)
315
+ array.each(vpss, (vps) => {
316
+ bufferWriter.writeUint16(vps.length)
317
+ bufferWriter.writeBuffer(vps)
318
+ })
319
+ }
320
+
321
+ // sps
322
+ if (spss.length) {
323
+ bufferWriter.writeUint8((1 << 7) | HEVCNaluType.kSliceSPS)
324
+ bufferWriter.writeUint16(spss.length)
325
+ array.each(spss, (sps) => {
326
+ bufferWriter.writeUint16(sps.length)
327
+ bufferWriter.writeBuffer(sps)
328
+ })
329
+ }
330
+
331
+ // pps
332
+ if (ppss.length) {
333
+ bufferWriter.writeUint8((1 << 7) | HEVCNaluType.kSlicePPS)
334
+ bufferWriter.writeUint16(ppss.length)
335
+ array.each(ppss, (pps) => {
336
+ bufferWriter.writeUint16(pps.length)
337
+ bufferWriter.writeBuffer(pps)
338
+ })
339
+ }
340
+
341
+ return buffer
342
+ }
343
+
344
+ /**
345
+ * annexb extradata 转 avcc extradata
346
+ *
347
+ * @param data
348
+ * @returns
349
+ */
350
+ export function annexbExtradata2AvccExtradata(data: Uint8ArrayInterface) {
351
+ let nalus = naluUtil.splitNaluByStartCode(data)
352
+
353
+ if (nalus.length >= 2) {
354
+ const vpss: Uint8ArrayInterface[] = []
355
+ const spss: Uint8ArrayInterface[] = []
356
+ const ppss: Uint8ArrayInterface[] = []
357
+
358
+ nalus.forEach((nalu) => {
359
+ const type = (nalu[0] >>> 1) & 0x3f
360
+ if (type === HEVCNaluType.kSliceVPS) {
361
+ vpss.push(nalu)
362
+ }
363
+ else if (type === HEVCNaluType.kSliceSPS) {
364
+ spss.push(nalu)
365
+ }
366
+ else if (type === HEVCNaluType.kSlicePPS) {
367
+ ppss.push(nalu)
368
+ }
369
+ })
370
+
371
+ if (spss.length && ppss.length) {
372
+ return vpsSpsPps2Extradata(vpss, spss, ppss)
373
+ }
374
+ }
375
+ }
376
+
377
+ /**
378
+ * 从 annexb 码流里面生成 annexb extradata
379
+ *
380
+ * 提取出 vps、 sps 和 pps
381
+ *
382
+ * @param data
383
+ * @returns
384
+ */
385
+ export function generateAnnexbExtradata(data: Uint8ArrayInterface) {
386
+ let nalus = naluUtil.splitNaluByStartCode(data)
387
+
388
+ if (nalus.length >= 2) {
389
+ const vpss: Uint8ArrayInterface[] = []
390
+ const spss: Uint8ArrayInterface[] = []
391
+ const ppss: Uint8ArrayInterface[] = []
392
+
393
+ nalus.forEach((nalu) => {
394
+ const type = (nalu[0] >>> 1) & 0x3f
395
+ if (type === HEVCNaluType.kSliceVPS) {
396
+ vpss.push(nalu)
397
+ }
398
+ else if (type === HEVCNaluType.kSliceSPS) {
399
+ spss.push(nalu)
400
+ }
401
+ else if (type === HEVCNaluType.kSlicePPS) {
402
+ ppss.push(nalu)
403
+ }
404
+ })
405
+
406
+ if (spss.length && ppss.length) {
407
+ const nalus = [spss[0], ppss[0]]
408
+ if (vpss.length) {
409
+ nalus.unshift(vpss[0])
410
+ }
411
+ return naluUtil.joinNaluByStartCode(nalus, 0)
412
+ }
413
+ }
414
+ }
415
+
416
+ /**
417
+ *
418
+ * annexb 格式的 NALU 转 avcc NALU
419
+ *
420
+ * 需要保证 data 是 safe 的
421
+ *
422
+ */
423
+ export function annexb2Avcc(data: Uint8ArrayInterface, reverseSps: boolean = false) {
424
+
425
+ let extradata: Uint8Array
426
+ let key: boolean = false
427
+
428
+ let nalus = naluUtil.splitNaluByStartCode(data)
429
+
430
+ if (nalus.length) {
431
+ const vpss: Uint8ArrayInterface[] = []
432
+ const spss: Uint8ArrayInterface[] = []
433
+ const ppss: Uint8ArrayInterface[] = []
434
+
435
+ nalus.forEach((nalu) => {
436
+ const type = (nalu[0] >>> 1) & 0x3f
437
+ if (type === HEVCNaluType.kSliceVPS) {
438
+ vpss.push(nalu)
439
+ }
440
+ else if (type === HEVCNaluType.kSliceSPS) {
441
+ spss.push(nalu)
442
+ }
443
+ else if (type === HEVCNaluType.kSlicePPS) {
444
+ ppss.push(nalu)
445
+ }
446
+ if (type === HEVCNaluType.kSliceIDR_W_RADL
447
+ || type === HEVCNaluType.kSliceIDR_N_LP
448
+ || type === HEVCNaluType.kSliceCRA_NUT
449
+ ) {
450
+ key = true
451
+ }
452
+ })
453
+ if (spss.length && ppss.length) {
454
+ extradata = vpsSpsPps2Extradata(vpss, spss, ppss)
455
+ nalus = nalus.filter((nalu) => {
456
+ const type = (nalu[0] >>> 1) & 0x3f
457
+ return reverseSps
458
+ ? type !== HEVCNaluType.kSliceAUD
459
+ : (type !== HEVCNaluType.kSliceVPS
460
+ && type !== HEVCNaluType.kSliceSPS
461
+ && type !== HEVCNaluType.kSlicePPS
462
+ && type !== HEVCNaluType.kSliceAUD)
463
+ })
464
+ }
465
+ else {
466
+ nalus = nalus.filter((nalu) => {
467
+ const type = (nalu[0] >>> 1) & 0x3f
468
+ return type !== HEVCNaluType.kSliceAUD
469
+ })
470
+ }
471
+ }
472
+
473
+ const length = nalus.reduce((prev, nalu) => {
474
+ return prev + NALULengthSizeMinusOne + 1 + nalu.length
475
+ }, 0)
476
+
477
+ const bufferPointer: pointer<uint8> = avMalloc(length)
478
+ const buffer = mapUint8Array(bufferPointer, length)
479
+
480
+ naluUtil.joinNaluByLength(nalus, NALULengthSizeMinusOne, buffer)
481
+
482
+ return {
483
+ bufferPointer,
484
+ length,
485
+ extradata,
486
+ key
487
+ }
488
+ }
489
+
490
+ /**
491
+ *
492
+ * 需要保证 data 是 safe 的
493
+ *
494
+ * @param vpss
495
+ * @param spss
496
+ * @param ppss
497
+ * @param nalus
498
+ * @returns
499
+ */
500
+ export function nalus2Annexb(
501
+ vpss: Uint8ArrayInterface[],
502
+ spss: Uint8ArrayInterface[],
503
+ ppss: Uint8ArrayInterface[],
504
+ nalus: Uint8ArrayInterface[]
505
+ ) {
506
+ const lengths = [
507
+ naluUtil.joinNaluByStartCodeLength(vpss, 0),
508
+ naluUtil.joinNaluByStartCodeLength(spss, 0),
509
+ naluUtil.joinNaluByStartCodeLength(ppss, 0),
510
+ naluUtil.joinNaluByStartCodeLength(nalus, 2)
511
+ ]
512
+
513
+ let length = lengths.reduce((prev, length) => {
514
+ return prev + length
515
+ }, 0)
516
+
517
+ const bufferPointer: pointer<uint8> = avMalloc(length + 7)
518
+ let offset = bufferPointer
519
+
520
+ // AUD
521
+ intwrite.w8(offset++, 0)
522
+ intwrite.w8(offset++, 0)
523
+ intwrite.w8(offset++, 0)
524
+ intwrite.w8(offset++, 1)
525
+ intwrite.w8(offset++, HEVCNaluType.kSliceAUD << 1)
526
+ intwrite.w8(offset++, 0x01)
527
+ intwrite.w8(offset++, 0x50)
528
+
529
+ if (vpss.length) {
530
+ naluUtil.joinNaluByStartCode(vpss, 0, mapUint8Array(offset, lengths[0]))
531
+ offset = reinterpret_cast<pointer<uint8>>(offset + lengths[0])
532
+ }
533
+ if (spss.length) {
534
+ naluUtil.joinNaluByStartCode(spss, 0, mapUint8Array(offset, lengths[1]))
535
+ offset = reinterpret_cast<pointer<uint8>>(offset + lengths[1])
536
+ }
537
+ if (ppss.length) {
538
+ naluUtil.joinNaluByStartCode(ppss, 0, mapUint8Array(offset, lengths[2]))
539
+ offset = reinterpret_cast<pointer<uint8>>(offset + lengths[2])
540
+ }
541
+ if (nalus.length) {
542
+ naluUtil.joinNaluByStartCode(nalus, 2, mapUint8Array(offset, lengths[3]))
543
+ }
544
+
545
+ return {
546
+ bufferPointer,
547
+ length: length + 7
548
+ }
549
+ }
550
+
551
+ /**
552
+ * annexb 添加 sps pps
553
+ *
554
+ * @param data
555
+ * @param extradata
556
+ */
557
+ export function annexbAddExtradata(data: Uint8ArrayInterface, extradata: Uint8ArrayInterface) {
558
+ let nalus = naluUtil.splitNaluByStartCode(data).concat(naluUtil.splitNaluByStartCode(extradata))
559
+ if (nalus.length) {
560
+ let vpss: Uint8ArrayInterface[] = []
561
+ let spss: Uint8ArrayInterface[] = []
562
+ let ppss: Uint8ArrayInterface[] = []
563
+ let others: Uint8ArrayInterface[] = []
564
+
565
+ nalus.forEach((nalu) => {
566
+ const type = (nalu[0] >>> 1) & 0x3f
567
+ if (type === HEVCNaluType.kSliceVPS) {
568
+ vpss.push(nalu)
569
+ }
570
+ else if (type === HEVCNaluType.kSliceSPS) {
571
+ spss.push(nalu)
572
+ }
573
+ else if (type === HEVCNaluType.kSlicePPS) {
574
+ ppss.push(nalu)
575
+ }
576
+ else if (type !== HEVCNaluType.kSliceAUD) {
577
+ others.push(nalu)
578
+ }
579
+ })
580
+ return nalus2Annexb(vpss, spss, ppss, others)
581
+ }
582
+ }
583
+
584
+ /**
585
+ * avcc 格式的 NALU 转 annexb NALU
586
+ *
587
+ * 需要保证 data 是 safe 的
588
+ *
589
+ */
590
+ export function avcc2Annexb(
591
+ data: Uint8ArrayInterface,
592
+ extradata?: Uint8ArrayInterface,
593
+ naluLengthSizeMinusOne: int32 = NALULengthSizeMinusOne
594
+ ) {
595
+ if (extradata) {
596
+ naluLengthSizeMinusOne = extradata[21] & 0x03
597
+ }
598
+
599
+ let vpss: Uint8ArrayInterface[] = []
600
+ let spss: Uint8ArrayInterface[] = []
601
+ let ppss: Uint8ArrayInterface[] = []
602
+ let key = false
603
+
604
+ if (extradata) {
605
+ const result = extradata2VpsSpsPps(extradata)
606
+ vpss = result.vpss
607
+ spss = result.spss
608
+ ppss = result.ppss
609
+ key = true
610
+ }
611
+
612
+ const nalus = naluUtil.splitNaluByLength(data, naluLengthSizeMinusOne).filter((nalu) => {
613
+ const type = (nalu[0] >>> 1) & 0x3f
614
+ return type !== HEVCNaluType.kSliceAUD
615
+ })
616
+ const others: Uint8ArrayInterface[] = []
617
+ nalus.forEach((nalu) => {
618
+ const naluType = (nalu[0] >>> 1) & 0x3f
619
+ if (naluType === HEVCNaluType.kSliceSPS && !spss.length) {
620
+ spss.push(nalu)
621
+ }
622
+ else if (naluType === HEVCNaluType.kSlicePPS && !ppss.length) {
623
+ ppss.push(nalu)
624
+ }
625
+ else if (naluType !== HEVCNaluType.kSliceAUD) {
626
+ others.push(nalu)
627
+ }
628
+ if (naluType === HEVCNaluType.kSliceIDR_W_RADL
629
+ || naluType === HEVCNaluType.kSliceIDR_N_LP
630
+ ) {
631
+ key = true
632
+ }
633
+ })
634
+
635
+ return {
636
+ ...nalus2Annexb(vpss, spss, ppss, others),
637
+ key
638
+ }
639
+ }
640
+
641
+ /* eslint-disable camelcase */
642
+
643
+ export function parseAVCodecParameters(
644
+ stream: {
645
+ codecpar: AVCodecParameters,
646
+ sideData: Partial<Record<AVPacketSideDataType, Uint8Array>>,
647
+ metadata: Data
648
+ },
649
+ extradata?: Uint8ArrayInterface
650
+ ) {
651
+ if (!extradata && stream.sideData[AVPacketSideDataType.AV_PKT_DATA_NEW_EXTRADATA]) {
652
+ extradata = stream.sideData[AVPacketSideDataType.AV_PKT_DATA_NEW_EXTRADATA]
653
+ }
654
+ let sps: Uint8ArrayInterface
655
+ if (extradata && naluUtil.isAnnexb(extradata)) {
656
+ array.each(naluUtil.splitNaluByStartCode(extradata), (nalu) => {
657
+ const type = (nalu[0] >>> 1) & 0x3f
658
+ if (type === HEVCNaluType.kSliceSPS) {
659
+ sps = nalu
660
+ return false
661
+ }
662
+ })
663
+ }
664
+ else if (extradata && extradata.length >= 6) {
665
+ const { spss } = extradata2VpsSpsPps(extradata)
666
+ if (spss.length) {
667
+ sps = spss[0]
668
+ }
669
+ }
670
+ if (sps) {
671
+ const { profile, level, width, height, video_delay, chroma_format_idc, bit_depth_luma_minus8 } = parseSPS(sps)
672
+ stream.codecpar.profile = profile
673
+ stream.codecpar.level = level
674
+ stream.codecpar.width = width
675
+ stream.codecpar.height = height
676
+ stream.codecpar.videoDelay = video_delay
677
+
678
+ switch (bit_depth_luma_minus8) {
679
+ case 0:
680
+ if (chroma_format_idc === 3) {
681
+ stream.codecpar.format = AVPixelFormat.AV_PIX_FMT_YUV444P
682
+ }
683
+ else if (chroma_format_idc === 2) {
684
+ stream.codecpar.format = AVPixelFormat.AV_PIX_FMT_YUV422P
685
+ }
686
+ else {
687
+ stream.codecpar.format = AVPixelFormat.AV_PIX_FMT_YUV420P
688
+ }
689
+ break
690
+ case 2:
691
+ if (chroma_format_idc === 3) {
692
+ stream.codecpar.format = AVPixelFormat.AV_PIX_FMT_YUV444P10LE
693
+ }
694
+ else if (chroma_format_idc === 2) {
695
+ stream.codecpar.format = AVPixelFormat.AV_PIX_FMT_YUV422P10LE
696
+ }
697
+ else {
698
+ stream.codecpar.format = AVPixelFormat.AV_PIX_FMT_YUV420P10LE
699
+ }
700
+ break
701
+ }
702
+ }
703
+ }
704
+
705
+ export function isIDR(avpacket: pointer<AVPacket>, naluLengthSize: int32 = 4) {
706
+ if (avpacket.flags & AVPacketFlags.AV_PKT_FLAG_H26X_ANNEXB) {
707
+ let nalus = naluUtil.splitNaluByStartCode(mapUint8Array(avpacket.data, reinterpret_cast<size>(avpacket.size)))
708
+ return nalus.some((nalu) => {
709
+ const type = (nalu[0] >>> 1) & 0x3f
710
+ return type === HEVCNaluType.kSliceIDR_N_LP || type === HEVCNaluType.kSliceIDR_W_RADL
711
+ })
712
+ }
713
+ else {
714
+ const size = avpacket.size
715
+ let i = 0
716
+ while (i < (size - naluLengthSize)) {
717
+ const type = (intread.r8(avpacket.data + (i + naluLengthSize)) >>> 1) & 0x3f
718
+ if (type === HEVCNaluType.kSliceIDR_N_LP || type === HEVCNaluType.kSliceIDR_W_RADL) {
719
+ return true
720
+ }
721
+ if (naluLengthSize === 4) {
722
+ i += intread.rb32(avpacket.data + i)
723
+ }
724
+ else if (naluLengthSize === 3) {
725
+ i += intread.rb24(avpacket.data + i)
726
+ }
727
+ else if (naluLengthSize === 2) {
728
+ i += intread.rb16(avpacket.data + i)
729
+ }
730
+ else {
731
+ i += intread.r8(avpacket.data + i)
732
+ }
733
+ i += naluLengthSize
734
+ }
735
+ return false
736
+ }
737
+ }
738
+ export interface HevcSPS {
739
+ profile: number
740
+ level: number
741
+ width: number
742
+ height: number
743
+ chroma_format_idc: number
744
+ bit_depth_luma_minus8: number
745
+ bit_depth_chroma_minus8: number
746
+ general_profile_space: number
747
+ general_tier_flag: number
748
+ general_profile_compatibility_flags: number
749
+ constraint_flags: number
750
+ separate_colour_plane_flag: number
751
+ log2_min_cb_size: number
752
+ log2_diff_max_min_coding_block_size: number
753
+ log2_min_tb_size: number
754
+ log2_diff_max_min_transform_block_size: number
755
+ log2_max_trafo_size: number
756
+ log2_ctb_size: number
757
+ log2_min_pu_size: number
758
+ ctb_width: number
759
+ ctb_height: number
760
+ ctb_size: number
761
+ min_cb_width: number
762
+ min_cb_height: number
763
+ min_tb_width: number
764
+ min_tb_height: number
765
+ min_pu_width: number
766
+ min_pu_height: number
767
+ log2_max_poc_lsb: number
768
+ video_delay: number
769
+ }
770
+
771
+ export function parseSPS(sps: Uint8ArrayInterface): HevcSPS {
772
+
773
+ if (!sps || sps.length < 3) {
774
+ return
775
+ }
776
+
777
+ let offset = 0
778
+ if (sps[0] === 0x00
779
+ && sps[1] === 0x00
780
+ && sps[2] === 0x00
781
+ && sps[3] === 0x01
782
+ ) {
783
+ offset = 4
784
+ }
785
+
786
+ let profile = 0
787
+ let level = 0
788
+ let width = 0
789
+ let height = 0
790
+ let bit_depth_luma_minus8 = 0
791
+ let bit_depth_chroma_minus8 = 0
792
+ let chroma_format_idc = 1
793
+ let general_profile_space = 0
794
+ let general_tier_flag = 0
795
+ let general_profile_compatibility_flags = 0
796
+ let constraint_flags = 0
797
+
798
+ const buffer = naluUtil.naluUnescape(sps.subarray(offset))
799
+ const bitReader = new BitReader(buffer.length)
800
+ bitReader.appendBuffer(buffer)
801
+
802
+ // forbidden_zero_bit
803
+ bitReader.readU1()
804
+
805
+ // nalu type
806
+ bitReader.readU(6)
807
+
808
+ // layerId
809
+ bitReader.readU(6)
810
+
811
+ // tid
812
+ bitReader.readU(3)
813
+
814
+ // sps_video_parameter_set_id
815
+ bitReader.readU(4)
816
+
817
+ // The value of sps_max_sub_layers_minus1 shall be in the range of 0 to 6, inclusive.
818
+ const spsMaxSubLayersMinus1 = bitReader.readU(3)
819
+
820
+ // sps_temporal_id_nesting_flag
821
+ bitReader.readU1()
822
+
823
+ let separate_colour_plane_flag = 0
824
+
825
+ if (spsMaxSubLayersMinus1 <= 6) {
826
+ // profile_tier_level(sps_max_sub_layers_minus1)
827
+
828
+ // general_profile_space
829
+ general_profile_space = bitReader.readU(2)
830
+ // general_tier_flag
831
+ general_tier_flag = bitReader.readU1()
832
+ // general_profile_idc
833
+ profile = bitReader.readU(5)
834
+ // general_profile_compatibility_flag[32]
835
+ general_profile_compatibility_flags = bitReader.readU(32)
836
+
837
+ /**
838
+ * 1 general_progressive_source_flag
839
+ * 1 general_interlaced_source_flag
840
+ * 1 general_non_packed_constraint_flag
841
+ * 1 general_frame_only_constraint_flag
842
+ * 44 general_reserved_zero_44bits
843
+ */
844
+ constraint_flags = bitReader.readU(48)
845
+
846
+ // general_level_idc
847
+ level = bitReader.readU(8)
848
+
849
+ const subLayerProfilePresentFlag = new Array(6)
850
+ const subLayerLevelPresentFlag = new Array(6)
851
+ for (let i = 0; i < spsMaxSubLayersMinus1; i++) {
852
+ subLayerProfilePresentFlag[i] = bitReader.readU1()
853
+ subLayerLevelPresentFlag[i] = bitReader.readU1()
854
+ }
855
+
856
+ if (spsMaxSubLayersMinus1 > 0) {
857
+ for (let i = spsMaxSubLayersMinus1; i < 8; i++) {
858
+ // reserved_zero_2bits
859
+ bitReader.readU(2)
860
+ }
861
+ }
862
+
863
+ for (let i = 0; i < spsMaxSubLayersMinus1; i++) {
864
+ if (subLayerProfilePresentFlag[i]) {
865
+ // sub_layer_profile_space[i]
866
+ bitReader.readU(2)
867
+ // sub_layer_tier_flag[i]
868
+ bitReader.readU(1)
869
+ // sub_layer_profile_idc[i]
870
+ bitReader.readU(5)
871
+ // sub_layer_profile_compatibility_flag[i][32]
872
+ bitReader.readU(32)
873
+ // sub_layer_progressive_source_flag[i]
874
+ bitReader.readU(1)
875
+ // sub_layer_interlaced_source_flag[i]
876
+ bitReader.readU(1)
877
+ // sub_layer_non_packed_constraint_flag[i]
878
+ bitReader.readU(1)
879
+ // sub_layer_frame_only_constraint_flag[i]
880
+ bitReader.readU(1)
881
+ // sub_layer_reserved_zero_44bits[i]
882
+ bitReader.readU(44)
883
+ }
884
+
885
+ if (subLayerLevelPresentFlag[i]) {
886
+ // sub_layer_level_idc[i]
887
+ bitReader.readU(8)
888
+ }
889
+ }
890
+
891
+ // "The value of sps_seq_parameter_set_id shall be in the range of 0 to 15, inclusive."
892
+ expgolomb.readUE(bitReader)
893
+ chroma_format_idc = expgolomb.readUE(bitReader)
894
+
895
+ if (chroma_format_idc === 3) {
896
+ // separate_colour_plane_flag
897
+ separate_colour_plane_flag = bitReader.readU(1)
898
+ }
899
+
900
+ width = expgolomb.readUE(bitReader)
901
+ height = expgolomb.readUE(bitReader)
902
+
903
+ const conformanceWindowFlag = bitReader.readU1()
904
+
905
+ let confWinLeftOffset = 0
906
+ let confWinRightOffset = 0
907
+ let confWinTopOffset = 0
908
+ let confWinBottomOffset = 0
909
+
910
+ if (conformanceWindowFlag) {
911
+ confWinLeftOffset = expgolomb.readUE(bitReader)
912
+ confWinRightOffset = expgolomb.readUE(bitReader)
913
+ confWinTopOffset = expgolomb.readUE(bitReader)
914
+ confWinBottomOffset = expgolomb.readUE(bitReader)
915
+ }
916
+
917
+ bit_depth_luma_minus8 = expgolomb.readUE(bitReader)
918
+ bit_depth_chroma_minus8 = expgolomb.readUE(bitReader)
919
+
920
+
921
+ let SubWidthC = 2
922
+ let SubHeightC = 2
923
+
924
+ if (chroma_format_idc === 0) {
925
+ SubWidthC = SubHeightC = 0
926
+ }
927
+ else if (chroma_format_idc === 2) {
928
+ SubWidthC = 2
929
+ SubHeightC = 1
930
+ }
931
+ else if (chroma_format_idc === 3) {
932
+ SubWidthC = SubHeightC = 1
933
+ }
934
+
935
+ const cropUnitX = SubWidthC * (1 << (bit_depth_luma_minus8 + 1))
936
+ const cropUnitY = SubHeightC * (1 << (bit_depth_luma_minus8 + 1))
937
+
938
+ width -= cropUnitX * (confWinLeftOffset + confWinRightOffset)
939
+ height -= cropUnitY * (confWinTopOffset + confWinBottomOffset)
940
+ }
941
+
942
+ const log2_max_poc_lsb = expgolomb.readUE(bitReader) + 4
943
+
944
+ const sublayer_ordering_info_flag = bitReader.readU1()
945
+ const start = sublayer_ordering_info_flag ? 0 : spsMaxSubLayersMinus1
946
+ let video_delay = 0
947
+ for (let i = start; i < (spsMaxSubLayersMinus1 + 1); i++) {
948
+ // max_dec_pic_buffering
949
+ expgolomb.readUE(bitReader)
950
+ // num_reorder_pics
951
+ video_delay = Math.max(video_delay, Math.min(expgolomb.readUE(bitReader), HEVC_MAX_DPB_FRAMES))
952
+ // max_latency_increase
953
+ expgolomb.readUE(bitReader)
954
+ }
955
+
956
+ const log2_min_cb_size = expgolomb.readUE(bitReader) + 3
957
+ const log2_diff_max_min_coding_block_size = expgolomb.readUE(bitReader)
958
+ const log2_min_tb_size = expgolomb.readUE(bitReader) + 2
959
+ const log2_diff_max_min_transform_block_size = expgolomb.readUE(bitReader)
960
+ const log2_max_trafo_size = log2_diff_max_min_transform_block_size + log2_min_tb_size
961
+
962
+ const log2_ctb_size = log2_min_cb_size + log2_diff_max_min_coding_block_size
963
+ const log2_min_pu_size = log2_min_cb_size - 1
964
+
965
+ const ctb_width = (width + (1 << log2_ctb_size) - 1) >> log2_ctb_size
966
+ const ctb_height = (height + (1 << log2_ctb_size) - 1) >> log2_ctb_size
967
+ const ctb_size = ctb_width * ctb_height
968
+
969
+ const min_cb_width = width >> log2_min_cb_size
970
+ const min_cb_height = height >> log2_min_cb_size
971
+ const min_tb_width = width >> log2_min_tb_size
972
+ const min_tb_height = height >> log2_min_tb_size
973
+ const min_pu_width = width >> log2_min_pu_size
974
+ const min_pu_height = height >> log2_min_pu_size
975
+
976
+ return {
977
+ profile,
978
+ level,
979
+ width,
980
+ height,
981
+ chroma_format_idc,
982
+ bit_depth_luma_minus8,
983
+ bit_depth_chroma_minus8,
984
+ general_profile_space,
985
+ general_tier_flag,
986
+ general_profile_compatibility_flags,
987
+ constraint_flags,
988
+ separate_colour_plane_flag,
989
+ log2_min_cb_size,
990
+ log2_diff_max_min_coding_block_size,
991
+ log2_min_tb_size,
992
+ log2_diff_max_min_transform_block_size,
993
+ log2_max_trafo_size,
994
+ log2_ctb_size,
995
+ log2_min_pu_size,
996
+ ctb_width,
997
+ ctb_height,
998
+ ctb_size,
999
+ min_cb_width,
1000
+ min_cb_height,
1001
+ min_tb_width,
1002
+ min_tb_height,
1003
+ min_pu_width,
1004
+ min_pu_height,
1005
+ log2_max_poc_lsb,
1006
+ video_delay
1007
+ }
1008
+ }
1009
+
1010
+ export interface HevcPPS {
1011
+ pps_pic_parameter_set_id: number
1012
+ pps_seq_parameter_set_id: number
1013
+ dependent_slice_segment_flag: number
1014
+ output_flag_present_flag: number
1015
+ num_extra_slice_header_bits: number
1016
+ }
1017
+
1018
+ export function parsePPS(pps: Uint8ArrayInterface): HevcPPS {
1019
+ if (!pps || pps.length < 3) {
1020
+ return
1021
+ }
1022
+
1023
+ let offset = 0
1024
+ if (pps[0] === 0x00
1025
+ && pps[1] === 0x00
1026
+ && pps[2] === 0x00
1027
+ && pps[3] === 0x01
1028
+ ) {
1029
+ offset = 4
1030
+ }
1031
+
1032
+ const buffer = naluUtil.naluUnescape(pps.subarray(offset))
1033
+ const bitReader = new BitReader(buffer.length)
1034
+ bitReader.appendBuffer(buffer)
1035
+
1036
+ const pps_pic_parameter_set_id = expgolomb.readUE(bitReader)
1037
+ const pps_seq_parameter_set_id = expgolomb.readUE(bitReader)
1038
+ const dependent_slice_segment_flag = bitReader.readU1()
1039
+ const output_flag_present_flag = bitReader.readU1()
1040
+ const num_extra_slice_header_bits = bitReader.readU(3)
1041
+
1042
+ return {
1043
+ pps_pic_parameter_set_id,
1044
+ pps_seq_parameter_set_id,
1045
+ dependent_slice_segment_flag,
1046
+ output_flag_present_flag,
1047
+ num_extra_slice_header_bits
1048
+ }
1049
+ }