@meframe/core 0.0.29 → 0.0.30-beta

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 (212) hide show
  1. package/dist/Meframe.d.ts +2 -13
  2. package/dist/Meframe.d.ts.map +1 -1
  3. package/dist/Meframe.js +6 -100
  4. package/dist/Meframe.js.map +1 -1
  5. package/dist/cache/CacheManager.d.ts +35 -19
  6. package/dist/cache/CacheManager.d.ts.map +1 -1
  7. package/dist/cache/CacheManager.js +223 -134
  8. package/dist/cache/CacheManager.js.map +1 -1
  9. package/dist/cache/l1/VideoL1Cache.d.ts +15 -2
  10. package/dist/cache/l1/VideoL1Cache.d.ts.map +1 -1
  11. package/dist/cache/l1/VideoL1Cache.js +58 -38
  12. package/dist/cache/l1/VideoL1Cache.js.map +1 -1
  13. package/dist/cache/l2/L2Cache.d.ts.map +1 -1
  14. package/dist/cache/l2/L2Cache.js +5 -5
  15. package/dist/cache/l2/L2Cache.js.map +1 -1
  16. package/dist/cache/l2/L2OPFSStore.d.ts +37 -0
  17. package/dist/cache/l2/L2OPFSStore.d.ts.map +1 -0
  18. package/dist/cache/l2/L2OPFSStore.js +89 -0
  19. package/dist/cache/l2/L2OPFSStore.js.map +1 -0
  20. package/dist/cache/resource/AudioSampleCache.d.ts +52 -0
  21. package/dist/cache/resource/AudioSampleCache.d.ts.map +1 -0
  22. package/dist/cache/resource/AudioSampleCache.js +69 -0
  23. package/dist/cache/resource/AudioSampleCache.js.map +1 -0
  24. package/dist/cache/resource/ImageBitmapCache.d.ts +65 -0
  25. package/dist/cache/resource/ImageBitmapCache.d.ts.map +1 -0
  26. package/dist/cache/resource/ImageBitmapCache.js +101 -0
  27. package/dist/cache/resource/ImageBitmapCache.js.map +1 -0
  28. package/dist/cache/resource/MP4IndexCache.d.ts +48 -0
  29. package/dist/cache/resource/MP4IndexCache.d.ts.map +1 -0
  30. package/dist/cache/resource/MP4IndexCache.js +104 -0
  31. package/dist/cache/resource/MP4IndexCache.js.map +1 -0
  32. package/dist/cache/resource/ResourceCache.d.ts +46 -0
  33. package/dist/cache/resource/ResourceCache.d.ts.map +1 -0
  34. package/dist/cache/resource/ResourceCache.js +92 -0
  35. package/dist/cache/resource/ResourceCache.js.map +1 -0
  36. package/dist/cache/storage/indexeddb/ChunkRecordStore.d.ts +75 -0
  37. package/dist/cache/storage/indexeddb/ChunkRecordStore.d.ts.map +1 -0
  38. package/dist/cache/{l2/IndexedDBStore.js → storage/indexeddb/ChunkRecordStore.js} +3 -3
  39. package/dist/cache/storage/indexeddb/ChunkRecordStore.js.map +1 -0
  40. package/dist/cache/storage/opfs/OPFSManager.d.ts +54 -0
  41. package/dist/cache/storage/opfs/OPFSManager.d.ts.map +1 -0
  42. package/dist/cache/storage/opfs/OPFSManager.js +133 -0
  43. package/dist/cache/storage/opfs/OPFSManager.js.map +1 -0
  44. package/dist/cache/storage/opfs/types.d.ts +16 -0
  45. package/dist/cache/storage/opfs/types.d.ts.map +1 -0
  46. package/dist/config/defaults.d.ts.map +1 -1
  47. package/dist/config/defaults.js +21 -2
  48. package/dist/config/defaults.js.map +1 -1
  49. package/dist/config/types.d.ts +28 -0
  50. package/dist/config/types.d.ts.map +1 -1
  51. package/dist/controllers/ExportController.d.ts +16 -0
  52. package/dist/controllers/ExportController.d.ts.map +1 -0
  53. package/dist/controllers/ExportController.js +44 -0
  54. package/dist/controllers/ExportController.js.map +1 -0
  55. package/dist/controllers/PlaybackController.d.ts +28 -4
  56. package/dist/controllers/PlaybackController.d.ts.map +1 -1
  57. package/dist/controllers/PlaybackController.js +116 -51
  58. package/dist/controllers/PlaybackController.js.map +1 -1
  59. package/dist/controllers/index.d.ts +2 -3
  60. package/dist/controllers/index.d.ts.map +1 -1
  61. package/dist/controllers/types.d.ts +0 -28
  62. package/dist/controllers/types.d.ts.map +1 -1
  63. package/dist/event/events.d.ts +8 -0
  64. package/dist/event/events.d.ts.map +1 -1
  65. package/dist/event/events.js +1 -0
  66. package/dist/event/events.js.map +1 -1
  67. package/dist/model/CompositionModel.d.ts.map +1 -1
  68. package/dist/model/CompositionModel.js +11 -6
  69. package/dist/model/CompositionModel.js.map +1 -1
  70. package/dist/model/RcFrame.d.ts +2 -0
  71. package/dist/model/RcFrame.d.ts.map +1 -1
  72. package/dist/model/RcFrame.js +3 -0
  73. package/dist/model/RcFrame.js.map +1 -1
  74. package/dist/orchestrator/ExportScheduler.d.ts +35 -0
  75. package/dist/orchestrator/ExportScheduler.d.ts.map +1 -0
  76. package/dist/orchestrator/ExportScheduler.js +241 -0
  77. package/dist/orchestrator/ExportScheduler.js.map +1 -0
  78. package/dist/orchestrator/GlobalAudioSession.d.ts +21 -7
  79. package/dist/orchestrator/GlobalAudioSession.d.ts.map +1 -1
  80. package/dist/orchestrator/GlobalAudioSession.js +132 -140
  81. package/dist/orchestrator/GlobalAudioSession.js.map +1 -1
  82. package/dist/orchestrator/OnDemandVideoSession.d.ts +73 -0
  83. package/dist/orchestrator/OnDemandVideoSession.d.ts.map +1 -0
  84. package/dist/orchestrator/OnDemandVideoSession.js +281 -0
  85. package/dist/orchestrator/OnDemandVideoSession.js.map +1 -0
  86. package/dist/orchestrator/Orchestrator.d.ts +22 -17
  87. package/dist/orchestrator/Orchestrator.d.ts.map +1 -1
  88. package/dist/orchestrator/Orchestrator.js +231 -297
  89. package/dist/orchestrator/Orchestrator.js.map +1 -1
  90. package/dist/orchestrator/VideoClipSession.d.ts.map +1 -1
  91. package/dist/orchestrator/VideoClipSession.js +3 -15
  92. package/dist/orchestrator/VideoClipSession.js.map +1 -1
  93. package/dist/orchestrator/index.d.ts +0 -1
  94. package/dist/orchestrator/index.d.ts.map +1 -1
  95. package/dist/orchestrator/types.d.ts +4 -4
  96. package/dist/orchestrator/types.d.ts.map +1 -1
  97. package/dist/stages/compose/FilterProcessor.d.ts +1 -1
  98. package/dist/stages/compose/FilterProcessor.d.ts.map +1 -1
  99. package/dist/stages/compose/FilterProcessor.js +226 -0
  100. package/dist/stages/compose/FilterProcessor.js.map +1 -0
  101. package/dist/stages/compose/LayerRenderer.d.ts +1 -1
  102. package/dist/stages/compose/LayerRenderer.d.ts.map +1 -1
  103. package/dist/stages/compose/LayerRenderer.js +270 -0
  104. package/dist/stages/compose/LayerRenderer.js.map +1 -0
  105. package/dist/stages/compose/TransitionProcessor.d.ts +1 -1
  106. package/dist/stages/compose/TransitionProcessor.d.ts.map +1 -1
  107. package/dist/stages/compose/TransitionProcessor.js +189 -0
  108. package/dist/stages/compose/TransitionProcessor.js.map +1 -0
  109. package/dist/stages/compose/VideoComposer.d.ts +4 -2
  110. package/dist/stages/compose/VideoComposer.d.ts.map +1 -1
  111. package/dist/stages/compose/VideoComposer.js +229 -0
  112. package/dist/stages/compose/VideoComposer.js.map +1 -0
  113. package/dist/stages/compose/text-renderers/animation-utils.js +76 -0
  114. package/dist/stages/compose/text-renderers/animation-utils.js.map +1 -0
  115. package/dist/stages/compose/text-renderers/basic-text-renderer.d.ts +2 -2
  116. package/dist/stages/compose/text-renderers/basic-text-renderer.d.ts.map +1 -1
  117. package/dist/stages/compose/text-renderers/basic-text-renderer.js +93 -0
  118. package/dist/stages/compose/text-renderers/basic-text-renderer.js.map +1 -0
  119. package/dist/stages/compose/text-renderers/character-ktv-renderer.d.ts +1 -1
  120. package/dist/stages/compose/text-renderers/character-ktv-renderer.d.ts.map +1 -1
  121. package/dist/stages/compose/text-renderers/character-ktv-renderer.js +132 -0
  122. package/dist/stages/compose/text-renderers/character-ktv-renderer.js.map +1 -0
  123. package/dist/stages/compose/text-renderers/word-by-word-renderer.d.ts +1 -1
  124. package/dist/stages/compose/text-renderers/word-by-word-renderer.d.ts.map +1 -1
  125. package/dist/stages/compose/text-renderers/word-by-word-renderer.js +128 -0
  126. package/dist/stages/compose/text-renderers/word-by-word-renderer.js.map +1 -0
  127. package/dist/stages/compose/text-renderers/word-fancy-renderer.d.ts +1 -1
  128. package/dist/stages/compose/text-renderers/word-fancy-renderer.d.ts.map +1 -1
  129. package/dist/stages/compose/text-renderers/word-fancy-renderer.js +135 -0
  130. package/dist/stages/compose/text-renderers/word-fancy-renderer.js.map +1 -0
  131. package/dist/stages/compose/text-utils/locale-detector.js +16 -0
  132. package/dist/stages/compose/text-utils/locale-detector.js.map +1 -0
  133. package/dist/stages/compose/text-utils/text-metrics.js +21 -0
  134. package/dist/stages/compose/text-utils/text-metrics.js.map +1 -0
  135. package/dist/stages/compose/text-utils/text-wrapper.js +225 -0
  136. package/dist/stages/compose/text-utils/text-wrapper.js.map +1 -0
  137. package/dist/stages/compose/types.d.ts +2 -1
  138. package/dist/stages/compose/types.d.ts.map +1 -1
  139. package/dist/stages/decode/BaseDecoder.js +0 -3
  140. package/dist/stages/decode/BaseDecoder.js.map +1 -1
  141. package/dist/stages/demux/MP4Demuxer.d.ts +5 -0
  142. package/dist/stages/demux/MP4Demuxer.d.ts.map +1 -1
  143. package/dist/stages/demux/MP4Demuxer.js +281 -0
  144. package/dist/stages/demux/MP4Demuxer.js.map +1 -0
  145. package/dist/stages/demux/MP4IndexParser.d.ts +71 -0
  146. package/dist/stages/demux/MP4IndexParser.d.ts.map +1 -0
  147. package/dist/stages/demux/MP4IndexParser.js +416 -0
  148. package/dist/stages/demux/MP4IndexParser.js.map +1 -0
  149. package/dist/stages/demux/types.d.ts +48 -0
  150. package/dist/stages/demux/types.d.ts.map +1 -1
  151. package/dist/stages/load/ResourceLoader.d.ts +44 -2
  152. package/dist/stages/load/ResourceLoader.d.ts.map +1 -1
  153. package/dist/stages/load/ResourceLoader.js +281 -37
  154. package/dist/stages/load/ResourceLoader.js.map +1 -1
  155. package/dist/stages/load/TaskManager.d.ts +6 -2
  156. package/dist/stages/load/TaskManager.d.ts.map +1 -1
  157. package/dist/stages/load/TaskManager.js +27 -4
  158. package/dist/stages/load/TaskManager.js.map +1 -1
  159. package/dist/stages/load/types.d.ts +7 -0
  160. package/dist/stages/load/types.d.ts.map +1 -1
  161. package/dist/stages/mux/MP4Muxer.d.ts +2 -2
  162. package/dist/stages/mux/MP4Muxer.d.ts.map +1 -1
  163. package/dist/stages/mux/MP4Muxer.js +24 -13
  164. package/dist/stages/mux/MP4Muxer.js.map +1 -1
  165. package/dist/stages/mux/MuxManager.d.ts +10 -21
  166. package/dist/stages/mux/MuxManager.d.ts.map +1 -1
  167. package/dist/stages/mux/MuxManager.js +21 -162
  168. package/dist/stages/mux/MuxManager.js.map +1 -1
  169. package/dist/stages/mux/index.d.ts +0 -1
  170. package/dist/stages/mux/index.d.ts.map +1 -1
  171. package/dist/utils/binary-search.d.ts +12 -4
  172. package/dist/utils/binary-search.d.ts.map +1 -1
  173. package/dist/utils/binary-search.js +52 -6
  174. package/dist/utils/binary-search.js.map +1 -1
  175. package/dist/workers/{BaseDecoder.BWYu1W0B.js → BaseDecoder.CTW-vr29.js} +1 -4
  176. package/dist/workers/BaseDecoder.CTW-vr29.js.map +1 -0
  177. package/dist/workers/{MP4Demuxer.lMOUMWFh.js → MP4Demuxer.BEa6PLJm.js} +9 -2
  178. package/dist/workers/{MP4Demuxer.lMOUMWFh.js.map → MP4Demuxer.BEa6PLJm.js.map} +1 -1
  179. package/dist/workers/stages/compose/{video-compose.worker.CIeEIJO7.js → video-compose.worker.DHQ8B105.js} +59 -31
  180. package/dist/workers/stages/compose/video-compose.worker.DHQ8B105.js.map +1 -0
  181. package/dist/workers/stages/decode/{audio-decode.worker.DnS17GD9.js → audio-decode.worker.CP8bXXa4.js} +2 -2
  182. package/dist/workers/stages/decode/{audio-decode.worker.DnS17GD9.js.map → audio-decode.worker.CP8bXXa4.js.map} +1 -1
  183. package/dist/workers/stages/decode/{video-decode.worker.BEYsjOXp.js → video-decode.worker.BIspTxgV.js} +2 -2
  184. package/dist/workers/stages/decode/{video-decode.worker.BEYsjOXp.js.map → video-decode.worker.BIspTxgV.js.map} +1 -1
  185. package/dist/workers/stages/demux/{audio-demux.worker.DcurGC8i.js → audio-demux.worker._VRQdLdv.js} +2 -2
  186. package/dist/workers/stages/demux/{audio-demux.worker.DcurGC8i.js.map → audio-demux.worker._VRQdLdv.js.map} +1 -1
  187. package/dist/workers/stages/demux/{video-demux.worker.B1_wntU4.js → video-demux.worker.CSkxGtmx.js} +3 -19
  188. package/dist/workers/stages/demux/video-demux.worker.CSkxGtmx.js.map +1 -0
  189. package/dist/workers/worker-manifest.json +5 -5
  190. package/package.json +1 -1
  191. package/dist/cache/l2/IndexedDBStore.js.map +0 -1
  192. package/dist/cache/l2/OPFSStore.js +0 -131
  193. package/dist/cache/l2/OPFSStore.js.map +0 -1
  194. package/dist/controllers/PreRenderService.d.ts +0 -59
  195. package/dist/controllers/PreRenderService.d.ts.map +0 -1
  196. package/dist/controllers/PreRenderService.js +0 -185
  197. package/dist/controllers/PreRenderService.js.map +0 -1
  198. package/dist/controllers/PreRenderTaskQueue.d.ts +0 -21
  199. package/dist/controllers/PreRenderTaskQueue.d.ts.map +0 -1
  200. package/dist/orchestrator/ClipSessionManager.d.ts +0 -70
  201. package/dist/orchestrator/ClipSessionManager.d.ts.map +0 -1
  202. package/dist/orchestrator/ClipSessionManager.js +0 -158
  203. package/dist/orchestrator/ClipSessionManager.js.map +0 -1
  204. package/dist/stages/decode/AudioChunkDecoder.js +0 -169
  205. package/dist/stages/decode/AudioChunkDecoder.js.map +0 -1
  206. package/dist/stages/mux/OPFSWriter.d.ts +0 -46
  207. package/dist/stages/mux/OPFSWriter.d.ts.map +0 -1
  208. package/dist/utils/BackpressureAdapter.d.ts +0 -26
  209. package/dist/utils/BackpressureAdapter.d.ts.map +0 -1
  210. package/dist/workers/BaseDecoder.BWYu1W0B.js.map +0 -1
  211. package/dist/workers/stages/compose/video-compose.worker.CIeEIJO7.js.map +0 -1
  212. package/dist/workers/stages/demux/video-demux.worker.B1_wntU4.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"binary-search.js","sources":["../../src/utils/binary-search.ts"],"sourcesContent":["/**\n * Binary search utilities for sorted arrays\n */\n\n/**\n * Find the first index where the predicate returns true\n * Assumes array is sorted such that predicate returns false for all elements before target\n * and true for all elements at or after target\n */\nexport function binarySearchFirst<T>(array: T[], predicate: (item: T) => boolean): number {\n let left = 0;\n let right = array.length - 1;\n let firstIndex = array.length;\n\n while (left <= right) {\n const mid = Math.floor((left + right) / 2);\n const midItem = array[mid];\n if (midItem && predicate(midItem)) {\n firstIndex = mid;\n right = mid - 1;\n } else {\n left = mid + 1;\n }\n }\n\n return firstIndex;\n}\n\n/**\n * Find an item in a sorted array that contains a given value within its range\n * @param array - Sorted array of items with ranges\n * @param value - Value to search for\n * @param getRange - Function to get start and end values from an item\n * @returns The item containing the value, or null if not found\n */\nexport function binarySearchRange<T>(\n array: T[],\n value: number,\n getRange: (item: T) => { start: number; end: number }\n): T | null {\n let left = 0;\n let right = array.length - 1;\n\n while (left <= right) {\n const mid = Math.floor((left + right) / 2);\n const item = array[mid];\n if (!item) return null;\n const range = getRange(item);\n\n if (value >= range.start && value < range.end) {\n return item;\n } else if (value < range.start) {\n right = mid - 1;\n } else {\n left = mid + 1;\n }\n }\n\n return null;\n}\n\n/**\n * Find all items in a sorted array that overlap with a given range\n * @param array - Sorted array of items with ranges\n * @param startValue - Start of the search range (inclusive)\n * @param endValue - End of the search range (exclusive)\n * @param getRange - Function to get start and end values from an item\n * @returns Array of items that overlap with the search range\n */\nexport function binarySearchOverlapping<T>(\n array: T[],\n startValue: number,\n endValue: number,\n getRange: (item: T) => { start: number; end: number }\n): T[] {\n // Invalid range (start >= end) doesn't overlap with anything\n // This includes empty ranges where start === end\n if (startValue >= endValue) {\n return [];\n }\n\n // Find first item that might overlap (its end > startValue)\n const firstIndex = binarySearchFirst(array, (item) => {\n const range = getRange(item);\n return range.end > startValue;\n });\n\n const results: T[] = [];\n for (let i = firstIndex; i < array.length; i++) {\n const item = array[i];\n if (!item) continue;\n const range = getRange(item);\n\n // Stop if we've passed the search range\n if (range.start >= endValue) {\n break;\n }\n\n // Add if overlapping\n if (range.start < endValue && range.end > startValue) {\n results.push(item);\n }\n }\n\n return results;\n}\n"],"names":[],"mappings":"AASO,SAAS,kBAAqB,OAAY,WAAyC;AACxF,MAAI,OAAO;AACX,MAAI,QAAQ,MAAM,SAAS;AAC3B,MAAI,aAAa,MAAM;AAEvB,SAAO,QAAQ,OAAO;AACpB,UAAM,MAAM,KAAK,OAAO,OAAO,SAAS,CAAC;AACzC,UAAM,UAAU,MAAM,GAAG;AACzB,QAAI,WAAW,UAAU,OAAO,GAAG;AACjC,mBAAa;AACb,cAAQ,MAAM;AAAA,IAChB,OAAO;AACL,aAAO,MAAM;AAAA,IACf;AAAA,EACF;AAEA,SAAO;AACT;AASO,SAAS,kBACd,OACA,OACA,UACU;AACV,MAAI,OAAO;AACX,MAAI,QAAQ,MAAM,SAAS;AAE3B,SAAO,QAAQ,OAAO;AACpB,UAAM,MAAM,KAAK,OAAO,OAAO,SAAS,CAAC;AACzC,UAAM,OAAO,MAAM,GAAG;AACtB,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,QAAQ,SAAS,IAAI;AAE3B,QAAI,SAAS,MAAM,SAAS,QAAQ,MAAM,KAAK;AAC7C,aAAO;AAAA,IACT,WAAW,QAAQ,MAAM,OAAO;AAC9B,cAAQ,MAAM;AAAA,IAChB,OAAO;AACL,aAAO,MAAM;AAAA,IACf;AAAA,EACF;AAEA,SAAO;AACT;AAUO,SAAS,wBACd,OACA,YACA,UACA,UACK;AAGL,MAAI,cAAc,UAAU;AAC1B,WAAO,CAAA;AAAA,EACT;AAGA,QAAM,aAAa,kBAAkB,OAAO,CAAC,SAAS;AACpD,UAAM,QAAQ,SAAS,IAAI;AAC3B,WAAO,MAAM,MAAM;AAAA,EACrB,CAAC;AAED,QAAM,UAAe,CAAA;AACrB,WAAS,IAAI,YAAY,IAAI,MAAM,QAAQ,KAAK;AAC9C,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,CAAC,KAAM;AACX,UAAM,QAAQ,SAAS,IAAI;AAG3B,QAAI,MAAM,SAAS,UAAU;AAC3B;AAAA,IACF;AAGA,QAAI,MAAM,QAAQ,YAAY,MAAM,MAAM,YAAY;AACpD,cAAQ,KAAK,IAAI;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AACT;"}
1
+ {"version":3,"file":"binary-search.js","sources":["../../src/utils/binary-search.ts"],"sourcesContent":["/**\n * Binary search utilities for sorted arrays\n */\n\n/**\n * Find the first index where the predicate returns true\n * Assumes array is sorted such that predicate returns false for all elements before target\n * and true for all elements at or after target\n */\nexport function binarySearchFirst<T>(array: T[], predicate: (item: T) => boolean): number {\n let left = 0;\n let right = array.length - 1;\n let firstIndex = array.length;\n\n while (left <= right) {\n const mid = Math.floor((left + right) / 2);\n const midItem = array[mid];\n if (midItem && predicate(midItem)) {\n firstIndex = mid;\n right = mid - 1;\n } else {\n left = mid + 1;\n }\n }\n\n return firstIndex;\n}\n\n/**\n * Find an item in a sorted array that contains a given value within its range\n * @param array - Sorted array of items with ranges\n * @param value - Value to search for\n * @param getRange - Function to get start and end values from an item (receives item and its index)\n * @returns The item containing the value, or null if not found\n */\nexport function binarySearchRange<T>(\n array: T[],\n value: number,\n getRange: (item: T, index: number) => { start: number; end: number }\n): T | null {\n let left = 0;\n let right = array.length - 1;\n\n while (left <= right) {\n const mid = Math.floor((left + right) / 2);\n const item = array[mid];\n if (!item) return null;\n const range = getRange(item, mid);\n\n if (value >= range.start && value < range.end) {\n return item;\n } else if (value < range.start) {\n right = mid - 1;\n } else {\n left = mid + 1;\n }\n }\n\n return null;\n}\n\n/**\n * Find all items in a sorted array that overlap with a given range\n * @param array - Sorted array of items with ranges\n * @param startValue - Start of the search range (inclusive)\n * @param endValue - End of the search range (exclusive)\n * @param getRange - Function to get start and end values from an item (receives item and its index)\n * @returns Array of items that overlap with the search range\n */\nexport function binarySearchOverlapping<T>(\n array: T[],\n startValue: number,\n endValue: number,\n getRange: (item: T, index: number) => { start: number; end: number }\n): T[] {\n // Invalid range (start >= end) doesn't overlap with anything\n // This includes empty ranges where start === end\n if (startValue >= endValue) {\n return [];\n }\n\n // Find first item that might overlap using custom binary search\n // We need the index for getRange, so we can't use binarySearchFirst\n let left = 0;\n let right = array.length - 1;\n let firstIndex = array.length;\n\n while (left <= right) {\n const mid = Math.floor((left + right) / 2);\n const item = array[mid];\n if (!item) break;\n\n const range = getRange(item, mid);\n\n // Check if this item's end is beyond startValue\n if (range.end > startValue) {\n firstIndex = mid;\n right = mid - 1; // Look for earlier items\n } else {\n left = mid + 1;\n }\n }\n\n const results: T[] = [];\n for (let i = firstIndex; i < array.length; i++) {\n const item = array[i];\n if (!item) continue;\n const range = getRange(item, i);\n\n // Stop if we've passed the search range\n if (range.start >= endValue) {\n break;\n }\n\n // Add if overlapping\n if (range.start < endValue && range.end > startValue) {\n results.push(item);\n }\n }\n\n return results;\n}\n\n/**\n * Find the item with timestamp nearest to target value\n * @param array - Sorted array by timestamp\n * @param targetValue - Target value to find nearest item for\n * @param getValue - Function to extract timestamp from item\n * @returns The nearest item, or null if array is empty\n */\nexport function binarySearchNearest<T>(\n array: T[],\n targetValue: number,\n getValue: (item: T) => number\n): T | null {\n if (array.length === 0) return null;\n if (array.length === 1) {\n const first = array[0];\n return first !== undefined ? first : null;\n }\n\n // Binary search for insertion point\n let left = 0;\n let right = array.length - 1;\n\n while (left < right) {\n const mid = Math.floor((left + right) / 2);\n const midItem = array[mid];\n if (!midItem) break;\n const midTimestamp = getValue(midItem);\n\n if (midTimestamp < targetValue) {\n left = mid + 1;\n } else {\n right = mid;\n }\n }\n\n // Compare left and left-1, return closer one\n if (left > 0) {\n const prevItem = array[left - 1];\n const currItem = array[left];\n if (!prevItem || !currItem) {\n return currItem || prevItem || null;\n }\n const prevTimestamp = getValue(prevItem);\n const currTimestamp = getValue(currItem);\n const prevDelta = Math.abs(targetValue - prevTimestamp);\n const currDelta = Math.abs(targetValue - currTimestamp);\n return prevDelta < currDelta ? prevItem : currItem;\n }\n\n const result = array[left];\n return result !== undefined ? result : null;\n}\n"],"names":[],"mappings":"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"}
@@ -69,9 +69,6 @@ class BaseDecoder {
69
69
  try {
70
70
  this.controller.enqueue(data);
71
71
  if (data instanceof VideoFrame && this.config.thread !== "main") {
72
- setTimeout(() => {
73
- data.close();
74
- }, 500);
75
72
  }
76
73
  } catch (error) {
77
74
  if (error instanceof TypeError) {
@@ -132,4 +129,4 @@ class BaseDecoder {
132
129
  export {
133
130
  BaseDecoder as B
134
131
  };
135
- //# sourceMappingURL=BaseDecoder.BWYu1W0B.js.map
132
+ //# sourceMappingURL=BaseDecoder.CTW-vr29.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseDecoder.CTW-vr29.js","sources":["../../src/stages/decode/BaseDecoder.ts"],"sourcesContent":["/**\n * Base decoder class abstracting common WebCodecs decoder workflow.\n * Mirrors BaseEncoder but for decoding path.\n */\nimport { AudioDecoderConfig, DecodedVideoFrame, VideoDecoderConfig } from './types';\n\nexport abstract class BaseDecoder<\n TDecoder extends VideoDecoder | AudioDecoder,\n TConfig extends VideoDecoderConfig | AudioDecoderConfig,\n TInput extends EncodedVideoChunk | EncodedAudioChunk,\n TOutput extends VideoFrame | AudioData | DecodedVideoFrame,\n> {\n protected decoder?: TDecoder;\n protected config: TConfig;\n protected controller: TransformStreamDefaultController<TOutput> | null = null;\n\n constructor(config: TConfig) {\n this.config = config;\n }\n\n async initialize(): Promise<void> {\n if (this.decoder?.state === 'configured') {\n return;\n }\n const isSupported = await this.isConfigSupported(this.config);\n if (!isSupported.supported) {\n throw new Error(\n `Codec not supported: ${(this.config as any).codecString || (this.config as any).codec}`\n );\n }\n\n this.decoder = this.createDecoder({\n output: this.handleOutput.bind(this),\n error: this.handleError.bind(this),\n });\n\n await this.configureDecoder(this.config);\n }\n\n async reconfigure(config: Partial<TConfig>): Promise<void> {\n this.config = { ...this.config, ...config } as TConfig;\n\n if (!this.decoder) {\n await this.initialize();\n return;\n }\n\n // Flush before reconfiguring\n if (this.decoder.state === 'configured') {\n await this.decoder.flush();\n }\n\n const isSupported = await this.isConfigSupported(this.config);\n if (!isSupported.supported) {\n throw new Error(\n `New configuration not supported: ${(this.config as any).codecString || (this.config as any).codec}`\n );\n }\n\n await this.configureDecoder(this.config);\n }\n\n async flush(): Promise<void> {\n if (!this.decoder) return;\n await this.decoder.flush();\n }\n\n async reset(): Promise<void> {\n if (!this.decoder) return;\n this.decoder.reset();\n this.onReset();\n }\n\n async close(): Promise<void> {\n if (!this.decoder) return;\n\n if (this.decoder.state === 'configured') {\n await this.decoder.flush();\n }\n\n this.decoder.close();\n this.decoder = undefined;\n }\n\n get isReady(): boolean {\n return this.decoder?.state === 'configured';\n }\n\n get queueSize(): number {\n return (this.decoder as any)?.decodeQueueSize ?? 0;\n }\n\n protected handleOutput(data: TOutput): void {\n if (!this.controller) {\n this.closeIfPossible(data);\n return;\n }\n\n try {\n this.controller.enqueue(data);\n if (data instanceof VideoFrame && (this.config as VideoDecoderConfig).thread !== 'main') {\n // ugly hack to avoid memory leak\n // setTimeout(() => {\n // data.close();\n // }, 500);\n }\n } catch (error) {\n // Stream closed or errored - silently drop frame\n if (error instanceof TypeError) {\n this.closeIfPossible(data);\n return;\n }\n\n throw error;\n }\n }\n\n protected handleError(error: DOMException): void {\n console.error(`${this.getDecoderType()} decoder error:`, error);\n this.controller?.error(error);\n }\n\n private closeIfPossible(data: TOutput): void {\n (data as any)?.close?.();\n (data as DecodedVideoFrame)?.frame?.close?.();\n }\n\n // Abstracts\n protected abstract isConfigSupported(config: TConfig): Promise<{ supported: boolean }>;\n protected abstract createDecoder(init: DecoderInit): TDecoder;\n protected abstract configureDecoder(config: TConfig): Promise<void>;\n protected abstract getDecoderType(): string;\n protected abstract decode(input: TInput): void;\n protected onReset(): void {}\n\n // Backpressure\n protected abstract readonly highWaterMark: number;\n protected abstract readonly decodeQueueThreshold: number;\n\n createStream(): TransformStream<TInput, TOutput> {\n return new TransformStream<TInput, TOutput>(\n {\n start: async (controller) => {\n this.controller = controller;\n if (!this.isReady) {\n await this.initialize();\n }\n },\n transform: async (input) => {\n if (!this.decoder || this.decoder.state !== 'configured') {\n throw new Error('Decoder not configured');\n }\n // backpressure\n if ((this.decoder as any).decodeQueueSize >= this.decodeQueueThreshold) {\n await new Promise<void>((resolve) => {\n const check = () => {\n if (\n !this.decoder ||\n (this.decoder as any).decodeQueueSize < this.decodeQueueThreshold - 1\n ) {\n resolve();\n } else {\n setTimeout(check, 10);\n }\n };\n check();\n });\n }\n this.decode(input);\n },\n flush: async () => {\n await this.flush();\n },\n },\n {\n highWaterMark: this.highWaterMark,\n size: () => 1,\n }\n );\n }\n}\n\ninterface DecoderInit {\n output: (data: any) => void;\n error: (error: DOMException) => void;\n}\n"],"names":[],"mappings":"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"}
@@ -7161,8 +7161,15 @@ class MP4Demuxer {
7161
7161
  this.mp4boxFile.releaseUsedSamples(trackId, last + 1);
7162
7162
  }
7163
7163
  getVideoDescription(track) {
7164
+ return MP4Demuxer.extractVideoDescription(this.mp4boxFile, track.id);
7165
+ }
7166
+ /**
7167
+ * Extract video description (avcC/hvcC/etc) for VideoDecoder configuration
7168
+ * Static method for reuse in other components
7169
+ */
7170
+ static extractVideoDescription(mp4boxFile, trackId) {
7164
7171
  try {
7165
- const fullTrack = this.mp4boxFile.getTrackById(track.id);
7172
+ const fullTrack = mp4boxFile.getTrackById(trackId);
7166
7173
  for (const entry of fullTrack.mdia.minf.stbl.stsd.entries) {
7167
7174
  const box2 = entry.avcC ?? entry.hvcC ?? entry.av1C ?? entry.vpcC;
7168
7175
  if (box2) {
@@ -7313,4 +7320,4 @@ class MP4Demuxer {
7313
7320
  export {
7314
7321
  MP4Demuxer as M
7315
7322
  };
7316
- //# sourceMappingURL=MP4Demuxer.lMOUMWFh.js.map
7323
+ //# sourceMappingURL=MP4Demuxer.BEa6PLJm.js.map