HEVC Test Model (HM)  HM-16.3
TAppDecCfg.cpp
Go to the documentation of this file.
1 /* The copyright in this software is being made available under the BSD
2  * License, included below. This software may be subject to other third party
3  * and contributor rights, including patent rights, and no such rights are
4  * granted under this license.
5  *
6  * Copyright (c) 2010-2015, ITU/ISO/IEC
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions are met:
11  *
12  * * Redistributions of source code must retain the above copyright notice,
13  * this list of conditions and the following disclaimer.
14  * * Redistributions in binary form must reproduce the above copyright notice,
15  * this list of conditions and the following disclaimer in the documentation
16  * and/or other materials provided with the distribution.
17  * * Neither the name of the ITU/ISO/IEC nor the names of its contributors may
18  * be used to endorse or promote products derived from this software without
19  * specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
25  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
31  * THE POSSIBILITY OF SUCH DAMAGE.
32  */
33 
38 #include <cstdio>
39 #include <cstring>
40 #include <string>
41 #include "TAppDecCfg.h"
44 #ifdef WIN32
45 #define strdup _strdup
46 #endif
47 
48 using namespace std;
49 namespace po = df::program_options_lite;
50 
53 
54 // ====================================================================================================================
55 // Public member functions
56 // ====================================================================================================================
57 
62 {
63  Bool do_help = false;
64  string cfg_BitstreamFile;
65  string cfg_ReconFile;
66  string cfg_TargetDecLayerIdSetFile;
67  string outputColourSpaceConvert;
68 
69  po::Options opts;
70  opts.addOptions()
71 
72 
73  ("help", do_help, false, "this help text")
74  ("BitstreamFile,b", cfg_BitstreamFile, string(""), "bitstream input file name")
75  ("ReconFile,o", cfg_ReconFile, string(""), "reconstructed YUV output file name\n"
76  "YUV writing is skipped if omitted")
77  ("SkipFrames,s", m_iSkipFrame, 0, "number of frames to skip before random access")
78  ("OutputBitDepth,d", m_outputBitDepth[CHANNEL_TYPE_LUMA], 0, "bit depth of YUV output luma component (default: use 0 for native depth)")
79  ("OutputBitDepthC,d", m_outputBitDepth[CHANNEL_TYPE_CHROMA], 0, "bit depth of YUV output chroma component (default: use 0 for native depth)")
80  ("OutputColourSpaceConvert", outputColourSpaceConvert, string(""), "Colour space conversion to apply to input 444 video. Permitted values are (empty string=UNCHANGED) " + getListOfColourSpaceConverts(false))
81  ("MaxTemporalLayer,t", m_iMaxTemporalLayer, -1, "Maximum Temporal Layer to be decoded. -1 to decode all layers")
82  ("SEIDecodedPictureHash", m_decodedPictureHashSEIEnabled, 1, "Control handling of decoded picture hash SEI messages\n"
83  "\t1: check hash in SEI messages if available in the bitstream\n"
84  "\t0: ignore SEI message")
85  ("SEIpictureDigest", m_decodedPictureHashSEIEnabled, 1, "deprecated alias for SEIDecodedPictureHash")
86  ("SEINoDisplay", m_decodedNoDisplaySEIEnabled, true, "Control handling of decoded no display SEI messages")
87  ("TarDecLayerIdSetFile,l", cfg_TargetDecLayerIdSetFile, string(""), "targetDecLayerIdSet file name. The file should include white space separated LayerId values to be decoded. Omitting the option or a value of -1 in the file decodes all layers.")
88  ("RespectDefDispWindow,w", m_respectDefDispWindow, 0, "Only output content inside the default display window\n")
89 #if O0043_BEST_EFFORT_DECODING
90  ("ForceDecodeBitDepth", m_forceDecodeBitDepth, 0U, "Force the decoder to operate at a particular bit-depth (best effort decoding)")
91 #endif
92  ("OutputDecodedSEIMessagesFilename", m_outputDecodedSEIMessagesFilename, string(""), "When non empty, output decoded SEI messages to the indicated file. If file is '-', then output to stdout\n")
93  ;
94 
95  po::setDefaults(opts);
96  const list<const Char*>& argv_unhandled = po::scanArgv(opts, argc, (const Char**) argv);
97 
98  for (list<const Char*>::const_iterator it = argv_unhandled.begin(); it != argv_unhandled.end(); it++)
99  {
100  fprintf(stderr, "Unhandled argument ignored: `%s'\n", *it);
101  }
102 
103  if (argc == 1 || do_help)
104  {
105  po::doHelp(cout, opts);
106  return false;
107  }
108 
109  m_outputColourSpaceConvert = stringToInputColourSpaceConvert(outputColourSpaceConvert, false);
110  if (m_outputColourSpaceConvert>=NUMBER_INPUT_COLOUR_SPACE_CONVERSIONS)
111  {
112  fprintf(stderr, "Bad output colour space conversion string\n");
113  return false;
114  }
115 
116  /* convert std::string to c string for compatability */
117  m_pchBitstreamFile = cfg_BitstreamFile.empty() ? NULL : strdup(cfg_BitstreamFile.c_str());
118  m_pchReconFile = cfg_ReconFile.empty() ? NULL : strdup(cfg_ReconFile.c_str());
119 
120  if (!m_pchBitstreamFile)
121  {
122  fprintf(stderr, "No input file specified, aborting\n");
123  return false;
124  }
125 
126  if ( !cfg_TargetDecLayerIdSetFile.empty() )
127  {
128  FILE* targetDecLayerIdSetFile = fopen ( cfg_TargetDecLayerIdSetFile.c_str(), "r" );
129  if ( targetDecLayerIdSetFile )
130  {
131  Bool isLayerIdZeroIncluded = false;
132  while ( !feof(targetDecLayerIdSetFile) )
133  {
134  Int layerIdParsed = 0;
135  if ( fscanf( targetDecLayerIdSetFile, "%d ", &layerIdParsed ) != 1 )
136  {
137  if ( m_targetDecLayerIdSet.size() == 0 )
138  {
139  fprintf(stderr, "No LayerId could be parsed in file %s. Decoding all LayerIds as default.\n", cfg_TargetDecLayerIdSetFile.c_str() );
140  }
141  break;
142  }
143  if ( layerIdParsed == -1 ) // The file includes a -1, which means all LayerIds are to be decoded.
144  {
145  m_targetDecLayerIdSet.clear(); // Empty set means decoding all layers.
146  break;
147  }
148  if ( layerIdParsed < 0 || layerIdParsed >= MAX_NUM_LAYER_IDS )
149  {
150  fprintf(stderr, "Warning! Parsed LayerId %d is not within allowed range [0,%d]. Ignoring this value.\n", layerIdParsed, MAX_NUM_LAYER_IDS-1 );
151  }
152  else
153  {
154  isLayerIdZeroIncluded = layerIdParsed == 0 ? true : isLayerIdZeroIncluded;
155  m_targetDecLayerIdSet.push_back ( layerIdParsed );
156  }
157  }
158  fclose (targetDecLayerIdSetFile);
159  if ( m_targetDecLayerIdSet.size() > 0 && !isLayerIdZeroIncluded )
160  {
161  fprintf(stderr, "TargetDecLayerIdSet must contain LayerId=0, aborting" );
162  return false;
163  }
164  }
165  else
166  {
167  fprintf(stderr, "File %s could not be opened. Using all LayerIds as default.\n", cfg_TargetDecLayerIdSetFile.c_str() );
168  }
169  }
170 
171  return true;
172 }
173 
#define MAX_NUM_LAYER_IDS
Definition: TypeDef.h:107
void doHelp(ostream &out, Options &opts, unsigned columns)
#define NULL
Definition: CommonDef.h:100
char Char
Definition: TypeDef.h:291
STL namespace.
InputColourSpaceConversion stringToInputColourSpaceConvert(const std::string &value, const Bool bIsForward)
bool Bool
Definition: TypeDef.h:286
list< const char * > scanArgv(Options &opts, unsigned argc, const char *argv[])
Decoder configuration class (header)
std::string getListOfColourSpaceConverts(const Bool bIsForward)
int Int
Definition: TypeDef.h:296
Bool parseCfg(Int argc, Char *argv[])
initialize option class from configuration
Definition: TAppDecCfg.cpp:61