1 /*
2  * Copyright (c) 2024 Huawei Device 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 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 
16 #include <getopt.h>
17 #include <iostream>
18 #include "command_parser.h"
19 
20 namespace OHOS::VDI::HEIF {
21 using namespace std;
22 
23 enum ShortOption {
24     OPT_UNKONWN = 0,
25     OPT_HELP,
26     OPT_PRIMARY_IMG,
27     OPT_AUXILIARY_IMG,
28     OPT_THUMBNAIL_IMG,
29     OPT_GAIN_MAP,
30     OPT_EXIF_DATA,
31     OPT_USER_DATA,
32     OPT_ICC_PROFILE,
33     OPT_IT35,
34     OPT_MIRROR,
35     OPT_ROTATE,
36     OPT_OUTPUT = 'o'
37 };
38 
39 static struct option g_longOptions[] = {
40     {"help",            no_argument,        nullptr, static_cast<int>(ShortOption::OPT_HELP)},
41     {"primaryImg",      required_argument,  nullptr, static_cast<int>(ShortOption::OPT_PRIMARY_IMG)},
42     {"auxiliaryImg",    required_argument,  nullptr, static_cast<int>(ShortOption::OPT_AUXILIARY_IMG)},
43     {"thumbnailImg",    required_argument,  nullptr, static_cast<int>(ShortOption::OPT_THUMBNAIL_IMG)},
44     {"gainMap",         required_argument,  nullptr, static_cast<int>(ShortOption::OPT_GAIN_MAP)},
45     {"exifData",        required_argument,  nullptr, static_cast<int>(ShortOption::OPT_EXIF_DATA)},
46     {"userData",        required_argument,  nullptr, static_cast<int>(ShortOption::OPT_USER_DATA)},
47     {"iccProfile",      required_argument,  nullptr, static_cast<int>(ShortOption::OPT_ICC_PROFILE)},
48     {"it35",            required_argument,  nullptr, static_cast<int>(ShortOption::OPT_IT35)},
49     {"mirror",          required_argument,  nullptr, static_cast<int>(ShortOption::OPT_MIRROR)},
50     {"rotate",          required_argument,  nullptr, static_cast<int>(ShortOption::OPT_ROTATE)},
51     {"out",             required_argument,  nullptr, static_cast<int>(ShortOption::OPT_OUTPUT)},
52     {nullptr,           no_argument,        nullptr, static_cast<int>(ShortOption::OPT_UNKONWN)},
53 };
54 
ShowUsage()55 void ShowUsage()
56 {
57     std::string rotateValueOpt = "0: ANTI_CLOCKWISE_90, 1: ANTI_CLOCKWISE_180, 2: ANTI_CLOCKWISE_270";
58     std::cout << "Heif Hardware encode Demo Options:" << std::endl;
59     std::cout << " --help               help info." << std::endl;
60     std::cout << " --primaryImg         full path for primary image file." << std::endl;
61     std::cout << " --auxiliaryImg       (optional) full path for auxiliary image file." << std::endl;
62     std::cout << " --thumbnailImg       (optional) full path for thumbnail image file." << std::endl;
63     std::cout << " --gainMap            (optional) full path for gainMap file." << std::endl;
64     std::cout << " --exifData           (optional) full path for exifData file." << std::endl;
65     std::cout << " --userData           (optional) full path for userData file." << std::endl;
66     std::cout << " --iccProfile         (optional) full path for iccProfile file." << std::endl;
67     std::cout << " --it35               (optional) full path for it35 file." << std::endl;
68     std::cout << " --mirror             (optional) image mirror info. 0: HORIZONTAL, 1: VERTICAL" << std::endl;
69     std::cout << " --rotate             (optional) image rotate info. " << rotateValueOpt << std::endl;
70     std::cout << " -o, --out            (optional) full path for output file." << std::endl;
71 }
72 
Parse(int argc,char * argv[])73 CommandOpt Parse(int argc, char *argv[])
74 {
75     CommandOpt opt;
76     int c;
77     while ((c = getopt_long(argc, argv, "o:", g_longOptions, nullptr)) != -1) {
78         switch (static_cast<ShortOption>(c)) {
79             case ShortOption::OPT_HELP:
80                 ShowUsage();
81                 break;
82             case ShortOption::OPT_PRIMARY_IMG:
83                 opt.primaryImgPath = string(optarg);
84                 break;
85             case ShortOption::OPT_AUXILIARY_IMG:
86                 opt.auxiliaryImgPath = string(optarg);
87                 break;
88             case ShortOption::OPT_THUMBNAIL_IMG:
89                 opt.thumbnailImgPath = string(optarg);
90                 break;
91             case ShortOption::OPT_GAIN_MAP:
92                 opt.gainMapPath = string(optarg);
93                 break;
94             case ShortOption::OPT_EXIF_DATA:
95                 opt.exifDataPath = string(optarg);
96                 break;
97             case ShortOption::OPT_USER_DATA:
98                 opt.userDataPath = string(optarg);
99                 break;
100             case ShortOption::OPT_ICC_PROFILE:
101                 opt.iccProfilePath = string(optarg);
102                 break;
103             case ShortOption::OPT_IT35:
104                 opt.it35Path = string(optarg);
105                 break;
106             case ShortOption::OPT_MIRROR:
107                 opt.mirrorInfo = static_cast<ImageMirror>(stol(optarg));
108                 break;
109             case ShortOption::OPT_ROTATE:
110                 opt.rotateInfo = static_cast<ImageRotation>(stol(optarg));
111                 break;
112             case ShortOption::OPT_OUTPUT:
113                 opt.outputPath = string(optarg);
114                 break;
115             default:
116                 break;
117         }
118     }
119     return opt;
120 }
121 
GetMirrorPrintInfo(ImageMirror info)122 static string GetMirrorPrintInfo(ImageMirror info)
123 {
124     if (info == ImageMirror::NONE) {
125         return "ImageMirror::NONE";
126     }
127     if (info == ImageMirror::HORIZONTAL) {
128         return "ImageMirror::HORIZONTAL";
129     }
130     if (info == ImageMirror::VERTICAL) {
131         return "ImageMirror::VERTICAL";
132     }
133     return "unknown mirror info";
134 }
135 
GetRotatePrintInfo(ImageRotation info)136 static string GetRotatePrintInfo(ImageRotation info)
137 {
138     if (info == ImageRotation::NONE) {
139         return "ImageRotation::NONE";
140     }
141     if (info == ImageRotation::ANTI_CLOCKWISE_90) {
142         return "ImageRotation::ANTI_CLOCKWISE_90";
143     }
144     if (info == ImageRotation::ANTI_CLOCKWISE_180) {
145         return "ImageRotation::ANTI_CLOCKWISE_180";
146     }
147     if (info == ImageRotation::ANTI_CLOCKWISE_270) {
148         return "ImageRotation::ANTI_CLOCKWISE_270";
149     }
150     return "unknown rotate info";
151 }
152 
Print() const153 void CommandOpt::Print() const
154 {
155     std::cout << "=========================== OPT INFO ===========================" << endl;
156     std::cout << "   primaryImgPath : " << primaryImgPath << endl;
157     std::cout << " auxiliaryImgPath : " << auxiliaryImgPath << endl;
158     std::cout << " thumbnailImgPath : " << thumbnailImgPath << endl;
159     std::cout << "      gainMapPath : " << gainMapPath << endl;
160     std::cout << "     exifDataPath : " << exifDataPath << endl;
161     std::cout << "     userDataPath : " << userDataPath << endl;
162     std::cout << "   iccProfilePath : " << iccProfilePath << endl;
163     std::cout << "         it35Path : " << it35Path << endl;
164     std::cout << "       mirrorInfo : " << GetMirrorPrintInfo(mirrorInfo) << endl;
165     std::cout << "       rotateInfo : " << GetRotatePrintInfo(rotateInfo) << endl;
166     std::cout << "       outputPath : " << outputPath << endl;
167     std::cout << "=================================================================" << endl;
168 }
169 }
170