diff options
Diffstat (limited to 'media/libjxl/src/tools/args.h')
-rw-r--r-- | media/libjxl/src/tools/args.h | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/media/libjxl/src/tools/args.h b/media/libjxl/src/tools/args.h new file mode 100644 index 0000000000..cc26a35dc7 --- /dev/null +++ b/media/libjxl/src/tools/args.h @@ -0,0 +1,163 @@ +// Copyright (c) the JPEG XL Project Authors. All rights reserved. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef TOOLS_ARGS_H_ +#define TOOLS_ARGS_H_ + +// Helpers for parsing command line arguments. No include guard needed. + +#include <inttypes.h> +#include <stdint.h> +#include <stdio.h> +#include <string.h> + +#include <string> +#include <vector> + +#include "lib/extras/dec/color_hints.h" +#include "lib/jxl/base/override.h" +#include "lib/jxl/base/status.h" +#include "lib/jxl/codec_in_out.h" // DecoderHints +#include "lib/jxl/gaborish.h" +#include "lib/jxl/modular/options.h" + +namespace jpegxl { +namespace tools { + +static inline bool ParseOverride(const char* arg, jxl::Override* out) { + const std::string s_arg(arg); + if (s_arg == "1") { + *out = jxl::Override::kOn; + return true; + } + if (s_arg == "0") { + *out = jxl::Override::kOff; + return true; + } + fprintf(stderr, "Invalid flag, %s must be 0 or 1\n", arg); + return JXL_FAILURE("Args"); +} + +static inline bool ParseUnsigned(const char* arg, size_t* out) { + char* end; + *out = static_cast<size_t>(strtoull(arg, &end, 0)); + if (end[0] != '\0') { + fprintf(stderr, "Unable to interpret as unsigned integer: %s.\n", arg); + return JXL_FAILURE("Args"); + } + return true; +} + +static inline bool ParseUint32(const char* arg, uint32_t* out) { + size_t value = 0; + bool ret = ParseUnsigned(arg, &value); + if (ret) *out = value; + return ret; +} + +static inline bool ParseSigned(const char* arg, int* out) { + char* end; + *out = static_cast<int>(strtol(arg, &end, 0)); + if (end[0] != '\0') { + fprintf(stderr, "Unable to interpret as signed integer: %s.\n", arg); + return JXL_FAILURE("Args"); + } + return true; +} + +static inline bool ParseFloat(const char* arg, float* out) { + char* end; + *out = static_cast<float>(strtod(arg, &end)); + if (end[0] != '\0') { + fprintf(stderr, "Unable to interpret as float: %s.\n", arg); + return JXL_FAILURE("Args"); + } + return true; +} + +static inline bool ParseFloatPair(const char* arg, + std::pair<float, float>* out) { + int parsed = sscanf(arg, "%f,%f", &out->first, &out->second); + if (parsed == 1) { + out->second = out->first; + } else if (parsed != 2) { + fprintf(stderr, + "Unable to interpret as float pair separated by a comma: %s.\n", + arg); + return JXL_FAILURE("Args"); + } + return true; +} + +static inline bool ParseDouble(const char* arg, double* out) { + char* end; + *out = static_cast<double>(strtod(arg, &end)); + if (end[0] != '\0') { + fprintf(stderr, "Unable to interpret as double: %s.\n", arg); + return JXL_FAILURE("Args"); + } + return true; +} + +static inline bool ParseAndAppendKeyValue(const char* arg, + jxl::extras::ColorHints* out) { + const char* eq = strchr(arg, '='); + if (!eq) { + fprintf(stderr, "Expected argument as 'key=value' but received '%s'\n", + arg); + return false; + } + std::string key(arg, eq); + out->Add(key, std::string(eq + 1)); + return true; +} + +static inline bool ParsePredictor(const char* arg, jxl::Predictor* out) { + char* end; + uint64_t p = static_cast<uint64_t>(strtoull(arg, &end, 0)); + if (end[0] != '\0') { + fprintf(stderr, "Invalid predictor: %s.\n", arg); + return JXL_FAILURE("Args"); + } + if (p >= jxl::kNumModularEncoderPredictors) { + fprintf(stderr, + "Invalid predictor value %" PRIu64 ", must be less than %" PRIu64 + ".\n", + p, static_cast<uint64_t>(jxl::kNumModularEncoderPredictors)); + return JXL_FAILURE("Args"); + } + *out = static_cast<jxl::Predictor>(p); + return true; +} + +static inline bool ParseString(const char* arg, std::string* out) { + out->assign(arg); + return true; +} + +static inline bool ParseCString(const char* arg, const char** out) { + *out = arg; + return true; +} + +static inline bool SetBooleanTrue(bool* out) { + *out = true; + return true; +} + +static inline bool SetBooleanFalse(bool* out) { + *out = false; + return true; +} + +static inline bool IncrementUnsigned(size_t* out) { + (*out)++; + return true; +} + +} // namespace tools +} // namespace jpegxl + +#endif // TOOLS_ARGS_H_ |