@libmedia/avutil 0.12.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (564) 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/codecs/{aac.js → aac.cjs} +2 -8
  4. package/dist/cjs/codecs/aac.js.map +1 -1
  5. package/dist/cjs/codecs/{ac3.js → ac3.cjs} +2 -8
  6. package/dist/cjs/codecs/ac3.js.map +1 -1
  7. package/dist/cjs/codecs/{av1.js → av1.cjs} +6 -10
  8. package/dist/cjs/codecs/av1.js.map +1 -1
  9. package/dist/cjs/codecs/{dts.js → dts.cjs} +3 -9
  10. package/dist/cjs/codecs/dts.js.map +1 -1
  11. package/dist/cjs/codecs/{flac.js → flac.cjs} +2 -8
  12. package/dist/cjs/codecs/flac.js.map +1 -1
  13. package/dist/cjs/codecs/{h264.js → h264.cjs} +20 -23
  14. package/dist/cjs/codecs/h264.js.map +1 -1
  15. package/dist/cjs/codecs/{hevc.js → hevc.cjs} +23 -23
  16. package/dist/cjs/codecs/hevc.js.map +1 -1
  17. package/dist/cjs/codecs/{mp3.js → mp3.cjs} +1 -1
  18. package/dist/cjs/codecs/mp3.js.map +1 -1
  19. package/dist/cjs/codecs/{mpeg4.js → mpeg4.cjs} +1 -1
  20. package/dist/cjs/codecs/mpeg4.js.map +1 -1
  21. package/dist/cjs/codecs/{mpegvideo.js → mpegvideo.cjs} +1 -1
  22. package/dist/cjs/codecs/mpegvideo.js.map +1 -1
  23. package/dist/cjs/codecs/{opus.js → opus.cjs} +3 -9
  24. package/dist/cjs/codecs/opus.js.map +1 -1
  25. package/dist/cjs/codecs/ttml.cjs +51 -0
  26. package/dist/cjs/codecs/ttml.js.map +1 -1
  27. package/dist/cjs/codecs/{vp8.js → vp8.cjs} +2 -8
  28. package/dist/cjs/codecs/vp8.js.map +1 -1
  29. package/dist/cjs/codecs/{vp9.js → vp9.cjs} +4 -10
  30. package/dist/cjs/codecs/vp9.js.map +1 -1
  31. package/dist/cjs/codecs/{vvc.js → vvc.cjs} +25 -25
  32. package/dist/cjs/codecs/vvc.js.map +1 -1
  33. package/dist/cjs/{constant.js → constant.cjs} +6 -7
  34. package/dist/cjs/constant.js.map +1 -1
  35. package/dist/cjs/{enum.js → enum.cjs} +3 -1
  36. package/dist/cjs/enum.js.map +1 -1
  37. package/dist/cjs/error.js.map +1 -1
  38. package/dist/cjs/function/analyzeAVFormat.js.map +1 -1
  39. package/dist/cjs/function/analyzeUrlIOLoader.cjs +66 -0
  40. package/dist/cjs/function/analyzeUrlIOLoader.js.map +1 -1
  41. package/dist/cjs/function/{audioData2AVFrame.js → audioData2AVFrame.cjs} +9 -9
  42. package/dist/cjs/function/audioData2AVFrame.js.map +1 -1
  43. package/dist/cjs/function/{avPCMBuffer2AVFrame.js → avPCMBuffer2AVFrame.cjs} +20 -20
  44. package/dist/cjs/function/avPCMBuffer2AVFrame.js.map +1 -1
  45. package/dist/cjs/function/{avframe2AudioData.js → avframe2AudioData.cjs} +7 -7
  46. package/dist/cjs/function/avframe2AudioData.js.map +1 -1
  47. package/dist/cjs/function/avframe2VideoFrame.cjs +48 -0
  48. package/dist/cjs/function/avframe2VideoFrame.js.map +1 -1
  49. package/dist/cjs/function/{avpacket2EncodedAudioChunk.js → avpacket2EncodedAudioChunk.cjs} +3 -3
  50. package/dist/cjs/function/avpacket2EncodedAudioChunk.js.map +1 -1
  51. package/dist/cjs/function/{avpacket2EncodedVideoChunk.js → avpacket2EncodedVideoChunk.cjs} +3 -3
  52. package/dist/cjs/function/avpacket2EncodedVideoChunk.js.map +1 -1
  53. package/dist/cjs/function/compileResource.cjs +19 -0
  54. package/dist/cjs/function/compileResource.js.map +1 -1
  55. package/dist/cjs/function/constant/webcodecs.cjs +50 -0
  56. package/dist/cjs/function/constant/webcodecs.js.map +1 -0
  57. package/dist/cjs/function/encodedAudioChunk2AVPacket.cjs +23 -0
  58. package/dist/cjs/function/encodedAudioChunk2AVPacket.js.map +1 -1
  59. package/dist/cjs/function/{encodedVideoChunk2AVPacket.js → encodedVideoChunk2AVPacket.cjs} +8 -8
  60. package/dist/cjs/function/encodedVideoChunk2AVPacket.js.map +1 -1
  61. package/dist/cjs/function/{getAudioCodec.js → getAudioCodec.cjs} +1 -1
  62. package/dist/cjs/function/getAudioCodec.js.map +1 -1
  63. package/dist/cjs/function/getAudioMimeType.cjs +19 -0
  64. package/dist/cjs/function/getAudioMimeType.js.map +1 -0
  65. package/dist/cjs/function/getHardwarePreference.cjs +10 -0
  66. package/dist/cjs/function/getHardwarePreference.js.map +1 -1
  67. package/dist/cjs/function/{getVideoCodec.js → getVideoCodec.cjs} +12 -12
  68. package/dist/cjs/function/getVideoCodec.js.map +1 -1
  69. package/dist/cjs/function/getVideoMimeType.cjs +18 -0
  70. package/dist/cjs/function/getVideoMimeType.js.map +1 -0
  71. package/dist/cjs/function/{getWasmUrl.js → getWasmUrl.cjs} +2 -3
  72. package/dist/cjs/function/getWasmUrl.js.map +1 -1
  73. package/dist/cjs/function/{hasAlphaChannel.js → hasAlphaChannel.cjs} +1 -1
  74. package/dist/cjs/function/hasAlphaChannel.js.map +1 -1
  75. package/dist/cjs/function/{isHdr.js → isHdr.cjs} +1 -1
  76. package/dist/cjs/function/isHdr.js.map +1 -1
  77. package/dist/cjs/function/videoFrame2AVFrame.cjs +51 -0
  78. package/dist/cjs/function/videoFrame2AVFrame.js.map +1 -1
  79. package/dist/cjs/implement/AVFramePoolImpl.cjs +28 -0
  80. package/dist/cjs/implement/AVFramePoolImpl.js.map +1 -1
  81. package/dist/cjs/implement/AVPCMBufferPoolImpl.cjs +27 -0
  82. package/dist/cjs/implement/AVPCMBufferPoolImpl.js.map +1 -1
  83. package/dist/cjs/implement/AVPacketPoolImpl.cjs +29 -0
  84. package/dist/cjs/implement/AVPacketPoolImpl.js.map +1 -1
  85. package/dist/cjs/index.cjs +840 -0
  86. package/dist/cjs/index.js.map +1 -0
  87. package/dist/cjs/internal.cjs +283 -0
  88. package/dist/cjs/internal.js.map +1 -0
  89. package/dist/cjs/{pixelFormatDescriptor.js → pixelFormatDescriptor.cjs} +2 -0
  90. package/dist/cjs/pixelFormatDescriptor.js.map +1 -1
  91. package/dist/cjs/pixfmt.js.map +1 -1
  92. package/dist/cjs/sampleFormatDescriptor.js.map +1 -1
  93. package/dist/cjs/{stringEnum.js → stringEnum.cjs} +4 -1
  94. package/dist/cjs/stringEnum.js.map +1 -1
  95. package/dist/cjs/struct/{audiosample.js → audiosample.cjs} +13 -13
  96. package/dist/cjs/struct/audiosample.js.map +1 -1
  97. package/dist/cjs/struct/{avbuffer.js → avbuffer.cjs} +18 -18
  98. package/dist/cjs/struct/avbuffer.js.map +1 -1
  99. package/dist/cjs/struct/{avcodecparameters.js → avcodecparameters.cjs} +11 -11
  100. package/dist/cjs/struct/avcodecparameters.js.map +1 -1
  101. package/dist/cjs/struct/{avdict.js → avdict.cjs} +9 -9
  102. package/dist/cjs/struct/avdict.js.map +1 -1
  103. package/dist/cjs/struct/{avframe.js → avframe.cjs} +30 -30
  104. package/dist/cjs/struct/avframe.js.map +1 -1
  105. package/dist/cjs/struct/{avpacket.js → avpacket.cjs} +19 -19
  106. package/dist/cjs/struct/avpacket.js.map +1 -1
  107. package/dist/cjs/struct/{avpcmbuffer.js → avpcmbuffer.cjs} +9 -9
  108. package/dist/cjs/struct/avpcmbuffer.js.map +1 -1
  109. package/dist/cjs/struct/{encryption.js → encryption.cjs} +13 -13
  110. package/dist/cjs/struct/encryption.js.map +1 -1
  111. package/dist/cjs/struct/rational.cjs +43 -0
  112. package/dist/cjs/struct/rational.js.map +1 -1
  113. package/dist/cjs/util/{amf.js → amf.cjs} +7 -38
  114. package/dist/cjs/util/amf.js.map +1 -1
  115. package/dist/cjs/util/av1syntax.js.map +1 -1
  116. package/dist/cjs/util/avbuffer.cjs +122 -0
  117. package/dist/cjs/util/avbuffer.js.map +1 -1
  118. package/dist/cjs/util/avdict.cjs +75 -0
  119. package/dist/cjs/util/avdict.js.map +1 -1
  120. package/dist/cjs/util/{avframe.js → avframe.cjs} +82 -87
  121. package/dist/cjs/util/avframe.js.map +1 -1
  122. package/dist/cjs/util/{avpacket.js → avpacket.cjs} +58 -58
  123. package/dist/cjs/util/avpacket.js.map +1 -1
  124. package/dist/cjs/util/{channel.js → channel.cjs} +7 -7
  125. package/dist/cjs/util/channel.js.map +1 -1
  126. package/dist/cjs/util/codecparameters.cjs +95 -0
  127. package/dist/cjs/util/codecparameters.js.map +1 -1
  128. package/dist/cjs/util/common.js.map +1 -1
  129. package/dist/cjs/util/{encryption.js → encryption.cjs} +5 -11
  130. package/dist/cjs/util/encryption.js.map +1 -1
  131. package/dist/cjs/util/expgolomb.js.map +1 -1
  132. package/dist/cjs/util/{intread.js → intread.cjs} +1 -1
  133. package/dist/cjs/util/intread.js.map +1 -1
  134. package/dist/cjs/util/{intwrite.js → intwrite.cjs} +1 -1
  135. package/dist/cjs/util/intwrite.js.map +1 -1
  136. package/dist/cjs/util/mem.cjs +23 -0
  137. package/dist/cjs/util/mem.js.map +1 -1
  138. package/dist/cjs/util/{nalu.js → nalu.cjs} +7 -42
  139. package/dist/cjs/util/nalu.js.map +1 -1
  140. package/dist/cjs/util/ntp.js.map +1 -1
  141. package/dist/cjs/util/pcm.js.map +1 -1
  142. package/dist/cjs/util/{pixel.js → pixel.cjs} +26 -30
  143. package/dist/cjs/util/pixel.js.map +1 -1
  144. package/dist/cjs/util/{rational.js → rational.cjs} +5 -11
  145. package/dist/cjs/util/rational.js.map +1 -1
  146. package/dist/cjs/util/{sample.js → sample.cjs} +6 -12
  147. package/dist/cjs/util/sample.js.map +1 -1
  148. package/dist/cjs/util/{serialize.js → serialize.cjs} +40 -42
  149. package/dist/cjs/util/serialize.js.map +1 -1
  150. package/dist/esm/AVStream.d.ts +7 -7
  151. package/dist/esm/AVStream.js +10 -12
  152. package/dist/esm/AVStream.js.map +1 -1
  153. package/dist/esm/codecs/aac.d.ts +10 -5
  154. package/dist/esm/codecs/aac.js +2 -2
  155. package/dist/esm/codecs/aac.js.map +1 -1
  156. package/dist/esm/codecs/ac3.d.ts +1 -1
  157. package/dist/esm/codecs/ac3.js +1 -1
  158. package/dist/esm/codecs/ac3.js.map +1 -1
  159. package/dist/esm/codecs/av1.d.ts +3 -3
  160. package/dist/esm/codecs/av1.js +4 -6
  161. package/dist/esm/codecs/av1.js.map +1 -1
  162. package/dist/esm/codecs/dts.d.ts +1 -1
  163. package/dist/esm/codecs/dts.js +2 -2
  164. package/dist/esm/codecs/dts.js.map +1 -1
  165. package/dist/esm/codecs/flac.d.ts +3 -3
  166. package/dist/esm/codecs/flac.js +1 -1
  167. package/dist/esm/codecs/flac.js.map +1 -1
  168. package/dist/esm/codecs/h264.d.ts +5 -5
  169. package/dist/esm/codecs/h264.js +13 -18
  170. package/dist/esm/codecs/h264.js.map +1 -1
  171. package/dist/esm/codecs/hevc.d.ts +5 -5
  172. package/dist/esm/codecs/hevc.js +16 -15
  173. package/dist/esm/codecs/hevc.js.map +1 -1
  174. package/dist/esm/codecs/mp3.d.ts +4 -4
  175. package/dist/esm/codecs/mp3.js +1 -1
  176. package/dist/esm/codecs/mp3.js.map +1 -1
  177. package/dist/esm/codecs/mpeg4.d.ts +1 -1
  178. package/dist/esm/codecs/mpeg4.js +1 -1
  179. package/dist/esm/codecs/mpeg4.js.map +1 -1
  180. package/dist/esm/codecs/mpegvideo.d.ts +1 -1
  181. package/dist/esm/codecs/mpegvideo.js +1 -1
  182. package/dist/esm/codecs/mpegvideo.js.map +1 -1
  183. package/dist/esm/codecs/opus.d.ts +3 -3
  184. package/dist/esm/codecs/opus.js +2 -4
  185. package/dist/esm/codecs/opus.js.map +1 -1
  186. package/dist/esm/codecs/ttml.js +5 -11
  187. package/dist/esm/codecs/ttml.js.map +1 -1
  188. package/dist/esm/codecs/vp8.d.ts +4 -4
  189. package/dist/esm/codecs/vp8.js +2 -2
  190. package/dist/esm/codecs/vp8.js.map +1 -1
  191. package/dist/esm/codecs/vp9.d.ts +4 -4
  192. package/dist/esm/codecs/vp9.js +8 -10
  193. package/dist/esm/codecs/vp9.js.map +1 -1
  194. package/dist/esm/codecs/vvc.d.ts +5 -5
  195. package/dist/esm/codecs/vvc.js +16 -17
  196. package/dist/esm/codecs/vvc.js.map +1 -1
  197. package/dist/esm/constant.d.ts +5 -7
  198. package/dist/esm/constant.js +5 -9
  199. package/dist/esm/constant.js.map +1 -1
  200. package/dist/esm/enum.d.ts +9 -1
  201. package/dist/esm/enum.js +3 -1
  202. package/dist/esm/enum.js.map +1 -1
  203. package/dist/esm/error.js.map +1 -1
  204. package/dist/esm/function/analyzeAVFormat.d.ts +2 -2
  205. package/dist/esm/function/analyzeAVFormat.js.map +1 -1
  206. package/dist/esm/function/analyzeUrlIOLoader.d.ts +2 -2
  207. package/dist/esm/function/analyzeUrlIOLoader.js +2 -10
  208. package/dist/esm/function/analyzeUrlIOLoader.js.map +1 -1
  209. package/dist/esm/function/audioData2AVFrame.d.ts +1 -1
  210. package/dist/esm/function/audioData2AVFrame.js +6 -6
  211. package/dist/esm/function/audioData2AVFrame.js.map +1 -1
  212. package/dist/esm/function/avPCMBuffer2AVFrame.d.ts +2 -2
  213. package/dist/esm/function/avPCMBuffer2AVFrame.js +9 -9
  214. package/dist/esm/function/avPCMBuffer2AVFrame.js.map +1 -1
  215. package/dist/esm/function/avframe2AudioData.d.ts +1 -1
  216. package/dist/esm/function/avframe2AudioData.js +6 -8
  217. package/dist/esm/function/avframe2AudioData.js.map +1 -1
  218. package/dist/esm/function/avframe2VideoFrame.d.ts +3 -3
  219. package/dist/esm/function/avframe2VideoFrame.js +14 -79
  220. package/dist/esm/function/avframe2VideoFrame.js.map +1 -1
  221. package/dist/esm/function/avpacket2EncodedAudioChunk.d.ts +1 -1
  222. package/dist/esm/function/avpacket2EncodedAudioChunk.js +5 -7
  223. package/dist/esm/function/avpacket2EncodedAudioChunk.js.map +1 -1
  224. package/dist/esm/function/avpacket2EncodedVideoChunk.d.ts +1 -1
  225. package/dist/esm/function/avpacket2EncodedVideoChunk.js +5 -7
  226. package/dist/esm/function/avpacket2EncodedVideoChunk.js.map +1 -1
  227. package/dist/esm/function/compileResource.d.ts +1 -1
  228. package/dist/esm/function/compileResource.js +2 -4
  229. package/dist/esm/function/compileResource.js.map +1 -1
  230. package/dist/esm/function/constant/webcodecs.d.ts +5 -0
  231. package/dist/esm/function/constant/webcodecs.js +51 -0
  232. package/dist/esm/function/constant/webcodecs.js.map +1 -0
  233. package/dist/esm/function/encodedAudioChunk2AVPacket.d.ts +1 -1
  234. package/dist/esm/function/encodedAudioChunk2AVPacket.js +6 -6
  235. package/dist/esm/function/encodedAudioChunk2AVPacket.js.map +1 -1
  236. package/dist/esm/function/encodedVideoChunk2AVPacket.d.ts +1 -1
  237. package/dist/esm/function/encodedVideoChunk2AVPacket.js +7 -7
  238. package/dist/esm/function/encodedVideoChunk2AVPacket.js.map +1 -1
  239. package/dist/esm/function/getAudioCodec.d.ts +1 -1
  240. package/dist/esm/function/getAudioCodec.js +2 -2
  241. package/dist/esm/function/getAudioCodec.js.map +1 -1
  242. package/dist/esm/function/getAudioMimeType.d.ts +2 -0
  243. package/dist/esm/function/getAudioMimeType.js +12 -0
  244. package/dist/esm/function/getAudioMimeType.js.map +1 -0
  245. package/dist/esm/function/getHardwarePreference.js +1 -1
  246. package/dist/esm/function/getHardwarePreference.js.map +1 -1
  247. package/dist/esm/function/getVideoCodec.d.ts +1 -1
  248. package/dist/esm/function/getVideoCodec.js +11 -13
  249. package/dist/esm/function/getVideoCodec.js.map +1 -1
  250. package/dist/esm/function/getVideoMimeType.d.ts +2 -0
  251. package/dist/esm/function/getVideoMimeType.js +8 -0
  252. package/dist/esm/function/getVideoMimeType.js.map +1 -0
  253. package/dist/esm/function/getWasmUrl.d.ts +1 -1
  254. package/dist/esm/function/getWasmUrl.js +2 -2
  255. package/dist/esm/function/getWasmUrl.js.map +1 -1
  256. package/dist/esm/function/hasAlphaChannel.d.ts +1 -1
  257. package/dist/esm/function/hasAlphaChannel.js +2 -2
  258. package/dist/esm/function/hasAlphaChannel.js.map +1 -1
  259. package/dist/esm/function/isHdr.d.ts +1 -1
  260. package/dist/esm/function/isHdr.js +2 -2
  261. package/dist/esm/function/isHdr.js.map +1 -1
  262. package/dist/esm/function/videoFrame2AVFrame.d.ts +6 -6
  263. package/dist/esm/function/videoFrame2AVFrame.js +13 -74
  264. package/dist/esm/function/videoFrame2AVFrame.js.map +1 -1
  265. package/dist/esm/implement/AVFramePoolImpl.d.ts +3 -4
  266. package/dist/esm/implement/AVFramePoolImpl.js +5 -7
  267. package/dist/esm/implement/AVFramePoolImpl.js.map +1 -1
  268. package/dist/esm/implement/AVPCMBufferPoolImpl.d.ts +3 -4
  269. package/dist/esm/implement/AVPCMBufferPoolImpl.js +4 -6
  270. package/dist/esm/implement/AVPCMBufferPoolImpl.js.map +1 -1
  271. package/dist/esm/implement/AVPacketPoolImpl.d.ts +3 -4
  272. package/dist/esm/implement/AVPacketPoolImpl.js +5 -7
  273. package/dist/esm/implement/AVPacketPoolImpl.js.map +1 -1
  274. package/dist/esm/index.d.ts +54 -0
  275. package/dist/esm/index.js +98 -0
  276. package/dist/esm/index.js.map +1 -0
  277. package/dist/esm/internal.d.ts +26 -0
  278. package/dist/esm/internal.js +52 -0
  279. package/dist/esm/internal.js.map +1 -0
  280. package/dist/esm/pixelFormatDescriptor.d.ts +1 -1
  281. package/dist/esm/pixelFormatDescriptor.js +2 -0
  282. package/dist/esm/pixelFormatDescriptor.js.map +1 -1
  283. package/dist/esm/pixfmt.d.ts +9 -1
  284. package/dist/esm/pixfmt.js.map +1 -1
  285. package/dist/esm/sampleFormatDescriptor.d.ts +1 -1
  286. package/dist/esm/sampleFormatDescriptor.js.map +1 -1
  287. package/dist/esm/stringEnum.d.ts +5 -5
  288. package/dist/esm/stringEnum.js +4 -1
  289. package/dist/esm/stringEnum.js.map +1 -1
  290. package/dist/esm/struct/audiosample.d.ts +1 -1
  291. package/dist/esm/struct/audiosample.js +2 -2
  292. package/dist/esm/struct/audiosample.js.map +1 -1
  293. package/dist/esm/struct/avbuffer.d.ts +1 -1
  294. package/dist/esm/struct/avbuffer.js +4 -4
  295. package/dist/esm/struct/avbuffer.js.map +1 -1
  296. package/dist/esm/struct/avcodecparameters.d.ts +9 -9
  297. package/dist/esm/struct/avcodecparameters.js +14 -16
  298. package/dist/esm/struct/avcodecparameters.js.map +1 -1
  299. package/dist/esm/struct/avdict.js +2 -2
  300. package/dist/esm/struct/avdict.js.map +1 -1
  301. package/dist/esm/struct/avframe.d.ts +12 -12
  302. package/dist/esm/struct/avframe.js +18 -22
  303. package/dist/esm/struct/avframe.js.map +1 -1
  304. package/dist/esm/struct/avpacket.d.ts +4 -4
  305. package/dist/esm/struct/avpacket.js +7 -9
  306. package/dist/esm/struct/avpacket.js.map +1 -1
  307. package/dist/esm/struct/avpcmbuffer.d.ts +1 -1
  308. package/dist/esm/struct/avpcmbuffer.js +2 -2
  309. package/dist/esm/struct/avpcmbuffer.js.map +1 -1
  310. package/dist/esm/struct/avsubtitle.d.ts +2 -2
  311. package/dist/esm/struct/encryption.js +2 -2
  312. package/dist/esm/struct/encryption.js.map +1 -1
  313. package/dist/esm/struct/rational.d.ts +1 -1
  314. package/dist/esm/struct/rational.js +4 -4
  315. package/dist/esm/struct/rational.js.map +1 -1
  316. package/dist/esm/util/amf.d.ts +1 -4
  317. package/dist/esm/util/amf.js +1 -5
  318. package/dist/esm/util/amf.js.map +1 -1
  319. package/dist/esm/util/av1syntax.d.ts +1 -1
  320. package/dist/esm/util/av1syntax.js.map +1 -1
  321. package/dist/esm/util/avbuffer.d.ts +2 -2
  322. package/dist/esm/util/avbuffer.js +7 -15
  323. package/dist/esm/util/avbuffer.js.map +1 -1
  324. package/dist/esm/util/avdict.d.ts +2 -2
  325. package/dist/esm/util/avdict.js +12 -16
  326. package/dist/esm/util/avdict.js.map +1 -1
  327. package/dist/esm/util/avframe.d.ts +2 -2
  328. package/dist/esm/util/avframe.js +22 -24
  329. package/dist/esm/util/avframe.js.map +1 -1
  330. package/dist/esm/util/avpacket.d.ts +3 -3
  331. package/dist/esm/util/avpacket.js +11 -13
  332. package/dist/esm/util/avpacket.js.map +1 -1
  333. package/dist/esm/util/channel.d.ts +1 -1
  334. package/dist/esm/util/channel.js +6 -6
  335. package/dist/esm/util/channel.js.map +1 -1
  336. package/dist/esm/util/codecparameters.d.ts +3 -1
  337. package/dist/esm/util/codecparameters.js +16 -12
  338. package/dist/esm/util/codecparameters.js.map +1 -1
  339. package/dist/esm/util/common.js.map +1 -1
  340. package/dist/esm/util/encryption.d.ts +2 -2
  341. package/dist/esm/util/encryption.js +1 -3
  342. package/dist/esm/util/encryption.js.map +1 -1
  343. package/dist/esm/util/expgolomb.d.ts +1 -2
  344. package/dist/esm/util/expgolomb.js.map +1 -1
  345. package/dist/esm/util/intread.js +1 -1
  346. package/dist/esm/util/intread.js.map +1 -1
  347. package/dist/esm/util/intwrite.js +1 -1
  348. package/dist/esm/util/intwrite.js.map +1 -1
  349. package/dist/esm/util/mem.js +7 -7
  350. package/dist/esm/util/mem.js.map +1 -1
  351. package/dist/esm/util/nalu.d.ts +1 -1
  352. package/dist/esm/util/nalu.js +3 -5
  353. package/dist/esm/util/nalu.js.map +1 -1
  354. package/dist/esm/util/ntp.js.map +1 -1
  355. package/dist/esm/util/pcm.d.ts +1 -1
  356. package/dist/esm/util/pcm.js.map +1 -1
  357. package/dist/esm/util/pixel.d.ts +1 -1
  358. package/dist/esm/util/pixel.js +8 -10
  359. package/dist/esm/util/pixel.js.map +1 -1
  360. package/dist/esm/util/rational.d.ts +10 -10
  361. package/dist/esm/util/rational.js +4 -4
  362. package/dist/esm/util/rational.js.map +1 -1
  363. package/dist/esm/util/sample.d.ts +1 -1
  364. package/dist/esm/util/sample.js +7 -7
  365. package/dist/esm/util/sample.js.map +1 -1
  366. package/dist/esm/util/serialize.d.ts +9 -9
  367. package/dist/esm/util/serialize.js +6 -6
  368. package/dist/esm/util/serialize.js.map +1 -1
  369. package/package.json +23 -390
  370. package/src/AVStream.ts +677 -0
  371. package/src/audiosamplefmt.ts +302 -0
  372. package/src/avformat.ts +96 -0
  373. package/src/codec.ts +1016 -0
  374. package/src/codecs/aac.ts +429 -0
  375. package/src/codecs/ac3.ts +309 -0
  376. package/src/codecs/av1.ts +503 -0
  377. package/src/codecs/dts.ts +100 -0
  378. package/src/codecs/flac.ts +118 -0
  379. package/src/codecs/h264.ts +1013 -0
  380. package/src/codecs/hevc.ts +1049 -0
  381. package/src/codecs/mp3.ts +172 -0
  382. package/src/codecs/mpeg4.ts +37 -0
  383. package/src/codecs/mpegvideo.ts +49 -0
  384. package/src/codecs/opus.ts +148 -0
  385. package/src/codecs/ttml.ts +158 -0
  386. package/src/codecs/vp8.ts +91 -0
  387. package/src/codecs/vp9.ts +213 -0
  388. package/src/codecs/vvc.ts +1086 -0
  389. package/src/constant.ts +72 -0
  390. package/src/enum.ts +47 -0
  391. package/src/error.ts +45 -0
  392. package/src/function/analyzeAVFormat.ts +94 -0
  393. package/src/function/analyzeUrlIOLoader.ts +166 -0
  394. package/src/function/audioData2AVFrame.ts +82 -0
  395. package/src/function/avPCMBuffer2AVFrame.ts +111 -0
  396. package/src/function/avframe2AudioData.ts +131 -0
  397. package/src/function/avframe2VideoFrame.ts +88 -0
  398. package/src/function/avpacket2EncodedAudioChunk.ts +39 -0
  399. package/src/function/avpacket2EncodedVideoChunk.ts +39 -0
  400. package/src/function/compileResource.ts +57 -0
  401. package/src/function/constant/webcodecs.ts +81 -0
  402. package/src/function/encodedAudioChunk2AVPacket.ts +62 -0
  403. package/src/function/encodedVideoChunk2AVPacket.ts +86 -0
  404. package/src/function/getAudioCodec.ts +45 -0
  405. package/src/function/getAudioMimeType.ts +44 -0
  406. package/src/function/getHardwarePreference.ts +45 -0
  407. package/src/function/getVideoCodec.ts +244 -0
  408. package/src/function/getVideoMimeType.ts +35 -0
  409. package/src/function/getWasmUrl.ts +190 -0
  410. package/src/function/hasAlphaChannel.ts +37 -0
  411. package/src/function/isHdr.ts +44 -0
  412. package/src/function/videoFrame2AVFrame.ts +95 -0
  413. package/src/implement/AVFramePoolImpl.ts +83 -0
  414. package/src/implement/AVPCMBufferPoolImpl.ts +79 -0
  415. package/src/implement/AVPacketPoolImpl.ts +82 -0
  416. package/src/index.ts +264 -0
  417. package/src/internal.ts +71 -0
  418. package/src/pixelFormatDescriptor.ts +819 -0
  419. package/src/pixfmt.ts +1400 -0
  420. package/src/sampleFormatDescriptor.ts +57 -0
  421. package/src/stringEnum.ts +366 -0
  422. package/src/struct/audiosample.ts +95 -0
  423. package/src/struct/avbuffer.ts +139 -0
  424. package/src/struct/avcodecparameters.ts +243 -0
  425. package/src/struct/avdict.ts +44 -0
  426. package/src/struct/avframe.ts +663 -0
  427. package/src/struct/avpacket.ts +178 -0
  428. package/src/struct/avpcmbuffer.ts +77 -0
  429. package/src/struct/avsubtitle.ts +59 -0
  430. package/src/struct/encryption.ts +180 -0
  431. package/src/struct/rational.ts +43 -0
  432. package/src/util/amf.ts +178 -0
  433. package/src/util/av1syntax.ts +112 -0
  434. package/src/util/avbuffer.ts +294 -0
  435. package/src/util/avdict.ts +171 -0
  436. package/src/util/avframe.ts +520 -0
  437. package/src/util/avpacket.ts +313 -0
  438. package/src/util/channel.ts +66 -0
  439. package/src/util/codecparameters.ts +148 -0
  440. package/src/util/common.ts +42 -0
  441. package/src/util/encryption.ts +154 -0
  442. package/src/util/expgolomb.ts +170 -0
  443. package/src/util/intread.ts +60 -0
  444. package/src/util/intwrite.ts +71 -0
  445. package/src/util/mem.ts +60 -0
  446. package/src/util/nalu.ts +297 -0
  447. package/src/util/ntp.ts +32 -0
  448. package/src/util/pcm.ts +161 -0
  449. package/src/util/pixel.ts +381 -0
  450. package/src/util/rational.ts +152 -0
  451. package/src/util/sample.ts +136 -0
  452. package/src/util/serialize.ts +268 -0
  453. package/dist/cjs/AVStream.d.ts +0 -577
  454. package/dist/cjs/audiosamplefmt.d.ts +0 -248
  455. package/dist/cjs/avformat.d.ts +0 -66
  456. package/dist/cjs/codec.d.ts +0 -927
  457. package/dist/cjs/codecs/aac.d.ts +0 -121
  458. package/dist/cjs/codecs/ac3.d.ts +0 -72
  459. package/dist/cjs/codecs/av1.d.ts +0 -75
  460. package/dist/cjs/codecs/dts.d.ts +0 -17
  461. package/dist/cjs/codecs/flac.d.ts +0 -46
  462. package/dist/cjs/codecs/h264.d.ts +0 -188
  463. package/dist/cjs/codecs/hevc.d.ts +0 -220
  464. package/dist/cjs/codecs/mp3.d.ts +0 -17
  465. package/dist/cjs/codecs/mpeg4.d.ts +0 -7
  466. package/dist/cjs/codecs/mpegvideo.d.ts +0 -7
  467. package/dist/cjs/codecs/opus.d.ts +0 -26
  468. package/dist/cjs/codecs/ttml.d.ts +0 -9
  469. package/dist/cjs/codecs/ttml.js +0 -87
  470. package/dist/cjs/codecs/vp8.d.ts +0 -31
  471. package/dist/cjs/codecs/vp9.d.ts +0 -45
  472. package/dist/cjs/codecs/vvc.d.ts +0 -235
  473. package/dist/cjs/constant.d.ts +0 -36
  474. package/dist/cjs/enum.d.ts +0 -3285
  475. package/dist/cjs/error.d.ts +0 -10
  476. package/dist/cjs/function/analyzeAVFormat.d.ts +0 -3
  477. package/dist/cjs/function/analyzeUrlIOLoader.d.ts +0 -7
  478. package/dist/cjs/function/analyzeUrlIOLoader.js +0 -101
  479. package/dist/cjs/function/audioData2AVFrame.d.ts +0 -2
  480. package/dist/cjs/function/avPCMBuffer2AVFrame.d.ts +0 -3
  481. package/dist/cjs/function/avframe2AudioData.d.ts +0 -2
  482. package/dist/cjs/function/avframe2VideoFrame.d.ts +0 -5
  483. package/dist/cjs/function/avframe2VideoFrame.js +0 -146
  484. package/dist/cjs/function/avpacket2EncodedAudioChunk.d.ts +0 -2
  485. package/dist/cjs/function/avpacket2EncodedVideoChunk.d.ts +0 -2
  486. package/dist/cjs/function/compileResource.d.ts +0 -2
  487. package/dist/cjs/function/compileResource.js +0 -53
  488. package/dist/cjs/function/encodedAudioChunk2AVPacket.d.ts +0 -2
  489. package/dist/cjs/function/encodedAudioChunk2AVPacket.js +0 -23
  490. package/dist/cjs/function/encodedVideoChunk2AVPacket.d.ts +0 -7
  491. package/dist/cjs/function/getAudioCodec.d.ts +0 -2
  492. package/dist/cjs/function/getHardwarePreference.d.ts +0 -1
  493. package/dist/cjs/function/getHardwarePreference.js +0 -16
  494. package/dist/cjs/function/getVideoCodec.d.ts +0 -2
  495. package/dist/cjs/function/getWasmUrl.d.ts +0 -2
  496. package/dist/cjs/function/hasAlphaChannel.d.ts +0 -2
  497. package/dist/cjs/function/isHdr.d.ts +0 -2
  498. package/dist/cjs/function/videoFrame2AVFrame.d.ts +0 -7
  499. package/dist/cjs/function/videoFrame2AVFrame.js +0 -113
  500. package/dist/cjs/implement/AVFramePoolImpl.d.ts +0 -11
  501. package/dist/cjs/implement/AVFramePoolImpl.js +0 -59
  502. package/dist/cjs/implement/AVPCMBufferPoolImpl.d.ts +0 -11
  503. package/dist/cjs/implement/AVPCMBufferPoolImpl.js +0 -57
  504. package/dist/cjs/implement/AVPacketPoolImpl.d.ts +0 -11
  505. package/dist/cjs/implement/AVPacketPoolImpl.js +0 -60
  506. package/dist/cjs/pixelFormatDescriptor.d.ts +0 -100
  507. package/dist/cjs/pixfmt.d.ts +0 -1293
  508. package/dist/cjs/sampleFormatDescriptor.d.ts +0 -6
  509. package/dist/cjs/stringEnum.d.ts +0 -161
  510. package/dist/cjs/struct/audiosample.d.ts +0 -64
  511. package/dist/cjs/struct/avbuffer.d.ts +0 -85
  512. package/dist/cjs/struct/avcodecparameters.d.ts +0 -181
  513. package/dist/cjs/struct/avdict.d.ts +0 -17
  514. package/dist/cjs/struct/avframe.d.ts +0 -559
  515. package/dist/cjs/struct/avpacket.d.ts +0 -124
  516. package/dist/cjs/struct/avpcmbuffer.d.ts +0 -49
  517. package/dist/cjs/struct/avsubtitle.d.ts +0 -30
  518. package/dist/cjs/struct/encryption.d.ts +0 -137
  519. package/dist/cjs/struct/rational.d.ts +0 -15
  520. package/dist/cjs/struct/rational.js +0 -43
  521. package/dist/cjs/util/amf.d.ts +0 -10
  522. package/dist/cjs/util/av1syntax.d.ts +0 -9
  523. package/dist/cjs/util/avbuffer.d.ts +0 -18
  524. package/dist/cjs/util/avbuffer.js +0 -153
  525. package/dist/cjs/util/avdict.d.ts +0 -9
  526. package/dist/cjs/util/avdict.js +0 -111
  527. package/dist/cjs/util/avframe.d.ts +0 -21
  528. package/dist/cjs/util/avpacket.d.ts +0 -24
  529. package/dist/cjs/util/channel.d.ts +0 -5
  530. package/dist/cjs/util/codecparameters.d.ts +0 -4
  531. package/dist/cjs/util/codecparameters.js +0 -70
  532. package/dist/cjs/util/common.d.ts +0 -3
  533. package/dist/cjs/util/crypto.d.ts +0 -1
  534. package/dist/cjs/util/crypto.js +0 -8
  535. package/dist/cjs/util/crypto.js.map +0 -1
  536. package/dist/cjs/util/encryption.d.ts +0 -6
  537. package/dist/cjs/util/expgolomb.d.ts +0 -26
  538. package/dist/cjs/util/intread.d.ts +0 -9
  539. package/dist/cjs/util/intwrite.d.ts +0 -9
  540. package/dist/cjs/util/mem.d.ts +0 -5
  541. package/dist/cjs/util/mem.js +0 -54
  542. package/dist/cjs/util/nalu.d.ts +0 -32
  543. package/dist/cjs/util/ntp.d.ts +0 -1
  544. package/dist/cjs/util/pcm.d.ts +0 -4
  545. package/dist/cjs/util/pixel.d.ts +0 -11
  546. package/dist/cjs/util/rational.d.ts +0 -58
  547. package/dist/cjs/util/sample.d.ts +0 -7
  548. package/dist/cjs/util/serialize.d.ts +0 -63
  549. package/dist/esm/util/crypto.d.ts +0 -1
  550. package/dist/esm/util/crypto.js +0 -4
  551. package/dist/esm/util/crypto.js.map +0 -1
  552. /package/dist/cjs/{audiosamplefmt.js → audiosamplefmt.cjs} +0 -0
  553. /package/dist/cjs/{avformat.js → avformat.cjs} +0 -0
  554. /package/dist/cjs/{codec.js → codec.cjs} +0 -0
  555. /package/dist/cjs/{error.js → error.cjs} +0 -0
  556. /package/dist/cjs/function/{analyzeAVFormat.js → analyzeAVFormat.cjs} +0 -0
  557. /package/dist/cjs/{pixfmt.js → pixfmt.cjs} +0 -0
  558. /package/dist/cjs/{sampleFormatDescriptor.js → sampleFormatDescriptor.cjs} +0 -0
  559. /package/dist/cjs/struct/{avsubtitle.js → avsubtitle.cjs} +0 -0
  560. /package/dist/cjs/util/{av1syntax.js → av1syntax.cjs} +0 -0
  561. /package/dist/cjs/util/{common.js → common.cjs} +0 -0
  562. /package/dist/cjs/util/{expgolomb.js → expgolomb.cjs} +0 -0
  563. /package/dist/cjs/util/{ntp.js → ntp.cjs} +0 -0
  564. /package/dist/cjs/util/{pcm.js → pcm.cjs} +0 -0
@@ -0,0 +1,1013 @@
1
+ /*
2
+ * libmedia h264 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
+ logger
45
+ } from '@libmedia/common'
46
+
47
+ import {
48
+ BitReader,
49
+ BufferReader,
50
+ BufferWriter,
51
+ type Uint8ArrayInterface
52
+ } from '@libmedia/common/io'
53
+
54
+ export const H264_MAX_DPB_FRAMES = 16
55
+
56
+ export const NALULengthSizeMinusOne = 3
57
+
58
+ export const enum PictureType {
59
+ I = 1,
60
+ P,
61
+ B,
62
+ SPS,
63
+ PPS,
64
+ SEI
65
+ }
66
+
67
+ export const enum H264NaluType {
68
+ kUnspecified = 0,
69
+ kSliceNonIDR,
70
+ kSliceDPA,
71
+ kSliceDPB,
72
+ kSliceDPC,
73
+ kSliceIDR,
74
+ kSliceSEI,
75
+ kSliceSPS,
76
+ kSlicePPS,
77
+ kSliceAUD,
78
+ kEndOfSequence,
79
+ kEndOfStream,
80
+ kFiller,
81
+ kSPSExt,
82
+ kReserved0
83
+ }
84
+
85
+ export const enum H264SliceType {
86
+ kSliceNone = -1,
87
+ kSliceP,
88
+ kSliceB,
89
+ kSliceI,
90
+ kSliceSP = 5,
91
+ kSliceSB,
92
+ kSliceSI
93
+ }
94
+
95
+ export const enum H264Profile {
96
+ kBaseline = 66,
97
+ kMain = 77,
98
+ kHigh = 100,
99
+ kConstrained = kBaseline,
100
+ kHigh10 = 110,
101
+ kHigh422 = 122,
102
+ kHigh444 = 244
103
+ }
104
+
105
+ export const H264Profile2Name: Record<H264Profile, string> = {
106
+ [H264Profile.kBaseline]: 'Constrained Baseline',
107
+ [H264Profile.kMain]: 'Main',
108
+ [H264Profile.kHigh]: 'High',
109
+ [H264Profile.kHigh10]: 'High10',
110
+ [H264Profile.kHigh422]: 'High422',
111
+ [H264Profile.kHigh444]: 'High444'
112
+ }
113
+
114
+ export const LevelCapabilities = [
115
+ { level: 10, maxResolution: 25344, maxFrameRate: 15 },
116
+ { level: 11, maxResolution: 25344, maxFrameRate: 30 },
117
+ { level: 12, maxResolution: 101376, maxFrameRate: 30 },
118
+ { level: 13, maxResolution: 101376, maxFrameRate: 30 },
119
+ { level: 20, maxResolution: 101376, maxFrameRate: 30 },
120
+ { level: 21, maxResolution: 202752, maxFrameRate: 30 },
121
+ { level: 22, maxResolution: 414720, maxFrameRate: 30 },
122
+ { level: 30, maxResolution: 414720, maxFrameRate: 30 },
123
+ { level: 31, maxResolution: 921600, maxFrameRate: 30 },
124
+ { level: 32, maxResolution: 1310720, maxFrameRate: 60 },
125
+ { level: 40, maxResolution: 2097152, maxFrameRate: 30 },
126
+ { level: 41, maxResolution: 2097152, maxFrameRate: 60 },
127
+ { level: 42, maxResolution: 2228224, maxFrameRate: 60 },
128
+ { level: 50, maxResolution: 8912896, maxFrameRate: 30 },
129
+ { level: 51, maxResolution: 8912896, maxFrameRate: 60 },
130
+ { level: 52, maxResolution: 8912896, maxFrameRate: 120 },
131
+ { level: 60, maxResolution: 35651584, maxFrameRate: 30 },
132
+ { level: 61, maxResolution: 35651584, maxFrameRate: 60 },
133
+ { level: 62, maxResolution: 35651584, maxFrameRate: 120 }
134
+ ]
135
+
136
+ export function getLevelByResolution(width: number, height: number, fps: number) {
137
+ const resolution = width * height
138
+ for (const level of LevelCapabilities) {
139
+ if (resolution <= level.maxResolution && fps <= level.maxFrameRate) {
140
+ return level.level
141
+ }
142
+ }
143
+ }
144
+
145
+ /**
146
+ *
147
+ * avcc 格式的 extradata 转 annexb sps pps
148
+ *
149
+ * bits
150
+ * - 8 version ( always 0x01 )
151
+ * - 8 avc profile ( sps[0][1] )
152
+ * - 8 avc compatibility ( sps[0][2] )
153
+ * - 8 avc level ( sps[0][3] )
154
+ * - 6 reserved ( all bits on )
155
+ * - 2 NALULengthSizeMinusOne
156
+ * - 3 reserved ( all bits on )
157
+ * - 5 number of SPS NALUs (usually 1)
158
+ * - repeated once per SPS:
159
+ * - 16 SPS size
160
+ * - variable SPS NALU data
161
+ * - 8 number of PPS NALUs (usually 1)
162
+ * - repeated once per PPS:
163
+ * - 16 PPS size
164
+ * - variable PPS NALU data
165
+ *
166
+ * - ext (profile !== 66 && profile !== 77 && profile !== 88)
167
+ * - 6 reserved ( all bits on )
168
+ * - 2 chroma_format_idc
169
+ * - 5 reserved ( all bits on )
170
+ * - 3 bit_depth_luma_minus8
171
+ * - 5 reserved ( all bits on )
172
+ * - 3 bit_depth_chroma_minus8
173
+ * - 8 number of SPS_EXT NALUs
174
+ * - 16 SPS_EXT size
175
+ * - variable SPS_EXT NALU data
176
+ *
177
+ */
178
+ export function extradata2SpsPps(extradata: Uint8ArrayInterface) {
179
+ const bufferReader = new BufferReader(extradata)
180
+ bufferReader.skip(5)
181
+
182
+ const spss: Uint8ArrayInterface[] = []
183
+ const ppss: Uint8ArrayInterface[] = []
184
+ const spsExts: Uint8ArrayInterface[] = []
185
+
186
+ const spsLength = bufferReader.readUint8() & 0x1f
187
+ for (let i = 0; i < spsLength; i++) {
188
+ const length = bufferReader.readUint16()
189
+ spss.push(bufferReader.readBuffer(length))
190
+ }
191
+
192
+ const ppsLength = bufferReader.readUint8()
193
+ for (let i = 0; i < ppsLength; i++) {
194
+ const length = bufferReader.readUint16()
195
+ ppss.push(bufferReader.readBuffer(length))
196
+ }
197
+
198
+ if (bufferReader.remainingSize() > 4) {
199
+ bufferReader.skip(3)
200
+ const spsExtLength = bufferReader.readUint8()
201
+ if (spsExtLength > 0) {
202
+ for (let i = 0; i < spsExtLength; i++) {
203
+ const length = bufferReader.readUint16()
204
+ spsExts.push(bufferReader.readBuffer(length))
205
+ }
206
+ }
207
+ }
208
+
209
+ return {
210
+ spss,
211
+ ppss,
212
+ spsExts
213
+ }
214
+ }
215
+
216
+ /**
217
+ * annexb sps pps 转 avcc 格式的 extradata
218
+ *
219
+ * @param spss
220
+ * @param ppss
221
+ * @param spsExts
222
+ * @returns
223
+ */
224
+ export function spsPps2Extradata(spss: Uint8ArrayInterface[], ppss: Uint8ArrayInterface[], spsExts: Uint8ArrayInterface[] = []) {
225
+
226
+ if (spss.length > 32) {
227
+ logger.warn(`h264 metadata\'s sps max length is 32, but get ${spss.length}`)
228
+ spss = spss.slice(0, 32)
229
+ }
230
+ if (spss.length > 256) {
231
+ logger.warn(`h264 metadata\'s pps max length is 256, but get ${spss.length}`)
232
+ spss = spss.slice(0, 256)
233
+ }
234
+
235
+ let length = 7
236
+ length = spss.reduce((prev, sps) => {
237
+ return prev + 2 + sps.length
238
+ }, length)
239
+ length = ppss.reduce((prev, pps) => {
240
+ return prev + 2 + pps.length
241
+ }, length)
242
+
243
+ const sps = spss[0]
244
+
245
+ const params = parseSPS(sps)
246
+
247
+ if (params.profile !== 66 && params.profile !== 77 && params.profile !== 88) {
248
+ length += 4
249
+
250
+ if (spsExts.length) {
251
+ length = spsExts.reduce((prev, ext) => {
252
+ return prev + 2 + ext.length
253
+ }, length)
254
+ }
255
+ }
256
+
257
+ const buffer = new Uint8Array(length)
258
+ const bufferWriter = new BufferWriter(buffer)
259
+
260
+ bufferWriter.writeUint8(0x01)
261
+ bufferWriter.writeUint8(sps[1])
262
+ bufferWriter.writeUint8(sps[2])
263
+ bufferWriter.writeUint8(sps[3])
264
+ bufferWriter.writeUint8(0xfc | NALULengthSizeMinusOne)
265
+
266
+ // sps
267
+ bufferWriter.writeUint8(0xe0 | (spss.length & 0x1f))
268
+ array.each(spss, (sps) => {
269
+ bufferWriter.writeUint16(sps.length)
270
+ bufferWriter.writeBuffer(sps)
271
+ })
272
+
273
+ // pps
274
+ bufferWriter.writeUint8(ppss.length)
275
+ array.each(ppss, (pps) => {
276
+ bufferWriter.writeUint16(pps.length)
277
+ bufferWriter.writeBuffer(pps)
278
+ })
279
+
280
+ if (params.profile !== 66 && params.profile !== 77 && params.profile !== 88) {
281
+ bufferWriter.writeUint8(0xfc | params.chromaFormatIdc)
282
+ bufferWriter.writeUint8(0xf8 | params.bitDepthLumaMinus8)
283
+ bufferWriter.writeUint8(0xf8 | params.bitDepthChromaMinus8)
284
+
285
+ if (spsExts.length) {
286
+ array.each(spsExts, (ext) => {
287
+ bufferWriter.writeUint16(ext.length)
288
+ bufferWriter.writeBuffer(ext)
289
+ })
290
+ }
291
+ }
292
+
293
+ return buffer
294
+ }
295
+
296
+ /**
297
+ * annexb extradata 转 avcc extradata
298
+ *
299
+ * @param data
300
+ * @returns
301
+ */
302
+ export function annexbExtradata2AvccExtradata(data: Uint8ArrayInterface) {
303
+ let nalus = naluUtil.splitNaluByStartCode(data)
304
+ if (nalus.length > 1) {
305
+ const spss: Uint8ArrayInterface[] = []
306
+ const ppss: Uint8ArrayInterface[] = []
307
+ const spsExts: Uint8ArrayInterface[] = []
308
+
309
+ nalus.forEach((nalu) => {
310
+ const type = nalu[0] & 0x1f
311
+ if (type === H264NaluType.kSliceSPS) {
312
+ spss.push(nalu)
313
+ }
314
+ else if (type === H264NaluType.kSlicePPS) {
315
+ ppss.push(nalu)
316
+ }
317
+ else if (type === H264NaluType.kSPSExt) {
318
+ spsExts.push(nalu)
319
+ }
320
+ })
321
+ if (spss.length && ppss.length) {
322
+ return spsPps2Extradata(spss, ppss, spsExts)
323
+ }
324
+ }
325
+ }
326
+
327
+ /**
328
+ * 从 annexb 码流里面生成 annexb extradata
329
+ *
330
+ * 提取出 sps 和 pps
331
+ *
332
+ * @param data
333
+ * @returns
334
+ */
335
+ export function generateAnnexbExtradata(data: Uint8ArrayInterface) {
336
+ let nalus = naluUtil.splitNaluByStartCode(data)
337
+ if (nalus.length > 1) {
338
+ const spss: Uint8ArrayInterface[] = []
339
+ const ppss: Uint8ArrayInterface[] = []
340
+ const spsExts: Uint8ArrayInterface[] = []
341
+
342
+ nalus.forEach((nalu) => {
343
+ const type = nalu[0] & 0x1f
344
+ if (type === H264NaluType.kSliceSPS) {
345
+ spss.push(nalu)
346
+ }
347
+ else if (type === H264NaluType.kSlicePPS) {
348
+ ppss.push(nalu)
349
+ }
350
+ else if (type === H264NaluType.kSPSExt) {
351
+ spsExts.push(nalu)
352
+ }
353
+ })
354
+ if (spss.length && ppss.length) {
355
+ const nalus = [spss[0], ppss[0]]
356
+ if (spsExts.length) {
357
+ nalus.push(spsExts[0])
358
+ }
359
+ return naluUtil.joinNaluByStartCode(nalus, 0)
360
+ }
361
+ }
362
+ }
363
+
364
+ /**
365
+ *
366
+ * annexb 格式的 NALU 转 avcc NALU
367
+ *
368
+ * 需要保证 data 是 safe 的
369
+ */
370
+ export function annexb2Avcc(data: Uint8ArrayInterface, reverseSps: boolean = false) {
371
+
372
+ let nalus = naluUtil.splitNaluByStartCode(data)
373
+ let extradata: Uint8Array
374
+ let key: boolean = false
375
+
376
+ if (nalus.length) {
377
+ const spss: Uint8ArrayInterface[] = []
378
+ const ppss: Uint8ArrayInterface[] = []
379
+ const spsExts: Uint8ArrayInterface[] = []
380
+
381
+ nalus.forEach((nalu) => {
382
+ const type = nalu[0] & 0x1f
383
+ if (type === H264NaluType.kSliceSPS) {
384
+ spss.push(nalu)
385
+ }
386
+ else if (type === H264NaluType.kSlicePPS) {
387
+ ppss.push(nalu)
388
+ }
389
+ else if (type === H264NaluType.kSPSExt) {
390
+ spsExts.push(nalu)
391
+ }
392
+ else if (type === H264NaluType.kSliceIDR) {
393
+ key = true
394
+ }
395
+ })
396
+
397
+ if (spss.length && ppss.length) {
398
+ extradata = spsPps2Extradata(spss, ppss, spsExts)
399
+ nalus = nalus.filter((nalu) => {
400
+ const type = nalu[0] & 0x1f
401
+ return reverseSps
402
+ ? type !== H264NaluType.kSliceAUD
403
+ : (type !== H264NaluType.kSliceAUD
404
+ && type !== H264NaluType.kSlicePPS
405
+ && type !== H264NaluType.kSliceSPS
406
+ && type !== H264NaluType.kSPSExt)
407
+ })
408
+ }
409
+ else {
410
+ nalus = nalus.filter((nalu) => {
411
+ const type = nalu[0] & 0x1f
412
+ return type !== H264NaluType.kSliceAUD
413
+ })
414
+ }
415
+ }
416
+
417
+ const length = nalus.reduce((prev, nalu) => {
418
+ return prev + NALULengthSizeMinusOne + 1 + nalu.length
419
+ }, 0)
420
+
421
+ const bufferPointer: pointer<uint8> = avMalloc(length)
422
+ const buffer = mapUint8Array(bufferPointer, length)
423
+
424
+ naluUtil.joinNaluByLength(nalus, NALULengthSizeMinusOne, buffer)
425
+
426
+ return {
427
+ bufferPointer,
428
+ length,
429
+ key,
430
+ extradata
431
+ }
432
+ }
433
+
434
+ /**
435
+ * 需要保证 data 是 safe 的
436
+ *
437
+ * @param spss
438
+ * @param ppss
439
+ * @param spsExts
440
+ * @param seis
441
+ * @param others
442
+ * @returns
443
+ */
444
+ export function nalus2Annexb(
445
+ spss: Uint8ArrayInterface[],
446
+ ppss: Uint8ArrayInterface[],
447
+ spsExts: Uint8ArrayInterface[],
448
+ seis: Uint8ArrayInterface[],
449
+ others: Uint8ArrayInterface[]
450
+ ) {
451
+ const lengths = [
452
+ naluUtil.joinNaluByStartCodeLength(seis, 0),
453
+ naluUtil.joinNaluByStartCodeLength(spss, 0),
454
+ naluUtil.joinNaluByStartCodeLength(ppss, 0),
455
+ naluUtil.joinNaluByStartCodeLength(spsExts, 0),
456
+ naluUtil.joinNaluByStartCodeLength(others, 2)
457
+ ]
458
+
459
+ let length = lengths.reduce((prev, length) => {
460
+ return prev + length
461
+ }, 0)
462
+
463
+ const bufferPointer: pointer<uint8> = avMalloc(length + 6)
464
+
465
+ let offset = bufferPointer
466
+ // AUD
467
+ intwrite.w8(offset++, 0)
468
+ intwrite.w8(offset++, 0)
469
+ intwrite.w8(offset++, 0)
470
+ intwrite.w8(offset++, 1)
471
+ intwrite.w8(offset++, H264NaluType.kSliceAUD)
472
+ intwrite.w8(offset++, 0xf0)
473
+
474
+ if (seis.length) {
475
+ naluUtil.joinNaluByStartCode(seis, 0, mapUint8Array(offset, lengths[0]))
476
+ offset = reinterpret_cast<pointer<uint8>>(offset + lengths[0])
477
+ }
478
+ if (spss.length) {
479
+ naluUtil.joinNaluByStartCode(spss, 0, mapUint8Array(offset, lengths[1]))
480
+ offset = reinterpret_cast<pointer<uint8>>(offset + lengths[1])
481
+ }
482
+ if (ppss.length) {
483
+ naluUtil.joinNaluByStartCode(ppss, 0, mapUint8Array(offset, lengths[2]))
484
+ offset = reinterpret_cast<pointer<uint8>>(offset + lengths[2])
485
+ }
486
+ if (spsExts.length) {
487
+ naluUtil.joinNaluByStartCode(spsExts, 0, mapUint8Array(offset, lengths[3]))
488
+ offset = reinterpret_cast<pointer<uint8>>(offset + lengths[3])
489
+ }
490
+ if (others.length) {
491
+ naluUtil.joinNaluByStartCode(others, 2, mapUint8Array(offset, lengths[4]))
492
+ }
493
+
494
+ return {
495
+ bufferPointer,
496
+ length: length + 6
497
+ }
498
+ }
499
+
500
+ /**
501
+ * annexb 添加 sps pps
502
+ *
503
+ * @param data
504
+ * @param extradata
505
+ */
506
+ export function annexbAddExtradata(data: Uint8ArrayInterface, extradata: Uint8ArrayInterface) {
507
+ let nalus = naluUtil.splitNaluByStartCode(data).concat(naluUtil.splitNaluByStartCode(extradata))
508
+ if (nalus.length) {
509
+ const spss: Uint8ArrayInterface[] = []
510
+ const ppss: Uint8ArrayInterface[] = []
511
+ const spsExts: Uint8ArrayInterface[] = []
512
+ const seis: Uint8ArrayInterface[] = []
513
+ const others: Uint8ArrayInterface[] = []
514
+
515
+ nalus.forEach((nalu) => {
516
+ const type = nalu[0] & 0x1f
517
+ if (type === H264NaluType.kSliceSPS) {
518
+ spss.push(nalu)
519
+ }
520
+ else if (type === H264NaluType.kSlicePPS) {
521
+ ppss.push(nalu)
522
+ }
523
+ else if (type === H264NaluType.kSPSExt) {
524
+ spsExts.push(nalu)
525
+ }
526
+ else if (type === H264NaluType.kSliceSEI) {
527
+ seis.push(nalu)
528
+ }
529
+ else if (type !== H264NaluType.kSliceAUD) {
530
+ others.push(nalu)
531
+ }
532
+ })
533
+ return nalus2Annexb(spss, ppss, spsExts, seis, others)
534
+ }
535
+ }
536
+
537
+ /**
538
+ * avcc 格式的 NALU 转 annexb NALU
539
+ *
540
+ * 需要保证 data 是 safe 的
541
+ */
542
+ export function avcc2Annexb(
543
+ data: Uint8ArrayInterface,
544
+ extradata?: Uint8ArrayInterface,
545
+ naluLengthSizeMinusOne: int32 = NALULengthSizeMinusOne
546
+ ) {
547
+ if (extradata) {
548
+ naluLengthSizeMinusOne = extradata[4] & 0x03
549
+ }
550
+
551
+ let spss: Uint8ArrayInterface[] = []
552
+ let ppss: Uint8ArrayInterface[] = []
553
+ let spsExts: Uint8ArrayInterface[] = []
554
+ let key = false
555
+
556
+ if (extradata) {
557
+ const result = extradata2SpsPps(extradata)
558
+ spss = result.spss
559
+ ppss = result.ppss
560
+ spsExts = result.spsExts
561
+ key = true
562
+ }
563
+
564
+ const others: Uint8ArrayInterface[] = []
565
+ const seis: Uint8ArrayInterface[] = []
566
+ const nalus = naluUtil.splitNaluByLength(data, naluLengthSizeMinusOne)
567
+ nalus.forEach((nalu) => {
568
+ const naluType = nalu[0] & 0x1f
569
+ if (naluType === H264NaluType.kSliceSEI) {
570
+ seis.push(nalu)
571
+ }
572
+ else if (naluType === H264NaluType.kSliceSPS && !spss.length) {
573
+ spss.push(nalu)
574
+ }
575
+ else if (naluType === H264NaluType.kSlicePPS && !ppss.length) {
576
+ ppss.push(nalu)
577
+ }
578
+ else if (naluType !== H264NaluType.kSliceAUD) {
579
+ others.push(nalu)
580
+ }
581
+ if (naluType === H264NaluType.kSliceIDR) {
582
+ key = true
583
+ }
584
+ })
585
+
586
+ return {
587
+ ...nalus2Annexb(spss, ppss, spsExts, seis, others),
588
+ key
589
+ }
590
+ }
591
+
592
+ export function parseAVCodecParameters(
593
+ stream: {
594
+ codecpar: AVCodecParameters,
595
+ sideData: Partial<Record<AVPacketSideDataType, Uint8Array>>,
596
+ metadata: Data
597
+ },
598
+ extradata?: Uint8ArrayInterface
599
+ ) {
600
+ if (!extradata && stream.sideData[AVPacketSideDataType.AV_PKT_DATA_NEW_EXTRADATA]) {
601
+ extradata = stream.sideData[AVPacketSideDataType.AV_PKT_DATA_NEW_EXTRADATA]
602
+ }
603
+
604
+ let sps: Uint8ArrayInterface
605
+ if (extradata && naluUtil.isAnnexb(extradata)) {
606
+ array.each(naluUtil.splitNaluByStartCode(extradata), (nalu) => {
607
+ const type = nalu[0] & 0x1f
608
+ if (type === H264NaluType.kSliceSPS) {
609
+ sps = nalu
610
+ return false
611
+ }
612
+ })
613
+ }
614
+ else if (extradata && extradata.length >= 6) {
615
+ const { spss } = extradata2SpsPps(extradata)
616
+ if (spss.length) {
617
+ sps = spss[0]
618
+ }
619
+ }
620
+ if (sps) {
621
+ const { profile, level, width, height, videoDelay, chromaFormatIdc, bitDepthLumaMinus8 } = parseSPS(sps)
622
+ stream.codecpar.profile = profile
623
+ stream.codecpar.level = level
624
+ stream.codecpar.width = width
625
+ stream.codecpar.height = height
626
+ stream.codecpar.videoDelay = videoDelay
627
+ switch (bitDepthLumaMinus8) {
628
+ case 0:
629
+ if (chromaFormatIdc === 3) {
630
+ stream.codecpar.format = AVPixelFormat.AV_PIX_FMT_YUV444P
631
+ }
632
+ else if (chromaFormatIdc === 2) {
633
+ stream.codecpar.format = AVPixelFormat.AV_PIX_FMT_YUV422P
634
+ }
635
+ else {
636
+ stream.codecpar.format = AVPixelFormat.AV_PIX_FMT_YUV420P
637
+ }
638
+ break
639
+ case 1:
640
+ if (chromaFormatIdc === 3) {
641
+ stream.codecpar.format = AVPixelFormat.AV_PIX_FMT_YUV444P9LE
642
+ }
643
+ else if (chromaFormatIdc === 2) {
644
+ stream.codecpar.format = AVPixelFormat.AV_PIX_FMT_YUV422P9LE
645
+ }
646
+ else {
647
+ stream.codecpar.format = AVPixelFormat.AV_PIX_FMT_YUV420P9LE
648
+ }
649
+ break
650
+ case 2:
651
+ if (chromaFormatIdc === 3) {
652
+ stream.codecpar.format = AVPixelFormat.AV_PIX_FMT_YUV444P10LE
653
+ }
654
+ else if (chromaFormatIdc === 2) {
655
+ stream.codecpar.format = AVPixelFormat.AV_PIX_FMT_YUV422P10LE
656
+ }
657
+ else {
658
+ stream.codecpar.format = AVPixelFormat.AV_PIX_FMT_YUV420P10LE
659
+ }
660
+ break
661
+ }
662
+ }
663
+ }
664
+
665
+ export function isIDR(avpacket: pointer<AVPacket>, naluLengthSize: int32 = 4) {
666
+ if (avpacket.flags & AVPacketFlags.AV_PKT_FLAG_H26X_ANNEXB) {
667
+ let nalus = naluUtil.splitNaluByStartCode(mapUint8Array(avpacket.data, reinterpret_cast<size>(avpacket.size)))
668
+ return nalus.some((nalu) => {
669
+ const type = nalu[0] & 0x1f
670
+ return type === H264NaluType.kSliceIDR
671
+ })
672
+ }
673
+ else {
674
+ const size = avpacket.size
675
+ let i = 0
676
+ while (i < (size - naluLengthSize)) {
677
+ const type = intread.r8(avpacket.data + (i + naluLengthSize)) & 0x1f
678
+ if (type === H264NaluType.kSliceIDR) {
679
+ return true
680
+ }
681
+ if (naluLengthSize === 4) {
682
+ i += intread.rb32(avpacket.data + i)
683
+ }
684
+ else if (naluLengthSize === 3) {
685
+ i += intread.rb24(avpacket.data + i)
686
+ }
687
+ else if (naluLengthSize === 2) {
688
+ i += intread.rb16(avpacket.data + i)
689
+ }
690
+ else {
691
+ i += intread.r8(avpacket.data + i)
692
+ }
693
+ i += naluLengthSize
694
+ }
695
+ return false
696
+ }
697
+ }
698
+
699
+ export interface H264SPS {
700
+ profile: number
701
+ level: number
702
+ width: number
703
+ height: number
704
+ chromaFormatIdc: number
705
+ bitDepthLumaMinus8: number
706
+ bitDepthChromaMinus8: number
707
+ frameMbsOnlyFlag: number
708
+ picOrderCntType: number
709
+ log2MaxPicOrderCntLsbMinus4: number
710
+ deltaPicOrderAlwaysZeroFlag: number
711
+ log2MaxFrameNumMinus4: number
712
+ videoDelay: number
713
+ }
714
+
715
+ export function parseSPS(sps: Uint8ArrayInterface): H264SPS {
716
+
717
+ if (!sps || sps.length < 3) {
718
+ return
719
+ }
720
+
721
+ let offset = 0
722
+ if (sps[0] === 0x00
723
+ && sps[1] === 0x00
724
+ && sps[2] === 0x00
725
+ && sps[3] === 0x01
726
+ ) {
727
+ offset = 4
728
+ }
729
+
730
+ const buffer = naluUtil.naluUnescape(sps.subarray(offset))
731
+ const bitReader = new BitReader(buffer.length)
732
+ bitReader.appendBuffer(buffer)
733
+
734
+ // forbidden_zero_bit
735
+ bitReader.readU1()
736
+ // nal_ref_idc
737
+ bitReader.readU(2)
738
+ // nal_unit_type
739
+ bitReader.readU(5)
740
+
741
+ const profile = bitReader.readU(8)
742
+
743
+ // constraint_set0_flag
744
+ bitReader.readU1()
745
+ // constraint_set1_flag
746
+ bitReader.readU1()
747
+ // constraint_set2_flag
748
+ bitReader.readU1()
749
+ // constraint_set3_flag
750
+ bitReader.readU1()
751
+ // constraint_set4_flag
752
+ bitReader.readU1()
753
+ // constraint_set5_flag
754
+ bitReader.readU1()
755
+ // reserved_zero_2bits
756
+ bitReader.readU(2)
757
+
758
+ const level = bitReader.readU(8)
759
+
760
+ // seq_parameter_set_id
761
+ expgolomb.readUE(bitReader)
762
+
763
+ // 摄像机出图大部分格式是 4:2:0
764
+ let chromaFormatIdc = 1
765
+ let bitDepthLumaMinus8 = 0
766
+ let bitDepthChromaMinus8 = 0
767
+
768
+ if (profile == 100 || profile == 110 || profile == 122
769
+ || profile == 244 || profile == 44 || profile == 83
770
+ || profile == 86 || profile == 118 || profile == 128
771
+ || profile == 138 || profile == 139 || profile == 134 || profile == 135
772
+ ) {
773
+ chromaFormatIdc = expgolomb.readUE(bitReader)
774
+ if (chromaFormatIdc === 3) {
775
+ // separate_colour_plane_flag
776
+ bitReader.readU1()
777
+ }
778
+ // bit_depth_luma_minus8
779
+ bitDepthLumaMinus8 = expgolomb.readUE(bitReader)
780
+ // bit_depth_chroma_minus8
781
+ bitDepthChromaMinus8 = expgolomb.readUE(bitReader)
782
+ // qpprime_y_zero_transform_bypass_flag
783
+ bitReader.readU1()
784
+
785
+ function skipScalingList(sizeOfScalingList: number) {
786
+ let lastScale = 8
787
+ let nextScale = 8
788
+ let deltaScale: number
789
+ for (let j = 0; j < sizeOfScalingList; j++) {
790
+ if (nextScale !== 0) {
791
+ deltaScale = expgolomb.readSE(bitReader)
792
+ nextScale = (lastScale + deltaScale + 256) % 256
793
+ }
794
+ lastScale = (nextScale === 0) ? lastScale : nextScale
795
+ }
796
+ }
797
+ let seqScalingMatrixPresentFlag = bitReader.readU1()
798
+ if (seqScalingMatrixPresentFlag) {
799
+ const seqScalingListPresentFlag = new Array(8)
800
+ for (let i = 0; i < ((chromaFormatIdc != 3) ? 8 : 12); i++) {
801
+ seqScalingListPresentFlag[i] = bitReader.readU1()
802
+ if (seqScalingListPresentFlag[i]) {
803
+ if (i < 6) {
804
+ skipScalingList(16)
805
+ }
806
+ else {
807
+ skipScalingList(64)
808
+ }
809
+ }
810
+ }
811
+ }
812
+ }
813
+
814
+ // log2_max_frame_num_minus4
815
+ const log2MaxFrameNumMinus4 = expgolomb.readUE(bitReader)
816
+
817
+ const picOrderCntType = expgolomb.readUE(bitReader)
818
+ let log2MaxPicOrderCntLsbMinus4 = 0
819
+ let deltaPicOrderAlwaysZeroFlag = 0
820
+
821
+ if (picOrderCntType === 0) {
822
+ // log2_max_pic_order_cnt_lsb_minus4
823
+ log2MaxPicOrderCntLsbMinus4 = expgolomb.readUE(bitReader)
824
+ }
825
+ else if (picOrderCntType === 1) {
826
+ // delta_pic_order_always_zero_flag
827
+ deltaPicOrderAlwaysZeroFlag = bitReader.readU1()
828
+
829
+ // offset_for_non_ref_pic
830
+ expgolomb.readSE(bitReader)
831
+ // offset_for_top_to_bottom_field
832
+ expgolomb.readSE(bitReader)
833
+
834
+ const numRefFramesInPicOrderCntCycle = expgolomb.readUE(bitReader)
835
+ for (let i = 0; i < numRefFramesInPicOrderCntCycle; i++) {
836
+ expgolomb.readSE(bitReader)
837
+ }
838
+ }
839
+
840
+ // max_num_ref_frames
841
+ expgolomb.readUE(bitReader)
842
+ // gaps_in_frame_num_value_allowed_flag
843
+ bitReader.readU1()
844
+
845
+ const picWidthInMbsMinus1 = expgolomb.readUE(bitReader)
846
+ const picHeightInMapUnitsMinus1 = expgolomb.readUE(bitReader)
847
+ const frameMbsOnlyFlag = bitReader.readU1()
848
+
849
+ let width = (picWidthInMbsMinus1 + 1) * 16
850
+ let height = (2 - frameMbsOnlyFlag) * (picHeightInMapUnitsMinus1 + 1) * 16
851
+
852
+ if (!frameMbsOnlyFlag) {
853
+ // mb_adaptive_frame_field_flag
854
+ bitReader.readU1()
855
+ }
856
+
857
+ // direct_8x8_inference_flag
858
+ bitReader.readU1()
859
+
860
+ const frameCroppingFlag = bitReader.readU1()
861
+ if (frameCroppingFlag) {
862
+ const frameCropLeftOffset = expgolomb.readUE(bitReader)
863
+ const frameCropRightOffset = expgolomb.readUE(bitReader)
864
+ const frameCropTopOffset = expgolomb.readUE(bitReader)
865
+ const frameCropBottomOffset = expgolomb.readUE(bitReader)
866
+
867
+ let cropUnitX = 1
868
+ let cropUnitY = 2 - frameCroppingFlag
869
+
870
+ if (chromaFormatIdc === 1) {
871
+ cropUnitX = 2
872
+ cropUnitY = 2 * (2 - frameCroppingFlag)
873
+ }
874
+ else if (frameCroppingFlag === 2) {
875
+ cropUnitX = 2
876
+ cropUnitY = 2 - frameCroppingFlag
877
+ }
878
+
879
+ width -= cropUnitX * (frameCropLeftOffset + frameCropRightOffset)
880
+ height -= cropUnitY * (frameCropTopOffset + frameCropBottomOffset)
881
+
882
+ }
883
+
884
+ let videoDelay = 0
885
+
886
+ const vuiParametersPresentFlag = bitReader.readU1()
887
+ if (vuiParametersPresentFlag) {
888
+ // aspect_ratio_info_present_flag
889
+ let flag = bitReader.readU1()
890
+ if (flag) {
891
+ const aspectRatioIdc = bitReader.readU(8)
892
+ if (aspectRatioIdc >= 17) {
893
+ // sar.num
894
+ bitReader.readU(16)
895
+ // sar.num
896
+ bitReader.readU(16)
897
+ }
898
+ }
899
+ // overscan_info_present_flag
900
+ flag = bitReader.readU1()
901
+ if (flag) {
902
+ // overscan_appropriate_flag
903
+ bitReader.readU1()
904
+ }
905
+ // video_signal_type_present_flag
906
+ flag = bitReader.readU1()
907
+ if (flag) {
908
+ // video_format
909
+ bitReader.readU(3)
910
+ // video_full_range_flag
911
+ bitReader.readU1()
912
+ // colour_description_present_flag
913
+ flag = bitReader.readU1()
914
+ if (flag) {
915
+ // colour_primaries
916
+ bitReader.readU(8)
917
+ // transfer_characteristics
918
+ bitReader.readU(8)
919
+ // matrix_coeffs
920
+ bitReader.readU(8)
921
+ }
922
+ }
923
+ // chroma_loc_info_present_flag
924
+ flag = bitReader.readU1()
925
+ if (flag) {
926
+ // chroma_sample_loc_type_top_field
927
+ expgolomb.readUE(bitReader)
928
+ // chroma_sample_loc_type_bottom_field
929
+ expgolomb.readUE(bitReader)
930
+ }
931
+ // timing_info_present_flag
932
+ flag = bitReader.readU1()
933
+ if (flag) {
934
+ // num_units_in_tick
935
+ bitReader.readU(32)
936
+ // time_scale
937
+ bitReader.readU(32)
938
+ // fixed_frame_rate_flag
939
+ bitReader.readU1()
940
+ }
941
+ function parseHrdParameters() {
942
+ const cpbCount = expgolomb.readUE(bitReader) + 1
943
+ // bit_rate_scale
944
+ bitReader.readU(4)
945
+ // cpb_size_scale
946
+ bitReader.readU(4)
947
+ for (let i = 0; i < cpbCount; i++) {
948
+ // bit_rate_value
949
+ expgolomb.readUE(bitReader)
950
+ // cpb_size_value
951
+ expgolomb.readUE(bitReader)
952
+ // cpr_flag
953
+ bitReader.readU1()
954
+ }
955
+ // initial_cpb_removal_delay_length
956
+ bitReader.readU(5)
957
+ // cpb_removal_delay_length
958
+ bitReader.readU(5)
959
+ // dpb_output_delay_length
960
+ bitReader.readU(5)
961
+ // time_offset_length
962
+ bitReader.readU(5)
963
+ }
964
+ // nal_hrd_parameters_present_flag
965
+ let flag1 = bitReader.readU1()
966
+ if (flag1) {
967
+ parseHrdParameters()
968
+ }
969
+ // vcl_hrd_parameters_present_flag
970
+ let flag2 = bitReader.readU1()
971
+ if (flag2) {
972
+ parseHrdParameters()
973
+ }
974
+ if (flag1 || flag2) {
975
+ // low_delay_hrd_flag
976
+ bitReader.readU1()
977
+ }
978
+ // pic_struct_present_flag
979
+ bitReader.readU1()
980
+ // bitstream_restriction_flag
981
+ flag = bitReader.readU1()
982
+ if (flag) {
983
+ // motion_vectors_over_pic_boundaries_flag
984
+ bitReader.readU1()
985
+ // max_bytes_per_pic_denom
986
+ expgolomb.readUE(bitReader)
987
+ // max_bits_per_mb_denom
988
+ expgolomb.readUE(bitReader)
989
+ // log2_max_mv_length_horizontal
990
+ expgolomb.readUE(bitReader)
991
+ // log2_max_mv_length_vertical
992
+ expgolomb.readUE(bitReader)
993
+
994
+ videoDelay = Math.min(expgolomb.readUE(bitReader), H264_MAX_DPB_FRAMES)
995
+ }
996
+ }
997
+
998
+ return {
999
+ profile,
1000
+ level,
1001
+ width,
1002
+ height,
1003
+ chromaFormatIdc,
1004
+ bitDepthLumaMinus8,
1005
+ bitDepthChromaMinus8,
1006
+ frameMbsOnlyFlag,
1007
+ picOrderCntType,
1008
+ log2MaxPicOrderCntLsbMinus4,
1009
+ deltaPicOrderAlwaysZeroFlag,
1010
+ log2MaxFrameNumMinus4,
1011
+ videoDelay
1012
+ }
1013
+ }