@tscaps/engine 0.1.1 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -4
- package/dist/modules/css/CssScoper.d.ts +21 -1
- package/dist/modules/css/CssScoper.d.ts.map +1 -1
- package/dist/modules/css/CssScoper.js +129 -56
- package/dist/modules/css/CssScoper.js.map +1 -1
- package/dist/modules/css/CssVarReferenceScanner.d.ts +13 -0
- package/dist/modules/css/CssVarReferenceScanner.d.ts.map +1 -0
- package/dist/modules/css/CssVarReferenceScanner.js +20 -0
- package/dist/modules/css/CssVarReferenceScanner.js.map +1 -0
- package/dist/modules/css/index.d.ts +1 -0
- package/dist/modules/css/index.d.ts.map +1 -1
- package/dist/modules/css/index.js +1 -0
- package/dist/modules/css/index.js.map +1 -1
- package/dist/modules/document/CssVariable.d.ts +24 -3
- package/dist/modules/document/CssVariable.d.ts.map +1 -1
- package/dist/modules/document/CssVariable.js +30 -2
- package/dist/modules/document/CssVariable.js.map +1 -1
- package/dist/modules/document/Decoration.d.ts +42 -0
- package/dist/modules/document/Decoration.d.ts.map +1 -0
- package/dist/modules/document/Decoration.js +52 -0
- package/dist/modules/document/Decoration.js.map +1 -0
- package/dist/modules/document/Document.d.ts.map +1 -1
- package/dist/modules/document/Document.js +0 -3
- package/dist/modules/document/Document.js.map +1 -1
- package/dist/modules/document/DocumentEditor.d.ts +11 -0
- package/dist/modules/document/DocumentEditor.d.ts.map +1 -1
- package/dist/modules/document/DocumentEditor.js +49 -9
- package/dist/modules/document/DocumentEditor.js.map +1 -1
- package/dist/modules/document/Line.d.ts +9 -6
- package/dist/modules/document/Line.d.ts.map +1 -1
- package/dist/modules/document/Line.js +11 -24
- package/dist/modules/document/Line.js.map +1 -1
- package/dist/modules/document/Section.d.ts +0 -4
- package/dist/modules/document/Section.d.ts.map +1 -1
- package/dist/modules/document/Section.js +2 -18
- package/dist/modules/document/Section.js.map +1 -1
- package/dist/modules/document/Segment.d.ts +10 -7
- package/dist/modules/document/Segment.d.ts.map +1 -1
- package/dist/modules/document/Segment.js +15 -22
- package/dist/modules/document/Segment.js.map +1 -1
- package/dist/modules/document/Tag.d.ts +3 -0
- package/dist/modules/document/Tag.d.ts.map +1 -1
- package/dist/modules/document/Tag.js +3 -0
- package/dist/modules/document/Tag.js.map +1 -1
- package/dist/modules/document/Word.d.ts +20 -7
- package/dist/modules/document/Word.d.ts.map +1 -1
- package/dist/modules/document/Word.js +32 -34
- package/dist/modules/document/Word.js.map +1 -1
- package/dist/modules/document/index.d.ts +1 -0
- package/dist/modules/document/index.d.ts.map +1 -1
- package/dist/modules/document/index.js +1 -0
- package/dist/modules/document/index.js.map +1 -1
- package/dist/modules/effect/CarryQuotesEffect.d.ts +1 -7
- package/dist/modules/effect/CarryQuotesEffect.d.ts.map +1 -1
- package/dist/modules/effect/CarryQuotesEffect.js +17 -30
- package/dist/modules/effect/CarryQuotesEffect.js.map +1 -1
- package/dist/modules/effect/RemovePunctuationEffect.d.ts +10 -2
- package/dist/modules/effect/RemovePunctuationEffect.d.ts.map +1 -1
- package/dist/modules/effect/RemovePunctuationEffect.js +26 -6
- package/dist/modules/effect/RemovePunctuationEffect.js.map +1 -1
- package/dist/modules/effect/SmartLowercaseEffect.d.ts +7 -6
- package/dist/modules/effect/SmartLowercaseEffect.d.ts.map +1 -1
- package/dist/modules/effect/SmartLowercaseEffect.js +11 -7
- package/dist/modules/effect/SmartLowercaseEffect.js.map +1 -1
- package/dist/modules/pipeline/RenderPipelineBuilder.d.ts +3 -3
- package/dist/modules/pipeline/RenderPipelineBuilder.d.ts.map +1 -1
- package/dist/modules/pipeline/RenderPipelineBuilder.js +11 -6
- package/dist/modules/pipeline/RenderPipelineBuilder.js.map +1 -1
- package/dist/modules/rendering/BrowserSubtitleFrameRenderer.d.ts +19 -25
- package/dist/modules/rendering/BrowserSubtitleFrameRenderer.d.ts.map +1 -1
- package/dist/modules/rendering/BrowserSubtitleFrameRenderer.js +40 -717
- package/dist/modules/rendering/BrowserSubtitleFrameRenderer.js.map +1 -1
- package/dist/modules/rendering/SubtitleFrameRenderer.d.ts +8 -5
- package/dist/modules/rendering/SubtitleFrameRenderer.d.ts.map +1 -1
- package/dist/modules/rendering/index.d.ts +13 -8
- package/dist/modules/rendering/index.d.ts.map +1 -1
- package/dist/modules/rendering/index.js +5 -2
- package/dist/modules/rendering/index.js.map +1 -1
- package/dist/modules/rendering/styles/BaselineCssComposer.d.ts +23 -0
- package/dist/modules/rendering/styles/BaselineCssComposer.d.ts.map +1 -0
- package/dist/modules/rendering/styles/BaselineCssComposer.js +40 -0
- package/dist/modules/rendering/styles/BaselineCssComposer.js.map +1 -0
- package/dist/modules/rendering/styles/BehindActorBaselineCss.d.ts +19 -0
- package/dist/modules/rendering/styles/BehindActorBaselineCss.d.ts.map +1 -0
- package/dist/modules/rendering/styles/BehindActorBaselineCss.js +19 -0
- package/dist/modules/rendering/styles/BehindActorBaselineCss.js.map +1 -0
- package/dist/modules/rendering/styles/DecorationContainerBaselineCss.d.ts +7 -0
- package/dist/modules/rendering/styles/DecorationContainerBaselineCss.d.ts.map +1 -0
- package/dist/modules/rendering/styles/DecorationContainerBaselineCss.js +34 -0
- package/dist/modules/rendering/styles/DecorationContainerBaselineCss.js.map +1 -0
- package/dist/modules/rendering/styles/InlineStyleEmitter.d.ts +27 -0
- package/dist/modules/rendering/styles/InlineStyleEmitter.d.ts.map +1 -0
- package/dist/modules/rendering/styles/InlineStyleEmitter.js +53 -0
- package/dist/modules/rendering/styles/InlineStyleEmitter.js.map +1 -0
- package/dist/modules/rendering/styles/SegmentPaddingCssRuleBuilder.d.ts +15 -0
- package/dist/modules/rendering/styles/SegmentPaddingCssRuleBuilder.d.ts.map +1 -0
- package/dist/modules/rendering/styles/SegmentPaddingCssRuleBuilder.js +33 -0
- package/dist/modules/rendering/styles/SegmentPaddingCssRuleBuilder.js.map +1 -0
- package/dist/modules/rendering/styles/VideoFrameLayerClass.d.ts.map +1 -0
- package/dist/modules/rendering/styles/VideoFrameLayerClass.js.map +1 -0
- package/dist/modules/rendering/subtitle/AbstractAnim.d.ts +13 -0
- package/dist/modules/rendering/subtitle/AbstractAnim.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/AbstractAnim.js +2 -0
- package/dist/modules/rendering/subtitle/AbstractAnim.js.map +1 -0
- package/dist/modules/rendering/subtitle/ActiveRenderSession.d.ts +20 -0
- package/dist/modules/rendering/subtitle/ActiveRenderSession.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/ActiveRenderSession.js +31 -0
- package/dist/modules/rendering/subtitle/ActiveRenderSession.js.map +1 -0
- package/dist/modules/rendering/subtitle/ActiveRenderSessionFactory.d.ts +19 -0
- package/dist/modules/rendering/subtitle/ActiveRenderSessionFactory.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/ActiveRenderSessionFactory.js +41 -0
- package/dist/modules/rendering/subtitle/ActiveRenderSessionFactory.js.map +1 -0
- package/dist/modules/rendering/subtitle/AnimationProbe.d.ts +25 -0
- package/dist/modules/rendering/subtitle/AnimationProbe.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/AnimationProbe.js +198 -0
- package/dist/modules/rendering/subtitle/AnimationProbe.js.map +1 -0
- package/dist/modules/rendering/subtitle/AssetGroupBuilder.d.ts +15 -0
- package/dist/modules/rendering/subtitle/AssetGroupBuilder.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/AssetGroupBuilder.js +26 -0
- package/dist/modules/rendering/subtitle/AssetGroupBuilder.js.map +1 -0
- package/dist/modules/rendering/subtitle/BatchPlan.d.ts +32 -0
- package/dist/modules/rendering/subtitle/BatchPlan.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/BatchPlan.js +2 -0
- package/dist/modules/rendering/subtitle/BatchPlan.js.map +1 -0
- package/dist/modules/rendering/subtitle/BatchPlanner.d.ts +31 -0
- package/dist/modules/rendering/subtitle/BatchPlanner.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/BatchPlanner.js +91 -0
- package/dist/modules/rendering/subtitle/BatchPlanner.js.map +1 -0
- package/dist/modules/rendering/subtitle/PreparedStyle.d.ts +35 -0
- package/dist/modules/rendering/subtitle/PreparedStyle.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/PreparedStyle.js +2 -0
- package/dist/modules/rendering/subtitle/PreparedStyle.js.map +1 -0
- package/dist/modules/rendering/subtitle/PreparedStyleFactory.d.ts +31 -0
- package/dist/modules/rendering/subtitle/PreparedStyleFactory.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/PreparedStyleFactory.js +91 -0
- package/dist/modules/rendering/subtitle/PreparedStyleFactory.js.map +1 -0
- package/dist/modules/rendering/subtitle/SegmentPaintRegionCache.d.ts +13 -0
- package/dist/modules/rendering/subtitle/SegmentPaintRegionCache.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/SegmentPaintRegionCache.js +24 -0
- package/dist/modules/rendering/subtitle/SegmentPaintRegionCache.js.map +1 -0
- package/dist/modules/rendering/{SegmentPaintRegionResolver.d.ts → subtitle/SegmentPaintRegionResolver.d.ts} +1 -1
- package/dist/modules/rendering/subtitle/SegmentPaintRegionResolver.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/SegmentPaintRegionResolver.js.map +1 -0
- package/dist/modules/rendering/subtitle/SegmentSubtreeDecomposer.d.ts +45 -0
- package/dist/modules/rendering/subtitle/SegmentSubtreeDecomposer.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/SegmentSubtreeDecomposer.js +50 -0
- package/dist/modules/rendering/subtitle/SegmentSubtreeDecomposer.js.map +1 -0
- package/dist/modules/rendering/subtitle/SegmentSubtreeHtmlBuilder.d.ts +80 -0
- package/dist/modules/rendering/subtitle/SegmentSubtreeHtmlBuilder.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/SegmentSubtreeHtmlBuilder.js +188 -0
- package/dist/modules/rendering/subtitle/SegmentSubtreeHtmlBuilder.js.map +1 -0
- package/dist/modules/rendering/subtitle/SegmentWrapperRenderer.d.ts +45 -0
- package/dist/modules/rendering/subtitle/SegmentWrapperRenderer.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/SegmentWrapperRenderer.js +141 -0
- package/dist/modules/rendering/subtitle/SegmentWrapperRenderer.js.map +1 -0
- package/dist/modules/rendering/subtitle/SpriteSheetCompositor.d.ts +46 -0
- package/dist/modules/rendering/subtitle/SpriteSheetCompositor.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/SpriteSheetCompositor.js +134 -0
- package/dist/modules/rendering/subtitle/SpriteSheetCompositor.js.map +1 -0
- package/dist/modules/rendering/subtitle/SpriteSheetSizeProber.d.ts +17 -0
- package/dist/modules/rendering/subtitle/SpriteSheetSizeProber.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/SpriteSheetSizeProber.js +58 -0
- package/dist/modules/rendering/subtitle/SpriteSheetSizeProber.js.map +1 -0
- package/dist/modules/rendering/subtitle/SvgFilterMaterializer.d.ts +27 -0
- package/dist/modules/rendering/subtitle/SvgFilterMaterializer.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/SvgFilterMaterializer.js +40 -0
- package/dist/modules/rendering/subtitle/SvgFilterMaterializer.js.map +1 -0
- package/dist/modules/rendering/subtitle/VideoFrameVarsBuilder.d.ts +42 -0
- package/dist/modules/rendering/subtitle/VideoFrameVarsBuilder.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/VideoFrameVarsBuilder.js +112 -0
- package/dist/modules/rendering/subtitle/VideoFrameVarsBuilder.js.map +1 -0
- package/dist/modules/rendering/types/AlignmentConfig.d.ts.map +1 -0
- package/dist/modules/rendering/types/AlignmentConfig.js.map +1 -0
- package/dist/modules/rendering/types/BehindActorRequirement.d.ts +12 -0
- package/dist/modules/rendering/types/BehindActorRequirement.d.ts.map +1 -0
- package/dist/modules/rendering/types/BehindActorRequirement.js +2 -0
- package/dist/modules/rendering/types/BehindActorRequirement.js.map +1 -0
- package/dist/modules/rendering/types/BoxEdges.d.ts.map +1 -0
- package/dist/modules/rendering/types/BoxEdges.js.map +1 -0
- package/dist/modules/rendering/types/DecorationPlacementSide.d.ts +8 -0
- package/dist/modules/rendering/types/DecorationPlacementSide.d.ts.map +1 -0
- package/dist/modules/rendering/types/DecorationPlacementSide.js +2 -0
- package/dist/modules/rendering/types/DecorationPlacementSide.js.map +1 -0
- package/dist/modules/rendering/{ElementRenderOverrides.d.ts → types/ElementRenderOverrides.d.ts} +1 -1
- package/dist/modules/rendering/types/ElementRenderOverrides.d.ts.map +1 -0
- package/dist/modules/rendering/types/ElementRenderOverrides.js.map +1 -0
- package/dist/modules/rendering/types/InlineStyleMap.d.ts.map +1 -0
- package/dist/modules/rendering/types/InlineStyleMap.js.map +1 -0
- package/dist/modules/rendering/{RenderingConfig.d.ts → types/RenderingConfig.d.ts} +3 -1
- package/dist/modules/rendering/types/RenderingConfig.d.ts.map +1 -0
- package/dist/modules/rendering/types/RenderingConfig.js.map +1 -0
- package/dist/modules/rendering/{ScopedRenderOverride.d.ts → types/ScopedRenderOverride.d.ts} +2 -2
- package/dist/modules/rendering/types/ScopedRenderOverride.d.ts.map +1 -0
- package/dist/modules/rendering/types/ScopedRenderOverride.js.map +1 -0
- package/dist/modules/rendering/types/VideoFrameSource.d.ts.map +1 -0
- package/dist/modules/rendering/types/VideoFrameSource.js.map +1 -0
- package/dist/modules/splitting/BoundaryScoreLimitByCharsSegmentSplitter.d.ts +33 -0
- package/dist/modules/splitting/BoundaryScoreLimitByCharsSegmentSplitter.d.ts.map +1 -0
- package/dist/modules/splitting/BoundaryScoreLimitByCharsSegmentSplitter.js +100 -0
- package/dist/modules/splitting/BoundaryScoreLimitByCharsSegmentSplitter.js.map +1 -0
- package/dist/modules/splitting/FixedTailLineSplitter.d.ts +29 -0
- package/dist/modules/splitting/FixedTailLineSplitter.d.ts.map +1 -0
- package/dist/modules/splitting/FixedTailLineSplitter.js +43 -0
- package/dist/modules/splitting/FixedTailLineSplitter.js.map +1 -0
- package/dist/modules/splitting/index.d.ts +4 -0
- package/dist/modules/splitting/index.d.ts.map +1 -1
- package/dist/modules/splitting/index.js +2 -0
- package/dist/modules/splitting/index.js.map +1 -1
- package/dist/modules/tagging/PauseTagger.d.ts +24 -0
- package/dist/modules/tagging/PauseTagger.d.ts.map +1 -0
- package/dist/modules/tagging/PauseTagger.js +41 -0
- package/dist/modules/tagging/PauseTagger.js.map +1 -0
- package/dist/modules/tagging/StructureTagger.d.ts +1 -1
- package/dist/modules/tagging/StructureTagger.d.ts.map +1 -1
- package/dist/modules/tagging/StructureTagger.js +11 -5
- package/dist/modules/tagging/StructureTagger.js.map +1 -1
- package/dist/modules/tagging/index.d.ts +2 -0
- package/dist/modules/tagging/index.d.ts.map +1 -1
- package/dist/modules/tagging/index.js +1 -0
- package/dist/modules/tagging/index.js.map +1 -1
- package/dist/modules/transcription/VttTranscriber.d.ts +28 -0
- package/dist/modules/transcription/VttTranscriber.d.ts.map +1 -0
- package/dist/modules/transcription/VttTranscriber.js +59 -0
- package/dist/modules/transcription/VttTranscriber.js.map +1 -0
- package/dist/modules/transcription/index.d.ts +1 -0
- package/dist/modules/transcription/index.d.ts.map +1 -1
- package/dist/modules/transcription/index.js +1 -0
- package/dist/modules/transcription/index.js.map +1 -1
- package/dist/modules/video/RenderJob.d.ts +17 -0
- package/dist/modules/video/RenderJob.d.ts.map +1 -1
- package/dist/modules/video/RenderTimeMap.d.ts +50 -0
- package/dist/modules/video/RenderTimeMap.d.ts.map +1 -0
- package/dist/modules/video/RenderTimeMap.js +90 -0
- package/dist/modules/video/RenderTimeMap.js.map +1 -0
- package/dist/modules/video/index.d.ts +8 -1
- package/dist/modules/video/index.d.ts.map +1 -1
- package/dist/modules/video/index.js +4 -0
- package/dist/modules/video/index.js.map +1 -1
- package/dist/modules/video/mediabunny/MediaBunnyTranscodeCoordinator.d.ts +102 -0
- package/dist/modules/video/mediabunny/MediaBunnyTranscodeCoordinator.d.ts.map +1 -0
- package/dist/modules/video/mediabunny/MediaBunnyTranscodeCoordinator.js +199 -0
- package/dist/modules/video/mediabunny/MediaBunnyTranscodeCoordinator.js.map +1 -0
- package/dist/modules/video/mediabunny/MediaBunnyVideoRenderer.d.ts +12 -52
- package/dist/modules/video/mediabunny/MediaBunnyVideoRenderer.d.ts.map +1 -1
- package/dist/modules/video/mediabunny/MediaBunnyVideoRenderer.js +25 -190
- package/dist/modules/video/mediabunny/MediaBunnyVideoRenderer.js.map +1 -1
- package/dist/modules/video/mediabunny/audio/AudioTrackBridgeFactory.d.ts +7 -0
- package/dist/modules/video/mediabunny/audio/AudioTrackBridgeFactory.d.ts.map +1 -1
- package/dist/modules/video/mediabunny/audio/DefaultAudioTrackBridgeFactory.js +2 -2
- package/dist/modules/video/mediabunny/audio/DefaultAudioTrackBridgeFactory.js.map +1 -1
- package/dist/modules/video/mediabunny/audio/PassthroughAudioTrackBridge.d.ts +2 -0
- package/dist/modules/video/mediabunny/audio/PassthroughAudioTrackBridge.d.ts.map +1 -1
- package/dist/modules/video/mediabunny/audio/PassthroughAudioTrackBridge.js +8 -2
- package/dist/modules/video/mediabunny/audio/PassthroughAudioTrackBridge.js.map +1 -1
- package/dist/modules/video/mediabunny/audio/TranscodeAudioTrackBridge.d.ts +3 -0
- package/dist/modules/video/mediabunny/audio/TranscodeAudioTrackBridge.d.ts.map +1 -1
- package/dist/modules/video/mediabunny/audio/TranscodeAudioTrackBridge.js +9 -2
- package/dist/modules/video/mediabunny/audio/TranscodeAudioTrackBridge.js.map +1 -1
- package/dist/modules/video/mediabunny/codec/CodecPolicy.d.ts +7 -0
- package/dist/modules/video/mediabunny/codec/CodecPolicy.d.ts.map +1 -1
- package/dist/modules/video/mediabunny/frame/CurrentFrameVideoSource.d.ts +1 -1
- package/dist/modules/video/mediabunny/frame/CurrentFrameVideoSource.d.ts.map +1 -1
- package/dist/modules/video/mediabunny/frame/FrameCompositor.d.ts +9 -2
- package/dist/modules/video/mediabunny/frame/FrameCompositor.d.ts.map +1 -1
- package/dist/modules/video/mediabunny/frame/LayeredFrameCompositor.d.ts +5 -2
- package/dist/modules/video/mediabunny/frame/LayeredFrameCompositor.d.ts.map +1 -1
- package/dist/modules/video/mediabunny/frame/LayeredFrameCompositor.js +8 -2
- package/dist/modules/video/mediabunny/frame/LayeredFrameCompositor.js.map +1 -1
- package/dist/modules/video/mediabunny/painter/CaptionsOverlayFramePainter.d.ts +35 -0
- package/dist/modules/video/mediabunny/painter/CaptionsOverlayFramePainter.d.ts.map +1 -0
- package/dist/modules/video/mediabunny/painter/CaptionsOverlayFramePainter.js +69 -0
- package/dist/modules/video/mediabunny/painter/CaptionsOverlayFramePainter.js.map +1 -0
- package/dist/modules/video/mediabunny/painter/CaptionsOverlayFramePainterFactory.d.ts +23 -0
- package/dist/modules/video/mediabunny/painter/CaptionsOverlayFramePainterFactory.d.ts.map +1 -0
- package/dist/modules/video/mediabunny/painter/CaptionsOverlayFramePainterFactory.js +23 -0
- package/dist/modules/video/mediabunny/painter/CaptionsOverlayFramePainterFactory.js.map +1 -0
- package/dist/modules/video/mediabunny/painter/FramePainter.d.ts +46 -0
- package/dist/modules/video/mediabunny/painter/FramePainter.d.ts.map +1 -0
- package/dist/modules/video/mediabunny/painter/FramePainter.js +2 -0
- package/dist/modules/video/mediabunny/painter/FramePainter.js.map +1 -0
- package/dist/modules/video/mediabunny/painter/TopLayerSource.d.ts +25 -0
- package/dist/modules/video/mediabunny/painter/TopLayerSource.d.ts.map +1 -0
- package/dist/modules/video/mediabunny/painter/TopLayerSource.js +2 -0
- package/dist/modules/video/mediabunny/painter/TopLayerSource.js.map +1 -0
- package/package.json +1 -1
- package/dist/modules/rendering/AlignmentConfig.d.ts.map +0 -1
- package/dist/modules/rendering/AlignmentConfig.js.map +0 -1
- package/dist/modules/rendering/BoxEdges.d.ts.map +0 -1
- package/dist/modules/rendering/BoxEdges.js.map +0 -1
- package/dist/modules/rendering/ElementRenderOverrides.d.ts.map +0 -1
- package/dist/modules/rendering/ElementRenderOverrides.js.map +0 -1
- package/dist/modules/rendering/InlineStyleMap.d.ts.map +0 -1
- package/dist/modules/rendering/InlineStyleMap.js.map +0 -1
- package/dist/modules/rendering/RenderingConfig.d.ts.map +0 -1
- package/dist/modules/rendering/RenderingConfig.js.map +0 -1
- package/dist/modules/rendering/ScopedRenderOverride.d.ts.map +0 -1
- package/dist/modules/rendering/ScopedRenderOverride.js.map +0 -1
- package/dist/modules/rendering/SegmentPaintRegionResolver.d.ts.map +0 -1
- package/dist/modules/rendering/SegmentPaintRegionResolver.js.map +0 -1
- package/dist/modules/rendering/SegmentSubtreeHtmlBuilder.d.ts +0 -58
- package/dist/modules/rendering/SegmentSubtreeHtmlBuilder.d.ts.map +0 -1
- package/dist/modules/rendering/SegmentSubtreeHtmlBuilder.js +0 -132
- package/dist/modules/rendering/SegmentSubtreeHtmlBuilder.js.map +0 -1
- package/dist/modules/rendering/VideoFrameLayerClass.d.ts.map +0 -1
- package/dist/modules/rendering/VideoFrameLayerClass.js.map +0 -1
- package/dist/modules/rendering/VideoFrameSource.d.ts.map +0 -1
- package/dist/modules/rendering/VideoFrameSource.js.map +0 -1
- /package/dist/modules/rendering/{VideoFrameLayerClass.d.ts → styles/VideoFrameLayerClass.d.ts} +0 -0
- /package/dist/modules/rendering/{VideoFrameLayerClass.js → styles/VideoFrameLayerClass.js} +0 -0
- /package/dist/modules/rendering/{SegmentPaintRegionResolver.js → subtitle/SegmentPaintRegionResolver.js} +0 -0
- /package/dist/modules/rendering/{AlignmentConfig.d.ts → types/AlignmentConfig.d.ts} +0 -0
- /package/dist/modules/rendering/{AlignmentConfig.js → types/AlignmentConfig.js} +0 -0
- /package/dist/modules/rendering/{BoxEdges.d.ts → types/BoxEdges.d.ts} +0 -0
- /package/dist/modules/rendering/{BoxEdges.js → types/BoxEdges.js} +0 -0
- /package/dist/modules/rendering/{ElementRenderOverrides.js → types/ElementRenderOverrides.js} +0 -0
- /package/dist/modules/rendering/{InlineStyleMap.d.ts → types/InlineStyleMap.d.ts} +0 -0
- /package/dist/modules/rendering/{InlineStyleMap.js → types/InlineStyleMap.js} +0 -0
- /package/dist/modules/rendering/{RenderingConfig.js → types/RenderingConfig.js} +0 -0
- /package/dist/modules/rendering/{ScopedRenderOverride.js → types/ScopedRenderOverride.js} +0 -0
- /package/dist/modules/rendering/{VideoFrameSource.d.ts → types/VideoFrameSource.d.ts} +0 -0
- /package/dist/modules/rendering/{VideoFrameSource.js → types/VideoFrameSource.js} +0 -0
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { Input, BlobSource, ALL_FORMATS, } from 'mediabunny';
|
|
2
|
+
import { RenderTimeMap } from '../../video/RenderTimeMap';
|
|
3
|
+
/**
|
|
4
|
+
* Runs one mediabunny transcode: opens the source input, resolves the
|
|
5
|
+
* output dimensions / frame rate / duration, wires the encoder and the
|
|
6
|
+
* audio bridge, and drives the decode → paint → encode loop.
|
|
7
|
+
*
|
|
8
|
+
* Consumer-specific per-frame composition (captions, overlay, raw-frame
|
|
9
|
+
* passthrough) lives behind the request's {@link FramePainter}; codec
|
|
10
|
+
* choice, container format, time-range skipping, and audio-loss and
|
|
11
|
+
* fallback-decoder notifications are per-request inputs. The coordinator
|
|
12
|
+
* itself knows nothing about documents, styles, or overlays — those
|
|
13
|
+
* live inside the painter.
|
|
14
|
+
*
|
|
15
|
+
* One run at a time per instance; concurrent {@link execute} calls on
|
|
16
|
+
* the same instance are not supported.
|
|
17
|
+
*/
|
|
18
|
+
export class MediaBunnyTranscodeCoordinator {
|
|
19
|
+
videoFrameDecoderFactory;
|
|
20
|
+
videoTrackEncoderFactory;
|
|
21
|
+
audioTrackBridgeFactory;
|
|
22
|
+
outputTargetBuilder;
|
|
23
|
+
constructor(config) {
|
|
24
|
+
this.videoFrameDecoderFactory = config.videoFrameDecoderFactory;
|
|
25
|
+
this.videoTrackEncoderFactory = config.videoTrackEncoderFactory;
|
|
26
|
+
this.audioTrackBridgeFactory = config.audioTrackBridgeFactory;
|
|
27
|
+
this.outputTargetBuilder = config.outputTargetBuilder;
|
|
28
|
+
}
|
|
29
|
+
async execute(request) {
|
|
30
|
+
this.assertWebCodecsAvailable();
|
|
31
|
+
const input = new Input({ formats: ALL_FORMATS, source: new BlobSource(request.source) });
|
|
32
|
+
const videoTrack = await input.getPrimaryVideoTrack();
|
|
33
|
+
if (!videoTrack) {
|
|
34
|
+
throw new Error('No video track found in the input file');
|
|
35
|
+
}
|
|
36
|
+
const { width, height } = this.resolveOutputDimensions(videoTrack.displayWidth, videoTrack.displayHeight, request.outputResolution);
|
|
37
|
+
const fps = await this.readFrameRate(videoTrack);
|
|
38
|
+
const timeMap = request.timeMap ?? new RenderTimeMap([]);
|
|
39
|
+
const { output, target, format } = this.outputTargetBuilder.build({
|
|
40
|
+
format: request.outputFormat,
|
|
41
|
+
stream: request.outputStream,
|
|
42
|
+
});
|
|
43
|
+
const codecResolution = await request.codecPolicy.resolveVideo({
|
|
44
|
+
supportedCodecs: format.getSupportedVideoCodecs(),
|
|
45
|
+
width,
|
|
46
|
+
height,
|
|
47
|
+
fps,
|
|
48
|
+
quality: request.quality,
|
|
49
|
+
});
|
|
50
|
+
const encoder = this.videoTrackEncoderFactory.create({
|
|
51
|
+
width,
|
|
52
|
+
height,
|
|
53
|
+
encoderConfig: this.toEncoderConfig(codecResolution),
|
|
54
|
+
});
|
|
55
|
+
encoder.attachTo(output);
|
|
56
|
+
const audioBridge = await this.audioTrackBridgeFactory.create({
|
|
57
|
+
input,
|
|
58
|
+
format,
|
|
59
|
+
timeMap,
|
|
60
|
+
...(request.onAudioDiscarded ? { onAudioDiscarded: request.onAudioDiscarded } : {}),
|
|
61
|
+
});
|
|
62
|
+
await audioBridge.attachTo(output);
|
|
63
|
+
const decoder = await this.videoFrameDecoderFactory.create({
|
|
64
|
+
track: videoTrack,
|
|
65
|
+
source: request.source,
|
|
66
|
+
...(request.confirmFallbackDecoder ? { confirmFallback: request.confirmFallbackDecoder } : {}),
|
|
67
|
+
});
|
|
68
|
+
const sourceDuration = await this.computeDuration(videoTrack);
|
|
69
|
+
const outputDuration = Math.max(0, sourceDuration - timeMap.totalSkipDuration());
|
|
70
|
+
let painterStarted = false;
|
|
71
|
+
try {
|
|
72
|
+
await request.painter.begin(width, height, fps);
|
|
73
|
+
painterStarted = true;
|
|
74
|
+
await output.start();
|
|
75
|
+
await this.runEncodeLoop({
|
|
76
|
+
decoder,
|
|
77
|
+
encoder,
|
|
78
|
+
audioBridge,
|
|
79
|
+
timeMap,
|
|
80
|
+
outputDuration,
|
|
81
|
+
painter: request.painter,
|
|
82
|
+
onProgress: request.onProgress,
|
|
83
|
+
});
|
|
84
|
+
await audioBridge.finish();
|
|
85
|
+
await output.finalize();
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
await this.safeCancel(output);
|
|
89
|
+
throw err;
|
|
90
|
+
}
|
|
91
|
+
finally {
|
|
92
|
+
decoder.close();
|
|
93
|
+
if (painterStarted)
|
|
94
|
+
request.painter.end();
|
|
95
|
+
}
|
|
96
|
+
return this.buildResult(target, request.outputFormat, width, height);
|
|
97
|
+
}
|
|
98
|
+
// One decoded video frame is alive at any time: holding more would
|
|
99
|
+
// back-pressure the WebCodecs frame pool into a stall.
|
|
100
|
+
async runEncodeLoop(params) {
|
|
101
|
+
let frameCount = 0;
|
|
102
|
+
for await (const frame of params.decoder.samples()) {
|
|
103
|
+
try {
|
|
104
|
+
if (frame.timestamp < 0)
|
|
105
|
+
continue;
|
|
106
|
+
if (params.timeMap.isSkipped(frame.timestamp))
|
|
107
|
+
continue;
|
|
108
|
+
const outputTimestamp = params.timeMap.toOutputTime(frame.timestamp);
|
|
109
|
+
const paintFrame = await params.painter.paint(frame, outputTimestamp);
|
|
110
|
+
await params.encoder.encode(outputTimestamp, frame.duration, paintFrame);
|
|
111
|
+
await params.audioBridge.pumpUntil(frame.timestamp);
|
|
112
|
+
frameCount++;
|
|
113
|
+
if (params.onProgress) {
|
|
114
|
+
params.onProgress(this.toProgress(outputTimestamp, params.outputDuration, frameCount));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
finally {
|
|
118
|
+
frame.close();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
toEncoderConfig(resolution) {
|
|
123
|
+
const config = {
|
|
124
|
+
codec: resolution.codec,
|
|
125
|
+
bitrate: resolution.bitrate,
|
|
126
|
+
bitrateMode: resolution.bitrateMode,
|
|
127
|
+
latencyMode: resolution.latencyMode,
|
|
128
|
+
};
|
|
129
|
+
if (resolution.contentHint !== undefined)
|
|
130
|
+
config.contentHint = resolution.contentHint;
|
|
131
|
+
if (resolution.keyFrameInterval !== undefined)
|
|
132
|
+
config.keyFrameInterval = resolution.keyFrameInterval;
|
|
133
|
+
return config;
|
|
134
|
+
}
|
|
135
|
+
async computeDuration(videoTrack) {
|
|
136
|
+
try {
|
|
137
|
+
return await videoTrack.computeDuration();
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return 0;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
resolveOutputDimensions(sourceWidth, sourceHeight, requested) {
|
|
144
|
+
if (!requested)
|
|
145
|
+
return { width: sourceWidth, height: sourceHeight };
|
|
146
|
+
const width = Math.min(requested.width, sourceWidth);
|
|
147
|
+
const height = Math.min(requested.height, sourceHeight);
|
|
148
|
+
return { width: this.toEven(width), height: this.toEven(height) };
|
|
149
|
+
}
|
|
150
|
+
toEven(value) {
|
|
151
|
+
const rounded = Math.round(value);
|
|
152
|
+
return rounded % 2 === 0 ? rounded : rounded - 1;
|
|
153
|
+
}
|
|
154
|
+
async readFrameRate(videoTrack) {
|
|
155
|
+
try {
|
|
156
|
+
const stats = await videoTrack.computePacketStats(120);
|
|
157
|
+
if (Number.isFinite(stats.averagePacketRate) && stats.averagePacketRate > 0) {
|
|
158
|
+
return stats.averagePacketRate;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
// Falls through to the default.
|
|
163
|
+
}
|
|
164
|
+
console.warn('Could not determine input frame rate; defaulting to 30 fps');
|
|
165
|
+
return 30;
|
|
166
|
+
}
|
|
167
|
+
toProgress(timestamp, duration, frameCount) {
|
|
168
|
+
const percent = duration > 0 ? Math.min(100, Math.round((timestamp / duration) * 100)) : 0;
|
|
169
|
+
return { percent, currentFrame: frameCount, totalFrames: 0 };
|
|
170
|
+
}
|
|
171
|
+
async safeCancel(output) {
|
|
172
|
+
if (output.state === 'finalized' || output.state === 'canceled')
|
|
173
|
+
return;
|
|
174
|
+
try {
|
|
175
|
+
await output.cancel();
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
// Cancellation is best-effort; the original error has priority.
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
assertWebCodecsAvailable() {
|
|
182
|
+
if (typeof globalThis.VideoEncoder === 'undefined') {
|
|
183
|
+
throw new Error('This browser does not support video encoding (WebCodecs). ' +
|
|
184
|
+
'Use Chrome, Firefox, or Safari 17.4+ on a recent device.');
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
buildResult(target, format, width, height) {
|
|
188
|
+
const mimeType = format === 'webm' ? 'video/webm' : 'video/mp4';
|
|
189
|
+
if (!target)
|
|
190
|
+
return { blob: null, mimeType, width, height };
|
|
191
|
+
return {
|
|
192
|
+
blob: new Blob([target.buffer], { type: mimeType }),
|
|
193
|
+
mimeType,
|
|
194
|
+
width,
|
|
195
|
+
height,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=MediaBunnyTranscodeCoordinator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MediaBunnyTranscodeCoordinator.js","sourceRoot":"","sources":["../../../../src/modules/video/mediabunny/MediaBunnyTranscodeCoordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,69 +1,29 @@
|
|
|
1
1
|
import type { VideoRenderer } from '../../video/VideoRenderer';
|
|
2
2
|
import type { RenderJob, RenderResult, RenderProgress } from '../../video/RenderJob';
|
|
3
|
-
import type { OverlayFrameRenderer } from '../../rendering/OverlayFrameRenderer';
|
|
4
3
|
import type { CodecPolicy } from '../../video/mediabunny/codec/CodecPolicy';
|
|
5
|
-
import type {
|
|
6
|
-
import type {
|
|
7
|
-
import type { OutputTargetBuilder } from '../../video/mediabunny/output/OutputTargetBuilder';
|
|
8
|
-
import type { VideoTrackEncoderFactory } from '../../video/mediabunny/encoder/VideoTrackEncoderFactory';
|
|
9
|
-
import type { FrameCompositor } from '../../video/mediabunny/frame/FrameCompositor';
|
|
10
|
-
import type { SubtitleLayerSource } from '../../video/mediabunny/caption/SubtitleLayerSource';
|
|
4
|
+
import type { MediaBunnyTranscodeCoordinator } from '../../video/mediabunny/MediaBunnyTranscodeCoordinator';
|
|
5
|
+
import type { CaptionsOverlayFramePainterFactory } from '../../video/mediabunny/painter/CaptionsOverlayFramePainterFactory';
|
|
11
6
|
export interface MediaBunnyVideoRendererConfig {
|
|
12
|
-
|
|
13
|
-
* Produces the caption raster painted onto each output frame. The
|
|
14
|
-
* coordinator does not split styles, snap times to caption ticks,
|
|
15
|
-
* or composite layers — all caption-side strategy lives behind
|
|
16
|
-
* this single source.
|
|
17
|
-
*/
|
|
18
|
-
subtitleLayer: SubtitleLayerSource;
|
|
19
|
-
overlayRenderer: OverlayFrameRenderer;
|
|
7
|
+
coordinator: MediaBunnyTranscodeCoordinator;
|
|
20
8
|
codecPolicy: CodecPolicy;
|
|
21
|
-
|
|
22
|
-
videoTrackEncoderFactory: VideoTrackEncoderFactory;
|
|
23
|
-
audioTrackBridgeFactory: AudioTrackBridgeFactory;
|
|
24
|
-
outputTargetBuilder: OutputTargetBuilder;
|
|
25
|
-
frameCompositor: FrameCompositor;
|
|
9
|
+
painterFactory: CaptionsOverlayFramePainterFactory;
|
|
26
10
|
}
|
|
27
11
|
/**
|
|
28
|
-
* Renders a
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
12
|
+
* Renders a {@link RenderJob} through the mediabunny transcode
|
|
13
|
+
* coordinator. Owns the caption/overlay side of the pipeline — the
|
|
14
|
+
* document, style set, overlay HTML, and skip ranges from the job are
|
|
15
|
+
* translated into a painter and a time map that the coordinator drives.
|
|
16
|
+
* Encoding, containerization, and audio handling live in the
|
|
17
|
+
* coordinator.
|
|
34
18
|
*
|
|
35
19
|
* One job at a time per instance: concurrent {@link render} calls on
|
|
36
20
|
* the same instance are not supported.
|
|
37
|
-
*
|
|
38
|
-
* Caption ticks step at most at {@link CAPTION_FPS_CAP}; inputs
|
|
39
|
-
* below that cap step at the input's own framerate.
|
|
40
21
|
*/
|
|
41
22
|
export declare class MediaBunnyVideoRenderer implements VideoRenderer {
|
|
42
|
-
private readonly
|
|
43
|
-
private readonly overlayRenderer;
|
|
23
|
+
private readonly coordinator;
|
|
44
24
|
private readonly codecPolicy;
|
|
45
|
-
private readonly
|
|
46
|
-
private readonly videoTrackEncoderFactory;
|
|
47
|
-
private readonly audioTrackBridgeFactory;
|
|
48
|
-
private readonly outputTargetBuilder;
|
|
49
|
-
private readonly frameCompositor;
|
|
25
|
+
private readonly painterFactory;
|
|
50
26
|
constructor(config: MediaBunnyVideoRendererConfig);
|
|
51
27
|
render(job: RenderJob, onProgress?: (progress: RenderProgress) => void): Promise<RenderResult>;
|
|
52
|
-
private runEncodeLoop;
|
|
53
|
-
private toEncoderConfig;
|
|
54
|
-
private computeDuration;
|
|
55
|
-
/**
|
|
56
|
-
* Resolves the final pixel dimensions for the output. When the caller
|
|
57
|
-
* specifies `outputResolution`, those values win — but the renderer
|
|
58
|
-
* never upscales beyond the source and snaps to even numbers, which
|
|
59
|
-
* most hardware video encoders require.
|
|
60
|
-
*/
|
|
61
|
-
private resolveOutputDimensions;
|
|
62
|
-
private toEven;
|
|
63
|
-
private readFrameRate;
|
|
64
|
-
private toProgress;
|
|
65
|
-
private safeCancel;
|
|
66
|
-
private assertWebCodecsAvailable;
|
|
67
|
-
private buildResult;
|
|
68
28
|
}
|
|
69
29
|
//# sourceMappingURL=MediaBunnyVideoRenderer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MediaBunnyVideoRenderer.d.ts","sourceRoot":"","sources":["../../../../src/modules/video/mediabunny/MediaBunnyVideoRenderer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MediaBunnyVideoRenderer.d.ts","sourceRoot":"","sources":["../../../../src/modules/video/mediabunny/MediaBunnyVideoRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAExF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6CAA6C,CAAC;AAC/E,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,0DAA0D,CAAC;AAC/G,OAAO,KAAK,EAAE,kCAAkC,EAAE,MAAM,sEAAsE,CAAC;AAE/H,MAAM,WAAW,6BAA6B;IAC5C,WAAW,EAAE,8BAA8B,CAAC;IAC5C,WAAW,EAAE,WAAW,CAAC;IACzB,cAAc,EAAE,kCAAkC,CAAC;CACpD;AAED;;;;;;;;;;GAUG;AACH,qBAAa,uBAAwB,YAAW,aAAa;IAE3D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiC;IAC7D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqC;gBAExD,MAAM,EAAE,6BAA6B;IAM3C,MAAM,CACV,GAAG,EAAE,SAAS,EACd,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,GAC9C,OAAO,CAAC,YAAY,CAAC;CAkBzB"}
|
|
@@ -1,206 +1,41 @@
|
|
|
1
|
-
import {
|
|
2
|
-
// Captions step at the video's frame rate up to this cap. Past it,
|
|
3
|
-
// per-letter or per-word animations gain nothing from extra renders
|
|
4
|
-
// (the eye doesn't resolve sub-30fps differences in caption motion)
|
|
5
|
-
// and the per-batch subtitle decode dominates the render budget.
|
|
6
|
-
const CAPTION_FPS_CAP = 30;
|
|
1
|
+
import { RenderTimeMap } from '../../video/RenderTimeMap';
|
|
7
2
|
/**
|
|
8
|
-
* Renders a
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
3
|
+
* Renders a {@link RenderJob} through the mediabunny transcode
|
|
4
|
+
* coordinator. Owns the caption/overlay side of the pipeline — the
|
|
5
|
+
* document, style set, overlay HTML, and skip ranges from the job are
|
|
6
|
+
* translated into a painter and a time map that the coordinator drives.
|
|
7
|
+
* Encoding, containerization, and audio handling live in the
|
|
8
|
+
* coordinator.
|
|
14
9
|
*
|
|
15
10
|
* One job at a time per instance: concurrent {@link render} calls on
|
|
16
11
|
* the same instance are not supported.
|
|
17
|
-
*
|
|
18
|
-
* Caption ticks step at most at {@link CAPTION_FPS_CAP}; inputs
|
|
19
|
-
* below that cap step at the input's own framerate.
|
|
20
12
|
*/
|
|
21
13
|
export class MediaBunnyVideoRenderer {
|
|
22
|
-
|
|
23
|
-
overlayRenderer;
|
|
14
|
+
coordinator;
|
|
24
15
|
codecPolicy;
|
|
25
|
-
|
|
26
|
-
videoTrackEncoderFactory;
|
|
27
|
-
audioTrackBridgeFactory;
|
|
28
|
-
outputTargetBuilder;
|
|
29
|
-
frameCompositor;
|
|
16
|
+
painterFactory;
|
|
30
17
|
constructor(config) {
|
|
31
|
-
this.
|
|
32
|
-
this.overlayRenderer = config.overlayRenderer;
|
|
18
|
+
this.coordinator = config.coordinator;
|
|
33
19
|
this.codecPolicy = config.codecPolicy;
|
|
34
|
-
this.
|
|
35
|
-
this.videoTrackEncoderFactory = config.videoTrackEncoderFactory;
|
|
36
|
-
this.audioTrackBridgeFactory = config.audioTrackBridgeFactory;
|
|
37
|
-
this.outputTargetBuilder = config.outputTargetBuilder;
|
|
38
|
-
this.frameCompositor = config.frameCompositor;
|
|
20
|
+
this.painterFactory = config.painterFactory;
|
|
39
21
|
}
|
|
40
22
|
async render(job, onProgress) {
|
|
41
|
-
this.
|
|
42
|
-
const
|
|
43
|
-
const
|
|
44
|
-
if (!videoTrack) {
|
|
45
|
-
throw new Error('No video track found in the input file');
|
|
46
|
-
}
|
|
47
|
-
const { width, height } = this.resolveOutputDimensions(videoTrack.displayWidth, videoTrack.displayHeight, job.outputResolution);
|
|
48
|
-
const fps = await this.readFrameRate(videoTrack);
|
|
49
|
-
const captionInterval = 1 / Math.min(fps, CAPTION_FPS_CAP);
|
|
50
|
-
await this.subtitleLayer.open(job.document, job.styles, width, height, captionInterval);
|
|
51
|
-
const { output, target, format } = this.outputTargetBuilder.build({
|
|
52
|
-
format: job.outputFormat,
|
|
53
|
-
stream: job.outputStream,
|
|
54
|
-
});
|
|
55
|
-
const codecResolution = await this.codecPolicy.resolveVideo({
|
|
56
|
-
supportedCodecs: format.getSupportedVideoCodecs(),
|
|
57
|
-
width,
|
|
58
|
-
height,
|
|
59
|
-
fps,
|
|
60
|
-
quality: job.quality,
|
|
61
|
-
});
|
|
62
|
-
const encoder = this.videoTrackEncoderFactory.create({
|
|
63
|
-
width,
|
|
64
|
-
height,
|
|
65
|
-
encoderConfig: this.toEncoderConfig(codecResolution),
|
|
66
|
-
});
|
|
67
|
-
encoder.attachTo(output);
|
|
68
|
-
const audioBridge = await this.audioTrackBridgeFactory.create({
|
|
69
|
-
input,
|
|
70
|
-
format,
|
|
71
|
-
...(job.onAudioDiscarded ? { onAudioDiscarded: job.onAudioDiscarded } : {}),
|
|
72
|
-
});
|
|
73
|
-
await audioBridge.attachTo(output);
|
|
74
|
-
const decoder = await this.videoFrameDecoderFactory.create({
|
|
75
|
-
track: videoTrack,
|
|
23
|
+
const painter = this.painterFactory.create(job.document, job.styles, job.overlayHtml, job.topLayer ?? null);
|
|
24
|
+
const timeMap = new RenderTimeMap(job.skipRanges ?? []);
|
|
25
|
+
const result = await this.coordinator.execute({
|
|
76
26
|
source: job.video,
|
|
77
|
-
|
|
27
|
+
codecPolicy: this.codecPolicy,
|
|
28
|
+
painter,
|
|
29
|
+
timeMap,
|
|
30
|
+
...(job.outputResolution ? { outputResolution: job.outputResolution } : {}),
|
|
31
|
+
...(job.outputFormat ? { outputFormat: job.outputFormat } : {}),
|
|
32
|
+
...(job.quality ? { quality: job.quality } : {}),
|
|
33
|
+
...(job.outputStream ? { outputStream: job.outputStream } : {}),
|
|
34
|
+
...(onProgress ? { onProgress } : {}),
|
|
35
|
+
...(job.onAudioDiscarded ? { onAudioDiscarded: job.onAudioDiscarded } : {}),
|
|
36
|
+
...(job.confirmFallbackDecoder ? { confirmFallbackDecoder: job.confirmFallbackDecoder } : {}),
|
|
78
37
|
});
|
|
79
|
-
|
|
80
|
-
const overlay = job.overlayHtml ? await this.overlayRenderer.render(job.overlayHtml, width, height) : null;
|
|
81
|
-
await output.start();
|
|
82
|
-
try {
|
|
83
|
-
await this.runEncodeLoop({ decoder, encoder, audioBridge, duration, overlay, onProgress });
|
|
84
|
-
await audioBridge.finish();
|
|
85
|
-
await output.finalize();
|
|
86
|
-
}
|
|
87
|
-
catch (err) {
|
|
88
|
-
await this.safeCancel(output);
|
|
89
|
-
throw err;
|
|
90
|
-
}
|
|
91
|
-
finally {
|
|
92
|
-
decoder.close();
|
|
93
|
-
this.subtitleLayer.close();
|
|
94
|
-
}
|
|
95
|
-
return this.buildResult(target, job.outputFormat);
|
|
96
|
-
}
|
|
97
|
-
// One decoded video frame is alive at any time: holding more would
|
|
98
|
-
// back-pressure the WebCodecs frame pool into a stall.
|
|
99
|
-
async runEncodeLoop(params) {
|
|
100
|
-
const width = params.encoder.width;
|
|
101
|
-
const height = params.encoder.height;
|
|
102
|
-
let frameCount = 0;
|
|
103
|
-
for await (const frame of params.decoder.samples()) {
|
|
104
|
-
try {
|
|
105
|
-
if (frame.timestamp < 0)
|
|
106
|
-
continue;
|
|
107
|
-
const captionLayer = await this.subtitleLayer.frameAt(frame.timestamp, frame);
|
|
108
|
-
await params.encoder.encode(frame.timestamp, frame.duration, (ctx) => {
|
|
109
|
-
this.frameCompositor.compose(ctx, {
|
|
110
|
-
frame,
|
|
111
|
-
captions: captionLayer,
|
|
112
|
-
overlay: params.overlay,
|
|
113
|
-
width,
|
|
114
|
-
height,
|
|
115
|
-
});
|
|
116
|
-
});
|
|
117
|
-
await params.audioBridge.pumpUntil(frame.timestamp);
|
|
118
|
-
frameCount++;
|
|
119
|
-
if (params.onProgress)
|
|
120
|
-
params.onProgress(this.toProgress(frame.timestamp, params.duration, frameCount));
|
|
121
|
-
}
|
|
122
|
-
finally {
|
|
123
|
-
frame.close();
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
toEncoderConfig(resolution) {
|
|
128
|
-
const config = {
|
|
129
|
-
codec: resolution.codec,
|
|
130
|
-
bitrate: resolution.bitrate,
|
|
131
|
-
bitrateMode: resolution.bitrateMode,
|
|
132
|
-
latencyMode: resolution.latencyMode,
|
|
133
|
-
};
|
|
134
|
-
if (resolution.contentHint !== undefined)
|
|
135
|
-
config.contentHint = resolution.contentHint;
|
|
136
|
-
return config;
|
|
137
|
-
}
|
|
138
|
-
async computeDuration(videoTrack) {
|
|
139
|
-
try {
|
|
140
|
-
return await videoTrack.computeDuration();
|
|
141
|
-
}
|
|
142
|
-
catch {
|
|
143
|
-
return 0;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* Resolves the final pixel dimensions for the output. When the caller
|
|
148
|
-
* specifies `outputResolution`, those values win — but the renderer
|
|
149
|
-
* never upscales beyond the source and snaps to even numbers, which
|
|
150
|
-
* most hardware video encoders require.
|
|
151
|
-
*/
|
|
152
|
-
resolveOutputDimensions(sourceWidth, sourceHeight, requested) {
|
|
153
|
-
if (!requested)
|
|
154
|
-
return { width: sourceWidth, height: sourceHeight };
|
|
155
|
-
const width = Math.min(requested.width, sourceWidth);
|
|
156
|
-
const height = Math.min(requested.height, sourceHeight);
|
|
157
|
-
return { width: this.toEven(width), height: this.toEven(height) };
|
|
158
|
-
}
|
|
159
|
-
toEven(value) {
|
|
160
|
-
const rounded = Math.round(value);
|
|
161
|
-
return rounded % 2 === 0 ? rounded : rounded - 1;
|
|
162
|
-
}
|
|
163
|
-
async readFrameRate(videoTrack) {
|
|
164
|
-
try {
|
|
165
|
-
const stats = await videoTrack.computePacketStats(120);
|
|
166
|
-
if (Number.isFinite(stats.averagePacketRate) && stats.averagePacketRate > 0) {
|
|
167
|
-
return stats.averagePacketRate;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
catch {
|
|
171
|
-
// Falls through to the default.
|
|
172
|
-
}
|
|
173
|
-
console.warn('Could not determine input frame rate; defaulting to 30 fps');
|
|
174
|
-
return 30;
|
|
175
|
-
}
|
|
176
|
-
toProgress(timestamp, duration, frameCount) {
|
|
177
|
-
const percent = duration > 0 ? Math.min(100, Math.round((timestamp / duration) * 100)) : 0;
|
|
178
|
-
return { percent, currentFrame: frameCount, totalFrames: 0 };
|
|
179
|
-
}
|
|
180
|
-
async safeCancel(output) {
|
|
181
|
-
if (output.state === 'finalized' || output.state === 'canceled')
|
|
182
|
-
return;
|
|
183
|
-
try {
|
|
184
|
-
await output.cancel();
|
|
185
|
-
}
|
|
186
|
-
catch {
|
|
187
|
-
// Cancellation is best-effort; the original error has priority.
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
assertWebCodecsAvailable() {
|
|
191
|
-
if (typeof globalThis.VideoEncoder === 'undefined') {
|
|
192
|
-
throw new Error('This browser does not support video encoding (WebCodecs). ' +
|
|
193
|
-
'Use Chrome, Firefox, or Safari 17.4+ on a recent device.');
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
buildResult(target, format) {
|
|
197
|
-
const mimeType = format === 'webm' ? 'video/webm' : 'video/mp4';
|
|
198
|
-
if (!target)
|
|
199
|
-
return { blob: null, mimeType };
|
|
200
|
-
return {
|
|
201
|
-
blob: new Blob([target.buffer], { type: mimeType }),
|
|
202
|
-
mimeType,
|
|
203
|
-
};
|
|
38
|
+
return { blob: result.blob, mimeType: result.mimeType };
|
|
204
39
|
}
|
|
205
40
|
}
|
|
206
41
|
//# sourceMappingURL=MediaBunnyVideoRenderer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MediaBunnyVideoRenderer.js","sourceRoot":"","sources":["../../../../src/modules/video/mediabunny/MediaBunnyVideoRenderer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MediaBunnyVideoRenderer.js","sourceRoot":"","sources":["../../../../src/modules/video/mediabunny/MediaBunnyVideoRenderer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAW7D;;;;;;;;;;GAUG;AACH,MAAM,OAAO,uBAAuB;IAEjB,WAAW,CAAiC;IAC5C,WAAW,CAAc;IACzB,cAAc,CAAqC;IAEpE,YAAY,MAAqC;QAC/C,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACtC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACtC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,MAAM,CACV,GAAc,EACd,UAA+C;QAE/C,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;QAC5G,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;YAC5C,MAAM,EAAE,GAAG,CAAC,KAAK;YACjB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO;YACP,OAAO;YACP,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3E,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChD,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrC,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3E,GAAG,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,sBAAsB,EAAE,GAAG,CAAC,sBAAsB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9F,CAAC,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC1D,CAAC;CACF"}
|
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
import type { Input, OutputFormat as MediaBunnyOutputFormat } from 'mediabunny';
|
|
2
2
|
import type { AudioTrackBridge } from '../../../video/mediabunny/audio/AudioTrackBridge';
|
|
3
3
|
import type { AudioDiscardReason } from '../../../video/RenderJob';
|
|
4
|
+
import type { RenderTimeMap } from '../../../video/RenderTimeMap';
|
|
4
5
|
export interface AudioTrackBridgeRequest {
|
|
5
6
|
input: Input;
|
|
6
7
|
format: MediaBunnyOutputFormat;
|
|
8
|
+
/**
|
|
9
|
+
* Maps source-time audio positions to output-time positions when
|
|
10
|
+
* the render excludes one or more time windows. An empty mapper
|
|
11
|
+
* passes audio through unchanged.
|
|
12
|
+
*/
|
|
13
|
+
timeMap: RenderTimeMap;
|
|
7
14
|
/**
|
|
8
15
|
* Called when the input had an audio track but the bridge has to drop
|
|
9
16
|
* it. Not invoked when the input has no audio at all.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioTrackBridgeFactory.d.ts","sourceRoot":"","sources":["../../../../../src/modules/video/mediabunny/audio/AudioTrackBridgeFactory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,IAAI,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAChF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kDAAkD,CAAC;AACzF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"AudioTrackBridgeFactory.d.ts","sourceRoot":"","sources":["../../../../../src/modules/video/mediabunny/audio/AudioTrackBridgeFactory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,IAAI,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAChF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kDAAkD,CAAC;AACzF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,sBAAsB,CAAC;IAC/B;;;;OAIG;IACH,OAAO,EAAE,aAAa,CAAC;IACvB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;CACzD;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACrE"}
|
|
@@ -19,11 +19,11 @@ export class DefaultAudioTrackBridgeFactory {
|
|
|
19
19
|
}
|
|
20
20
|
const supportedCodecs = request.format.getSupportedAudioCodecs();
|
|
21
21
|
if (supportedCodecs.includes(codec)) {
|
|
22
|
-
return new PassthroughAudioTrackBridge({ inputTrack: track, codec });
|
|
22
|
+
return new PassthroughAudioTrackBridge({ inputTrack: track, codec, timeMap: request.timeMap });
|
|
23
23
|
}
|
|
24
24
|
const transcodeTarget = await getFirstEncodableAudioCodec(supportedCodecs);
|
|
25
25
|
if (transcodeTarget) {
|
|
26
|
-
return new TranscodeAudioTrackBridge({ inputTrack: track, codec: transcodeTarget });
|
|
26
|
+
return new TranscodeAudioTrackBridge({ inputTrack: track, codec: transcodeTarget, timeMap: request.timeMap });
|
|
27
27
|
}
|
|
28
28
|
request.onAudioDiscarded?.('no-encodable-target-codec');
|
|
29
29
|
return new DiscardAudioTrackBridge();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DefaultAudioTrackBridgeFactory.js","sourceRoot":"","sources":["../../../../../src/modules/video/mediabunny/audio/DefaultAudioTrackBridgeFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAQzD,OAAO,EAAE,2BAA2B,EAAE,MAAM,6DAA6D,CAAC;AAC1G,OAAO,EAAE,yBAAyB,EAAE,MAAM,2DAA2D,CAAC;AACtG,OAAO,EAAE,uBAAuB,EAAE,MAAM,yDAAyD,CAAC;AAElG;;;;GAIG;AACH,MAAM,OAAO,8BAA8B;IAEzC,KAAK,CAAC,MAAM,CAAC,OAAgC;QAC3C,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,CAAC;QACzD,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,uBAAuB,EAAE,CAAC;QACjD,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;QACrC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,gBAAgB,EAAE,CAAC,sBAAsB,CAAC,CAAC;YACnD,OAAO,IAAI,uBAAuB,EAAE,CAAC;QACvC,CAAC;QACD,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,uBAAuB,EAAE,CAAC;QACjE,IAAI,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACpC,OAAO,IAAI,2BAA2B,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"DefaultAudioTrackBridgeFactory.js","sourceRoot":"","sources":["../../../../../src/modules/video/mediabunny/audio/DefaultAudioTrackBridgeFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAQzD,OAAO,EAAE,2BAA2B,EAAE,MAAM,6DAA6D,CAAC;AAC1G,OAAO,EAAE,yBAAyB,EAAE,MAAM,2DAA2D,CAAC;AACtG,OAAO,EAAE,uBAAuB,EAAE,MAAM,yDAAyD,CAAC;AAElG;;;;GAIG;AACH,MAAM,OAAO,8BAA8B;IAEzC,KAAK,CAAC,MAAM,CAAC,OAAgC;QAC3C,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,CAAC;QACzD,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,uBAAuB,EAAE,CAAC;QACjD,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;QACrC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,gBAAgB,EAAE,CAAC,sBAAsB,CAAC,CAAC;YACnD,OAAO,IAAI,uBAAuB,EAAE,CAAC;QACvC,CAAC;QACD,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,uBAAuB,EAAE,CAAC;QACjE,IAAI,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACpC,OAAO,IAAI,2BAA2B,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACjG,CAAC;QACD,MAAM,eAAe,GAAG,MAAM,2BAA2B,CAAC,eAAe,CAAC,CAAC;QAC3E,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,IAAI,yBAAyB,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAChH,CAAC;QACD,OAAO,CAAC,gBAAgB,EAAE,CAAC,2BAA2B,CAAC,CAAC;QACxD,OAAO,IAAI,uBAAuB,EAAE,CAAC;IACvC,CAAC;CACF"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { type AudioCodec, type InputAudioTrack, type Output } from 'mediabunny';
|
|
2
2
|
import type { AudioTrackBridge } from '../../../video/mediabunny/audio/AudioTrackBridge';
|
|
3
|
+
import type { RenderTimeMap } from '../../../video/RenderTimeMap';
|
|
3
4
|
export interface PassthroughAudioTrackBridgeConfig {
|
|
4
5
|
inputTrack: InputAudioTrack;
|
|
5
6
|
codec: AudioCodec;
|
|
7
|
+
timeMap: RenderTimeMap;
|
|
6
8
|
}
|
|
7
9
|
/**
|
|
8
10
|
* Copies the input's encoded audio packets straight into the output
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PassthroughAudioTrackBridge.d.ts","sourceRoot":"","sources":["../../../../../src/modules/video/mediabunny/audio/PassthroughAudioTrackBridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,UAAU,EAEf,KAAK,eAAe,EACpB,KAAK,MAAM,EACZ,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kDAAkD,CAAC;
|
|
1
|
+
{"version":3,"file":"PassthroughAudioTrackBridge.d.ts","sourceRoot":"","sources":["../../../../../src/modules/video/mediabunny/audio/PassthroughAudioTrackBridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,UAAU,EAEf,KAAK,eAAe,EACpB,KAAK,MAAM,EACZ,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kDAAkD,CAAC;AACzF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,MAAM,WAAW,iCAAiC;IAChD,UAAU,EAAE,eAAe,CAAC;IAC5B,KAAK,EAAE,UAAU,CAAC;IAClB,OAAO,EAAE,aAAa,CAAC;CACxB;AAED;;;;;;;GAOG;AACH,qBAAa,2BAA4B,YAAW,gBAAgB;IAQtD,OAAO,CAAC,QAAQ,CAAC,MAAM;IANnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;IAClD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoB;IACzC,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,aAAa,CAAmC;IACxD,OAAO,CAAC,kBAAkB,CAAQ;gBAEL,MAAM,EAAE,iCAAiC;IAKhE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMvC,SAAS,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOhD,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;YAOf,IAAI;CAgBnB"}
|