Mercurial > x265
changeset 565:daaa528275ef draft
Merged multicoreware/xhevc into default
author | Deepthi Devaki Akkoorath <deepthidevaki@multicorewareinc.com> |
---|---|
date | Wed, 17 Apr 2013 14:11:17 +0530 |
parents | b09927fb726e (current diff) a9bb1e6dc80a (diff) |
children | 4112119f8505 |
files | build/RegressionTester.bat source/Lib/config.cpp source/Lib/config.h source/encoder/macroblock.cpp |
diffstat | 38 files changed, 4143 insertions(+-), 3227 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/build/BuildEncoderApplications.bat Wed Apr 17 14:11:17 2013 +0530 @@ -0,0 +1,60 @@ +@echo off + +cd "%builddir%" +mkdir enabled +cd enabled +set solution="x265.sln" + +echo SET(ENABLE_TESTS ON CACHE BOOL "Enable Unit Tests" FORCE ^) >> enablecache.txt +echo SET(HIGH_BIT_DEPTH ON CACHE BOOL "Use 16bit pixels internally" FORCE ^) >> enablecache.txt +echo SET(ENABLE_PRIMITIVES ON CACHE BOOL "Enable use of optimized encoder primitives" FORCE ^) >> enablecache.txt + +cmake -G %makefile% -C enablecache.txt ..\..\..\source + +if exist %solution% ( + call %vcvars% + MSBuild /property:Configuration="Release" x265.sln >> BuildLog.txt + + if %errorlevel% equ 1 ( + echo Build with primitive enabled unsuccessfull for %makefile% refer the build log >> "%LOG%" + exit 1 + ) + echo Build with primitives enabled successfull for %makefile% >> "%LOG%" + + if exist Release\x265-cli.exe ( + echo build Application with primitive enable successfull for %makefile% >> "%LOG%" + ) else ( + echo build Application with primitive enable unsuccessfull for %makefile% refer the Build log >> "%LOG%" + ) +) else ( + echo Primitive Enable solution is not created for %makefile% >> "%LOG%" +) + +cd "%builddir%" +mkdir disable +cd disable + +echo SET(ENABLE_TESTS ON CACHE BOOL "Enable Unit Tests" FORCE^) >> disablecache.txt +echo SET(ENABLE_PRIMITIVES OFF CACHE BOOL "Enable use of optimized encoder primitives" FORCE^) >> disablecache.txt +echo SET(ENABLE_PRIMITIVES_VEC OFF CACHE BOOL "Enable use of optimized encoder primitives" FORCE^) >> disablecache.txt + +cmake -G %makefile% -C disablecache.txt ..\..\..\source + +if exist %solution% ( + call %vcvars% + MSBuild /property:Configuration="Release" x265.sln >> BuildLog.txt + + if %errorlevel% equ 1 ( + echo Build with primitive disable unsuccessfull for %makefile% refer the build log >> "%LOG%" + exit 1 + ) + echo Build with primitives disable successfull for %makefile% >> "%LOG%" + + if exist Release\x265-cli.exe ( + echo build Application with primitive disable successfull for %makefile% >> "%LOG%" + ) else ( + echo build Application with primitive disable unsuccessfull for %makefile% refer the Build log >> "%LOG%" + ) +) else ( + echo Primitive Disable solution is not created for %makefile% >> "%LOG%" +)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/build/CreateRegressionPackage.bat Wed Apr 17 14:11:17 2013 +0530 @@ -0,0 +1,83 @@ +@echo off + +for /f "tokens=1,2,3 delims==" %%a in (config.txt) do ( +if %%a==workingdir set workingdir=%%b +if %%a==testdir set testdir=%%b +if %%a==repository set repository=%%b +) + +set HG=hg +set currentworkingdir="%workingdir%"RegressionTest +set Buildbat="BuildEncoderApplications.bat" + +if exist "%currentworkingdir%" rd /s /q %currentworkingdir% + +mkdir "%currentworkingdir%" +cd "%currentworkingdir%" + +set LOG="%currentworkingdir%"\RegressionTester.log + +if %errorlevel% equ 1 (echo Working directory not created >> "%LOG%" + exit 1 +) +echo Working directory created >> "%LOG%" + +"%HG%" init +"%HG%" pull "%repository%" +"%HG%" update + +if %errorlevel% equ 1 (echo Pull unsuccessfull >> "%LOG%" +exit 1 +) +echo Pull successfull >> "%LOG%" + +set builddir="" +set makefile="" +set vcvars="" + +::Build the solution and applications for VS 11 + +if not "%VS110COMNTOOLS%" == "" ( + + echo Regression Test - VS 11 Compiler found >> "%LOG%" + set builddir="%currentworkingdir%"\build\vc11-x86_64 + set makefile="Visual Studio 11 Win64" + set vcvars="%VS110COMNTOOLS%\..\..\VC\vcvarsall.bat" + call "%workingdir%BuildEncoderApplications.bat" + + set builddir="%currentworkingdir%"\build\vc11-x86 + set makefile="Visual Studio 11" + call "%workingdir%BuildEncoderApplications.bat" +) + +::Build the solution and applications for VS 10 + +if not "%VS100COMNTOOLS%" == "" ( + echo Regression Test - VS 10 Compiler found >> "%LOG%" + set builddir="%currentworkingdir%"\build\vc10-x86_64 + set makefile="Visual Studio 10 Win64" + set vcvars="%VS100COMNTOOLS%\..\..\VC\vcvarsall.bat" + call "%workingdir%BuildEncoderApplications.bat" + + set builddir="%currentworkingdir%"\build\vc10-x86 + set makefile="Visual Studio 10" + call "%workingdir%BuildEncoderApplications.bat" +) + +::Build the solution and applications foe VS 09 + +if not "%%VS90COMNTOOLS%" == "" ( + echo Regression Test - VS 09 Compiler found >> "%LOG%" + set builddir="%currentworkingdir%"\build\vc9-x86_64 + set makefile="Visual Studio 9 2008" + set vcvars="%%VS90COMNTOOLS%%\..\..\VC\vcvarsall.bat" + call "%workingdir%BuildEncoderApplications.bat" + + set builddir="%currentworkingdir%"\build\vc9-x86 + set makefile="Visual Studio 10" + call "%workingdir%BuildEncoderApplications.bat" +) + + +:: To do list +:: Running the test bench and Encoder Application for all the build version
--- a/build/RegressionTester.bat Wed Apr 17 14:09:10 2013 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,99 +0,0 @@ -@echo off - -for /f "tokens=1,2,3,4,5 delims==" %%a in (config.txt) do ( -if %%a==workingdir set workingdir=%%b -if %%a==testdir set testdir=%%b -if %%a==repository set repository=%%b -if %%a==password set password=%%b -if %%a==logpath set logpath=%%b -) - -set HG=hg -set LOG="%logpath%" - -echo %workingdir% -echo %testdir% -echo %repository% -echo %password% - -if exist "%workingdir%" rd /s /q %workingdir% - -mkdir "%workingdir%" -cd "%workingdir%" - -if %errorlevel% equ 1 (echo Working directory not created >> "%LOG%" -exit 1 -) -echo Working directory created >> "%LOG%" - -"%HG%" init -"%HG%" pull "%repository%" -"%HG%" update - -if %errorlevel% equ 1 (echo Pull unsuccessfull >> "%LOG%" -exit 1 -) -echo Pull successfull >> "%LOG%" - - -if not "%VS110COMNTOOLS%" == "" ( -cd build\vc11-x86_64 - -mkdir Enabled -cd Enabled - -if not exist x265.sln ( - -echo SET(ENABLE_TESTS ON CACHE BOOL "Enable Unit Tests" FORCE ^) >> enablecache.txt -echo SET(HIGH_BIT_DEPTH ON CACHE BOOL "Use 16bit pixels internally" FORCE ^) >> enablecache.txt -echo SET(ENABLE_PRIMITIVES_VEC ON CACHE BOOL "Enable use of optimized encoder primitives" FORCE ^) >> enablecache.txt - -cmake -G "Visual Studio 11 Win64" -C enablecache.txt ..\..\..\source - -if exist x265.sln ( - call "%VS110COMNTOOLS%\..\..\VC\vcvarsall.bat" - MSBuild /property:Configuration="Release" x265.sln >> BuildLog.txt - - -if %errorlevel% equ 1 (echo Build for primitives enabled unsuccessfull >> "%LOG%" -exit 1 -) -echo Build for primitives enabled successfull >> "%LOG%" - -if exist Release\x265-cli.exe ( - echo Encoder client build successfully >> "%LOG%" -) else ( echo Encoder client not build successfully >> "%LOG%" ) -) -) - -cd ../ -mkdir Disabled -cd Disabled -if not exist x265.sln ( - -echo SET(ENABLE_TESTS ON CACHE BOOL "Enable Unit Tests" FORCE^) >> disablecache.txt -echo SET(HIGH_BIT_DEPTH OFF CACHE BOOL "Use 16bit pixels internally" FORCE^) >> disablecache.txt -echo SET(ENABLE_PRIMITIVES_VEC OFF CACHE BOOL "Enable use of optimized encoder primitives" FORCE^) >> disablecache.txt - -cmake -G "Visual Studio 11 Win64" -C disablecache.txt ..\..\..\source -) - -if exist x265.sln ( - call "%VS110COMNTOOLS%\..\..\VC\vcvarsall.bat" - MSBuild /property:Configuration="Release" x265.sln >> BuilLog.txt - -if %errorlevel% equ 1 (echo Build for primitives disabled unsuccessfull >> "%LOG%" -exit 1 -) -echo Build for primitives disabled successfull >> "%LOG%" - -if exist Release\x265-cli.exe ( - echo Encoder client build successfully >> "%LOG%" - del \q BuildLog.txt - ) else ( - echo Encoder client not build successfully >> "%LOG%" ) -) -) -cd -pause -
--- a/build/config.txt Wed Apr 17 14:09:10 2013 +0530 +++ b/build/config.txt Wed Apr 17 14:11:17 2013 +0530 @@ -1,6 +1,4 @@ -workingdir=RegressionTesting +workingdir=E:\\ testdir=TestEncoder repository=https://ggopu@bitbucket.org/multicoreware/xhevc -password= -configfile=initialcache.txt -logpath=E:\\hevc_log.txt \ No newline at end of file +
--- a/source/CMakeLists.txt Wed Apr 17 14:09:10 2013 +0530 +++ b/source/CMakeLists.txt Wed Apr 17 14:11:17 2013 +0530 @@ -51,13 +51,12 @@ if(ENABLE_PRIMITIVES) endif(ENABLE_PRIMITIVES_VEC) find_package(Yasm) - # http://www.cmake.org/Bug/print_bug_page.php?bug_id=8170 - if(YASM_FOUND AND GCC) + if(YASM_FOUND) option(ENABLE_PRIMITIVES_ASM "Enable use of assembly coded primitives" ON) if(ENABLE_PRIMITIVES_ASM) add_definitions(-DENABLE_ASM_PRIMITIVES=1) endif(ENABLE_PRIMITIVES_ASM) - endif(YASM_FOUND AND GCC) + endif(YASM_FOUND) endif(ENABLE_PRIMITIVES) option(ENABLE_PPA "Enable PPA profiling instrumentation" OFF) @@ -85,9 +84,10 @@ if(ENABLE_CLI) endif(GCC) set_source_files_properties(x265main.cpp PROPERTIES COMPILE_FLAGS -DX265_VERSION=${X265_VERSION}) - add_executable(x265-cli x265main.cpp ${EXTRAS}) + add_subdirectory(input) + add_executable(x265-cli x265main.cpp x265cfg.cpp x265cfg.h ${EXTRAS}) - target_link_libraries(x265-cli HM x265) + target_link_libraries(x265-cli HM x265 InputFiles) if(ENABLE_PPA) target_link_libraries(x265-cli PPA) if(UNIX)
--- a/source/Lib/CMakeLists.txt Wed Apr 17 14:09:10 2013 +0530 +++ b/source/Lib/CMakeLists.txt Wed Apr 17 14:11:17 2013 +0530 @@ -26,5 +26,4 @@ source_group(TLibCommon FILES ${LIBCOMM source_group(TLibEncoder FILES ${LIBENCODER}) add_library(HM ${LIBCOMMON} ${LIBENCODER} ${APPCOMMON} ${LIBVIDEOIO} ${MD5} - encoder.cpp encoder.h - config.cpp config.h) + encoder.cpp encoder.h)
--- a/source/Lib/TLibCommon/TComTrQuant.cpp Wed Apr 17 14:09:10 2013 +0530 +++ b/source/Lib/TLibCommon/TComTrQuant.cpp Wed Apr 17 14:11:17 2013 +0530 @@ -863,8 +863,13 @@ void xTrMxN(Int bitDepth, Short *block, } else if (iWidth == 16 && iHeight == 16) { +#ifdef ENABLE_PRIMITIVES + x265::primitives.partial_butterfly[x265::BUTTERFLY_16](block, tmp, shift_1st, iHeight); + x265::primitives.partial_butterfly[x265::BUTTERFLY_16](tmp, coeff, shift_2nd, iWidth); +#else partialButterfly16(block, tmp, shift_1st, iHeight); partialButterfly16(tmp, coeff, shift_2nd, iWidth); +#endif } else if (iWidth == 32 && iHeight == 32) {
--- a/source/Lib/TLibVideoIO/TVideoIOY4m.cpp Wed Apr 17 14:09:10 2013 +0530 +++ b/source/Lib/TLibVideoIO/TVideoIOY4m.cpp Wed Apr 17 14:11:17 2013 +0530 @@ -195,15 +195,15 @@ Void TVideoIOY4m::open(Char* pchF else { y4m_handler = (y4m_hnd_t*)handler; - y4m_handler->bitDepthShiftY = internalBitDepthY - fileBitDepthY; - y4m_handler->bitDepthShiftC = internalBitDepthC - fileBitDepthC; - y4m_handler->fileBitDepthY = fileBitDepthY; - y4m_handler->fileBitDepthC = fileBitDepthC; - y4m_handler->aiPad[0] = aiPad[0]; - y4m_handler->aiPad[1] = aiPad[1]; y4m_handler->m_cHandle.seekg(y4m_handler->headerLength); } + y4m_handler->bitDepthShiftY = internalBitDepthY - fileBitDepthY; + y4m_handler->bitDepthShiftC = internalBitDepthC - fileBitDepthC; + y4m_handler->fileBitDepthY = fileBitDepthY; + y4m_handler->fileBitDepthC = fileBitDepthC; + y4m_handler->aiPad[0] = aiPad[0]; + y4m_handler->aiPad[1] = aiPad[1]; handler = (hnd_t*)y4m_handler; }
--- a/source/Lib/config.cpp Wed Apr 17 14:09:10 2013 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1937 +0,0 @@ -/* 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-2013, 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 TAppEncCfg.cpp - \brief Handle encoder configuration parameters -*/ - -#include <stdlib.h> -#include <cassert> -#include <cstring> -#include <string> -#include <math.h> -#include "TLibCommon/TComRom.h" -#include "config.h" - -static istream &operator >>(istream &, Level::Name &); -static istream &operator >>(istream &, Level::Tier &); -static istream &operator >>(istream &, Profile::Name &); - -#include "TAppCommon/program_options_lite.h" -#include "TLibEncoder/TEncRateCtrl.h" - -#ifdef WIN32 -#define strdup _strdup -#endif - -using namespace std; -namespace po = df::program_options_lite; - -//! \ingroup TAppEncoder -//! \{ - -// ==================================================================================================================== -// Constructor / destructor / initialization / destroy -// ==================================================================================================================== - -TAppEncCfg::TAppEncCfg() - : m_pchInputFile() - , m_pchBitstreamFile() - , m_pchReconFile() - , m_pchdQPFile() - , m_pColumnWidth() - , m_pRowHeight() - , m_scalingListFile() -{ - m_aidQP = NULL; -#if J0149_TONE_MAPPING_SEI - m_startOfCodedInterval = NULL; - m_codedPivotValue = NULL; - m_targetPivotValue = NULL; -#endif -} - -TAppEncCfg::~TAppEncCfg() -{ - if (m_aidQP) - { - delete[] m_aidQP; - } - -#if J0149_TONE_MAPPING_SEI - if (m_startOfCodedInterval) - { - delete[] m_startOfCodedInterval; - m_startOfCodedInterval = NULL; - } - - if (m_codedPivotValue) - { - delete[] m_codedPivotValue; - m_codedPivotValue = NULL; - } - - if (m_targetPivotValue) - { - delete[] m_targetPivotValue; - m_targetPivotValue = NULL; - } - -#endif // if J0149_TONE_MAPPING_SEI - free(m_pchInputFile); - free(m_pchBitstreamFile); - free(m_pchReconFile); - free(m_pchdQPFile); - free(m_pColumnWidth); - free(m_pRowHeight); - free(m_scalingListFile); -} - -Void TAppEncCfg::create() -{} - -Void TAppEncCfg::destroy() -{} - -std::istringstream &operator >>(std::istringstream &in, GOPEntry &entry) //input -{ - in >> entry.m_sliceType; - in >> entry.m_POC; - in >> entry.m_QPOffset; - in >> entry.m_QPFactor; - in >> entry.m_tcOffsetDiv2; - in >> entry.m_betaOffsetDiv2; - in >> entry.m_temporalId; - in >> entry.m_numRefPicsActive; - in >> entry.m_numRefPics; - for (Int i = 0; i < entry.m_numRefPics; i++) - { - in >> entry.m_referencePics[i]; - } - - in >> entry.m_interRPSPrediction; -#if AUTO_INTER_RPS - if (entry.m_interRPSPrediction == 1) - { - in >> entry.m_deltaRPS; - in >> entry.m_numRefIdc; - for (Int i = 0; i < entry.m_numRefIdc; i++) - { - in >> entry.m_refIdc[i]; - } - } - else if (entry.m_interRPSPrediction == 2) - { - in >> entry.m_deltaRPS; - } - -#else // if AUTO_INTER_RPS - if (entry.m_interRPSPrediction) - { - in >> entry.m_deltaRPS; - in >> entry.m_numRefIdc; - for (Int i = 0; i < entry.m_numRefIdc; i++) - { - in >> entry.m_refIdc[i]; - } - } - -#endif // if AUTO_INTER_RPS - return in; -} - -static const struct MapStrToProfile -{ - const Char *str; - Profile::Name value; -} strToProfile[] = -{ - { "none", Profile::NONE }, - { "main", Profile::MAIN }, - { "main10", Profile::MAIN10 }, - { "main-still-picture", Profile::MAINSTILLPICTURE }, -}; - -static const struct MapStrToTier -{ - const Char *str; - Level::Tier value; -} strToTier[] = -{ - { "main", Level::MAIN }, - { "high", Level::HIGH }, -}; - -static const struct MapStrToLevel -{ - const Char *str; - Level::Name value; -} strToLevel[] = -{ - { "none", Level::NONE }, - { "1", Level::LEVEL1 }, - { "2", Level::LEVEL2 }, - { "2.1", Level::LEVEL2_1 }, - { "3", Level::LEVEL3 }, - { "3.1", Level::LEVEL3_1 }, - { "4", Level::LEVEL4 }, - { "4.1", Level::LEVEL4_1 }, - { "5", Level::LEVEL5 }, - { "5.1", Level::LEVEL5_1 }, - { "5.2", Level::LEVEL5_2 }, - { "6", Level::LEVEL6 }, - { "6.1", Level::LEVEL6_1 }, - { "6.2", Level::LEVEL6_2 }, -}; - -template<typename T, typename P> -static istream &readStrToEnum(P map[], unsigned long mapLen, istream &in, T &val) -{ - string str; - - in >> str; - - for (Int i = 0; i < mapLen; i++) - { - if (str == map[i].str) - { - val = map[i].value; - goto found; - } - } - - /* not found */ - in.setstate(ios::failbit); -found: - return in; -} - -static istream &operator >>(istream &in, Profile::Name &profile) -{ - return readStrToEnum(strToProfile, sizeof(strToProfile) / sizeof(*strToProfile), in, profile); -} - -static istream &operator >>(istream &in, Level::Tier &tier) -{ - return readStrToEnum(strToTier, sizeof(strToTier) / sizeof(*strToTier), in, tier); -} - -static istream &operator >>(istream &in, Level::Name &level) -{ - return readStrToEnum(strToLevel, sizeof(strToLevel) / sizeof(*strToLevel), in, level); -} - -#if SIGNAL_BITRATE_PICRATE_IN_VPS -Void readBoolString(const string inpString, const Int numEntries, Bool* &memberArray, const char *elementName); -Void readIntString(const string inpString, const Int numEntries, Int* &memberArray, const char *elementName); -#endif -// ==================================================================================================================== -// Public member functions -// ==================================================================================================================== - -/** \param argc number of arguments - \param argv array of arguments - \retval true when success - */ -Bool TAppEncCfg::parseCfg(Int argc, Char *argv[]) - -{ - Bool do_help = false; - - string cfg_InputFile; - string cfg_BitstreamFile; - string cfg_ReconFile; - string cfg_dQPFile; - string cfg_ColumnWidth; - string cfg_RowHeight; - string cfg_ScalingListFile; - -#if J0149_TONE_MAPPING_SEI - string cfg_startOfCodedInterval; - string cfg_codedPivotValue; - string cfg_targetPivotValue; -#endif -#if SIGNAL_BITRATE_PICRATE_IN_VPS - string cfg_bitRateInfoPresentFlag; - string cfg_picRateInfoPresentFlag; - string cfg_avgBitRate; - string cfg_maxBitRate; - string cfg_avgPicRate; - string cfg_constantPicRateIdc; -#endif - po::Options opts; - opts.addOptions() - ("help", do_help, false, "this help text") - ("c", po::parseConfigFile, "configuration file name") - - // File, I/O and source parameters - ("InputFile,i", cfg_InputFile, string(""), "Original YUV input file name") - ("BitstreamFile,b", cfg_BitstreamFile, string(""), "Bitstream output file name") - ("ReconFile,o", cfg_ReconFile, string(""), "Reconstructed YUV output file name") - ("SourceWidth,-wdt", m_iSourceWidth, 0, "Source picture width") - ("SourceHeight,-hgt", m_iSourceHeight, 0, "Source picture height") - ("InputBitDepth", m_inputBitDepthY, 8, "Bit-depth of input file") - ("OutputBitDepth", m_outputBitDepthY, 0, "Bit-depth of output file (default:InternalBitDepth)") - ("InternalBitDepth", m_internalBitDepthY, 0, "Bit-depth the codec operates at. (default:InputBitDepth)" - "If different to InputBitDepth, source data will be converted") - ("InputBitDepthC", m_inputBitDepthC, 0, - "As per InputBitDepth but for chroma component. (default:InputBitDepth)") - ("OutputBitDepthC", m_outputBitDepthC, 0, - "As per OutputBitDepth but for chroma component. (default:InternalBitDepthC)") - ("InternalBitDepthC", m_internalBitDepthC, 0, - "As per InternalBitDepth but for chroma component. (default:IntrenalBitDepth)") - ("ConformanceMode", m_conformanceMode, 0, - "Window conformance mode (0: no window, 1:automatic padding, 2:padding, 3:conformance") - ("HorizontalPadding,-pdx", m_aiPad[0], 0, "Horizontal source padding for conformance window mode 2") - ("VerticalPadding,-pdy", m_aiPad[1], 0, "Vertical source padding for conformance window mode 2") - ("ConfLeft", m_confLeft, 0, "Left offset for window conformance mode 3") - ("ConfRight", m_confRight, 0, "Right offset for window conformance mode 3") - ("ConfTop", m_confTop, 0, "Top offset for window conformance mode 3") - ("ConfBottom", m_confBottom, 0, "Bottom offset for window conformance mode 3") - ("FrameRate,-fr", m_iFrameRate, 0, "Frame rate") - ("FrameSkip,-fs", m_FrameSkip, 0u, "Number of frames to skip at start of input YUV") - ("FramesToBeEncoded,f", m_framesToBeEncoded, 0, "Number of frames to be encoded (default=all)") - - // Profile and level - ("Profile", m_profile, Profile::NONE, "Profile to be used when encoding (Incomplete)") - ("Level", m_level, Level::NONE, "Level limit to be used, eg 5.1 (Incomplete)") - ("Tier", m_levelTier, Level::MAIN, "Tier to use for interpretation of --Level") - -#if L0046_CONSTRAINT_FLAGS - ("ProgressiveSource", m_progressiveSourceFlag, false, "Indicate that source is progressive") - ("InterlacedSource", m_interlacedSourceFlag, false, "Indicate that source is interlaced") - ("NonPackedSource", m_nonPackedConstraintFlag, false, "Indicate that source does not contain frame packing") - ("FrameOnly", m_frameOnlyConstraintFlag, false, "Indicate that the bitstream contains only frames") -#endif - - // Unit definition parameters - ("MaxCUWidth", m_uiMaxCUWidth, 64u) - ("MaxCUHeight", m_uiMaxCUHeight, 64u) - // todo: remove defaults from MaxCUSize - ("MaxCUSize,s", m_uiMaxCUWidth, 64u, "Maximum CU size") - ("MaxCUSize,s", m_uiMaxCUHeight, 64u, "Maximum CU size") - ("MaxPartitionDepth,h", m_uiMaxCUDepth, 4u, "CU depth") - - ("QuadtreeTULog2MaxSize", m_uiQuadtreeTULog2MaxSize, 6u, "Maximum TU size in logarithm base 2") - ("QuadtreeTULog2MinSize", m_uiQuadtreeTULog2MinSize, 2u, "Minimum TU size in logarithm base 2") - - ("QuadtreeTUMaxDepthIntra", m_uiQuadtreeTUMaxDepthIntra, 1u, "Depth of TU tree for intra CUs") - ("QuadtreeTUMaxDepthInter", m_uiQuadtreeTUMaxDepthInter, 2u, "Depth of TU tree for inter CUs") - - // Coding structure paramters - ("IntraPeriod,-ip", m_iIntraPeriod, -1, "Intra period in frames, (-1: only first frame)") - ("DecodingRefreshType,-dr", m_iDecodingRefreshType, 0, "Intra refresh type (0:none 1:CRA 2:IDR)") - ("GOPSize,g", m_iGOPSize, 1, "GOP size of temporal structure") - ("ListCombination,-lc", m_bUseLComb, true, - "Combined reference list for uni-prediction estimation in B-slices") - // motion options - ("FastSearch", m_iFastSearch, 1, "0:Full search 1:Diamond 2:PMVFAST") - ("SearchRange,-sr", m_iSearchRange, 96, "Motion search range") - ("BipredSearchRange", m_bipredSearchRange, 4, "Motion search range for bipred refinement") - ("HadamardME", m_bUseHADME, true, "Hadamard ME for fractional-pel") - ("ASR", m_bUseASR, false, "Adaptive motion search range") - - // Mode decision parameters - ("LambdaModifier0,-LM0", m_adLambdaModifier[0], (Double)1.0, "Lambda modifier for temporal layer 0") - ("LambdaModifier1,-LM1", m_adLambdaModifier[1], (Double)1.0, "Lambda modifier for temporal layer 1") - ("LambdaModifier2,-LM2", m_adLambdaModifier[2], (Double)1.0, "Lambda modifier for temporal layer 2") - ("LambdaModifier3,-LM3", m_adLambdaModifier[3], (Double)1.0, "Lambda modifier for temporal layer 3") - ("LambdaModifier4,-LM4", m_adLambdaModifier[4], (Double)1.0, "Lambda modifier for temporal layer 4") - ("LambdaModifier5,-LM5", m_adLambdaModifier[5], (Double)1.0, "Lambda modifier for temporal layer 5") - ("LambdaModifier6,-LM6", m_adLambdaModifier[6], (Double)1.0, "Lambda modifier for temporal layer 6") - ("LambdaModifier7,-LM7", m_adLambdaModifier[7], (Double)1.0, "Lambda modifier for temporal layer 7") - - /* Quantization parameters */ - ("QP,q", m_fQP, 30.0, "Qp value, if value is float, QP is switched once during encoding") - ("DeltaQpRD,-dqr", m_uiDeltaQpRD, 0u, "max dQp offset for slice") - ("MaxDeltaQP,d", m_iMaxDeltaQP, 0, "max dQp offset for block") - ("MaxCuDQPDepth,-dqd", m_iMaxCuDQPDepth, 0, "max depth for a minimum CuDQP") - - ("CbQpOffset,-cbqpofs", m_cbQpOffset, 0, "Chroma Cb QP Offset") - ("CrQpOffset,-crqpofs", m_crQpOffset, 0, "Chroma Cr QP Offset") - -#if ADAPTIVE_QP_SELECTION - ("AdaptiveQpSelection,-aqps", m_bUseAdaptQpSelect, false, "AdaptiveQpSelection") -#endif - - ("AdaptiveQP,-aq", m_bUseAdaptiveQP, false, "QP adaptation based on a psycho-visual model") - ("MaxQPAdaptationRange,-aqr", m_iQPAdaptationRange, 6, "QP adaptation range") - ("dQPFile,m", cfg_dQPFile, string(""), "dQP file name") - ("RDOQ", m_useRDOQ, true) - ("RDOQTS", m_useRDOQTS, true) -#if L0232_RD_PENALTY - ("RDpenalty", m_rdPenalty, 0, - "RD-penalty for 32x32 TU for intra in non-intra slices. 0:disbaled 1:RD-penalty 2:maximum RD-penalty") -#endif - // Entropy coding parameters - ("SBACRD", m_bUseSBACRD, true, "SBAC based RD estimation") - - // Deblocking filter parameters - ("LoopFilterDisable", m_bLoopFilterDisable, false) - ("LoopFilterOffsetInPPS", m_loopFilterOffsetInPPS, false) - ("LoopFilterBetaOffset_div2", m_loopFilterBetaOffsetDiv2, 0) - ("LoopFilterTcOffset_div2", m_loopFilterTcOffsetDiv2, 0) - ("DeblockingFilterControlPresent", m_DeblockingFilterControlPresent, false) -#if L0386_DB_METRIC - ("DeblockingFilterMetric", m_DeblockingFilterMetric, false) -#endif - - // Coding tools - ("AMP", m_enableAMP, true, "Enable asymmetric motion partitions") - ("TransformSkip", m_useTransformSkip, false, "Intra transform skipping") - ("TransformSkipFast", m_useTransformSkipFast, false, "Fast intra transform skipping") - ("SAO", m_bUseSAO, true, "Enable Sample Adaptive Offset") - ("MaxNumOffsetsPerPic", m_maxNumOffsetsPerPic, 2048, "Max number of SAO offset per picture (Default: 2048)") - ("SAOLcuBoundary", m_saoLcuBoundary, false, - "0: right/bottom LCU boundary areas skipped from SAO parameter estimation, 1: non-deblocked pixels are used for those areas") - ("SAOLcuBasedOptimization", m_saoLcuBasedOptimization, true, - "0: SAO picture-based optimization, 1: SAO LCU-based optimization ") - ("SliceMode", m_sliceMode, 0, - "0: Disable all Recon slice limits, 1: Enforce max # of LCUs, 2: Enforce max # of bytes, 3:specify tiles per dependent slice") - ("SliceArgument", m_sliceArgument, 0, "Depending on SliceMode being:" - "\t1: max number of CTUs per slice" - "\t2: max number of bytes per slice" - "\t3: max number of tiles per slice") - ("SliceSegmentMode", m_sliceSegmentMode, 0, - "0: Disable all slice segment limits, 1: Enforce max # of LCUs, 2: Enforce max # of bytes, 3:specify tiles per dependent slice") - ("SliceSegmentArgument", m_sliceSegmentArgument, 0, "Depending on SliceSegmentMode being:" - "\t1: max number of CTUs per slice segment" - "\t2: max number of bytes per slice segment" - "\t3: max number of tiles per slice segment") - ("LFCrossSliceBoundaryFlag", m_bLFCrossSliceBoundaryFlag, true) - - ("ConstrainedIntraPred", m_bUseConstrainedIntraPred, false, "Constrained Intra Prediction") - - ("PCMEnabledFlag", m_usePCM, false) - ("PCMLog2MaxSize", m_pcmLog2MaxSize, 5u) - ("PCMLog2MinSize", m_uiPCMLog2MinSize, 3u) - ("PCMInputBitDepthFlag", m_bPCMInputBitDepthFlag, true) - ("PCMFilterDisableFlag", m_bPCMFilterDisableFlag, false) - - ("LosslessCuEnabled", m_useLossless, false) - - ("WeightedPredP,-wpP", m_useWeightedPred, false, "Use weighted prediction in P slices") - ("WeightedPredB,-wpB", m_useWeightedBiPred, false, - "Use weighted (bidirectional) prediction in B slices") - ("Log2ParallelMergeLevel", m_log2ParallelMergeLevel, 2u, "Parallel merge estimation region") - ("UniformSpacingIdc", m_iUniformSpacingIdr, 0, - "Indicates if the column and row boundaries are distributed uniformly") - ("NumTileColumnsMinus1", m_iNumColumnsMinus1, 0, "Number of columns in a picture minus 1") - ("ColumnWidthArray", cfg_ColumnWidth, string(""), - "Array containing ColumnWidth values in units of LCU") - ("NumTileRowsMinus1", m_iNumRowsMinus1, 0, "Number of rows in a picture minus 1") - ("RowHeightArray", cfg_RowHeight, string(""), - "Array containing RowHeight values in units of LCU") - ("LFCrossTileBoundaryFlag", m_bLFCrossTileBoundaryFlag, true, - "1: cross-tile-boundary loop filtering. 0:non-cross-tile-boundary loop filtering") - ("WaveFrontSynchro", m_iWaveFrontSynchro, 0, - "0: no synchro; 1 synchro with TR; 2 TRR etc") - ("ScalingList", m_useScalingListId, 0, - "0: no scaling list, 1: default scaling lists, 2: scaling lists specified in ScalingListFile") - ("ScalingListFile", cfg_ScalingListFile, string(""), "Scaling list file name") - ("SignHideFlag,-SBH", m_signHideFlag, 1) - ("MaxNumMergeCand", m_maxNumMergeCand, 5u, "Maximum number of merge candidates") - - /* Misc. */ - ("SEIDecodedPictureHash", m_decodedPictureHashSEIEnabled, 0, - "Control generation of decode picture hash SEI messages\n" - "\t3: checksum\n" - "\t2: CRC\n" - "\t1: use MD5\n" - "\t0: disable") - ("SEIpictureDigest", m_decodedPictureHashSEIEnabled, 0, "deprecated alias for SEIDecodedPictureHash") - ("TMVPMode", m_TMVPModeId, 1, - "TMVP mode 0: TMVP disable for all slices. 1: TMVP enable for all slices (default) 2: TMVP enable for certain slices only") - ("FEN", m_bUseFastEnc, false, "fast encoder setting") - ("ECU", m_bUseEarlyCU, false, "Early CU setting") - ("FDM", m_useFastDecisionForMerge, true, "Fast decision for Merge RD Cost") - ("CFM", m_bUseCbfFastMode, false, "Cbf fast mode setting") - ("ESD", m_useEarlySkipDetection, false, "Early SKIP detection setting") -#if RATE_CONTROL_LAMBDA_DOMAIN - ("RateControl", m_RCEnableRateControl, false, "Rate control: enable rate control") - ("TargetBitrate", m_RCTargetBitrate, 0, "Rate control: target bitrate") - ("KeepHierarchicalBit", m_RCKeepHierarchicalBit, false, - "Rate control: keep hierarchical bit allocation in rate control algorithm") - ("LCULevelRateControl", m_RCLCULevelRC, true, "Rate control: true: LCU level RC; false: picture level RC") - ("RCLCUSeparateModel", m_RCUseLCUSeparateModel, true, "Rate control: use LCU level separate R-lambda model") - ("InitialQP", m_RCInitialQP, 0, "Rate control: initial QP") - ("RCForceIntraQP", m_RCForceIntraQP, false, "Rate control: force intra QP to be equal to initial QP") -#else - ("RateCtrl,-rc", m_enableRateCtrl, false, "Rate control on/off") - ("TargetBitrate,-tbr", m_targetBitrate, 0, "Input target bitrate") - ("NumLCUInUnit,-nu", m_numLCUInUnit, 0, "Number of LCUs in an Unit") -#endif // if RATE_CONTROL_LAMBDA_DOMAIN - - ("TransquantBypassEnableFlag", m_TransquantBypassEnableFlag, false, "transquant_bypass_enable_flag indicator in PPS") - ("CUTransquantBypassFlagValue", m_CUTransquantBypassFlagValue, false, - "Fixed cu_transquant_bypass_flag value, when transquant_bypass_enable_flag is enabled") - ("RecalculateQPAccordingToLambda", m_recalculateQPAccordingToLambda, false, - "Recalculate QP values according to lambda values. Do not suggest to be enabled in all intra case") - ("StrongIntraSmoothing,-sis", m_useStrongIntraSmoothing, true, - "Enable strong intra smoothing for 32x32 blocks") - ("SEIActiveParameterSets", m_activeParameterSetsSEIEnabled, 0, - "Enable generation of active parameter sets SEI messages") - ("VuiParametersPresent,-vui", m_vuiParametersPresentFlag, false, "Enable generation of vui_parameters()") - ("AspectRatioInfoPresent", m_aspectRatioInfoPresentFlag, false, - "Signals whether aspect_ratio_idc is present") - ("AspectRatioIdc", m_aspectRatioIdc, 0, "aspect_ratio_idc") - ("SarWidth", m_sarWidth, 0, - "horizontal size of the sample aspect ratio") - ("SarHeight", m_sarHeight, 0, - "vertical size of the sample aspect ratio") - ("OverscanInfoPresent", m_overscanInfoPresentFlag, false, - "Indicates whether conformant decoded pictures are suitable for display using overscan\n") - ("OverscanAppropriate", m_overscanAppropriateFlag, false, - "Indicates whether conformant decoded pictures are suitable for display using overscan\n") - ("VideoSignalTypePresent", m_videoSignalTypePresentFlag, false, - "Signals whether video_format, video_full_range_flag, and colour_description_present_flag are present") - ("VideoFormat", m_videoFormat, 5, "Indicates representation of pictures") - ("VideoFullRange", m_videoFullRangeFlag, false, - "Indicates the black level and range of luma and chroma signals") - ("ColourDescriptionPresent", m_colourDescriptionPresentFlag, false, - "Signals whether colour_primaries, transfer_characteristics and matrix_coefficients are present") - ("ColourPrimaries", m_colourPrimaries, 2, - "Indicates chromaticity coordinates of the source primaries") - ("TransferCharateristics", m_transferCharacteristics, 2, - "Indicates the opto-electronic transfer characteristics of the source") - ("MatrixCoefficients", m_matrixCoefficients, 2, - "Describes the matrix coefficients used in deriving luma and chroma from RGB primaries") - ("ChromaLocInfoPresent", m_chromaLocInfoPresentFlag, false, - "Signals whether chroma_sample_loc_type_top_field and chroma_sample_loc_type_bottom_field are present") - ("ChromaSampleLocTypeTopField", m_chromaSampleLocTypeTopField, 0, - "Specifies the location of chroma samples for top field") - ("ChromaSampleLocTypeBottomField", m_chromaSampleLocTypeBottomField, 0, - "Specifies the location of chroma samples for bottom field") - ("NeutralChromaIndication", m_neutralChromaIndicationFlag, false, - "Indicates that the value of all decoded chroma samples is equal to 1<<(BitDepthCr-1)") - ("DefaultDisplayWindowFlag", m_defaultDisplayWindowFlag, false, - "Indicates the presence of the Default Window parameters") - ("DefDispWinLeftOffset", m_defDispWinLeftOffset, 0, - "Specifies the left offset of the default display window from the conformance window") - ("DefDispWinRightOffset", m_defDispWinRightOffset, 0, - "Specifies the right offset of the default display window from the conformance window") - ("DefDispWinTopOffset", m_defDispWinTopOffset, 0, - "Specifies the top offset of the default display window from the conformance window") - ("DefDispWinBottomOffset", m_defDispWinBottomOffset, 0, - "Specifies the bottom offset of the default display window from the conformance window") - ("FrameFieldInfoPresentFlag", m_frameFieldInfoPresentFlag, false, - "Indicates that pic_struct and field coding related values are present in picture timing SEI messages") - ("PocProportionalToTimingFlag", m_pocProportionalToTimingFlag, false, - "Indicates that the POC value is proportional to the output time w.r.t. first picture in CVS") - ("NumTicksPocDiffOneMinus1", m_numTicksPocDiffOneMinus1, 0, - "Number of ticks minus 1 that for a POC difference of one") - ("BitstreamRestriction", m_bitstreamRestrictionFlag, false, - "Signals whether bitstream restriction parameters are present") - ("TilesFixedStructure", m_tilesFixedStructureFlag, false, - "Indicates that each active picture parameter set has the same values of the syntax elements related to tiles") - ("MotionVectorsOverPicBoundaries", m_motionVectorsOverPicBoundariesFlag, false, - "Indicates that no samples outside the picture boundaries are used for inter prediction") - ("MaxBytesPerPicDenom", m_maxBytesPerPicDenom, 2, - "Indicates a number of bytes not exceeded by the sum of the sizes of the VCL NAL units associated with any coded picture") - ("MaxBitsPerMinCuDenom", m_maxBitsPerMinCuDenom, 1, - "Indicates an upper bound for the number of bits of coding_unit() data") - ("Log2MaxMvLengthHorizontal", m_log2MaxMvLengthHorizontal, 15, - "Indicate the maximum absolute value of a decoded horizontal MV component in quarter-pel luma units") - ("Log2MaxMvLengthVertical", m_log2MaxMvLengthVertical, 15, - "Indicate the maximum absolute value of a decoded vertical MV component in quarter-pel luma units") - ("SEIRecoveryPoint", m_recoveryPointSEIEnabled, 0, - "Control generation of recovery point SEI messages") - ("SEIBufferingPeriod", m_bufferingPeriodSEIEnabled, 0, - "Control generation of buffering period SEI messages") - ("SEIPictureTiming", m_pictureTimingSEIEnabled, 0, - "Control generation of picture timing SEI messages") -#if J0149_TONE_MAPPING_SEI - ("SEIToneMappingInfo", m_toneMappingInfoSEIEnabled, false, - "Control generation of Tone Mapping SEI messages") - ("SEIToneMapId", m_toneMapId, 0, - "Specifies Id of Tone Mapping SEI message for a given session") - ("SEIToneMapCancelFlag", m_toneMapCancelFlag, false, - "Indicates that Tone Mapping SEI message cancels the persistance or follows") - ("SEIToneMapPersistenceFlag", m_toneMapPersistenceFlag, true, - "Specifies the persistence of the Tone Mapping SEI message") - ("SEIToneMapCodedDataBitDepth", m_toneMapCodedDataBitDepth, 8, - "Specifies Coded Data BitDepth of Tone Mapping SEI messages") - ("SEIToneMapTargetBitDepth", m_toneMapTargetBitDepth, 8, - "Specifies Output BitDepth of Tome mapping function") - ("SEIToneMapModelId", m_toneMapModelId, 0, - "Specifies Model utilized for mapping coded data into target_bit_depth range\n" - "\t0: linear mapping with clipping\n" - "\t1: sigmoidal mapping\n" - "\t2: user-defined table mapping\n" - "\t3: piece-wise linear mapping\n" - "\t4: luminance dynamic range information ") - ("SEIToneMapMinValue", m_toneMapMinValue, 0, - "Specifies the minimum value in mode 0") - ("SEIToneMapMaxValue", m_toneMapMaxValue, 1023, - "Specifies the maxmum value in mode 0") - ("SEIToneMapSigmoidMidpoint", m_sigmoidMidpoint, 512, - "Specifies the centre point in mode 1") - ("SEIToneMapSigmoidWidth", m_sigmoidWidth, 960, - "Specifies the distance between 5% and 95% values of the target_bit_depth in mode 1") - ("SEIToneMapStartOfCodedInterval", cfg_startOfCodedInterval, string(""), - "Array of user-defined mapping table") - ("SEIToneMapNumPivots", m_numPivots, 0, - "Specifies the number of pivot points in mode 3") - ("SEIToneMapCodedPivotValue", cfg_codedPivotValue, string(""), "Array of pivot point") - ("SEIToneMapTargetPivotValue", cfg_targetPivotValue, string(""), "Array of pivot point") - ("SEIToneMapCameraIsoSpeedIdc", m_cameraIsoSpeedIdc, 0, - "Indicates the camera ISO speed for daylight illumination") - ("SEIToneMapCameraIsoSpeedValue", m_cameraIsoSpeedValue, 400, - "Specifies the camera ISO speed for daylight illumination of Extended_ISO") - ("SEIToneMapExposureCompensationValueSignFlag", m_exposureCompensationValueSignFlag, 0, - "Specifies the sign of ExposureCompensationValue") - ("SEIToneMapExposureCompensationValueNumerator", m_exposureCompensationValueNumerator, 0, - "Specifies the numerator of ExposureCompensationValue") - ("SEIToneMapExposureCompensationValueDenomIdc", m_exposureCompensationValueDenomIdc, 2, - "Specifies the denominator of ExposureCompensationValue") - ("SEIToneMapRefScreenLuminanceWhite", m_refScreenLuminanceWhite, 350, - "Specifies reference screen brightness setting in units of candela per square metre") - ("SEIToneMapExtendedRangeWhiteLevel", m_extendedRangeWhiteLevel, 800, - "Indicates the luminance dynamic range") - ("SEIToneMapNominalBlackLevelLumaCodeValue", m_nominalBlackLevelLumaCodeValue, 16, - "Specifies luma sample value of the nominal black level assigned decoded pictures") - ("SEIToneMapNominalWhiteLevelLumaCodeValue", m_nominalWhiteLevelLumaCodeValue, 235, - "Specifies luma sample value of the nominal white level assigned decoded pictures") - ("SEIToneMapExtendedWhiteLevelLumaCodeValue", m_extendedWhiteLevelLumaCodeValue, 300, - "Specifies luma sample value of the extended dynamic range assigned decoded pictures") -#endif // if J0149_TONE_MAPPING_SEI - ("SEIFramePacking", m_framePackingSEIEnabled, 0, - "Control generation of frame packing SEI messages") - ("SEIFramePackingType", m_framePackingSEIType, 0, "Define frame packing arrangement\n" - "\t0: checkerboard - pixels alternatively represent either frames\n" - "\t1: column alternation - frames are interlaced by column\n" - "\t2: row alternation - frames are interlaced by row\n" - "\t3: side by side - frames are displayed horizontally\n" - "\t4: top bottom - frames are displayed vertically\n" - "\t5: frame alternation - one frame is alternated with the other") - ("SEIFramePackingId", m_framePackingSEIId, 0, - "Id of frame packing SEI message for a given session") - ("SEIFramePackingQuincunx", m_framePackingSEIQuincunx, 0, - "Indicate the presence of a Quincunx type video frame") - ("SEIFramePackingInterpretation", m_framePackingSEIInterpretation, 0, - "Indicate the interpretation of the frame pair\n" - "\t0: unspecified\n" - "\t1: stereo pair, frame0 represents left view\n" - "\t2: stereo pair, frame0 represents right view") - ("SEIDisplayOrientation", m_displayOrientationSEIAngle, 0, - "Control generation of display orientation SEI messages\n" - "\tN: 0 < N < (2^16 - 1) enable display orientation SEI message with anticlockwise_rotation = N and display_orientation_repetition_period = 1\n" - "\t0: disable") - ("SEITemporalLevel0Index", m_temporalLevel0IndexSEIEnabled, 0, - "Control generation of temporal level 0 index SEI messages") - ("SEIGradualDecodingRefreshInfo", m_gradualDecodingRefreshInfoEnabled, 0, - "Control generation of gradual decoding refresh information SEI message") - ("SEIDecodingUnitInfo", m_decodingUnitInfoSEIEnabled, 0, - "Control generation of decoding unit information SEI message.") -#if L0208_SOP_DESCRIPTION_SEI - ("SEISOPDescription", m_SOPDescriptionSEIEnabled, 0, - "Control generation of SOP description SEI messages") -#endif -#if K0180_SCALABLE_NESTING_SEI - ("SEIScalableNesting", m_scalableNestingSEIEnabled, 0, - "Control generation of scalable nesting SEI messages") -#endif -#if SIGNAL_BITRATE_PICRATE_IN_VPS - ("BitRatePicRateMaxTLayers", m_bitRatePicRateMaxTLayers, 0, - "Maximum number of sub-layers signalled; can be inferred otherwise; here for easy parsing of config. file") - ("BitRateInfoPresent", cfg_bitRateInfoPresentFlag, string(""), - "Control signalling of bit rate information of avg. bit rate and max. bit rate in VPS\n" - "\t0: Do not sent bit rate info\n" - "\tN (N > 0): Send bit rate info for N sub-layers. N should equal maxTempLayers.") - ("PicRateInfoPresent", cfg_picRateInfoPresentFlag, string(""), - "Control signalling of picture rate information of avg. bit rate and max. bit rate in VPS\n" - "\t0: Do not sent picture rate info\n" - "\tN (N > 0): Send picture rate info for N sub-layers. N should equal maxTempLayers.") - ("AvgBitRate", cfg_avgBitRate, string(""), - "List of avg. bit rates for the different sub-layers; include non-negative number even if corresponding flag is 0") - ("MaxBitRate", cfg_maxBitRate, string(""), - "List of max. bit rates for the different sub-layers; include non-negative number even if corresponding flag is 0") - ("AvgPicRate", cfg_avgPicRate, string(""), - "List of avg. picture rates for the different sub-layers; include non-negative number even if corresponding flag is 0") - ("ConstantPicRateIdc", cfg_constantPicRateIdc, string(""), - "List of constant picture rate IDCs; include non-negative number even if corresponding flag is 0") -#endif // if SIGNAL_BITRATE_PICRATE_IN_VPS - ; - - for (Int i = 1; i < MAX_GOP + 1; i++) - { - std::ostringstream cOSS; - cOSS << "Frame" << i; - opts.addOptions() (cOSS.str(), m_GOPList[i - 1], GOPEntry()); - } - - po::setDefaults(opts); - const list<const Char *>& argv_unhandled = po::scanArgv(opts, argc, (const Char**)argv); - - for (list<const Char *>::const_iterator it = argv_unhandled.begin(); it != argv_unhandled.end(); it++) - { - fprintf(stderr, "Unhandled argument ignored: `%s'\n", *it); - } - - if (argc == 1 || do_help) - { - /* argc == 1: no options have been specified */ - po::doHelp(cout, opts); - return false; - } - - /* - * Set any derived parameters - */ - - /* convert std::string to c string for compatability */ - m_pchInputFile = cfg_InputFile.empty() ? NULL : strdup(cfg_InputFile.c_str()); - m_pchBitstreamFile = cfg_BitstreamFile.empty() ? NULL : strdup(cfg_BitstreamFile.c_str()); - m_pchReconFile = cfg_ReconFile.empty() ? NULL : strdup(cfg_ReconFile.c_str()); - m_pchdQPFile = cfg_dQPFile.empty() ? NULL : strdup(cfg_dQPFile.c_str()); - - /* parse the width, height, frame rate from the y4m files if it is not given in the configuration file */ - char * s = strrchr(m_pchInputFile, '.'); - handler_input = NULL; - handler_recon = NULL; - - if ((!strcmp(s + 1, "y4m"))) - { - m_cTVideoIOInputFile = new TVideoIOY4m(); - m_cTVideoIOReconFile = new TVideoIOY4m(); - /* get the video information like width,height,framerate */ - m_cTVideoIOInputFile->open(m_pchInputFile, - false, - m_inputBitDepthY, - m_inputBitDepthC, - m_internalBitDepthY, - m_internalBitDepthC, - handler_input, - video_info, - m_aiPad); - m_cTVideoIOInputFile->getVideoInfo(video_info, handler_input); - m_iSourceWidth = video_info.width; - m_iSourceHeight = video_info.height; - m_iFrameRate = video_info.FrameRate; - } - else if ((!strcmp(s + 1, "yuv"))) - { - m_cTVideoIOInputFile = new TVideoIOYuv(); - m_cTVideoIOReconFile = new TVideoIOYuv(); - } - - Char *pColumnWidth = cfg_ColumnWidth.empty() ? NULL : strdup(cfg_ColumnWidth.c_str()); - Char *pRowHeight = cfg_RowHeight.empty() ? NULL : strdup(cfg_RowHeight.c_str()); - if (m_iUniformSpacingIdr == 0 && m_iNumColumnsMinus1 > 0) - { - char *columnWidth; - int i = 0; - m_pColumnWidth = new UInt[m_iNumColumnsMinus1]; - columnWidth = strtok(pColumnWidth, " ,-"); - while (columnWidth != NULL) - { - if (i >= m_iNumColumnsMinus1) - { - printf("The number of columns whose width are defined is larger than the allowed number of columns.\n"); - exit(EXIT_FAILURE); - } - - *(m_pColumnWidth + i) = atoi(columnWidth); - columnWidth = strtok(NULL, " ,-"); - i++; - } - - if (i < m_iNumColumnsMinus1) - { - printf("The width of some columns is not defined.\n"); - exit(EXIT_FAILURE); - } - } - else - { - m_pColumnWidth = NULL; - } - - if (m_iUniformSpacingIdr == 0 && m_iNumRowsMinus1 > 0) - { - char *rowHeight; - int i = 0; - m_pRowHeight = new UInt[m_iNumRowsMinus1]; - rowHeight = strtok(pRowHeight, " ,-"); - while (rowHeight != NULL) - { - if (i >= m_iNumRowsMinus1) - { - printf("The number of rows whose height are defined is larger than the allowed number of rows.\n"); - exit(EXIT_FAILURE); - } - - *(m_pRowHeight + i) = atoi(rowHeight); - rowHeight = strtok(NULL, " ,-"); - i++; - } - - if (i < m_iNumRowsMinus1) - { - printf("The height of some rows is not defined.\n"); - exit(EXIT_FAILURE); - } - } - else - { - m_pRowHeight = NULL; - } - -#if SIGNAL_BITRATE_PICRATE_IN_VPS - readBoolString(cfg_bitRateInfoPresentFlag, - m_bitRatePicRateMaxTLayers, - m_bitRateInfoPresentFlag, - "bit rate info. present flag"); - readIntString(cfg_avgBitRate, m_bitRatePicRateMaxTLayers, m_avgBitRate, "avg. bit rate"); - readIntString(cfg_maxBitRate, m_bitRatePicRateMaxTLayers, m_maxBitRate, "max. bit rate"); - readBoolString(cfg_picRateInfoPresentFlag, - m_bitRatePicRateMaxTLayers, - m_picRateInfoPresentFlag, - "bit rate info. present flag"); - readIntString(cfg_avgPicRate, m_bitRatePicRateMaxTLayers, m_avgPicRate, "avg. pic rate"); - readIntString(cfg_constantPicRateIdc, m_bitRatePicRateMaxTLayers, m_constantPicRateIdc, "constant pic rate Idc"); -#endif // if SIGNAL_BITRATE_PICRATE_IN_VPS - m_scalingListFile = cfg_ScalingListFile.empty() ? NULL : strdup(cfg_ScalingListFile.c_str()); - - /* rules for input, output and internal bitdepths as per help text */ - if (!m_internalBitDepthY) - { - m_internalBitDepthY = m_inputBitDepthY; - } - - if (!m_internalBitDepthC) - { - m_internalBitDepthC = m_internalBitDepthY; - } - - if (!m_inputBitDepthC) - { - m_inputBitDepthC = m_inputBitDepthY; - } - - if (!m_outputBitDepthY) - { - m_outputBitDepthY = m_internalBitDepthY; - } - - if (!m_outputBitDepthC) - { - m_outputBitDepthC = m_internalBitDepthC; - } - - // TODO:ChromaFmt assumes 4:2:0 below - switch (m_conformanceMode) - { - case 0: - { - // no conformance or padding - m_confLeft = m_confRight = m_confTop = m_confBottom = 0; - m_aiPad[1] = m_aiPad[0] = 0; - break; - } - case 1: - { - // automatic padding to minimum CU size - Int minCuSize = m_uiMaxCUHeight >> (m_uiMaxCUDepth - 1); - if (m_iSourceWidth % minCuSize) - { - m_aiPad[0] = m_confRight = ((m_iSourceWidth / minCuSize) + 1) * minCuSize - m_iSourceWidth; - m_iSourceWidth += m_confRight; - } - - if (m_iSourceHeight % minCuSize) - { - m_aiPad[1] = m_confBottom = ((m_iSourceHeight / minCuSize) + 1) * minCuSize - m_iSourceHeight; - m_iSourceHeight += m_confBottom; - } - - if (m_aiPad[0] % TComSPS::getWinUnitX(CHROMA_420) != 0) - { - fprintf(stderr, "Error: picture width is not an integer multiple of the specified chroma subsampling\n"); - exit(EXIT_FAILURE); - } - - if (m_aiPad[1] % TComSPS::getWinUnitY(CHROMA_420) != 0) - { - fprintf(stderr, "Error: picture height is not an integer multiple of the specified chroma subsampling\n"); - exit(EXIT_FAILURE); - } - - break; - } - case 2: - { - //padding - m_iSourceWidth += m_aiPad[0]; - m_iSourceHeight += m_aiPad[1]; - m_confRight = m_aiPad[0]; - m_confBottom = m_aiPad[1]; - break; - } - case 3: - { - // conformance - if ((m_confLeft == 0) && (m_confRight == 0) && (m_confTop == 0) && (m_confBottom == 0)) - { - fprintf(stderr, "Warning: Conformance window enabled, but all conformance window parameters set to zero\n"); - } - - if ((m_aiPad[1] != 0) || (m_aiPad[0] != 0)) - { - fprintf(stderr, "Warning: Conformance window enabled, padding parameters will be ignored\n"); - } - - m_aiPad[1] = m_aiPad[0] = 0; - break; - } - } - - // allocate slice-based dQP values - m_aidQP = new Int[m_framesToBeEncoded + m_iGOPSize + 1]; - ::memset(m_aidQP, 0, sizeof(Int) * (m_framesToBeEncoded + m_iGOPSize + 1)); - - // handling of floating-point QP values - // if QP is not integer, sequence is split into two sections having QP and QP+1 - m_iQP = (Int)(m_fQP); - if (m_iQP < m_fQP) - { - Int iSwitchPOC = (Int)(m_framesToBeEncoded - (m_fQP - m_iQP) * m_framesToBeEncoded + 0.5); - - iSwitchPOC = (Int)((Double)iSwitchPOC / m_iGOPSize + 0.5) * m_iGOPSize; - for (Int i = iSwitchPOC; i < m_framesToBeEncoded + m_iGOPSize + 1; i++) - { - m_aidQP[i] = 1; - } - } - - // reading external dQP description from file - if (m_pchdQPFile) - { - FILE *fpt = fopen(m_pchdQPFile, "r"); - if (fpt) - { - Int iValue; - Int iPOC = 0; - while (iPOC < m_framesToBeEncoded) - { - if (fscanf(fpt, "%d", &iValue) == EOF) break; - - m_aidQP[iPOC] = iValue; - iPOC++; - } - - fclose(fpt); - } - } - - m_iWaveFrontSubstreams = m_iWaveFrontSynchro ? (m_iSourceHeight + m_uiMaxCUHeight - 1) / m_uiMaxCUHeight : 1; - -#if J0149_TONE_MAPPING_SEI - if (m_toneMappingInfoSEIEnabled && !m_toneMapCancelFlag) - { - Char *pcStartOfCodedInterval = cfg_startOfCodedInterval.empty() ? NULL : strdup(cfg_startOfCodedInterval.c_str()); - Char *pcCodedPivotValue = cfg_codedPivotValue.empty() ? NULL : strdup(cfg_codedPivotValue.c_str()); - Char *pcTargetPivotValue = cfg_targetPivotValue.empty() ? NULL : strdup(cfg_targetPivotValue.c_str()); - if (m_toneMapModelId == 2 && pcStartOfCodedInterval) - { - char *startOfCodedInterval; - UInt num = 1u << m_toneMapTargetBitDepth; - m_startOfCodedInterval = new Int[num]; - ::memset(m_startOfCodedInterval, 0, sizeof(Int) * num); - startOfCodedInterval = strtok(pcStartOfCodedInterval, " ."); - int i = 0; - while (startOfCodedInterval && (i < num)) - { - m_startOfCodedInterval[i] = atoi(startOfCodedInterval); - startOfCodedInterval = strtok(NULL, " ."); - i++; - } - } - else - { - m_startOfCodedInterval = NULL; - } - - if ((m_toneMapModelId == 3) && (m_numPivots > 0)) - { - if (pcCodedPivotValue && pcTargetPivotValue) - { - char *codedPivotValue; - char *targetPivotValue; - m_codedPivotValue = new Int[m_numPivots]; - m_targetPivotValue = new Int[m_numPivots]; - ::memset(m_codedPivotValue, 0, sizeof(Int) * (m_numPivots)); - ::memset(m_targetPivotValue, 0, sizeof(Int) * (m_numPivots)); - codedPivotValue = strtok(pcCodedPivotValue, " ."); - int i = 0; - while (codedPivotValue && i < m_numPivots) - { - m_codedPivotValue[i] = atoi(codedPivotValue); - codedPivotValue = strtok(NULL, " ."); - i++; - } - - i = 0; - targetPivotValue = strtok(pcTargetPivotValue, " ."); - while (targetPivotValue && i < m_numPivots) - { - m_targetPivotValue[i] = atoi(targetPivotValue); - targetPivotValue = strtok(NULL, " ."); - i++; - } - } - } - else - { - m_codedPivotValue = NULL; - m_targetPivotValue = NULL; - } - } - -#endif // if J0149_TONE_MAPPING_SEI - // check validity of input parameters - xCheckParameter(); - - // set global varibles - xSetGlobal(); - - // print-out parameters - xPrintParameter(); - - return true; -} - -#if SIGNAL_BITRATE_PICRATE_IN_VPS -Void readBoolString(const string inpString, const Int numEntries, Bool* &memberArray, const char *elementName) -{ - Char *inpArray = inpString.empty() ? NULL : strdup(inpString.c_str()); - Int i = 0; - - if (numEntries) - { - Char *tempArray = strtok(inpArray, " ,-"); - memberArray = new Bool[numEntries]; - while (tempArray != NULL) - { - if (i >= numEntries) - { - printf("The number of %s defined is larger than the allowed number\n", elementName); - exit(EXIT_FAILURE); - } - - assert((atoi(tempArray) == 0) || (atoi(tempArray) == 1)); - *(memberArray + i) = atoi(tempArray); - tempArray = strtok(NULL, " ,-"); - i++; - } - - if (i < numEntries) - { - printf("Some %s are not defined\n", elementName); - exit(EXIT_FAILURE); - } - } - else - { - memberArray = NULL; - } -} - -Void readIntString(const string inpString, const Int numEntries, Int* &memberArray, const char *elementName) -{ - Char *inpArray = inpString.empty() ? NULL : strdup(inpString.c_str()); - Int i = 0; - - if (numEntries) - { - Char *tempArray = strtok(inpArray, " ,-"); - memberArray = new Int[numEntries]; - while (tempArray != NULL) - { - if (i >= numEntries) - { - printf("The number of %s defined is larger than the allowed number\n", elementName); - exit(EXIT_FAILURE); - } - - *(memberArray + i) = atoi(tempArray); - tempArray = strtok(NULL, " ,-"); - i++; - } - - if (i < numEntries) - { - printf("Some %s are not defined\n", elementName); - exit(EXIT_FAILURE); - } - } - else - { - memberArray = NULL; - } -} - -#endif // if SIGNAL_BITRATE_PICRATE_IN_VPS -// ==================================================================================================================== -// Private member functions -// ==================================================================================================================== - -Bool confirmPara(Bool bflag, const Char *message); - -Void TAppEncCfg::xCheckParameter() -{ - if (!m_decodedPictureHashSEIEnabled) - { - fprintf(stderr, "******************************************************************\n"); - fprintf(stderr, "** WARNING: --SEIDecodedPictureHash is now disabled by default. **\n"); - fprintf(stderr, "** Automatic verification of decoded pictures by a **\n"); - fprintf(stderr, "** decoder requires this option to be enabled. **\n"); - fprintf(stderr, "******************************************************************\n"); - } - - Bool check_failed = false; /* abort if there is a fatal configuration problem */ -#define xConfirmPara(a, b) check_failed |= confirmPara(a, b) - // check range of parameters - xConfirmPara(m_inputBitDepthY < 8, "InputBitDepth must be at least 8"); - xConfirmPara(m_inputBitDepthC < 8, "InputBitDepthC must be at least 8"); - xConfirmPara(m_iFrameRate <= 0, "Frame rate must be more than 1"); - xConfirmPara(m_framesToBeEncoded <= 0, - "Total Number Of Frames encoded must be more than 0"); - xConfirmPara(m_iGOPSize < 1, - "GOP Size must be greater or equal to 1"); - xConfirmPara(m_iGOPSize > 1 && m_iGOPSize % 2, - "GOP Size must be a multiple of 2, if GOP Size is greater than 1"); - xConfirmPara((m_iIntraPeriod > 0 && m_iIntraPeriod < m_iGOPSize) || m_iIntraPeriod == 0, - "Intra period must be more than GOP size, or -1 , not 0"); - xConfirmPara(m_iDecodingRefreshType < 0 || m_iDecodingRefreshType > 2, - "Decoding Refresh Type must be equal to 0, 1 or 2"); - xConfirmPara(m_iQP < -6 * (m_internalBitDepthY - 8) || m_iQP > 51, - "QP exceeds supported range (-QpBDOffsety to 51)"); - xConfirmPara(m_loopFilterBetaOffsetDiv2 < -13 || m_loopFilterBetaOffsetDiv2 > 13, - "Loop Filter Beta Offset div. 2 exceeds supported range (-13 to 13)"); - xConfirmPara(m_loopFilterTcOffsetDiv2 < -13 || m_loopFilterTcOffsetDiv2 > 13, - "Loop Filter Tc Offset div. 2 exceeds supported range (-13 to 13)"); - xConfirmPara(m_iFastSearch < 0 || m_iFastSearch > 2, - "Fast Search Mode is not supported value (0:Full search 1:Diamond 2:PMVFAST)"); - xConfirmPara(m_iSearchRange < 0, "Search Range must be more than 0"); - xConfirmPara(m_bipredSearchRange < 0, "Search Range must be more than 0"); - xConfirmPara(m_iMaxDeltaQP > 7, - "Absolute Delta QP exceeds supported range (0 to 7)"); - xConfirmPara(m_iMaxCuDQPDepth > m_uiMaxCUDepth - 1, - "Absolute depth for a minimum CuDQP exceeds maximum coding unit depth"); - - xConfirmPara(m_cbQpOffset < -12, "Min. Chroma Cb QP Offset is -12"); - xConfirmPara(m_cbQpOffset > 12, "Max. Chroma Cb QP Offset is 12"); - xConfirmPara(m_crQpOffset < -12, "Min. Chroma Cr QP Offset is -12"); - xConfirmPara(m_crQpOffset > 12, "Max. Chroma Cr QP Offset is 12"); - - xConfirmPara(m_iQPAdaptationRange <= 0, - "QP Adaptation Range must be more than 0"); - if (m_iDecodingRefreshType == 2) - { - xConfirmPara(m_iIntraPeriod > 0 && m_iIntraPeriod <= m_iGOPSize, - "Intra period must be larger than GOP size for periodic IDR pictures"); - } - - xConfirmPara((m_uiMaxCUWidth >> m_uiMaxCUDepth) < 4, - "Minimum partition width size should be larger than or equal to 8"); - xConfirmPara((m_uiMaxCUHeight >> m_uiMaxCUDepth) < 4, - "Minimum partition height size should be larger than or equal to 8"); - xConfirmPara(m_uiMaxCUWidth < 16, - "Maximum partition width size should be larger than or equal to 16"); - xConfirmPara(m_uiMaxCUHeight < 16, - "Maximum partition height size should be larger than or equal to 16"); - xConfirmPara((m_iSourceWidth % (m_uiMaxCUWidth >> (m_uiMaxCUDepth - 1))) != 0, - "Resulting coded frame width must be a multiple of the minimum CU size"); - xConfirmPara((m_iSourceHeight % (m_uiMaxCUHeight >> (m_uiMaxCUDepth - 1))) != 0, - "Resulting coded frame height must be a multiple of the minimum CU size"); - - xConfirmPara(m_uiQuadtreeTULog2MinSize < 2, - "QuadtreeTULog2MinSize must be 2 or greater."); - xConfirmPara(m_uiQuadtreeTULog2MaxSize > 5, - "QuadtreeTULog2MaxSize must be 5 or smaller."); - xConfirmPara((1 << m_uiQuadtreeTULog2MaxSize) > m_uiMaxCUWidth, - "QuadtreeTULog2MaxSize must be log2(maxCUSize) or smaller."); - - xConfirmPara(m_uiQuadtreeTULog2MaxSize < m_uiQuadtreeTULog2MinSize, - "QuadtreeTULog2MaxSize must be greater than or equal to m_uiQuadtreeTULog2MinSize."); - xConfirmPara((1 << m_uiQuadtreeTULog2MinSize) > (m_uiMaxCUWidth >> (m_uiMaxCUDepth - 1)), - "QuadtreeTULog2MinSize must not be greater than minimum CU size"); // HS - xConfirmPara((1 << m_uiQuadtreeTULog2MinSize) > (m_uiMaxCUHeight >> (m_uiMaxCUDepth - 1)), - "QuadtreeTULog2MinSize must not be greater than minimum CU size"); // HS - xConfirmPara((1 << m_uiQuadtreeTULog2MinSize) > (m_uiMaxCUWidth >> m_uiMaxCUDepth), - "Minimum CU width must be greater than minimum transform size."); - xConfirmPara((1 << m_uiQuadtreeTULog2MinSize) > (m_uiMaxCUHeight >> m_uiMaxCUDepth), - "Minimum CU height must be greater than minimum transform size."); - xConfirmPara(m_uiQuadtreeTUMaxDepthInter < 1, - "QuadtreeTUMaxDepthInter must be greater than or equal to 1"); - xConfirmPara( - m_uiMaxCUWidth < (1 << (m_uiQuadtreeTULog2MinSize + m_uiQuadtreeTUMaxDepthInter - 1)), - "QuadtreeTUMaxDepthInter must be less than or equal to the difference between log2(maxCUSize) and QuadtreeTULog2MinSize plus 1"); - xConfirmPara(m_uiQuadtreeTUMaxDepthIntra < 1, - "QuadtreeTUMaxDepthIntra must be greater than or equal to 1"); - xConfirmPara( - m_uiMaxCUWidth < (1 << (m_uiQuadtreeTULog2MinSize + m_uiQuadtreeTUMaxDepthIntra - 1)), - "QuadtreeTUMaxDepthInter must be less than or equal to the difference between log2(maxCUSize) and QuadtreeTULog2MinSize plus 1"); - - xConfirmPara(m_maxNumMergeCand < 1, "MaxNumMergeCand must be 1 or greater."); - xConfirmPara(m_maxNumMergeCand > 5, "MaxNumMergeCand must be 5 or smaller."); - -#if ADAPTIVE_QP_SELECTION - xConfirmPara(m_bUseAdaptQpSelect == true && m_iQP < 0, - "AdaptiveQpSelection must be disabled when QP < 0."); - xConfirmPara(m_bUseAdaptQpSelect == true && (m_cbQpOffset != 0 || m_crQpOffset != 0), - "AdaptiveQpSelection must be disabled when ChromaQpOffset is not equal to 0."); -#endif - - if (m_usePCM) - { - xConfirmPara(m_uiPCMLog2MinSize < 3, "PCMLog2MinSize must be 3 or greater."); - xConfirmPara(m_uiPCMLog2MinSize > 5, "PCMLog2MinSize must be 5 or smaller."); - xConfirmPara(m_pcmLog2MaxSize > 5, "PCMLog2MaxSize must be 5 or smaller."); - xConfirmPara(m_pcmLog2MaxSize < m_uiPCMLog2MinSize, - "PCMLog2MaxSize must be equal to or greater than m_uiPCMLog2MinSize."); - } - - xConfirmPara(m_sliceMode < 0 || m_sliceMode > 3, "SliceMode exceeds supported range (0 to 3)"); - if (m_sliceMode != 0) - { - xConfirmPara(m_sliceArgument < 1, "SliceArgument should be larger than or equal to 1"); - } - - xConfirmPara(m_sliceSegmentMode < 0 || m_sliceSegmentMode > 3, "SliceSegmentMode exceeds supported range (0 to 3)"); - if (m_sliceSegmentMode != 0) - { - xConfirmPara(m_sliceSegmentArgument < 1, "SliceSegmentArgument should be larger than or equal to 1"); - } - - Bool tileFlag = (m_iNumColumnsMinus1 > 0 || m_iNumRowsMinus1 > 0); - xConfirmPara(tileFlag && m_iWaveFrontSynchro, "Tile and Wavefront can not be applied together"); - - //TODO:ChromaFmt assumes 4:2:0 below - xConfirmPara(m_iSourceWidth % TComSPS::getWinUnitX( - CHROMA_420) != 0, "Picture width must be an integer multiple of the specified chroma subsampling"); - xConfirmPara(m_iSourceHeight % TComSPS::getWinUnitY( - CHROMA_420) != 0, "Picture height must be an integer multiple of the specified chroma subsampling"); - - xConfirmPara(m_aiPad[0] % TComSPS::getWinUnitX( - CHROMA_420) != 0, "Horizontal padding must be an integer multiple of the specified chroma subsampling"); - xConfirmPara(m_aiPad[1] % TComSPS::getWinUnitY( - CHROMA_420) != 0, "Vertical padding must be an integer multiple of the specified chroma subsampling"); - - xConfirmPara(m_confLeft % TComSPS::getWinUnitX( - CHROMA_420) != 0, - "Left conformance window offset must be an integer multiple of the specified chroma subsampling"); - xConfirmPara(m_confRight % TComSPS::getWinUnitX( - CHROMA_420) != 0, - "Right conformance window offset must be an integer multiple of the specified chroma subsampling"); - xConfirmPara(m_confTop % TComSPS::getWinUnitY( - CHROMA_420) != 0, - "Top conformance window offset must be an integer multiple of the specified chroma subsampling"); - xConfirmPara(m_confBottom % TComSPS::getWinUnitY( - CHROMA_420) != 0, - "Bottom conformance window offset must be an integer multiple of the specified chroma subsampling"); - - // max CU width and height should be power of 2 - UInt ui = m_uiMaxCUWidth; - while (ui) - { - ui >>= 1; - if ((ui & 1) == 1) - xConfirmPara(ui != 1, "Width should be 2^n"); - } - - ui = m_uiMaxCUHeight; - while (ui) - { - ui >>= 1; - if ((ui & 1) == 1) - xConfirmPara(ui != 1, "Height should be 2^n"); - } - - /* if this is an intra-only sequence, ie IntraPeriod=1, don't verify the GOP structure - * This permits the ability to omit a GOP structure specification */ - if (m_iIntraPeriod == 1 && m_GOPList[0].m_POC == -1) - { - m_GOPList[0] = GOPEntry(); - m_GOPList[0].m_QPFactor = 1; - m_GOPList[0].m_betaOffsetDiv2 = 0; - m_GOPList[0].m_tcOffsetDiv2 = 0; - m_GOPList[0].m_POC = 1; - m_GOPList[0].m_numRefPicsActive = 4; - } - - Bool verifiedGOP = false; - Bool errorGOP = false; - Int checkGOP = 1; - Int numRefs = 1; - Int refList[MAX_NUM_REF_PICS + 1]; - refList[0] = 0; - Bool isOK[MAX_GOP]; - for (Int i = 0; i < MAX_GOP; i++) - { - isOK[i] = false; - } - - Int numOK = 0; - xConfirmPara(m_iIntraPeriod >= 0 && (m_iIntraPeriod % m_iGOPSize != 0), "Intra period must be a multiple of GOPSize, or -1"); - - for (Int i = 0; i < m_iGOPSize; i++) - { - if (m_GOPList[i].m_POC == m_iGOPSize) - { - xConfirmPara(m_GOPList[i].m_temporalId != 0, "The last frame in each GOP must have temporal ID = 0 "); - } - } - - if ((m_iIntraPeriod != 1) && !m_loopFilterOffsetInPPS && m_DeblockingFilterControlPresent && (!m_bLoopFilterDisable)) - { - for (Int i = 0; i < m_iGOPSize; i++) - { - xConfirmPara((m_GOPList[i].m_betaOffsetDiv2 + m_loopFilterBetaOffsetDiv2) < -6 || - (m_GOPList[i].m_betaOffsetDiv2 + m_loopFilterBetaOffsetDiv2) > 6, - "Loop Filter Beta Offset div. 2 for one of the GOP entries exceeds supported range (-6 to 6)"); - xConfirmPara((m_GOPList[i].m_tcOffsetDiv2 + m_loopFilterTcOffsetDiv2) < -6 || - (m_GOPList[i].m_tcOffsetDiv2 + m_loopFilterTcOffsetDiv2) > 6, - "Loop Filter Tc Offset div. 2 for one of the GOP entries exceeds supported range (-6 to 6)"); - } - } - - m_extraRPSs = 0; - //start looping through frames in coding order until we can verify that the GOP structure is correct. - while (!verifiedGOP && !errorGOP) - { - Int curGOP = (checkGOP - 1) % m_iGOPSize; - Int curPOC = ((checkGOP - 1) / m_iGOPSize) * m_iGOPSize + m_GOPList[curGOP].m_POC; - if (m_GOPList[curGOP].m_POC < 0) - { - printf("\nError: found fewer Reference Picture Sets than GOPSize\n"); - errorGOP = true; - } - else - { - //check that all reference pictures are available, or have a POC < 0 meaning they might be available in the next GOP. - Bool beforeI = false; - for (Int i = 0; i < m_GOPList[curGOP].m_numRefPics; i++) - { - Int absPOC = curPOC + m_GOPList[curGOP].m_referencePics[i]; - if (absPOC < 0) - { - beforeI = true; - } - else - { - Bool found = false; - for (Int j = 0; j < numRefs; j++) - { - if (refList[j] == absPOC) - { - found = true; - for (Int k = 0; k < m_iGOPSize; k++) - { - if (absPOC % m_iGOPSize == m_GOPList[k].m_POC % m_iGOPSize) - { - if (m_GOPList[k].m_temporalId == m_GOPList[curGOP].m_temporalId) - { - m_GOPList[k].m_refPic = true; - } - - m_GOPList[curGOP].m_usedByCurrPic[i] = m_GOPList[k].m_temporalId <= - m_GOPList[curGOP].m_temporalId; - } - } - } - } - - if (!found) - { - printf("\nError: ref pic %d is not available for GOP frame %d\n", - m_GOPList[curGOP].m_referencePics[i], - curGOP + 1); - errorGOP = true; - } - } - } - - if (!beforeI && !errorGOP) - { - //all ref frames were present - if (!isOK[curGOP]) - { - numOK++; - isOK[curGOP] = true; - if (numOK == m_iGOPSize) - { - verifiedGOP = true; - } - } - } - else - { - //create a new GOPEntry for this frame containing all the reference pictures that were available (POC > 0) - m_GOPList[m_iGOPSize + m_extraRPSs] = m_GOPList[curGOP]; - Int newRefs = 0; - for (Int i = 0; i < m_GOPList[curGOP].m_numRefPics; i++) - { - Int absPOC = curPOC + m_GOPList[curGOP].m_referencePics[i]; - if (absPOC >= 0) - { - m_GOPList[m_iGOPSize + m_extraRPSs].m_referencePics[newRefs] = m_GOPList[curGOP].m_referencePics[i]; - m_GOPList[m_iGOPSize + m_extraRPSs].m_usedByCurrPic[newRefs] = m_GOPList[curGOP].m_usedByCurrPic[i]; - newRefs++; - } - } - - Int numPrefRefs = m_GOPList[curGOP].m_numRefPicsActive; - - for (Int offset = -1; offset > -checkGOP; offset--) - { - //step backwards in coding order and include any extra available pictures we might find useful to replace the ones with POC < 0. - Int offGOP = (checkGOP - 1 + offset) % m_iGOPSize; - Int offPOC = ((checkGOP - 1 + offset) / m_iGOPSize) * m_iGOPSize + m_GOPList[offGOP].m_POC; - if (offPOC >= 0 && m_GOPList[offGOP].m_temporalId <= m_GOPList[curGOP].m_temporalId) - { - Bool newRef = false; - for (Int i = 0; i < numRefs; i++) - { - if (refList[i] == offPOC) - { - newRef = true; - } - } - - for (Int i = 0; i < newRefs; i++) - { - if (m_GOPList[m_iGOPSize + m_extraRPSs].m_referencePics[i] == offPOC - curPOC) - { - newRef = false; - } - } - - if (newRef) - { - Int insertPoint = newRefs; - //this picture can be added, find appropriate place in list and insert it. - if (m_GOPList[offGOP].m_temporalId == m_GOPList[curGOP].m_temporalId) - { - m_GOPList[offGOP].m_refPic = true; - } - - for (Int j = 0; j < newRefs; j++) - { - if (m_GOPList[m_iGOPSize + m_extraRPSs].m_referencePics[j] < offPOC - curPOC || - m_GOPList[m_iGOPSize + m_extraRPSs].m_referencePics[j] > 0) - { - insertPoint = j; - break; - } - } - - Int prev = offPOC - curPOC; - Int prevUsed = m_GOPList[offGOP].m_temporalId <= m_GOPList[curGOP].m_temporalId; - for (Int j = insertPoint; j < newRefs + 1; j++) - { - Int newPrev = m_GOPList[m_iGOPSize + m_extraRPSs].m_referencePics[j]; - Int newUsed = m_GOPList[m_iGOPSize + m_extraRPSs].m_usedByCurrPic[j]; - m_GOPList[m_iGOPSize + m_extraRPSs].m_referencePics[j] = prev; - m_GOPList[m_iGOPSize + m_extraRPSs].m_usedByCurrPic[j] = prevUsed; - prevUsed = newUsed; - prev = newPrev; - } - - newRefs++; - } - } - - if (newRefs >= numPrefRefs) - { - break; - } - } - - m_GOPList[m_iGOPSize + m_extraRPSs].m_numRefPics = newRefs; - m_GOPList[m_iGOPSize + m_extraRPSs].m_POC = curPOC; - if (m_extraRPSs == 0) - { - m_GOPList[m_iGOPSize + m_extraRPSs].m_interRPSPrediction = 0; - m_GOPList[m_iGOPSize + m_extraRPSs].m_numRefIdc = 0; - } - else - { - Int rIdx = m_iGOPSize + m_extraRPSs - 1; - Int refPOC = m_GOPList[rIdx].m_POC; - Int refPics = m_GOPList[rIdx].m_numRefPics; - Int newIdc = 0; - for (Int i = 0; i <= refPics; i++) - { - Int deltaPOC = ((i != refPics) ? m_GOPList[rIdx].m_referencePics[i] : 0); // check if the reference abs POC is >= 0 - Int absPOCref = refPOC + deltaPOC; - Int refIdc = 0; - for (Int j = 0; j < m_GOPList[m_iGOPSize + m_extraRPSs].m_numRefPics; j++) - { - if ((absPOCref - curPOC) == m_GOPList[m_iGOPSize + m_extraRPSs].m_referencePics[j]) - { - if (m_GOPList[m_iGOPSize + m_extraRPSs].m_usedByCurrPic[j]) - { - refIdc = 1; - } - else - { - refIdc = 2; - } - } - } - - m_GOPList[m_iGOPSize + m_extraRPSs].m_refIdc[newIdc] = refIdc; - newIdc++; - } - - m_GOPList[m_iGOPSize + m_extraRPSs].m_interRPSPrediction = 1; - m_GOPList[m_iGOPSize + m_extraRPSs].m_numRefIdc = newIdc; - m_GOPList[m_iGOPSize + m_extraRPSs].m_deltaRPS = refPOC - m_GOPList[m_iGOPSize + m_extraRPSs].m_POC; - } - - curGOP = m_iGOPSize + m_extraRPSs; - m_extraRPSs++; - } - - numRefs = 0; - for (Int i = 0; i < m_GOPList[curGOP].m_numRefPics; i++) - { - Int absPOC = curPOC + m_GOPList[curGOP].m_referencePics[i]; - if (absPOC >= 0) - { - refList[numRefs] = absPOC; - numRefs++; - } - } - - refList[numRefs] = curPOC; - numRefs++; - } - - checkGOP++; - } - - xConfirmPara(errorGOP, "Invalid GOP structure given"); - m_maxTempLayer = 1; - for (Int i = 0; i < m_iGOPSize; i++) - { - if (m_GOPList[i].m_temporalId >= m_maxTempLayer) - { - m_maxTempLayer = m_GOPList[i].m_temporalId + 1; - } - - xConfirmPara(m_GOPList[i].m_sliceType != 'B' && m_GOPList[i].m_sliceType != 'P', "Slice type must be equal to B or P"); - } - - for (Int i = 0; i < MAX_TLAYER; i++) - { - m_numReorderPics[i] = 0; - m_maxDecPicBuffering[i] = 0; - } - - for (Int i = 0; i < m_iGOPSize; i++) - { - if (m_GOPList[i].m_numRefPics > m_maxDecPicBuffering[m_GOPList[i].m_temporalId]) - { - m_maxDecPicBuffering[m_GOPList[i].m_temporalId] = m_GOPList[i].m_numRefPics; - } - - Int highestDecodingNumberWithLowerPOC = 0; - for (Int j = 0; j < m_iGOPSize; j++) - { - if (m_GOPList[j].m_POC <= m_GOPList[i].m_POC) - { - highestDecodingNumberWithLowerPOC = j; - } - } - - Int numReorder = 0; - for (Int j = 0; j < highestDecodingNumberWithLowerPOC; j++) - { - if (m_GOPList[j].m_temporalId <= m_GOPList[i].m_temporalId && - m_GOPList[j].m_POC > m_GOPList[i].m_POC) - { - numReorder++; - } - } - - if (numReorder > m_numReorderPics[m_GOPList[i].m_temporalId]) - { - m_numReorderPics[m_GOPList[i].m_temporalId] = numReorder; - } - } - - for (Int i = 0; i < MAX_TLAYER - 1; i++) - { - // a lower layer can not have higher value of m_numReorderPics than a higher layer - if (m_numReorderPics[i + 1] < m_numReorderPics[i]) - { - m_numReorderPics[i + 1] = m_numReorderPics[i]; - } - - // the value of num_reorder_pics[ i ] shall be in the range of 0 to max_dec_pic_buffering[ i ], inclusive - if (m_numReorderPics[i] > m_maxDecPicBuffering[i]) - { - m_maxDecPicBuffering[i] = m_numReorderPics[i]; - } - - // a lower layer can not have higher value of m_uiMaxDecPicBuffering than a higher layer - if (m_maxDecPicBuffering[i + 1] < m_maxDecPicBuffering[i]) - { - m_maxDecPicBuffering[i + 1] = m_maxDecPicBuffering[i]; - } - } - - // the value of num_reorder_pics[ i ] shall be in the range of 0 to max_dec_pic_buffering[ i ], inclusive - if (m_numReorderPics[MAX_TLAYER - 1] > m_maxDecPicBuffering[MAX_TLAYER - 1]) - { - m_maxDecPicBuffering[MAX_TLAYER - 1] = m_numReorderPics[MAX_TLAYER - 1]; - } - - if (m_vuiParametersPresentFlag && m_bitstreamRestrictionFlag) - { - Int PicSizeInSamplesY = m_iSourceWidth * m_iSourceHeight; - if (tileFlag) - { - Int maxTileWidth = 0; - Int maxTileHeight = 0; - Int widthInCU = - (m_iSourceWidth % m_uiMaxCUWidth) ? m_iSourceWidth / m_uiMaxCUWidth + 1 : m_iSourceWidth / m_uiMaxCUWidth; - Int heightInCU = - (m_iSourceHeight % m_uiMaxCUHeight) ? m_iSourceHeight / m_uiMaxCUHeight + 1 : m_iSourceHeight / m_uiMaxCUHeight; - if (m_iUniformSpacingIdr) - { - maxTileWidth = m_uiMaxCUWidth * ((widthInCU + m_iNumColumnsMinus1) / (m_iNumColumnsMinus1 + 1)); - maxTileHeight = m_uiMaxCUHeight * ((heightInCU + m_iNumRowsMinus1) / (m_iNumRowsMinus1 + 1)); - // if only the last tile-row is one treeblock higher than the others - // the maxTileHeight becomes smaller if the last row of treeblocks has lower height than the others - if (!((heightInCU - 1) % (m_iNumRowsMinus1 + 1))) - { - maxTileHeight = maxTileHeight - m_uiMaxCUHeight + (m_iSourceHeight % m_uiMaxCUHeight); - } - - // if only the last tile-column is one treeblock wider than the others - // the maxTileWidth becomes smaller if the last column of treeblocks has lower width than the others - if (!((widthInCU - 1) % (m_iNumColumnsMinus1 + 1))) - { - maxTileWidth = maxTileWidth - m_uiMaxCUWidth + (m_iSourceWidth % m_uiMaxCUWidth); - } - } - else // not uniform spacing - { - if (m_iNumColumnsMinus1 < 1) - { - maxTileWidth = m_iSourceWidth; - } - else - { - Int accColumnWidth = 0; - for (Int col = 0; col < (m_iNumColumnsMinus1); col++) - { - maxTileWidth = m_pColumnWidth[col] > maxTileWidth ? m_pColumnWidth[col] : maxTileWidth; - accColumnWidth += m_pColumnWidth[col]; - } - - maxTileWidth = - (widthInCU - - accColumnWidth) > maxTileWidth ? m_uiMaxCUWidth * - (widthInCU - accColumnWidth) : m_uiMaxCUWidth * maxTileWidth; - } - - if (m_iNumRowsMinus1 < 1) - { - maxTileHeight = m_iSourceHeight; - } - else - { - Int accRowHeight = 0; - for (Int row = 0; row < (m_iNumRowsMinus1); row++) - { - maxTileHeight = m_pRowHeight[row] > maxTileHeight ? m_pRowHeight[row] : maxTileHeight; - accRowHeight += m_pRowHeight[row]; - } - - maxTileHeight = - (heightInCU - - accRowHeight) > maxTileHeight ? m_uiMaxCUHeight * - (heightInCU - accRowHeight) : m_uiMaxCUHeight * maxTileHeight; - } - } - - Int maxSizeInSamplesY = maxTileWidth * maxTileHeight; - m_minSpatialSegmentationIdc = 4 * PicSizeInSamplesY / maxSizeInSamplesY - 4; - } - else if (m_iWaveFrontSynchro) - { - m_minSpatialSegmentationIdc = 4 * PicSizeInSamplesY / ((2 * m_iSourceHeight + m_iSourceWidth) * m_uiMaxCUHeight) - 4; - } - else if (m_sliceMode == 1) - { - m_minSpatialSegmentationIdc = 4 * PicSizeInSamplesY / (m_sliceArgument * m_uiMaxCUWidth * m_uiMaxCUHeight) - 4; - } - else - { - m_minSpatialSegmentationIdc = 0; - } - } - - xConfirmPara(m_bUseLComb == false && m_numReorderPics[MAX_TLAYER - 1] != 0, - "ListCombination can only be 0 in low delay coding (more precisely when L0 and L1 are identical)"); // Note however this is not the full necessary condition as ref_pic_list_combination_flag can only be 0 if L0 == L1. - xConfirmPara(m_iWaveFrontSynchro < 0, "WaveFrontSynchro cannot be negative"); - xConfirmPara(m_iWaveFrontSubstreams <= 0, "WaveFrontSubstreams must be positive"); - xConfirmPara(m_iWaveFrontSubstreams > 1 && !m_iWaveFrontSynchro, - "Must have WaveFrontSynchro > 0 in order to have WaveFrontSubstreams > 1"); - - xConfirmPara(m_decodedPictureHashSEIEnabled < 0 || m_decodedPictureHashSEIEnabled > 3, "this hash type is not correct!\n"); - -#if J0149_TONE_MAPPING_SEI - if (m_toneMappingInfoSEIEnabled) - { - xConfirmPara(m_toneMapCodedDataBitDepth < 8 || m_toneMapCodedDataBitDepth > 14, - "SEIToneMapCodedDataBitDepth must be in rage 8 to 14"); - xConfirmPara(m_toneMapTargetBitDepth < 1 || (m_toneMapTargetBitDepth > 16 && m_toneMapTargetBitDepth < 255), - "SEIToneMapTargetBitDepth must be in rage 1 to 16 or equal to 255"); - xConfirmPara(m_toneMapModelId < 0 || m_toneMapModelId > 4, "SEIToneMapModelId must be in rage 0 to 4"); - xConfirmPara(m_cameraIsoSpeedValue == 0, "SEIToneMapCameraIsoSpeedValue shall not be equal to 0"); - xConfirmPara(m_extendedRangeWhiteLevel < 100, "SEIToneMapExtendedRangeWhiteLevel should be greater than or equal to 100"); - xConfirmPara(m_nominalBlackLevelLumaCodeValue >= m_nominalWhiteLevelLumaCodeValue, - "SEIToneMapNominalWhiteLevelLumaCodeValue shall be greater than SEIToneMapNominalBlackLevelLumaCodeValue"); - xConfirmPara( - m_extendedWhiteLevelLumaCodeValue < m_nominalWhiteLevelLumaCodeValue, - "SEIToneMapExtendedWhiteLevelLumaCodeValue shall be greater than or equal to SEIToneMapNominalWhiteLevelLumaCodeValue"); - } - -#endif // if J0149_TONE_MAPPING_SEI - -#if RATE_CONTROL_LAMBDA_DOMAIN - if (m_RCEnableRateControl) - { - if (m_RCForceIntraQP) - { - if (m_RCInitialQP == 0) - { - printf("\nInitial QP for rate control is not specified. Reset not to use force intra QP!"); - m_RCForceIntraQP = false; - } - } - - xConfirmPara(m_uiDeltaQpRD > 0, "Rate control cannot be used together with slice level multiple-QP optimization!\n"); - } - -#else // if RATE_CONTROL_LAMBDA_DOMAIN - if (m_enableRateCtrl) - { - Int numLCUInWidth = (m_iSourceWidth / m_uiMaxCUWidth) + ((m_iSourceWidth % m_uiMaxCUWidth) ? 1 : 0); - Int numLCUInHeight = (m_iSourceHeight / m_uiMaxCUHeight) + ((m_iSourceHeight % m_uiMaxCUHeight) ? 1 : 0); - Int numLCUInPic = numLCUInWidth * numLCUInHeight; - - xConfirmPara((numLCUInPic % m_numLCUInUnit) != 0, - "total number of LCUs in a frame should be completely divided by NumLCUInUnit"); - - m_iMaxDeltaQP = MAX_DELTA_QP; - m_iMaxCuDQPDepth = MAX_CUDQP_DEPTH; - } - -#endif // if RATE_CONTROL_LAMBDA_DOMAIN - - xConfirmPara(!m_TransquantBypassEnableFlag && m_CUTransquantBypassFlagValue, - "CUTransquantBypassFlagValue cannot be 1 when TransquantBypassEnableFlag is 0"); - - xConfirmPara(m_log2ParallelMergeLevel < 2, "Log2ParallelMergeLevel should be larger than or equal to 2"); -#if L0444_FPA_TYPE - if (m_framePackingSEIEnabled) - { - xConfirmPara(m_framePackingSEIType < 3 || m_framePackingSEIType > 5, "SEIFramePackingType must be in rage 3 to 5"); - } - -#endif - -#undef xConfirmPara - if (check_failed) - { - exit(EXIT_FAILURE); - } -} - -/** \todo use of global variables should be removed later - */ -Void TAppEncCfg::xSetGlobal() -{ - // set max CU width & height - g_uiMaxCUWidth = m_uiMaxCUWidth; - g_uiMaxCUHeight = m_uiMaxCUHeight; - - // compute actual CU depth with respect to config depth and max transform size - g_uiAddCUDepth = 0; - while ((m_uiMaxCUWidth >> m_uiMaxCUDepth) > (1 << (m_uiQuadtreeTULog2MinSize + g_uiAddCUDepth))) - { - g_uiAddCUDepth++; - } - - m_uiMaxCUDepth += g_uiAddCUDepth; - g_uiAddCUDepth++; - g_uiMaxCUDepth = m_uiMaxCUDepth; - - // set internal bit-depth and constants - g_bitDepthY = m_internalBitDepthY; - g_bitDepthC = m_internalBitDepthC; - - g_uiPCMBitDepthLuma = m_bPCMInputBitDepthFlag ? m_inputBitDepthY : m_internalBitDepthY; - g_uiPCMBitDepthChroma = m_bPCMInputBitDepthFlag ? m_inputBitDepthC : m_internalBitDepthC; -} - -Void TAppEncCfg::xPrintParameter() -{ - printf("\n"); - printf("Input File : %s\n", m_pchInputFile); - printf("Bitstream File : %s\n", m_pchBitstreamFile); - printf("Reconstruction File : %s\n", m_pchReconFile); - printf("Real Format : %dx%d %dHz\n", - m_iSourceWidth - m_confLeft - m_confRight, - m_iSourceHeight - m_confTop - m_confBottom, - m_iFrameRate); - printf("Internal Format : %dx%d %dHz\n", m_iSourceWidth, m_iSourceHeight, m_iFrameRate); - printf("Frame index : %u - %d (%d frames)\n", - m_FrameSkip, - m_FrameSkip + m_framesToBeEncoded - 1, - m_framesToBeEncoded); - printf("CU size / depth : %d / %d\n", m_uiMaxCUWidth, m_uiMaxCUDepth); - printf("RQT trans. size (min / max) : %d / %d\n", 1 << m_uiQuadtreeTULog2MinSize, 1 << m_uiQuadtreeTULog2MaxSize); - printf("Max RQT depth inter : %d\n", m_uiQuadtreeTUMaxDepthInter); - printf("Max RQT depth intra : %d\n", m_uiQuadtreeTUMaxDepthIntra); - printf("Min PCM size : %d\n", 1 << m_uiPCMLog2MinSize); - printf("Motion search range : %d\n", m_iSearchRange); - printf("Intra period : %d\n", m_iIntraPeriod); - printf("Decoding refresh type : %d\n", m_iDecodingRefreshType); - printf("QP : %5.2f\n", m_fQP); - printf("Max dQP signaling depth : %d\n", m_iMaxCuDQPDepth); - - printf("Cb QP Offset : %d\n", m_cbQpOffset); - printf("Cr QP Offset : %d\n", m_crQpOffset); - - printf("QP adaptation : %d (range=%d)\n", m_bUseAdaptiveQP, (m_bUseAdaptiveQP ? m_iQPAdaptationRange : 0)); - printf("GOP size : %d\n", m_iGOPSize); - printf("Internal bit depth : (Y:%d, C:%d)\n", m_internalBitDepthY, m_internalBitDepthC); - printf("PCM sample bit depth : (Y:%d, C:%d)\n", g_uiPCMBitDepthLuma, g_uiPCMBitDepthChroma); -#if RATE_CONTROL_LAMBDA_DOMAIN - printf("RateControl : %d\n", m_RCEnableRateControl); - if (m_RCEnableRateControl) - { - printf("TargetBitrate : %d\n", m_RCTargetBitrate); - printf("KeepHierarchicalBit : %d\n", m_RCKeepHierarchicalBit); - printf("LCULevelRC : %d\n", m_RCLCULevelRC); - printf("UseLCUSeparateModel : %d\n", m_RCUseLCUSeparateModel); - printf("InitialQP : %d\n", m_RCInitialQP); - printf("ForceIntraQP : %d\n", m_RCForceIntraQP); - } - -#else // if RATE_CONTROL_LAMBDA_DOMAIN - printf("RateControl : %d\n", m_enableRateCtrl); - if (m_enableRateCtrl) - { - printf("TargetBitrate : %d\n", m_targetBitrate); - printf("NumLCUInUnit : %d\n", m_numLCUInUnit); - } - -#endif // if RATE_CONTROL_LAMBDA_DOMAIN - printf("Max Num Merge Candidates : %d\n", m_maxNumMergeCand); - printf("\n"); - - printf("TOOL CFG: "); - printf("IBD:%d ", g_bitDepthY > m_inputBitDepthY || g_bitDepthC > m_inputBitDepthC); - printf("HAD:%d ", m_bUseHADME); - printf("SRD:%d ", m_bUseSBACRD); - printf("RDQ:%d ", m_useRDOQ); - printf("RDQTS:%d ", m_useRDOQTS); -#if L0232_RD_PENALTY - printf("RDpenalty:%d ", m_rdPenalty); -#endif - printf("SQP:%d ", m_uiDeltaQpRD); - printf("ASR:%d ", m_bUseASR); - printf("LComb:%d ", m_bUseLComb); - printf("FEN:%d ", m_bUseFastEnc); - printf("ECU:%d ", m_bUseEarlyCU); - printf("FDM:%d ", m_useFastDecisionForMerge); - printf("CFM:%d ", m_bUseCbfFastMode); - printf("ESD:%d ", m_useEarlySkipDetection); - printf("RQT:%d ", 1); - printf("TransformSkip:%d ", m_useTransformSkip); - printf("TransformSkipFast:%d ", m_useTransformSkipFast); - printf("Slice: M=%d ", m_sliceMode); - if (m_sliceMode != 0) - { - printf("A=%d ", m_sliceArgument); - } - - printf("SliceSegment: M=%d ", m_sliceSegmentMode); - if (m_sliceSegmentMode != 0) - { - printf("A=%d ", m_sliceSegmentArgument); - } - - printf("CIP:%d ", m_bUseConstrainedIntraPred); - printf("SAO:%d ", (m_bUseSAO) ? (1) : (0)); - printf("PCM:%d ", (m_usePCM && (1 << m_uiPCMLog2MinSize) <= m_uiMaxCUWidth) ? 1 : 0); - printf("SAOLcuBasedOptimization:%d ", (m_saoLcuBasedOptimization) ? (1) : (0)); - - printf("LosslessCuEnabled:%d ", (m_useLossless) ? 1 : 0); - printf("WPP:%d ", (Int)m_useWeightedPred); - printf("WPB:%d ", (Int)m_useWeightedBiPred); - printf("PME:%d ", m_log2ParallelMergeLevel); - printf(" WaveFrontSynchro:%d WaveFrontSubstreams:%d", - m_iWaveFrontSynchro, m_iWaveFrontSubstreams); - printf(" ScalingList:%d ", m_useScalingListId); - printf("TMVPMode:%d ", m_TMVPModeId); -#if ADAPTIVE_QP_SELECTION - printf("AQpS:%d", m_bUseAdaptQpSelect); -#endif - - printf(" SignBitHidingFlag:%d ", m_signHideFlag); - printf("RecalQP:%d", m_recalculateQPAccordingToLambda ? 1 : 0); - printf("\n\n"); - - fflush(stdout); -} - -Bool confirmPara(Bool bflag, const Char *message) -{ - if (!bflag) - return false; - - printf("Error: %s\n", message); - return true; -} - -//! \}
--- a/source/Lib/config.h Wed Apr 17 14:09:10 2013 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,354 +0,0 @@ -/* 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-2013, 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 TAppEncCfg.h - \brief Handle encoder configuration parameters (header) -*/ - -#ifndef __TAPPENCCFG__ -#define __TAPPENCCFG__ - -#include "TLibCommon/CommonDef.h" - -#include "TLibEncoder/TEncCfg.h" -#include "TLibVideoIO/TVideoIO.h" -#include "TLibVideoIO/TVideoIOYuv.h" -#include "TLibVideoIO/TVideoIOY4m.h" -#include <sstream> -//! \ingroup TAppEncoder -//! \{ - -// ==================================================================================================================== -// Class definition -// ==================================================================================================================== - -/// encoder configuration class -class TAppEncCfg -{ -protected: - - // file I/O - Char *m_pchInputFile; ///< source file name - Char *m_pchBitstreamFile; ///< output bitstream file - Char *m_pchReconFile; ///< output reconstruction file - Double m_adLambdaModifier[MAX_TLAYER]; ///< Lambda modifier array for each temporal layer - // source specification - Int m_iFrameRate; ///< source frame-rates (Hz) - UInt m_FrameSkip; ///< number of skipped frames from the beginning - Int m_iSourceWidth; ///< source width in pixel - Int m_iSourceHeight; ///< source height in pixel - Int m_conformanceMode; - Int m_confLeft; - Int m_confRight; - Int m_confTop; - Int m_confBottom; - Int m_framesToBeEncoded; ///< number of encoded frames - Int m_aiPad[2]; ///< number of padded pixels for width and height - //Input source file handlers - TVideoIO* m_cTVideoIOInputFile; ///< input file - TVideoIO* m_cTVideoIOReconFile; ///< output reconstruction file - hnd_t* handler_input; - hnd_t* handler_recon; - video_info_t video_info; - - // profile/level - Profile::Name m_profile; - Level::Tier m_levelTier; - Level::Name m_level; -#if L0046_CONSTRAINT_FLAGS - Bool m_progressiveSourceFlag; - Bool m_interlacedSourceFlag; - Bool m_nonPackedConstraintFlag; - Bool m_frameOnlyConstraintFlag; -#endif - - // coding structure - Int m_iIntraPeriod; ///< period of I-slice (random access period) - Int m_iDecodingRefreshType; ///< random access type - Int m_iGOPSize; ///< GOP size of hierarchical structure - Int m_extraRPSs; ///< extra RPSs added to handle CRA - GOPEntry m_GOPList[MAX_GOP]; ///< the coding structure entries from the config file - Int m_numReorderPics[MAX_TLAYER]; ///< total number of reorder pictures - Int m_maxDecPicBuffering[MAX_TLAYER]; ///< total number of reference pictures needed for decoding - Bool m_bUseLComb; ///< flag for using combined reference list for uni-prediction in B-slices (JCTVC-D421) - Bool m_useTransformSkip; ///< flag for enabling intra transform skipping - Bool m_useTransformSkipFast; ///< flag for enabling fast intra transform skipping - Bool m_enableAMP; - // coding quality - Double m_fQP; ///< QP value of key-picture (floating point) - Int m_iQP; ///< QP value of key-picture (integer) - Char *m_pchdQPFile; ///< QP offset for each slice (initialized from external file) - Int *m_aidQP; ///< array of slice QP values - Int m_iMaxDeltaQP; ///< max. |delta QP| - UInt m_uiDeltaQpRD; ///< dQP range for multi-pass slice QP optimization - Int m_iMaxCuDQPDepth; ///< Max. depth for a minimum CuDQPSize (0:default) - - Int m_cbQpOffset; ///< Chroma Cb QP Offset (0:default) - Int m_crQpOffset; ///< Chroma Cr QP Offset (0:default) - -#if ADAPTIVE_QP_SELECTION - Bool m_bUseAdaptQpSelect; -#endif - - Bool m_bUseAdaptiveQP; ///< Flag for enabling QP adaptation based on a psycho-visual model - Int m_iQPAdaptationRange; ///< dQP range by QP adaptation - - Int m_maxTempLayer; ///< Max temporal layer - - // coding unit (CU) definition - UInt m_uiMaxCUWidth; ///< max. CU width in pixel - UInt m_uiMaxCUHeight; ///< max. CU height in pixel - UInt m_uiMaxCUDepth; ///< max. CU depth - - // transfom unit (TU) definition - UInt m_uiQuadtreeTULog2MaxSize; - UInt m_uiQuadtreeTULog2MinSize; - - UInt m_uiQuadtreeTUMaxDepthInter; - UInt m_uiQuadtreeTUMaxDepthIntra; - - // coding tools (bit-depth) - Int m_inputBitDepthY; ///< bit-depth of input file (luma component) - Int m_inputBitDepthC; ///< bit-depth of input file (chroma component) - Int m_outputBitDepthY; ///< bit-depth of output file (luma component) - Int m_outputBitDepthC; ///< bit-depth of output file (chroma component) - Int m_internalBitDepthY; ///< bit-depth codec operates at in luma (input/output files will be converted) - Int m_internalBitDepthC; ///< bit-depth codec operates at in chroma (input/output files will be converted) - - // coding tools (PCM bit-depth) - Bool m_bPCMInputBitDepthFlag; ///< 0: PCM bit-depth is internal bit-depth. 1: PCM bit-depth is input bit-depth. - - // coding tool (lossless) - Bool m_useLossless; ///< flag for using lossless coding - Bool m_bUseSAO; - Int m_maxNumOffsetsPerPic; ///< SAO maximun number of offset per picture - Bool m_saoLcuBoundary; ///< SAO parameter estimation using non-deblocked pixels for LCU bottom and right boundary areas - Bool m_saoLcuBasedOptimization; ///< SAO LCU-based optimization - // coding tools (loop filter) - Bool m_bLoopFilterDisable; ///< flag for using deblocking filter - Bool m_loopFilterOffsetInPPS; ///< offset for deblocking filter in 0 = slice header, 1 = PPS - Int m_loopFilterBetaOffsetDiv2; ///< beta offset for deblocking filter - Int m_loopFilterTcOffsetDiv2; ///< tc offset for deblocking filter - Bool m_DeblockingFilterControlPresent; ///< deblocking filter control present flag in PPS -#if L0386_DB_METRIC - Bool m_DeblockingFilterMetric; ///< blockiness metric in encoder -#endif - - // coding tools (PCM) - Bool m_usePCM; ///< flag for using IPCM - UInt m_pcmLog2MaxSize; ///< log2 of maximum PCM block size - UInt m_uiPCMLog2MinSize; ///< log2 of minimum PCM block size - Bool m_bPCMFilterDisableFlag; ///< PCM filter disable flag - - // coding tools (encoder-only parameters) - Bool m_bUseSBACRD; ///< flag for using RD optimization based on SBAC - Bool m_bUseASR; ///< flag for using adaptive motion search range - Bool m_bUseHADME; ///< flag for using HAD in sub-pel ME - Bool m_useRDOQ; ///< flag for using RD optimized quantization - Bool m_useRDOQTS; ///< flag for using RD optimized quantization for transform skip -#if L0232_RD_PENALTY - Int m_rdPenalty; ///< RD-penalty for 32x32 TU for intra in non-intra slices (0: no RD-penalty, 1: RD-penalty, 2: maximum RD-penalty) -#endif - Int m_iFastSearch; ///< ME mode, 0 = full, 1 = diamond, 2 = PMVFAST - Int m_iSearchRange; ///< ME search range - Int m_bipredSearchRange; ///< ME search range for bipred refinement - Bool m_bUseFastEnc; ///< flag for using fast encoder setting - Bool m_bUseEarlyCU; ///< flag for using Early CU setting - Bool m_useFastDecisionForMerge; ///< flag for using Fast Decision Merge RD-Cost - Bool m_bUseCbfFastMode; ///< flag for using Cbf Fast PU Mode Decision - Bool m_useEarlySkipDetection; ///< flag for using Early SKIP Detection - Int m_sliceMode; ///< 0: no slice limits, 1 : max number of CTBs per slice, 2: max number of bytes per slice, - ///< 3: max number of tiles per slice - Int m_sliceArgument; ///< argument according to selected slice mode - Int m_sliceSegmentMode; ///< 0: no slice segment limits, 1 : max number of CTBs per slice segment, 2: max number of bytes per slice segment, - ///< 3: max number of tiles per slice segment - Int m_sliceSegmentArgument; ///< argument according to selected slice segment mode - - Bool m_bLFCrossSliceBoundaryFlag; ///< 1: filter across slice boundaries 0: do not filter across slice boundaries - Bool m_bLFCrossTileBoundaryFlag; ///< 1: filter across tile boundaries 0: do not filter across tile boundaries - Int m_iUniformSpacingIdr; - Int m_iNumColumnsMinus1; - Char *m_pchColumnWidth; - Int m_iNumRowsMinus1; - Char *m_pchRowHeight; - UInt *m_pColumnWidth; - UInt *m_pRowHeight; - Int m_iWaveFrontSynchro; //< 0: no WPP. >= 1: WPP is enabled, the "Top right" from which inheritance occurs is this LCU offset in the line above the current. - Int m_iWaveFrontSubstreams; //< If iWaveFrontSynchro, this is the number of substreams per frame (dependent tiles) or per tile (independent tiles). - - Bool m_bUseConstrainedIntraPred; ///< flag for using constrained intra prediction - - Int m_decodedPictureHashSEIEnabled; ///< Checksum(3)/CRC(2)/MD5(1)/disable(0) acting on decoded picture hash SEI message - Int m_recoveryPointSEIEnabled; - Int m_bufferingPeriodSEIEnabled; - Int m_pictureTimingSEIEnabled; -#if J0149_TONE_MAPPING_SEI - Bool m_toneMappingInfoSEIEnabled; - Int m_toneMapId; - Bool m_toneMapCancelFlag; - Bool m_toneMapPersistenceFlag; - Int m_toneMapCodedDataBitDepth; - Int m_toneMapTargetBitDepth; - Int m_toneMapModelId; - Int m_toneMapMinValue; - Int m_toneMapMaxValue; - Int m_sigmoidMidpoint; - Int m_sigmoidWidth; - Int m_numPivots; - Int m_cameraIsoSpeedIdc; - Int m_cameraIsoSpeedValue; - Int m_exposureCompensationValueSignFlag; - Int m_exposureCompensationValueNumerator; - Int m_exposureCompensationValueDenomIdc; - Int m_refScreenLuminanceWhite; - Int m_extendedRangeWhiteLevel; - Int m_nominalBlackLevelLumaCodeValue; - Int m_nominalWhiteLevelLumaCodeValue; - Int m_extendedWhiteLevelLumaCodeValue; - Int *m_startOfCodedInterval; - Int *m_codedPivotValue; - Int *m_targetPivotValue; -#endif // if J0149_TONE_MAPPING_SEI - Int m_framePackingSEIEnabled; - Int m_framePackingSEIType; - Int m_framePackingSEIId; - Int m_framePackingSEIQuincunx; - Int m_framePackingSEIInterpretation; - Int m_displayOrientationSEIAngle; - Int m_temporalLevel0IndexSEIEnabled; - Int m_gradualDecodingRefreshInfoEnabled; - Int m_decodingUnitInfoSEIEnabled; -#if L0208_SOP_DESCRIPTION_SEI - Int m_SOPDescriptionSEIEnabled; -#endif -#if K0180_SCALABLE_NESTING_SEI - Int m_scalableNestingSEIEnabled; -#endif - // weighted prediction - Bool m_useWeightedPred; ///< Use of weighted prediction in P slices - Bool m_useWeightedBiPred; ///< Use of bi-directional weighted prediction in B slices - - UInt m_log2ParallelMergeLevel; ///< Parallel merge estimation region - UInt m_maxNumMergeCand; ///< Max number of merge candidates - - Int m_TMVPModeId; - Int m_signHideFlag; -#if RATE_CONTROL_LAMBDA_DOMAIN - Bool m_RCEnableRateControl; ///< enable rate control or not - Int m_RCTargetBitrate; ///< target bitrate when rate control is enabled - Bool m_RCKeepHierarchicalBit; ///< whether keeping hierarchical bit allocation structure or not - Bool m_RCLCULevelRC; ///< true: LCU level rate control; false: picture level rate control - Bool m_RCUseLCUSeparateModel; ///< use separate R-lambda model at LCU level - Int m_RCInitialQP; ///< inital QP for rate control - Bool m_RCForceIntraQP; ///< force all intra picture to use initial QP or not -#else - Bool m_enableRateCtrl; ///< Flag for using rate control algorithm - Int m_targetBitrate; ///< target bitrate - Int m_numLCUInUnit; ///< Total number of LCUs in a frame should be completely divided by the NumLCUInUnit -#endif // if RATE_CONTROL_LAMBDA_DOMAIN - Int m_useScalingListId; ///< using quantization matrix - Char *m_scalingListFile; ///< quantization matrix file name - - Bool m_TransquantBypassEnableFlag; ///< transquant_bypass_enable_flag setting in PPS. - Bool m_CUTransquantBypassFlagValue; ///< if transquant_bypass_enable_flag, the fixed value to use for the per-CU cu_transquant_bypass_flag. - - Bool m_recalculateQPAccordingToLambda; ///< recalculate QP value according to the lambda value - Bool m_useStrongIntraSmoothing; ///< enable strong intra smoothing for 32x32 blocks where the reference samples are flat - Int m_activeParameterSetsSEIEnabled; - - Bool m_vuiParametersPresentFlag; ///< enable generation of VUI parameters - Bool m_aspectRatioInfoPresentFlag; ///< Signals whether aspect_ratio_idc is present - Int m_aspectRatioIdc; ///< aspect_ratio_idc - Int m_sarWidth; ///< horizontal size of the sample aspect ratio - Int m_sarHeight; ///< vertical size of the sample aspect ratio - Bool m_overscanInfoPresentFlag; ///< Signals whether overscan_appropriate_flag is present - Bool m_overscanAppropriateFlag; ///< Indicates whether conformant decoded pictures are suitable for display using overscan - Bool m_videoSignalTypePresentFlag; ///< Signals whether video_format, video_full_range_flag, and colour_description_present_flag are present - Int m_videoFormat; ///< Indicates representation of pictures - Bool m_videoFullRangeFlag; ///< Indicates the black level and range of luma and chroma signals - Bool m_colourDescriptionPresentFlag; ///< Signals whether colour_primaries, transfer_characteristics and matrix_coefficients are present - Int m_colourPrimaries; ///< Indicates chromaticity coordinates of the source primaries - Int m_transferCharacteristics; ///< Indicates the opto-electronic transfer characteristics of the source - Int m_matrixCoefficients; ///< Describes the matrix coefficients used in deriving luma and chroma from RGB primaries - Bool m_chromaLocInfoPresentFlag; ///< Signals whether chroma_sample_loc_type_top_field and chroma_sample_loc_type_bottom_field are present - Int m_chromaSampleLocTypeTopField; ///< Specifies the location of chroma samples for top field - Int m_chromaSampleLocTypeBottomField; ///< Specifies the location of chroma samples for bottom field - Bool m_neutralChromaIndicationFlag; ///< Indicates that the value of all decoded chroma samples is equal to 1<<(BitDepthCr-1) - Bool m_defaultDisplayWindowFlag; ///< Indicates the presence of the default window parameters - Int m_defDispWinLeftOffset; ///< Specifies the left offset from the conformance window of the default window - Int m_defDispWinRightOffset; ///< Specifies the right offset from the conformance window of the default window - Int m_defDispWinTopOffset; ///< Specifies the top offset from the conformance window of the default window - Int m_defDispWinBottomOffset; ///< Specifies the bottom offset from the conformance window of the default window - Bool m_frameFieldInfoPresentFlag; ///< Indicates that pic_struct values are present in picture timing SEI messages - Bool m_pocProportionalToTimingFlag; ///< Indicates that the POC value is proportional to the output time w.r.t. first picture in CVS - Int m_numTicksPocDiffOneMinus1; ///< Number of ticks minus 1 that for a POC difference of one - Bool m_bitstreamRestrictionFlag; ///< Signals whether bitstream restriction parameters are present - Bool m_tilesFixedStructureFlag; ///< Indicates that each active picture parameter set has the same values of the syntax elements related to tiles - Bool m_motionVectorsOverPicBoundariesFlag; ///< Indicates that no samples outside the picture boundaries are used for inter prediction - Int m_minSpatialSegmentationIdc; ///< Indicates the maximum size of the spatial segments in the pictures in the coded video sequence - Int m_maxBytesPerPicDenom; ///< Indicates a number of bytes not exceeded by the sum of the sizes of the VCL NAL units associated with any coded picture - Int m_maxBitsPerMinCuDenom; ///< Indicates an upper bound for the number of bits of coding_unit() data - Int m_log2MaxMvLengthHorizontal; ///< Indicate the maximum absolute value of a decoded horizontal MV component in quarter-pel luma units - Int m_log2MaxMvLengthVertical; ///< Indicate the maximum absolute value of a decoded vertical MV component in quarter-pel luma units - - // internal member functions - Void xSetGlobal(); ///< set global variables - Void xCheckParameter(); ///< check validity of configuration values - Void xPrintParameter(); ///< print configuration values - Void xPrintUsage(); ///< print usage -#if SIGNAL_BITRATE_PICRATE_IN_VPS - Int m_bitRatePicRateMaxTLayers; ///< Indicates max. number of sub-layers for which bit rate is signalled. - Bool *m_bitRateInfoPresentFlag; ///< Indicates whether bit rate information is signalled - Bool *m_picRateInfoPresentFlag; ///< Indicates whether pic rate information is signalled - Int *m_avgBitRate; ///< Indicates avg. bit rate information for various sub-layers - Int *m_maxBitRate; ///< Indicates max. bit rate information for various sub-layers - Int *m_avgPicRate; ///< Indicates avg. picture rate information for various sub-layers - Int *m_constantPicRateIdc; ///< Indicates constant picture rate idc for various sub-layers -#endif -# - -public: - - TAppEncCfg(); - virtual ~TAppEncCfg(); - -public: - - Void create(); ///< create option handling class - Void destroy(); ///< destroy option handling class - Bool parseCfg(Int argc, Char * argv[]); ///< parse configuration file to fill member variables -}; // END CLASS DEFINITION TAppEncCfg - -//! \} - -#endif // __TAPPENCCFG__
--- a/source/Lib/encoder.h Wed Apr 17 14:09:10 2013 +0530 +++ b/source/Lib/encoder.h Wed Apr 17 14:11:17 2013 +0530 @@ -44,7 +44,7 @@ #include "TLibEncoder/TEncTop.h" #include "TLibVideoIO/TVideoIOYuv.h" #include "TLibCommon/AccessUnit.h" -#include "config.h" +#include "x265cfg.h" //! \ingroup TAppEncoder //! \{
--- a/source/encoder/CMakeLists.txt Wed Apr 17 14:09:10 2013 +0530 +++ b/source/encoder/CMakeLists.txt Wed Apr 17 14:11:17 2013 +0530 @@ -14,11 +14,11 @@ add_library(x265 ../../COPYING if(ENABLE_PRIMITIVES) if(ENABLE_PRIMITIVES_VEC) add_subdirectory(vec) - target_link_libraries(x265 VectorPrimitives) + target_link_libraries(x265 PrimitivesVec) endif(ENABLE_PRIMITIVES_VEC) if(ENABLE_PRIMITIVES_ASM) add_subdirectory(x86) - target_link_libraries(x265 AsmPrimitives) + target_link_libraries(x265 PrimitivesASM) endif(ENABLE_PRIMITIVES_ASM) endif(ENABLE_PRIMITIVES)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/source/encoder/butterfly.h Wed Apr 17 14:11:17 2013 +0530 @@ -0,0 +1,152 @@ +/***************************************************************************** + * Copyright (C) 2013 x265 project + * + * Authors: Praveen Kumar Tiwari <praveen@multicorewareinc.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA. + * + * This program is also available under a commercial proprietary license. + * For more information, contact us at licensing@multicorewareinc.com. + *****************************************************************************/ + +#ifndef BUTTERFLY_H +#define BUTTERFLY_H + +const short g_aiT4[4][4] = +{ + { 64, 64, 64, 64 }, + { 83, 36, -36, -83 }, + { 64, -64, -64, 64 }, + { 36, -83, 83, -36 } +}; + +const short g_aiT8[8][8] = +{ + { 64, 64, 64, 64, 64, 64, 64, 64 }, + { 89, 75, 50, 18, -18, -50, -75, -89 }, + { 83, 36, -36, -83, -83, -36, 36, 83 }, + { 75, -18, -89, -50, 50, 89, 18, -75 }, + { 64, -64, -64, 64, 64, -64, -64, 64 }, + { 50, -89, 18, 75, -75, -18, 89, -50 }, + { 36, -83, 83, -36, -36, 83, -83, 36 }, + { 18, -50, 75, -89, 89, -75, 50, -18 } +}; + +const short g_aiT16[16][16] = +{ + { 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 }, + { 90, 87, 80, 70, 57, 43, 25, 9, -9, -25, -43, -57, -70, -80, -87, -90 }, + { 89, 75, 50, 18, -18, -50, -75, -89, -89, -75, -50, -18, 18, 50, 75, 89 }, + { 87, 57, 9, -43, -80, -90, -70, -25, 25, 70, 90, 80, 43, -9, -57, -87 }, + { 83, 36, -36, -83, -83, -36, 36, 83, 83, 36, -36, -83, -83, -36, 36, 83 }, + { 80, 9, -70, -87, -25, 57, 90, 43, -43, -90, -57, 25, 87, 70, -9, -80 }, + { 75, -18, -89, -50, 50, 89, 18, -75, -75, 18, 89, 50, -50, -89, -18, 75 }, + { 70, -43, -87, 9, 90, 25, -80, -57, 57, 80, -25, -90, -9, 87, 43, -70 }, + { 64, -64, -64, 64, 64, -64, -64, 64, 64, -64, -64, 64, 64, -64, -64, 64 }, + { 57, -80, -25, 90, -9, -87, 43, 70, -70, -43, 87, 9, -90, 25, 80, -57 }, + { 50, -89, 18, 75, -75, -18, 89, -50, -50, 89, -18, -75, 75, 18, -89, 50 }, + { 43, -90, 57, 25, -87, 70, 9, -80, 80, -9, -70, 87, -25, -57, 90, -43 }, + { 36, -83, 83, -36, -36, 83, -83, 36, 36, -83, 83, -36, -36, 83, -83, 36 }, + { 25, -70, 90, -80, 43, 9, -57, 87, -87, 57, -9, -43, 80, -90, 70, -25 }, + { 18, -50, 75, -89, 89, -75, 50, -18, -18, 50, -75, 89, -89, 75, -50, 18 }, + { 9, -25, 43, -57, 70, -80, 87, -90, 90, -87, 80, -70, 57, -43, 25, -9 } +}; + +const short g_aiT32[32][32] = +{ + { 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64 }, + { 90, 90, 88, 85, 82, 78, 73, 67, 61, 54, 46, 38, 31, 22, 13, 4, -4, -13, -22, -31, -38, -46, -54, -61, -67, -73, -78, -82, + -85, -88, -90, -90 }, + { 90, 87, 80, 70, 57, 43, 25, 9, -9, -25, -43, -57, -70, -80, -87, -90, -90, -87, -80, -70, -57, -43, -25, -9, 9, 25, 43, + 57, 70, 80, 87, 90 }, + { 90, 82, 67, 46, 22, -4, -31, -54, -73, -85, -90, -88, -78, -61, -38, -13, 13, 38, 61, 78, 88, 90, 85, 73, 54, 31, 4, -22, + -46, -67, -82, -90 }, + { 89, 75, 50, 18, -18, -50, -75, -89, -89, -75, -50, -18, 18, 50, 75, 89, 89, 75, 50, 18, -18, -50, -75, -89, -89, -75, -50, + -18, 18, 50, 75, 89 }, + { 88, 67, 31, -13, -54, -82, -90, -78, -46, -4, 38, 73, 90, 85, 61, 22, -22, -61, -85, -90, -73, -38, 4, 46, 78, 90, 82, 54, + 13, -31, -67, -88 }, + { 87, 57, 9, -43, -80, -90, -70, -25, 25, 70, 90, 80, 43, -9, -57, -87, -87, -57, -9, 43, 80, 90, 70, 25, -25, -70, -90, -80, + -43, 9, 57, 87 }, + { 85, 46, -13, -67, -90, -73, -22, 38, 82, 88, 54, -4, -61, -90, -78, -31, 31, 78, 90, 61, 4, -54, -88, -82, -38, 22, 73, 90, + 67, 13, -46, -85 }, + { 83, 36, -36, -83, -83, -36, 36, 83, 83, 36, -36, -83, -83, -36, 36, 83, 83, 36, -36, -83, -83, -36, 36, 83, 83, 36, -36, + -83, -83, -36, 36, 83 }, + { 82, 22, -54, -90, -61, 13, 78, 85, 31, -46, -90, -67, 4, 73, 88, 38, -38, -88, -73, -4, 67, 90, 46, -31, -85, -78, -13, 61, + 90, 54, -22, -82 }, + { 80, 9, -70, -87, -25, 57, 90, 43, -43, -90, -57, 25, 87, 70, -9, -80, -80, -9, 70, 87, 25, -57, -90, -43, 43, 90, 57, -25, + -87, -70, 9, 80 }, + { 78, -4, -82, -73, 13, 85, 67, -22, -88, -61, 31, 90, 54, -38, -90, -46, 46, 90, 38, -54, -90, -31, 61, 88, 22, -67, -85, + -13, 73, 82, 4, -78 }, + { 75, -18, -89, -50, 50, 89, 18, -75, -75, 18, 89, 50, -50, -89, -18, 75, 75, -18, -89, -50, 50, 89, 18, -75, -75, 18, 89, 50, + -50, -89, -18, 75 }, + { 73, -31, -90, -22, 78, 67, -38, -90, -13, 82, 61, -46, -88, -4, 85, 54, -54, -85, 4, 88, 46, -61, -82, 13, 90, 38, -67, + -78, 22, 90, 31, -73 }, + { 70, -43, -87, 9, 90, 25, -80, -57, 57, 80, -25, -90, -9, 87, 43, -70, -70, 43, 87, -9, -90, -25, 80, 57, -57, -80, 25, 90, + 9, -87, -43, 70 }, + { 67, -54, -78, 38, 85, -22, -90, 4, 90, 13, -88, -31, 82, 46, -73, -61, 61, 73, -46, -82, 31, 88, -13, -90, -4, 90, 22, -85, + -38, 78, 54, -67 }, + { 64, -64, -64, 64, 64, -64, -64, 64, 64, -64, -64, 64, 64, -64, -64, 64, 64, -64, -64, 64, 64, -64, -64, 64, 64, -64, -64, + 64, 64, -64, -64, 64 }, + { 61, -73, -46, 82, 31, -88, -13, 90, -4, -90, 22, 85, -38, -78, 54, 67, -67, -54, 78, 38, -85, -22, 90, 4, -90, 13, 88, -31, + -82, 46, 73, -61 }, + { 57, -80, -25, 90, -9, -87, 43, 70, -70, -43, 87, 9, -90, 25, 80, -57, -57, 80, 25, -90, 9, 87, -43, -70, 70, 43, -87, -9, + 90, -25, -80, 57 }, + { 54, -85, -4, 88, -46, -61, 82, 13, -90, 38, 67, -78, -22, 90, -31, -73, 73, 31, -90, 22, 78, -67, -38, 90, -13, -82, 61, 46, + -88, 4, 85, -54 }, + { 50, -89, 18, 75, -75, -18, 89, -50, -50, 89, -18, -75, 75, 18, -89, 50, 50, -89, 18, 75, -75, -18, 89, -50, -50, 89, -18, + -75, 75, 18, -89, 50 }, + { 46, -90, 38, 54, -90, 31, 61, -88, 22, 67, -85, 13, 73, -82, 4, 78, -78, -4, 82, -73, -13, 85, -67, -22, 88, -61, -31, 90, + -54, -38, 90, -46 }, + { 43, -90, 57, 25, -87, 70, 9, -80, 80, -9, -70, 87, -25, -57, 90, -43, -43, 90, -57, -25, 87, -70, -9, 80, -80, 9, 70, -87, + 25, 57, -90, 43 }, + { 38, -88, 73, -4, -67, 90, -46, -31, 85, -78, 13, 61, -90, 54, 22, -82, 82, -22, -54, 90, -61, -13, 78, -85, 31, 46, -90, 67, + 4, -73, 88, -38 }, + { 36, -83, 83, -36, -36, 83, -83, 36, 36, -83, 83, -36, -36, 83, -83, 36, 36, -83, 83, -36, -36, 83, -83, 36, 36, -83, 83, + -36, -36, 83, -83, 36 }, + { 31, -78, 90, -61, 4, 54, -88, 82, -38, -22, 73, -90, 67, -13, -46, 85, -85, 46, 13, -67, 90, -73, 22, 38, -82, 88, -54, -4, + 61, -90, 78, -31 }, + { 25, -70, 90, -80, 43, 9, -57, 87, -87, 57, -9, -43, 80, -90, 70, -25, -25, 70, -90, 80, -43, -9, 57, -87, 87, -57, 9, 43, + -80, 90, -70, 25 }, + { 22, -61, 85, -90, 73, -38, -4, 46, -78, 90, -82, 54, -13, -31, 67, -88, 88, -67, 31, 13, -54, 82, -90, 78, -46, 4, 38, -73, + 90, -85, 61, -22 }, + { 18, -50, 75, -89, 89, -75, 50, -18, -18, 50, -75, 89, -89, 75, -50, 18, 18, -50, 75, -89, 89, -75, 50, -18, -18, 50, -75, + 89, -89, 75, -50, 18 }, + { 13, -38, 61, -78, 88, -90, 85, -73, 54, -31, 4, 22, -46, 67, -82, 90, -90, 82, -67, 46, -22, -4, 31, -54, 73, -85, 90, -88, + 78, -61, 38, -13 }, + { 9, -25, 43, -57, 70, -80, 87, -90, 90, -87, 80, -70, 57, -43, 25, -9, -9, 25, -43, 57, -70, 80, -87, 90, -90, 87, -80, 70, + -57, 43, -25, 9 }, + { 4, -13, 22, -31, 38, -46, 54, -61, 67, -73, 78, -82, 85, -88, 90, -90, 90, -90, 88, -85, 82, -78, 73, -67, 61, -54, 46, + -38, 31, -22, 13, -4 } +}; + +const unsigned char g_aucChromaScale[58] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 29, 30, 31, 32, + 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51 +}; + +// Mode-Dependent DCT/DST +const short g_as_DST_MAT_4[4][4] = +{ + { 29, 55, 74, 84 }, + { 74, 74, 0, -74 }, + { 84, -29, -74, 55 }, + { 55, -84, 74, -29 }, +}; + +#endif // ifndef BUTTERFLY_H
--- a/source/encoder/macroblock.cpp Wed Apr 17 14:09:10 2013 +0530 +++ b/source/encoder/macroblock.cpp Wed Apr 17 14:11:17 2013 +0530 @@ -26,6 +26,7 @@ #include "primitives.h" #include "Lib/TLibCommon/CommonDef.h" +#include "butterfly.h" #include <algorithm> /* Used for filter */ @@ -49,22 +50,22 @@ void CDECL inversedst(short *tmp, short c[2] = tmp[i] - tmp[12 + i]; c[3] = 74 * tmp[4 + i]; - block[4 * i + 0] = (short) Clip3(-32768, 32767, (29 * c[0] + 55 * c[1] + c[3] + rnd_factor) >> shift); - block[4 * i + 1] = (short) Clip3(-32768, 32767, (55 * c[2] - 29 * c[1] + c[3] + rnd_factor) >> shift); - block[4 * i + 2] = (short) Clip3(-32768, 32767, (74 * (tmp[i] - tmp[8 + i] + tmp[12 + i]) + rnd_factor) >> shift); - block[4 * i + 3] = (short) Clip3(-32768, 32767, (55 * c[0] + 29 * c[2] - c[3] + rnd_factor) >> shift); + block[4 * i + 0] = (short)Clip3(-32768, 32767, (29 * c[0] + 55 * c[1] + c[3] + rnd_factor) >> shift); + block[4 * i + 1] = (short)Clip3(-32768, 32767, (55 * c[2] - 29 * c[1] + c[3] + rnd_factor) >> shift); + block[4 * i + 2] = (short)Clip3(-32768, 32767, (74 * (tmp[i] - tmp[8 + i] + tmp[12 + i]) + rnd_factor) >> shift); + block[4 * i + 3] = (short)Clip3(-32768, 32767, (55 * c[0] + 29 * c[2] - c[3] + rnd_factor) >> shift); } } template<int N, bool isFirst, bool isLast> void CDECL filter_8_nonvertical(const short *coeff, - pixel *src, - int srcStride, - pixel *dst, - int dstStride, - int block_width, - int block_height, - int bitDepth) + pixel * src, + int srcStride, + pixel * dst, + int dstStride, + int block_width, + int block_height, + int bitDepth) { int row, col; short c[8]; @@ -117,7 +118,7 @@ void CDECL filter_8_nonvertical(const sh { for (col = 0; col < block_width; col++) { - int sum; + short sum; sum = src[col + 0] * c[0]; sum += src[col + 1] * c[1]; if (N >= 4) @@ -156,6 +157,59 @@ void CDECL filter_8_nonvertical(const sh #pragma warning(default: 4127) // conditional expression is constant #endif } + +void CDECL partialButterfly16(short *src, short *dst, int shift, int line) +{ + int j, k; + int E[8], O[8]; + int EE[4], EO[4]; + int EEE[2], EEO[2]; + int add = 1 << (shift - 1); + + for (j = 0; j < line; j++) + { + /* E and O */ + for (k = 0; k < 8; k++) + { + E[k] = src[k] + src[15 - k]; + O[k] = src[k] - src[15 - k]; + } + + /* EE and EO */ + for (k = 0; k < 4; k++) + { + EE[k] = E[k] + E[7 - k]; + EO[k] = E[k] - E[7 - k]; + } + + /* EEE and EEO */ + EEE[0] = EE[0] + EE[3]; + EEO[0] = EE[0] - EE[3]; + EEE[1] = EE[1] + EE[2]; + EEO[1] = EE[1] - EE[2]; + + dst[0] = (short)((g_aiT16[0][0] * EEE[0] + g_aiT16[0][1] * EEE[1] + add) >> shift); + dst[8 * line] = (short)((g_aiT16[8][0] * EEE[0] + g_aiT16[8][1] * EEE[1] + add) >> shift); + dst[4 * line] = (short)((g_aiT16[4][0] * EEO[0] + g_aiT16[4][1] * EEO[1] + add) >> shift); + dst[12 * line] = (short)((g_aiT16[12][0] * EEO[0] + g_aiT16[12][1] * EEO[1] + add) >> shift); + + for (k = 2; k < 16; k += 4) + { + dst[k * line] = (short)((g_aiT16[k][0] * EO[0] + g_aiT16[k][1] * EO[1] + g_aiT16[k][2] * EO[2] + + g_aiT16[k][3] * EO[3] + add) >> shift); + } + + for (k = 1; k < 16; k += 2) + { + dst[k * line] = (short)((g_aiT16[k][0] * O[0] + g_aiT16[k][1] * O[1] + g_aiT16[k][2] * O[2] + g_aiT16[k][3] * O[3] + + g_aiT16[k][4] * O[4] + g_aiT16[k][5] * O[5] + g_aiT16[k][6] * O[6] + g_aiT16[k][7] * O[7] + + add) >> shift); + } + + src += 16; + dst++; + } +} } namespace x265 { @@ -174,5 +228,7 @@ void Setup_C_MacroblockPrimitives(Encode p.filter[FILTER_H_8_0_1] = filter_8_nonvertical<8, 0, 1>; p.filter[FILTER_H_8_1_0] = filter_8_nonvertical<8, 1, 0>; p.filter[FILTER_H_8_1_1] = filter_8_nonvertical<8, 1, 1>; + + p.partial_butterfly[BUTTERFLY_16] = partialButterfly16; } }
--- a/source/encoder/primitives.h Wed Apr 17 14:09:10 2013 +0530 +++ b/source/encoder/primitives.h Wed Apr 17 14:11:17 2013 +0530 @@ -112,6 +112,19 @@ enum FilterConf NUM_FILTER }; +enum Butterflies +{ + BUTTERFLY_4, + BUTTERFLY_INVERSE_4, + BUTTERFLY_8, + BUTTERFLY_INVERSE_8, + BUTTERFLY_16, + BUTTERFLY_INVERSE_16, + BUTTERFLY_32, + BUTTERFLY_INVERSE_32, + NUM_BUTTERFLIES +}; + // Returns a Partitions enum if the size matches a supported performance primitive, // else returns -1 (in which case you should use the slow path) int PartitionFromSizes(int Width, int Height); @@ -120,6 +133,7 @@ typedef int (CDECL * pixelcmp)(pixel *fe typedef void (CDECL * mbdst)(short *block, short *coeff, int shift); typedef void (CDECL * IPFilter)(const short *coeff, pixel *src, int srcStride, pixel *dst, int dstStride, int block_width, int block_height, int bitDepth); +typedef void (CDECL * butterfly)(short *src, short *dst, int shift, int line); /* Define a structure containing function pointers to optimized encoder * primitives. Each pointer can reference either an assembly routine, @@ -133,6 +147,7 @@ struct EncoderPrimitives pixelcmp sa8d_16x16; IPFilter filter[NUM_FILTER]; mbdst inversedst; + butterfly partial_butterfly[NUM_BUTTERFLIES]; }; /* This copy of the table is what gets used by all by the encoder.
--- a/source/encoder/vec/CMakeLists.txt Wed Apr 17 14:09:10 2013 +0530 +++ b/source/encoder/vec/CMakeLists.txt Wed Apr 17 14:11:17 2013 +0530 @@ -20,5 +20,5 @@ endif(GCC) file(GLOB VECTORCLASS ../../VectorClass/*.h ../../VectorClass/special/*.h) source_group(VectorClass FILES ${VECTORCLASS}) -add_library(VectorPrimitives vec-primitives.cpp ${PRIMITIVES} ${VECTORCLASS} +add_library(PrimitivesVec vec-primitives.cpp ${PRIMITIVES} ${VECTORCLASS} vecprimitives.inc pixel.inc macroblock.inc)
--- a/source/encoder/vec/macroblock.inc Wed Apr 17 14:09:10 2013 +0530 +++ b/source/encoder/vec/macroblock.inc Wed Apr 17 14:11:17 2013 +0530 @@ -122,6 +122,130 @@ void CDECL filter_Horizontal_8(const sho } } +void CDECL partialButterfly16(short *src, short *dst, int shift, int line) +{ + int j; + int add = 1 << (shift - 1); + + Vec4i g_aiT_zero_row(64, 64, 0, 0); + Vec4i g_aiT_four_row(83, 36, 0, 0); + Vec4i g_aiT_eight_row(64, -64, 0, 0); + Vec4i g_aiT_twelve_row(36, -83, 0, 0); + + Vec4i g_aiT_two_row(89, 75, 50, 18); + Vec4i g_aiT_six_row(75, -18, -89, -50); + Vec4i g_aiT_ten_row(50, -89, 18, 75); + Vec4i g_aiT_fourteen_row(18, -50, 75, -89); + + Vec8i g_aiT_one_row(90, 87, 80, 70, 57, 43, 25, 9); + Vec8i g_aiT_three_row(87, 57, 9, -43, -80, -90, -70, -25); + Vec8i g_aiT_five_row(80, 9, -70, -87, -25, 57, 90, 43); + Vec8i g_aiT_seven_row(70, -43, -87, 9, 90, 25, -80, -57); + Vec8i g_aiT_nine_row(57, -80, -25, 90, -9, -87, 43, 70); + Vec8i g_aiT_eleven_row(43, -90, 57, 25, -87, 70, 9, -80); + Vec8i g_aiT_thirteen_row(25, -70, 90, -80, 43, 9, -57, 87); + Vec8i g_aiT_fifteen_row(9, -25, 43, -57, 70, -80, 87, -90); + + for (j = 0; j < line; j++) + { + Vec16s tmp1; + tmp1.load(src); + Vec8i src_first_half = extend_low(tmp1); + Vec8i src_second_half_tmp = extend_high(tmp1); + Vec8i src_second_half = permute8i<15, 14, 13, 12, 11, 10, 9, 8>(src_second_half_tmp); + + Vec8i E = src_first_half + src_second_half; + Vec8i O = src_first_half - src_second_half; + + Vec4i E_first_half; + E_first_half = E.get_low(); + Vec4i E_second_half_tmp = E.get_high(); + Vec4i E_second_half = permute4i<7, 6, 5, 4>(E_second_half_tmp); + + Vec4i EE = E_first_half + E_second_half; + Vec4i EO = E_first_half - E_second_half; + + Vec4i EE_first_half = permute4i<0, 1, -1, -1>(EE); + Vec4i EE_second_half = permute4i<3, 2, -1, -1>(EE); + + Vec4i EEE = EE_first_half + EE_second_half; + Vec4i EEO = EE_first_half - EE_second_half; + + Vec4i dst_tmp0 = g_aiT_zero_row * EEE; + Vec4i dst_tmp4 = g_aiT_four_row * EEO; + Vec4i dst_tmp8 = g_aiT_eight_row * EEE; + Vec4i dst_tmp12 = g_aiT_twelve_row * EEO; + + int dst_zero = horizontal_add(dst_tmp0); + int dst_four = horizontal_add(dst_tmp4); + int dst_eight = horizontal_add(dst_tmp8); + int dst_twelve = horizontal_add(dst_tmp12); + + Vec4i dst_0_8_4_12(dst_zero, dst_eight, dst_four, dst_twelve); + + Vec4i dst_result = dst_0_8_4_12 + add; + Vec4i dst_shift_result = dst_result >> shift; + + dst[0] = dst_shift_result[0]; + dst[8 * line] = dst_shift_result[1]; + dst[4 * line] = dst_shift_result[2]; + dst[12 * line] = dst_shift_result[3]; + + Vec4i dst_tmp2 = g_aiT_two_row * EO; + Vec4i dst_tmp6 = g_aiT_six_row * EO; + Vec4i dst_tmp10 = g_aiT_ten_row * EO; + Vec4i dst_tmp14 = g_aiT_fourteen_row * EO; + + int dst_two = horizontal_add(dst_tmp2); + int dst_six = horizontal_add(dst_tmp6); + int dst_ten = horizontal_add(dst_tmp10); + int dst_fourteen = horizontal_add(dst_tmp14); + + Vec4i dst_2_6_10_14(dst_two, dst_six, dst_ten, dst_fourteen); + dst_2_6_10_14 = dst_2_6_10_14 + add; + dst_2_6_10_14 = dst_2_6_10_14 >> shift; + + dst[2 * line] = dst_2_6_10_14[0]; + dst[6 * line] = dst_2_6_10_14[1]; + dst[10 * line] = dst_2_6_10_14[2]; + dst[14 * line] = dst_2_6_10_14[3]; + + Vec8i dst_tmp1 = g_aiT_one_row * O; + Vec8i dst_tmp3 = g_aiT_three_row * O; + Vec8i dst_tmp5 = g_aiT_five_row * O; + Vec8i dst_tmp7 = g_aiT_seven_row * O; + Vec8i dst_tmp9 = g_aiT_nine_row * O; + Vec8i dst_tmp11 = g_aiT_eleven_row * O; + Vec8i dst_tmp13 = g_aiT_thirteen_row * O; + Vec8i dst_tmp15 = g_aiT_fifteen_row * O; + + int dst_one = horizontal_add(dst_tmp1); + int dst_three = horizontal_add(dst_tmp3); + int dst_five = horizontal_add(dst_tmp5); + int dst_seven = horizontal_add(dst_tmp7); + int dst_nine = horizontal_add(dst_tmp9); + int dst_eleven = horizontal_add(dst_tmp11); + int dst_thirteen = horizontal_add(dst_tmp13); + int dst_fifteen = horizontal_add(dst_tmp15); + + Vec8i dst_1_2_5_7_9_11_13_15(dst_one, dst_three, dst_five, dst_seven, dst_nine, dst_eleven, dst_thirteen, dst_fifteen); + dst_1_2_5_7_9_11_13_15 = dst_1_2_5_7_9_11_13_15 + add; + dst_1_2_5_7_9_11_13_15 = dst_1_2_5_7_9_11_13_15 >> shift; + + dst[1 * line] = dst_1_2_5_7_9_11_13_15[0]; + dst[3 * line] = dst_1_2_5_7_9_11_13_15[1]; + dst[5 * line] = dst_1_2_5_7_9_11_13_15[2]; + dst[7 * line] = dst_1_2_5_7_9_11_13_15[3]; + dst[9 * line] = dst_1_2_5_7_9_11_13_15[4]; + dst[11 * line] = dst_1_2_5_7_9_11_13_15[5]; + dst[13 * line] = dst_1_2_5_7_9_11_13_15[6]; + dst[15 * line] = dst_1_2_5_7_9_11_13_15[7]; + + src += 16; + dst++; + } +} + void Setup_Vec_MacroblockPrimitives(EncoderPrimitives &p) { p.inversedst = inversedst; @@ -132,7 +256,10 @@ void Setup_Vec_MacroblockPrimitives(Enco p.filter[FILTER_H_4_1_1] = filter_Horizontal_4< 1, 1>;*/ p.filter[FILTER_H_8_0_0] = filter_Horizontal_8<0, 0>; - p.filter[FILTER_H_8_0_1] = filter_Horizontal_8<0, 1>; + p.filter[FILTER_H_8_0_1] = filter_Horizontal_8<0, 1>; p.filter[FILTER_H_8_1_0] = filter_Horizontal_8<1, 0>; p.filter[FILTER_H_8_1_1] = filter_Horizontal_8<1, 1>; + + p.partial_butterfly[BUTTERFLY_16] = partialButterfly16; } +
--- a/source/encoder/x86/CMakeLists.txt Wed Apr 17 14:09:10 2013 +0530 +++ b/source/encoder/x86/CMakeLists.txt Wed Apr 17 14:11:17 2013 +0530 @@ -4,9 +4,35 @@ else() add_definitions(-DHAVE_ALIGNED_STACK=0) endif() -if (NOT X64) - set(EXTRAS pixel-32.asm) +if(MSVC) + # this is horrible. ugly, and hacky, and it reproduces logic found + # in the yasm CMake modules, but this is required because of this cmake bug + # http://www.cmake.org/Bug/print_bug_page.php?bug_id=8170 + set(ASMS pixel-a) + if (X64) + set(FLAGS -f win64 -m amd64 -DARCH_X86_64=1 -DHAVE_ALIGNED_STACK=0) + else() + set(FLAGS -f win32 -DARCH_X86_64=0 -DHAVE_ALIGNED_STACK=0) + set(ASMS ${ASMS} pixel-32) + endif() + if (HIGH_BIT_DEPTH) + set(FLAGS ${FLAGS} -DHIGH_BIT_DEPTH=1 -DBIT_DEPTH=10) + else() + set(FLAGS ${FLAGS} -DHIGH_BIT_DEPTH=0 -DBIT_DEPTH=8) + endif() + foreach(ASM ${ASMS}) + set(OBJS ${OBJS} ${ASM}.o) + add_custom_command( + OUTPUT ${ASM}.o + COMMAND ${YASM_EXECUTABLE} ARGS ${FLAGS} ${CMAKE_CURRENT_SOURCE_DIR}/${ASM}.asm -o ${ASM}.o + DEPENDS ${ASM}.asm) + endforeach() + add_library(PrimitivesASM asm-primitives.cpp ${OBJS}) +else() + enable_language(ASM_YASM) + set(ASMS pixel-a.asm) + if (NOT X64) + set(ASMS ${ASMS} pixel-32.asm) + endif() + add_library(PrimitivesASM asm-primitives.cpp ${ASMS}) endif() - -enable_language(ASM_YASM) -add_library(AsmPrimitives asm-primitives.cpp ${EXTRAS} pixel-a.asm)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/source/input/CMakeLists.txt Wed Apr 17 14:11:17 2013 +0530 @@ -0,0 +1,4 @@ +add_library(InputFiles + input.cpp input.h + y4m.cpp y4m.h + yuv.cpp yuv.h)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/source/input/input.cpp Wed Apr 17 14:11:17 2013 +0530 @@ -0,0 +1,38 @@ +/***************************************************************************** + * Copyright (C) 2013 x265 project + * + * Authors: Steve Borho <steve@borho.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA. + * + * This program is also available under a commercial proprietary license. + * For more information, contact us at licensing@multicorewareinc.com. + *****************************************************************************/ + +#include "input.h" +#include "yuv.h" +#include "y4m.h" +#include <string.h> + +using namespace x265; + +Input* Input::Open(const char *filename) +{ + const char * s = strrchr(filename, '.'); + if (s && !strcmp(s, ".y4m")) + return new Y4MInput(filename); + else + return new YUVInput(filename); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/source/input/input.h Wed Apr 17 14:11:17 2013 +0530 @@ -0,0 +1,82 @@ +/***************************************************************************** + * Copyright (C) 2013 x265 project + * + * Authors: Steve Borho <steve@borho.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA. + * + * This program is also available under a commercial proprietary license. + * For more information, contact us at licensing@multicorewareinc.com. + *****************************************************************************/ + +#ifndef _INPUT_H_ +#define _INPUT_H_ + +#include <stdint.h> +#include <TLibCommon/TypeDef.h> + +namespace x265 { + +struct Picture +{ + void *planes[3]; + + int stride[3]; + + int bitDepth; + + ChromaFormat csp; +}; + +class Input +{ +protected: + + virtual ~Input() {} + +public: + + Input() {} + + static Input* Open(const char *filename); + + virtual void setDimensions(int width, int height) = 0; + + virtual void setRate(int numerator, int denominator) = 0; + + virtual void setBitDepth(int bitDepth) = 0; + + virtual float getRate() const = 0; + + virtual int getWidth() const = 0; + + virtual int getHeight() const = 0; + + virtual void release() = 0; + + virtual void skipFrames(int numFrames) = 0; + + virtual bool readPicture(Picture& pic) = 0; + + virtual bool isEof() const = 0; + + virtual bool isFail() const = 0; + + virtual int guessFrameCount() const = 0; +}; + +} + +#endif // _INPUT_H_
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/source/input/y4m.cpp Wed Apr 17 14:11:17 2013 +0530 @@ -0,0 +1,59 @@ +/***************************************************************************** + * Copyright (C) 2013 x265 project + * + * Authors: Steve Borho <steve@borho.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA. + * + * This program is also available under a commercial proprietary license. + * For more information, contact us at licensing@multicorewareinc.com. + *****************************************************************************/ + +#include "y4m.h" +#include <stdio.h> + +using namespace x265; + +Y4MInput::Y4MInput(const char *filename) +{ + fp = fopen(filename, "rb"); + + if (fp) + parseHeader(); +} + +Y4MInput::~Y4MInput() +{ + if (fp) fclose(fp); +} + +void Y4MInput::parseHeader() +{ +} + +int Y4MInput::guessFrameCount() const +{ + return 0; +} + +void Y4MInput::skipFrames(int numFrames) +{ + +} + +bool Y4MInput::readPicture(Picture& pic) +{ + return false; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/source/input/y4m.h Wed Apr 17 14:11:17 2013 +0530 @@ -0,0 +1,83 @@ +/***************************************************************************** + * Copyright (C) 2013 x265 project + * + * Authors: Steve Borho <steve@borho.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA. + * + * This program is also available under a commercial proprietary license. + * For more information, contact us at licensing@multicorewareinc.com. + *****************************************************************************/ + +#ifndef _Y4M_H_ +#define _Y4M_H_ + +#include "input.h" +#include <stdio.h> + +namespace x265 { + +class Y4MInput : public Input +{ +protected: + + int rateNum; + + int rateDenom; + + int width; + + int height; + + FILE *fp; + + bool eof; + + void parseHeader(); + +public: + + Y4MInput(const char *filename); + + virtual ~Y4MInput(); + + void setDimensions(int w, int h) { /* ignore, warn */ } + + void setRate(int numerator, int denominator) { /* ignore, warn */ } + + void setBitDepth(int bitDepth) { /* ignore, warn */ } + + float getRate() const { return ((float) rateNum)/rateDenom; } + + int getWidth() const { return width; } + + int getHeight() const { return height; } + + bool isEof() const { return eof; } + + bool isFail() const { return !!fp; } + + void release() { delete this; } + + int guessFrameCount() const; + + void skipFrames(int numFrames); + + bool readPicture(Picture&); +}; + +} + +#endif // _Y4M_H_
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/source/input/yuv.cpp Wed Apr 17 14:11:17 2013 +0530 @@ -0,0 +1,56 @@ +/***************************************************************************** + * Copyright (C) 2013 x265 project + * + * Authors: Steve Borho <steve@borho.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA. + * + * This program is also available under a commercial proprietary license. + * For more information, contact us at licensing@multicorewareinc.com. + *****************************************************************************/ + +#include <fcntl.h> +#include <assert.h> +#include <sys/stat.h> + +#include "input.h" +#include "yuv.h" + +using namespace x265; + +YUVInput::YUVInput(const char *filename) +{ + fp = fopen(filename, "rb"); +} + +YUVInput::~YUVInput() +{ + if (fp) fclose(fp); +} + +int YUVInput::guessFrameCount() const +{ + return 0; +} + +void YUVInput::skipFrames(int numFrames) +{ + +} + +bool YUVInput::readPicture(Picture& pic) +{ + return false; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/source/input/yuv.h Wed Apr 17 14:11:17 2013 +0530 @@ -0,0 +1,83 @@ +/***************************************************************************** + * Copyright (C) 2013 x265 project + * + * Authors: Steve Borho <steve@borho.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA. + * + * This program is also available under a commercial proprietary license. + * For more information, contact us at licensing@multicorewareinc.com. + *****************************************************************************/ + +#ifndef _YUV_H_ +#define _YUV_H_ + +#include "input.h" +#include <stdio.h> + +namespace x265 { + +class YUVInput : public Input +{ +protected: + + int rateNum; + + int rateDenom; + + int width; + + int height; + + int depth; + + FILE *fp; + + bool eof; + +public: + + YUVInput(const char *filename); + + virtual ~YUVInput(); + + void setDimensions(int w, int h) { width = w; height = h; } + + void setRate(int numerator, int denominator) { rateNum = numerator; rateDenom = denominator; } + + void setBitDepth(int bitDepth) { depth = bitDepth; } + + float getRate() const { return ((float) rateNum)/rateDenom; } + + int getWidth() const { return width; } + + int getHeight() const { return height; } + + bool isEof() const { return eof; } + + bool isFail() const { return !!fp; } + + void release() { if (fp) fclose(fp); delete this; } + + int guessFrameCount() const; + + void skipFrames(int numFrames); + + bool readPicture(Picture&); +}; + +} + +#endif // _YUV_H_
--- a/source/test/CMakeLists.txt Wed Apr 17 14:09:10 2013 +0530 +++ b/source/test/CMakeLists.txt Wed Apr 17 14:11:17 2013 +0530 @@ -8,8 +8,11 @@ if(ENABLE_PPA) endif(UNIX) endif(ENABLE_PPA) -add_executable(PoolTest testpool.cpp) -target_link_libraries(PoolTest x265 HM ${PLATFORM_LIBS}) +option(ENABLE_TEST_THREADPOOL "Enable thread pool unit test" OFF) +if(ENABLE_TEST_THREADPOOL) + add_executable(PoolTest testpool.cpp) + target_link_libraries(PoolTest x265 HM ${PLATFORM_LIBS}) +endif() if(MSVC) # these should be cleaned up so the test bench compiles clean for
--- a/source/test/filterharness.cpp Wed Apr 17 14:09:10 2013 +0530 +++ b/source/test/filterharness.cpp Wed Apr 17 14:11:17 2013 +0530 @@ -1,185 +1,185 @@ -/***************************************************************************** - * Copyright (C) 2013 x265 project - * - * Authors: Steve Borho <steve@borho.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA. - * - * This program is also available under a commercial proprietary license. - * For more information, contact us at licensing@multicorewareinc.com. - *****************************************************************************/ - -#include "filterharness.h" -#include <stdlib.h> -#include <stdio.h> -#include <string.h> - -using namespace x265; - -const short m_lumaFilter[4][8] = -{ - { 0, 0, 0, 64, 0, 0, 0, 0 }, - { -1, 4, -10, 58, 17, -5, 1, 0 }, - { -1, 4, -11, 40, 40, -11, 4, -1 }, - { 0, 1, -5, 17, 58, -10, 4, -1 } -}; - -const char *FilterConf_names[] = -{ - // Naming convention used is - isVertical_N_isFirst_isLast - "Hor_N=4_isFirst=0_isLast=0", - "Hor_N=4_isFirst=0_isLast=1", - "Hor_N=4_isFirst=1_isLast=0", - "Hor_N=4_isFirst=1_isLast=1", - - "Hor_N=8_isFirst=0_isLast=0", - "Hor_N=8_isFirst=0_isLast=1", - "Hor_N=8_isFirst=1_isLast=0", - "Hor_N=8_isFirst=1_isLast=1", - - "Ver_N=4_isFirst=0_isLast=0", - "Ver_N=4_isFirst=0_isLast=1", - "Ver_N=4_isFirst=1_isLast=0", - "Ver_N=4_isFirst=1_isLast=1", - - "Ver_N=8_isFirst=0_isLast=0", - "Ver_N=8_isFirst=0_isLast=1", - "Ver_N=8_isFirst=1_isLast=0", - "Ver_N=8_isFirst=1_isLast=1" -}; - -FilterHarness::FilterHarness() -{ - ipf_t_size = 200 * 200; - pixel_buff = (pixel*)malloc(ipf_t_size * sizeof(pixel)); // Assuming max_height = max_width = max_srcStride = max_dstStride = 100 - IPF_vec_output = (short*)malloc(ipf_t_size * sizeof(short)); // Output Buffer1 - IPF_C_output = (short*)malloc(ipf_t_size * sizeof(short)); // Output Buffer2 - - if (!pixel_buff || !IPF_vec_output || !IPF_C_output) - { - fprintf(stderr, "init_IPFilter_buffers: malloc failed, unable to initiate tests!\n"); - exit(-1); - } - - for (int i = 0; i < ipf_t_size; i++) // Initialize input buffer - { - int isPositive = rand() & 1; // To randomly generate Positive and Negative values - isPositive = (isPositive) ? 1 : -1; - pixel_buff[i] = isPositive * (rand() & PIXEL_MAX); - } -} - -FilterHarness::~FilterHarness() -{ - free(IPF_vec_output); - free(IPF_C_output); - free(pixel_buff); -} - -bool FilterHarness::check_IPFilter_primitive(IPFilter ref, IPFilter opt) -{ - int rand_height = rand() & 100; // Randomly generated Height - int rand_width = rand() & 100; // Randomly generated Width - short rand_val, rand_srcStride, rand_dstStride; - - for (int i = 0; i <= 100; i++) - { - memset(IPF_vec_output, 0, ipf_t_size); // Initialize output buffer to zero - memset(IPF_C_output, 0, ipf_t_size); // Initialize output buffer to zero - - rand_val = rand() & 24; // Random offset in the filter - rand_srcStride = rand() & 100; // Randomly generated srcStride - rand_dstStride = rand() & 100; // Randomly generated dstStride - - opt((short*)(m_lumaFilter + rand_val), - pixel_buff, - rand_srcStride, - (pixel*)IPF_vec_output, - rand_dstStride, - rand_height, - rand_width, - BIT_DEPTH); - ref((short*)(m_lumaFilter + rand_val), - pixel_buff, - rand_srcStride, - (pixel*)IPF_C_output, - rand_dstStride, - rand_height, - rand_width, - BIT_DEPTH); - - if (memcmp(IPF_vec_output, IPF_C_output, ipf_t_size)) - return false; - } - - return true; -} - -bool FilterHarness::testCorrectness( const EncoderPrimitives& ref, const EncoderPrimitives& opt ) -{ - for (int value = 4; value < 8; value++) - { - if (opt.filter[value]) - { - if (!check_IPFilter_primitive(ref.filter[value], opt.filter[value])) - { - printf("\nfilter[%s] failed\n", FilterConf_names[value]); - return false; - } - } - } - - return true; -} - -#define FILTER_ITERATIONS 100000 - -void FilterHarness::measureSpeed( const EncoderPrimitives& ref, const EncoderPrimitives& opt ) -{ - Timer *t = Timer::CreateTimer(); - - /* Add logic here for testing performance of your new primitive*/ - int rand_height = rand() % 100; // Randomly generated Height - int rand_width = rand() % 100; // Randomly generated Width - short rand_val, rand_srcStride, rand_dstStride; - - rand_val = rand() % 24; // Random offset in the filter - rand_srcStride = rand() % 100; // Randomly generated srcStride - rand_dstStride = rand() % 100; // Randomly generated dstStride - - for (int value = 4; value < 8; value++) - { - memset(IPF_vec_output, 0, ipf_t_size); // Initialize output buffer to zero - memset(IPF_C_output, 0, ipf_t_size); // Initialize output buffer to zero - if (opt.filter[value]) - { - t->Start(); - for (int j = 0; j < FILTER_ITERATIONS; j++) - opt.filter[value]((short*)(m_lumaFilter + rand_val), pixel_buff, rand_srcStride, (pixel*)IPF_vec_output, - rand_dstStride, rand_height, rand_width, BIT_DEPTH); - t->Stop(); - printf("\nfilter[%s]\tVec: (%1.2f ms) ", FilterConf_names[value], t->ElapsedMS()); - - t->Start(); - for (int j = 0; j < FILTER_ITERATIONS; j++) - ref.filter[value]((short*)(m_lumaFilter + rand_val), pixel_buff, rand_srcStride, (pixel*)IPF_vec_output, - rand_dstStride, rand_height, rand_width, BIT_DEPTH); - t->Stop(); - printf("\tC: (%1.2f ms) ", t->ElapsedMS()); - } - } - - t->Release(); -} +/***************************************************************************** + * Copyright (C) 2013 x265 project + * + * Authors: Steve Borho <steve@borho.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA. + * + * This program is also available under a commercial proprietary license. + * For more information, contact us at licensing@multicorewareinc.com. + *****************************************************************************/ + +#include "filterharness.h" +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +using namespace x265; + +const short m_lumaFilter[4][8] = +{ + { 0, 0, 0, 64, 0, 0, 0, 0 }, + { -1, 4, -10, 58, 17, -5, 1, 0 }, + { -1, 4, -11, 40, 40, -11, 4, -1 }, + { 0, 1, -5, 17, 58, -10, 4, -1 } +}; + +const char *FilterConf_names[] = +{ + // Naming convention used is - isVertical_N_isFirst_isLast + "Hor_N=4_isFirst=0_isLast=0", + "Hor_N=4_isFirst=0_isLast=1", + "Hor_N=4_isFirst=1_isLast=0", + "Hor_N=4_isFirst=1_isLast=1", + + "Hor_N=8_isFirst=0_isLast=0", + "Hor_N=8_isFirst=0_isLast=1", + "Hor_N=8_isFirst=1_isLast=0", + "Hor_N=8_isFirst=1_isLast=1", + + "Ver_N=4_isFirst=0_isLast=0", + "Ver_N=4_isFirst=0_isLast=1", + "Ver_N=4_isFirst=1_isLast=0", + "Ver_N=4_isFirst=1_isLast=1", + + "Ver_N=8_isFirst=0_isLast=0", + "Ver_N=8_isFirst=0_isLast=1", + "Ver_N=8_isFirst=1_isLast=0", + "Ver_N=8_isFirst=1_isLast=1" +}; + +FilterHarness::FilterHarness() +{ + ipf_t_size = 200 * 200; + pixel_buff = (pixel*)malloc(ipf_t_size * sizeof(pixel)); // Assuming max_height = max_width = max_srcStride = max_dstStride = 100 + IPF_vec_output = (short*)malloc(ipf_t_size * sizeof(short)); // Output Buffer1 + IPF_C_output = (short*)malloc(ipf_t_size * sizeof(short)); // Output Buffer2 + + if (!pixel_buff || !IPF_vec_output || !IPF_C_output) + { + fprintf(stderr, "init_IPFilter_buffers: malloc failed, unable to initiate tests!\n"); + exit(-1); + } + + for (int i = 0; i < ipf_t_size; i++) // Initialize input buffer + { + int isPositive = rand() & 1; // To randomly generate Positive and Negative values + isPositive = (isPositive) ? 1 : -1; + pixel_buff[i] = isPositive * (rand() & PIXEL_MAX); + } +} + +FilterHarness::~FilterHarness() +{ + free(IPF_vec_output); + free(IPF_C_output); + free(pixel_buff); +} + +bool FilterHarness::check_IPFilter_primitive(IPFilter ref, IPFilter opt) +{ + int rand_height = rand() & 100; // Randomly generated Height + int rand_width = rand() & 100; // Randomly generated Width + short rand_val, rand_srcStride, rand_dstStride; + + for (int i = 0; i <= 100; i++) + { + memset(IPF_vec_output, 0, ipf_t_size); // Initialize output buffer to zero + memset(IPF_C_output, 0, ipf_t_size); // Initialize output buffer to zero + + rand_val = rand() & 24; // Random offset in the filter + rand_srcStride = rand() & 100; // Randomly generated srcStride + rand_dstStride = rand() & 100; // Randomly generated dstStride + + opt((short*)(m_lumaFilter + rand_val), + pixel_buff, + rand_srcStride, + (pixel*)IPF_vec_output, + rand_dstStride, + rand_height, + rand_width, + BIT_DEPTH); + ref((short*)(m_lumaFilter + rand_val), + pixel_buff, + rand_srcStride, + (pixel*)IPF_C_output, + rand_dstStride, + rand_height, + rand_width, + BIT_DEPTH); + + if (memcmp(IPF_vec_output, IPF_C_output, ipf_t_size)) + return false; + } + + return true; +} + +bool FilterHarness::testCorrectness( const EncoderPrimitives& ref, const EncoderPrimitives& opt ) +{ + for (int value = 4; value < 8; value++) + { + if (opt.filter[value]) + { + if (!check_IPFilter_primitive(ref.filter[value], opt.filter[value])) + { + printf("\nfilter[%s] failed\n", FilterConf_names[value]); + return false; + } + } + } + + return true; +} + +#define FILTER_ITERATIONS 100000 + +void FilterHarness::measureSpeed( const EncoderPrimitives& ref, const EncoderPrimitives& opt ) +{ + Timer *t = Timer::CreateTimer(); + + /* Add logic here for testing performance of your new primitive*/ + int rand_height = rand() % 100; // Randomly generated Height + int rand_width = rand() % 100; // Randomly generated Width + short rand_val, rand_srcStride, rand_dstStride; + + rand_val = rand() % 24; // Random offset in the filter + rand_srcStride = rand() % 100; // Randomly generated srcStride + rand_dstStride = rand() % 100; // Randomly generated dstStride + + for (int value = 4; value < 8; value++) + { + memset(IPF_vec_output, 0, ipf_t_size); // Initialize output buffer to zero + memset(IPF_C_output, 0, ipf_t_size); // Initialize output buffer to zero + if (opt.filter[value]) + { + t->Start(); + for (int j = 0; j < FILTER_ITERATIONS; j++) + opt.filter[value]((short*)(m_lumaFilter + rand_val), pixel_buff, rand_srcStride, (pixel*)IPF_vec_output, + rand_dstStride, rand_height, rand_width, BIT_DEPTH); + t->Stop(); + printf("\nfilter[%s]\tVec: (%1.2f ms) ", FilterConf_names[value], t->ElapsedMS()); + + t->Start(); + for (int j = 0; j < FILTER_ITERATIONS; j++) + ref.filter[value]((short*)(m_lumaFilter + rand_val), pixel_buff, rand_srcStride, (pixel*)IPF_vec_output, + rand_dstStride, rand_height, rand_width, BIT_DEPTH); + t->Stop(); + printf("\tC: (%1.2f ms) ", t->ElapsedMS()); + } + } + + t->Release(); +}
--- a/source/test/filterharness.h Wed Apr 17 14:09:10 2013 +0530 +++ b/source/test/filterharness.h Wed Apr 17 14:11:17 2013 +0530 @@ -1,53 +1,53 @@ -/***************************************************************************** - * Copyright (C) 2013 x265 project - * - * Authors: Steve Borho <steve@borho.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA. - * - * This program is also available under a commercial proprietary license. - * For more information, contact us at licensing@multicorewareinc.com. - *****************************************************************************/ - -#ifndef _FILTERHARNESS_H_1 -#define _FILTERHARNESS_H_1 1 - -#include "testharness.h" -#include "primitives.h" - -class FilterHarness : public TestHarness -{ -protected: - - pixel *pixel_buff; - - short *IPF_vec_output, *IPF_C_output; - - int ipf_t_size; - - bool check_IPFilter_primitive(x265::IPFilter ref, x265::IPFilter opt); - -public: - - FilterHarness(); - - virtual ~FilterHarness(); - - bool testCorrectness(const x265::EncoderPrimitives& ref, const x265::EncoderPrimitives& opt); - - void measureSpeed(const x265::EncoderPrimitives& ref, const x265::EncoderPrimitives& opt); -}; - -#endif +/***************************************************************************** + * Copyright (C) 2013 x265 project + * + * Authors: Steve Borho <steve@borho.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA. + * + * This program is also available under a commercial proprietary license. + * For more information, contact us at licensing@multicorewareinc.com. + *****************************************************************************/ + +#ifndef _FILTERHARNESS_H_1 +#define _FILTERHARNESS_H_1 1 + +#include "testharness.h" +#include "primitives.h" + +class FilterHarness : public TestHarness +{ +protected: + + pixel *pixel_buff; + + short *IPF_vec_output, *IPF_C_output; + + int ipf_t_size; + + bool check_IPFilter_primitive(x265::IPFilter ref, x265::IPFilter opt); + +public: + + FilterHarness(); + + virtual ~FilterHarness(); + + bool testCorrectness(const x265::EncoderPrimitives& ref, const x265::EncoderPrimitives& opt); + + void measureSpeed(const x265::EncoderPrimitives& ref, const x265::EncoderPrimitives& opt); +}; + +#endif
--- a/source/test/mbdstharness.cpp Wed Apr 17 14:09:10 2013 +0530 +++ b/source/test/mbdstharness.cpp Wed Apr 17 14:11:17 2013 +0530 @@ -1,113 +1,204 @@ -/***************************************************************************** - * Copyright (C) 2013 x265 project - * - * Authors: Steve Borho <steve@borho.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA. - * - * This program is also available under a commercial proprietary license. - * For more information, contact us at licensing@multicorewareinc.com. - *****************************************************************************/ - -#include "mbdstharness.h" -#include <stdlib.h> -#include <string.h> -#include <stdio.h> - -using namespace x265; - -MBDstHarness::MBDstHarness() -{ - mb_t_size = 32; - - mbuf1 = (short*)malloc(0x1e00 * sizeof(pixel)); - mbuf2 = (short*)malloc(mb_t_size); - mbuf3 = (short*)malloc(mb_t_size); - if (!mbuf1 || !mbuf2 || !mbuf3) - { - fprintf(stderr, "malloc failed, unable to initiate tests!\n"); - exit(1); - } - - for (int i = 0; i < 64*100; i++) - mbuf1[i] = rand() & PIXEL_MAX; - memset(mbuf2, 0, mb_t_size); - memset(mbuf3, 0, mb_t_size); -} - -MBDstHarness::~MBDstHarness() -{ - free(mbuf1); - free(mbuf2); - free(mbuf3); -} - -bool MBDstHarness::check_mbdst_primitive(mbdst ref, mbdst opt) -{ - int j = 0; - - for (int i = 0; i <= 100; i++) - { - opt(mbuf1 + j, mbuf2, 16); - ref(mbuf1 + j, mbuf3, 16); - - if (memcmp(mbuf2, mbuf3, mb_t_size)) - return false; - - j += 16; - memset(mbuf2, 0, mb_t_size); - memset(mbuf3, 0, mb_t_size); - } - - return true; -} - -bool MBDstHarness::testCorrectness( const EncoderPrimitives& ref, const EncoderPrimitives& opt ) -{ - if (opt.inversedst) - { - if (!check_mbdst_primitive(ref.inversedst, opt.inversedst)) - { - printf("Inversedst: Failed!\n"); - return false; - } - } - - return true; -} - -#define MBDST_ITERATIONS 4000000 - -void MBDstHarness::measureSpeed( const EncoderPrimitives& ref, const EncoderPrimitives& opt ) -{ - Timer *t = Timer::CreateTimer(); - - if (opt.inversedst) - { - t->Start(); - for (int j = 0; j < MBDST_ITERATIONS; j++) - opt.inversedst(mbuf1, mbuf2, 16); - t->Stop(); - printf("\nInverseDST\tVec: (%1.2f ms) ", t->ElapsedMS()); - - t->Start(); - for (int j = 0; j < MBDST_ITERATIONS; j++) - ref.inversedst(mbuf1, mbuf2, 16); - t->Stop(); - printf("\tC: (%1.2f ms) ", t->ElapsedMS()); - } - - t->Release(); -} +/***************************************************************************** + * Copyright (C) 2013 x265 project + * + * Authors: Steve Borho <steve@borho.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA. + * + * This program is also available under a commercial proprietary license. + * For more information, contact us at licensing@multicorewareinc.com. + *****************************************************************************/ + +#include "mbdstharness.h" +#include <stdlib.h> +#include <string.h> +#include <stdio.h> + +using namespace x265; + +const char *ButterflyConf_names[] = +{ +"4", +"Inverse4", +"8", +"Inverse8", +"16", +"Inverse16", +"32", +"Inverse32" +}; + +enum Butterflies +{ + butterfly_4, + butterfly_inverse_4, + butterfly_8, + butterfly_inverse_8, + butterfly_16, + butterfly_inverse_16, + butterfly_32, + butterfly_inverse_32, + num_butterflies +}; + +MBDstHarness::MBDstHarness() +{ + mb_t_size = 6400; + + mbuf1 = (short*)malloc(0x1e00 * sizeof(short)); + mbuf2 = (short*)malloc(mb_t_size); + mbuf3 = (short*)malloc(mb_t_size); + if (!mbuf1 || !mbuf2 || !mbuf3) + { + fprintf(stderr, "malloc failed, unable to initiate tests!\n"); + exit(1); + } + + for (int i = 0; i < 64 * 100; i++) + { + mbuf1[i] = rand() & PIXEL_MAX; + } + + memset(mbuf2, 0, mb_t_size); + memset(mbuf3, 0, mb_t_size); +} + +MBDstHarness::~MBDstHarness() +{ + free(mbuf1); + free(mbuf2); + free(mbuf3); +} + +bool MBDstHarness::check_mbdst_primitive(mbdst ref, mbdst opt) +{ + int j = 0; + int mem_cmp_size = 32; + + for (int i = 0; i <= 100; i++) + { + opt(mbuf1 + j, mbuf2, 16); + ref(mbuf1 + j, mbuf3, 16); + + if (memcmp(mbuf2, mbuf3, mem_cmp_size)) + return false; + + j += 16; + memset(mbuf2, 0, mem_cmp_size); + memset(mbuf3, 0, mem_cmp_size); + } + + return true; +} + +bool MBDstHarness::check_butterfly16_primitive(butterfly ref, butterfly opt) +{ + int j = 0; + int mem_cmp_size = 320; // 2*16*10 -> sizeof(short)*number of elements*number of lines + + for (int i = 0; i <= 100; i++) + { + opt(mbuf1 + j, mbuf2, 3, 10); + ref(mbuf1 + j, mbuf3, 3, 10); + + if (memcmp(mbuf2, mbuf3, mem_cmp_size)) + return false; + + j += 16; + memset(mbuf2, 0, mem_cmp_size); + memset(mbuf3, 0, mem_cmp_size); + } + + return true; +} + +bool MBDstHarness::testCorrectness(const EncoderPrimitives& ref, const EncoderPrimitives& opt) +{ + if (opt.inversedst) + { + if (!check_mbdst_primitive(ref.inversedst, opt.inversedst)) + { + printf("Inversedst: Failed!\n"); + return false; + } + } + + if (opt.partial_butterfly[butterfly_16]) + { + if (!check_butterfly16_primitive(ref.partial_butterfly[butterfly_16], opt.partial_butterfly[butterfly_16])) + { + printf("\npartialButterfly%s failed\n", ButterflyConf_names[butterfly_16]); + return false; + } + } + + return true; +} + +#define MBDST_ITERATIONS 4000000 + +void MBDstHarness::measureSpeed(const EncoderPrimitives& ref, const EncoderPrimitives& opt) +{ + Timer *t = Timer::CreateTimer(); + + if (opt.inversedst) + { + t->Start(); + for (int j = 0; j < MBDST_ITERATIONS; j++) + { + opt.inversedst(mbuf1, mbuf2, 16); + } + + t->Stop(); + printf("\nInverseDST\tVec: (%1.2f ms) ", t->ElapsedMS()); + + t->Start(); + for (int j = 0; j < MBDST_ITERATIONS; j++) + { + ref.inversedst(mbuf1, mbuf2, 16); + } + + t->Stop(); + printf("\tC: (%1.2f ms) ", t->ElapsedMS()); + } + + for (int value = 0; value < 8; value++) + { + memset(mbuf2, 0, mb_t_size); // Initialize output buffer to zero + memset(mbuf3, 0, mb_t_size); // Initialize output buffer to zero + if (opt.partial_butterfly[value]) + { + t->Start(); + for (int j = 0; j < MBDST_ITERATIONS; j++) + { + opt.partial_butterfly[value](mbuf1, mbuf2, 3, 10); + } + + t->Stop(); + printf("\npartialButterfly%s\tVec: (%1.2f ms) ", ButterflyConf_names[value], t->ElapsedMS()); + + t->Start(); + for (int j = 0; j < MBDST_ITERATIONS; j++) + { + ref.partial_butterfly[value](mbuf1, mbuf2, 3, 10); + } + + t->Stop(); + printf("\tC: (%1.2f ms) ", t->ElapsedMS()); + } + } + + t->Release(); +}
--- a/source/test/mbdstharness.h Wed Apr 17 14:09:10 2013 +0530 +++ b/source/test/mbdstharness.h Wed Apr 17 14:11:17 2013 +0530 @@ -1,50 +1,52 @@ -/***************************************************************************** - * Copyright (C) 2013 x265 project - * - * Authors: Steve Borho <steve@borho.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA. - * - * This program is also available under a commercial proprietary license. - * For more information, contact us at licensing@multicorewareinc.com. - *****************************************************************************/ - -#ifndef _MBDSTHARNESS_H_1 -#define _MBDSTHARNESS_H_1 1 - -#include "testharness.h" -#include "primitives.h" - -class MBDstHarness : public TestHarness -{ -protected: - - short *mbuf1, *mbuf2, *mbuf3; - - int mb_t_size; - - bool check_mbdst_primitive(x265::mbdst ref, x265::mbdst opt); - -public: - MBDstHarness(); - - virtual ~MBDstHarness(); - - bool testCorrectness(const x265::EncoderPrimitives& ref, const x265::EncoderPrimitives& opt); - - void measureSpeed(const x265::EncoderPrimitives& ref, const x265::EncoderPrimitives& opt); -}; - -#endif +/***************************************************************************** + * Copyright (C) 2013 x265 project + * + * Authors: Steve Borho <steve@borho.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA. + * + * This program is also available under a commercial proprietary license. + * For more information, contact us at licensing@multicorewareinc.com. + *****************************************************************************/ + +#ifndef _MBDSTHARNESS_H_1 +#define _MBDSTHARNESS_H_1 1 + +#include "testharness.h" +#include "primitives.h" + +class MBDstHarness : public TestHarness +{ +protected: + + short *mbuf1, *mbuf2, *mbuf3; + + int mb_t_size; + + bool check_mbdst_primitive(x265::mbdst ref, x265::mbdst opt); + bool check_butterfly16_primitive(x265::butterfly ref, x265::butterfly opt); + +public: + + MBDstHarness(); + + virtual ~MBDstHarness(); + + bool testCorrectness(const x265::EncoderPrimitives& ref, const x265::EncoderPrimitives& opt); + + void measureSpeed(const x265::EncoderPrimitives& ref, const x265::EncoderPrimitives& opt); +}; + +#endif // ifndef _MBDSTHARNESS_H_1
--- a/source/test/pixelharness.cpp Wed Apr 17 14:09:10 2013 +0530 +++ b/source/test/pixelharness.cpp Wed Apr 17 14:11:17 2013 +0530 @@ -1,205 +1,221 @@ -/***************************************************************************** - * Copyright (C) 2013 x265 project - * - * Authors: Steve Borho <steve@borho.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA. - * - * This program is also available under a commercial proprietary license. - * For more information, contact us at licensing@multicorewareinc.com. - *****************************************************************************/ - -#include "pixelharness.h" -#include "primitives.h" -#include <stdlib.h> -#include <stdio.h> - -using namespace x265; - -// Initialize the Func Names for all the Pixel Comp -static const char *FuncNames[NUM_PARTITIONS] = -{ - "4x4", "8x4", "4x8", "8x8", "4x16", "16x4", "8x16", "16x8", "16x16", - "4x32", "32x4", "8x32", "32x8", "16x32", "32x16", "32x32", "4x64", - "64x4", "8x64", "64x8", "16x64", "64x16", "32x64", "64x32", "64x64" -}; - -#if HIGH_BIT_DEPTH -#define BIT_DEPTH 10 -#else -#define BIT_DEPTH 8 -#endif - -#define PIXEL_MAX ((1 << BIT_DEPTH) - 1) - -#define PIXELCMP_ITERATIONS 2000000 - -#define INCR 16 -#define STRIDE 16 - -PixelHarness::PixelHarness() -{ - pbuf1 = (pixel*)malloc(0x1e00 * sizeof(pixel)); - pbuf2 = (pixel*)malloc(0x1e00 * sizeof(pixel)); - if (!pbuf1 || !pbuf2) - { - fprintf(stderr, "malloc failed, unable to initiate tests!\n"); - exit(1); - } - - for (int i = 0; i < 0x1e00; i++) - { - //Generate the Random Buffer for Testing - pbuf1[i] = rand() & PIXEL_MAX; - pbuf2[i] = rand() & PIXEL_MAX; - } -} - -PixelHarness::~PixelHarness() -{ - free(pbuf1); - free(pbuf2); -} - -bool PixelHarness::check_pixel_primitive(pixelcmp ref, pixelcmp opt) -{ - int j = 0; - - for (int i = 0; i <= 100; i++) - { - int vres = opt(pbuf1, STRIDE, pbuf2 + j, STRIDE); - int cres = ref(pbuf1, STRIDE, pbuf2 + j, STRIDE); - if (vres != cres) - return false; - - j += INCR; - } - - return true; -} - -bool PixelHarness::testCorrectness( const EncoderPrimitives& ref, const EncoderPrimitives& opt ) -{ - for (uint16_t curpar = 0; curpar < NUM_PARTITIONS; curpar++) - { - if (opt.satd[curpar]) - { - if (!check_pixel_primitive(ref.satd[curpar], opt.satd[curpar])) - { - printf("satd[%s]: failed!\n", FuncNames[curpar]); - return false; - } - } - - if (opt.sad[curpar]) - { - if (!check_pixel_primitive(ref.sad[curpar], opt.sad[curpar])) - { - printf("sad[%s]: failed!\n", FuncNames[curpar]); - return false; - } - } - } - - if (opt.sa8d_8x8) - { - if (!check_pixel_primitive(ref.sa8d_8x8, opt.sa8d_8x8)) - { - printf("sa8d_8x8: failed!\n"); - return false; - } - } - - if (opt.sa8d_16x16) - { - if (!check_pixel_primitive(ref.sa8d_16x16, opt.sa8d_16x16)) - { - printf("sa8d_16x16: failed!\n"); - return false; - } - } - - return true; -} - -void PixelHarness::measureSpeed(const EncoderPrimitives& ref, const EncoderPrimitives& opt) -{ - Timer *t = Timer::CreateTimer(); - - for (int curpar = 0; curpar < NUM_PARTITIONS; curpar++) - { - if (opt.satd[curpar]) - { - t->Start(); - for (int j = 0; j < PIXELCMP_ITERATIONS; j++) - opt.satd[curpar](pbuf1, STRIDE, pbuf2, STRIDE); - t->Stop(); - printf("\nsatd[%s]\tVec: (%1.2f ms) ", FuncNames[curpar], t->ElapsedMS()); - - t->Start(); - for (int j = 0; j < PIXELCMP_ITERATIONS; j++) - ref.satd[curpar](pbuf1, STRIDE, pbuf2, STRIDE); - t->Stop(); - printf("\tC: (%1.2f ms) ", t->ElapsedMS()); - } - - if (opt.sad[curpar]) - { - t->Start(); - for (int j = 0; j < PIXELCMP_ITERATIONS; j++) - opt.sad[curpar](pbuf1, STRIDE, pbuf2, STRIDE); - t->Stop(); - printf("\nsad[%s]\tVec: (%1.2f ms) ", FuncNames[curpar], t->ElapsedMS()); - - t->Start(); - for (int j = 0; j < PIXELCMP_ITERATIONS; j++) - ref.sad[curpar](pbuf1, STRIDE, pbuf2, STRIDE); - t->Stop(); - printf("\tC: (%1.2f ms) ", t->ElapsedMS()); - } - } - - if (opt.sa8d_8x8) - { - t->Start(); - for (int j = 0; j < PIXELCMP_ITERATIONS; j++) - opt.sa8d_8x8(pbuf1, STRIDE, pbuf2, STRIDE); - t->Stop(); - printf("\nsa8d_8x8\tVec: (%1.2f ms) ", t->ElapsedMS()); - - t->Start(); - for (int j = 0; j < PIXELCMP_ITERATIONS; j++) - ref.sa8d_8x8(pbuf1, STRIDE, pbuf2, STRIDE); - t->Stop(); - printf("\tC: (%1.2f ms) ", t->ElapsedMS()); - } - - if (opt.sa8d_16x16) - { - t->Start(); - for (int j = 0; j < PIXELCMP_ITERATIONS; j++) - opt.sa8d_16x16(pbuf1, STRIDE, pbuf2, STRIDE); - t->Stop(); - printf("\nsa8d_16x16\tVec: (%1.2f ms) ", t->ElapsedMS()); - - t->Start(); - for (int j = 0; j < PIXELCMP_ITERATIONS; j++) - ref.sa8d_16x16(pbuf1, STRIDE, pbuf2, STRIDE); - t->Stop(); - printf("\tC: (%1.2f ms) ", t->ElapsedMS()); - } - - t->Release(); -} +/***************************************************************************** + * Copyright (C) 2013 x265 project + * + * Authors: Steve Borho <steve@borho.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA. + * + * This program is also available under a commercial proprietary license. + * For more information, contact us at licensing@multicorewareinc.com. + *****************************************************************************/ + +#include "pixelharness.h" +#include "primitives.h" +#include <stdio.h> +#include <stdlib.h> +#include <malloc.h> + +#ifdef __MINGW32__ +#define _aligned_malloc __mingw_aligned_malloc +#define _aligned_free __mingw_aligned_free +#endif + +using namespace x265; + +// Initialize the Func Names for all the Pixel Comp +static const char *FuncNames[NUM_PARTITIONS] = +{ + "4x4", "8x4", "4x8", "8x8", "4x16", "16x4", "8x16", "16x8", "16x16", + "4x32", "32x4", "8x32", "32x8", "16x32", "32x16", "32x32", "4x64", + "64x4", "8x64", "64x8", "16x64", "64x16", "32x64", "64x32", "64x64" +}; + +#if HIGH_BIT_DEPTH +#define BIT_DEPTH 10 +#else +#define BIT_DEPTH 8 +#endif + +#define PIXEL_MAX ((1 << BIT_DEPTH) - 1) + +PixelHarness::PixelHarness() +{ +#if _WIN32 + pbuf1 = (pixel*)_aligned_malloc(0x1e00 * sizeof(pixel), 32); + pbuf2 = (pixel*)_aligned_malloc(0x1e00 * sizeof(pixel), 32); +#else + posix_memalign((void**)&pbuf1, 32, 0x1e00 * sizeof(pixel)); + posix_memalign((void**)&pbuf2, 32, 0x1e00 * sizeof(pixel)); +#endif + if (!pbuf1 || !pbuf2) + { + fprintf(stderr, "malloc failed, unable to initiate tests!\n"); + exit(1); + } + + for (int i = 0; i < 0x1e00; i++) + { + //Generate the Random Buffer for Testing + pbuf1[i] = rand() & PIXEL_MAX; + pbuf2[i] = rand() & PIXEL_MAX; + } +} + +PixelHarness::~PixelHarness() +{ +#if _WIN32 + _aligned_free(pbuf1); + _aligned_free(pbuf2); +#else + free(pbuf1); + free(pbuf2); +#endif +} + +#define INCR 16 +#define STRIDE 16 + +bool PixelHarness::check_pixel_primitive(pixelcmp ref, pixelcmp opt) +{ + int j = 0; + + for (int i = 0; i <= 100; i++) + { + int vres = opt(pbuf1, STRIDE, pbuf2 + j, STRIDE); + int cres = ref(pbuf1, STRIDE, pbuf2 + j, STRIDE); + if (vres != cres) + return false; + + j += INCR; + } + + return true; +} + +bool PixelHarness::testCorrectness( const EncoderPrimitives& ref, const EncoderPrimitives& opt ) +{ + for (uint16_t curpar = 0; curpar < NUM_PARTITIONS; curpar++) + { + if (opt.satd[curpar]) + { + if (!check_pixel_primitive(ref.satd[curpar], opt.satd[curpar])) + { + printf("satd[%s]: failed!\n", FuncNames[curpar]); + return false; + } + } + + if (opt.sad[curpar]) + { + if (!check_pixel_primitive(ref.sad[curpar], opt.sad[curpar])) + { + printf("sad[%s]: failed!\n", FuncNames[curpar]); + return false; + } + } + } + + if (opt.sa8d_8x8) + { + if (!check_pixel_primitive(ref.sa8d_8x8, opt.sa8d_8x8)) + { + printf("sa8d_8x8: failed!\n"); + return false; + } + } + + if (opt.sa8d_16x16) + { + if (!check_pixel_primitive(ref.sa8d_16x16, opt.sa8d_16x16)) + { + printf("sa8d_16x16: failed!\n"); + return false; + } + } + + return true; +} + +#define PIXELCMP_ITERATIONS 2000000 + +void PixelHarness::measureSpeed(const EncoderPrimitives& ref, const EncoderPrimitives& opt) +{ + Timer *t = Timer::CreateTimer(); + + for (int curpar = 0; curpar < NUM_PARTITIONS; curpar++) + { + if (opt.satd[curpar]) + { + t->Start(); + for (int j = 0; j < PIXELCMP_ITERATIONS; j++) + opt.satd[curpar](pbuf1, STRIDE, pbuf2, STRIDE); + t->Stop(); + printf("\nsatd[%s]\tVec: (%1.2f ms) ", FuncNames[curpar], t->ElapsedMS()); + + t->Start(); + for (int j = 0; j < PIXELCMP_ITERATIONS; j++) + ref.satd[curpar](pbuf1, STRIDE, pbuf2, STRIDE); + t->Stop(); + printf("\tC: (%1.2f ms) ", t->ElapsedMS()); + } + + if (opt.sad[curpar]) + { + t->Start(); + for (int j = 0; j < PIXELCMP_ITERATIONS; j++) + opt.sad[curpar](pbuf1, STRIDE, pbuf2, STRIDE); + t->Stop(); + printf("\nsad[%s]\tVec: (%1.2f ms) ", FuncNames[curpar], t->ElapsedMS()); + + t->Start(); + for (int j = 0; j < PIXELCMP_ITERATIONS; j++) + ref.sad[curpar](pbuf1, STRIDE, pbuf2, STRIDE); + t->Stop(); + printf("\tC: (%1.2f ms) ", t->ElapsedMS()); + } + } + + if (opt.sa8d_8x8) + { + t->Start(); + for (int j = 0; j < PIXELCMP_ITERATIONS; j++) + opt.sa8d_8x8(pbuf1, STRIDE, pbuf2, STRIDE); + t->Stop(); + printf("\nsa8d_8x8\tVec: (%1.2f ms) ", t->ElapsedMS()); + + t->Start(); + for (int j = 0; j < PIXELCMP_ITERATIONS; j++) + ref.sa8d_8x8(pbuf1, STRIDE, pbuf2, STRIDE); + t->Stop(); + printf("\tC: (%1.2f ms) ", t->ElapsedMS()); + } + + if (opt.sa8d_16x16) + { + t->Start(); + for (int j = 0; j < PIXELCMP_ITERATIONS; j++) + opt.sa8d_16x16(pbuf1, STRIDE, pbuf2, STRIDE); + t->Stop(); + printf("\nsa8d_16x16\tVec: (%1.2f ms) ", t->ElapsedMS()); + + t->Start(); + for (int j = 0; j < PIXELCMP_ITERATIONS; j++) + ref.sa8d_16x16(pbuf1, STRIDE, pbuf2, STRIDE); + t->Stop(); + printf("\tC: (%1.2f ms) ", t->ElapsedMS()); + } + + t->Release(); +}
--- a/source/test/pixelharness.h Wed Apr 17 14:09:10 2013 +0530 +++ b/source/test/pixelharness.h Wed Apr 17 14:11:17 2013 +0530 @@ -1,48 +1,48 @@ -/***************************************************************************** - * Copyright (C) 2013 x265 project - * - * Authors: Steve Borho <steve@borho.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA. - * - * This program is also available under a commercial proprietary license. - * For more information, contact us at licensing@multicorewareinc.com. - *****************************************************************************/ - -#ifndef _PIXELHARNESS_H_1 -#define _PIXELHARNESS_H_1 1 - -#include "testharness.h" -#include "primitives.h" - -class PixelHarness : public TestHarness -{ -protected: - - pixel *pbuf1, *pbuf2; - - bool check_pixel_primitive(x265::pixelcmp ref, x265::pixelcmp opt); - -public: - PixelHarness(); - - virtual ~PixelHarness(); - - bool testCorrectness(const x265::EncoderPrimitives& ref, const x265::EncoderPrimitives& opt); - - void measureSpeed(const x265::EncoderPrimitives& ref, const x265::EncoderPrimitives& opt ); -}; - -#endif +/***************************************************************************** + * Copyright (C) 2013 x265 project + * + * Authors: Steve Borho <steve@borho.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA. + * + * This program is also available under a commercial proprietary license. + * For more information, contact us at licensing@multicorewareinc.com. + *****************************************************************************/ + +#ifndef _PIXELHARNESS_H_1 +#define _PIXELHARNESS_H_1 1 + +#include "testharness.h" +#include "primitives.h" + +class PixelHarness : public TestHarness +{ +protected: + + pixel *pbuf1, *pbuf2; + + bool check_pixel_primitive(x265::pixelcmp ref, x265::pixelcmp opt); + +public: + PixelHarness(); + + virtual ~PixelHarness(); + + bool testCorrectness(const x265::EncoderPrimitives& ref, const x265::EncoderPrimitives& opt); + + void measureSpeed(const x265::EncoderPrimitives& ref, const x265::EncoderPrimitives& opt ); +}; + +#endif
--- a/source/test/testbench.cpp Wed Apr 17 14:09:10 2013 +0530 +++ b/source/test/testbench.cpp Wed Apr 17 14:11:17 2013 +0530 @@ -56,7 +56,8 @@ int main(int argc, char *argv[]) MBDstHarness HMBDist; // To disable classes of tests, simply comment them out in this list - TestHarness *harness[] = { + TestHarness *harness[] = + { &HPixel, &HFilter, &HMBDist @@ -72,7 +73,7 @@ int main(int argc, char *argv[]) memset(&vecprim, 0, sizeof(vecprim)); Setup_Vector_Primitives(vecprim, i); printf("Testing vector class primitives: CPUID %d\n", i); - for (int h = 0; h < sizeof(harness)/sizeof(TestHarness*); h++) + for (int h = 0; h < sizeof(harness) / sizeof(TestHarness*); h++) { if (!harness[h]->testCorrectness(cprim, vecprim)) { @@ -80,14 +81,15 @@ int main(int argc, char *argv[]) return -1; } } -#endif + +#endif // if ENABLE_VECTOR_PRIMITIVES #if ENABLE_ASM_PRIMITIVES EncoderPrimitives asmprim; memset(&asmprim, 0, sizeof(asmprim)); Setup_Assembly_Primitives(asmprim, i); printf("Testing assembly primitives: CPUID %d\n", i); - for (int h = 0; h < sizeof(harness)/sizeof(TestHarness*); h++) + for (int h = 0; h < sizeof(harness) / sizeof(TestHarness*); h++) { if (!harness[h]->testCorrectness(cprim, vecprim)) { @@ -95,11 +97,12 @@ int main(int argc, char *argv[]) return -1; } } + #endif // if ENABLE_ASM_PRIMITIVES } + fprintf(stderr, "\nx265: All tests passed Yeah :)\n"); - /******************* Cycle count for all primitives **********************/ EncoderPrimitives optprim; @@ -111,8 +114,10 @@ int main(int argc, char *argv[]) Setup_Assembly_Primitives(optprim, cpuid); #endif - for (int h = 0; h < sizeof(harness)/sizeof(TestHarness*); h++) + for (int h = 0; h < sizeof(harness) / sizeof(TestHarness*); h++) + { harness[h]->measureSpeed(cprim, optprim); + } printf("\n");
--- a/source/test/testharness.h Wed Apr 17 14:09:10 2013 +0530 +++ b/source/test/testharness.h Wed Apr 17 14:11:17 2013 +0530 @@ -1,66 +1,66 @@ -/***************************************************************************** - * Copyright (C) 2013 x265 project - * - * Authors: Steve Borho <steve@borho.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA. - * - * This program is also available under a commercial proprietary license. - * For more information, contact us at licensing@multicorewareinc.com. - *****************************************************************************/ - -#ifndef _TESTHARNESS_H_ -#define _TESTHARNESS_H_ 1 - -#include "primitives.h" - -#if HIGH_BIT_DEPTH -#define BIT_DEPTH 10 -#else -#define BIT_DEPTH 8 -#endif -#define PIXEL_MAX ((1 << BIT_DEPTH) - 1) - -class TestHarness -{ -public: - TestHarness() {} - - virtual ~TestHarness() {} - - virtual bool testCorrectness(const x265::EncoderPrimitives& ref, const x265::EncoderPrimitives& opt) = 0; - - virtual void measureSpeed(const x265::EncoderPrimitives& ref, const x265::EncoderPrimitives& opt) = 0; -}; - -class Timer -{ -public: - Timer() {} - - virtual ~Timer() {} - - static Timer *CreateTimer(); - - virtual void Start() = 0; - - virtual void Stop() = 0; - - virtual float ElapsedMS() = 0; - - virtual void Release() = 0; -}; - -#endif +/***************************************************************************** + * Copyright (C) 2013 x265 project + * + * Authors: Steve Borho <steve@borho.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA. + * + * This program is also available under a commercial proprietary license. + * For more information, contact us at licensing@multicorewareinc.com. + *****************************************************************************/ + +#ifndef _TESTHARNESS_H_ +#define _TESTHARNESS_H_ 1 + +#include "primitives.h" + +#if HIGH_BIT_DEPTH +#define BIT_DEPTH 10 +#else +#define BIT_DEPTH 8 +#endif +#define PIXEL_MAX ((1 << BIT_DEPTH) - 1) + +class TestHarness +{ +public: + TestHarness() {} + + virtual ~TestHarness() {} + + virtual bool testCorrectness(const x265::EncoderPrimitives& ref, const x265::EncoderPrimitives& opt) = 0; + + virtual void measureSpeed(const x265::EncoderPrimitives& ref, const x265::EncoderPrimitives& opt) = 0; +}; + +class Timer +{ +public: + Timer() {} + + virtual ~Timer() {} + + static Timer *CreateTimer(); + + virtual void Start() = 0; + + virtual void Stop() = 0; + + virtual float ElapsedMS() = 0; + + virtual void Release() = 0; +}; + +#endif
--- a/source/test/testpool.cpp Wed Apr 17 14:09:10 2013 +0530 +++ b/source/test/testpool.cpp Wed Apr 17 14:11:17 2013 +0530 @@ -167,7 +167,8 @@ void MD5Frame::ProcessRow(int rownum) { ScopedLock below(this->row[rownum + 1].lock); - if (this->row[rownum + 1].active == false) + if (this->row[rownum + 1].active == false && + this->row[rownum + 1].curCol + 2 <= curRow.curCol) { // set active indicator so row is only enqueued once // row stays marked active until blocked or done
--- a/source/test/timer.cpp Wed Apr 17 14:09:10 2013 +0530 +++ b/source/test/timer.cpp Wed Apr 17 14:11:17 2013 +0530 @@ -23,58 +23,40 @@ #include "testharness.h" -#include <stdio.h> -#include <stdlib.h> -#include <string.h> +#if _WIN32 + +#include <Windows.h> + +class TimerImpl : public Timer +{ +protected: + + LARGE_INTEGER freq; + + LARGE_INTEGER start, finish; + +public: + + TimerImpl() { QueryPerformanceFrequency(&freq); } + + void Start() { QueryPerformanceCounter(&start); } + + void Stop() { QueryPerformanceCounter(&finish); } + + float ElapsedMS() + { + return ((float)(finish.QuadPart - start.QuadPart) / freq.QuadPart) * 1000.0f; + } + + void Release() { delete this; } +}; + +#else + #include <sys/types.h> #include <sys/timeb.h> - -// Code snippet from http://www.winehq.org/pipermail/wine-devel/2003-June/018082.html begins -// this part is windows implementation of Gettimeoffday() function - -#ifndef _TIMEVAL_H -#ifdef _WIN32 - -#define WIN32_LEAN_AND_MEAN -#include <winsock2.h> - -#if defined(_MSC_VER) -#define EPOCHFILETIME (116444736000000000i64) -#else -#define EPOCHFILETIME (116444736000000000LL) -#endif - -int gettimeofday(struct timeval *tv, struct timezone *tz) -{ - FILETIME ft; - LARGE_INTEGER li; - __int64 t; - - if (tv) - { - GetSystemTimeAsFileTime(&ft); - li.LowPart = ft.dwLowDateTime; - li.HighPart = ft.dwHighDateTime; - t = li.QuadPart; /* In 100-nanosecond intervals */ - t -= EPOCHFILETIME; /* Offset to the Epoch time */ - t /= 10; /* In microseconds */ - tv->tv_sec = (long)(t / 1000000); - tv->tv_usec = (long)(t % 1000000); - } - - return 0; -} - -#else /* _WIN32 */ - #include <sys/time.h> -#endif /* _WIN32 */ -#endif /* _TIMEVAL_H */ - -// Code snippet from http://www.winehq.org/pipermail/wine-devel/2003-June/018082.html ends - - class TimerImpl : public Timer { protected: @@ -83,33 +65,22 @@ protected: public: - void Start(); + void Start() { gettimeofday(&start, 0); } + + void Stop() { gettimeofday(&finish, 0); } - void Stop(); - - float ElapsedMS(); + float ElapsedMS() + { + return (finish.tv_sec - start.tv_sec) * 1000 + + (float)(finish.tv_usec - start.tv_usec) / 1000; + } void Release() { delete this; } }; +#endif /* _WIN32 */ + Timer *Timer::CreateTimer() { return new TimerImpl(); } - -void TimerImpl::Start() -{ - gettimeofday(&start, NULL); -} - -void TimerImpl::Stop() -{ - gettimeofday(&finish, NULL); -} - -float TimerImpl::ElapsedMS() -{ - float msec = (finish.tv_sec - start.tv_sec) * 1000; - msec += (float)(finish.tv_usec - start.tv_usec) / 1000; - return msec; -}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/source/x265cfg.cpp Wed Apr 17 14:11:17 2013 +0530 @@ -0,0 +1,1937 @@ +/* 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-2013, 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 TAppEncCfg.cpp + \brief Handle encoder configuration parameters +*/ + +#include <stdlib.h> +#include <cassert> +#include <cstring> +#include <string> +#include <math.h> +#include "TLibCommon/TComRom.h" +#include "x265cfg.h" + +static istream &operator >>(istream &, Level::Name &); +static istream &operator >>(istream &, Level::Tier &); +static istream &operator >>(istream &, Profile::Name &); + +#include "TAppCommon/program_options_lite.h" +#include "TLibEncoder/TEncRateCtrl.h" + +#ifdef WIN32 +#define strdup _strdup +#endif + +using namespace std; +namespace po = df::program_options_lite; + +//! \ingroup TAppEncoder +//! \{ + +// ==================================================================================================================== +// Constructor / destructor / initialization / destroy +// ==================================================================================================================== + +TAppEncCfg::TAppEncCfg() + : m_pchInputFile() + , m_pchBitstreamFile() + , m_pchReconFile() + , m_pchdQPFile() + , m_pColumnWidth() + , m_pRowHeight() + , m_scalingListFile() +{ + m_aidQP = NULL; +#if J0149_TONE_MAPPING_SEI + m_startOfCodedInterval = NULL; + m_codedPivotValue = NULL; + m_targetPivotValue = NULL; +#endif +} + +TAppEncCfg::~TAppEncCfg() +{ + if (m_aidQP) + { + delete[] m_aidQP; + } + +#if J0149_TONE_MAPPING_SEI + if (m_startOfCodedInterval) + { + delete[] m_startOfCodedInterval; + m_startOfCodedInterval = NULL; + } + + if (m_codedPivotValue) + { + delete[] m_codedPivotValue; + m_codedPivotValue = NULL; + } + + if (m_targetPivotValue) + { + delete[] m_targetPivotValue; + m_targetPivotValue = NULL; + } + +#endif // if J0149_TONE_MAPPING_SEI + free(m_pchInputFile); + free(m_pchBitstreamFile); + free(m_pchReconFile); + free(m_pchdQPFile); + free(m_pColumnWidth); + free(m_pRowHeight); + free(m_scalingListFile); +} + +Void TAppEncCfg::create() +{} + +Void TAppEncCfg::destroy() +{} + +std::istringstream &operator >>(std::istringstream &in, GOPEntry &entry) //input +{ + in >> entry.m_sliceType; + in >> entry.m_POC; + in >> entry.m_QPOffset; + in >> entry.m_QPFactor; + in >> entry.m_tcOffsetDiv2; + in >> entry.m_betaOffsetDiv2; + in >> entry.m_temporalId; + in >> entry.m_numRefPicsActive; + in >> entry.m_numRefPics; + for (Int i = 0; i < entry.m_numRefPics; i++) + { + in >> entry.m_referencePics[i]; + } + + in >> entry.m_interRPSPrediction; +#if AUTO_INTER_RPS + if (entry.m_interRPSPrediction == 1) + { + in >> entry.m_deltaRPS; + in >> entry.m_numRefIdc; + for (Int i = 0; i < entry.m_numRefIdc; i++) + { + in >> entry.m_refIdc[i]; + } + } + else if (entry.m_interRPSPrediction == 2) + { + in >> entry.m_deltaRPS; + } + +#else // if AUTO_INTER_RPS + if (entry.m_interRPSPrediction) + { + in >> entry.m_deltaRPS; + in >> entry.m_numRefIdc; + for (Int i = 0; i < entry.m_numRefIdc; i++) + { + in >> entry.m_refIdc[i]; + } + } + +#endif // if AUTO_INTER_RPS + return in; +} + +static const struct MapStrToProfile +{ + const Char *str; + Profile::Name value; +} strToProfile[] = +{ + { "none", Profile::NONE }, + { "main", Profile::MAIN }, + { "main10", Profile::MAIN10 }, + { "main-still-picture", Profile::MAINSTILLPICTURE }, +}; + +static const struct MapStrToTier +{ + const Char *str; + Level::Tier value; +} strToTier[] = +{ + { "main", Level::MAIN }, + { "high", Level::HIGH }, +}; + +static const struct MapStrToLevel +{ + const Char *str; + Level::Name value; +} strToLevel[] = +{ + { "none", Level::NONE }, + { "1", Level::LEVEL1 }, + { "2", Level::LEVEL2 }, + { "2.1", Level::LEVEL2_1 }, + { "3", Level::LEVEL3 }, + { "3.1", Level::LEVEL3_1 }, + { "4", Level::LEVEL4 }, + { "4.1", Level::LEVEL4_1 }, + { "5", Level::LEVEL5 }, + { "5.1", Level::LEVEL5_1 }, + { "5.2", Level::LEVEL5_2 }, + { "6", Level::LEVEL6 }, + { "6.1", Level::LEVEL6_1 }, + { "6.2", Level::LEVEL6_2 }, +}; + +template<typename T, typename P> +static istream &readStrToEnum(P map[], unsigned long mapLen, istream &in, T &val) +{ + string str; + + in >> str; + + for (Int i = 0; i < mapLen; i++) + { + if (str == map[i].str) + { + val = map[i].value; + goto found; + } + } + + /* not found */ + in.setstate(ios::failbit); +found: + return in; +} + +static istream &operator >>(istream &in, Profile::Name &profile) +{ + return readStrToEnum(strToProfile, sizeof(strToProfile) / sizeof(*strToProfile), in, profile); +} + +static istream &operator >>(istream &in, Level::Tier &tier) +{ + return readStrToEnum(strToTier, sizeof(strToTier) / sizeof(*strToTier), in, tier); +} + +static istream &operator >>(istream &in, Level::Name &level) +{ + return readStrToEnum(strToLevel, sizeof(strToLevel) / sizeof(*strToLevel), in, level); +} + +#if SIGNAL_BITRATE_PICRATE_IN_VPS +Void readBoolString(const string inpString, const Int numEntries, Bool* &memberArray, const char *elementName); +Void readIntString(const string inpString, const Int numEntries, Int* &memberArray, const char *elementName); +#endif +// ==================================================================================================================== +// Public member functions +// ==================================================================================================================== + +/** \param argc number of arguments + \param argv array of arguments + \retval true when success + */ +Bool TAppEncCfg::parseCfg(Int argc, Char *argv[]) + +{ + Bool do_help = false; + + string cfg_InputFile; + string cfg_BitstreamFile; + string cfg_ReconFile; + string cfg_dQPFile; + string cfg_ColumnWidth; + string cfg_RowHeight; + string cfg_ScalingListFile; + +#if J0149_TONE_MAPPING_SEI + string cfg_startOfCodedInterval; + string cfg_codedPivotValue; + string cfg_targetPivotValue; +#endif +#if SIGNAL_BITRATE_PICRATE_IN_VPS + string cfg_bitRateInfoPresentFlag; + string cfg_picRateInfoPresentFlag; + string cfg_avgBitRate; + string cfg_maxBitRate; + string cfg_avgPicRate; + string cfg_constantPicRateIdc; +#endif + po::Options opts; + opts.addOptions() + ("help", do_help, false, "this help text") + ("c", po::parseConfigFile, "configuration file name") + + // File, I/O and source parameters + ("InputFile,i", cfg_InputFile, string(""), "Original YUV input file name") + ("BitstreamFile,b", cfg_BitstreamFile, string(""), "Bitstream output file name") + ("ReconFile,o", cfg_ReconFile, string(""), "Reconstructed YUV output file name") + ("SourceWidth,-wdt", m_iSourceWidth, 0, "Source picture width") + ("SourceHeight,-hgt", m_iSourceHeight, 0, "Source picture height") + ("InputBitDepth", m_inputBitDepthY, 8, "Bit-depth of input file") + ("OutputBitDepth", m_outputBitDepthY, 0, "Bit-depth of output file (default:InternalBitDepth)") + ("InternalBitDepth", m_internalBitDepthY, 0, "Bit-depth the codec operates at. (default:InputBitDepth)" + "If different to InputBitDepth, source data will be converted") + ("InputBitDepthC", m_inputBitDepthC, 0, + "As per InputBitDepth but for chroma component. (default:InputBitDepth)") + ("OutputBitDepthC", m_outputBitDepthC, 0, + "As per OutputBitDepth but for chroma component. (default:InternalBitDepthC)") + ("InternalBitDepthC", m_internalBitDepthC, 0, + "As per InternalBitDepth but for chroma component. (default:IntrenalBitDepth)") + ("ConformanceMode", m_conformanceMode, 0, + "Window conformance mode (0: no window, 1:automatic padding, 2:padding, 3:conformance") + ("HorizontalPadding,-pdx", m_aiPad[0], 0, "Horizontal source padding for conformance window mode 2") + ("VerticalPadding,-pdy", m_aiPad[1], 0, "Vertical source padding for conformance window mode 2") + ("ConfLeft", m_confLeft, 0, "Left offset for window conformance mode 3") + ("ConfRight", m_confRight, 0, "Right offset for window conformance mode 3") + ("ConfTop", m_confTop, 0, "Top offset for window conformance mode 3") + ("ConfBottom", m_confBottom, 0, "Bottom offset for window conformance mode 3") + ("FrameRate,-fr", m_iFrameRate, 0, "Frame rate") + ("FrameSkip,-fs", m_FrameSkip, 0u, "Number of frames to skip at start of input YUV") + ("FramesToBeEncoded,f", m_framesToBeEncoded, 0, "Number of frames to be encoded (default=all)") + + // Profile and level + ("Profile", m_profile, Profile::NONE, "Profile to be used when encoding (Incomplete)") + ("Level", m_level, Level::NONE, "Level limit to be used, eg 5.1 (Incomplete)") + ("Tier", m_levelTier, Level::MAIN, "Tier to use for interpretation of --Level") + +#if L0046_CONSTRAINT_FLAGS + ("ProgressiveSource", m_progressiveSourceFlag, false, "Indicate that source is progressive") + ("InterlacedSource", m_interlacedSourceFlag, false, "Indicate that source is interlaced") + ("NonPackedSource", m_nonPackedConstraintFlag, false, "Indicate that source does not contain frame packing") + ("FrameOnly", m_frameOnlyConstraintFlag, false, "Indicate that the bitstream contains only frames") +#endif + + // Unit definition parameters + ("MaxCUWidth", m_uiMaxCUWidth, 64u) + ("MaxCUHeight", m_uiMaxCUHeight, 64u) + // todo: remove defaults from MaxCUSize + ("MaxCUSize,s", m_uiMaxCUWidth, 64u, "Maximum CU size") + ("MaxCUSize,s", m_uiMaxCUHeight, 64u, "Maximum CU size") + ("MaxPartitionDepth,h", m_uiMaxCUDepth, 4u, "CU depth") + + ("QuadtreeTULog2MaxSize", m_uiQuadtreeTULog2MaxSize, 6u, "Maximum TU size in logarithm base 2") + ("QuadtreeTULog2MinSize", m_uiQuadtreeTULog2MinSize, 2u, "Minimum TU size in logarithm base 2") + + ("QuadtreeTUMaxDepthIntra", m_uiQuadtreeTUMaxDepthIntra, 1u, "Depth of TU tree for intra CUs") + ("QuadtreeTUMaxDepthInter", m_uiQuadtreeTUMaxDepthInter, 2u, "Depth of TU tree for inter CUs") + + // Coding structure paramters + ("IntraPeriod,-ip", m_iIntraPeriod, -1, "Intra period in frames, (-1: only first frame)") + ("DecodingRefreshType,-dr", m_iDecodingRefreshType, 0, "Intra refresh type (0:none 1:CRA 2:IDR)") + ("GOPSize,g", m_iGOPSize, 1, "GOP size of temporal structure") + ("ListCombination,-lc", m_bUseLComb, true, + "Combined reference list for uni-prediction estimation in B-slices") + // motion options + ("FastSearch", m_iFastSearch, 1, "0:Full search 1:Diamond 2:PMVFAST") + ("SearchRange,-sr", m_iSearchRange, 96, "Motion search range") + ("BipredSearchRange", m_bipredSearchRange, 4, "Motion search range for bipred refinement") + ("HadamardME", m_bUseHADME, true, "Hadamard ME for fractional-pel") + ("ASR", m_bUseASR, false, "Adaptive motion search range") + + // Mode decision parameters + ("LambdaModifier0,-LM0", m_adLambdaModifier[0], (Double)1.0, "Lambda modifier for temporal layer 0") + ("LambdaModifier1,-LM1", m_adLambdaModifier[1], (Double)1.0, "Lambda modifier for temporal layer 1") + ("LambdaModifier2,-LM2", m_adLambdaModifier[2], (Double)1.0, "Lambda modifier for temporal layer 2") + ("LambdaModifier3,-LM3", m_adLambdaModifier[3], (Double)1.0, "Lambda modifier for temporal layer 3") + ("LambdaModifier4,-LM4", m_adLambdaModifier[4], (Double)1.0, "Lambda modifier for temporal layer 4") + ("LambdaModifier5,-LM5", m_adLambdaModifier[5], (Double)1.0, "Lambda modifier for temporal layer 5") + ("LambdaModifier6,-LM6", m_adLambdaModifier[6], (Double)1.0, "Lambda modifier for temporal layer 6") + ("LambdaModifier7,-LM7", m_adLambdaModifier[7], (Double)1.0, "Lambda modifier for temporal layer 7") + + /* Quantization parameters */ + ("QP,q", m_fQP, 30.0, "Qp value, if value is float, QP is switched once during encoding") + ("DeltaQpRD,-dqr", m_uiDeltaQpRD, 0u, "max dQp offset for slice") + ("MaxDeltaQP,d", m_iMaxDeltaQP, 0, "max dQp offset for block") + ("MaxCuDQPDepth,-dqd", m_iMaxCuDQPDepth, 0, "max depth for a minimum CuDQP") + + ("CbQpOffset,-cbqpofs", m_cbQpOffset, 0, "Chroma Cb QP Offset") + ("CrQpOffset,-crqpofs", m_crQpOffset, 0, "Chroma Cr QP Offset") + +#if ADAPTIVE_QP_SELECTION + ("AdaptiveQpSelection,-aqps", m_bUseAdaptQpSelect, false, "AdaptiveQpSelection") +#endif + + ("AdaptiveQP,-aq", m_bUseAdaptiveQP, false, "QP adaptation based on a psycho-visual model") + ("MaxQPAdaptationRange,-aqr", m_iQPAdaptationRange, 6, "QP adaptation range") + ("dQPFile,m", cfg_dQPFile, string(""), "dQP file name") + ("RDOQ", m_useRDOQ, true) + ("RDOQTS", m_useRDOQTS, true) +#if L0232_RD_PENALTY + ("RDpenalty", m_rdPenalty, 0, + "RD-penalty for 32x32 TU for intra in non-intra slices. 0:disbaled 1:RD-penalty 2:maximum RD-penalty") +#endif + // Entropy coding parameters + ("SBACRD", m_bUseSBACRD, true, "SBAC based RD estimation") + + // Deblocking filter parameters + ("LoopFilterDisable", m_bLoopFilterDisable, false) + ("LoopFilterOffsetInPPS", m_loopFilterOffsetInPPS, false) + ("LoopFilterBetaOffset_div2", m_loopFilterBetaOffsetDiv2, 0) + ("LoopFilterTcOffset_div2", m_loopFilterTcOffsetDiv2, 0) + ("DeblockingFilterControlPresent", m_DeblockingFilterControlPresent, false) +#if L0386_DB_METRIC + ("DeblockingFilterMetric", m_DeblockingFilterMetric, false) +#endif + + // Coding tools + ("AMP", m_enableAMP, true, "Enable asymmetric motion partitions") + ("TransformSkip", m_useTransformSkip, false, "Intra transform skipping") + ("TransformSkipFast", m_useTransformSkipFast, false, "Fast intra transform skipping") + ("SAO", m_bUseSAO, true, "Enable Sample Adaptive Offset") + ("MaxNumOffsetsPerPic", m_maxNumOffsetsPerPic, 2048, "Max number of SAO offset per picture (Default: 2048)") + ("SAOLcuBoundary", m_saoLcuBoundary, false, + "0: right/bottom LCU boundary areas skipped from SAO parameter estimation, 1: non-deblocked pixels are used for those areas") + ("SAOLcuBasedOptimization", m_saoLcuBasedOptimization, true, + "0: SAO picture-based optimization, 1: SAO LCU-based optimization ") + ("SliceMode", m_sliceMode, 0, + "0: Disable all Recon slice limits, 1: Enforce max # of LCUs, 2: Enforce max # of bytes, 3:specify tiles per dependent slice") + ("SliceArgument", m_sliceArgument, 0, "Depending on SliceMode being:" + "\t1: max number of CTUs per slice" + "\t2: max number of bytes per slice" + "\t3: max number of tiles per slice") + ("SliceSegmentMode", m_sliceSegmentMode, 0, + "0: Disable all slice segment limits, 1: Enforce max # of LCUs, 2: Enforce max # of bytes, 3:specify tiles per dependent slice") + ("SliceSegmentArgument", m_sliceSegmentArgument, 0, "Depending on SliceSegmentMode being:" + "\t1: max number of CTUs per slice segment" + "\t2: max number of bytes per slice segment" + "\t3: max number of tiles per slice segment") + ("LFCrossSliceBoundaryFlag", m_bLFCrossSliceBoundaryFlag, true) + + ("ConstrainedIntraPred", m_bUseConstrainedIntraPred, false, "Constrained Intra Prediction") + + ("PCMEnabledFlag", m_usePCM, false) + ("PCMLog2MaxSize", m_pcmLog2MaxSize, 5u) + ("PCMLog2MinSize", m_uiPCMLog2MinSize, 3u) + ("PCMInputBitDepthFlag", m_bPCMInputBitDepthFlag, true) + ("PCMFilterDisableFlag", m_bPCMFilterDisableFlag, false) + + ("LosslessCuEnabled", m_useLossless, false) + + ("WeightedPredP,-wpP", m_useWeightedPred, false, "Use weighted prediction in P slices") + ("WeightedPredB,-wpB", m_useWeightedBiPred, false, + "Use weighted (bidirectional) prediction in B slices") + ("Log2ParallelMergeLevel", m_log2ParallelMergeLevel, 2u, "Parallel merge estimation region") + ("UniformSpacingIdc", m_iUniformSpacingIdr, 0, + "Indicates if the column and row boundaries are distributed uniformly") + ("NumTileColumnsMinus1", m_iNumColumnsMinus1, 0, "Number of columns in a picture minus 1") + ("ColumnWidthArray", cfg_ColumnWidth, string(""), + "Array containing ColumnWidth values in units of LCU") + ("NumTileRowsMinus1", m_iNumRowsMinus1, 0, "Number of rows in a picture minus 1") + ("RowHeightArray", cfg_RowHeight, string(""), + "Array containing RowHeight values in units of LCU") + ("LFCrossTileBoundaryFlag", m_bLFCrossTileBoundaryFlag, true, + "1: cross-tile-boundary loop filtering. 0:non-cross-tile-boundary loop filtering") + ("WaveFrontSynchro", m_iWaveFrontSynchro, 0, + "0: no synchro; 1 synchro with TR; 2 TRR etc") + ("ScalingList", m_useScalingListId, 0, + "0: no scaling list, 1: default scaling lists, 2: scaling lists specified in ScalingListFile") + ("ScalingListFile", cfg_ScalingListFile, string(""), "Scaling list file name") + ("SignHideFlag,-SBH", m_signHideFlag, 1) + ("MaxNumMergeCand", m_maxNumMergeCand, 5u, "Maximum number of merge candidates") + + /* Misc. */ + ("SEIDecodedPictureHash", m_decodedPictureHashSEIEnabled, 0, + "Control generation of decode picture hash SEI messages\n" + "\t3: checksum\n" + "\t2: CRC\n" + "\t1: use MD5\n" + "\t0: disable") + ("SEIpictureDigest", m_decodedPictureHashSEIEnabled, 0, "deprecated alias for SEIDecodedPictureHash") + ("TMVPMode", m_TMVPModeId, 1, + "TMVP mode 0: TMVP disable for all slices. 1: TMVP enable for all slices (default) 2: TMVP enable for certain slices only") + ("FEN", m_bUseFastEnc, false, "fast encoder setting") + ("ECU", m_bUseEarlyCU, false, "Early CU setting") + ("FDM", m_useFastDecisionForMerge, true, "Fast decision for Merge RD Cost") + ("CFM", m_bUseCbfFastMode, false, "Cbf fast mode setting") + ("ESD", m_useEarlySkipDetection, false, "Early SKIP detection setting") +#if RATE_CONTROL_LAMBDA_DOMAIN + ("RateControl", m_RCEnableRateControl, false, "Rate control: enable rate control") + ("TargetBitrate", m_RCTargetBitrate, 0, "Rate control: target bitrate") + ("KeepHierarchicalBit", m_RCKeepHierarchicalBit, false, + "Rate control: keep hierarchical bit allocation in rate control algorithm") + ("LCULevelRateControl", m_RCLCULevelRC, true, "Rate control: true: LCU level RC; false: picture level RC") + ("RCLCUSeparateModel", m_RCUseLCUSeparateModel, true, "Rate control: use LCU level separate R-lambda model") + ("InitialQP", m_RCInitialQP, 0, "Rate control: initial QP") + ("RCForceIntraQP", m_RCForceIntraQP, false, "Rate control: force intra QP to be equal to initial QP") +#else + ("RateCtrl,-rc", m_enableRateCtrl, false, "Rate control on/off") + ("TargetBitrate,-tbr", m_targetBitrate, 0, "Input target bitrate") + ("NumLCUInUnit,-nu", m_numLCUInUnit, 0, "Number of LCUs in an Unit") +#endif // if RATE_CONTROL_LAMBDA_DOMAIN + + ("TransquantBypassEnableFlag", m_TransquantBypassEnableFlag, false, "transquant_bypass_enable_flag indicator in PPS") + ("CUTransquantBypassFlagValue", m_CUTransquantBypassFlagValue, false, + "Fixed cu_transquant_bypass_flag value, when transquant_bypass_enable_flag is enabled") + ("RecalculateQPAccordingToLambda", m_recalculateQPAccordingToLambda, false, + "Recalculate QP values according to lambda values. Do not suggest to be enabled in all intra case") + ("StrongIntraSmoothing,-sis", m_useStrongIntraSmoothing, true, + "Enable strong intra smoothing for 32x32 blocks") + ("SEIActiveParameterSets", m_activeParameterSetsSEIEnabled, 0, + "Enable generation of active parameter sets SEI messages") + ("VuiParametersPresent,-vui", m_vuiParametersPresentFlag, false, "Enable generation of vui_parameters()") + ("AspectRatioInfoPresent", m_aspectRatioInfoPresentFlag, false, + "Signals whether aspect_ratio_idc is present") + ("AspectRatioIdc", m_aspectRatioIdc, 0, "aspect_ratio_idc") + ("SarWidth", m_sarWidth, 0, + "horizontal size of the sample aspect ratio") + ("SarHeight", m_sarHeight, 0, + "vertical size of the sample aspect ratio") + ("OverscanInfoPresent", m_overscanInfoPresentFlag, false, + "Indicates whether conformant decoded pictures are suitable for display using overscan\n") + ("OverscanAppropriate", m_overscanAppropriateFlag, false, + "Indicates whether conformant decoded pictures are suitable for display using overscan\n") + ("VideoSignalTypePresent", m_videoSignalTypePresentFlag, false, + "Signals whether video_format, video_full_range_flag, and colour_description_present_flag are present") + ("VideoFormat", m_videoFormat, 5, "Indicates representation of pictures") + ("VideoFullRange", m_videoFullRangeFlag, false, + "Indicates the black level and range of luma and chroma signals") + ("ColourDescriptionPresent", m_colourDescriptionPresentFlag, false, + "Signals whether colour_primaries, transfer_characteristics and matrix_coefficients are present") + ("ColourPrimaries", m_colourPrimaries, 2, + "Indicates chromaticity coordinates of the source primaries") + ("TransferCharateristics", m_transferCharacteristics, 2, + "Indicates the opto-electronic transfer characteristics of the source") + ("MatrixCoefficients", m_matrixCoefficients, 2, + "Describes the matrix coefficients used in deriving luma and chroma from RGB primaries") + ("ChromaLocInfoPresent", m_chromaLocInfoPresentFlag, false, + "Signals whether chroma_sample_loc_type_top_field and chroma_sample_loc_type_bottom_field are present") + ("ChromaSampleLocTypeTopField", m_chromaSampleLocTypeTopField, 0, + "Specifies the location of chroma samples for top field") + ("ChromaSampleLocTypeBottomField", m_chromaSampleLocTypeBottomField, 0, + "Specifies the location of chroma samples for bottom field") + ("NeutralChromaIndication", m_neutralChromaIndicationFlag, false, + "Indicates that the value of all decoded chroma samples is equal to 1<<(BitDepthCr-1)") + ("DefaultDisplayWindowFlag", m_defaultDisplayWindowFlag, false, + "Indicates the presence of the Default Window parameters") + ("DefDispWinLeftOffset", m_defDispWinLeftOffset, 0, + "Specifies the left offset of the default display window from the conformance window") + ("DefDispWinRightOffset", m_defDispWinRightOffset, 0, + "Specifies the right offset of the default display window from the conformance window") + ("DefDispWinTopOffset", m_defDispWinTopOffset, 0, + "Specifies the top offset of the default display window from the conformance window") + ("DefDispWinBottomOffset", m_defDispWinBottomOffset, 0, + "Specifies the bottom offset of the default display window from the conformance window") + ("FrameFieldInfoPresentFlag", m_frameFieldInfoPresentFlag, false, + "Indicates that pic_struct and field coding related values are present in picture timing SEI messages") + ("PocProportionalToTimingFlag", m_pocProportionalToTimingFlag, false, + "Indicates that the POC value is proportional to the output time w.r.t. first picture in CVS") + ("NumTicksPocDiffOneMinus1", m_numTicksPocDiffOneMinus1, 0, + "Number of ticks minus 1 that for a POC difference of one") + ("BitstreamRestriction", m_bitstreamRestrictionFlag, false, + "Signals whether bitstream restriction parameters are present") + ("TilesFixedStructure", m_tilesFixedStructureFlag, false, + "Indicates that each active picture parameter set has the same values of the syntax elements related to tiles") + ("MotionVectorsOverPicBoundaries", m_motionVectorsOverPicBoundariesFlag, false, + "Indicates that no samples outside the picture boundaries are used for inter prediction") + ("MaxBytesPerPicDenom", m_maxBytesPerPicDenom, 2, + "Indicates a number of bytes not exceeded by the sum of the sizes of the VCL NAL units associated with any coded picture") + ("MaxBitsPerMinCuDenom", m_maxBitsPerMinCuDenom, 1, + "Indicates an upper bound for the number of bits of coding_unit() data") + ("Log2MaxMvLengthHorizontal", m_log2MaxMvLengthHorizontal, 15, + "Indicate the maximum absolute value of a decoded horizontal MV component in quarter-pel luma units") + ("Log2MaxMvLengthVertical", m_log2MaxMvLengthVertical, 15, + "Indicate the maximum absolute value of a decoded vertical MV component in quarter-pel luma units") + ("SEIRecoveryPoint", m_recoveryPointSEIEnabled, 0, + "Control generation of recovery point SEI messages") + ("SEIBufferingPeriod", m_bufferingPeriodSEIEnabled, 0, + "Control generation of buffering period SEI messages") + ("SEIPictureTiming", m_pictureTimingSEIEnabled, 0, + "Control generation of picture timing SEI messages") +#if J0149_TONE_MAPPING_SEI + ("SEIToneMappingInfo", m_toneMappingInfoSEIEnabled, false, + "Control generation of Tone Mapping SEI messages") + ("SEIToneMapId", m_toneMapId, 0, + "Specifies Id of Tone Mapping SEI message for a given session") + ("SEIToneMapCancelFlag", m_toneMapCancelFlag, false, + "Indicates that Tone Mapping SEI message cancels the persistance or follows") + ("SEIToneMapPersistenceFlag", m_toneMapPersistenceFlag, true, + "Specifies the persistence of the Tone Mapping SEI message") + ("SEIToneMapCodedDataBitDepth", m_toneMapCodedDataBitDepth, 8, + "Specifies Coded Data BitDepth of Tone Mapping SEI messages") + ("SEIToneMapTargetBitDepth", m_toneMapTargetBitDepth, 8, + "Specifies Output BitDepth of Tome mapping function") + ("SEIToneMapModelId", m_toneMapModelId, 0, + "Specifies Model utilized for mapping coded data into target_bit_depth range\n" + "\t0: linear mapping with clipping\n" + "\t1: sigmoidal mapping\n" + "\t2: user-defined table mapping\n" + "\t3: piece-wise linear mapping\n" + "\t4: luminance dynamic range information ") + ("SEIToneMapMinValue", m_toneMapMinValue, 0, + "Specifies the minimum value in mode 0") + ("SEIToneMapMaxValue", m_toneMapMaxValue, 1023, + "Specifies the maxmum value in mode 0") + ("SEIToneMapSigmoidMidpoint", m_sigmoidMidpoint, 512, + "Specifies the centre point in mode 1") + ("SEIToneMapSigmoidWidth", m_sigmoidWidth, 960, + "Specifies the distance between 5% and 95% values of the target_bit_depth in mode 1") + ("SEIToneMapStartOfCodedInterval", cfg_startOfCodedInterval, string(""), + "Array of user-defined mapping table") + ("SEIToneMapNumPivots", m_numPivots, 0, + "Specifies the number of pivot points in mode 3") + ("SEIToneMapCodedPivotValue", cfg_codedPivotValue, string(""), "Array of pivot point") + ("SEIToneMapTargetPivotValue", cfg_targetPivotValue, string(""), "Array of pivot point") + ("SEIToneMapCameraIsoSpeedIdc", m_cameraIsoSpeedIdc, 0, + "Indicates the camera ISO speed for daylight illumination") + ("SEIToneMapCameraIsoSpeedValue", m_cameraIsoSpeedValue, 400, + "Specifies the camera ISO speed for daylight illumination of Extended_ISO") + ("SEIToneMapExposureCompensationValueSignFlag", m_exposureCompensationValueSignFlag, 0, + "Specifies the sign of ExposureCompensationValue") + ("SEIToneMapExposureCompensationValueNumerator", m_exposureCompensationValueNumerator, 0, + "Specifies the numerator of ExposureCompensationValue") + ("SEIToneMapExposureCompensationValueDenomIdc", m_exposureCompensationValueDenomIdc, 2, + "Specifies the denominator of ExposureCompensationValue") + ("SEIToneMapRefScreenLuminanceWhite", m_refScreenLuminanceWhite, 350, + "Specifies reference screen brightness setting in units of candela per square metre") + ("SEIToneMapExtendedRangeWhiteLevel", m_extendedRangeWhiteLevel, 800, + "Indicates the luminance dynamic range") + ("SEIToneMapNominalBlackLevelLumaCodeValue", m_nominalBlackLevelLumaCodeValue, 16, + "Specifies luma sample value of the nominal black level assigned decoded pictures") + ("SEIToneMapNominalWhiteLevelLumaCodeValue", m_nominalWhiteLevelLumaCodeValue, 235, + "Specifies luma sample value of the nominal white level assigned decoded pictures") + ("SEIToneMapExtendedWhiteLevelLumaCodeValue", m_extendedWhiteLevelLumaCodeValue, 300, + "Specifies luma sample value of the extended dynamic range assigned decoded pictures") +#endif // if J0149_TONE_MAPPING_SEI + ("SEIFramePacking", m_framePackingSEIEnabled, 0, + "Control generation of frame packing SEI messages") + ("SEIFramePackingType", m_framePackingSEIType, 0, "Define frame packing arrangement\n" + "\t0: checkerboard - pixels alternatively represent either frames\n" + "\t1: column alternation - frames are interlaced by column\n" + "\t2: row alternation - frames are interlaced by row\n" + "\t3: side by side - frames are displayed horizontally\n" + "\t4: top bottom - frames are displayed vertically\n" + "\t5: frame alternation - one frame is alternated with the other") + ("SEIFramePackingId", m_framePackingSEIId, 0, + "Id of frame packing SEI message for a given session") + ("SEIFramePackingQuincunx", m_framePackingSEIQuincunx, 0, + "Indicate the presence of a Quincunx type video frame") + ("SEIFramePackingInterpretation", m_framePackingSEIInterpretation, 0, + "Indicate the interpretation of the frame pair\n" + "\t0: unspecified\n" + "\t1: stereo pair, frame0 represents left view\n" + "\t2: stereo pair, frame0 represents right view") + ("SEIDisplayOrientation", m_displayOrientationSEIAngle, 0, + "Control generation of display orientation SEI messages\n" + "\tN: 0 < N < (2^16 - 1) enable display orientation SEI message with anticlockwise_rotation = N and display_orientation_repetition_period = 1\n" + "\t0: disable") + ("SEITemporalLevel0Index", m_temporalLevel0IndexSEIEnabled, 0, + "Control generation of temporal level 0 index SEI messages") + ("SEIGradualDecodingRefreshInfo", m_gradualDecodingRefreshInfoEnabled, 0, + "Control generation of gradual decoding refresh information SEI message") + ("SEIDecodingUnitInfo", m_decodingUnitInfoSEIEnabled, 0, + "Control generation of decoding unit information SEI message.") +#if L0208_SOP_DESCRIPTION_SEI + ("SEISOPDescription", m_SOPDescriptionSEIEnabled, 0, + "Control generation of SOP description SEI messages") +#endif +#if K0180_SCALABLE_NESTING_SEI + ("SEIScalableNesting", m_scalableNestingSEIEnabled, 0, + "Control generation of scalable nesting SEI messages") +#endif +#if SIGNAL_BITRATE_PICRATE_IN_VPS + ("BitRatePicRateMaxTLayers", m_bitRatePicRateMaxTLayers, 0, + "Maximum number of sub-layers signalled; can be inferred otherwise; here for easy parsing of config. file") + ("BitRateInfoPresent", cfg_bitRateInfoPresentFlag, string(""), + "Control signalling of bit rate information of avg. bit rate and max. bit rate in VPS\n" + "\t0: Do not sent bit rate info\n" + "\tN (N > 0): Send bit rate info for N sub-layers. N should equal maxTempLayers.") + ("PicRateInfoPresent", cfg_picRateInfoPresentFlag, string(""), + "Control signalling of picture rate information of avg. bit rate and max. bit rate in VPS\n" + "\t0: Do not sent picture rate info\n" + "\tN (N > 0): Send picture rate info for N sub-layers. N should equal maxTempLayers.") + ("AvgBitRate", cfg_avgBitRate, string(""), + "List of avg. bit rates for the different sub-layers; include non-negative number even if corresponding flag is 0") + ("MaxBitRate", cfg_maxBitRate, string(""), + "List of max. bit rates for the different sub-layers; include non-negative number even if corresponding flag is 0") + ("AvgPicRate", cfg_avgPicRate, string(""), + "List of avg. picture rates for the different sub-layers; include non-negative number even if corresponding flag is 0") + ("ConstantPicRateIdc", cfg_constantPicRateIdc, string(""), + "List of constant picture rate IDCs; include non-negative number even if corresponding flag is 0") +#endif // if SIGNAL_BITRATE_PICRATE_IN_VPS + ; + + for (Int i = 1; i < MAX_GOP + 1; i++) + { + std::ostringstream cOSS; + cOSS << "Frame" << i; + opts.addOptions() (cOSS.str(), m_GOPList[i - 1], GOPEntry()); + } + + po::setDefaults(opts); + const list<const Char *>& argv_unhandled = po::scanArgv(opts, argc, (const Char**)argv); + + for (list<const Char *>::const_iterator it = argv_unhandled.begin(); it != argv_unhandled.end(); it++) + { + fprintf(stderr, "Unhandled argument ignored: `%s'\n", *it); + } + + if (argc == 1 || do_help) + { + /* argc == 1: no options have been specified */ + po::doHelp(cout, opts); + return false; + } + + /* + * Set any derived parameters + */ + + /* convert std::string to c string for compatability */ + m_pchInputFile = cfg_InputFile.empty() ? NULL : strdup(cfg_InputFile.c_str()); + m_pchBitstreamFile = cfg_BitstreamFile.empty() ? NULL : strdup(cfg_BitstreamFile.c_str()); + m_pchReconFile = cfg_ReconFile.empty() ? NULL : strdup(cfg_ReconFile.c_str()); + m_pchdQPFile = cfg_dQPFile.empty() ? NULL : strdup(cfg_dQPFile.c_str()); + + /* parse the width, height, frame rate from the y4m files if it is not given in the configuration file */ + char * s = strrchr(m_pchInputFile, '.'); + handler_input = NULL; + handler_recon = NULL; + + if ((!strcmp(s + 1, "y4m"))) + { + m_cTVideoIOInputFile = new TVideoIOY4m(); + m_cTVideoIOReconFile = new TVideoIOY4m(); + /* get the video information like width,height,framerate */ + m_cTVideoIOInputFile->open(m_pchInputFile, + false, + m_inputBitDepthY, + m_inputBitDepthC, + m_internalBitDepthY, + m_internalBitDepthC, + handler_input, + video_info, + m_aiPad); + m_cTVideoIOInputFile->getVideoInfo(video_info, handler_input); + m_iSourceWidth = video_info.width; + m_iSourceHeight = video_info.height; + m_iFrameRate = video_info.FrameRate; + } + else if ((!strcmp(s + 1, "yuv"))) + { + m_cTVideoIOInputFile = new TVideoIOYuv(); + m_cTVideoIOReconFile = new TVideoIOYuv(); + } + + Char *pColumnWidth = cfg_ColumnWidth.empty() ? NULL : strdup(cfg_ColumnWidth.c_str()); + Char *pRowHeight = cfg_RowHeight.empty() ? NULL : strdup(cfg_RowHeight.c_str()); + if (m_iUniformSpacingIdr == 0 && m_iNumColumnsMinus1 > 0) + { + char *columnWidth; + int i = 0; + m_pColumnWidth = new UInt[m_iNumColumnsMinus1]; + columnWidth = strtok(pColumnWidth, " ,-"); + while (columnWidth != NULL) + { + if (i >= m_iNumColumnsMinus1) + { + printf("The number of columns whose width are defined is larger than the allowed number of columns.\n"); + exit(EXIT_FAILURE); + } + + *(m_pColumnWidth + i) = atoi(columnWidth); + columnWidth = strtok(NULL, " ,-"); + i++; + } + + if (i < m_iNumColumnsMinus1) + { + printf("The width of some columns is not defined.\n"); + exit(EXIT_FAILURE); + } + } + else + { + m_pColumnWidth = NULL; + } + + if (m_iUniformSpacingIdr == 0 && m_iNumRowsMinus1 > 0) + { + char *rowHeight; + int i = 0; + m_pRowHeight = new UInt[m_iNumRowsMinus1]; + rowHeight = strtok(pRowHeight, " ,-"); + while (rowHeight != NULL) + { + if (i >= m_iNumRowsMinus1) + { + printf("The number of rows whose height are defined is larger than the allowed number of rows.\n"); + exit(EXIT_FAILURE); + } + + *(m_pRowHeight + i) = atoi(rowHeight); + rowHeight = strtok(NULL, " ,-"); + i++; + } + + if (i < m_iNumRowsMinus1) + { + printf("The height of some rows is not defined.\n"); + exit(EXIT_FAILURE); + } + } + else + { + m_pRowHeight = NULL; + } + +#if SIGNAL_BITRATE_PICRATE_IN_VPS + readBoolString(cfg_bitRateInfoPresentFlag, + m_bitRatePicRateMaxTLayers, + m_bitRateInfoPresentFlag, + "bit rate info. present flag"); + readIntString(cfg_avgBitRate, m_bitRatePicRateMaxTLayers, m_avgBitRate, "avg. bit rate"); + readIntString(cfg_maxBitRate, m_bitRatePicRateMaxTLayers, m_maxBitRate, "max. bit rate"); + readBoolString(cfg_picRateInfoPresentFlag, + m_bitRatePicRateMaxTLayers, + m_picRateInfoPresentFlag, + "bit rate info. present flag"); + readIntString(cfg_avgPicRate, m_bitRatePicRateMaxTLayers, m_avgPicRate, "avg. pic rate"); + readIntString(cfg_constantPicRateIdc, m_bitRatePicRateMaxTLayers, m_constantPicRateIdc, "constant pic rate Idc"); +#endif // if SIGNAL_BITRATE_PICRATE_IN_VPS + m_scalingListFile = cfg_ScalingListFile.empty() ? NULL : strdup(cfg_ScalingListFile.c_str()); + + /* rules for input, output and internal bitdepths as per help text */ + if (!m_internalBitDepthY) + { + m_internalBitDepthY = m_inputBitDepthY; + } + + if (!m_internalBitDepthC) + { + m_internalBitDepthC = m_internalBitDepthY; + } + + if (!m_inputBitDepthC) + { + m_inputBitDepthC = m_inputBitDepthY; + } + + if (!m_outputBitDepthY) + { + m_outputBitDepthY = m_internalBitDepthY; + } + + if (!m_outputBitDepthC) + { + m_outputBitDepthC = m_internalBitDepthC; + } + + // TODO:ChromaFmt assumes 4:2:0 below + switch (m_conformanceMode) + { + case 0: + { + // no conformance or padding + m_confLeft = m_confRight = m_confTop = m_confBottom = 0; + m_aiPad[1] = m_aiPad[0] = 0; + break; + } + case 1: + { + // automatic padding to minimum CU size + Int minCuSize = m_uiMaxCUHeight >> (m_uiMaxCUDepth - 1); + if (m_iSourceWidth % minCuSize) + { + m_aiPad[0] = m_confRight = ((m_iSourceWidth / minCuSize) + 1) * minCuSize - m_iSourceWidth; + m_iSourceWidth += m_confRight; + } + + if (m_iSourceHeight % minCuSize) + { + m_aiPad[1] = m_confBottom = ((m_iSourceHeight / minCuSize) + 1) * minCuSize - m_iSourceHeight; + m_iSourceHeight += m_confBottom; + } + + if (m_aiPad[0] % TComSPS::getWinUnitX(CHROMA_420) != 0) + { + fprintf(stderr, "Error: picture width is not an integer multiple of the specified chroma subsampling\n"); + exit(EXIT_FAILURE); + } + + if (m_aiPad[1] % TComSPS::getWinUnitY(CHROMA_420) != 0) + { + fprintf(stderr, "Error: picture height is not an integer multiple of the specified chroma subsampling\n"); + exit(EXIT_FAILURE); + } + + break; + } + case 2: + { + //padding + m_iSourceWidth += m_aiPad[0]; + m_iSourceHeight += m_aiPad[1]; + m_confRight = m_aiPad[0]; + m_confBottom = m_aiPad[1]; + break; + } + case 3: + { + // conformance + if ((m_confLeft == 0) && (m_confRight == 0) && (m_confTop == 0) && (m_confBottom == 0)) + { + fprintf(stderr, "Warning: Conformance window enabled, but all conformance window parameters set to zero\n"); + } + + if ((m_aiPad[1] != 0) || (m_aiPad[0] != 0)) + { + fprintf(stderr, "Warning: Conformance window enabled, padding parameters will be ignored\n"); + } + + m_aiPad[1] = m_aiPad[0] = 0; + break; + } + } + + // allocate slice-based dQP values + m_aidQP = new Int[m_framesToBeEncoded + m_iGOPSize + 1]; + ::memset(m_aidQP, 0, sizeof(Int) * (m_framesToBeEncoded + m_iGOPSize + 1)); + + // handling of floating-point QP values + // if QP is not integer, sequence is split into two sections having QP and QP+1 + m_iQP = (Int)(m_fQP); + if (m_iQP < m_fQP) + { + Int iSwitchPOC = (Int)(m_framesToBeEncoded - (m_fQP - m_iQP) * m_framesToBeEncoded + 0.5); + + iSwitchPOC = (Int)((Double)iSwitchPOC / m_iGOPSize + 0.5) * m_iGOPSize; + for (Int i = iSwitchPOC; i < m_framesToBeEncoded + m_iGOPSize + 1; i++) + { + m_aidQP[i] = 1; + } + } + + // reading external dQP description from file + if (m_pchdQPFile) + { + FILE *fpt = fopen(m_pchdQPFile, "r"); + if (fpt) + { + Int iValue; + Int iPOC = 0; + while (iPOC < m_framesToBeEncoded) + { + if (fscanf(fpt, "%d", &iValue) == EOF) break; + + m_aidQP[iPOC] = iValue; + iPOC++; + } + + fclose(fpt); + } + } + + m_iWaveFrontSubstreams = m_iWaveFrontSynchro ? (m_iSourceHeight + m_uiMaxCUHeight - 1) / m_uiMaxCUHeight : 1; + +#if J0149_TONE_MAPPING_SEI + if (m_toneMappingInfoSEIEnabled && !m_toneMapCancelFlag) + { + Char *pcStartOfCodedInterval = cfg_startOfCodedInterval.empty() ? NULL : strdup(cfg_startOfCodedInterval.c_str()); + Char *pcCodedPivotValue = cfg_codedPivotValue.empty() ? NULL : strdup(cfg_codedPivotValue.c_str()); + Char *pcTargetPivotValue = cfg_targetPivotValue.empty() ? NULL : strdup(cfg_targetPivotValue.c_str()); + if (m_toneMapModelId == 2 && pcStartOfCodedInterval) + { + char *startOfCodedInterval; + UInt num = 1u << m_toneMapTargetBitDepth; + m_startOfCodedInterval = new Int[num]; + ::memset(m_startOfCodedInterval, 0, sizeof(Int) * num); + startOfCodedInterval = strtok(pcStartOfCodedInterval, " ."); + int i = 0; + while (startOfCodedInterval && (i < num)) + { + m_startOfCodedInterval[i] = atoi(startOfCodedInterval); + startOfCodedInterval = strtok(NULL, " ."); + i++; + } + } + else + { + m_startOfCodedInterval = NULL; + } + + if ((m_toneMapModelId == 3) && (m_numPivots > 0)) + { + if (pcCodedPivotValue && pcTargetPivotValue) + { + char *codedPivotValue; + char *targetPivotValue; + m_codedPivotValue = new Int[m_numPivots]; + m_targetPivotValue = new Int[m_numPivots]; + ::memset(m_codedPivotValue, 0, sizeof(Int) * (m_numPivots)); + ::memset(m_targetPivotValue, 0, sizeof(Int) * (m_numPivots)); + codedPivotValue = strtok(pcCodedPivotValue, " ."); + int i = 0; + while (codedPivotValue && i < m_numPivots) + { + m_codedPivotValue[i] = atoi(codedPivotValue); + codedPivotValue = strtok(NULL, " ."); + i++; + } + + i = 0; + targetPivotValue = strtok(pcTargetPivotValue, " ."); + while (targetPivotValue && i < m_numPivots) + { + m_targetPivotValue[i] = atoi(targetPivotValue); + targetPivotValue = strtok(NULL, " ."); + i++; + } + } + } + else + { + m_codedPivotValue = NULL; + m_targetPivotValue = NULL; + } + } + +#endif // if J0149_TONE_MAPPING_SEI + // check validity of input parameters + xCheckParameter(); + + // set global varibles + xSetGlobal(); + + // print-out parameters + xPrintParameter(); + + return true; +} + +#if SIGNAL_BITRATE_PICRATE_IN_VPS +Void readBoolString(const string inpString, const Int numEntries, Bool* &memberArray, const char *elementName) +{ + Char *inpArray = inpString.empty() ? NULL : strdup(inpString.c_str()); + Int i = 0; + + if (numEntries) + { + Char *tempArray = strtok(inpArray, " ,-"); + memberArray = new Bool[numEntries]; + while (tempArray != NULL) + { + if (i >= numEntries) + { + printf("The number of %s defined is larger than the allowed number\n", elementName); + exit(EXIT_FAILURE); + } + + assert((atoi(tempArray) == 0) || (atoi(tempArray) == 1)); + *(memberArray + i) = atoi(tempArray); + tempArray = strtok(NULL, " ,-"); + i++; + } + + if (i < numEntries) + { + printf("Some %s are not defined\n", elementName); + exit(EXIT_FAILURE); + } + } + else + { + memberArray = NULL; + } +} + +Void readIntString(const string inpString, const Int numEntries, Int* &memberArray, const char *elementName) +{ + Char *inpArray = inpString.empty() ? NULL : strdup(inpString.c_str()); + Int i = 0; + + if (numEntries) + { + Char *tempArray = strtok(inpArray, " ,-"); + memberArray = new Int[numEntries]; + while (tempArray != NULL) + { + if (i >= numEntries) + { + printf("The number of %s defined is larger than the allowed number\n", elementName); + exit(EXIT_FAILURE); + } + + *(memberArray + i) = atoi(tempArray); + tempArray = strtok(NULL, " ,-"); + i++; + } + + if (i < numEntries) + { + printf("Some %s are not defined\n", elementName); + exit(EXIT_FAILURE); + } + } + else + { + memberArray = NULL; + } +} + +#endif // if SIGNAL_BITRATE_PICRATE_IN_VPS +// ==================================================================================================================== +// Private member functions +// ==================================================================================================================== + +Bool confirmPara(Bool bflag, const Char *message); + +Void TAppEncCfg::xCheckParameter() +{ + if (!m_decodedPictureHashSEIEnabled) + { + fprintf(stderr, "******************************************************************\n"); + fprintf(stderr, "** WARNING: --SEIDecodedPictureHash is now disabled by default. **\n"); + fprintf(stderr, "** Automatic verification of decoded pictures by a **\n"); + fprintf(stderr, "** decoder requires this option to be enabled. **\n"); + fprintf(stderr, "******************************************************************\n"); + } + + Bool check_failed = false; /* abort if there is a fatal configuration problem */ +#define xConfirmPara(a, b) check_failed |= confirmPara(a, b) + // check range of parameters + xConfirmPara(m_inputBitDepthY < 8, "InputBitDepth must be at least 8"); + xConfirmPara(m_inputBitDepthC < 8, "InputBitDepthC must be at least 8"); + xConfirmPara(m_iFrameRate <= 0, "Frame rate must be more than 1"); + xConfirmPara(m_framesToBeEncoded <= 0, + "Total Number Of Frames encoded must be more than 0"); + xConfirmPara(m_iGOPSize < 1, + "GOP Size must be greater or equal to 1"); + xConfirmPara(m_iGOPSize > 1 && m_iGOPSize % 2, + "GOP Size must be a multiple of 2, if GOP Size is greater than 1"); + xConfirmPara((m_iIntraPeriod > 0 && m_iIntraPeriod < m_iGOPSize) || m_iIntraPeriod == 0, + "Intra period must be more than GOP size, or -1 , not 0"); + xConfirmPara(m_iDecodingRefreshType < 0 || m_iDecodingRefreshType > 2, + "Decoding Refresh Type must be equal to 0, 1 or 2"); + xConfirmPara(m_iQP < -6 * (m_internalBitDepthY - 8) || m_iQP > 51, + "QP exceeds supported range (-QpBDOffsety to 51)"); + xConfirmPara(m_loopFilterBetaOffsetDiv2 < -13 || m_loopFilterBetaOffsetDiv2 > 13, + "Loop Filter Beta Offset div. 2 exceeds supported range (-13 to 13)"); + xConfirmPara(m_loopFilterTcOffsetDiv2 < -13 || m_loopFilterTcOffsetDiv2 > 13, + "Loop Filter Tc Offset div. 2 exceeds supported range (-13 to 13)"); + xConfirmPara(m_iFastSearch < 0 || m_iFastSearch > 2, + "Fast Search Mode is not supported value (0:Full search 1:Diamond 2:PMVFAST)"); + xConfirmPara(m_iSearchRange < 0, "Search Range must be more than 0"); + xConfirmPara(m_bipredSearchRange < 0, "Search Range must be more than 0"); + xConfirmPara(m_iMaxDeltaQP > 7, + "Absolute Delta QP exceeds supported range (0 to 7)"); + xConfirmPara(m_iMaxCuDQPDepth > m_uiMaxCUDepth - 1, + "Absolute depth for a minimum CuDQP exceeds maximum coding unit depth"); + + xConfirmPara(m_cbQpOffset < -12, "Min. Chroma Cb QP Offset is -12"); + xConfirmPara(m_cbQpOffset > 12, "Max. Chroma Cb QP Offset is 12"); + xConfirmPara(m_crQpOffset < -12, "Min. Chroma Cr QP Offset is -12"); + xConfirmPara(m_crQpOffset > 12, "Max. Chroma Cr QP Offset is 12"); + + xConfirmPara(m_iQPAdaptationRange <= 0, + "QP Adaptation Range must be more than 0"); + if (m_iDecodingRefreshType == 2) + { + xConfirmPara(m_iIntraPeriod > 0 && m_iIntraPeriod <= m_iGOPSize, + "Intra period must be larger than GOP size for periodic IDR pictures"); + } + + xConfirmPara((m_uiMaxCUWidth >> m_uiMaxCUDepth) < 4, + "Minimum partition width size should be larger than or equal to 8"); + xConfirmPara((m_uiMaxCUHeight >> m_uiMaxCUDepth) < 4, + "Minimum partition height size should be larger than or equal to 8"); + xConfirmPara(m_uiMaxCUWidth < 16, + "Maximum partition width size should be larger than or equal to 16"); + xConfirmPara(m_uiMaxCUHeight < 16, + "Maximum partition height size should be larger than or equal to 16"); + xConfirmPara((m_iSourceWidth % (m_uiMaxCUWidth >> (m_uiMaxCUDepth - 1))) != 0, + "Resulting coded frame width must be a multiple of the minimum CU size"); + xConfirmPara((m_iSourceHeight % (m_uiMaxCUHeight >> (m_uiMaxCUDepth - 1))) != 0, + "Resulting coded frame height must be a multiple of the minimum CU size"); + + xConfirmPara(m_uiQuadtreeTULog2MinSize < 2, + "QuadtreeTULog2MinSize must be 2 or greater."); + xConfirmPara(m_uiQuadtreeTULog2MaxSize > 5, + "QuadtreeTULog2MaxSize must be 5 or smaller."); + xConfirmPara((1 << m_uiQuadtreeTULog2MaxSize) > m_uiMaxCUWidth, + "QuadtreeTULog2MaxSize must be log2(maxCUSize) or smaller."); + + xConfirmPara(m_uiQuadtreeTULog2MaxSize < m_uiQuadtreeTULog2MinSize, + "QuadtreeTULog2MaxSize must be greater than or equal to m_uiQuadtreeTULog2MinSize."); + xConfirmPara((1 << m_uiQuadtreeTULog2MinSize) > (m_uiMaxCUWidth >> (m_uiMaxCUDepth - 1)), + "QuadtreeTULog2MinSize must not be greater than minimum CU size"); // HS + xConfirmPara((1 << m_uiQuadtreeTULog2MinSize) > (m_uiMaxCUHeight >> (m_uiMaxCUDepth - 1)), + "QuadtreeTULog2MinSize must not be greater than minimum CU size"); // HS + xConfirmPara((1 << m_uiQuadtreeTULog2MinSize) > (m_uiMaxCUWidth >> m_uiMaxCUDepth), + "Minimum CU width must be greater than minimum transform size."); + xConfirmPara((1 << m_uiQuadtreeTULog2MinSize) > (m_uiMaxCUHeight >> m_uiMaxCUDepth), + "Minimum CU height must be greater than minimum transform size."); + xConfirmPara(m_uiQuadtreeTUMaxDepthInter < 1, + "QuadtreeTUMaxDepthInter must be greater than or equal to 1"); + xConfirmPara( + m_uiMaxCUWidth < (1 << (m_uiQuadtreeTULog2MinSize + m_uiQuadtreeTUMaxDepthInter - 1)), + "QuadtreeTUMaxDepthInter must be less than or equal to the difference between log2(maxCUSize) and QuadtreeTULog2MinSize plus 1"); + xConfirmPara(m_uiQuadtreeTUMaxDepthIntra < 1, + "QuadtreeTUMaxDepthIntra must be greater than or equal to 1"); + xConfirmPara( + m_uiMaxCUWidth < (1 << (m_uiQuadtreeTULog2MinSize + m_uiQuadtreeTUMaxDepthIntra - 1)), + "QuadtreeTUMaxDepthInter must be less than or equal to the difference between log2(maxCUSize) and QuadtreeTULog2MinSize plus 1"); + + xConfirmPara(m_maxNumMergeCand < 1, "MaxNumMergeCand must be 1 or greater."); + xConfirmPara(m_maxNumMergeCand > 5, "MaxNumMergeCand must be 5 or smaller."); + +#if ADAPTIVE_QP_SELECTION + xConfirmPara(m_bUseAdaptQpSelect == true && m_iQP < 0, + "AdaptiveQpSelection must be disabled when QP < 0."); + xConfirmPara(m_bUseAdaptQpSelect == true && (m_cbQpOffset != 0 || m_crQpOffset != 0), + "AdaptiveQpSelection must be disabled when ChromaQpOffset is not equal to 0."); +#endif + + if (m_usePCM) + { + xConfirmPara(m_uiPCMLog2MinSize < 3, "PCMLog2MinSize must be 3 or greater."); + xConfirmPara(m_uiPCMLog2MinSize > 5, "PCMLog2MinSize must be 5 or smaller."); + xConfirmPara(m_pcmLog2MaxSize > 5, "PCMLog2MaxSize must be 5 or smaller."); + xConfirmPara(m_pcmLog2MaxSize < m_uiPCMLog2MinSize, + "PCMLog2MaxSize must be equal to or greater than m_uiPCMLog2MinSize."); + } + + xConfirmPara(m_sliceMode < 0 || m_sliceMode > 3, "SliceMode exceeds supported range (0 to 3)"); + if (m_sliceMode != 0) + { + xConfirmPara(m_sliceArgument < 1, "SliceArgument should be larger than or equal to 1"); + } + + xConfirmPara(m_sliceSegmentMode < 0 || m_sliceSegmentMode > 3, "SliceSegmentMode exceeds supported range (0 to 3)"); + if (m_sliceSegmentMode != 0) + { + xConfirmPara(m_sliceSegmentArgument < 1, "SliceSegmentArgument should be larger than or equal to 1"); + } + + Bool tileFlag = (m_iNumColumnsMinus1 > 0 || m_iNumRowsMinus1 > 0); + xConfirmPara(tileFlag && m_iWaveFrontSynchro, "Tile and Wavefront can not be applied together"); + + //TODO:ChromaFmt assumes 4:2:0 below + xConfirmPara(m_iSourceWidth % TComSPS::getWinUnitX( + CHROMA_420) != 0, "Picture width must be an integer multiple of the specified chroma subsampling"); + xConfirmPara(m_iSourceHeight % TComSPS::getWinUnitY( + CHROMA_420) != 0, "Picture height must be an integer multiple of the specified chroma subsampling"); + + xConfirmPara(m_aiPad[0] % TComSPS::getWinUnitX( + CHROMA_420) != 0, "Horizontal padding must be an integer multiple of the specified chroma subsampling"); + xConfirmPara(m_aiPad[1] % TComSPS::getWinUnitY( + CHROMA_420) != 0, "Vertical padding must be an integer multiple of the specified chroma subsampling"); + + xConfirmPara(m_confLeft % TComSPS::getWinUnitX( + CHROMA_420) != 0, + "Left conformance window offset must be an integer multiple of the specified chroma subsampling"); + xConfirmPara(m_confRight % TComSPS::getWinUnitX( + CHROMA_420) != 0, + "Right conformance window offset must be an integer multiple of the specified chroma subsampling"); + xConfirmPara(m_confTop % TComSPS::getWinUnitY( + CHROMA_420) != 0, + "Top conformance window offset must be an integer multiple of the specified chroma subsampling"); + xConfirmPara(m_confBottom % TComSPS::getWinUnitY( + CHROMA_420) != 0, + "Bottom conformance window offset must be an integer multiple of the specified chroma subsampling"); + + // max CU width and height should be power of 2 + UInt ui = m_uiMaxCUWidth; + while (ui) + { + ui >>= 1; + if ((ui & 1) == 1) + xConfirmPara(ui != 1, "Width should be 2^n"); + } + + ui = m_uiMaxCUHeight; + while (ui) + { + ui >>= 1; + if ((ui & 1) == 1) + xConfirmPara(ui != 1, "Height should be 2^n"); + } + + /* if this is an intra-only sequence, ie IntraPeriod=1, don't verify the GOP structure + * This permits the ability to omit a GOP structure specification */ + if (m_iIntraPeriod == 1 && m_GOPList[0].m_POC == -1) + { + m_GOPList[0] = GOPEntry(); + m_GOPList[0].m_QPFactor = 1; + m_GOPList[0].m_betaOffsetDiv2 = 0; + m_GOPList[0].m_tcOffsetDiv2 = 0; + m_GOPList[0].m_POC = 1; + m_GOPList[0].m_numRefPicsActive = 4; + } + + Bool verifiedGOP = false; + Bool errorGOP = false; + Int checkGOP = 1; + Int numRefs = 1; + Int refList[MAX_NUM_REF_PICS + 1]; + refList[0] = 0; + Bool isOK[MAX_GOP]; + for (Int i = 0; i < MAX_GOP; i++) + { + isOK[i] = false; + } + + Int numOK = 0; + xConfirmPara(m_iIntraPeriod >= 0 && (m_iIntraPeriod % m_iGOPSize != 0), "Intra period must be a multiple of GOPSize, or -1"); + + for (Int i = 0; i < m_iGOPSize; i++) + { + if (m_GOPList[i].m_POC == m_iGOPSize) + { + xConfirmPara(m_GOPList[i].m_temporalId != 0, "The last frame in each GOP must have temporal ID = 0 "); + } + } + + if ((m_iIntraPeriod != 1) && !m_loopFilterOffsetInPPS && m_DeblockingFilterControlPresent && (!m_bLoopFilterDisable)) + { + for (Int i = 0; i < m_iGOPSize; i++) + { + xConfirmPara((m_GOPList[i].m_betaOffsetDiv2 + m_loopFilterBetaOffsetDiv2) < -6 || + (m_GOPList[i].m_betaOffsetDiv2 + m_loopFilterBetaOffsetDiv2) > 6, + "Loop Filter Beta Offset div. 2 for one of the GOP entries exceeds supported range (-6 to 6)"); + xConfirmPara((m_GOPList[i].m_tcOffsetDiv2 + m_loopFilterTcOffsetDiv2) < -6 || + (m_GOPList[i].m_tcOffsetDiv2 + m_loopFilterTcOffsetDiv2) > 6, + "Loop Filter Tc Offset div. 2 for one of the GOP entries exceeds supported range (-6 to 6)"); + } + } + + m_extraRPSs = 0; + //start looping through frames in coding order until we can verify that the GOP structure is correct. + while (!verifiedGOP && !errorGOP) + { + Int curGOP = (checkGOP - 1) % m_iGOPSize; + Int curPOC = ((checkGOP - 1) / m_iGOPSize) * m_iGOPSize + m_GOPList[curGOP].m_POC; + if (m_GOPList[curGOP].m_POC < 0) + { + printf("\nError: found fewer Reference Picture Sets than GOPSize\n"); + errorGOP = true; + } + else + { + //check that all reference pictures are available, or have a POC < 0 meaning they might be available in the next GOP. + Bool beforeI = false; + for (Int i = 0; i < m_GOPList[curGOP].m_numRefPics; i++) + { + Int absPOC = curPOC + m_GOPList[curGOP].m_referencePics[i]; + if (absPOC < 0) + { + beforeI = true; + } + else + { + Bool found = false; + for (Int j = 0; j < numRefs; j++) + { + if (refList[j] == absPOC) + { + found = true; + for (Int k = 0; k < m_iGOPSize; k++) + { + if (absPOC % m_iGOPSize == m_GOPList[k].m_POC % m_iGOPSize) + { + if (m_GOPList[k].m_temporalId == m_GOPList[curGOP].m_temporalId) + { + m_GOPList[k].m_refPic = true; + } + + m_GOPList[curGOP].m_usedByCurrPic[i] = m_GOPList[k].m_temporalId <= + m_GOPList[curGOP].m_temporalId; + } + } + } + } + + if (!found) + { + printf("\nError: ref pic %d is not available for GOP frame %d\n", + m_GOPList[curGOP].m_referencePics[i], + curGOP + 1); + errorGOP = true; + } + } + } + + if (!beforeI && !errorGOP) + { + //all ref frames were present + if (!isOK[curGOP]) + { + numOK++; + isOK[curGOP] = true; + if (numOK == m_iGOPSize) + { + verifiedGOP = true; + } + } + } + else + { + //create a new GOPEntry for this frame containing all the reference pictures that were available (POC > 0) + m_GOPList[m_iGOPSize + m_extraRPSs] = m_GOPList[curGOP]; + Int newRefs = 0; + for (Int i = 0; i < m_GOPList[curGOP].m_numRefPics; i++) + { + Int absPOC = curPOC + m_GOPList[curGOP].m_referencePics[i]; + if (absPOC >= 0) + { + m_GOPList[m_iGOPSize + m_extraRPSs].m_referencePics[newRefs] = m_GOPList[curGOP].m_referencePics[i]; + m_GOPList[m_iGOPSize + m_extraRPSs].m_usedByCurrPic[newRefs] = m_GOPList[curGOP].m_usedByCurrPic[i]; + newRefs++; + } + } + + Int numPrefRefs = m_GOPList[curGOP].m_numRefPicsActive; + + for (Int offset = -1; offset > -checkGOP; offset--) + { + //step backwards in coding order and include any extra available pictures we might find useful to replace the ones with POC < 0. + Int offGOP = (checkGOP - 1 + offset) % m_iGOPSize; + Int offPOC = ((checkGOP - 1 + offset) / m_iGOPSize) * m_iGOPSize + m_GOPList[offGOP].m_POC; + if (offPOC >= 0 && m_GOPList[offGOP].m_temporalId <= m_GOPList[curGOP].m_temporalId) + { + Bool newRef = false; + for (Int i = 0; i < numRefs; i++) + { + if (refList[i] == offPOC) + { + newRef = true; + } + } + + for (Int i = 0; i < newRefs; i++) + { + if (m_GOPList[m_iGOPSize + m_extraRPSs].m_referencePics[i] == offPOC - curPOC) + { + newRef = false; + } + } + + if (newRef) + { + Int insertPoint = newRefs; + //this picture can be added, find appropriate place in list and insert it. + if (m_GOPList[offGOP].m_temporalId == m_GOPList[curGOP].m_temporalId) + { + m_GOPList[offGOP].m_refPic = true; + } + + for (Int j = 0; j < newRefs; j++) + { + if (m_GOPList[m_iGOPSize + m_extraRPSs].m_referencePics[j] < offPOC - curPOC || + m_GOPList[m_iGOPSize + m_extraRPSs].m_referencePics[j] > 0) + { + insertPoint = j; + break; + } + } + + Int prev = offPOC - curPOC; + Int prevUsed = m_GOPList[offGOP].m_temporalId <= m_GOPList[curGOP].m_temporalId; + for (Int j = insertPoint; j < newRefs + 1; j++) + { + Int newPrev = m_GOPList[m_iGOPSize + m_extraRPSs].m_referencePics[j]; + Int newUsed = m_GOPList[m_iGOPSize + m_extraRPSs].m_usedByCurrPic[j]; + m_GOPList[m_iGOPSize + m_extraRPSs].m_referencePics[j] = prev; + m_GOPList[m_iGOPSize + m_extraRPSs].m_usedByCurrPic[j] = prevUsed; + prevUsed = newUsed; + prev = newPrev; + } + + newRefs++; + } + } + + if (newRefs >= numPrefRefs) + { + break; + } + } + + m_GOPList[m_iGOPSize + m_extraRPSs].m_numRefPics = newRefs; + m_GOPList[m_iGOPSize + m_extraRPSs].m_POC = curPOC; + if (m_extraRPSs == 0) + { + m_GOPList[m_iGOPSize + m_extraRPSs].m_interRPSPrediction = 0; + m_GOPList[m_iGOPSize + m_extraRPSs].m_numRefIdc = 0; + } + else + { + Int rIdx = m_iGOPSize + m_extraRPSs - 1; + Int refPOC = m_GOPList[rIdx].m_POC; + Int refPics = m_GOPList[rIdx].m_numRefPics; + Int newIdc = 0; + for (Int i = 0; i <= refPics; i++) + { + Int deltaPOC = ((i != refPics) ? m_GOPList[rIdx].m_referencePics[i] : 0); // check if the reference abs POC is >= 0 + Int absPOCref = refPOC + deltaPOC; + Int refIdc = 0; + for (Int j = 0; j < m_GOPList[m_iGOPSize + m_extraRPSs].m_numRefPics; j++) + { + if ((absPOCref - curPOC) == m_GOPList[m_iGOPSize + m_extraRPSs].m_referencePics[j]) + { + if (m_GOPList[m_iGOPSize + m_extraRPSs].m_usedByCurrPic[j]) + { + refIdc = 1; + } + else + { + refIdc = 2; + } + } + } + + m_GOPList[m_iGOPSize + m_extraRPSs].m_refIdc[newIdc] = refIdc; + newIdc++; + } + + m_GOPList[m_iGOPSize + m_extraRPSs].m_interRPSPrediction = 1; + m_GOPList[m_iGOPSize + m_extraRPSs].m_numRefIdc = newIdc; + m_GOPList[m_iGOPSize + m_extraRPSs].m_deltaRPS = refPOC - m_GOPList[m_iGOPSize + m_extraRPSs].m_POC; + } + + curGOP = m_iGOPSize + m_extraRPSs; + m_extraRPSs++; + } + + numRefs = 0; + for (Int i = 0; i < m_GOPList[curGOP].m_numRefPics; i++) + { + Int absPOC = curPOC + m_GOPList[curGOP].m_referencePics[i]; + if (absPOC >= 0) + { + refList[numRefs] = absPOC; + numRefs++; + } + } + + refList[numRefs] = curPOC; + numRefs++; + } + + checkGOP++; + } + + xConfirmPara(errorGOP, "Invalid GOP structure given"); + m_maxTempLayer = 1; + for (Int i = 0; i < m_iGOPSize; i++) + { + if (m_GOPList[i].m_temporalId >= m_maxTempLayer) + { + m_maxTempLayer = m_GOPList[i].m_temporalId + 1; + } + + xConfirmPara(m_GOPList[i].m_sliceType != 'B' && m_GOPList[i].m_sliceType != 'P', "Slice type must be equal to B or P"); + } + + for (Int i = 0; i < MAX_TLAYER; i++) + { + m_numReorderPics[i] = 0; + m_maxDecPicBuffering[i] = 0; + } + + for (Int i = 0; i < m_iGOPSize; i++) + { + if (m_GOPList[i].m_numRefPics > m_maxDecPicBuffering[m_GOPList[i].m_temporalId]) + { + m_maxDecPicBuffering[m_GOPList[i].m_temporalId] = m_GOPList[i].m_numRefPics; + } + + Int highestDecodingNumberWithLowerPOC = 0; + for (Int j = 0; j < m_iGOPSize; j++) + { + if (m_GOPList[j].m_POC <= m_GOPList[i].m_POC) + { + highestDecodingNumberWithLowerPOC = j; + } + } + + Int numReorder = 0; + for (Int j = 0; j < highestDecodingNumberWithLowerPOC; j++) + { + if (m_GOPList[j].m_temporalId <= m_GOPList[i].m_temporalId && + m_GOPList[j].m_POC > m_GOPList[i].m_POC) + { + numReorder++; + } + } + + if (numReorder > m_numReorderPics[m_GOPList[i].m_temporalId]) + { + m_numReorderPics[m_GOPList[i].m_temporalId] = numReorder; + } + } + + for (Int i = 0; i < MAX_TLAYER - 1; i++) + { + // a lower layer can not have higher value of m_numReorderPics than a higher layer + if (m_numReorderPics[i + 1] < m_numReorderPics[i]) + { + m_numReorderPics[i + 1] = m_numReorderPics[i]; + } + + // the value of num_reorder_pics[ i ] shall be in the range of 0 to max_dec_pic_buffering[ i ], inclusive + if (m_numReorderPics[i] > m_maxDecPicBuffering[i]) + { + m_maxDecPicBuffering[i] = m_numReorderPics[i]; + } + + // a lower layer can not have higher value of m_uiMaxDecPicBuffering than a higher layer + if (m_maxDecPicBuffering[i + 1] < m_maxDecPicBuffering[i]) + { + m_maxDecPicBuffering[i + 1] = m_maxDecPicBuffering[i]; + } + } + + // the value of num_reorder_pics[ i ] shall be in the range of 0 to max_dec_pic_buffering[ i ], inclusive + if (m_numReorderPics[MAX_TLAYER - 1] > m_maxDecPicBuffering[MAX_TLAYER - 1]) + { + m_maxDecPicBuffering[MAX_TLAYER - 1] = m_numReorderPics[MAX_TLAYER - 1]; + } + + if (m_vuiParametersPresentFlag && m_bitstreamRestrictionFlag) + { + Int PicSizeInSamplesY = m_iSourceWidth * m_iSourceHeight; + if (tileFlag) + { + Int maxTileWidth = 0; + Int maxTileHeight = 0; + Int widthInCU = + (m_iSourceWidth % m_uiMaxCUWidth) ? m_iSourceWidth / m_uiMaxCUWidth + 1 : m_iSourceWidth / m_uiMaxCUWidth; + Int heightInCU = + (m_iSourceHeight % m_uiMaxCUHeight) ? m_iSourceHeight / m_uiMaxCUHeight + 1 : m_iSourceHeight / m_uiMaxCUHeight; + if (m_iUniformSpacingIdr) + { + maxTileWidth = m_uiMaxCUWidth * ((widthInCU + m_iNumColumnsMinus1) / (m_iNumColumnsMinus1 + 1)); + maxTileHeight = m_uiMaxCUHeight * ((heightInCU + m_iNumRowsMinus1) / (m_iNumRowsMinus1 + 1)); + // if only the last tile-row is one treeblock higher than the others + // the maxTileHeight becomes smaller if the last row of treeblocks has lower height than the others + if (!((heightInCU - 1) % (m_iNumRowsMinus1 + 1))) + { + maxTileHeight = maxTileHeight - m_uiMaxCUHeight + (m_iSourceHeight % m_uiMaxCUHeight); + } + + // if only the last tile-column is one treeblock wider than the others + // the maxTileWidth becomes smaller if the last column of treeblocks has lower width than the others + if (!((widthInCU - 1) % (m_iNumColumnsMinus1 + 1))) + { + maxTileWidth = maxTileWidth - m_uiMaxCUWidth + (m_iSourceWidth % m_uiMaxCUWidth); + } + } + else // not uniform spacing + { + if (m_iNumColumnsMinus1 < 1) + { + maxTileWidth = m_iSourceWidth; + } + else + { + Int accColumnWidth = 0; + for (Int col = 0; col < (m_iNumColumnsMinus1); col++) + { + maxTileWidth = m_pColumnWidth[col] > maxTileWidth ? m_pColumnWidth[col] : maxTileWidth; + accColumnWidth += m_pColumnWidth[col]; + } + + maxTileWidth = + (widthInCU - + accColumnWidth) > maxTileWidth ? m_uiMaxCUWidth * + (widthInCU - accColumnWidth) : m_uiMaxCUWidth * maxTileWidth; + } + + if (m_iNumRowsMinus1 < 1) + { + maxTileHeight = m_iSourceHeight; + } + else + { + Int accRowHeight = 0; + for (Int row = 0; row < (m_iNumRowsMinus1); row++) + { + maxTileHeight = m_pRowHeight[row] > maxTileHeight ? m_pRowHeight[row] : maxTileHeight; + accRowHeight += m_pRowHeight[row]; + } + + maxTileHeight = + (heightInCU - + accRowHeight) > maxTileHeight ? m_uiMaxCUHeight * + (heightInCU - accRowHeight) : m_uiMaxCUHeight * maxTileHeight; + } + } + + Int maxSizeInSamplesY = maxTileWidth * maxTileHeight; + m_minSpatialSegmentationIdc = 4 * PicSizeInSamplesY / maxSizeInSamplesY - 4; + } + else if (m_iWaveFrontSynchro) + { + m_minSpatialSegmentationIdc = 4 * PicSizeInSamplesY / ((2 * m_iSourceHeight + m_iSourceWidth) * m_uiMaxCUHeight) - 4; + } + else if (m_sliceMode == 1) + { + m_minSpatialSegmentationIdc = 4 * PicSizeInSamplesY / (m_sliceArgument * m_uiMaxCUWidth * m_uiMaxCUHeight) - 4; + } + else + { + m_minSpatialSegmentationIdc = 0; + } + } + + xConfirmPara(m_bUseLComb == false && m_numReorderPics[MAX_TLAYER - 1] != 0, + "ListCombination can only be 0 in low delay coding (more precisely when L0 and L1 are identical)"); // Note however this is not the full necessary condition as ref_pic_list_combination_flag can only be 0 if L0 == L1. + xConfirmPara(m_iWaveFrontSynchro < 0, "WaveFrontSynchro cannot be negative"); + xConfirmPara(m_iWaveFrontSubstreams <= 0, "WaveFrontSubstreams must be positive"); + xConfirmPara(m_iWaveFrontSubstreams > 1 && !m_iWaveFrontSynchro, + "Must have WaveFrontSynchro > 0 in order to have WaveFrontSubstreams > 1"); + + xConfirmPara(m_decodedPictureHashSEIEnabled < 0 || m_decodedPictureHashSEIEnabled > 3, "this hash type is not correct!\n"); + +#if J0149_TONE_MAPPING_SEI + if (m_toneMappingInfoSEIEnabled) + { + xConfirmPara(m_toneMapCodedDataBitDepth < 8 || m_toneMapCodedDataBitDepth > 14, + "SEIToneMapCodedDataBitDepth must be in rage 8 to 14"); + xConfirmPara(m_toneMapTargetBitDepth < 1 || (m_toneMapTargetBitDepth > 16 && m_toneMapTargetBitDepth < 255), + "SEIToneMapTargetBitDepth must be in rage 1 to 16 or equal to 255"); + xConfirmPara(m_toneMapModelId < 0 || m_toneMapModelId > 4, "SEIToneMapModelId must be in rage 0 to 4"); + xConfirmPara(m_cameraIsoSpeedValue == 0, "SEIToneMapCameraIsoSpeedValue shall not be equal to 0"); + xConfirmPara(m_extendedRangeWhiteLevel < 100, "SEIToneMapExtendedRangeWhiteLevel should be greater than or equal to 100"); + xConfirmPara(m_nominalBlackLevelLumaCodeValue >= m_nominalWhiteLevelLumaCodeValue, + "SEIToneMapNominalWhiteLevelLumaCodeValue shall be greater than SEIToneMapNominalBlackLevelLumaCodeValue"); + xConfirmPara( + m_extendedWhiteLevelLumaCodeValue < m_nominalWhiteLevelLumaCodeValue, + "SEIToneMapExtendedWhiteLevelLumaCodeValue shall be greater than or equal to SEIToneMapNominalWhiteLevelLumaCodeValue"); + } + +#endif // if J0149_TONE_MAPPING_SEI + +#if RATE_CONTROL_LAMBDA_DOMAIN + if (m_RCEnableRateControl) + { + if (m_RCForceIntraQP) + { + if (m_RCInitialQP == 0) + { + printf("\nInitial QP for rate control is not specified. Reset not to use force intra QP!"); + m_RCForceIntraQP = false; + } + } + + xConfirmPara(m_uiDeltaQpRD > 0, "Rate control cannot be used together with slice level multiple-QP optimization!\n"); + } + +#else // if RATE_CONTROL_LAMBDA_DOMAIN + if (m_enableRateCtrl) + { + Int numLCUInWidth = (m_iSourceWidth / m_uiMaxCUWidth) + ((m_iSourceWidth % m_uiMaxCUWidth) ? 1 : 0); + Int numLCUInHeight = (m_iSourceHeight / m_uiMaxCUHeight) + ((m_iSourceHeight % m_uiMaxCUHeight) ? 1 : 0); + Int numLCUInPic = numLCUInWidth * numLCUInHeight; + + xConfirmPara((numLCUInPic % m_numLCUInUnit) != 0, + "total number of LCUs in a frame should be completely divided by NumLCUInUnit"); + + m_iMaxDeltaQP = MAX_DELTA_QP; + m_iMaxCuDQPDepth = MAX_CUDQP_DEPTH; + } + +#endif // if RATE_CONTROL_LAMBDA_DOMAIN + + xConfirmPara(!m_TransquantBypassEnableFlag && m_CUTransquantBypassFlagValue, + "CUTransquantBypassFlagValue cannot be 1 when TransquantBypassEnableFlag is 0"); + + xConfirmPara(m_log2ParallelMergeLevel < 2, "Log2ParallelMergeLevel should be larger than or equal to 2"); +#if L0444_FPA_TYPE + if (m_framePackingSEIEnabled) + { + xConfirmPara(m_framePackingSEIType < 3 || m_framePackingSEIType > 5, "SEIFramePackingType must be in rage 3 to 5"); + } + +#endif + +#undef xConfirmPara + if (check_failed) + { + exit(EXIT_FAILURE); + } +} + +/** \todo use of global variables should be removed later + */ +Void TAppEncCfg::xSetGlobal() +{ + // set max CU width & height + g_uiMaxCUWidth = m_uiMaxCUWidth; + g_uiMaxCUHeight = m_uiMaxCUHeight; + + // compute actual CU depth with respect to config depth and max transform size + g_uiAddCUDepth = 0; + while ((m_uiMaxCUWidth >> m_uiMaxCUDepth) > (1 << (m_uiQuadtreeTULog2MinSize + g_uiAddCUDepth))) + { + g_uiAddCUDepth++; + } + + m_uiMaxCUDepth += g_uiAddCUDepth; + g_uiAddCUDepth++; + g_uiMaxCUDepth = m_uiMaxCUDepth; + + // set internal bit-depth and constants + g_bitDepthY = m_internalBitDepthY; + g_bitDepthC = m_internalBitDepthC; + + g_uiPCMBitDepthLuma = m_bPCMInputBitDepthFlag ? m_inputBitDepthY : m_internalBitDepthY; + g_uiPCMBitDepthChroma = m_bPCMInputBitDepthFlag ? m_inputBitDepthC : m_internalBitDepthC; +} + +Void TAppEncCfg::xPrintParameter() +{ + printf("\n"); + printf("Input File : %s\n", m_pchInputFile); + printf("Bitstream File : %s\n", m_pchBitstreamFile); + printf("Reconstruction File : %s\n", m_pchReconFile); + printf("Real Format : %dx%d %dHz\n", + m_iSourceWidth - m_confLeft - m_confRight, + m_iSourceHeight - m_confTop - m_confBottom, + m_iFrameRate); + printf("Internal Format : %dx%d %dHz\n", m_iSourceWidth, m_iSourceHeight, m_iFrameRate); + printf("Frame index : %u - %d (%d frames)\n", + m_FrameSkip, + m_FrameSkip + m_framesToBeEncoded - 1, + m_framesToBeEncoded); + printf("CU size / depth : %d / %d\n", m_uiMaxCUWidth, m_uiMaxCUDepth); + printf("RQT trans. size (min / max) : %d / %d\n", 1 << m_uiQuadtreeTULog2MinSize, 1 << m_uiQuadtreeTULog2MaxSize); + printf("Max RQT depth inter : %d\n", m_uiQuadtreeTUMaxDepthInter); + printf("Max RQT depth intra : %d\n", m_uiQuadtreeTUMaxDepthIntra); + printf("Min PCM size : %d\n", 1 << m_uiPCMLog2MinSize); + printf("Motion search range : %d\n", m_iSearchRange); + printf("Intra period : %d\n", m_iIntraPeriod); + printf("Decoding refresh type : %d\n", m_iDecodingRefreshType); + printf("QP : %5.2f\n", m_fQP); + printf("Max dQP signaling depth : %d\n", m_iMaxCuDQPDepth); + + printf("Cb QP Offset : %d\n", m_cbQpOffset); + printf("Cr QP Offset : %d\n", m_crQpOffset); + + printf("QP adaptation : %d (range=%d)\n", m_bUseAdaptiveQP, (m_bUseAdaptiveQP ? m_iQPAdaptationRange : 0)); + printf("GOP size : %d\n", m_iGOPSize); + printf("Internal bit depth : (Y:%d, C:%d)\n", m_internalBitDepthY, m_internalBitDepthC); + printf("PCM sample bit depth : (Y:%d, C:%d)\n", g_uiPCMBitDepthLuma, g_uiPCMBitDepthChroma); +#if RATE_CONTROL_LAMBDA_DOMAIN + printf("RateControl : %d\n", m_RCEnableRateControl); + if (m_RCEnableRateControl) + { + printf("TargetBitrate : %d\n", m_RCTargetBitrate); + printf("KeepHierarchicalBit : %d\n", m_RCKeepHierarchicalBit); + printf("LCULevelRC : %d\n", m_RCLCULevelRC); + printf("UseLCUSeparateModel : %d\n", m_RCUseLCUSeparateModel); + printf("InitialQP : %d\n", m_RCInitialQP); + printf("ForceIntraQP : %d\n", m_RCForceIntraQP); + } + +#else // if RATE_CONTROL_LAMBDA_DOMAIN + printf("RateControl : %d\n", m_enableRateCtrl); + if (m_enableRateCtrl) + { + printf("TargetBitrate : %d\n", m_targetBitrate); + printf("NumLCUInUnit : %d\n", m_numLCUInUnit); + } + +#endif // if RATE_CONTROL_LAMBDA_DOMAIN + printf("Max Num Merge Candidates : %d\n", m_maxNumMergeCand); + printf("\n"); + + printf("TOOL CFG: "); + printf("IBD:%d ", g_bitDepthY > m_inputBitDepthY || g_bitDepthC > m_inputBitDepthC); + printf("HAD:%d ", m_bUseHADME); + printf("SRD:%d ", m_bUseSBACRD); + printf("RDQ:%d ", m_useRDOQ); + printf("RDQTS:%d ", m_useRDOQTS); +#if L0232_RD_PENALTY + printf("RDpenalty:%d ", m_rdPenalty); +#endif + printf("SQP:%d ", m_uiDeltaQpRD); + printf("ASR:%d ", m_bUseASR); + printf("LComb:%d ", m_bUseLComb); + printf("FEN:%d ", m_bUseFastEnc); + printf("ECU:%d ", m_bUseEarlyCU); + printf("FDM:%d ", m_useFastDecisionForMerge); + printf("CFM:%d ", m_bUseCbfFastMode); + printf("ESD:%d ", m_useEarlySkipDetection); + printf("RQT:%d ", 1); + printf("TransformSkip:%d ", m_useTransformSkip); + printf("TransformSkipFast:%d ", m_useTransformSkipFast); + printf("Slice: M=%d ", m_sliceMode); + if (m_sliceMode != 0) + { + printf("A=%d ", m_sliceArgument); + } + + printf("SliceSegment: M=%d ", m_sliceSegmentMode); + if (m_sliceSegmentMode != 0) + { + printf("A=%d ", m_sliceSegmentArgument); + } + + printf("CIP:%d ", m_bUseConstrainedIntraPred); + printf("SAO:%d ", (m_bUseSAO) ? (1) : (0)); + printf("PCM:%d ", (m_usePCM && (1 << m_uiPCMLog2MinSize) <= m_uiMaxCUWidth) ? 1 : 0); + printf("SAOLcuBasedOptimization:%d ", (m_saoLcuBasedOptimization) ? (1) : (0)); + + printf("LosslessCuEnabled:%d ", (m_useLossless) ? 1 : 0); + printf("WPP:%d ", (Int)m_useWeightedPred); + printf("WPB:%d ", (Int)m_useWeightedBiPred); + printf("PME:%d ", m_log2ParallelMergeLevel); + printf(" WaveFrontSynchro:%d WaveFrontSubstreams:%d", + m_iWaveFrontSynchro, m_iWaveFrontSubstreams); + printf(" ScalingList:%d ", m_useScalingListId); + printf("TMVPMode:%d ", m_TMVPModeId); +#if ADAPTIVE_QP_SELECTION + printf("AQpS:%d", m_bUseAdaptQpSelect); +#endif + + printf(" SignBitHidingFlag:%d ", m_signHideFlag); + printf("RecalQP:%d", m_recalculateQPAccordingToLambda ? 1 : 0); + printf("\n\n"); + + fflush(stdout); +} + +Bool confirmPara(Bool bflag, const Char *message) +{ + if (!bflag) + return false; + + printf("Error: %s\n", message); + return true; +} + +//! \}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/source/x265cfg.h Wed Apr 17 14:11:17 2013 +0530 @@ -0,0 +1,354 @@ +/* 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-2013, 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 TAppEncCfg.h + \brief Handle encoder configuration parameters (header) +*/ + +#ifndef __TAPPENCCFG__ +#define __TAPPENCCFG__ + +#include "TLibCommon/CommonDef.h" + +#include "TLibEncoder/TEncCfg.h" +#include "TLibVideoIO/TVideoIO.h" +#include "TLibVideoIO/TVideoIOYuv.h" +#include "TLibVideoIO/TVideoIOY4m.h" +#include <sstream> +//! \ingroup TAppEncoder +//! \{ + +// ==================================================================================================================== +// Class definition +// ==================================================================================================================== + +/// encoder configuration class +class TAppEncCfg +{ +protected: + + // file I/O + Char *m_pchInputFile; ///< source file name + Char *m_pchBitstreamFile; ///< output bitstream file + Char *m_pchReconFile; ///< output reconstruction file + Double m_adLambdaModifier[MAX_TLAYER]; ///< Lambda modifier array for each temporal layer + // source specification + Int m_iFrameRate; ///< source frame-rates (Hz) + UInt m_FrameSkip; ///< number of skipped frames from the beginning + Int m_iSourceWidth; ///< source width in pixel + Int m_iSourceHeight; ///< source height in pixel + Int m_conformanceMode; + Int m_confLeft; + Int m_confRight; + Int m_confTop; + Int m_confBottom; + Int m_framesToBeEncoded; ///< number of encoded frames + Int m_aiPad[2]; ///< number of padded pixels for width and height + //Input source file handlers + TVideoIO* m_cTVideoIOInputFile; ///< input file + TVideoIO* m_cTVideoIOReconFile; ///< output reconstruction file + hnd_t* handler_input; + hnd_t* handler_recon; + video_info_t video_info; + + // profile/level + Profile::Name m_profile; + Level::Tier m_levelTier; + Level::Name m_level; +#if L0046_CONSTRAINT_FLAGS + Bool m_progressiveSourceFlag; + Bool m_interlacedSourceFlag; + Bool m_nonPackedConstraintFlag; + Bool m_frameOnlyConstraintFlag; +#endif + + // coding structure + Int m_iIntraPeriod; ///< period of I-slice (random access period) + Int m_iDecodingRefreshType; ///< random access type + Int m_iGOPSize; ///< GOP size of hierarchical structure + Int m_extraRPSs; ///< extra RPSs added to handle CRA + GOPEntry m_GOPList[MAX_GOP]; ///< the coding structure entries from the config file + Int m_numReorderPics[MAX_TLAYER]; ///< total number of reorder pictures + Int m_maxDecPicBuffering[MAX_TLAYER]; ///< total number of reference pictures needed for decoding + Bool m_bUseLComb; ///< flag for using combined reference list for uni-prediction in B-slices (JCTVC-D421) + Bool m_useTransformSkip; ///< flag for enabling intra transform skipping + Bool m_useTransformSkipFast; ///< flag for enabling fast intra transform skipping + Bool m_enableAMP; + // coding quality + Double m_fQP; ///< QP value of key-picture (floating point) + Int m_iQP; ///< QP value of key-picture (integer) + Char *m_pchdQPFile; ///< QP offset for each slice (initialized from external file) + Int *m_aidQP; ///< array of slice QP values + Int m_iMaxDeltaQP; ///< max. |delta QP| + UInt m_uiDeltaQpRD; ///< dQP range for multi-pass slice QP optimization + Int m_iMaxCuDQPDepth; ///< Max. depth for a minimum CuDQPSize (0:default) + + Int m_cbQpOffset; ///< Chroma Cb QP Offset (0:default) + Int m_crQpOffset; ///< Chroma Cr QP Offset (0:default) + +#if ADAPTIVE_QP_SELECTION + Bool m_bUseAdaptQpSelect; +#endif + + Bool m_bUseAdaptiveQP; ///< Flag for enabling QP adaptation based on a psycho-visual model + Int m_iQPAdaptationRange; ///< dQP range by QP adaptation + + Int m_maxTempLayer; ///< Max temporal layer + + // coding unit (CU) definition + UInt m_uiMaxCUWidth; ///< max. CU width in pixel + UInt m_uiMaxCUHeight; ///< max. CU height in pixel + UInt m_uiMaxCUDepth; ///< max. CU depth + + // transfom unit (TU) definition + UInt m_uiQuadtreeTULog2MaxSize; + UInt m_uiQuadtreeTULog2MinSize; + + UInt m_uiQuadtreeTUMaxDepthInter; + UInt m_uiQuadtreeTUMaxDepthIntra; + + // coding tools (bit-depth) + Int m_inputBitDepthY; ///< bit-depth of input file (luma component) + Int m_inputBitDepthC; ///< bit-depth of input file (chroma component) + Int m_outputBitDepthY; ///< bit-depth of output file (luma component) + Int m_outputBitDepthC; ///< bit-depth of output file (chroma component) + Int m_internalBitDepthY; ///< bit-depth codec operates at in luma (input/output files will be converted) + Int m_internalBitDepthC; ///< bit-depth codec operates at in chroma (input/output files will be converted) + + // coding tools (PCM bit-depth) + Bool m_bPCMInputBitDepthFlag; ///< 0: PCM bit-depth is internal bit-depth. 1: PCM bit-depth is input bit-depth. + + // coding tool (lossless) + Bool m_useLossless; ///< flag for using lossless coding + Bool m_bUseSAO; + Int m_maxNumOffsetsPerPic; ///< SAO maximun number of offset per picture + Bool m_saoLcuBoundary; ///< SAO parameter estimation using non-deblocked pixels for LCU bottom and right boundary areas + Bool m_saoLcuBasedOptimization; ///< SAO LCU-based optimization + // coding tools (loop filter) + Bool m_bLoopFilterDisable; ///< flag for using deblocking filter + Bool m_loopFilterOffsetInPPS; ///< offset for deblocking filter in 0 = slice header, 1 = PPS + Int m_loopFilterBetaOffsetDiv2; ///< beta offset for deblocking filter + Int m_loopFilterTcOffsetDiv2; ///< tc offset for deblocking filter + Bool m_DeblockingFilterControlPresent; ///< deblocking filter control present flag in PPS +#if L0386_DB_METRIC + Bool m_DeblockingFilterMetric; ///< blockiness metric in encoder +#endif + + // coding tools (PCM) + Bool m_usePCM; ///< flag for using IPCM + UInt m_pcmLog2MaxSize; ///< log2 of maximum PCM block size + UInt m_uiPCMLog2MinSize; ///< log2 of minimum PCM block size + Bool m_bPCMFilterDisableFlag; ///< PCM filter disable flag + + // coding tools (encoder-only parameters) + Bool m_bUseSBACRD; ///< flag for using RD optimization based on SBAC + Bool m_bUseASR; ///< flag for using adaptive motion search range + Bool m_bUseHADME; ///< flag for using HAD in sub-pel ME + Bool m_useRDOQ; ///< flag for using RD optimized quantization + Bool m_useRDOQTS; ///< flag for using RD optimized quantization for transform skip +#if L0232_RD_PENALTY + Int m_rdPenalty; ///< RD-penalty for 32x32 TU for intra in non-intra slices (0: no RD-penalty, 1: RD-penalty, 2: maximum RD-penalty) +#endif + Int m_iFastSearch; ///< ME mode, 0 = full, 1 = diamond, 2 = PMVFAST + Int m_iSearchRange; ///< ME search range + Int m_bipredSearchRange; ///< ME search range for bipred refinement + Bool m_bUseFastEnc; ///< flag for using fast encoder setting + Bool m_bUseEarlyCU; ///< flag for using Early CU setting + Bool m_useFastDecisionForMerge; ///< flag for using Fast Decision Merge RD-Cost + Bool m_bUseCbfFastMode; ///< flag for using Cbf Fast PU Mode Decision + Bool m_useEarlySkipDetection; ///< flag for using Early SKIP Detection + Int m_sliceMode; ///< 0: no slice limits, 1 : max number of CTBs per slice, 2: max number of bytes per slice, + ///< 3: max number of tiles per slice + Int m_sliceArgument; ///< argument according to selected slice mode + Int m_sliceSegmentMode; ///< 0: no slice segment limits, 1 : max number of CTBs per slice segment, 2: max number of bytes per slice segment, + ///< 3: max number of tiles per slice segment + Int m_sliceSegmentArgument; ///< argument according to selected slice segment mode + + Bool m_bLFCrossSliceBoundaryFlag; ///< 1: filter across slice boundaries 0: do not filter across slice boundaries + Bool m_bLFCrossTileBoundaryFlag; ///< 1: filter across tile boundaries 0: do not filter across tile boundaries + Int m_iUniformSpacingIdr; + Int m_iNumColumnsMinus1; + Char *m_pchColumnWidth; + Int m_iNumRowsMinus1; + Char *m_pchRowHeight; + UInt *m_pColumnWidth; + UInt *m_pRowHeight; + Int m_iWaveFrontSynchro; //< 0: no WPP. >= 1: WPP is enabled, the "Top right" from which inheritance occurs is this LCU offset in the line above the current. + Int m_iWaveFrontSubstreams; //< If iWaveFrontSynchro, this is the number of substreams per frame (dependent tiles) or per tile (independent tiles). + + Bool m_bUseConstrainedIntraPred; ///< flag for using constrained intra prediction + + Int m_decodedPictureHashSEIEnabled; ///< Checksum(3)/CRC(2)/MD5(1)/disable(0) acting on decoded picture hash SEI message + Int m_recoveryPointSEIEnabled; + Int m_bufferingPeriodSEIEnabled; + Int m_pictureTimingSEIEnabled; +#if J0149_TONE_MAPPING_SEI + Bool m_toneMappingInfoSEIEnabled; + Int m_toneMapId; + Bool m_toneMapCancelFlag; + Bool m_toneMapPersistenceFlag; + Int m_toneMapCodedDataBitDepth; + Int m_toneMapTargetBitDepth; + Int m_toneMapModelId; + Int m_toneMapMinValue; + Int m_toneMapMaxValue; + Int m_sigmoidMidpoint; + Int m_sigmoidWidth; + Int m_numPivots; + Int m_cameraIsoSpeedIdc; + Int m_cameraIsoSpeedValue; + Int m_exposureCompensationValueSignFlag; + Int m_exposureCompensationValueNumerator; + Int m_exposureCompensationValueDenomIdc; + Int m_refScreenLuminanceWhite; + Int m_extendedRangeWhiteLevel; + Int m_nominalBlackLevelLumaCodeValue; + Int m_nominalWhiteLevelLumaCodeValue; + Int m_extendedWhiteLevelLumaCodeValue; + Int *m_startOfCodedInterval; + Int *m_codedPivotValue; + Int *m_targetPivotValue; +#endif // if J0149_TONE_MAPPING_SEI + Int m_framePackingSEIEnabled; + Int m_framePackingSEIType; + Int m_framePackingSEIId; + Int m_framePackingSEIQuincunx; + Int m_framePackingSEIInterpretation; + Int m_displayOrientationSEIAngle; + Int m_temporalLevel0IndexSEIEnabled; + Int m_gradualDecodingRefreshInfoEnabled; + Int m_decodingUnitInfoSEIEnabled; +#if L0208_SOP_DESCRIPTION_SEI + Int m_SOPDescriptionSEIEnabled; +#endif +#if K0180_SCALABLE_NESTING_SEI + Int m_scalableNestingSEIEnabled; +#endif + // weighted prediction + Bool m_useWeightedPred; ///< Use of weighted prediction in P slices + Bool m_useWeightedBiPred; ///< Use of bi-directional weighted prediction in B slices + + UInt m_log2ParallelMergeLevel; ///< Parallel merge estimation region + UInt m_maxNumMergeCand; ///< Max number of merge candidates + + Int m_TMVPModeId; + Int m_signHideFlag; +#if RATE_CONTROL_LAMBDA_DOMAIN + Bool m_RCEnableRateControl; ///< enable rate control or not + Int m_RCTargetBitrate; ///< target bitrate when rate control is enabled + Bool m_RCKeepHierarchicalBit; ///< whether keeping hierarchical bit allocation structure or not + Bool m_RCLCULevelRC; ///< true: LCU level rate control; false: picture level rate control + Bool m_RCUseLCUSeparateModel; ///< use separate R-lambda model at LCU level + Int m_RCInitialQP; ///< inital QP for rate control + Bool m_RCForceIntraQP; ///< force all intra picture to use initial QP or not +#else + Bool m_enableRateCtrl; ///< Flag for using rate control algorithm + Int m_targetBitrate; ///< target bitrate + Int m_numLCUInUnit; ///< Total number of LCUs in a frame should be completely divided by the NumLCUInUnit +#endif // if RATE_CONTROL_LAMBDA_DOMAIN + Int m_useScalingListId; ///< using quantization matrix + Char *m_scalingListFile; ///< quantization matrix file name + + Bool m_TransquantBypassEnableFlag; ///< transquant_bypass_enable_flag setting in PPS. + Bool m_CUTransquantBypassFlagValue; ///< if transquant_bypass_enable_flag, the fixed value to use for the per-CU cu_transquant_bypass_flag. + + Bool m_recalculateQPAccordingToLambda; ///< recalculate QP value according to the lambda value + Bool m_useStrongIntraSmoothing; ///< enable strong intra smoothing for 32x32 blocks where the reference samples are flat + Int m_activeParameterSetsSEIEnabled; + + Bool m_vuiParametersPresentFlag; ///< enable generation of VUI parameters + Bool m_aspectRatioInfoPresentFlag; ///< Signals whether aspect_ratio_idc is present + Int m_aspectRatioIdc; ///< aspect_ratio_idc + Int m_sarWidth; ///< horizontal size of the sample aspect ratio + Int m_sarHeight; ///< vertical size of the sample aspect ratio + Bool m_overscanInfoPresentFlag; ///< Signals whether overscan_appropriate_flag is present + Bool m_overscanAppropriateFlag; ///< Indicates whether conformant decoded pictures are suitable for display using overscan + Bool m_videoSignalTypePresentFlag; ///< Signals whether video_format, video_full_range_flag, and colour_description_present_flag are present + Int m_videoFormat; ///< Indicates representation of pictures + Bool m_videoFullRangeFlag; ///< Indicates the black level and range of luma and chroma signals + Bool m_colourDescriptionPresentFlag; ///< Signals whether colour_primaries, transfer_characteristics and matrix_coefficients are present + Int m_colourPrimaries; ///< Indicates chromaticity coordinates of the source primaries + Int m_transferCharacteristics; ///< Indicates the opto-electronic transfer characteristics of the source + Int m_matrixCoefficients; ///< Describes the matrix coefficients used in deriving luma and chroma from RGB primaries + Bool m_chromaLocInfoPresentFlag; ///< Signals whether chroma_sample_loc_type_top_field and chroma_sample_loc_type_bottom_field are present + Int m_chromaSampleLocTypeTopField; ///< Specifies the location of chroma samples for top field + Int m_chromaSampleLocTypeBottomField; ///< Specifies the location of chroma samples for bottom field + Bool m_neutralChromaIndicationFlag; ///< Indicates that the value of all decoded chroma samples is equal to 1<<(BitDepthCr-1) + Bool m_defaultDisplayWindowFlag; ///< Indicates the presence of the default window parameters + Int m_defDispWinLeftOffset; ///< Specifies the left offset from the conformance window of the default window + Int m_defDispWinRightOffset; ///< Specifies the right offset from the conformance window of the default window + Int m_defDispWinTopOffset; ///< Specifies the top offset from the conformance window of the default window + Int m_defDispWinBottomOffset; ///< Specifies the bottom offset from the conformance window of the default window + Bool m_frameFieldInfoPresentFlag; ///< Indicates that pic_struct values are present in picture timing SEI messages + Bool m_pocProportionalToTimingFlag; ///< Indicates that the POC value is proportional to the output time w.r.t. first picture in CVS + Int m_numTicksPocDiffOneMinus1; ///< Number of ticks minus 1 that for a POC difference of one + Bool m_bitstreamRestrictionFlag; ///< Signals whether bitstream restriction parameters are present + Bool m_tilesFixedStructureFlag; ///< Indicates that each active picture parameter set has the same values of the syntax elements related to tiles + Bool m_motionVectorsOverPicBoundariesFlag; ///< Indicates that no samples outside the picture boundaries are used for inter prediction + Int m_minSpatialSegmentationIdc; ///< Indicates the maximum size of the spatial segments in the pictures in the coded video sequence + Int m_maxBytesPerPicDenom; ///< Indicates a number of bytes not exceeded by the sum of the sizes of the VCL NAL units associated with any coded picture + Int m_maxBitsPerMinCuDenom; ///< Indicates an upper bound for the number of bits of coding_unit() data + Int m_log2MaxMvLengthHorizontal; ///< Indicate the maximum absolute value of a decoded horizontal MV component in quarter-pel luma units + Int m_log2MaxMvLengthVertical; ///< Indicate the maximum absolute value of a decoded vertical MV component in quarter-pel luma units + + // internal member functions + Void xSetGlobal(); ///< set global variables + Void xCheckParameter(); ///< check validity of configuration values + Void xPrintParameter(); ///< print configuration values + Void xPrintUsage(); ///< print usage +#if SIGNAL_BITRATE_PICRATE_IN_VPS + Int m_bitRatePicRateMaxTLayers; ///< Indicates max. number of sub-layers for which bit rate is signalled. + Bool *m_bitRateInfoPresentFlag; ///< Indicates whether bit rate information is signalled + Bool *m_picRateInfoPresentFlag; ///< Indicates whether pic rate information is signalled + Int *m_avgBitRate; ///< Indicates avg. bit rate information for various sub-layers + Int *m_maxBitRate; ///< Indicates max. bit rate information for various sub-layers + Int *m_avgPicRate; ///< Indicates avg. picture rate information for various sub-layers + Int *m_constantPicRateIdc; ///< Indicates constant picture rate idc for various sub-layers +#endif +# + +public: + + TAppEncCfg(); + virtual ~TAppEncCfg(); + +public: + + Void create(); ///< create option handling class + Void destroy(); ///< destroy option handling class + Bool parseCfg(Int argc, Char * argv[]); ///< parse configuration file to fill member variables +}; // END CLASS DEFINITION TAppEncCfg + +//! \} + +#endif // __TAPPENCCFG__