3330b90856ba18e9b2148c0693f95ffa8b3c113c
[tidl/tidl-api.git] / examples / common / video_utils.cpp
1 /******************************************************************************
2  * Copyright (c) 2018, Texas Instruments Incorporated - http://www.ti.com/
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *     * Redistributions of source code must retain the above copyright
8  *       notice, this list of conditions and the following disclaimer.
9  *     * Redistributions in binary form must reproduce the above copyright
10  *       notice, this list of conditions and the following disclaimer in the
11  *       documentation and/or other materials provided with the distribution.
12  *     * Neither the name of Texas Instruments Incorporated nor the
13  *       names of its contributors may be used to endorse or promote products
14  *       derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
26  * THE POSSIBILITY OF SUCH DAMAGE.
27  *****************************************************************************/
29 #include <getopt.h>
30 #include <cassert>
31 #include "video_utils.h"
33 using namespace std;
34 using namespace tidl;
37 bool ProcessArgs(int argc, char *argv[], cmdline_opts_t& opts)
38 {
39     opts.num_frames      = 0;
40     opts.num_layers_groups = 1;
41     opts.output_width    = 0;
42     opts.verbose         = false;
43     opts.is_camera_input = false;
44     opts.is_video_input  = false;
46     const struct option long_options[] =
47     {
48         {"config",       required_argument, 0, 'c'},
49         {"num_dsps",     required_argument, 0, 'd'},
50         {"num_eves",     required_argument, 0, 'e'},
51         {"num_layers_groups", required_argument, 0, 'g'},
52         {"num_frames",   required_argument, 0, 'f'},
53         {"input_file",   required_argument, 0, 'i'},
54         {"output_width", required_argument, 0, 'w'},
55         {"help",         no_argument,       0, 'h'},
56         {"verbose",      no_argument,       0, 'v'},
57         {0, 0, 0, 0}
58     };
60     int option_index = 0;
62     while (true)
63     {
64         int c = getopt_long(argc, argv, "c:d:e:g:f:i:w:hv", long_options,
65                             &option_index);
67         if (c == -1)
68             break;
70         switch (c)
71         {
72             case 'c': opts.config = optarg;
73                       break;
75             case 'd': opts.num_dsps = atoi(optarg);
76                       assert(opts.num_dsps >= 0 && opts.num_dsps <=
77                                      Executor::GetNumDevices(DeviceType::DSP));
78                       break;
80             case 'e': opts.num_eves = atoi(optarg);
81                       assert(opts.num_eves >= 0 && opts.num_eves <=
82                                      Executor::GetNumDevices(DeviceType::EVE));
83                       break;
85             case 'g': opts.num_layers_groups = atoi(optarg);
86                       assert((opts.num_layers_groups == 1) || (opts.num_layers_groups == 2));
87                       break;
89             case 'f': opts.num_frames = atoi(optarg);
90                       assert (opts.num_frames > 0);
91                       break;
93             case 'i': opts.input_file = optarg;
94                       break;
96             case 'w': opts.output_width = atoi(optarg);
97                       assert (opts.output_width > 0);
98                       break;
100             case 'v': opts.verbose = true;
101                       break;
103             case 'h': return false;
104                       break;
106             case '?': // Error in getopt_long
107                       exit(EXIT_FAILURE);
108                       break;
110             default:
111                       cerr << "Unsupported option: " << c << endl;
112                       return false;
113                       break;
114         }
115     }
117     opts.is_camera_input = (opts.input_file.size() > 5 &&
118                             opts.input_file.substr(0, 6) == "camera");
119     if (opts.input_file.size() > 4)
120     {
121         string suffix = opts.input_file.substr(opts.input_file.size() - 4, 4);
122         opts.is_video_input = (suffix == ".mp4") || (suffix == ".avi") ||
123                               (suffix == ".mov");
124     }
126     return true;
129 // Set Video Input and Output
130 bool SetVideoInputOutput(VideoCapture &cap, const cmdline_opts_t& opts,
131                          const char* window_name)
133     if (opts.is_camera_input || opts.is_video_input)
134     {
135         if (opts.is_camera_input)
136         {
137             int port_num = 1;  // if TMDSCM572X camera module on AM57x EVM
138             if (opts.input_file.size() > 6)  // "camera#"
139                 port_num = stoi(opts.input_file.substr(6,
140                                                   opts.input_file.size() - 6));
141             cap = VideoCapture(port_num);
142         }
143         else
144             cap = VideoCapture(opts.input_file);
145         if (! cap.isOpened())
146         {
147             cerr << "Cannot open video input: " << opts.input_file << endl;
148             return false;
149         }
150         namedWindow(window_name, WINDOW_AUTOSIZE | CV_GUI_NORMAL);
151     }
153     return true;