source: SHVCSoftware/branches/SHM-dev/source/App/TAppDecoder/TAppDecCfg.cpp @ 930

Last change on this file since 930 was 924, checked in by seregin, 10 years ago

in order to generate the metadata related to conformance bitstreams, patch was provided by Ramasubramonian, Adarsh Krishnan <aramasub@…>

  • Property svn:eol-style set to native
File size: 10.0 KB
Line 
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-2014, 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
34/** \file     TAppDecCfg.cpp
35    \brief    Decoder configuration class
36*/
37
38#include <cstdio>
39#include <cstring>
40#include <string>
41#include "TAppDecCfg.h"
42#include "TAppCommon/program_options_lite.h"
43#if SVC_EXTENSION
44#include <cassert>
45#endif
46
47#ifdef WIN32
48#define strdup _strdup
49#endif
50
51using namespace std;
52namespace po = df::program_options_lite;
53
54//! \ingroup TAppDecoder
55//! \{
56
57// ====================================================================================================================
58// Public member functions
59// ====================================================================================================================
60
61/** \param argc number of arguments
62    \param argv array of arguments
63 */
64Bool TAppDecCfg::parseCfg( Int argc, Char* argv[] )
65{
66  Bool do_help = false;
67  string cfg_BitstreamFile;
68#if SVC_EXTENSION
69  string cfg_ReconFile [MAX_LAYERS];
70  Int nLayerNum;
71#if OUTPUT_LAYER_SET_INDEX
72  Int olsIdx;
73#endif
74#if CONFORMANCE_BITSTREAM_MODE
75  string cfg_confPrefix;
76#endif
77#if AVC_BASE
78  string cfg_BLReconFile;
79#endif
80#else
81  string cfg_ReconFile;
82#endif
83
84  string cfg_TargetDecLayerIdSetFile;
85
86  po::Options opts;
87  opts.addOptions()
88  ("help", do_help, false, "this help text")
89  ("BitstreamFile,b", cfg_BitstreamFile, string(""), "bitstream input file name")
90#if SVC_EXTENSION
91  ("ReconFileL%d,-o%d",   cfg_ReconFile,   string(""), MAX_LAYERS, "Layer %d reconstructed YUV output file name\n"
92                                                     "YUV writing is skipped if omitted")
93#if AVC_BASE
94  ("BLReconFile,-ibl",    cfg_BLReconFile,  string(""), "BL reconstructed YUV input file name")
95#if !REPN_FORMAT_IN_VPS
96  ("BLSourceWidth,-wdt",    m_iBLSourceWidth,        0, "BL source picture width")
97  ("BLSourceHeight,-hgt",   m_iBLSourceHeight,       0, "BL source picture height")
98#endif
99#endif
100#else
101  ("ReconFile,o",     cfg_ReconFile,     string(""), "reconstructed YUV output file name\n"
102                                                     "YUV writing is skipped if omitted")
103#endif
104  ("SkipFrames,s", m_iSkipFrame, 0, "number of frames to skip before random access")
105  ("OutputBitDepth,d", m_outputBitDepthY, 0, "bit depth of YUV output luma component (default: use 0 for native depth)")
106  ("OutputBitDepthC,d", m_outputBitDepthC, 0, "bit depth of YUV output chroma component (default: use 0 for native depth)")
107#if SVC_EXTENSION
108  ("LayerNum,-ls", nLayerNum, 1, "Number of layers to be decoded.")
109#if OUTPUT_LAYER_SET_INDEX
110  ("OutpuLayerSetIdx,-olsidx", olsIdx, -1, "Index of output layer set to be decoded.")
111#endif
112#if CONFORMANCE_BITSTREAM_MODE
113  ("ConformanceBitstremMode,-confMode", m_confModeFlag, false, "Enable generation of conformance bitstream metadata; True: Generate metadata, False: No metadata generated")
114  ("ConformanceMetadataPrefix,-confPrefix", cfg_confPrefix, string(""), "Prefix for the file name of the conformance data. Default name - 'decodedBitstream'")
115#endif
116#endif
117  ("MaxTemporalLayer,t", m_iMaxTemporalLayer, -1, "Maximum Temporal Layer to be decoded. -1 to decode all layers")
118  ("SEIDecodedPictureHash", m_decodedPictureHashSEIEnabled, 1, "Control handling of decoded picture hash SEI messages\n"
119                                              "\t1: check hash in SEI messages if available in the bitstream\n"
120                                              "\t0: ignore SEI message")
121  ("SEIpictureDigest", m_decodedPictureHashSEIEnabled, 1, "deprecated alias for SEIDecodedPictureHash")
122  ("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.")
123  ("RespectDefDispWindow,w", m_respectDefDispWindow, 0, "Only output content inside the default display window\n")
124#if Q0074_COLOUR_REMAPPING_SEI
125  ("SEIColourRemappingInfo", m_colourRemapSEIEnabled, false, "Control handling of Colour Remapping Information SEI messages\n"
126                                              "\t1: apply colour remapping on decoded pictures if available in the bitstream\n"
127                                              "\t0: ignore SEI message")
128#endif
129  ;
130  po::setDefaults(opts);
131  const list<const Char*>& argv_unhandled = po::scanArgv(opts, argc, (const Char**) argv);
132
133  for (list<const Char*>::const_iterator it = argv_unhandled.begin(); it != argv_unhandled.end(); it++)
134  {
135    fprintf(stderr, "Unhandled argument ignored: `%s'\n", *it);
136  }
137
138  if (argc == 1 || do_help)
139  {
140    po::doHelp(cout, opts);
141    return false;
142  }
143
144  /* convert std::string to c string for compatability */
145  m_pchBitstreamFile = cfg_BitstreamFile.empty() ? NULL : strdup(cfg_BitstreamFile.c_str());
146#if SVC_EXTENSION
147  m_tgtLayerId = nLayerNum - 1;
148  assert( m_tgtLayerId >= 0 );
149  assert( m_tgtLayerId < MAX_LAYERS );
150#if O0137_MAX_LAYERID
151  assert( m_tgtLayerId < MAX_NUM_LAYER_IDS );
152#endif
153#if OUTPUT_LAYER_SET_INDEX 
154#if CONFORMANCE_BITSTREAM_MODE
155  if( m_confModeFlag )
156  {
157    assert( olsIdx != -1 ); // In the conformance mode, target output layer set index is to be explicitly specified.
158
159    if( cfg_confPrefix.empty() )
160    {
161      m_confPrefix = string("decodedBitstream");
162    }
163    else
164    {
165      m_confPrefix = cfg_confPrefix;
166    }
167      // Open metadata file and write
168    char fileNameSuffix[255];
169    sprintf(fileNameSuffix, "%s-OLS%d.opl", m_confPrefix.c_str(), olsIdx);  // olsIdx is the target output layer set index.
170    m_metadataFileName = string(fileNameSuffix);
171    m_metadataFileRefresh = true;
172
173    // Decoded layer YUV files
174    for(UInt layer=0; layer<= m_tgtLayerId; layer++)
175    {
176      sprintf(fileNameSuffix, "%s-L%d.yuv", m_confPrefix.c_str(), layer);  // olsIdx is the target output layer set index.
177      m_decodedYuvLayerFileName[layer] = std::string( fileNameSuffix );
178      m_decodedYuvLayerRefresh[layer] = true;
179    }
180  }
181#endif
182  this->getCommonDecoderParams()->setTargetOutputLayerSetIdx( olsIdx       );
183  this->getCommonDecoderParams()->setTargetLayerId    ( m_tgtLayerId );
184#endif
185  for(UInt layer=0; layer<= m_tgtLayerId; layer++)
186  {
187    m_pchReconFile[layer] = cfg_ReconFile[layer].empty() ? NULL : strdup(cfg_ReconFile[layer].c_str());
188  }
189#if AVC_BASE
190  m_pchBLReconFile = cfg_BLReconFile.empty() ? NULL : strdup(cfg_BLReconFile.c_str());
191#endif
192#else
193  m_pchReconFile = cfg_ReconFile.empty() ? NULL : strdup(cfg_ReconFile.c_str());
194#endif
195
196  if (!m_pchBitstreamFile)
197  {
198    fprintf(stderr, "No input file specifed, aborting\n");
199    return false;
200  }
201
202  if ( !cfg_TargetDecLayerIdSetFile.empty() )
203  {
204    FILE* targetDecLayerIdSetFile = fopen ( cfg_TargetDecLayerIdSetFile.c_str(), "r" );
205    if ( targetDecLayerIdSetFile )
206    {
207      Bool isLayerIdZeroIncluded = false;
208      while ( !feof(targetDecLayerIdSetFile) )
209      {
210        Int layerIdParsed = 0;
211        if ( fscanf( targetDecLayerIdSetFile, "%d ", &layerIdParsed ) != 1 )
212        {
213          if ( m_targetDecLayerIdSet.size() == 0 )
214          {
215            fprintf(stderr, "No LayerId could be parsed in file %s. Decoding all LayerIds as default.\n", cfg_TargetDecLayerIdSetFile.c_str() );
216          }
217          break;
218        }
219        if ( layerIdParsed  == -1 ) // The file includes a -1, which means all LayerIds are to be decoded.
220        {
221          m_targetDecLayerIdSet.clear(); // Empty set means decoding all layers.
222          break;
223        }
224        if ( layerIdParsed < 0 || layerIdParsed >= MAX_NUM_LAYER_IDS )
225        {
226          fprintf(stderr, "Warning! Parsed LayerId %d is not withing allowed range [0,%d]. Ignoring this value.\n", layerIdParsed, MAX_NUM_LAYER_IDS-1 );
227        }
228        else
229        {
230          isLayerIdZeroIncluded = layerIdParsed == 0 ? true : isLayerIdZeroIncluded;
231          m_targetDecLayerIdSet.push_back ( layerIdParsed );
232        }
233      }
234      fclose (targetDecLayerIdSetFile);
235      if ( m_targetDecLayerIdSet.size() > 0 && !isLayerIdZeroIncluded )
236      {
237        fprintf(stderr, "TargetDecLayerIdSet must contain LayerId=0, aborting" );
238        return false;
239      }
240    }
241    else
242    {
243      fprintf(stderr, "File %s could not be opened. Using all LayerIds as default.\n", cfg_TargetDecLayerIdSetFile.c_str() );
244    }
245#if OUTPUT_LAYER_SET_INDEX 
246    this->getCommonDecoderParams()->setTargetDecLayerIdSet( &m_targetDecLayerIdSet );
247#endif
248  }
249
250  return true;
251}
252
253//! \}
Note: See TracBrowser for help on using the repository browser.