/* 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-2015, 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 TEncBinCoderCABAC.cpp \brief binary entropy encoder of CABAC */ #include "TEncBinCoderCABACCounter.h" #include "TLibCommon/TComRom.h" #include "TLibCommon/Debug.h" #if FAST_BIT_EST //! \ingroup TLibEncoder //! \{ TEncBinCABACCounter::TEncBinCABACCounter() { } TEncBinCABACCounter::~TEncBinCABACCounter() { } Void TEncBinCABACCounter::finish() { m_pcTComBitIf->write(0, UInt(m_fracBits >> 15) ); m_fracBits &= 32767; #if NH_MV D_PRINT_INDENT( g_traceEncFracBits, "Finish " + n2s(m_fracBits) ); #endif } UInt TEncBinCABACCounter::getNumWrittenBits() { return m_pcTComBitIf->getNumberOfWrittenBits() + UInt( m_fracBits >> 15 ); } /** * \brief Encode bin * * \param binValue bin value * \param rcCtxModel context model */ Void TEncBinCABACCounter::encodeBin( UInt binValue, ContextModel &rcCtxModel ) { #if DEBUG_ENCODER_SEARCH_BINS const UInt64 startingFracBits = m_fracBits; #endif m_uiBinsCoded += m_binCountIncrement; m_fracBits += rcCtxModel.getEntropyBits( binValue ); #if NH_MV D_PRINT_INDENT( g_traceEncFracBits, "EncodeBin " + n2s(m_fracBits) ); #endif rcCtxModel.update( binValue ); #if DEBUG_ENCODER_SEARCH_BINS if ((g_debugCounter + debugEncoderSearchBinWindow) >= debugEncoderSearchBinTargetLine) { std::cout << g_debugCounter << ": coding bin value " << binValue << ", fracBits = [" << startingFracBits << "->" << m_fracBits << "]\n"; } if (g_debugCounter >= debugEncoderSearchBinTargetLine) { Char breakPointThis; breakPointThis = 7; } if (g_debugCounter >= (debugEncoderSearchBinTargetLine + debugEncoderSearchBinWindow)) { exit(0); } g_debugCounter++; #endif } /** * \brief Encode equiprobable bin * * \param binValue bin value */ Void TEncBinCABACCounter::encodeBinEP( UInt /*binValue*/ ) { m_uiBinsCoded += m_binCountIncrement; m_fracBits += 32768; #if NH_MV D_PRINT_INDENT( g_traceEncFracBits , "EncodeBinEP " + n2s(m_fracBits) ); #endif } /** * \brief Encode equiprobable bins * * \param binValues bin values * \param numBins number of bins */ Void TEncBinCABACCounter::encodeBinsEP( UInt /*binValues*/, Int numBins ) { m_uiBinsCoded += numBins & -m_binCountIncrement; m_fracBits += 32768 * numBins; #if NH_MV D_PRINT_INDENT( g_traceEncFracBits , "EncodeBinsEP " + n2s(m_fracBits) ); #endif } /** * \brief Encode terminating bin * * \param binValue bin value */ Void TEncBinCABACCounter::encodeBinTrm( UInt binValue ) { m_uiBinsCoded += m_binCountIncrement; m_fracBits += ContextModel::getEntropyBitsTrm( binValue ); #if NH_MV D_PRINT_INDENT( g_traceEncFracBits , "EncodeBinTrm " + n2s(m_fracBits) ); #endif } Void TEncBinCABACCounter::align() { m_fracBits = (m_fracBits + 32767) & (~32767); #if NH_MV D_PRINT_INDENT( g_traceEncFracBits, "Align " + n2s(m_fracBits) ); #endif } //! \} #endif