source: SHVCSoftware/branches/SHM-dev/source/Lib/TLibCommon/Debug.cpp @ 1499

Last change on this file since 1499 was 1442, checked in by seregin, 9 years ago

port rev 4590

File size: 17.0 KB
RevLine 
[919]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 *
[1259]6 * Copyright (c) 2010-2015, ITU/ISO/IEC
[919]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     Debug.cpp
35    \brief    Defines types and objects for environment-variable-based debugging and feature control
36*/
37
38#include "Debug.h"
39#include <algorithm>
40#include <math.h>
41#include "TComDataCU.h"
42#include "TComPic.h"
43#include "TComYuv.h"
44
45static const UInt settingNameWidth  = 66;
46static const UInt settingHelpWidth  = 84;
47static const UInt settingValueWidth = 3;
48
[1335]49#if DEBUG_STRING
[919]50// these strings are used to reorder the debug output so that the encoder and decoder match.
[1442]51const TChar *debug_reorder_data_inter_token[MAX_NUM_COMPONENT+1]
[919]52 = {"Start of channel 0 inter debug\n", "Start of channel 1 inter debug\n", "Start of channel 2 inter debug\n", "End of inter residual debug\n"} ;
[1442]53const TChar *partSizeToString[NUMBER_OF_PART_SIZES]={"2Nx2N(0)", "2NxN(1)", "Nx2N(2)", "NxN(3)", "2Nx(N/2+3N/2)(4)", "2Nx(3N/2+N/2)(5)", "(N/2+3N/2)x2N(6)", "(3N/2+N/2)x2N(7)"};
[919]54#endif
55
56// --------------------------------------------------------------------------------------------------------------------- //
57
58//EnvVar definition
59
60std::list<std::pair<std::string, std::string> > &EnvVar::getEnvVarList()
61{
62  static std::list<std::pair<std::string, std::string> > varInfoList;
63  return varInfoList;
64}
65
66std::list<EnvVar*> &EnvVar::getEnvVarInUse()
67{
68  static std::list<EnvVar*> varInUseList;
69  return varInUseList;
70}
71
72static inline Void printPair(const std::pair<std::string, std::string> &p)
73{
74  if (p.second=="")
75  {
76    std::cout << "\n" << std::setw(settingNameWidth) << p.first << "\n" << std::endl;
77  }
78  else
79  {
80    std::cout << std::setw(settingNameWidth) << p.first << ":   " << p.second << "\n" << std::endl;
81  }
82}
83
84static inline Void printVal(const EnvVar* env)
85{
86  std::cout << std::setw(settingNameWidth) << env->getName() << " = " << std::setw(settingValueWidth) << env->getInt() << " (string = " << std::setw(15) << env->getString() << ")" << std::endl;
87}
88
89//static inline Bool sameEnvName( const std::pair<std::string, std::string> &a,
90//                                const std::pair<std::string, std::string> &b )
91//{
92//  // only check env name
93//  return (a.first==b.first);
94//}
95
96Void EnvVar::printEnvVar()
97{
98//  getEnvVarList().unique(sameEnvName);
99  if (getEnvVarList().size()!=0)
100  {
101    std::cout << "--- Environment variables:\n" << std::endl;
102    for_each(getEnvVarList().begin(), getEnvVarList().end(), printPair);
103  }
104  std::cout << std::endl;
105}
106
107Void EnvVar::printEnvVarInUse()
108{
109  if (getEnvVarInUse().size()!=0)
110  {
111    std::cout << "RExt Environment variables set as follows: \n" << std::endl;
112    for_each(getEnvVarInUse().begin(), getEnvVarInUse().end(), printVal);
113  }
114  std::cout << std::endl;
115}
116
117EnvVar::EnvVar(const std::string &sName, const std::string &sDefault, const std::string &sHelp) :
118                                                                m_sName(sName),
119                                                                m_sHelp(sHelp),
120                                                                m_sVal(),
121                                                                m_dVal(0),
122                                                                m_iVal(0),
123                                                                m_bSet(false)
124{
125  if (getenv(m_sName.c_str()))
126  {
127    m_sVal = getenv(m_sName.c_str());
128    m_bSet = true;
129    getEnvVarInUse().push_back(this);
130  }
[1246]131  else
132  {
133    m_sVal = sDefault;
134  }
[919]135
136  m_dVal = strtod(m_sVal.c_str(), 0);
137  m_iVal = Int(m_dVal);
138
139  getEnvVarList().push_back( std::pair<std::string, std::string>(m_sName, indentNewLines(lineWrap(splitOnSettings(m_sHelp), settingHelpWidth), (settingNameWidth + 4))) );
140}
141
142
143// --------------------------------------------------------------------------------------------------------------------- //
144
145// Debug environment variables:
146
147EnvVar Debug("-- Debugging","","");
148
149EnvVar DebugOptionList::DebugSBAC             ("DEBUG_SBAC",        "0", "Output debug data from SBAC entropy coder (coefficient data etc.)"                              );
150EnvVar DebugOptionList::DebugRQT              ("DEBUG_RQT",         "0", "Output RQT debug data from entropy coder"                                                       );
151EnvVar DebugOptionList::DebugPred             ("DEBUG_PRED",        "0", "Output prediction debug"                                                                        );
152EnvVar DebugOptionList::ForceLumaMode         ("FORCE_LUMA_MODE",   "0", "Force a particular intra direction for Luma (0-34)"                                             );
153EnvVar DebugOptionList::ForceChromaMode       ("FORCE_CHROMA_MODE", "0", "Force a particular intra direction for chroma (0-5)"                                            );
154
[1335]155#if DEBUG_STRING
[919]156EnvVar DebugOptionList::DebugString_Structure ("DEBUG_STRUCTURE",   "0", "Produce output on chosen structure                        bit0=intra, bit1=inter");
157EnvVar DebugOptionList::DebugString_Pred      ("DEBUG_PRED",        "0", "Produce output on prediction data.                        bit0=intra, bit1=inter");
158EnvVar DebugOptionList::DebugString_Resi      ("DEBUG_RESI",        "0", "Produce output on residual data.                          bit0=intra, bit1=inter");
159EnvVar DebugOptionList::DebugString_Reco      ("DEBUG_RECO",        "0", "Produce output on reconstructed data.                     bit0=intra, bit1=inter");
160EnvVar DebugOptionList::DebugString_InvTran   ("DEBUG_INV_QT",      "0", "Produce output on inverse-quantiser and transform stages. bit0=intra, bit1=inter");
161#endif
162
163// --------------------------------------------------------------------------------------------------------------------- //
164
165//macro value printing function
166
167Void printMacroSettings()
168{
169  std::cout << "Non-environment-variable-controlled macros set as follows: \n" << std::endl;
170
171  //------------------------------------------------
172
173  //setting macros
174
175  PRINT_CONSTANT(RExt__DECODER_DEBUG_BIT_STATISTICS,                                settingNameWidth, settingValueWidth);
176  PRINT_CONSTANT(RExt__HIGH_BIT_DEPTH_SUPPORT,                                      settingNameWidth, settingValueWidth);
177  PRINT_CONSTANT(RExt__HIGH_PRECISION_FORWARD_TRANSFORM,                            settingNameWidth, settingValueWidth);
178
179  PRINT_CONSTANT(O0043_BEST_EFFORT_DECODING,                                        settingNameWidth, settingValueWidth);
180
[1387]181  PRINT_CONSTANT(ME_ENABLE_ROUNDING_OF_MVS,                                         settingNameWidth, settingValueWidth);
[1398]182  PRINT_CONSTANT(U0040_MODIFIED_WEIGHTEDPREDICTION_WITH_BIPRED_AND_CLIPPING,        settingNameWidth, settingValueWidth);
[1387]183
[919]184  //------------------------------------------------
185
186  std::cout << std::endl;
187}
188
189
190// --------------------------------------------------------------------------------------------------------------------- //
191
192//Debugging
193
194UInt  g_debugCounter  = 0;
195
[1335]196#if DEBUG_ENCODER_SEARCH_BINS
[919]197const UInt debugEncoderSearchBinTargetLine = 0;
198const UInt debugEncoderSearchBinWindow     = 1000000;
199#endif
200
[1335]201#if DEBUG_CABAC_BINS
[919]202const UInt debugCabacBinTargetLine = 0;
203const UInt debugCabacBinWindow     = 1000000;
204#endif
205
206Void printSBACCoeffData(  const UInt          lastX,
207                          const UInt          lastY,
208                          const UInt          width,
209                          const UInt          height,
210                          const UInt          chan,
211                          const UInt          absPart,
212                          const UInt          scanIdx,
213                          const TCoeff *const pCoeff,
214                          const Bool          finalEncode
215                        )
216{
217  if (DebugOptionList::DebugSBAC.getInt()!=0 && finalEncode)
218  {
[1246]219    std::cout << "Size: " << width << "x" << height << ", Last X/Y: (" << lastX << ", " << lastY << "), absPartIdx: " << absPart << ", scanIdx: " << scanIdx << ", chan: " << chan << "\n";
[919]220    for (Int i=0; i<width*height; i++)
221    {
222      std::cout << std::setw(3) << pCoeff[i];// + dcVal;
[1246]223      if (i%width == width-1)
224      {
225        std::cout << "\n";
226      }
227      else
228      {
229        std::cout << ",";
230      }
[919]231    }
232    std::cout << std::endl;
233  }
234}
235
236Void printCbfArray( TComDataCU* pcCU  )
237{
238  const UInt CUSizeInParts = pcCU->getWidth(0)/4;
239  const UInt numValidComp=pcCU->getPic()->getNumberValidComponents();
240  for (UInt ch=0; ch<numValidComp; ch++)
241  {
242    const ComponentID compID=ComponentID(ch);
243    printf("channel: %d\n", ch);
244    for (Int y=0; y<CUSizeInParts; y++)
245    {
246      for (Int x=0; x<CUSizeInParts; x++)
247      {
248        printf(x+1==CUSizeInParts?"%3d\n":"%3d, ", pcCU->getCbf(compID)[g_auiRasterToZscan[y*CUSizeInParts + x]]);
249      }
250    }
251  }
252}
253
254UInt getDecimalWidth(const Double value)
255{
256  return (value == 0) ? 1 : (UInt(floor(log10(fabs(value)))) + ((value < 0) ? 2 : 1));
257                                                               //for the minus sign
258}
259
260UInt getZScanIndex(const UInt x, const UInt y)
261{
262  UInt remainingX = x;
263  UInt remainingY = y;
264  UInt offset     = 0;
265  UInt result     = 0;
266
267  while ((remainingX != 0) || (remainingY != 0))
268  {
269    result |= ((remainingX & 0x1) << offset) | ((remainingY & 0x1) << (offset + 1));
270
271    remainingX >>= 1;
272    remainingY >>= 1;
273    offset      += 2;
274  }
275
276  return result;
277}
278
279
280// --------------------------------------------------------------------------------------------------------------------- //
281
282//String manipulation functions for aligning and wrapping printed text
283
284
285std::string splitOnSettings(const std::string &input)
286{
287  std::string result = input;
288
289  std::string::size_type searchFromPosition = 0;
290
291  while (searchFromPosition < result.length())
292  {
293    //find the " = " that is used to define each setting
294    std::string::size_type equalsPosition = result.find(" = ", searchFromPosition);
295
[1246]296    if (equalsPosition == std::string::npos)
297    {
298      break;
299    }
[919]300
301    //then find the end of the numeric characters
302    std::string::size_type splitPosition = result.find_last_of("1234567890", equalsPosition);
303
304    //then find the last space before the first numeric character...
[1246]305    if (splitPosition != std::string::npos)
306    {
307      splitPosition = result.find_last_of(' ', splitPosition);
308    }
[919]309
310    //...and replace it with a new line
[1246]311    if (splitPosition != std::string::npos)
312    {
313      result.replace(splitPosition, 1, 1, '\n');
314    }
[919]315
316    //start the next search from the end of the " = " string
317    searchFromPosition = (equalsPosition + 3);
318  }
319
320  return result;
321}
322
323
324std::string lineWrap(const std::string &input, const UInt maximumLineLength)
325{
[1246]326  if (maximumLineLength == 0)
327  {
328    return input;
329  }
[919]330  std::string result = input;
331
332  std::string::size_type lineStartPosition = result.find_first_not_of(' '); //don't wrap any leading spaces in the string
333
334  while (lineStartPosition != std::string::npos)
335  {
336    //------------------------------------------------
337
338    const std::string::size_type searchFromPosition = lineStartPosition + maximumLineLength;
339
[1246]340    if (searchFromPosition >= result.length())
341    {
342      break;
343    }
[919]344
345    //------------------------------------------------
346
347    //first check to see if there is another new line character before the maximum line length
348    //we can't use find for this unfortunately because it doesn't take both a beginning and an end for its search range
349    std::string::size_type nextLineStartPosition = std::string::npos;
350    for (std::string::size_type currentPosition = lineStartPosition; currentPosition <= searchFromPosition; currentPosition++)
351    {
[1246]352      if (result[currentPosition] == '\n')
353      {
354        nextLineStartPosition = currentPosition + 1;
355        break;
356      }
[919]357    }
358
359    //------------------------------------------------
360
361    //if there ia another new line character before the maximum line length, we need to start this loop again from that position
[1246]362    if (nextLineStartPosition != std::string::npos)
363    {
364      lineStartPosition = nextLineStartPosition;
365    }
[919]366    else
367    {
368      std::string::size_type spacePosition = std::string::npos;
369
370      //search backwards for the last space character (must use signed Int because lineStartPosition can be 0)
371      for (Int currentPosition = Int(searchFromPosition); currentPosition >= Int(lineStartPosition); currentPosition--)
372      {
[1246]373        if (result[currentPosition] == ' ')
374        {
375          spacePosition = currentPosition;
376          break;
377        }
[919]378      }
379
380      //if we didn't find a space searching backwards, we must hyphenate
381      if (spacePosition == std::string::npos)
382      {
383        result.insert(searchFromPosition, "-\n");
384        lineStartPosition = searchFromPosition + 2; //make sure the next search ignores the hyphen
385      }
386      else //if we found a space to split on, replace it with a new line character
387      {
388        result.replace(spacePosition, 1, 1, '\n');
389        lineStartPosition = spacePosition + 1;
390      }
391    }
392
393    //------------------------------------------------
394  }
395
396  return result;
397}
398
399
400std::string indentNewLines(const std::string &input, const UInt indentBy)
401{
402  std::string result = input;
403
404  const std::string indentString(indentBy, ' ');
405  std::string::size_type offset = 0;
406
407  while ((offset = result.find('\n', offset)) != std::string::npos)
408  {
[1246]409    if ((++offset) >= result.length())
410    {
411      break; //increment offset so we don't find the same \n again and do no indentation at the end
412    }
[919]413    result.insert(offset, indentString);
414  }
415
416  return result;
417}
418
419
420// --------------------------------------------------------------------------------------------------------------------- //
421
422
[1442]423Void printBlockToStream( std::ostream &ss, const TChar *pLinePrefix, TComYuv &src, const UInt numSubBlocksAcross, const UInt numSubBlocksUp, const UInt defWidth )
[919]424{
425  const UInt numValidComp=src.getNumberValidComponents();
426
427  for (UInt ch=0; ch<numValidComp ; ch++)
428  {
429    const ComponentID compID = ComponentID(ch);
430    const UInt width  = src.getWidth(compID);
431    const UInt height = src.getHeight(compID);
432    const UInt stride = src.getStride(compID);
433    const Pel* blkSrc = src.getAddr(compID);
434    const UInt subBlockWidth=width/numSubBlocksAcross;
435    const UInt subBlockHeight=height/numSubBlocksUp;
436
437    ss << pLinePrefix << " compID: " << compID << "\n";
438    for (UInt y=0; y<height; y++)
439    {
440      if ((y%subBlockHeight)==0 && y!=0)
[1246]441      {
[919]442        ss << pLinePrefix << '\n';
[1246]443      }
[919]444
445      ss << pLinePrefix;
446      for (UInt x=0; x<width; x++)
447      {
448        if ((x%subBlockWidth)==0 && x!=0)
[1246]449        {
[919]450          ss << std::setw(defWidth+2) << "";
[1246]451        }
[919]452
453        ss << std::setw(defWidth) << blkSrc[y*stride + x] << ' ';
454      }
455      ss << '\n';
456    }
457    ss << pLinePrefix << " --- \n";
458  }
459}
460
[1335]461#if DEBUG_STRING
[919]462Int DebugStringGetPredModeMask(PredMode mode)
463{
464  return (mode==MODE_INTRA)?1:2;
465}
466
467Void DebugInterPredResiReco(std::string &sDebug, TComYuv &pred, TComYuv &resi, TComYuv &reco, Int predmode_mask)
468{
469  if (DebugOptionList::DebugString_Pred.getInt()&predmode_mask)
470  {
471    std::stringstream ss(std::stringstream::out);
472    printBlockToStream(ss, "###inter-pred: ", pred);
473    std::string debugTmp;
474    debugTmp=ss.str();
475    sDebug=debugTmp+sDebug;
476  }
477  if (DebugOptionList::DebugString_Resi.getInt()&predmode_mask)
478  {
479    std::stringstream ss(std::stringstream::out);
480    printBlockToStream(ss, "###inter-resi: ", resi);
481    sDebug+=ss.str();
482  }
483  if (DebugOptionList::DebugString_Reco.getInt()&predmode_mask)
484  {
485    std::stringstream ss(std::stringstream::out);
486    printBlockToStream(ss, "###inter-reco: ", reco);
487    sDebug+=ss.str();
488  }
489}
490#endif
Note: See TracBrowser for help on using the repository browser.