#include #include #include #include #include "tbb/task_scheduler_init.h" #include "configuration.hh" #include "pipeline.hh" #include "encoder/video_reader.hh" #include "encoder/video_writer.hh" bool parse_cli(Configuration& conf, int argc, char** argv) { namespace po = boost::program_options; // Register all possible options po::options_description desc("Allowed options"); desc.add_options() ("help,h", "produce help message") ("filter,f", po::value>(), "apply a filter") ("input-file,i", po::value>(), "file to treat") ("output,o", po::value(), "output file") ("codec,c", po::value(), "output codec") ; // Handle ./prpa file.avi instead of ./prpa --input-file=file.avi po::positional_options_description p; p.add("input-file", -1); // Read command line po::variables_map vm; try { po::store(po::command_line_parser(argc, argv). options(desc).positional(p).run(), vm); } catch (po::invalid_command_line_syntax e) { std::cerr << argv[0] << ": " << e.what() << std::endl; return false; } po::notify(vm); // Handle -h and --help if (argc <= 1 || vm.count("help")) { std::cout << desc << "\n"; return false; } // GO! std::cout << "Given filters: "; if (vm.count("filter")) std::cout << vm["filter"].as > ().size() << std::endl; else std::cout << 0 << std::endl; std::cout << "Given files: "; if (vm.count("input-file")) std::cout << vm["input-file"].as > ().size() << std::endl; else std::cout << 0 << std::endl; /* Store configuration */ conf.output = std::string(vm["output"].as()); conf.codec = std::string(vm["codec"].as()); std::vector vs; if (vm.count("input-file")) { vs = vm["input-file"].as>(); for (auto it = vs.begin(); it != vs.end(); ++it) conf.input.push_back(std::string(*it)); } if (vm.count("filter")) { vs = vm["filter"].as> (); for (auto it = vs.begin(); it != vs.end(); ++it) conf.filters.push_back(std::string(*it)); } return true; } int main (int argc, char** argv) { tbb::task_scheduler_init init; Configuration conf = Configuration(); if (!parse_cli(conf, argc, argv)) return 1; std::list input_vr = std::list(); for (auto it = conf.input.begin(); it != conf.input.end(); ++it) input_vr.push_back(VideoReader(*it)); VideoWriter vw = VideoWriter(); vw.open(conf.output, conf.codec, input_vr.front().fps_get(), input_vr.front().width_get(), input_vr.front().height_get()); Pipeline pipe(input_vr, vw); // add filters here //pipe.add_filter("grey", std::vector()); //pipe.add_filter("count", std::vector()); //pipe.add_filter("cartoon", std::vector()); //pipe.add_filter("blur", std::vector { 30 }); //pipe.add_filter("reverse", std::vector()); //pipe.add_filter("interlace", std::vector()); //pipe.add_filter("merge", std::vector()); //pipe.add_filter("inlay", std::vector { 0, 0, 255 }); pipe.run(); return 0; }