1 /*
2  * Copyright (c) 2022 Shenzhen Kaihong DID Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * 		http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "command_parse.h"
16 #include <getopt.h>
17 #include <iostream>
18 namespace {
19 static struct option g_longOptions[] = {
20     {"width", required_argument, nullptr, static_cast<int>(MyOptIndex::OPT_INDEX_WIDTH)},
21     {"height", required_argument, nullptr, static_cast<int>(MyOptIndex::OPT_INDEX_HEIGHT)},
22     {"in", required_argument, nullptr, static_cast<int>(MyOptIndex::OPT_INDEX_INPUT)},
23     {"out", required_argument, nullptr, static_cast<int>(MyOptIndex::OPT_INDEX_OUTPUT)},
24     {"color", optional_argument, nullptr, static_cast<int>(MyOptIndex::OPT_INDEX_COLOR)},
25     {"nocopy", no_argument, nullptr, static_cast<int>(MyOptIndex::OPT_INDEX_BUFFER_HANDLE)},
26     {"HEVC", no_argument, nullptr, static_cast<int>(MyOptIndex::OPT_INDEX_HEVC)},
27     {"MPEG4", no_argument, nullptr, static_cast<int>(MyOptIndex::OPT_INDEX_MPEG4)},
28     {"VP9", no_argument, nullptr, static_cast<int>(MyOptIndex::OPT_INDEX_VP9)},
29     {"help", no_argument, nullptr, static_cast<int>(MyOptIndex::OPT_INDEX_HELP)},
30     {nullptr, 0, nullptr, static_cast<int>(MyOptIndex::OPT_INDEX_UNKONWN)}};
31 }  // namespace
32 
ParseCodingType(const MyOptIndex index,CommandOpt & opt)33 void CommandParse::ParseCodingType(const MyOptIndex index, CommandOpt &opt)
34 {
35     MyOptIndex optIndex = static_cast<MyOptIndex>(index);
36     switch (optIndex) {
37         case MyOptIndex::OPT_INDEX_HEVC:
38             opt.codec = CodecMime::HEVC;
39             break;
40         case MyOptIndex::OPT_INDEX_VP9:
41             opt.codec = CodecMime::VP9;
42             break;
43         case MyOptIndex::OPT_INDEX_MPEG4:
44             opt.codec = CodecMime::MPEG4;
45             break;
46         default:
47             ShowUsage();
48             break;
49     }
50 }
Parse(int argc,char * argv[],CommandOpt & opt)51 bool CommandParse::Parse(int argc, char *argv[], CommandOpt &opt)
52 {
53     while (1) {
54         int optionIndex = 0;
55         int c = getopt_long(argc, argv, "c::i:o:w:h:", g_longOptions, &optionIndex);
56         if (c == -1) {
57             break;
58         }
59         MyOptIndex index = static_cast<MyOptIndex>(c);
60         switch (index) {
61             case MyOptIndex::OPT_INDEX_BUFFER_HANDLE:
62                 opt.useBuffer = true;
63                 break;
64             case MyOptIndex::OPT_INDEX_HELP:
65                 ShowUsage();
66                 break;
67             case MyOptIndex::OPT_INDEX_INPUT:
68                 opt.fileInput = optarg;
69                 break;
70             case MyOptIndex::OPT_INDEX_OUTPUT:
71                 opt.fileOutput = optarg;
72                 break;
73             case MyOptIndex::OPT_INDEX_WIDTH:
74                 opt.width = std::stoi(optarg);
75                 break;
76             case MyOptIndex::OPT_INDEX_HEIGHT:
77                 opt.height = std::stoi(optarg);
78                 break;
79             case MyOptIndex::OPT_INDEX_COLOR:
80                 if (optarg) {
81                     opt.colorForamt = static_cast<ColorFormat>(std::stoi(optarg));
82                 }
83                 break;
84             default:
85                 ParseCodingType(index, opt);
86                 break;
87         }
88     }
89     if (opt.fileInput.empty() || opt.fileOutput.empty() || opt.width == 0 || opt.height == 0) {
90         return false;
91     }
92     return true;
93 }
94 
ShowUsage()95 void CommandParse::ShowUsage()
96 {
97     std::cout << "Options:" << std::endl;
98     std::cout << " -w, --width=width          The video width." << std::endl;
99     std::cout << " -h, --height=height        The video height." << std::endl;
100     std::cout << " -o, --out=FILE             The file name for output file." << std::endl;
101     std::cout << " -i, --in=FILE              The file name for input file." << std::endl;
102     std::cout << " -cN, --color=N             The color format in the file. 0 is YUV420SP, 1 is RGBA888, 2 is BGRA888, "
103                  "the default is 0."
104               << std::endl;
105     std::cout << " --HEVC                     HEVC decode or encode, AVC for default." << std::endl;
106     std::cout << " --MPEG4                    MPEG4 decode or encode, AVC for default." << std::endl;
107     std::cout << " --VP9                      VP9 decode or encode, AVC for default." << std::endl;
108     std::cout << " --nocopy                   Support BufferHandle." << std::endl;
109     std::cout << " --help                     The help info." << std::endl;
110 }
111