| 438 | } |
| 439 | |
| 440 | void optimize(std::vector<NodeConfig> &nodes) { |
| 441 | // nodes_done is used to record ffmpeg_filter node that already optimized |
| 442 | std::vector<NodeConfig> nodes_done; |
| 443 | |
| 444 | while (true) { |
| 445 | std::vector<NodeConfig> nodes_to_merge; |
| 446 | |
| 447 | // put all ffmpeg_filter nodes into nodes_to_merge and try to combine it |
| 448 | // to one node |
| 449 | for (NodeConfig &node : nodes) { |
| 450 | if (node.get_module_info().get_module_name() == "c_ffmpeg_filter" && |
| 451 | std::find(nodes_done.begin(), nodes_done.end(), node) == |
| 452 | nodes_done.end()) { |
| 453 | nodes_to_merge.push_back(node); |
| 454 | } |
| 455 | } |
| 456 | |
| 457 | for (NodeConfig node : nodes_to_merge) { |
| 458 | nodes.erase(std::remove(nodes.begin(), nodes.end(), node), |
| 459 | nodes.end()); |
| 460 | } |
| 461 | |
| 462 | if (nodes_to_merge.size() == 0) { |
| 463 | break; |
| 464 | } |
| 465 | |
| 466 | // nodes to merge should have the same scheduler id |
| 467 | int scheduler_id = nodes_to_merge[0].get_scheduler(); |
| 468 | for (int i = 1; i < nodes_to_merge.size(); i++) { |
| 469 | NodeConfig node = nodes_to_merge[i]; |
| 470 | if (node.get_scheduler() != scheduler_id) { |
| 471 | // remove node from nodes_to_merge and add back to node list |
| 472 | nodes_to_merge.erase(std::remove(nodes_to_merge.begin(), |
| 473 | nodes_to_merge.end(), node), |
| 474 | nodes_to_merge.end()); |
| 475 | nodes.push_back(node); |
| 476 | i--; |
| 477 | } |
| 478 | } |
| 479 | |
| 480 | while (true) { |
| 481 | // do node merge |
| 482 | NodeConfig merged_node = merge_ffmpeg_filter_nodes(nodes_to_merge); |
| 483 | nodes.push_back(merged_node); |
| 484 | |
| 485 | // check if has a circle |
| 486 | StreamConfig circle_stream = |
| 487 | find_first_circle_node(nodes, merged_node); |
| 488 | |
| 489 | if (circle_stream.get_identifier().length() > 0) { |
| 490 | NodeConfig circle_node; |
| 491 | // find circle-end node according to stream |
| 492 | for (NodeConfig node : nodes_to_merge) { |
| 493 | std::vector<StreamConfig> input_streams = |
| 494 | node.get_input_streams(); |
| 495 | if (std::find(input_streams.begin(), input_streams.end(), |
| 496 | circle_stream) != input_streams.end()) { |
| 497 | circle_node = node; |
no test coverage detected