libbpg/jctvc/TLibCommon/Debug.h
2015-01-16 13:46:18 +01:00

266 lines
9.9 KiB
C++

/* The copyright in this software is being made available under the BSD
* License, included below. This software may be subject to other third party
* and contributor rights, including patent rights, and no such rights are
* granted under this license.
*
* Copyright (c) 2010-2014, ITU/ISO/IEC
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* * Neither the name of the ITU/ISO/IEC nor the names of its contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
/** \file Debug.h
\brief Defines types and objects for environment-variable-based debugging and feature control
*/
#ifndef __DEBUG__
#define __DEBUG__
#include <iostream>
#include <iomanip>
#include <string>
#include <list>
#include <stdlib.h>
#include <sstream>
#include <TLibCommon/CommonDef.h>
#ifdef DEBUG_STRING
extern const Char *debug_reorder_data_inter_token[MAX_NUM_COMPONENT+1];
extern const Char *partSizeToString[NUMBER_OF_PART_SIZES];
#endif
// ---------------------------------------------------------------------------------------------- //
//constant print-out macro
#define PRINT_CONSTANT(NAME, NAME_WIDTH, VALUE_WIDTH) std::cout << std::setw(NAME_WIDTH) << #NAME << " = " << std::setw(VALUE_WIDTH) << NAME << std::endl;
// ---------------------------------------------------------------------------------------------- //
// ---- Environment variables for test/debug ---- //
class EnvVar
{
private:
std::string m_sName;
std::string m_sHelp;
std::string m_sVal;
Double m_dVal;
Int m_iVal;
Bool m_bSet;
public:
static std::list< std::pair<std::string, std::string> > &getEnvVarList();
static std::list<EnvVar*> &getEnvVarInUse();
static Void printEnvVar();
static Void printEnvVarInUse();
EnvVar(const std::string &sName, const std::string &sDefault, const std::string &sHelp);
Double getDouble() const { return m_dVal; }
Int getInt() const { return m_iVal; }
const std::string &getString() const { return m_sVal; }
Bool isSet() const { return m_bSet; }
Bool isTrue() const { return m_iVal!=0; }
const std::string &getName() const { return m_sName; }
};
// ---------------------------------------------------------------------------------------------- //
// ---- Control switches for debugging and feature control ---- //
namespace DebugOptionList
{
extern EnvVar DebugSBAC;
extern EnvVar DebugRQT;
extern EnvVar DebugPred;
extern EnvVar ForceLumaMode;
extern EnvVar ForceChromaMode;
#ifdef DEBUG_STRING
extern EnvVar DebugString_Structure;
extern EnvVar DebugString_Pred;
extern EnvVar DebugString_Resi;
extern EnvVar DebugString_Reco;
extern EnvVar DebugString_InvTran;
#endif
}
// ---------------------------------------------------------------------------------------------- //
Void printMacroSettings();
// ---------------------------------------------------------------------------------------------- //
//Debugging
extern Bool g_bFinalEncode;
extern UInt g_debugCounter;
extern Bool g_printDebug;
extern Void* g_debugAddr;
#ifdef DEBUG_ENCODER_SEARCH_BINS
extern const UInt debugEncoderSearchBinTargetLine;
extern const UInt debugEncoderSearchBinWindow;
#endif
#ifdef DEBUG_CABAC_BINS
extern const UInt debugCabacBinTargetLine;
extern const UInt debugCabacBinWindow;
#endif
Void printSBACCoeffData( const UInt lastX,
const UInt lastY,
const UInt width,
const UInt height,
const UInt chan,
const UInt absPart,
const UInt scanIdx,
const TCoeff *const pCoeff,
const Bool finalEncode=true
);
Void printCbfArray( class TComDataCU* pcCU );
UInt getDecimalWidth(const Double value);
UInt getZScanIndex(const UInt x, const UInt y);
//template specialisation for Char types to get it to render as a number
template <typename ValueType> inline Void writeValueToStream (const ValueType &value, std::ostream &stream, const UInt outputWidth) { stream << std::setw(outputWidth) << value; }
template <> inline Void writeValueToStream<Char >(const Char &value, std::ostream &stream, const UInt outputWidth) { stream << std::setw(outputWidth) << Int(value); }
template <> inline Void writeValueToStream<UChar>(const UChar &value, std::ostream &stream, const UInt outputWidth) { stream << std::setw(outputWidth) << UInt(value); }
template <typename ValueType>
Void printBlock(const ValueType *const source,
const UInt width,
const UInt height,
const UInt stride,
const UInt outputValueWidth = 0, //if set to 0, the maximum output width will be calculated and used
const Bool onlyPrintEdges = false, //print only the top row and left column for printing prediction reference samples
const Bool printInZScan = false, //output values in Z-scan format (useful for values addressed by AbsPartIdxes)
const Int shiftLeftBy = 0, //set a negative value to right-shift instead
const Bool printAverage = false, //also print the average of the values in the block
std::ostream & stream = std::cout)
{
//find the maximum output width
UInt outputWidth = outputValueWidth;
if (outputWidth == 0)
{
ValueType minimumValue = leftShift(source[0], shiftLeftBy);
ValueType maximumValue = minimumValue;
for (UInt y = 0; y < height; y++)
for (UInt x = 0; x < width; x++)
{
ValueType value = 0;
if (!onlyPrintEdges || (x == 0) || (y == 0))
{
value = leftShift(source[printInZScan ? getZScanIndex(x, y) : ((y * stride) + x)], shiftLeftBy);
}
if (value < minimumValue) minimumValue = value;
else if (value > maximumValue) maximumValue = value;
}
outputWidth = std::max<UInt>(getDecimalWidth(Double(minimumValue)), getDecimalWidth(Double(maximumValue))) + 1; //+1 so the numbers don't run into each other
}
//------------------
//print out the block
ValueType valueSum = 0;
for (UInt y = 0; y < height; y++)
{
for (UInt x = 0; x < width; x++)
{
ValueType value = 0;
if (!onlyPrintEdges || (x == 0) || (y == 0))
{
value = leftShift(source[printInZScan ? getZScanIndex(x, y) : ((y * stride) + x)], shiftLeftBy);
valueSum += value;
}
writeValueToStream(value, stream, outputWidth);
}
stream << "\n";
}
const Int valueCount = onlyPrintEdges ? Int((width + height) - 1) : Int(width * height);
if (printAverage) stream << "Average: " << (valueSum / valueCount) << "\n";
stream << "\n";
}
template <typename T>
Void printBlockToStream( std::ostream &ss, const Char *pLinePrefix, const T * blkSrc, const UInt width, const UInt height, const UInt stride, const UInt subBlockWidth=0, const UInt subBlockHeight=0, const UInt defWidth=3 )
{
for (UInt y=0; y<height; y++)
{
if (subBlockHeight!=0 && (y%subBlockHeight)==0 && y!=0)
ss << pLinePrefix << '\n';
ss << pLinePrefix;
for (UInt x=0; x<width; x++)
{
if (subBlockWidth!=0 && (x%subBlockWidth)==0 && x!=0)
ss << std::setw(defWidth+2) << "";
ss << std::setw(defWidth) << blkSrc[y*stride + x] << ' ';
}
ss << '\n';
}
}
class TComYuv;
Void printBlockToStream( std::ostream &ss, const Char *pLinePrefix, TComYuv &src, const UInt numSubBlocksAcross=1, const UInt numSubBlocksUp=1, const UInt defWidth=3 );
// ---------------------------------------------------------------------------------------------- //
//String manipulation functions for aligning and wrapping printed text
std::string splitOnSettings(const std::string &input);
std::string lineWrap(const std::string &input, const UInt maximumLineLength);
std::string indentNewLines(const std::string &input, const UInt indentBy);
// ---------------------------------------------------------------------------------------------- //
#ifdef DEBUG_STRING
Int DebugStringGetPredModeMask(PredMode mode);
Void DebugInterPredResiReco(std::string &sDebug, TComYuv &pred, TComYuv &resi, TComYuv &reco, Int predmode_mask);
#endif
#endif /* __DEBUG__ */