3afc4381f0d642eefeaa8a8553479b0a45032c7a
[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.output_width    = 0;
41     opts.verbose         = false;
42     opts.is_camera_input = false;
43     opts.is_video_input  = false;
45     const struct option long_options[] =
46     {
47         {"config",       required_argument, 0, 'c'},
48         {"num_dsps",     required_argument, 0, 'd'},
49         {"num_eves",     required_argument, 0, 'e'},
50         {"num_frames",   required_argument, 0, 'f'},
51         {"input_file",   required_argument, 0, 'i'},
52         {"output_width", required_argument, 0, 'w'},
53         {"help",         no_argument,       0, 'h'},
54         {"verbose",      no_argument,       0, 'v'},
55         {0, 0, 0, 0}
56     };
58     int option_index = 0;
60     while (true)
61     {
62         int c = getopt_long(argc, argv, "c:d:e:f:i:w:hv", long_options,
63                             &option_index);
65         if (c == -1)
66             break;
68         switch (c)
69         {
70             case 'c': opts.config = optarg;
71                       break;
73             case 'd': opts.num_dsps = atoi(optarg);
74                       assert(opts.num_dsps >= 0 && opts.num_dsps <=
75                                      Executor::GetNumDevices(DeviceType::DSP));
76                       break;
78             case 'e': opts.num_eves = atoi(optarg);
79                       assert(opts.num_eves >= 0 && opts.num_eves <=
80                                      Executor::GetNumDevices(DeviceType::EVE));
81                       break;
83             case 'f': opts.num_frames = atoi(optarg);
84                       assert (opts.num_frames > 0);
85                       break;
87             case 'i': opts.input_file = optarg;
88                       break;
90             case 'w': opts.output_width = atoi(optarg);
91                       assert (opts.output_width > 0);
92                       break;
94             case 'v': opts.verbose = true;
95                       break;
97             case 'h': return false;
98                       break;
100             case '?': // Error in getopt_long
101                       exit(EXIT_FAILURE);
102                       break;
104             default:
105                       cerr << "Unsupported option: " << c << endl;
106                       return false;
107                       break;
108         }
109     }
111     opts.is_camera_input = (opts.input_file.size() > 5 &&
112                             opts.input_file.substr(0, 6) == "camera");
113     if (opts.input_file.size() > 4)
114     {
115         string suffix = opts.input_file.substr(opts.input_file.size() - 4, 4);
116         opts.is_video_input = (suffix == ".mp4") || (suffix == ".avi") ||
117                               (suffix == ".mov");
118     }
121 // Set Video Input and Output
122 bool SetVideoInputOutput(VideoCapture &cap, const cmdline_opts_t& opts,
123                          const char* window_name)
125     if (opts.is_camera_input || opts.is_video_input)
126     {
127         if (opts.is_camera_input)
128         {
129             int port_num = 1;  // if TMDSCM572X camera module on AM57x EVM
130             if (opts.input_file.size() > 6)  // "camera#"
131                 port_num = stoi(opts.input_file.substr(6,
132                                                   opts.input_file.size() - 6));
133             cap = VideoCapture(port_num);
134         }
135         else
136             cap = VideoCapture(opts.input_file);
137         if (! cap.isOpened())
138         {
139             cerr << "Cannot open video input: " << opts.input_file << endl;
140             return false;
141         }
142         namedWindow(window_name, WINDOW_AUTOSIZE | CV_GUI_NORMAL);
143     }