@memberjunction/ai-realtime-client 6.2.0-edge.2 → 6.2.0-edge.4

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 (206) hide show
  1. package/README.md +156 -29
  2. package/dist/audio/audioMeter.d.ts +71 -0
  3. package/dist/audio/audioMeter.d.ts.map +1 -1
  4. package/dist/audio/audioMeter.js +83 -0
  5. package/dist/audio/audioMeter.js.map +1 -1
  6. package/dist/audio/mediaElementAudioRouter.d.ts +41 -0
  7. package/dist/audio/mediaElementAudioRouter.d.ts.map +1 -0
  8. package/dist/audio/mediaElementAudioRouter.js +82 -0
  9. package/dist/audio/mediaElementAudioRouter.js.map +1 -0
  10. package/dist/audio/micCapture.d.ts +12 -3
  11. package/dist/audio/micCapture.d.ts.map +1 -1
  12. package/dist/audio/micCapture.js +15 -1
  13. package/dist/audio/micCapture.js.map +1 -1
  14. package/dist/audio/pcmPlayback.d.ts +72 -4
  15. package/dist/audio/pcmPlayback.d.ts.map +1 -1
  16. package/dist/audio/pcmPlayback.js +101 -1
  17. package/dist/audio/pcmPlayback.js.map +1 -1
  18. package/dist/drivers/assemblyAIRealtimeClient.d.ts +2 -0
  19. package/dist/drivers/assemblyAIRealtimeClient.d.ts.map +1 -1
  20. package/dist/drivers/assemblyAIRealtimeClient.js +14 -0
  21. package/dist/drivers/assemblyAIRealtimeClient.js.map +1 -1
  22. package/dist/drivers/elevenLabsRealtimeClient.d.ts +2 -0
  23. package/dist/drivers/elevenLabsRealtimeClient.d.ts.map +1 -1
  24. package/dist/drivers/elevenLabsRealtimeClient.js +14 -0
  25. package/dist/drivers/elevenLabsRealtimeClient.js.map +1 -1
  26. package/dist/drivers/geminiAvatarOutput.d.ts +132 -0
  27. package/dist/drivers/geminiAvatarOutput.d.ts.map +1 -0
  28. package/dist/drivers/geminiAvatarOutput.js +310 -0
  29. package/dist/drivers/geminiAvatarOutput.js.map +1 -0
  30. package/dist/drivers/geminiEnterpriseRealtimeClient.d.ts +38 -0
  31. package/dist/drivers/geminiEnterpriseRealtimeClient.d.ts.map +1 -0
  32. package/dist/drivers/geminiEnterpriseRealtimeClient.js +107 -0
  33. package/dist/drivers/geminiEnterpriseRealtimeClient.js.map +1 -0
  34. package/dist/drivers/geminiRealtimeClient.d.ts +314 -48
  35. package/dist/drivers/geminiRealtimeClient.d.ts.map +1 -1
  36. package/dist/drivers/geminiRealtimeClient.js +759 -176
  37. package/dist/drivers/geminiRealtimeClient.js.map +1 -1
  38. package/dist/drivers/openAILiveClient.d.ts +5 -8
  39. package/dist/drivers/openAILiveClient.d.ts.map +1 -1
  40. package/dist/drivers/openAILiveClient.js +19 -32
  41. package/dist/drivers/openAILiveClient.js.map +1 -1
  42. package/dist/drivers/openAIRealtimeClient.d.ts +23 -26
  43. package/dist/drivers/openAIRealtimeClient.d.ts.map +1 -1
  44. package/dist/drivers/openAIRealtimeClient.js +42 -57
  45. package/dist/drivers/openAIRealtimeClient.js.map +1 -1
  46. package/dist/generic/baseRealtimeClient.d.ts +188 -30
  47. package/dist/generic/baseRealtimeClient.d.ts.map +1 -1
  48. package/dist/generic/baseRealtimeClient.js +250 -14
  49. package/dist/generic/baseRealtimeClient.js.map +1 -1
  50. package/dist/generic/openAIProtocolClient.d.ts +57 -1
  51. package/dist/generic/openAIProtocolClient.d.ts.map +1 -1
  52. package/dist/generic/openAIProtocolClient.js +89 -4
  53. package/dist/generic/openAIProtocolClient.js.map +1 -1
  54. package/dist/index.d.ts +2 -3
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +3 -3
  57. package/dist/index.js.map +1 -1
  58. package/dist/media/attachVideoSource.d.ts +23 -0
  59. package/dist/media/attachVideoSource.d.ts.map +1 -0
  60. package/dist/media/attachVideoSource.js +49 -0
  61. package/dist/media/attachVideoSource.js.map +1 -0
  62. package/dist/media/channelVideoSource.d.ts +110 -14
  63. package/dist/media/channelVideoSource.d.ts.map +1 -1
  64. package/dist/media/channelVideoSource.js +183 -18
  65. package/dist/media/channelVideoSource.js.map +1 -1
  66. package/dist/media/decoders/frameScheduler.d.ts +119 -0
  67. package/dist/media/decoders/frameScheduler.d.ts.map +1 -0
  68. package/dist/media/decoders/frameScheduler.js +238 -0
  69. package/dist/media/decoders/frameScheduler.js.map +1 -0
  70. package/dist/media/decoders/imageFrameDecoder.d.ts +58 -0
  71. package/dist/media/decoders/imageFrameDecoder.d.ts.map +1 -0
  72. package/dist/media/decoders/imageFrameDecoder.js +110 -0
  73. package/dist/media/decoders/imageFrameDecoder.js.map +1 -0
  74. package/dist/media/decoders/mseFmp4Decoder.d.ts +130 -0
  75. package/dist/media/decoders/mseFmp4Decoder.d.ts.map +1 -0
  76. package/dist/media/decoders/mseFmp4Decoder.js +402 -0
  77. package/dist/media/decoders/mseFmp4Decoder.js.map +1 -0
  78. package/dist/media/decoders/streamCanvas.d.ts +46 -0
  79. package/dist/media/decoders/streamCanvas.d.ts.map +1 -0
  80. package/dist/media/decoders/streamCanvas.js +163 -0
  81. package/dist/media/decoders/streamCanvas.js.map +1 -0
  82. package/dist/media/decoders/videoMimeTypes.d.ts +29 -0
  83. package/dist/media/decoders/videoMimeTypes.d.ts.map +1 -0
  84. package/dist/media/decoders/videoMimeTypes.js +50 -0
  85. package/dist/media/decoders/videoMimeTypes.js.map +1 -0
  86. package/dist/media/decoders/webCodecsChunkDecoder.d.ts +99 -0
  87. package/dist/media/decoders/webCodecsChunkDecoder.d.ts.map +1 -0
  88. package/dist/media/decoders/webCodecsChunkDecoder.js +265 -0
  89. package/dist/media/decoders/webCodecsChunkDecoder.js.map +1 -0
  90. package/dist/media/displayCapture.d.ts +128 -0
  91. package/dist/media/displayCapture.d.ts.map +1 -0
  92. package/dist/media/displayCapture.js +245 -0
  93. package/dist/media/displayCapture.js.map +1 -0
  94. package/dist/media/frameCapture.d.ts +25 -8
  95. package/dist/media/frameCapture.d.ts.map +1 -1
  96. package/dist/media/frameCapture.js +42 -72
  97. package/dist/media/frameCapture.js.map +1 -1
  98. package/dist/media/frameSampler.d.ts +94 -0
  99. package/dist/media/frameSampler.d.ts.map +1 -0
  100. package/dist/media/frameSampler.js +134 -0
  101. package/dist/media/frameSampler.js.map +1 -0
  102. package/dist/media/index.d.ts +32 -0
  103. package/dist/media/index.d.ts.map +1 -0
  104. package/dist/media/index.js +32 -0
  105. package/dist/media/index.js.map +1 -0
  106. package/dist/media/localMediaController.d.ts +116 -0
  107. package/dist/media/localMediaController.d.ts.map +1 -0
  108. package/dist/media/localMediaController.js +281 -0
  109. package/dist/media/localMediaController.js.map +1 -0
  110. package/dist/media/mediaLayout.d.ts +93 -0
  111. package/dist/media/mediaLayout.d.ts.map +1 -0
  112. package/dist/media/mediaLayout.js +187 -0
  113. package/dist/media/mediaLayout.js.map +1 -0
  114. package/dist/media/mediaPreview.d.ts +94 -0
  115. package/dist/media/mediaPreview.d.ts.map +1 -0
  116. package/dist/media/mediaPreview.js +154 -0
  117. package/dist/media/mediaPreview.js.map +1 -0
  118. package/dist/media/mediaStage.d.ts +99 -0
  119. package/dist/media/mediaStage.d.ts.map +1 -0
  120. package/dist/media/mediaStage.js +171 -0
  121. package/dist/media/mediaStage.js.map +1 -0
  122. package/dist/media/model.d.ts +154 -0
  123. package/dist/media/model.d.ts.map +1 -0
  124. package/dist/media/model.js +9 -0
  125. package/dist/media/model.js.map +1 -0
  126. package/dist/media/playbackClock.d.ts +20 -0
  127. package/dist/media/playbackClock.d.ts.map +1 -0
  128. package/dist/media/playbackClock.js +13 -0
  129. package/dist/media/playbackClock.js.map +1 -0
  130. package/dist/media/videoFrameDecoder.d.ts +86 -0
  131. package/dist/media/videoFrameDecoder.d.ts.map +1 -0
  132. package/dist/media/videoFrameDecoder.js +2 -0
  133. package/dist/media/videoFrameDecoder.js.map +1 -0
  134. package/dist/media/videoFrameDecoderRegistry.d.ts +40 -0
  135. package/dist/media/videoFrameDecoderRegistry.d.ts.map +1 -0
  136. package/dist/media/videoFrameDecoderRegistry.js +69 -0
  137. package/dist/media/videoFrameDecoderRegistry.js.map +1 -0
  138. package/dist/media/videoPacing.d.ts +32 -0
  139. package/dist/media/videoPacing.d.ts.map +1 -0
  140. package/dist/media/videoPacing.js +37 -0
  141. package/dist/media/videoPacing.js.map +1 -0
  142. package/dist/media/videoPlayout.d.ts +168 -0
  143. package/dist/media/videoPlayout.d.ts.map +1 -0
  144. package/dist/media/videoPlayout.js +217 -0
  145. package/dist/media/videoPlayout.js.map +1 -0
  146. package/dist/media/videoSourceArbiter.d.ts +250 -0
  147. package/dist/media/videoSourceArbiter.d.ts.map +1 -0
  148. package/dist/media/videoSourceArbiter.js +423 -0
  149. package/dist/media/videoSourceArbiter.js.map +1 -0
  150. package/dist/testing/conformanceAssertions.d.ts +25 -0
  151. package/dist/testing/conformanceAssertions.d.ts.map +1 -0
  152. package/dist/testing/conformanceAssertions.js +64 -0
  153. package/dist/testing/conformanceAssertions.js.map +1 -0
  154. package/dist/testing/conformanceFixtures.d.ts +76 -0
  155. package/dist/testing/conformanceFixtures.d.ts.map +1 -0
  156. package/dist/testing/conformanceFixtures.js +169 -0
  157. package/dist/testing/conformanceFixtures.js.map +1 -0
  158. package/dist/testing/conformanceGates.d.ts +32 -0
  159. package/dist/testing/conformanceGates.d.ts.map +1 -0
  160. package/dist/testing/conformanceGates.js +35 -0
  161. package/dist/testing/conformanceGates.js.map +1 -0
  162. package/dist/testing/conformanceMicrophone.d.ts +10 -0
  163. package/dist/testing/conformanceMicrophone.d.ts.map +1 -0
  164. package/dist/testing/conformanceMicrophone.js +71 -0
  165. package/dist/testing/conformanceMicrophone.js.map +1 -0
  166. package/dist/testing/conformanceTimeline.d.ts +128 -0
  167. package/dist/testing/conformanceTimeline.d.ts.map +1 -0
  168. package/dist/testing/conformanceTimeline.js +32 -0
  169. package/dist/testing/conformanceTimeline.js.map +1 -0
  170. package/dist/testing/conformanceVideoStream.d.ts +29 -0
  171. package/dist/testing/conformanceVideoStream.d.ts.map +1 -0
  172. package/dist/testing/conformanceVideoStream.js +39 -0
  173. package/dist/testing/conformanceVideoStream.js.map +1 -0
  174. package/dist/testing/index.d.ts +29 -0
  175. package/dist/testing/index.d.ts.map +1 -0
  176. package/dist/testing/index.js +28 -0
  177. package/dist/testing/index.js.map +1 -0
  178. package/dist/testing/realtimeVideoConformance.d.ts +23 -0
  179. package/dist/testing/realtimeVideoConformance.d.ts.map +1 -0
  180. package/dist/testing/realtimeVideoConformance.js +139 -0
  181. package/dist/testing/realtimeVideoConformance.js.map +1 -0
  182. package/dist/testing/realtimeVideoConformanceChecks.d.ts +4 -0
  183. package/dist/testing/realtimeVideoConformanceChecks.d.ts.map +1 -0
  184. package/dist/testing/realtimeVideoConformanceChecks.js +164 -0
  185. package/dist/testing/realtimeVideoConformanceChecks.js.map +1 -0
  186. package/dist/testing/realtimeVideoConformanceFrameChecks.d.ts +4 -0
  187. package/dist/testing/realtimeVideoConformanceFrameChecks.d.ts.map +1 -0
  188. package/dist/testing/realtimeVideoConformanceFrameChecks.js +63 -0
  189. package/dist/testing/realtimeVideoConformanceFrameChecks.js.map +1 -0
  190. package/dist/testing/realtimeVideoConformanceSession.d.ts +108 -0
  191. package/dist/testing/realtimeVideoConformanceSession.d.ts.map +1 -0
  192. package/dist/testing/realtimeVideoConformanceSession.js +270 -0
  193. package/dist/testing/realtimeVideoConformanceSession.js.map +1 -0
  194. package/dist/testing/realtimeVideoConformanceTurnChecks.d.ts +4 -0
  195. package/dist/testing/realtimeVideoConformanceTurnChecks.d.ts.map +1 -0
  196. package/dist/testing/realtimeVideoConformanceTurnChecks.js +248 -0
  197. package/dist/testing/realtimeVideoConformanceTurnChecks.js.map +1 -0
  198. package/dist/testing/realtimeVideoConformanceTypes.d.ts +155 -0
  199. package/dist/testing/realtimeVideoConformanceTypes.d.ts.map +1 -0
  200. package/dist/testing/realtimeVideoConformanceTypes.js +2 -0
  201. package/dist/testing/realtimeVideoConformanceTypes.js.map +1 -0
  202. package/dist/testing/recordingPlayout.d.ts +84 -0
  203. package/dist/testing/recordingPlayout.d.ts.map +1 -0
  204. package/dist/testing/recordingPlayout.js +120 -0
  205. package/dist/testing/recordingPlayout.js.map +1 -0
  206. package/package.json +29 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frameScheduler.js","sourceRoot":"","sources":["../../../src/media/decoders/frameScheduler.ts"],"names":[],"mappings":"AA2BA,gHAAgH;AAChH,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC;AAE/B,yHAAyH;AACzH,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC;AAEhC,wGAAwG;AACxG,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAErC,uHAAuH;AACvH,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,CAAC;AAEjC,oFAAoF;AACpF,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,CAAC;AAsBhC,6GAA6G;AAC7G,MAAM,OAAO,cAAc;IAiBvB;;;;OAIG;IACH,YACqB,MAAoB,EACpB,OAAmB,EACpC,UAAiC,EAAE;QAFlB,WAAM,GAAN,MAAM,CAAc;QACpB,YAAO,GAAP,OAAO,CAAY;QAvBvB,UAAK,GAAuB,EAAE,CAAC;QAGhD,qFAAqF;QAC7E,WAAM,GAAuB,IAAI,CAAC;QAC1C,yEAAyE;QACjE,gBAAW,GAAkB,IAAI,CAAC;QAC1C,qFAAqF;QAC7E,gBAAW,GAAuB,IAAI,CAAC;QAC/C,4FAA4F;QACpF,eAAU,GAAG,KAAK,CAAC;QAC3B,qEAAqE;QAC7D,iBAAY,GAAkB,IAAI,CAAC;QACnC,UAAK,GAAyC,IAAI,CAAC;QACnD,aAAQ,GAAG,KAAK,CAAC;QAYrB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,0CAA0C;IAC1C,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED;;;;;OAKG;IACI,IAAI,CAAC,OAAsB,EAAE,MAAe;QAC/C,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO;QACX,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACtD,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,EAAE,CAAC;QAChB,CAAC;IACL,CAAC;IAED,iHAAiH;IAC1G,KAAK;QACR,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3C,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;IAC7B,CAAC;IAED,qDAAqD;IAC9C,OAAO;QACV,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;IAED,8HAA8H;IACtH,IAAI;QACR,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,aAAa,IAAI,IAAI,CAAC;QAClD,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACnB,IAAI,CAAC,WAAW,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;YACrD,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC;aAAM,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YAC7B,OAAO;QACX,CAAC;aAAM,CAAC;YACJ,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,QAAQ,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;QACxF,CAAC;QACD,IAAI,KAAK,EAAE,CAAC;YACR,IAAI,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC;IACL,CAAC;IAED;;;;OAIG;IACK,YAAY,CAAC,GAAW;QAC5B,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACd,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC;YAC/B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAC3B,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC;YAChD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC;QAC5B,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,YAAY,KAAK,GAAG,CAAC;QAC1B,OAAO,GAAG,GAAG,IAAI,CAAC,YAAY,GAAG,aAAa,CAAC;IACnD,CAAC;IAED,2FAA2F;IACnF,mBAAmB;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;QACnC,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;IACtF,CAAC;IAED,gHAAgH;IACxG,WAAW,CAAC,OAAe;QAC/B,IAAI,GAAG,GAA4B,IAAI,CAAC;QACxC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACjE,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;gBACrB,MAAM;YACV,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAsB,CAAC;YACpD,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;gBACrB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACrB,SAAS;YACb,CAAC;YACD,GAAG,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;YACrB,GAAG,GAAG,IAAI,CAAC;QACf,CAAC;QACD,IAAI,GAAG,EAAE,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;QACD,OAAO,GAAG,KAAK,IAAI,CAAC;IACxB,CAAC;IAED;;;;OAIG;IACK,YAAY,CAAC,MAA0B,EAAE,OAAe;QAC5D,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,MAAM,CAAC;QAClB,CAAC;QACD,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;YACxC,OAAO,MAAM,CAAC;QAClB,CAAC;QACD,IAAI,OAAO,GAAG,MAAM,GAAG,iBAAiB,IAAI,MAAM,GAAG,OAAO,GAAG,WAAW,EAAE,CAAC;YACzE,OAAO,MAAM,CAAC;QAClB,CAAC;QACD,OAAO,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IAC9C,CAAC;IAED;;;OAGG;IACK,eAAe,CAAC,MAAc,EAAE,OAAe;QACnD,OAAO,IAAI,CAAC,WAAW,KAAK,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC,WAAW,IAAI,OAAO,IAAI,IAAI,CAAC,WAAW,CAAC;IACjG,CAAC;IAED,kFAAkF;IAC1E,aAAa,CAAC,GAAW;QAC7B,IAAI,GAAG,GAA0D,IAAI,CAAC;QACtE,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAC7C,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;gBACd,MAAM;YACV,CAAC;YACD,GAAG,EAAE,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC/B,GAAG,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAsB,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAC9E,CAAC;QACD,IAAI,CAAC,GAAG,EAAE,CAAC;YACP,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACzB,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC;QAClC,IAAI,IAAI,KAAK,SAAS,IAAI,GAAG,GAAG,GAAG,CAAC,KAAK,GAAG,WAAW,EAAE,CAAC;YACtD,IAAI,CAAC,MAAM,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACjD,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,4HAA4H;IACpH,KAAK,CAAC,SAA2B,EAAE,GAAW;QAClD,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC;QAC9B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACrB,OAAO,GAAG,CAAC;QACf,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;YAClD,IAAI,CAAC,MAAM,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACjD,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7D,CAAC;IAED,sGAAsG;IAC9F,eAAe,CAAC,MAAc,EAAE,GAAW;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAqB,CAAC;QAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,KAAK,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC;QACzE,OAAO,SAAS,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,GAAG,GAAG,WAAW,CAAC;IACtF,CAAC;IAEO,IAAI,CAAC,SAA2B;QACpC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,SAAS,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC,MAAM,CAAC;QACxC,CAAC;IACL,CAAC;IAED,kDAAkD;IAC1C,YAAY,CAAC,GAAW;QAC5B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;IAC7D,CAAC;IAED,gHAAgH;IACxG,UAAU,CAAC,OAAe;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAClC,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;IAC1G,CAAC;IAEO,QAAQ,CAAC,OAAe;QAC5B,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACxC,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;QACxD,CAAC;IACL,CAAC;IAEO,WAAW;QACf,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACtB,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACtB,CAAC;IACL,CAAC;CACJ"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * @fileoverview IMAGE FRAME DECODER: plays still images (`Kind: 'image'`: JPEG, PNG, WebP) through `createImageBitmap`,
3
+ * into the host's `<video>` element through a {@link StreamCanvas}. The `'image'` decoder of `VideoPlayout`.
4
+ *
5
+ * - **In order.** Images are decoded one at a time, in the order they arrived, while fewer than {@link MAX_IMAGES_AHEAD}
6
+ * decoded images wait to show; the rest wait encoded.
7
+ * - **Paced by presentation time when an image has one**, on the {@link FrameScheduler}: on the voice's clock when the
8
+ * player has one (`VideoPlayoutOptions.Clock`), else by its own time. An image without a time shows as soon as it is
9
+ * decoded.
10
+ * - **End of turn** needs nothing: every image stands alone. **Barge-in** drops the images waiting, decoded or not, and a
11
+ * decode under way; the last image shown stays.
12
+ * - An image the browser can't decode is dropped and reported (`'append-failed'`); the next one plays.
13
+ *
14
+ * @module @memberjunction/ai-realtime-client/media
15
+ */
16
+ import type { RealtimeVideoFrame } from '@memberjunction/ai';
17
+ import type { IVideoFrameDecoder, VideoFrameDecoderContext, VideoFrameDecoderRegistration } from '../videoFrameDecoder.js';
18
+ /** Decoded images waiting to show, at most; further images wait encoded. */
19
+ export declare const MAX_IMAGES_AHEAD = 4;
20
+ /** Encoded images waiting to be decoded, at most; beyond this the oldest are dropped. */
21
+ export declare const MAX_WAITING_IMAGES = 120;
22
+ /** Plays still images through `createImageBitmap`. */
23
+ export declare class ImageFrameDecoder implements IVideoFrameDecoder {
24
+ private readonly context;
25
+ private readonly canvas;
26
+ private readonly scheduler;
27
+ /** Images waiting to be decoded, in arrival order. */
28
+ private readonly waiting;
29
+ /** Whether a decode is under way: images decode one at a time, so they show in order. */
30
+ private decoding;
31
+ /** Bumped by Flush and Dispose: a decode that finishes after it is dropped. */
32
+ private generation;
33
+ private disposed;
34
+ /** Whether this browser can decode images of `mimeType` and show them. */
35
+ static CanPlay(mimeType: string): boolean;
36
+ /** @param context The player this decoder plays for. */
37
+ constructor(context: VideoFrameDecoderContext);
38
+ /** Always `false`: an image carries no voice. */
39
+ get IsPlaying(): boolean;
40
+ /** Images still to show: waiting to be decoded, decoding, or decoded and waiting for their time. */
41
+ get FramesAhead(): number;
42
+ Attach(element: HTMLVideoElement): void;
43
+ Detach(): void;
44
+ /** Takes one image: it is decoded in its turn and shown at its time, or at once when it has none. */
45
+ Append(frame: RealtimeVideoFrame): void;
46
+ /** Nothing to drain: every image stands alone, and those waiting still show. */
47
+ EndOfTurn(): void;
48
+ /** Barge-in: drops the images waiting, decoded or not, and the decode under way. The last image shown stays. */
49
+ Flush(): void;
50
+ Dispose(): void;
51
+ /** Decodes the next waiting image, when none is decoding and fewer than {@link MAX_IMAGES_AHEAD} wait to show. */
52
+ private feed;
53
+ private decoded;
54
+ private decodeFailed;
55
+ }
56
+ /** The `'image'` decoder: JPEG, PNG and WebP images, where this browser has `createImageBitmap`. */
57
+ export declare const IMAGE_FRAME_DECODER: VideoFrameDecoderRegistration;
58
+ //# sourceMappingURL=imageFrameDecoder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imageFrameDecoder.d.ts","sourceRoot":"","sources":["../../../src/media/decoders/imageFrameDecoder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAA2B,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACtF,OAAO,KAAK,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AAKxH,4EAA4E;AAC5E,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,yFAAyF;AACzF,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAEtC,sDAAsD;AACtD,qBAAa,iBAAkB,YAAW,kBAAkB;IAkB5C,OAAO,CAAC,QAAQ,CAAC,OAAO;IAjBpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiB;IAC3C,sDAAsD;IACtD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,yFAAyF;IACzF,OAAO,CAAC,QAAQ,CAAS;IACzB,+EAA+E;IAC/E,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,QAAQ,CAAS;IAEzB,0EAA0E;WAC5D,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAKhD,wDAAwD;gBAC3B,OAAO,EAAE,wBAAwB;IAI9D,iDAAiD;IACjD,IAAW,SAAS,IAAI,OAAO,CAE9B;IAED,oGAAoG;IACpG,IAAW,WAAW,IAAI,MAAM,CAE/B;IAEM,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAMvC,MAAM,IAAI,IAAI;IAIrB,qGAAqG;IAC9F,MAAM,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI;IAY9C,gFAAgF;IACzE,SAAS,IAAI,IAAI;IAIxB,gHAAgH;IACzG,KAAK,IAAI,IAAI;IAOb,OAAO,IAAI,IAAI;IAOtB,kHAAkH;IAClH,OAAO,CAAC,IAAI;IAaZ,OAAO,CAAC,OAAO;IAUf,OAAO,CAAC,YAAY;CASvB;AAED,oGAAoG;AACpG,eAAO,MAAM,mBAAmB,EAAE,6BAMjC,CAAC"}
@@ -0,0 +1,110 @@
1
+ import { FrameScheduler } from './frameScheduler.js';
2
+ import { StreamCanvas } from './streamCanvas.js';
3
+ import { IMAGE_FRAME_TYPES, MimeEssence } from './videoMimeTypes.js';
4
+ /** Decoded images waiting to show, at most; further images wait encoded. */
5
+ export const MAX_IMAGES_AHEAD = 4;
6
+ /** Encoded images waiting to be decoded, at most; beyond this the oldest are dropped. */
7
+ export const MAX_WAITING_IMAGES = 120;
8
+ /** Plays still images through `createImageBitmap`. */
9
+ export class ImageFrameDecoder {
10
+ /** Whether this browser can decode images of `mimeType` and show them. */
11
+ static CanPlay(mimeType) {
12
+ const canDecode = typeof createImageBitmap === 'function' && typeof Blob === 'function';
13
+ return canDecode && StreamCanvas.IsAvailable() && IMAGE_FRAME_TYPES.has(MimeEssence(mimeType));
14
+ }
15
+ /** @param context The player this decoder plays for. */
16
+ constructor(context) {
17
+ this.context = context;
18
+ this.canvas = new StreamCanvas();
19
+ /** Images waiting to be decoded, in arrival order. */
20
+ this.waiting = [];
21
+ /** Whether a decode is under way: images decode one at a time, so they show in order. */
22
+ this.decoding = false;
23
+ /** Bumped by Flush and Dispose: a decode that finishes after it is dropped. */
24
+ this.generation = 0;
25
+ this.disposed = false;
26
+ this.scheduler = new FrameScheduler(this.canvas, () => this.feed(), { Clock: context.Clock });
27
+ }
28
+ /** Always `false`: an image carries no voice. */
29
+ get IsPlaying() {
30
+ return false;
31
+ }
32
+ /** Images still to show: waiting to be decoded, decoding, or decoded and waiting for their time. */
33
+ get FramesAhead() {
34
+ return this.waiting.length + (this.decoding ? 1 : 0) + this.scheduler.Size;
35
+ }
36
+ Attach(element) {
37
+ if (!this.disposed) {
38
+ this.canvas.Attach(element);
39
+ }
40
+ }
41
+ Detach() {
42
+ this.canvas.Detach();
43
+ }
44
+ /** Takes one image: it is decoded in its turn and shown at its time, or at once when it has none. */
45
+ Append(frame) {
46
+ if (this.disposed || frame.Kind !== 'image') {
47
+ return;
48
+ }
49
+ this.waiting.push(frame);
50
+ if (this.waiting.length > MAX_WAITING_IMAGES) {
51
+ this.waiting.splice(0, this.waiting.length - MAX_WAITING_IMAGES);
52
+ this.context.Report('pending-overflow', 'Images arrived faster than they could be decoded; the oldest were dropped.');
53
+ }
54
+ this.feed();
55
+ }
56
+ /** Nothing to drain: every image stands alone, and those waiting still show. */
57
+ EndOfTurn() {
58
+ // Images need no flush.
59
+ }
60
+ /** Barge-in: drops the images waiting, decoded or not, and the decode under way. The last image shown stays. */
61
+ Flush() {
62
+ this.generation++;
63
+ this.decoding = false;
64
+ this.waiting.length = 0;
65
+ this.scheduler.Clear();
66
+ }
67
+ Dispose() {
68
+ this.Flush();
69
+ this.disposed = true;
70
+ this.scheduler.Dispose();
71
+ this.canvas.Dispose();
72
+ }
73
+ /** Decodes the next waiting image, when none is decoding and fewer than {@link MAX_IMAGES_AHEAD} wait to show. */
74
+ feed() {
75
+ if (this.disposed || this.decoding || this.waiting.length === 0 || this.scheduler.Size >= MAX_IMAGES_AHEAD) {
76
+ return;
77
+ }
78
+ const frame = this.waiting.shift();
79
+ const generation = this.generation;
80
+ this.decoding = true;
81
+ createImageBitmap(new Blob([frame.Data], { type: frame.MimeType })).then((image) => this.decoded(generation, image, frame.PresentationTimeMs), (error) => this.decodeFailed(generation, frame, error));
82
+ }
83
+ decoded(generation, image, timeMs) {
84
+ if (generation !== this.generation) {
85
+ image.close();
86
+ return;
87
+ }
88
+ this.decoding = false;
89
+ this.scheduler.Push(image, timeMs);
90
+ this.feed();
91
+ }
92
+ decodeFailed(generation, frame, error) {
93
+ if (generation !== this.generation) {
94
+ return;
95
+ }
96
+ this.decoding = false;
97
+ const reason = error instanceof Error ? error.message : String(error);
98
+ this.context.Report('append-failed', `The browser could not decode an image of type ${frame.MimeType}: ${reason}`);
99
+ this.feed();
100
+ }
101
+ }
102
+ /** The `'image'` decoder: JPEG, PNG and WebP images, where this browser has `createImageBitmap`. */
103
+ export const IMAGE_FRAME_DECODER = {
104
+ Name: 'image',
105
+ Kind: 'image',
106
+ Priority: 0,
107
+ CanPlay: (mimeType) => ImageFrameDecoder.CanPlay(mimeType),
108
+ Create: (context) => new ImageFrameDecoder(context),
109
+ };
110
+ //# sourceMappingURL=imageFrameDecoder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imageFrameDecoder.js","sourceRoot":"","sources":["../../../src/media/decoders/imageFrameDecoder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * @fileoverview MSE FMP4 DECODER: plays fragmented MP4 frames (`Kind: 'fmp4'`), such as a Gemini Live avatar, through
3
+ * Media Source Extensions into the host's `<video>` element. The `'mse-fmp4'` decoder of `VideoPlayout`.
4
+ *
5
+ * - **Format.** The first piece of a turn is an init segment (`Piece: 'init'`, `ftyp` + `moov`); each later piece is a
6
+ * media fragment (`moof` + `mdat`). A turn may send a fresh init segment and restart its timestamps; the source buffer
7
+ * runs in `sequence` mode, so playback stays continuous either way.
8
+ * - **Codecs come from the init segment.** The source buffer takes the codecs the init segment's tracks name
9
+ * (`avc1.42c01f` alone for video-only MP4), read by `ReadFmp4Init` from `@memberjunction/ai`; until an init arrives, or
10
+ * when it names a codec the reader doesn't know, it takes the player's configured type.
11
+ * - **The video carries the voice.** An avatar's audio is muxed into the MP4, so the element is unmuted and lips and voice
12
+ * stay in sync on the media's own timestamps. While media is buffered ahead of the playhead, {@link MseFmp4Decoder.IsPlaying}
13
+ * is true: the agent is audibly speaking. When the voice plays elsewhere (separate PCM), the element is muted. The
14
+ * element-attached hook lets the realtime client route the element's audio into its own Web Audio graph.
15
+ * - **End of turn** ends the stream once the turn's pieces are in, so playback runs to the true end and holds the last
16
+ * frame. **Barge-in** drops everything not yet played and pauses. **Gaps** (between turns, or while a connection
17
+ * resumes) hold the last frame.
18
+ * - **Browsers.** `MediaSource` (Chrome, Edge, Firefox, desktop Safari), or `ManagedMediaSource` (iOS Safari 17.1+).
19
+ *
20
+ * @module @memberjunction/ai-realtime-client/media
21
+ */
22
+ import { type RealtimeVideoFrame } from '@memberjunction/ai';
23
+ import type { IVideoFrameDecoder, VideoFrameDecoderContext, VideoFrameDecoderRegistration } from '../videoFrameDecoder.js';
24
+ /** Plays fragmented MP4 frames through MSE into one `<video>` element at a time. */
25
+ export declare class MseFmp4Decoder implements IVideoFrameDecoder {
26
+ private readonly context;
27
+ private readonly mimeType;
28
+ private readonly backBufferSeconds;
29
+ private readonly pending;
30
+ private element;
31
+ private mediaSource;
32
+ private objectUrl;
33
+ private sourceBuffer;
34
+ /** The type the source buffer was opened with, or last changed to. */
35
+ private bufferType;
36
+ /** The latest init segment, replayed into a new source buffer when the decoder moves to another element. */
37
+ private lastInit;
38
+ /** Set by Flush: the next append starts at the playhead instead of after what was dropped. */
39
+ private restartAtPlayhead;
40
+ private retriedAfterQuota;
41
+ /** Where the last back-buffer trim ended, in media time. */
42
+ private trimmedTo;
43
+ /** Set by EndOfTurn: end the stream once every pending piece is in. */
44
+ private endPending;
45
+ /** Where each appended piece ends on the element's timeline (seconds), oldest first, until the playhead passes it. */
46
+ private readonly appendedEnds;
47
+ /** Whether the source buffer is appending a piece: its `updateend` records where the piece ends. */
48
+ private appending;
49
+ private disposed;
50
+ /** Whether this browser can play `mimeType` through MSE. */
51
+ static CanPlay(mimeType: string): boolean;
52
+ /** @param context The player this decoder plays for. */
53
+ constructor(context: VideoFrameDecoderContext);
54
+ /**
55
+ * Whether the element is playing forward with media buffered ahead of the playhead: the agent is audibly
56
+ * speaking. False while it waits for data, which it does just short of the end of a turn that hasn't
57
+ * been ended with {@link EndOfTurn}.
58
+ */
59
+ get IsPlaying(): boolean;
60
+ /**
61
+ * How many pieces are still to play: pending (waiting for the source buffer, or for an element), being appended, or
62
+ * appended and ending past the playhead. The source buffer lays pieces end to end (`sequence` mode), so a piece ends
63
+ * where the buffered media ended once it was in. A piece a {@link Flush} removed, or the browser rejected, is not
64
+ * counted; nor is media of an element the decoder let go.
65
+ */
66
+ get FramesAhead(): number;
67
+ /** Hands over one frame, in the order they arrived: an init segment or a media fragment. */
68
+ Append(frame: RealtimeVideoFrame): void;
69
+ /**
70
+ * The turn's last piece has arrived. Ends the stream once it is all in, so playback runs to the true end of
71
+ * the turn; the next {@link Append} reopens it and playback continues from there.
72
+ */
73
+ EndOfTurn(): void;
74
+ /**
75
+ * Barge-in: drops everything not yet played and pauses, so the voice stops now instead of after the audio the
76
+ * browser has already decoded. The last frame stays on screen; the next turn's media resumes playback.
77
+ */
78
+ Flush(): void;
79
+ /** Stops playout and releases the element and the media source. */
80
+ Dispose(): void;
81
+ /** Takes the element over: a new media source, the latest init segment replayed into it, then what is pending. */
82
+ Attach(element: HTMLVideoElement): void;
83
+ /** Lets the element go: its source is removed and the media source released. */
84
+ Detach(): void;
85
+ /** Readies an element before it plays: its audio on or off, the attach hook, and what iOS's managed MSE requires. */
86
+ private prepareElement;
87
+ private openSourceBuffer;
88
+ /** Appends the next pending frame when the buffer is free. */
89
+ private pump;
90
+ /** The type for a source buffer that takes `init`: the init's own codecs when this browser plays them, else the player's type. */
91
+ private typeFor;
92
+ /**
93
+ * Switches the source buffer to an init segment's codecs before the init is appended, when they differ from the
94
+ * buffer's: it opened with the player's type before the first init arrived, or a later init changed tracks. A browser
95
+ * without `changeType`, or an init whose codecs can't be read or played, leaves the buffer as it is.
96
+ */
97
+ private matchBufferType;
98
+ /** After each append or removal: trims played media, appends the next piece, and ends a finished turn. */
99
+ private afterUpdate;
100
+ /**
101
+ * An append finished: the piece ends where the buffered media now ends, since the buffer lays pieces end to end.
102
+ * Pieces the playhead has passed are forgotten here too, so the list holds only what is ahead.
103
+ */
104
+ private recordAppendedEnd;
105
+ /** Forgets the appended pieces the playhead has reached the end of (to within {@link PLAYING_EPSILON_SECONDS}). */
106
+ private forgetPlayedPieces;
107
+ /** Ends the stream for a finished turn once nothing is pending or in flight. */
108
+ private endStreamWhenDrained;
109
+ /**
110
+ * A turn that ran to its end, or a Flush, leaves the element paused. Once new media reaches past the playhead,
111
+ * play on from there. An ended element is first sought to where it stopped: play() on an ended element starts
112
+ * over from the beginning (Chrome does), which would replay the previous turn.
113
+ */
114
+ private resumeWhenMediaArrives;
115
+ /**
116
+ * Removes played media more than the back buffer's seconds behind the playhead, so a long session stays within the
117
+ * browser's buffer quota. A trim waits until {@link TRIM_STEP_SECONDS} more have played since the last one, so a
118
+ * removal that doesn't shrink the buffer can't repeat on every `updateend`. When `bufferFull`, keeps only
119
+ * {@link QUOTA_BACK_BUFFER_SECONDS} and skips the wait.
120
+ *
121
+ * @returns Whether a removal started (the next append waits for its `updateend`).
122
+ */
123
+ private trimBackBuffer;
124
+ /** Out of buffer space: trim harder and retry once. Anything else drops the piece. */
125
+ private handleAppendError;
126
+ private detach;
127
+ }
128
+ /** The `'mse-fmp4'` decoder: fragmented MP4 frames whose type this browser's Media Source Extensions play. */
129
+ export declare const MSE_FMP4_DECODER: VideoFrameDecoderRegistration;
130
+ //# sourceMappingURL=mseFmp4Decoder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mseFmp4Decoder.d.ts","sourceRoot":"","sources":["../../../src/media/decoders/mseFmp4Decoder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAA6C,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxG,OAAO,KAAK,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AA2CxH,oFAAoF;AACpF,qBAAa,cAAe,YAAW,kBAAkB;IA+BzC,OAAO,CAAC,QAAQ,CAAC,OAAO;IA9BpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgC;IACxD,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,YAAY,CAA6B;IACjD,sEAAsE;IACtE,OAAO,CAAC,UAAU,CAAuB;IACzC,4GAA4G;IAC5G,OAAO,CAAC,QAAQ,CAAuC;IACvD,8FAA8F;IAC9F,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,iBAAiB,CAAS;IAClC,4DAA4D;IAC5D,OAAO,CAAC,SAAS,CAAK;IACtB,uEAAuE;IACvE,OAAO,CAAC,UAAU,CAAS;IAC3B,sHAAsH;IACtH,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;IAC7C,oGAAoG;IACpG,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAS;IAEzB,4DAA4D;WAC9C,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIhD,wDAAwD;gBAC3B,OAAO,EAAE,wBAAwB;IAK9D;;;;OAIG;IACH,IAAW,SAAS,IAAI,OAAO,CAO9B;IAED;;;;;OAKG;IACH,IAAW,WAAW,IAAI,MAAM,CAG/B;IAED,4FAA4F;IACrF,MAAM,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI;IAoB9C;;;OAGG;IACI,SAAS,IAAI,IAAI;IAKxB;;;OAGG;IACI,KAAK,IAAI,IAAI;IAsBpB,mEAAmE;IAC5D,OAAO,IAAI,IAAI;IAMtB,kHAAkH;IAC3G,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAsB9C,gFAAgF;IACzE,MAAM,IAAI,IAAI;IAIrB,qHAAqH;IACrH,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,gBAAgB;IAmBxB,8DAA8D;IAC9D,OAAO,CAAC,IAAI;IAuBZ,kIAAkI;IAClI,OAAO,CAAC,OAAO;IAKf;;;;OAIG;IACH,OAAO,CAAC,eAAe;IASvB,0GAA0G;IAC1G,OAAO,CAAC,WAAW;IAUnB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAUzB,mHAAmH;IACnH,OAAO,CAAC,kBAAkB;IAU1B,gFAAgF;IAChF,OAAO,CAAC,oBAAoB;IAa5B;;;;OAIG;IACH,OAAO,CAAC,sBAAsB;IAiB9B;;;;;;;OAOG;IACH,OAAO,CAAC,cAAc;IAgBtB,sFAAsF;IACtF,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,MAAM;CAoBjB;AAED,8GAA8G;AAC9G,eAAO,MAAM,gBAAgB,EAAE,6BAM9B,CAAC"}