diff --git a/src/ffmpeg/base.py b/src/ffmpeg/base.py index 10e9bd44c..2e2c90970 100644 --- a/src/ffmpeg/base.py +++ b/src/ffmpeg/base.py @@ -1,9 +1,7 @@ from typing import Any from .dag.nodes import FilterableStream, FilterNode, InputNode, MergeOutputsNode, OutputNode, OutputStream -from .streams.audio import AudioStream -from .streams.av import AVStream -from .streams.video import VideoStream +from .streams import AudioStream, AVStream, VideoStream def input(filename: str, **kwargs: Any) -> AVStream: diff --git a/src/ffmpeg/dag/nodes.py b/src/ffmpeg/dag/nodes.py index 7cb0c2fbe..537814634 100644 --- a/src/ffmpeg/dag/nodes.py +++ b/src/ffmpeg/dag/nodes.py @@ -4,6 +4,7 @@ import os.path import shlex import subprocess +from abc import ABC, abstractmethod from dataclasses import dataclass from typing import TYPE_CHECKING, Any @@ -14,9 +15,7 @@ from .schema import Node, Stream if TYPE_CHECKING: - from ..streams.audio import AudioStream - from ..streams.av import AVStream - from ..streams.video import VideoStream + from ..streams import AudioStream, AVStream, VideoStream from .context import DAGContext @@ -48,7 +47,7 @@ def video(self, index: int) -> "VideoStream": Returns: the video stream at the specified index """ - from ..streams.video import VideoStream + from ..streams import VideoStream video_outputs = [i for i, k in enumerate(self.output_typings) if k == StreamType.video] if not len(video_outputs) > index: @@ -65,7 +64,7 @@ def audio(self, index: int) -> "AudioStream": Returns: the audio stream at the specified index """ - from ..streams.audio import AudioStream + from ..streams import AudioStream audio_outputs = [i for i, k in enumerate(self.output_typings) if k == StreamType.audio] if not len(audio_outputs) > index: @@ -74,8 +73,8 @@ def audio(self, index: int) -> "AudioStream": return AudioStream(node=self, index=audio_outputs[index]) def __post_init__(self) -> None: - from ..streams.audio import AudioStream - from ..streams.video import VideoStream + from ..streams.audio import AudioFilter + from ..streams.video import VideoFilter super().__post_init__() @@ -87,10 +86,10 @@ def __post_init__(self) -> None: for i, (stream, expected_type) in enumerate(zip(self.inputs, self.input_typings)): if expected_type == StreamType.video: - if not isinstance(stream, VideoStream): + if not isinstance(stream, VideoFilter): raise ValueError(f"Expected input {i} to have video component, got {stream.__class__.__name__}") if expected_type == StreamType.audio: - if not isinstance(stream, AudioStream): + if not isinstance(stream, AudioFilter): raise ValueError(f"Expected input {i} to have audio component, got {stream.__class__.__name__}") @override @@ -124,13 +123,11 @@ def get_args(self, context: DAGContext = None) -> list[str]: @dataclass(frozen=True, kw_only=True) -class FilterableStream(Stream): +class FilterableStream(Stream, ABC): """ A stream that can be used as input to a filter """ - node: "FilterNode | InputNode" - def vfilter( self, *streams: "FilterableStream", @@ -216,6 +213,7 @@ def output(self, *streams: "FilterableStream", filename: str, **kwargs: Any) -> """ return OutputNode(kwargs=tuple(kwargs.items()), inputs=(self, *streams), filename=filename).stream() + @abstractmethod def label(self, context: DAGContext = None) -> str: """ Return the label for this stream @@ -226,28 +224,7 @@ def label(self, context: DAGContext = None) -> str: Returns: the label for this stream """ - from ..streams.audio import AudioStream - from ..streams.av import AVStream - from ..streams.video import VideoStream - from .context import DAGContext - - if not context: - context = DAGContext.build(self.node) - - if isinstance(self.node, InputNode): - if isinstance(self, AVStream): - return f"{context.get_node_label(self.node)}" - elif isinstance(self, VideoStream): - return f"{context.get_node_label(self.node)}:v" - elif isinstance(self, AudioStream): - return f"{context.get_node_label(self.node)}:a" - raise ValueError(f"Unknown stream type: {self.__class__.__name__}") # pragma: no cover - - if isinstance(self.node, FilterNode): - if len(self.node.output_typings) > 1: - return f"{context.get_node_label(self.node)}#{self.index}" - return f"{context.get_node_label(self.node)}" - raise ValueError(f"Unknown node type: {self.node.__class__.__name__}") # pragma: no cover + raise NotImplementedError() def __post_init__(self) -> None: if isinstance(self.node, InputNode): @@ -316,7 +293,7 @@ def video(self) -> "VideoStream": Returns: the video stream """ - from ..streams.video import VideoStream + from ..streams import VideoStream return VideoStream(node=self) @@ -328,7 +305,7 @@ def audio(self) -> "AudioStream": Returns: the audio stream """ - from ..streams.audio import AudioStream + from ..streams import AudioStream return AudioStream(node=self) @@ -339,7 +316,7 @@ def stream(self) -> "AVStream": Returns: the output stream """ - from ..streams.av import AVStream + from ..streams import AVStream return AVStream(node=self) diff --git a/src/ffmpeg/dag/tests/__snapshots__/test_nodes.ambr b/src/ffmpeg/dag/tests/__snapshots__/test_nodes.ambr index 2b239f0aa..2daa7867a 100644 --- a/src/ffmpeg/dag/tests/__snapshots__/test_nodes.ambr +++ b/src/ffmpeg/dag/tests/__snapshots__/test_nodes.ambr @@ -16,19 +16,10 @@ ]) # --- # name: test_filter_node_with_inputs.1 - + # --- # name: test_filter_node_with_inputs.2 - -# --- -# name: test_filterable_stream - '1' -# --- -# name: test_filterable_stream.1 - '0' -# --- -# name: test_filterable_stream.2 - 's0#0' + # --- # name: test_node_prop[filter-node][__repr__] "FilterNode(args=(), kwargs=(('w', '1920'), ('h', '1080'), ('true', True), ('false', False)), inputs=(), name='scale', input_typings=(), output_typings=())" diff --git a/src/ffmpeg/dag/tests/__snapshots__/test_nodes/test_filter_node_with_inputs.json b/src/ffmpeg/dag/tests/__snapshots__/test_nodes/test_filter_node_with_inputs.json index c303a681b..5ccfef2d9 100644 --- a/src/ffmpeg/dag/tests/__snapshots__/test_nodes/test_filter_node_with_inputs.json +++ b/src/ffmpeg/dag/tests/__snapshots__/test_nodes/test_filter_node_with_inputs.json @@ -1 +1 @@ -"FilterNode(args=(), kwargs=(('w', '1920'), ('h', '1080')), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='test.mp4'), index=None), AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='test.mp4'), index=None)), name='scale', input_typings=(, ), output_typings=())" +"FilterNode(args=(), kwargs=(('w', '1920'), ('h', '1080')), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='test.mp4'), index=None), AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='test.mp4'), index=None)), name='scale', input_typings=(, ), output_typings=())" diff --git a/src/ffmpeg/dag/tests/__snapshots__/test_nodes/test_input_selector.1.json b/src/ffmpeg/dag/tests/__snapshots__/test_nodes/test_input_selector.1.json deleted file mode 100644 index 5a7ebd663..000000000 --- a/src/ffmpeg/dag/tests/__snapshots__/test_nodes/test_input_selector.1.json +++ /dev/null @@ -1,5 +0,0 @@ -[ - "[0:v]", - "reverse", - "" -] diff --git a/src/ffmpeg/dag/tests/__snapshots__/test_nodes/test_input_selector.json b/src/ffmpeg/dag/tests/__snapshots__/test_nodes/test_input_selector.json deleted file mode 100644 index b8de7e142..000000000 --- a/src/ffmpeg/dag/tests/__snapshots__/test_nodes/test_input_selector.json +++ /dev/null @@ -1,5 +0,0 @@ -[ - "[0:a]", - "areverse", - "" -] diff --git a/src/ffmpeg/dag/tests/__snapshots__/test_serialize.ambr b/src/ffmpeg/dag/tests/__snapshots__/test_serialize.ambr index d704ad9f7..791833a8f 100644 --- a/src/ffmpeg/dag/tests/__snapshots__/test_serialize.ambr +++ b/src/ffmpeg/dag/tests/__snapshots__/test_serialize.ambr @@ -6,8 +6,8 @@ '{"__class__": "ffmpeg.dag.tests.test_serialize.Person", "name": "John Doe", "age": 30, "address": {"__class__": "ffmpeg.dag.tests.test_serialize.Address", "street": "123 Main St", "city": "Anytown"}}' # --- # name: test_load_and_dump_mixed_type[serialized] - '[{"__class__": "ffmpeg.streams.av.AVStream", "node": {"__class__": "ffmpeg.dag.nodes.InputNode", "args": [], "kwargs": [], "inputs": [], "filename": "input.mp4"}, "index": null}, true]' + '[{"__class__": "ffmpeg.streams.input.AVStream", "node": {"__class__": "ffmpeg.dag.nodes.InputNode", "args": [], "kwargs": [], "inputs": [], "filename": "input.mp4"}, "index": null}, true]' # --- # name: test_load_and_dump_on_complex_filter[serialized] - '{"__class__": "ffmpeg.dag.nodes.OutputStream", "node": {"__class__": "ffmpeg.dag.nodes.OutputNode", "args": [], "kwargs": [], "inputs": [{"__class__": "ffmpeg.streams.video.VideoStream", "node": {"__class__": "ffmpeg.dag.nodes.FilterNode", "args": [], "kwargs": [["x", "50"], ["y", "50"], ["width", "120"], ["height", "120"], ["color", "red"], ["thickness", "5"]], "inputs": [{"__class__": "ffmpeg.streams.video.VideoStream", "node": {"__class__": "ffmpeg.dag.nodes.FilterNode", "args": [], "kwargs": [], "inputs": [{"__class__": "ffmpeg.streams.video.VideoStream", "node": {"__class__": "ffmpeg.dag.nodes.FilterNode", "args": [], "kwargs": [], "inputs": [{"__class__": "ffmpeg.streams.video.VideoStream", "node": {"__class__": "ffmpeg.dag.nodes.FilterNode", "args": [], "kwargs": [["start_frame", 10], ["end_frame", 20]], "inputs": [{"__class__": "ffmpeg.streams.av.AVStream", "node": {"__class__": "ffmpeg.dag.nodes.InputNode", "args": [], "kwargs": [], "inputs": [], "filename": "input.mp4"}, "index": null}], "name": "trim", "input_typings": [{"__class__": "ffmpeg.schema.StreamType", "value": "video"}], "output_typings": [{"__class__": "ffmpeg.schema.StreamType", "value": "video"}]}, "index": 0}, {"__class__": "ffmpeg.streams.video.VideoStream", "node": {"__class__": "ffmpeg.dag.nodes.FilterNode", "args": [], "kwargs": [["start_frame", 30], ["end_frame", 40]], "inputs": [{"__class__": "ffmpeg.streams.av.AVStream", "node": {"__class__": "ffmpeg.dag.nodes.InputNode", "args": [], "kwargs": [], "inputs": [], "filename": "input.mp4"}, "index": null}], "name": "trim", "input_typings": [{"__class__": "ffmpeg.schema.StreamType", "value": "video"}], "output_typings": [{"__class__": "ffmpeg.schema.StreamType", "value": "video"}]}, "index": 0}], "name": "concat", "input_typings": [{"__class__": "ffmpeg.schema.StreamType", "value": "video"}, {"__class__": "ffmpeg.schema.StreamType", "value": "video"}], "output_typings": [{"__class__": "ffmpeg.schema.StreamType", "value": "video"}]}, "index": 0}, {"__class__": "ffmpeg.streams.video.VideoStream", "node": {"__class__": "ffmpeg.dag.nodes.FilterNode", "args": [], "kwargs": [], "inputs": [{"__class__": "ffmpeg.streams.av.AVStream", "node": {"__class__": "ffmpeg.dag.nodes.InputNode", "args": [], "kwargs": [], "inputs": [], "filename": "overlay.png"}, "index": null}], "name": "hflip", "input_typings": [{"__class__": "ffmpeg.schema.StreamType", "value": "video"}], "output_typings": [{"__class__": "ffmpeg.schema.StreamType", "value": "video"}]}, "index": 0}], "name": "overlay", "input_typings": [{"__class__": "ffmpeg.schema.StreamType", "value": "video"}, {"__class__": "ffmpeg.schema.StreamType", "value": "video"}], "output_typings": [{"__class__": "ffmpeg.schema.StreamType", "value": "video"}]}, "index": 0}], "name": "drawbox", "input_typings": [{"__class__": "ffmpeg.schema.StreamType", "value": "video"}], "output_typings": [{"__class__": "ffmpeg.schema.StreamType", "value": "video"}]}, "index": 0}], "filename": "out.mp4"}, "index": null}' + '{"__class__": "ffmpeg.dag.nodes.OutputStream", "node": {"__class__": "ffmpeg.dag.nodes.OutputNode", "args": [], "kwargs": [], "inputs": [{"__class__": "ffmpeg.streams.filter.VideoStream", "node": {"__class__": "ffmpeg.dag.nodes.FilterNode", "args": [], "kwargs": [["x", "50"], ["y", "50"], ["width", "120"], ["height", "120"], ["color", "red"], ["thickness", "5"]], "inputs": [{"__class__": "ffmpeg.streams.filter.VideoStream", "node": {"__class__": "ffmpeg.dag.nodes.FilterNode", "args": [], "kwargs": [], "inputs": [{"__class__": "ffmpeg.streams.filter.VideoStream", "node": {"__class__": "ffmpeg.dag.nodes.FilterNode", "args": [], "kwargs": [], "inputs": [{"__class__": "ffmpeg.streams.filter.VideoStream", "node": {"__class__": "ffmpeg.dag.nodes.FilterNode", "args": [], "kwargs": [["start_frame", 10], ["end_frame", 20]], "inputs": [{"__class__": "ffmpeg.streams.input.AVStream", "node": {"__class__": "ffmpeg.dag.nodes.InputNode", "args": [], "kwargs": [], "inputs": [], "filename": "input.mp4"}, "index": null}], "name": "trim", "input_typings": [{"__class__": "ffmpeg.schema.StreamType", "value": "video"}], "output_typings": [{"__class__": "ffmpeg.schema.StreamType", "value": "video"}]}, "index": 0}, {"__class__": "ffmpeg.streams.filter.VideoStream", "node": {"__class__": "ffmpeg.dag.nodes.FilterNode", "args": [], "kwargs": [["start_frame", 30], ["end_frame", 40]], "inputs": [{"__class__": "ffmpeg.streams.input.AVStream", "node": {"__class__": "ffmpeg.dag.nodes.InputNode", "args": [], "kwargs": [], "inputs": [], "filename": "input.mp4"}, "index": null}], "name": "trim", "input_typings": [{"__class__": "ffmpeg.schema.StreamType", "value": "video"}], "output_typings": [{"__class__": "ffmpeg.schema.StreamType", "value": "video"}]}, "index": 0}], "name": "concat", "input_typings": [{"__class__": "ffmpeg.schema.StreamType", "value": "video"}, {"__class__": "ffmpeg.schema.StreamType", "value": "video"}], "output_typings": [{"__class__": "ffmpeg.schema.StreamType", "value": "video"}]}, "index": 0}, {"__class__": "ffmpeg.streams.filter.VideoStream", "node": {"__class__": "ffmpeg.dag.nodes.FilterNode", "args": [], "kwargs": [], "inputs": [{"__class__": "ffmpeg.streams.input.AVStream", "node": {"__class__": "ffmpeg.dag.nodes.InputNode", "args": [], "kwargs": [], "inputs": [], "filename": "overlay.png"}, "index": null}], "name": "hflip", "input_typings": [{"__class__": "ffmpeg.schema.StreamType", "value": "video"}], "output_typings": [{"__class__": "ffmpeg.schema.StreamType", "value": "video"}]}, "index": 0}], "name": "overlay", "input_typings": [{"__class__": "ffmpeg.schema.StreamType", "value": "video"}, {"__class__": "ffmpeg.schema.StreamType", "value": "video"}], "output_typings": [{"__class__": "ffmpeg.schema.StreamType", "value": "video"}]}, "index": 0}], "name": "drawbox", "input_typings": [{"__class__": "ffmpeg.schema.StreamType", "value": "video"}], "output_typings": [{"__class__": "ffmpeg.schema.StreamType", "value": "video"}]}, "index": 0}], "filename": "out.mp4"}, "index": null}' # --- diff --git a/src/ffmpeg/dag/tests/__snapshots__/test_validate.ambr b/src/ffmpeg/dag/tests/__snapshots__/test_validate.ambr index fd6fb512c..0960ef3a3 100644 --- a/src/ffmpeg/dag/tests/__snapshots__/test_validate.ambr +++ b/src/ffmpeg/dag/tests/__snapshots__/test_validate.ambr @@ -3,97 +3,97 @@ list([ InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), - OutputNode(args=(), kwargs=(), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), index=0), AudioStream(node=FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), index=1)), filename='tmp.mp4'), - FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), - FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), - FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), + OutputNode(args=(), kwargs=(), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), index=0), AudioStream(node=FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), index=1)), filename='tmp.mp4'), + FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), + FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), + FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), ]) # --- # name: test_rebuild_graph[complex-stream][all_streams] list([ - VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None), - AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None), - VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), - AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), - VideoStream(node=FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), index=0), - AudioStream(node=FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), index=1), + VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None), + AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None), + VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), + AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), + VideoStream(node=FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), index=0), + AudioStream(node=FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), index=1), ]) # --- # name: test_rebuild_graph[complex-stream][node_labels] dict({ - FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )): 's2', - FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)): 's1', - FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)): 's0', + FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )): 's2', + FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)): 's1', + FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)): 's0', InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'): '0', InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'): '1', - OutputNode(args=(), kwargs=(), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), index=0), AudioStream(node=FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), index=1)), filename='tmp.mp4'): 'out', + OutputNode(args=(), kwargs=(), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), index=0), AudioStream(node=FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), index=1)), filename='tmp.mp4'): 'out', }) # --- # name: test_rebuild_graph[complex-stream][outgoing_nodes] defaultdict({ - AudioStream(node=FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), index=1): list([ + AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None): list([ tuple( - OutputNode(args=(), kwargs=(), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), index=0), AudioStream(node=FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), index=1)), filename='tmp.mp4'), + FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), + 0, + ), + ]), + AudioStream(node=FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), index=1): list([ + tuple( + OutputNode(args=(), kwargs=(), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), index=0), AudioStream(node=FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), index=1)), filename='tmp.mp4'), 1, ), ]), - AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0): list([ + AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0): list([ tuple( - FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), + FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), 1, ), tuple( - FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), + FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), 3, ), ]), - AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None): list([ + VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None): list([ tuple( - FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), + FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), 0, ), ]), - VideoStream(node=FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), index=0): list([ + VideoStream(node=FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), index=0): list([ tuple( - OutputNode(args=(), kwargs=(), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), index=0), AudioStream(node=FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), index=1)), filename='tmp.mp4'), + OutputNode(args=(), kwargs=(), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), index=0), AudioStream(node=FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), index=1)), filename='tmp.mp4'), 0, ), ]), - VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0): list([ + VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0): list([ tuple( - FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), + FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), 0, ), tuple( - FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), + FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), 2, ), ]), - VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None): list([ - tuple( - FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), - 0, - ), - ]), }) # --- # name: test_rebuild_graph[complex-stream][outgoing_streams] defaultdict({ - FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )): list([ - VideoStream(node=FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), index=0), - AudioStream(node=FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), index=1), + FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )): list([ + VideoStream(node=FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), index=0), + AudioStream(node=FilterNode(args=(), kwargs=(('v', 1), ('a', 1)), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0)), name='concat', input_typings=(, , , ), output_typings=(, )), index=1), ]), - FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)): list([ - AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), + FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)): list([ + AudioStream(node=FilterNode(args=(), kwargs=(), inputs=(AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None),), name='areverse', input_typings=(,), output_typings=(,)), index=0), ]), - FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)): list([ - VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), + FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)): list([ + VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None),), name='reverse', input_typings=(,), output_typings=(,)), index=0), ]), InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'): list([ - VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None), + VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input1.mp4'), index=None), ]), InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'): list([ - AudioStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None), + AudioIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input2.mp4'), index=None), ]), }) # --- @@ -314,50 +314,50 @@ # name: test_rebuild_graph[reuse-input][all_nodes] list([ InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), - OutputNode(args=(), kwargs=(), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None), VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None)), name='concat', input_typings=(, ), output_typings=(,)), index=0),), filename='tmp.mp4'), - FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None), VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None)), name='concat', input_typings=(, ), output_typings=(,)), + OutputNode(args=(), kwargs=(), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None), VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None)), name='concat', input_typings=(, ), output_typings=(,)), index=0),), filename='tmp.mp4'), + FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None), VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None)), name='concat', input_typings=(, ), output_typings=(,)), ]) # --- # name: test_rebuild_graph[reuse-input][all_streams] list([ - VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None), - VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None), VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None)), name='concat', input_typings=(, ), output_typings=(,)), index=0), + VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None), + VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None), VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None)), name='concat', input_typings=(, ), output_typings=(,)), index=0), ]) # --- # name: test_rebuild_graph[reuse-input][node_labels] dict({ - FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None), VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None)), name='concat', input_typings=(, ), output_typings=(,)): 's0', + FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None), VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None)), name='concat', input_typings=(, ), output_typings=(,)): 's0', InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'): '0', - OutputNode(args=(), kwargs=(), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None), VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None)), name='concat', input_typings=(, ), output_typings=(,)), index=0),), filename='tmp.mp4'): 'out', + OutputNode(args=(), kwargs=(), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None), VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None)), name='concat', input_typings=(, ), output_typings=(,)), index=0),), filename='tmp.mp4'): 'out', }) # --- # name: test_rebuild_graph[reuse-input][outgoing_nodes] defaultdict({ - VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None), VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None)), name='concat', input_typings=(, ), output_typings=(,)), index=0): list([ + VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None): list([ tuple( - OutputNode(args=(), kwargs=(), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None), VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None)), name='concat', input_typings=(, ), output_typings=(,)), index=0),), filename='tmp.mp4'), + FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None), VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None)), name='concat', input_typings=(, ), output_typings=(,)), 0, ), - ]), - VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None): list([ tuple( - FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None), VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None)), name='concat', input_typings=(, ), output_typings=(,)), - 0, + FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None), VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None)), name='concat', input_typings=(, ), output_typings=(,)), + 1, ), + ]), + VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None), VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None)), name='concat', input_typings=(, ), output_typings=(,)), index=0): list([ tuple( - FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None), VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None)), name='concat', input_typings=(, ), output_typings=(,)), - 1, + OutputNode(args=(), kwargs=(), inputs=(VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None), VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None)), name='concat', input_typings=(, ), output_typings=(,)), index=0),), filename='tmp.mp4'), + 0, ), ]), }) # --- # name: test_rebuild_graph[reuse-input][outgoing_streams] defaultdict({ - FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None), VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None)), name='concat', input_typings=(, ), output_typings=(,)): list([ - VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None), VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None)), name='concat', input_typings=(, ), output_typings=(,)), index=0), + FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None), VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None)), name='concat', input_typings=(, ), output_typings=(,)): list([ + VideoStream(node=FilterNode(args=(), kwargs=(), inputs=(VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None), VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None)), name='concat', input_typings=(, ), output_typings=(,)), index=0), ]), InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'): list([ - VideoStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None), + VideoIStream(node=InputNode(args=(), kwargs=(), inputs=(), filename='input.mp4'), index=None), ]), }) # --- diff --git a/src/ffmpeg/dag/tests/__snapshots__/test_validate/test_rebuild_graph[reuse-input][add-split].png b/src/ffmpeg/dag/tests/__snapshots__/test_validate/test_rebuild_graph[reuse-input][add-split].png deleted file mode 100644 index 558d09964..000000000 Binary files a/src/ffmpeg/dag/tests/__snapshots__/test_validate/test_rebuild_graph[reuse-input][add-split].png and /dev/null differ diff --git a/src/ffmpeg/dag/validate.py b/src/ffmpeg/dag/validate.py index 6cd45b747..227567977 100644 --- a/src/ffmpeg/dag/validate.py +++ b/src/ffmpeg/dag/validate.py @@ -2,9 +2,7 @@ from dataclasses import replace -from ..streams.audio import AudioStream -from ..streams.av import AVStream -from ..streams.video import VideoStream +from ..streams import AudioStream, AVStream, VideoStream from .context import DAGContext from .nodes import FilterNode from .schema import Node, Stream diff --git a/src/ffmpeg/filters.py b/src/ffmpeg/filters.py index 46bed7a9b..8a9d1e433 100644 --- a/src/ffmpeg/filters.py +++ b/src/ffmpeg/filters.py @@ -3,8 +3,7 @@ from .dag.nodes import FilterableStream, FilterNode from .schema import Default, StreamType, to_tuple -from .streams.audio import AudioStream -from .streams.video import VideoStream +from .streams import AudioStream, VideoStream from .types import Boolean, Color, Double, Duration, Flags, Float, Image_size, Int, Int64, Pix_fmt, String, Video_rate diff --git a/src/ffmpeg/streams/__init__.py b/src/ffmpeg/streams/__init__.py index bfb7336de..fd9aed5a3 100644 --- a/src/ffmpeg/streams/__init__.py +++ b/src/ffmpeg/streams/__init__.py @@ -1,5 +1,4 @@ -from .audio import AudioStream -from .av import AVStream -from .video import VideoStream +from .filter import AudioStream, VideoStream +from .input import AVStream __all__ = ["AudioStream", "VideoStream", "AVStream"] diff --git a/src/ffmpeg/streams/audio.py b/src/ffmpeg/streams/audio.py index 05b80f711..791a52af7 100644 --- a/src/ffmpeg/streams/audio.py +++ b/src/ffmpeg/streams/audio.py @@ -9,10 +9,10 @@ from .channel_layout import CHANNEL_LAYOUT if TYPE_CHECKING: - from .video import VideoStream + from .filter import AudioStream, VideoStream -class AudioStream(FilterableStream): +class AudioFilter(FilterableStream): def a3dscope( self, *, diff --git a/src/ffmpeg/streams/av.py b/src/ffmpeg/streams/av.py deleted file mode 100644 index f1a5ac175..000000000 --- a/src/ffmpeg/streams/av.py +++ /dev/null @@ -1,18 +0,0 @@ -from ..dag.nodes import InputNode -from ..utils.typing import override -from .audio import AudioStream -from .video import VideoStream - - -class AVStream(AudioStream, VideoStream): - node: InputNode - - @property - @override - def video(self) -> VideoStream: - return VideoStream(node=self.node, index=self.index) - - @property - @override - def audio(self) -> AudioStream: - return AudioStream(node=self.node, index=self.index) diff --git a/src/ffmpeg/streams/filter.py b/src/ffmpeg/streams/filter.py new file mode 100644 index 000000000..1850bbd7b --- /dev/null +++ b/src/ffmpeg/streams/filter.py @@ -0,0 +1,24 @@ +from ..dag.context import DAGContext +from ..dag.nodes import FilterableStream, FilterNode +from ..utils.typing import override +from .audio import AudioFilter +from .video import VideoFilter + + +class FilterStream(FilterableStream): + node: FilterNode + index: int + + @override + def label(self, context: DAGContext) -> str: + if self.node.output_typings and len(self.node.output_typings) > 1: + return f"{context.get_node_label(self.node)}#{self.index}" + return f"{context.get_node_label(self.node)}" + + +class AudioStream(AudioFilter, FilterStream): + pass + + +class VideoStream(VideoFilter, FilterStream): + pass diff --git a/src/ffmpeg/streams/input.py b/src/ffmpeg/streams/input.py new file mode 100644 index 000000000..eaee90905 --- /dev/null +++ b/src/ffmpeg/streams/input.py @@ -0,0 +1,42 @@ +from dataclasses import dataclass + +from ..dag.context import DAGContext +from ..dag.nodes import FilterableStream, InputNode +from ..utils.typing import override +from .audio import AudioFilter +from .video import VideoFilter + + +@dataclass(frozen=True, kw_only=True) +class InputStream(FilterableStream): + node: InputNode + index: int | None = None + + +@dataclass(frozen=True, kw_only=True) +class VideoIStream(VideoFilter, InputStream): + @override + def label(self, context: DAGContext) -> str: + return f"{context.get_node_label(self.node)}:v" + + +@dataclass(frozen=True, kw_only=True) +class AudioIStream(AudioFilter, InputStream): + @override + def label(self, context: DAGContext) -> str: + return f"{context.get_node_label(self.node)}:a" + + +@dataclass(frozen=True, kw_only=True) +class AVStream(VideoFilter, AudioFilter, InputStream): + @property + def video(self) -> VideoIStream: + return VideoIStream(node=self.node, index=self.index) + + @property + def audio(self) -> AudioIStream: + return AudioIStream(node=self.node, index=self.index) + + @override + def label(self, context: DAGContext) -> str: + return context.get_node_label(self.node) diff --git a/src/ffmpeg/streams/video.py b/src/ffmpeg/streams/video.py index 21639720d..179e5788b 100644 --- a/src/ffmpeg/streams/video.py +++ b/src/ffmpeg/streams/video.py @@ -7,10 +7,10 @@ from ..types import Boolean, Color, Double, Duration, Flags, Float, Image_size, Int, Int64, Rational, String, Video_rate if TYPE_CHECKING: - from .audio import AudioStream + from .filter import AudioStream, VideoStream -class VideoStream(FilterableStream): +class VideoFilter(FilterableStream): def addroi( self, *, diff --git a/src/ffmpeg/tests/__snapshots__/test_base.ambr b/src/ffmpeg/tests/__snapshots__/test_base.ambr index 397eb6196..b581eed30 100644 --- a/src/ffmpeg/tests/__snapshots__/test_base.ambr +++ b/src/ffmpeg/tests/__snapshots__/test_base.ambr @@ -3,5 +3,5 @@ # --- # name: test_filter_node.1 - + # --- diff --git a/src/ffmpeg/tests/test_base.py b/src/ffmpeg/tests/test_base.py index 668bd2057..43ba0d9ae 100644 --- a/src/ffmpeg/tests/test_base.py +++ b/src/ffmpeg/tests/test_base.py @@ -4,7 +4,7 @@ from ..base import input, merge_outputs, output from ..filters import concat, join -from ..streams.video import VideoStream +from ..streams import VideoStream def test_filter_node(snapshot: SnapshotAssertion) -> None: