1*ec63e07aSXin Li // Copyright 2020 Google LLC
2*ec63e07aSXin Li //
3*ec63e07aSXin Li // Licensed under the Apache License, Version 2.0 (the "License");
4*ec63e07aSXin Li // you may not use this file except in compliance with the License.
5*ec63e07aSXin Li // You may obtain a copy of the License at
6*ec63e07aSXin Li //
7*ec63e07aSXin Li // https://www.apache.org/licenses/LICENSE-2.0
8*ec63e07aSXin Li //
9*ec63e07aSXin Li // Unless required by applicable law or agreed to in writing, software
10*ec63e07aSXin Li // distributed under the License is distributed on an "AS IS" BASIS,
11*ec63e07aSXin Li // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*ec63e07aSXin Li // See the License for the specific language governing permissions and
13*ec63e07aSXin Li // limitations under the License.
14*ec63e07aSXin Li
15*ec63e07aSXin Li #include <cstdio>
16*ec63e07aSXin Li #include <iostream>
17*ec63e07aSXin Li
18*ec63e07aSXin Li #include "guetzli_transaction.h" // NOLINT(build/include)
19*ec63e07aSXin Li #include "sandboxed_api/util/fileops.h"
20*ec63e07aSXin Li
21*ec63e07aSXin Li namespace {
22*ec63e07aSXin Li
23*ec63e07aSXin Li constexpr int kDefaultJPEGQuality = 95;
24*ec63e07aSXin Li constexpr int kDefaultMemlimitMB = 6000;
25*ec63e07aSXin Li
Usage()26*ec63e07aSXin Li void Usage() {
27*ec63e07aSXin Li fprintf(stderr,
28*ec63e07aSXin Li "Guetzli JPEG compressor. Usage: \n"
29*ec63e07aSXin Li "guetzli [flags] input_filename output_filename\n"
30*ec63e07aSXin Li "\n"
31*ec63e07aSXin Li "Flags:\n"
32*ec63e07aSXin Li " --verbose - Print a verbose trace of all attempts to standard "
33*ec63e07aSXin Li "output.\n"
34*ec63e07aSXin Li " --quality Q - Visual quality to aim for, expressed as a JPEG "
35*ec63e07aSXin Li "quality value.\n"
36*ec63e07aSXin Li " Default value is %d.\n"
37*ec63e07aSXin Li " --memlimit M - Memory limit in MB. Guetzli will fail if unable to "
38*ec63e07aSXin Li "stay under\n"
39*ec63e07aSXin Li " the limit. Default limit is %d MB.\n"
40*ec63e07aSXin Li " --nomemlimit - Do not limit memory usage.\n",
41*ec63e07aSXin Li kDefaultJPEGQuality, kDefaultMemlimitMB);
42*ec63e07aSXin Li exit(1);
43*ec63e07aSXin Li }
44*ec63e07aSXin Li
45*ec63e07aSXin Li } // namespace
46*ec63e07aSXin Li
main(int argc,char * argv[])47*ec63e07aSXin Li int main(int argc, char* argv[]) {
48*ec63e07aSXin Li int verbose = 0;
49*ec63e07aSXin Li int quality = kDefaultJPEGQuality;
50*ec63e07aSXin Li int memlimit_mb = kDefaultMemlimitMB;
51*ec63e07aSXin Li
52*ec63e07aSXin Li int opt_idx = 1;
53*ec63e07aSXin Li for (; opt_idx < argc; opt_idx++) {
54*ec63e07aSXin Li if (strnlen(argv[opt_idx], 2) < 2 || argv[opt_idx][0] != '-' ||
55*ec63e07aSXin Li argv[opt_idx][1] != '-')
56*ec63e07aSXin Li break;
57*ec63e07aSXin Li
58*ec63e07aSXin Li if (!strcmp(argv[opt_idx], "--verbose")) {
59*ec63e07aSXin Li verbose = 1;
60*ec63e07aSXin Li } else if (!strcmp(argv[opt_idx], "--quality")) {
61*ec63e07aSXin Li opt_idx++;
62*ec63e07aSXin Li if (opt_idx >= argc) Usage();
63*ec63e07aSXin Li quality = atoi(argv[opt_idx]); // NOLINT(runtime/deprecated_fn)
64*ec63e07aSXin Li } else if (!strcmp(argv[opt_idx], "--memlimit")) {
65*ec63e07aSXin Li opt_idx++;
66*ec63e07aSXin Li if (opt_idx >= argc) Usage();
67*ec63e07aSXin Li memlimit_mb = atoi(argv[opt_idx]); // NOLINT(runtime/deprecated_fn)
68*ec63e07aSXin Li } else if (!strcmp(argv[opt_idx], "--nomemlimit")) {
69*ec63e07aSXin Li memlimit_mb = -1;
70*ec63e07aSXin Li } else if (!strcmp(argv[opt_idx], "--")) {
71*ec63e07aSXin Li opt_idx++;
72*ec63e07aSXin Li break;
73*ec63e07aSXin Li } else {
74*ec63e07aSXin Li fprintf(stderr, "Unknown commandline flag: %s\n", argv[opt_idx]);
75*ec63e07aSXin Li Usage();
76*ec63e07aSXin Li }
77*ec63e07aSXin Li }
78*ec63e07aSXin Li
79*ec63e07aSXin Li if (argc - opt_idx != 2) {
80*ec63e07aSXin Li Usage();
81*ec63e07aSXin Li }
82*ec63e07aSXin Li
83*ec63e07aSXin Li guetzli::sandbox::TransactionParams params = {
84*ec63e07aSXin Li argv[opt_idx], argv[opt_idx + 1], verbose, quality, memlimit_mb};
85*ec63e07aSXin Li
86*ec63e07aSXin Li guetzli::sandbox::GuetzliTransaction transaction(std::move(params));
87*ec63e07aSXin Li auto result = transaction.Run();
88*ec63e07aSXin Li
89*ec63e07aSXin Li if (!result.ok()) {
90*ec63e07aSXin Li std::cerr << result.ToString() << std::endl;
91*ec63e07aSXin Li return EXIT_FAILURE;
92*ec63e07aSXin Li }
93*ec63e07aSXin Li
94*ec63e07aSXin Li return EXIT_SUCCESS;
95*ec63e07aSXin Li }
96