@siteed/expo-audio-stream 2.1.0 → 2.2.1-beta.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 (189) hide show
  1. package/README.md +23 -260
  2. package/build/index.d.ts +11 -15
  3. package/build/index.js +54 -14
  4. package/build/src/index.d.ts +11 -0
  5. package/build/src/index.js +54 -0
  6. package/package.json +49 -110
  7. package/src/index.ts +18 -32
  8. package/CHANGELOG.md +0 -206
  9. package/android/build.gradle +0 -105
  10. package/android/src/main/AndroidManifest.xml +0 -27
  11. package/android/src/main/java/net/siteed/audiostream/AudioAnalysisData.kt +0 -166
  12. package/android/src/main/java/net/siteed/audiostream/AudioDataEncoder.kt +0 -9
  13. package/android/src/main/java/net/siteed/audiostream/AudioFileHandler.kt +0 -131
  14. package/android/src/main/java/net/siteed/audiostream/AudioFormatUtils.kt +0 -103
  15. package/android/src/main/java/net/siteed/audiostream/AudioNotificationsManager.kt +0 -435
  16. package/android/src/main/java/net/siteed/audiostream/AudioProcessor.kt +0 -2235
  17. package/android/src/main/java/net/siteed/audiostream/AudioRecorderManager.kt +0 -1437
  18. package/android/src/main/java/net/siteed/audiostream/AudioRecordingService.kt +0 -152
  19. package/android/src/main/java/net/siteed/audiostream/AudioTrimmer.kt +0 -1099
  20. package/android/src/main/java/net/siteed/audiostream/Constants.kt +0 -21
  21. package/android/src/main/java/net/siteed/audiostream/EventSender.kt +0 -7
  22. package/android/src/main/java/net/siteed/audiostream/ExpoAudioStreamModule.kt +0 -739
  23. package/android/src/main/java/net/siteed/audiostream/FFT.kt +0 -99
  24. package/android/src/main/java/net/siteed/audiostream/Features.kt +0 -98
  25. package/android/src/main/java/net/siteed/audiostream/NotificationConfig.kt +0 -70
  26. package/android/src/main/java/net/siteed/audiostream/PermissionUtils.kt +0 -59
  27. package/android/src/main/java/net/siteed/audiostream/RecordingActionReceiver.kt +0 -59
  28. package/android/src/main/java/net/siteed/audiostream/RecordingConfig.kt +0 -205
  29. package/android/src/main/java/net/siteed/audiostream/WaveformConfig.kt +0 -19
  30. package/android/src/main/java/net/siteed/audiostream/WaveformRenderer.kt +0 -159
  31. package/android/src/main/res/drawable/ic_default_action_icon.xml +0 -16
  32. package/android/src/main/res/drawable/ic_microphone.xml +0 -13
  33. package/android/src/main/res/drawable/ic_pause.xml +0 -10
  34. package/android/src/main/res/drawable/ic_play.xml +0 -10
  35. package/android/src/main/res/drawable/ic_stop.xml +0 -10
  36. package/android/src/main/res/layout/notification_recording.xml +0 -37
  37. package/android/src/main/test/java/net/siteed/audiostream/AudioProcessorTest.kt +0 -56
  38. package/app.plugin.js +0 -1
  39. package/build/AudioAnalysis/AudioAnalysis.types.d.ts +0 -179
  40. package/build/AudioAnalysis/AudioAnalysis.types.d.ts.map +0 -1
  41. package/build/AudioAnalysis/AudioAnalysis.types.js +0 -3
  42. package/build/AudioAnalysis/AudioAnalysis.types.js.map +0 -1
  43. package/build/AudioAnalysis/extractAudioAnalysis.d.ts +0 -68
  44. package/build/AudioAnalysis/extractAudioAnalysis.d.ts.map +0 -1
  45. package/build/AudioAnalysis/extractAudioAnalysis.js +0 -203
  46. package/build/AudioAnalysis/extractAudioAnalysis.js.map +0 -1
  47. package/build/AudioAnalysis/extractAudioData.d.ts +0 -3
  48. package/build/AudioAnalysis/extractAudioData.d.ts.map +0 -1
  49. package/build/AudioAnalysis/extractAudioData.js +0 -5
  50. package/build/AudioAnalysis/extractAudioData.js.map +0 -1
  51. package/build/AudioAnalysis/extractMelSpectrogram.d.ts +0 -14
  52. package/build/AudioAnalysis/extractMelSpectrogram.d.ts.map +0 -1
  53. package/build/AudioAnalysis/extractMelSpectrogram.js +0 -85
  54. package/build/AudioAnalysis/extractMelSpectrogram.js.map +0 -1
  55. package/build/AudioAnalysis/extractPreview.d.ts +0 -11
  56. package/build/AudioAnalysis/extractPreview.d.ts.map +0 -1
  57. package/build/AudioAnalysis/extractPreview.js +0 -25
  58. package/build/AudioAnalysis/extractPreview.js.map +0 -1
  59. package/build/AudioAnalysis/extractWaveform.d.ts +0 -8
  60. package/build/AudioAnalysis/extractWaveform.d.ts.map +0 -1
  61. package/build/AudioAnalysis/extractWaveform.js +0 -11
  62. package/build/AudioAnalysis/extractWaveform.js.map +0 -1
  63. package/build/AudioRecorder.provider.d.ts +0 -11
  64. package/build/AudioRecorder.provider.d.ts.map +0 -1
  65. package/build/AudioRecorder.provider.js +0 -37
  66. package/build/AudioRecorder.provider.js.map +0 -1
  67. package/build/ExpoAudioStream.native.d.ts +0 -3
  68. package/build/ExpoAudioStream.native.d.ts.map +0 -1
  69. package/build/ExpoAudioStream.native.js +0 -6
  70. package/build/ExpoAudioStream.native.js.map +0 -1
  71. package/build/ExpoAudioStream.types.d.ts +0 -532
  72. package/build/ExpoAudioStream.types.d.ts.map +0 -1
  73. package/build/ExpoAudioStream.types.js +0 -2
  74. package/build/ExpoAudioStream.types.js.map +0 -1
  75. package/build/ExpoAudioStream.web.d.ts +0 -59
  76. package/build/ExpoAudioStream.web.d.ts.map +0 -1
  77. package/build/ExpoAudioStream.web.js +0 -285
  78. package/build/ExpoAudioStream.web.js.map +0 -1
  79. package/build/ExpoAudioStreamModule.d.ts +0 -3
  80. package/build/ExpoAudioStreamModule.d.ts.map +0 -1
  81. package/build/ExpoAudioStreamModule.js +0 -693
  82. package/build/ExpoAudioStreamModule.js.map +0 -1
  83. package/build/WebRecorder.web.d.ts +0 -119
  84. package/build/WebRecorder.web.d.ts.map +0 -1
  85. package/build/WebRecorder.web.js +0 -436
  86. package/build/WebRecorder.web.js.map +0 -1
  87. package/build/constants.d.ts +0 -11
  88. package/build/constants.d.ts.map +0 -1
  89. package/build/constants.js +0 -14
  90. package/build/constants.js.map +0 -1
  91. package/build/events.d.ts +0 -26
  92. package/build/events.d.ts.map +0 -1
  93. package/build/events.js +0 -21
  94. package/build/events.js.map +0 -1
  95. package/build/index.d.ts.map +0 -1
  96. package/build/index.js.map +0 -1
  97. package/build/trimAudio.d.ts +0 -25
  98. package/build/trimAudio.d.ts.map +0 -1
  99. package/build/trimAudio.js +0 -67
  100. package/build/trimAudio.js.map +0 -1
  101. package/build/useAudioRecorder.d.ts +0 -21
  102. package/build/useAudioRecorder.d.ts.map +0 -1
  103. package/build/useAudioRecorder.js +0 -427
  104. package/build/useAudioRecorder.js.map +0 -1
  105. package/build/utils/BlobFix.d.ts +0 -9
  106. package/build/utils/BlobFix.d.ts.map +0 -1
  107. package/build/utils/BlobFix.js +0 -498
  108. package/build/utils/BlobFix.js.map +0 -1
  109. package/build/utils/audioProcessing.d.ts +0 -24
  110. package/build/utils/audioProcessing.d.ts.map +0 -1
  111. package/build/utils/audioProcessing.js +0 -133
  112. package/build/utils/audioProcessing.js.map +0 -1
  113. package/build/utils/concatenateBuffers.d.ts +0 -8
  114. package/build/utils/concatenateBuffers.d.ts.map +0 -1
  115. package/build/utils/concatenateBuffers.js +0 -21
  116. package/build/utils/concatenateBuffers.js.map +0 -1
  117. package/build/utils/convertPCMToFloat32.d.ts +0 -13
  118. package/build/utils/convertPCMToFloat32.d.ts.map +0 -1
  119. package/build/utils/convertPCMToFloat32.js +0 -120
  120. package/build/utils/convertPCMToFloat32.js.map +0 -1
  121. package/build/utils/encodingToBitDepth.d.ts +0 -5
  122. package/build/utils/encodingToBitDepth.d.ts.map +0 -1
  123. package/build/utils/encodingToBitDepth.js +0 -13
  124. package/build/utils/encodingToBitDepth.js.map +0 -1
  125. package/build/utils/getWavFileInfo.d.ts +0 -26
  126. package/build/utils/getWavFileInfo.d.ts.map +0 -1
  127. package/build/utils/getWavFileInfo.js +0 -92
  128. package/build/utils/getWavFileInfo.js.map +0 -1
  129. package/build/utils/writeWavHeader.d.ts +0 -49
  130. package/build/utils/writeWavHeader.d.ts.map +0 -1
  131. package/build/utils/writeWavHeader.js +0 -91
  132. package/build/utils/writeWavHeader.js.map +0 -1
  133. package/build/workers/InlineFeaturesExtractor.web.d.ts +0 -2
  134. package/build/workers/InlineFeaturesExtractor.web.d.ts.map +0 -1
  135. package/build/workers/InlineFeaturesExtractor.web.js +0 -828
  136. package/build/workers/InlineFeaturesExtractor.web.js.map +0 -1
  137. package/build/workers/inlineAudioWebWorker.web.d.ts +0 -2
  138. package/build/workers/inlineAudioWebWorker.web.d.ts.map +0 -1
  139. package/build/workers/inlineAudioWebWorker.web.js +0 -157
  140. package/build/workers/inlineAudioWebWorker.web.js.map +0 -1
  141. package/expo-module.config.json +0 -9
  142. package/ios/AudioAnalysisData.swift +0 -74
  143. package/ios/AudioNotificationManager.swift +0 -135
  144. package/ios/AudioProcessingHelpers.swift +0 -743
  145. package/ios/AudioProcessor.swift +0 -1313
  146. package/ios/AudioStreamError.swift +0 -7
  147. package/ios/AudioStreamManager.swift +0 -1708
  148. package/ios/AudioStreamManagerDelegate.swift +0 -16
  149. package/ios/DataPoint.swift +0 -54
  150. package/ios/DecodingConfig.swift +0 -47
  151. package/ios/ExpoAudioStream.podspec +0 -27
  152. package/ios/ExpoAudioStreamModule.swift +0 -805
  153. package/ios/FFT.swift +0 -62
  154. package/ios/Features.swift +0 -95
  155. package/ios/Logger.swift +0 -7
  156. package/ios/NotificationExtension.swift +0 -15
  157. package/ios/RecordingResult.swift +0 -22
  158. package/ios/RecordingSettings.swift +0 -265
  159. package/ios/WaveformExtractor.swift +0 -105
  160. package/plugin/build/index.d.ts +0 -21
  161. package/plugin/build/index.js +0 -191
  162. package/plugin/src/index.ts +0 -278
  163. package/plugin/tsconfig.json +0 -10
  164. package/plugin/tsconfig.tsbuildinfo +0 -1
  165. package/src/AudioAnalysis/AudioAnalysis.types.ts +0 -202
  166. package/src/AudioAnalysis/extractAudioAnalysis.ts +0 -333
  167. package/src/AudioAnalysis/extractAudioData.ts +0 -6
  168. package/src/AudioAnalysis/extractMelSpectrogram.ts +0 -144
  169. package/src/AudioAnalysis/extractPreview.ts +0 -34
  170. package/src/AudioAnalysis/extractWaveform.ts +0 -22
  171. package/src/AudioRecorder.provider.tsx +0 -54
  172. package/src/ExpoAudioStream.native.ts +0 -6
  173. package/src/ExpoAudioStream.types.ts +0 -641
  174. package/src/ExpoAudioStream.web.ts +0 -359
  175. package/src/ExpoAudioStreamModule.ts +0 -967
  176. package/src/WebRecorder.web.ts +0 -580
  177. package/src/constants.ts +0 -18
  178. package/src/events.ts +0 -60
  179. package/src/trimAudio.ts +0 -90
  180. package/src/useAudioRecorder.tsx +0 -620
  181. package/src/utils/BlobFix.ts +0 -559
  182. package/src/utils/audioProcessing.ts +0 -205
  183. package/src/utils/concatenateBuffers.ts +0 -24
  184. package/src/utils/convertPCMToFloat32.ts +0 -170
  185. package/src/utils/encodingToBitDepth.ts +0 -18
  186. package/src/utils/getWavFileInfo.ts +0 -132
  187. package/src/utils/writeWavHeader.ts +0 -114
  188. package/src/workers/InlineFeaturesExtractor.web.tsx +0 -827
  189. package/src/workers/inlineAudioWebWorker.web.tsx +0 -156
@@ -1,559 +0,0 @@
1
- /*
2
- * There is a bug where `navigator.mediaDevices.getUserMedia` + `MediaRecorder`
3
- * creates WEBM files without duration metadata. See:
4
- * - https://bugs.chromium.org/p/chromium/issues/detail?id=642012
5
- * - https://stackoverflow.com/a/39971175/13989043
6
- *
7
- * This file contains a function that fixes the duration metadata of a WEBM file.
8
- * - Answer found: https://stackoverflow.com/a/75218309/13989043
9
- * - Code adapted from: https://github.com/mat-sz/webm-fix-duration
10
- * (forked from https://github.com/yusitnikov/fix-webm-duration)
11
- */
12
-
13
- /*
14
- * This is the list of possible WEBM file sections by their IDs.
15
- * Possible types: Container, Binary, Uint, Int, String, Float, Date
16
- */
17
- interface Section {
18
- name: string
19
- type: string
20
- }
21
-
22
- const sections: Record<number, Section> = {
23
- 0xa45dfa3: { name: 'EBML', type: 'Container' },
24
- 0x286: { name: 'EBMLVersion', type: 'Uint' },
25
- 0x2f7: { name: 'EBMLReadVersion', type: 'Uint' },
26
- 0x2f2: { name: 'EBMLMaxIDLength', type: 'Uint' },
27
- 0x2f3: { name: 'EBMLMaxSizeLength', type: 'Uint' },
28
- 0x282: { name: 'DocType', type: 'String' },
29
- 0x287: { name: 'DocTypeVersion', type: 'Uint' },
30
- 0x285: { name: 'DocTypeReadVersion', type: 'Uint' },
31
- 0x6c: { name: 'Void', type: 'Binary' },
32
- 0x3f: { name: 'CRC-32', type: 'Binary' },
33
- 0xb538667: { name: 'SignatureSlot', type: 'Container' },
34
- 0x3e8a: { name: 'SignatureAlgo', type: 'Uint' },
35
- 0x3e9a: { name: 'SignatureHash', type: 'Uint' },
36
- 0x3ea5: { name: 'SignaturePublicKey', type: 'Binary' },
37
- 0x3eb5: { name: 'Signature', type: 'Binary' },
38
- 0x3e5b: { name: 'SignatureElements', type: 'Container' },
39
- 0x3e7b: { name: 'SignatureElementList', type: 'Container' },
40
- 0x2532: { name: 'SignedElement', type: 'Binary' },
41
- 0x8538067: { name: 'Segment', type: 'Container' },
42
- 0x14d9b74: { name: 'SeekHead', type: 'Container' },
43
- 0xdbb: { name: 'Seek', type: 'Container' },
44
- 0x13ab: { name: 'SeekID', type: 'Binary' },
45
- 0x13ac: { name: 'SeekPosition', type: 'Uint' },
46
- 0x549a966: { name: 'Info', type: 'Container' },
47
- 0x33a4: { name: 'SegmentUID', type: 'Binary' },
48
- 0x3384: { name: 'SegmentFilename', type: 'String' },
49
- 0x1cb923: { name: 'PrevUID', type: 'Binary' },
50
- 0x1c83ab: { name: 'PrevFilename', type: 'String' },
51
- 0x1eb923: { name: 'NextUID', type: 'Binary' },
52
- 0x1e83bb: { name: 'NextFilename', type: 'String' },
53
- 0x444: { name: 'SegmentFamily', type: 'Binary' },
54
- 0x2924: { name: 'ChapterTranslate', type: 'Container' },
55
- 0x29fc: { name: 'ChapterTranslateEditionUID', type: 'Uint' },
56
- 0x29bf: { name: 'ChapterTranslateCodec', type: 'Uint' },
57
- 0x29a5: { name: 'ChapterTranslateID', type: 'Binary' },
58
- 0xad7b1: { name: 'TimecodeScale', type: 'Uint' },
59
- 0x489: { name: 'Duration', type: 'Float' },
60
- 0x461: { name: 'DateUTC', type: 'Date' },
61
- 0x3ba9: { name: 'Title', type: 'String' },
62
- 0xd80: { name: 'MuxingApp', type: 'String' },
63
- 0x1741: { name: 'WritingApp', type: 'String' },
64
- // 0xf43b675: { name: 'Cluster', type: 'Container' },
65
- 0x67: { name: 'Timecode', type: 'Uint' },
66
- 0x1854: { name: 'SilentTracks', type: 'Container' },
67
- 0x18d7: { name: 'SilentTrackNumber', type: 'Uint' },
68
- 0x27: { name: 'Position', type: 'Uint' },
69
- 0x2b: { name: 'PrevSize', type: 'Uint' },
70
- 0x23: { name: 'SimpleBlock', type: 'Binary' },
71
- 0x20: { name: 'BlockGroup', type: 'Container' },
72
- 0x21: { name: 'Block', type: 'Binary' },
73
- 0x22: { name: 'BlockVirtual', type: 'Binary' },
74
- 0x35a1: { name: 'BlockAdditions', type: 'Container' },
75
- 0x26: { name: 'BlockMore', type: 'Container' },
76
- 0x6e: { name: 'BlockAddID', type: 'Uint' },
77
- 0x25: { name: 'BlockAdditional', type: 'Binary' },
78
- 0x1b: { name: 'BlockDuration', type: 'Uint' },
79
- 0x7a: { name: 'ReferencePriority', type: 'Uint' },
80
- 0x7b: { name: 'ReferenceBlock', type: 'Int' },
81
- 0x7d: { name: 'ReferenceVirtual', type: 'Int' },
82
- 0x24: { name: 'CodecState', type: 'Binary' },
83
- 0x35a2: { name: 'DiscardPadding', type: 'Int' },
84
- 0xe: { name: 'Slices', type: 'Container' },
85
- 0x68: { name: 'TimeSlice', type: 'Container' },
86
- 0x4c: { name: 'LaceNumber', type: 'Uint' },
87
- 0x4d: { name: 'FrameNumber', type: 'Uint' },
88
- 0x4b: { name: 'BlockAdditionID', type: 'Uint' },
89
- 0x4e: { name: 'Delay', type: 'Uint' },
90
- 0x4f: { name: 'SliceDuration', type: 'Uint' },
91
- 0x48: { name: 'ReferenceFrame', type: 'Container' },
92
- 0x49: { name: 'ReferenceOffset', type: 'Uint' },
93
- 0x4a: { name: 'ReferenceTimeCode', type: 'Uint' },
94
- 0x2f: { name: 'EncryptedBlock', type: 'Binary' },
95
- 0x654ae6b: { name: 'Tracks', type: 'Container' },
96
- 0x2e: { name: 'TrackEntry', type: 'Container' },
97
- 0x57: { name: 'TrackNumber', type: 'Uint' },
98
- 0x33c5: { name: 'TrackUID', type: 'Uint' },
99
- 0x3: { name: 'TrackType', type: 'Uint' },
100
- 0x39: { name: 'FlagEnabled', type: 'Uint' },
101
- 0x8: { name: 'FlagDefault', type: 'Uint' },
102
- 0x15aa: { name: 'FlagForced', type: 'Uint' },
103
- 0x1c: { name: 'FlagLacing', type: 'Uint' },
104
- 0x2de7: { name: 'MinCache', type: 'Uint' },
105
- 0x2df8: { name: 'MaxCache', type: 'Uint' },
106
- 0x3e383: { name: 'DefaultDuration', type: 'Uint' },
107
- 0x34e7a: { name: 'DefaultDecodedFieldDuration', type: 'Uint' },
108
- 0x3314f: { name: 'TrackTimecodeScale', type: 'Float' },
109
- 0x137f: { name: 'TrackOffset', type: 'Int' },
110
- 0x15ee: { name: 'MaxBlockAdditionID', type: 'Uint' },
111
- 0x136e: { name: 'Name', type: 'String' },
112
- 0x2b59c: { name: 'Language', type: 'String' },
113
- 0x6: { name: 'CodecID', type: 'String' },
114
- 0x23a2: { name: 'CodecPrivate', type: 'Binary' },
115
- 0x58688: { name: 'CodecName', type: 'String' },
116
- 0x3446: { name: 'AttachmentLink', type: 'Uint' },
117
- 0x1a9697: { name: 'CodecSettings', type: 'String' },
118
- 0x1b4040: { name: 'CodecInfoURL', type: 'String' },
119
- 0x6b240: { name: 'CodecDownloadURL', type: 'String' },
120
- 0x2a: { name: 'CodecDecodeAll', type: 'Uint' },
121
- 0x2fab: { name: 'TrackOverlay', type: 'Uint' },
122
- 0x16aa: { name: 'CodecDelay', type: 'Uint' },
123
- 0x16bb: { name: 'SeekPreRoll', type: 'Uint' },
124
- 0x2624: { name: 'TrackTranslate', type: 'Container' },
125
- 0x26fc: { name: 'TrackTranslateEditionUID', type: 'Uint' },
126
- 0x26bf: { name: 'TrackTranslateCodec', type: 'Uint' },
127
- 0x26a5: { name: 'TrackTranslateTrackID', type: 'Binary' },
128
- 0x60: { name: 'Video', type: 'Container' },
129
- 0x1a: { name: 'FlagInterlaced', type: 'Uint' },
130
- 0x13b8: { name: 'StereoMode', type: 'Uint' },
131
- 0x13c0: { name: 'AlphaMode', type: 'Uint' },
132
- 0x13b9: { name: 'OldStereoMode', type: 'Uint' },
133
- 0x30: { name: 'PixelWidth', type: 'Uint' },
134
- 0x3a: { name: 'PixelHeight', type: 'Uint' },
135
- 0x14aa: { name: 'PixelCropBottom', type: 'Uint' },
136
- 0x14bb: { name: 'PixelCropTop', type: 'Uint' },
137
- 0x14cc: { name: 'PixelCropLeft', type: 'Uint' },
138
- 0x14dd: { name: 'PixelCropRight', type: 'Uint' },
139
- 0x14b0: { name: 'DisplayWidth', type: 'Uint' },
140
- 0x14ba: { name: 'DisplayHeight', type: 'Uint' },
141
- 0x14b2: { name: 'DisplayUnit', type: 'Uint' },
142
- 0x14b3: { name: 'AspectRatioType', type: 'Uint' },
143
- 0xeb524: { name: 'ColourSpace', type: 'Binary' },
144
- 0xfb523: { name: 'GammaValue', type: 'Float' },
145
- 0x383e3: { name: 'FrameRate', type: 'Float' },
146
- 0x61: { name: 'Audio', type: 'Container' },
147
- 0x35: { name: 'SamplingFrequency', type: 'Float' },
148
- 0x38b5: { name: 'OutputSamplingFrequency', type: 'Float' },
149
- 0x1f: { name: 'Channels', type: 'Uint' },
150
- 0x3d7b: { name: 'ChannelPositions', type: 'Binary' },
151
- 0x2264: { name: 'BitDepth', type: 'Uint' },
152
- 0x62: { name: 'TrackOperation', type: 'Container' },
153
- 0x63: { name: 'TrackCombinePlanes', type: 'Container' },
154
- 0x64: { name: 'TrackPlane', type: 'Container' },
155
- 0x65: { name: 'TrackPlaneUID', type: 'Uint' },
156
- 0x66: { name: 'TrackPlaneType', type: 'Uint' },
157
- 0x69: { name: 'TrackJoinBlocks', type: 'Container' },
158
- 0x6d: { name: 'TrackJoinUID', type: 'Uint' },
159
- 0x40: { name: 'TrickTrackUID', type: 'Uint' },
160
- 0x41: { name: 'TrickTrackSegmentUID', type: 'Binary' },
161
- 0x46: { name: 'TrickTrackFlag', type: 'Uint' },
162
- 0x47: { name: 'TrickMasterTrackUID', type: 'Uint' },
163
- 0x44: { name: 'TrickMasterTrackSegmentUID', type: 'Binary' },
164
- 0x2d80: { name: 'ContentEncodings', type: 'Container' },
165
- 0x2240: { name: 'ContentEncoding', type: 'Container' },
166
- 0x1031: { name: 'ContentEncodingOrder', type: 'Uint' },
167
- 0x1032: { name: 'ContentEncodingScope', type: 'Uint' },
168
- 0x1033: { name: 'ContentEncodingType', type: 'Uint' },
169
- 0x1034: { name: 'ContentCompression', type: 'Container' },
170
- 0x254: { name: 'ContentCompAlgo', type: 'Uint' },
171
- 0x255: { name: 'ContentCompSettings', type: 'Binary' },
172
- 0x1035: { name: 'ContentEncryption', type: 'Container' },
173
- 0x7e1: { name: 'ContentEncAlgo', type: 'Uint' },
174
- 0x7e2: { name: 'ContentEncKeyID', type: 'Binary' },
175
- 0x7e3: { name: 'ContentSignature', type: 'Binary' },
176
- 0x7e4: { name: 'ContentSigKeyID', type: 'Binary' },
177
- 0x7e5: { name: 'ContentSigAlgo', type: 'Uint' },
178
- 0x7e6: { name: 'ContentSigHashAlgo', type: 'Uint' },
179
- 0xc53bb6b: { name: 'Cues', type: 'Container' },
180
- 0x3b: { name: 'CuePoint', type: 'Container' },
181
- 0x33: { name: 'CueTime', type: 'Uint' },
182
- 0x37: { name: 'CueTrackPositions', type: 'Container' },
183
- 0x77: { name: 'CueTrack', type: 'Uint' },
184
- 0x71: { name: 'CueClusterPosition', type: 'Uint' },
185
- 0x70: { name: 'CueRelativePosition', type: 'Uint' },
186
- 0x32: { name: 'CueDuration', type: 'Uint' },
187
- 0x1378: { name: 'CueBlockNumber', type: 'Uint' },
188
- 0x6a: { name: 'CueCodecState', type: 'Uint' },
189
- 0x5b: { name: 'CueReference', type: 'Container' },
190
- 0x16: { name: 'CueRefTime', type: 'Uint' },
191
- 0x17: { name: 'CueRefCluster', type: 'Uint' },
192
- 0x135f: { name: 'CueRefNumber', type: 'Uint' },
193
- 0x6b: { name: 'CueRefCodecState', type: 'Uint' },
194
- 0x941a469: { name: 'Attachments', type: 'Container' },
195
- 0x21a7: { name: 'AttachedFile', type: 'Container' },
196
- 0x67e: { name: 'FileDescription', type: 'String' },
197
- 0x66e: { name: 'FileName', type: 'String' },
198
- 0x660: { name: 'FileMimeType', type: 'String' },
199
- 0x65c: { name: 'FileData', type: 'Binary' },
200
- 0x6ae: { name: 'FileUID', type: 'Uint' },
201
- 0x675: { name: 'FileReferral', type: 'Binary' },
202
- 0x661: { name: 'FileUsedStartTime', type: 'Uint' },
203
- 0x662: { name: 'FileUsedEndTime', type: 'Uint' },
204
- 0x43a770: { name: 'Chapters', type: 'Container' },
205
- 0x5b9: { name: 'EditionEntry', type: 'Container' },
206
- 0x5bc: { name: 'EditionUID', type: 'Uint' },
207
- 0x5bd: { name: 'EditionFlagHidden', type: 'Uint' },
208
- 0x5db: { name: 'EditionFlagDefault', type: 'Uint' },
209
- 0x5dd: { name: 'EditionFlagOrdered', type: 'Uint' },
210
- 0x36: { name: 'ChapterAtom', type: 'Container' },
211
- 0x33c4: { name: 'ChapterUID', type: 'Uint' },
212
- 0x1654: { name: 'ChapterStringUID', type: 'String' },
213
- 0x11: { name: 'ChapterTimeStart', type: 'Uint' },
214
- 0x12: { name: 'ChapterTimeEnd', type: 'Uint' },
215
- 0x18: { name: 'ChapterFlagHidden', type: 'Uint' },
216
- 0x598: { name: 'ChapterFlagEnabled', type: 'Uint' },
217
- 0x2e67: { name: 'ChapterSegmentUID', type: 'Binary' },
218
- 0x2ebc: { name: 'ChapterSegmentEditionUID', type: 'Uint' },
219
- 0x23c3: { name: 'ChapterPhysicalEquiv', type: 'Uint' },
220
- 0xf: { name: 'ChapterTrack', type: 'Container' },
221
- 0x9: { name: 'ChapterTrackNumber', type: 'Uint' },
222
- 0x0: { name: 'ChapterDisplay', type: 'Container' },
223
- 0x5: { name: 'ChapString', type: 'String' },
224
- 0x37c: { name: 'ChapLanguage', type: 'String' },
225
- 0x37e: { name: 'ChapCountry', type: 'String' },
226
- 0x2944: { name: 'ChapProcess', type: 'Container' },
227
- 0x2955: { name: 'ChapProcessCodecID', type: 'Uint' },
228
- 0x50d: { name: 'ChapProcessPrivate', type: 'Binary' },
229
- 0x2911: { name: 'ChapProcessCommand', type: 'Container' },
230
- 0x2922: { name: 'ChapProcessTime', type: 'Uint' },
231
- 0x2933: { name: 'ChapProcessData', type: 'Binary' },
232
- 0x254c367: { name: 'Tags', type: 'Container' },
233
- 0x3373: { name: 'Tag', type: 'Container' },
234
- 0x23c0: { name: 'Targets', type: 'Container' },
235
- 0x28ca: { name: 'TargetTypeValue', type: 'Uint' },
236
- 0x23ca: { name: 'TargetType', type: 'String' },
237
- 0x23c5: { name: 'TagTrackUID', type: 'Uint' },
238
- 0x23c9: { name: 'TagEditionUID', type: 'Uint' },
239
- 0x23c4: { name: 'TagChapterUID', type: 'Uint' },
240
- 0x23c6: { name: 'TagAttachmentUID', type: 'Uint' },
241
- 0x27c8: { name: 'SimpleTag', type: 'Container' },
242
- 0x5a3: { name: 'TagName', type: 'String' },
243
- 0x47a: { name: 'TagLanguage', type: 'String' },
244
- 0x484: { name: 'TagDefault', type: 'Uint' },
245
- 0x487: { name: 'TagString', type: 'String' },
246
- 0x485: { name: 'TagBinary', type: 'Binary' },
247
- }
248
-
249
- class WebmBase<T> {
250
- source?: Uint8Array
251
- data?: T
252
-
253
- constructor(
254
- private name = 'Unknown',
255
- private type = 'Unknown'
256
- ) {}
257
-
258
- updateBySource() {}
259
-
260
- setSource(source: Uint8Array) {
261
- this.source = source
262
- this.updateBySource()
263
- }
264
-
265
- updateByData() {}
266
-
267
- setData(data: T) {
268
- this.data = data
269
- this.updateByData()
270
- }
271
- }
272
-
273
- class WebmUint extends WebmBase<string> {
274
- constructor(name: string, type: string) {
275
- super(name, type || 'Uint')
276
- }
277
-
278
- updateBySource() {
279
- // use hex representation of a number instead of number value
280
- this.data = ''
281
- for (let i = 0; i < this.source!.length; i++) {
282
- const hex = this.source![i].toString(16)
283
- this.data += padHex(hex)
284
- }
285
- }
286
-
287
- updateByData() {
288
- const length = this.data!.length / 2
289
- this.source = new Uint8Array(length)
290
- for (let i = 0; i < length; i++) {
291
- const hex = this.data!.substr(i * 2, 2)
292
- this.source[i] = parseInt(hex, 16)
293
- }
294
- }
295
-
296
- getValue() {
297
- return parseInt(this.data!, 16)
298
- }
299
-
300
- setValue(value: number) {
301
- this.setData(padHex(value.toString(16)))
302
- }
303
- }
304
-
305
- function padHex(hex: string) {
306
- return hex.length % 2 === 1 ? '0' + hex : hex
307
- }
308
-
309
- class WebmFloat extends WebmBase<number> {
310
- constructor(name: string, type: string) {
311
- super(name, type || 'Float')
312
- }
313
-
314
- getFloatArrayType() {
315
- return this.source && this.source.length === 4
316
- ? Float32Array
317
- : Float64Array
318
- }
319
- updateBySource() {
320
- const byteArray = this.source!.reverse()
321
- const floatArrayType = this.getFloatArrayType()
322
- const buffer = new ArrayBuffer(byteArray.buffer.byteLength)
323
- new Uint8Array(buffer).set(new Uint8Array(byteArray.buffer))
324
- const floatArray = new floatArrayType(buffer)
325
- this.data! = floatArray[0]
326
- }
327
- updateByData() {
328
- const floatArrayType = this.getFloatArrayType()
329
- const floatArray = new floatArrayType([this.data!])
330
- const byteArray = new Uint8Array(floatArray.buffer)
331
- this.source = byteArray.reverse()
332
- }
333
- getValue() {
334
- return this.data
335
- }
336
- setValue(value: number) {
337
- this.setData(value)
338
- }
339
- }
340
-
341
- interface ContainerData {
342
- id: number
343
- idHex?: string
344
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
345
- data: WebmBase<any>
346
- }
347
-
348
- class WebmContainer extends WebmBase<ContainerData[]> {
349
- offset: number = 0
350
- data: ContainerData[] = []
351
-
352
- constructor(name: string, type: string) {
353
- super(name, type || 'Container')
354
- }
355
-
356
- readByte() {
357
- return this.source![this.offset++]
358
- }
359
- readUint() {
360
- const firstByte = this.readByte()
361
- const bytes = 8 - firstByte.toString(2).length
362
- let value = firstByte - (1 << (7 - bytes))
363
- for (let i = 0; i < bytes; i++) {
364
- // don't use bit operators to support x86
365
- value *= 256
366
- value += this.readByte()
367
- }
368
- return value
369
- }
370
- updateBySource() {
371
- let end: number | undefined = undefined
372
- this.data = []
373
- for (
374
- this.offset = 0;
375
- this.offset < this.source!.length;
376
- this.offset = end
377
- ) {
378
- const id = this.readUint()
379
- const len = this.readUint()
380
- end = Math.min(this.offset + len, this.source!.length)
381
- const data = this.source!.slice(this.offset, end)
382
-
383
- const info = sections[id] || { name: 'Unknown', type: 'Unknown' }
384
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
385
- let ctr: any = WebmBase
386
- switch (info.type) {
387
- case 'Container':
388
- ctr = WebmContainer
389
- break
390
- case 'Uint':
391
- ctr = WebmUint
392
- break
393
- case 'Float':
394
- ctr = WebmFloat
395
- break
396
- }
397
- const section = new ctr(info.name, info.type)
398
- section.setSource(data)
399
- this.data.push({
400
- id,
401
- idHex: id.toString(16),
402
- data: section,
403
- })
404
- }
405
- }
406
- writeUint(x: number, draft = false) {
407
- let flag = 0x80
408
- let bytes = 1
409
- // eslint-disable-next-line no-empty
410
- for (; x >= flag && bytes < 8; bytes++, flag *= 0x80) {}
411
-
412
- if (!draft) {
413
- let value = flag + x
414
- for (let i = bytes - 1; i >= 0; i--) {
415
- // don't use bit operators to support x86
416
- const c = value % 256
417
- this.source![this.offset! + i] = c
418
- value = (value - c) / 256
419
- }
420
- }
421
-
422
- this.offset += bytes
423
- }
424
-
425
- writeSections(draft = false) {
426
- this.offset = 0
427
- for (let i = 0; i < this.data.length; i++) {
428
- const section = this.data[i],
429
- content = section.data.source,
430
- contentLength = content!.length
431
- this.writeUint(section.id, draft)
432
- this.writeUint(contentLength, draft)
433
- if (!draft) {
434
- this.source!.set(content!, this.offset)
435
- }
436
- this.offset += contentLength
437
- }
438
- return this.offset
439
- }
440
-
441
- updateByData() {
442
- // run without accessing this.source to determine total length - need to know it to create Uint8Array
443
- const length = this.writeSections(true)
444
- this.source = new Uint8Array(length)
445
- // now really write data
446
- this.writeSections()
447
- }
448
-
449
- getSectionById(id: number) {
450
- for (let i = 0; i < this.data.length; i++) {
451
- const section = this.data[i]
452
- if (section.id === id) {
453
- return section.data
454
- }
455
- }
456
-
457
- return undefined
458
- }
459
- }
460
-
461
- class WebmFile extends WebmContainer {
462
- constructor(source: Uint8Array) {
463
- super('File', 'File')
464
- this.setSource(source)
465
- }
466
-
467
- fixDuration(duration: number) {
468
- const segmentSection = this.getSectionById(0x8538067) as WebmContainer
469
- if (!segmentSection) {
470
- return false
471
- }
472
-
473
- const infoSection = segmentSection.getSectionById(
474
- 0x549a966
475
- ) as WebmContainer
476
- if (!infoSection) {
477
- return false
478
- }
479
-
480
- const timeScaleSection = infoSection.getSectionById(
481
- 0xad7b1
482
- ) as WebmFloat
483
- if (!timeScaleSection) {
484
- return false
485
- }
486
-
487
- let durationSection = infoSection.getSectionById(0x489) as WebmFloat
488
- if (durationSection) {
489
- if (durationSection.getValue()! <= 0) {
490
- durationSection.setValue(duration)
491
- } else {
492
- return false
493
- }
494
- } else {
495
- // append Duration section
496
- durationSection = new WebmFloat('Duration', 'Float')
497
- durationSection.setValue(duration)
498
- infoSection.data.push({
499
- id: 0x489,
500
- data: durationSection,
501
- })
502
- }
503
-
504
- // set default time scale to 1 millisecond (1000000 nanoseconds)
505
- timeScaleSection.setValue(1000000)
506
- infoSection.updateByData()
507
- segmentSection.updateByData()
508
- this.updateByData()
509
-
510
- return true
511
- }
512
-
513
- toBlob(type = 'video/webm') {
514
- const buffer = new ArrayBuffer(this.source!.buffer.byteLength)
515
- new Uint8Array(buffer).set(new Uint8Array(this.source!.buffer))
516
- return new Blob([buffer], { type })
517
- }
518
- }
519
-
520
- /**
521
- * Fixes duration on MediaRecorder output.
522
- * @param blob Input Blob with incorrect duration.
523
- * @param duration Correct duration (in milliseconds).
524
- * @param type Output blob mimetype (default: video/webm).
525
- * @returns
526
- */
527
- export const webmFixDuration = (
528
- blob: Blob,
529
- duration: number,
530
- type = 'video/webm'
531
- ): Promise<Blob> => {
532
- return new Promise((resolve, reject) => {
533
- try {
534
- const reader = new FileReader()
535
-
536
- reader.addEventListener('loadend', () => {
537
- try {
538
- const result = reader.result as ArrayBuffer
539
- const file = new WebmFile(new Uint8Array(result))
540
- if (file.fixDuration(duration)) {
541
- resolve(file.toBlob(type))
542
- } else {
543
- resolve(blob)
544
- }
545
- } catch (ex) {
546
- reject(ex)
547
- }
548
- })
549
-
550
- reader.addEventListener('error', () =>
551
- reject(new Error('FileReader error'))
552
- )
553
-
554
- reader.readAsArrayBuffer(blob)
555
- } catch (ex) {
556
- reject(ex)
557
- }
558
- })
559
- }