8000 #17: remove `Node._parents` · Powercoder64/ffmpeg-python@fc07f6c · GitHub
[go: up one dir, main page]

Skip to content

Commit fc07f6c

Browse files
committed
kkroening#17: remove Node._parents
1 parent 7236984 commit fc07f6c

File tree

3 files changed

+41
-30
lines changed

3 files changed

+41
-30
lines changed

ffmpeg/_run.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ def _get_input_args(input_node):
5555
def _get_filter_spec(i, node, stream_name_map):
5656
stream_name = _get_stream_name('v{}'.format(i))
5757
stream_name_map[node] = stream_name
58-
inputs = [stream_name_map[parent] for parent in node._parents]
58+
inputs = [stream_name_map[edge.upstream_node] for edge in node.incoming_edges]
5959
filter_spec = '{}{}{}'.format(''.join(inputs), node._get_filter(), stream_name)
6060
return filter_spec
6161

@@ -75,7 +75,8 @@ def _get_global_args(node):
7575
def _get_output_args(node, stream_name_map):
7676
args = []
7777
if node.name != merge_outputs.__name__:
78-
stream_name = stream_name_map[node._parents[0]]
78+
assert len(node.incoming_edges) == 1
79+
stream_name = stream_name_map[node.incoming_edges[0].upstream_node]
7980
if stream_name != '[0]':
8081
args += ['-map', stream_name]
8182
if node.name == output.__name__:
@@ -96,7 +97,7 @@ def get_args(node):
9697
"""Get command-line arguments for ffmpeg."""
9798
args = []
9899
# TODO: group nodes together, e.g. `-i somefile -r somerate`.
99-
sorted_nodes, child_map = topo_sort([node])
100+
sorted_nodes, outgoing_edge_maps = topo_sort([node])
100101
del(node)
101102
input_nodes = [node for node in sorted_nodes if isinstance(node, InputNode)]
102103
output_nodes = [node for node in sorted_nodes if isinstance(node, OutputNode) and not

ffmpeg/dag.py

Lines changed: 37 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,20 @@ def incoming_edge_map(self):
9696
DagEdge = namedtuple('DagEdge', ['downstream_node', 'downstream_label', 'upstream_node', 'upstream_label'])
9797

9898

99+
def get_incoming_edges(downstream_node, incoming_edge_map):
100+
edges = []
101+
for downstream_label, (upstream_node, upstream_label) in incoming_edge_map.items():
102+
edges += [DagEdge(downstream_node, downstream_label, upstream_node, upstream_label)]
103+
return edges
104+
105+
106+
def get_outgoing_edges(upstream_node, outgoing_edge_map):
107+
edges = []
108+
for upstream_label, (downstream_node, downstream_label) in outgoing_edge_map:
109+
edges += [DagEdge(downstream_node, downstream_label, upstream_node, upstream_label)]
110+
return edges
111+
112+
99113
class KwargReprNode(DagNode):
100114
"""A DagNode that can be represented as a set of args+kwargs.
101115
"""
@@ -142,11 +156,7 @@ def __repr__(self):
142156

143157
@property
144158
def incoming_edges(self):
145-
edges = []
146-
for downstream_label, (upstream_node, upstream_label) in self.incoming_edge_map.items():
147-
downstream_node = self
148-
edges += [DagEdge(downstream_node, downstream_label, upstream_node, upstream_label)]
149-
return edges
159+
return get_incoming_edges(self, self.incoming_edge_map)
150160

151161
@property
152162
def incoming_edge_map(self):
@@ -157,24 +167,29 @@ def short_repr(self):
157167
return self.name
158168

159169

160-
def topo_sort(start_nodes):
170+
def topo_sort(downstream_nodes):
161171
marked_nodes = []
162172
sorted_nodes = []
163-
child_map = {}
164-
def visit(node, child):
165-
if node in marked_nodes:
173+
outgoing_edge_maps = {}
174+
175+
def visit(upstream_node, upstream_label, downstream_node, downstream_label):
176+
if upstream_node in marked_nodes:
166177
raise RuntimeError('Graph is not a DAG')
167-
if child is not None:
168-
if node not in child_map:
169-
child_map[node] = []
170-
child_map[node].append(child)
171-
if node not in sorted_nodes:
172-
marked_nodes.append(node)
173-
parents = [edge.upstream_node for edge in node.incoming_edges]
174-
[visit(parent, node) for parent in parents]
175-
marked_nodes.remove(node)
176-
sorted_nodes.append(node)
177-
unmarked_nodes = list(copy.copy(start_nodes))
178+
179+
if downstream_node is not None:
180+
if upstream_node not in outgoing_edge_maps:
181+
outgoing_edge_maps[upstream_node] = {}
182+
outgoing_edge_maps[upstream_node][upstream_label] = (downstream_node, downstream_label)
183+
184+
if upstream_node not in sorted_nodes:
185+
marked_nodes.append(upstream_node)
186+
for edge in upstream_node.incoming_edges:
187+
visit(edge.upstream_node, edge.upstream_label, edge.downstream_node, edge.downstream_label)
188+
marked_nodes.remove(upstream_node)
189+
sorted_nodes.append(upstream_node)
190+
191+
unmarked_nodes = [(node, 0) for node in downstream_nodes]
178192
while unmarked_nodes:
179-
visit(unmarked_nodes.pop(), None)
180-
return sorted_nodes, child_map
193+
upstream_node, upstream_label = unmarked_nodes.pop()
194+
visit(upstream_node, upstream_label, None, None)
195+
return sorted_nodes, outgoing_edge_maps

ffmpeg/nodes.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,6 @@ def __init__(self, parents, name, *args, **kwargs):
1313
incoming_edge_map[downstream_label] = (upstream_node, upstream_label)
1414
super(Node, self).__init__(incoming_edge_map, name, args, kwargs)
1515

16-
@property
17-
def _parents(self):
18-
# TODO: change graph compilation to use `self.incoming_edges` instead.
19-
return [edge.upstream_node for edge in self.incoming_edges]
20-
2116

2217
class InputNode(Node):
2318
"""InputNode type"""

0 commit comments

Comments
 (0)
0