Changeset 1301 in SHVCSoftware


Ignore:
Timestamp:
21 Jul 2015, 00:19:48 (9 years ago)
Author:
seregin
Message:

port rev 4339 and rev 4340

Location:
branches/SHM-dev/source
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • branches/SHM-dev/source/App/TAppDecoder/TAppDecCfg.cpp

    r1273 r1301  
    8383  string cfg_TargetDecLayerIdSetFile;
    8484  string outputColourSpaceConvert;
     85  Int warnUnknowParameter = 0;
    8586
    8687  po::Options opts;
     
    107108                                                                                   "YUV writing is skipped if omitted")
    108109#endif
    109 
     110  ("WarnUnknowParameter,w",     warnUnknowParameter,                                  0, "warn for unknown configuration parameters instead of failing")
    110111  ("SkipFrames,s",              m_iSkipFrame,                          0,          "number of frames to skip before random access")
    111112  ("OutputBitDepth,d",          m_outputBitDepth[CHANNEL_TYPE_LUMA],   0,          "bit depth of YUV output luma component (default: use 0 for native depth)")
     
    131132
    132133  po::setDefaults(opts);
    133   const list<const Char*>& argv_unhandled = po::scanArgv(opts, argc, (const Char**) argv);
     134  po::ErrorReporter err;
     135  const list<const Char*>& argv_unhandled = po::scanArgv(opts, argc, (const Char**) argv, err);
    134136
    135137  for (list<const Char*>::const_iterator it = argv_unhandled.begin(); it != argv_unhandled.end(); it++)
     
    142144    po::doHelp(cout, opts);
    143145    return false;
     146  }
     147
     148  if (err.is_errored)
     149  {
     150    if (!warnUnknowParameter)
     151    {
     152      /* errors have already been reported to stderr */
     153      return false;
     154    }
    144155  }
    145156
  • branches/SHM-dev/source/App/TAppEncoder/TAppEncCfg.cpp

    r1298 r1301  
    10241024  SMultiValueInput<Int>  cfg_timeCodeSeiTimeOffsetLength     (0, 31, 0, MAX_TIMECODE_SEI_SETS);
    10251025  SMultiValueInput<Int>  cfg_timeCodeSeiTimeOffsetValue      (std::numeric_limits<Int>::min(), std::numeric_limits<Int>::max(), 0, MAX_TIMECODE_SEI_SETS);
     1026  Int warnUnknowParameter = 0;
    10261027
    10271028#if Q0096_OVERLAY_SEI
     
    10451046  ("help",                                            do_help,                                          false, "this help text")
    10461047  ("c",    po::parseConfigFile, "configuration file name")
     1048  ("WarnUnknowParameter,w",                           warnUnknowParameter,                                  0, "warn for unknown configuration parameters instead of failing")
    10471049
    10481050  // File, I/O and source parameters
     
    16881690
    16891691  po::setDefaults(opts);
    1690   const list<const Char*>& argv_unhandled = po::scanArgv(opts, argc, (const Char**) argv);
     1692  po::ErrorReporter err;
     1693  const list<const Char*>& argv_unhandled = po::scanArgv(opts, argc, (const Char**) argv, err);
    16911694
    16921695#if SVC_EXTENSION
     
    17201723    po::doHelp(cout, opts);
    17211724    return false;
     1725  }
     1726
     1727  if (err.is_errored)
     1728  {
     1729    if (!warnUnknowParameter)
     1730    {
     1731      /* error report has already been printed on stderr */
     1732      return false;
     1733    }
    17221734  }
    17231735
  • branches/SHM-dev/source/Lib/TAppCommon/program_options_lite.cpp

    r1259 r1301  
    5050  namespace program_options_lite
    5151  {
     52    ErrorReporter default_error_reporter;
     53
     54    ostream& ErrorReporter::error(const string& where)
     55    {
     56      is_errored = 1;
     57      cerr << where << " error: ";
     58      return cerr;
     59    }
     60
     61    ostream& ErrorReporter::warn(const string& where)
     62    {
     63      cerr << where << " warning: ";
     64      return cerr;
     65    }
    5266
    5367    Options::~Options()
     
    97111    }
    98112
    99     static void setOptions(Options::NamesPtrList& opt_list, const string& value)
     113    static void setOptions(Options::NamesPtrList& opt_list, const string& value, ErrorReporter& error_reporter)
    100114    {
    101115      /* multiple options may be registered for the same name:
     
    103117      for (Options::NamesPtrList::iterator it = opt_list.begin(); it != opt_list.end(); ++it)
    104118      {
    105         (*it)->opt->parse(value);
     119        (*it)->opt->parse(value, error_reporter);
    106120      }
    107121    }
     
    236250    }
    237251
    238     bool storePair(Options& opts, bool allow_long, bool allow_short, const string& name, const string& value)
     252    struct OptionWriter
     253    {
     254      OptionWriter(Options& rOpts, ErrorReporter& err)
     255      : opts(rOpts), error_reporter(err)
     256      {}
     257      virtual ~OptionWriter() {}
     258
     259      virtual const string where() = 0;
     260
     261      bool storePair(bool allow_long, bool allow_short, const string& name, const string& value);
     262      bool storePair(const string& name, const string& value)
     263      {
     264        return storePair(true, true, name, value);
     265      }
     266
     267      Options& opts;
     268      ErrorReporter& error_reporter;
     269    };
     270
     271    bool OptionWriter::storePair(bool allow_long, bool allow_short, const string& name, const string& value)
    239272    {
    240273      bool found = false;
     
    261294      if (!found)
    262295      {
    263         /* not found */
    264         cerr << "Unknown option: `" << name << "' (value:`" << value << "')" << endl;
     296        error_reporter.error(where())
     297          << "Unknown option `" << name << "' (value:`" << value << "')\n";
    265298        return false;
    266299      }
    267300
    268       setOptions((*opt_it).second, value);
     301      setOptions((*opt_it).second, value, error_reporter);
    269302      return true;
    270303    }
    271304
    272     bool storePair(Options& opts, const string& name, const string& value)
    273     {
    274       return storePair(opts, true, true, name, value);
    275     }
     305    struct ArgvParser : public OptionWriter
     306    {
     307      ArgvParser(Options& rOpts, ErrorReporter& rError_reporter)
     308      : OptionWriter(rOpts, rError_reporter)
     309      {}
     310
     311      const string where() { return "command line"; }
     312
     313      unsigned parseGNU(unsigned argc, const char* argv[]);
     314      unsigned parseSHORT(unsigned argc, const char* argv[]);
     315    };
    276316
    277317    /**
    278318     * returns number of extra arguments consumed
    279319     */
    280     unsigned parseGNU(Options& opts, unsigned argc, const char* argv[])
     320    unsigned ArgvParser::parseGNU(unsigned argc, const char* argv[])
    281321    {
    282322      /* gnu style long options can take the forms:
     
    304344        extra_argc_consumed = 1;
    305345#endif
    306         if(!storePair(opts, true, false, option, "1"))
     346        if(!storePair(true, false, option, "1"))
    307347        {
    308348          return 0;
     
    313353        /* argument occurs after option_sep */
    314354        string val = arg.substr(arg_opt_sep + 1);
    315         storePair(opts, true, false, option, val);
     355        storePair(true, false, option, val);
    316356      }
    317357
     
    319359    }
    320360
    321     unsigned parseSHORT(Options& opts, unsigned argc, const char* argv[])
     361    unsigned ArgvParser::parseSHORT(unsigned argc, const char* argv[])
    322362    {
    323363      /* short options can take the forms:
     
    334374      if (argc == 1)
    335375      {
    336         cerr << "Not processing option without argument `" << option << "'" << endl;
     376        error_reporter.error(where())
     377          << "Not processing option `" << option << "' without argument\n";
    337378        return 0; /* run out of argv for argument */
    338379      }
    339       storePair(opts, false, true, option, string(argv[1]));
     380      storePair(false, true, option, string(argv[1]));
    340381
    341382      return 1;
     
    343384
    344385    list<const char*>
    345     scanArgv(Options& opts, unsigned argc, const char* argv[])
    346     {
     386    scanArgv(Options& opts, unsigned argc, const char* argv[], ErrorReporter& error_reporter)
     387    {
     388      ArgvParser avp(opts, error_reporter);
     389
    347390      /* a list for anything that didn't get handled as an option */
    348391      list<const char*> non_option_arguments;
     
    366409        {
    367410          /* handle short (single dash) options */
    368 #if 0
    369           i += parsePOSIX(opts, argc - i, &argv[i]);
    370 #else
    371           i += parseSHORT(opts, argc - i, &argv[i]);
    372 #endif
     411          i += avp.parseSHORT(argc - i, &argv[i]);
    373412          continue;
    374413        }
     
    385424
    386425        /* handle long (double dash) options */
    387         i += parseGNU(opts, argc - i, &argv[i]);
     426        i += avp.parseGNU(argc - i, &argv[i]);
    388427      }
    389428
     
    391430    }
    392431
    393     void scanLine(Options& opts, string& line)
     432    struct CfgStreamParser : public OptionWriter
     433    {
     434      CfgStreamParser(const string& rName, Options& rOpts, ErrorReporter& rError_reporter)
     435      : OptionWriter(rOpts, rError_reporter)
     436      , name(rName)
     437      , linenum(0)
     438      {}
     439
     440      const string name;
     441      int linenum;
     442      const string where()
     443      {
     444        ostringstream os;
     445        os << name << ":" << linenum;
     446        return os.str();
     447      }
     448
     449      void scanLine(string& line);
     450      void scanStream(istream& in);
     451    };
     452
     453    void CfgStreamParser::scanLine(string& line)
    394454    {
    395455      /* strip any leading whitespace */
     
    414474      {
    415475        /* error: badly formatted line */
     476        error_reporter.warn(where()) << "line formatting error\n";
    416477        return;
    417478      }
     
    419480      {
    420481        /* error: badly formatted line */
     482        error_reporter.warn(where()) << "line formatting error\n";
    421483        return;
    422484      }
     
    427489      {
    428490        /* error: badly formatted line */
     491        error_reporter.warn(where()) << "line formatting error\n";
    429492        return;
    430493      }
     
    457520      {
    458521        /* error: no value */
     522        error_reporter.warn(where()) << "no value found\n";
    459523        return;
    460524      }
    461525
    462526      /* store the value in option */
    463       storePair(opts, true, false, option, value);
    464     }
    465 
    466     void scanFile(Options& opts, istream& in)
     527      storePair(true, false, option, value);
     528    }
     529
     530    void CfgStreamParser::scanStream(istream& in)
    467531    {
    468532      do
    469533      {
     534        linenum++;
    470535        string line;
    471536        getline(in, line);
    472         scanLine(opts, line);
     537        scanLine(line);
    473538      } while(!!in);
    474539    }
     
    484549    }
    485550
    486     void parseConfigFile(Options& opts, const string& filename)
     551    void parseConfigFile(Options& opts, const string& filename, ErrorReporter& error_reporter)
    487552    {
    488553      ifstream cfgstream(filename.c_str(), ifstream::in);
    489554      if (!cfgstream)
    490555      {
    491         cerr << "Failed to open config file: `" << filename << "'" << endl;
    492         exit(EXIT_FAILURE);
    493       }
    494       scanFile(opts, cfgstream);
     556        error_reporter.error(filename) << "Failed to open config file\n";
     557        return;
     558      }
     559      CfgStreamParser csp(filename, opts, error_reporter);
     560      csp.scanStream(cfgstream);
    495561    }
    496562
  • branches/SHM-dev/source/Lib/TAppCommon/program_options_lite.h

    r1259 r1301  
    6464    };
    6565
     66    struct ErrorReporter
     67    {
     68      ErrorReporter() : is_errored(0) {}
     69      virtual ~ErrorReporter() {}
     70      virtual std::ostream& error(const std::string& where);
     71      virtual std::ostream& warn(const std::string& where);
     72      bool is_errored;
     73    };
     74
     75    extern ErrorReporter default_error_reporter;
     76
    6677    void doHelp(std::ostream& out, Options& opts, unsigned columns = 80);
    67     unsigned parseGNU(Options& opts, unsigned argc, const char* argv[]);
    68     unsigned parseSHORT(Options& opts, unsigned argc, const char* argv[]);
    69     std::list<const char*> scanArgv(Options& opts, unsigned argc, const char* argv[]);
    70     void scanLine(Options& opts, std::string& line);
    71     void scanFile(Options& opts, std::istream& in);
     78    std::list<const char*> scanArgv(Options& opts, unsigned argc, const char* argv[], ErrorReporter& error_reporter = default_error_reporter);
    7279    void setDefaults(Options& opts);
    73     void parseConfigFile(Options& opts, const std::string& filename);
    74     bool storePair(Options& opts, const std::string& name, const std::string& value);
     80    void parseConfigFile(Options& opts, const std::string& filename, ErrorReporter& error_reporter = default_error_reporter);
    7581
    7682    /** OptionBase: Virtual base class for storing information relating to a
     
    8692
    8793      /* parse argument arg, to obtain a value for the option */
    88       virtual void parse(const std::string& arg) = 0;
     94      virtual void parse(const std::string& arg, ErrorReporter&) = 0;
    8995      /* set the argument to the default value */
    9096      virtual void setDefault() = 0;
     
    102108      {}
    103109
    104       void parse(const std::string& arg);
     110      void parse(const std::string& arg, ErrorReporter&);
    105111
    106112      void setDefault()
     
    116122    template<typename T>
    117123    inline void
    118     Option<T>::parse(const std::string& arg)
     124    Option<T>::parse(const std::string& arg, ErrorReporter&)
    119125    {
    120126      std::istringstream arg_ss (arg,std::istringstream::in);
     
    134140    template<>
    135141    inline void
    136     Option<std::string>::parse(const std::string& arg)
     142    Option<std::string>::parse(const std::string& arg, ErrorReporter&)
    137143    {
    138144      opt_storage = arg;
     
    142148    struct OptionFunc : public OptionBase
    143149    {
    144       typedef void (Func)(Options&, const std::string&);
     150      typedef void (Func)(Options&, const std::string&, ErrorReporter&);
    145151
    146152      OptionFunc(const std::string& name, Options& parent_, Func *func_, const std::string& desc)
     
    148154      {}
    149155
    150       void parse(const std::string& arg)
    151       {
    152         func(parent, arg);
     156      void parse(const std::string& arg, ErrorReporter& error_reporter)
     157      {
     158        func(parent, arg, error_reporter);
    153159      }
    154160
     
    160166    private:
    161167      Options& parent;
    162       void (*func)(Options&, const std::string&);
     168      Func* func;
    163169    };
    164170
Note: See TracChangeset for help on using the changeset viewer.