Forked from
jvet / VVCSoftware_VTM
7842 commits behind the upstream repository.
-
Frank Bossen authoredFrank Bossen authored
Picture.h 11.18 KiB
/* 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-2018, 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 Picture.h
* \brief Description of a coded picture
*/
#ifndef __PICTURE__
#define __PICTURE__
#include "CommonDef.h"
#include "Common.h"
#include "Unit.h"
#include "Buffer.h"
#include "Unit.h"
#include "Slice.h"
#include "CodingStructure.h"
#include <deque>
#if ENABLE_WPP_PARALLELISM || ENABLE_SPLIT_PARALLELISM
#if ENABLE_WPP_PARALLELISM
#include <mutex>
class SyncObj;
#endif
#define CURR_THREAD_ID -1
class Scheduler
{
public:
Scheduler();
~Scheduler();
#if ENABLE_SPLIT_PARALLELISM
unsigned getSplitDataId( int jobId = CURR_THREAD_ID ) const;
unsigned getSplitPicId ( int tId = CURR_THREAD_ID ) const;
unsigned getSplitJobId () const;
void setSplitJobId ( const int jobId );
void startParallel ();
void finishParallel();
void setSplitThreadId( const int tId = CURR_THREAD_ID );
unsigned getNumSplitThreads() const { return m_numSplitThreads; };
#endif
#if ENABLE_WPP_PARALLELISM
unsigned getWppDataId ( int lId = CURR_THREAD_ID ) const;
unsigned getWppThreadId() const;
void setWppThreadId( const int tId = CURR_THREAD_ID );
#endif
unsigned getDataId () const;
bool init ( const int ctuYsize, const int ctuXsize, const int numWppThreadsRunning, const int numWppExtraLines, const int numSplitThreads );
int getNumPicInstances() const;
#if ENABLE_WPP_PARALLELISM
void setReady ( const int ctuPosX, const int ctuPosY );
void wait ( const int ctuPosX, const int ctuPosY );
private:
bool getNextCtu( Position& pos, int ctuLine, int offset );
private:
int m_firstNonFinishedLine;
int m_numWppThreads;
int m_numWppThreadsRunning;
int m_numWppDataInstances;
int m_ctuYsize;
int m_ctuXsize;
std::vector<int> m_LineDone;
std::vector<bool> m_LineProc;
std::mutex m_mutex;
std::vector<SyncObj*> m_SyncObjs;
#endif
#if ENABLE_SPLIT_PARALLELISM
int m_numSplitThreads;
bool m_hasParallelBuffer;
#endif
};
#endif
class SEI;
class AQpLayer;
typedef std::list<SEI*> SEIMessages;
#if HEVC_TILES_WPP
class Tile
{
private:
uint32_t m_tileWidthInCtus;
uint32_t m_tileHeightInCtus;
uint32_t m_rightEdgePosInCtus;
uint32_t m_bottomEdgePosInCtus;
uint32_t m_firstCtuRsAddr;
public:
Tile();
virtual ~Tile();
void setTileWidthInCtus ( uint32_t i ) { m_tileWidthInCtus = i; }
uint32_t getTileWidthInCtus () const { return m_tileWidthInCtus; }
void setTileHeightInCtus ( uint32_t i ) { m_tileHeightInCtus = i; }
uint32_t getTileHeightInCtus () const { return m_tileHeightInCtus; }
void setRightEdgePosInCtus ( uint32_t i ) { m_rightEdgePosInCtus = i; }
uint32_t getRightEdgePosInCtus () const { return m_rightEdgePosInCtus; }
void setBottomEdgePosInCtus ( uint32_t i ) { m_bottomEdgePosInCtus = i; }
uint32_t getBottomEdgePosInCtus () const { return m_bottomEdgePosInCtus; }
void setFirstCtuRsAddr ( uint32_t i ) { m_firstCtuRsAddr = i; }
uint32_t getFirstCtuRsAddr () const { return m_firstCtuRsAddr; }
};
struct TileMap
{
TileMap();
void create( const SPS& sps, const PPS& pps );
void destroy();
uint32_t getTileIdxMap( uint32_t ctuRsAddr ) const { return *(tileIdxMap + ctuRsAddr); }
uint32_t getTileIdxMap( const Position& pos ) const { return getTileIdxMap( ( pos.x / pcv->maxCUWidth ) + ( pos.y / pcv->maxCUHeight ) * pcv->widthInCtus ); };
uint32_t getCtuTsToRsAddrMap( uint32_t ctuTsAddr ) const { return *(ctuTsToRsAddrMap + (ctuTsAddr>=pcv->sizeInCtus ? pcv->sizeInCtus : ctuTsAddr)); }
uint32_t getCtuRsToTsAddrMap( uint32_t ctuRsAddr ) const { return *(ctuRsToTsAddrMap + (ctuRsAddr>=pcv->sizeInCtus ? pcv->sizeInCtus : ctuRsAddr)); }
uint32_t getSubstreamForCtuAddr(const uint32_t ctuAddr, const bool bAddressInRaster, Slice *pcSlice) const;
const PreCalcValues* pcv;
std::vector<Tile> tiles;
uint32_t numTiles;
uint32_t numTileColumns;
uint32_t numTileRows;
uint32_t* tileIdxMap;
uint32_t* ctuTsToRsAddrMap;
uint32_t* ctuRsToTsAddrMap;
void initTileMap( const SPS& sps, const PPS& pps );
void initCtuTsRsAddrMap();
uint32_t calculateNextCtuRSAddr( const uint32_t currCtuRsAddr ) const;
};
#endif
#if ENABLE_SPLIT_PARALLELISM
#define M_BUFS(JID,PID) m_bufs[JID][PID]
#else
#define M_BUFS(JID,PID) m_bufs[PID]
#endif
struct Picture : public UnitArea
{
uint32_t margin;
Picture();
void create(const ChromaFormat &_chromaFormat, const Size &size, const unsigned _maxCUSize, const unsigned margin, const bool bDecoder);
void destroy();
void createTempBuffers( const unsigned _maxCUSize );
void destroyTempBuffers();
PelBuf getOrigBuf(const CompArea &blk);
const CPelBuf getOrigBuf(const CompArea &blk) const;
PelUnitBuf getOrigBuf(const UnitArea &unit);
const CPelUnitBuf getOrigBuf(const UnitArea &unit) const;
PelUnitBuf getOrigBuf();
const CPelUnitBuf getOrigBuf() const;
PelBuf getPredBuf(const CompArea &blk);
const CPelBuf getPredBuf(const CompArea &blk) const;
PelUnitBuf getPredBuf(const UnitArea &unit);
const CPelUnitBuf getPredBuf(const UnitArea &unit) const;
PelBuf getResiBuf(const CompArea &blk);
const CPelBuf getResiBuf(const CompArea &blk) const;
PelUnitBuf getResiBuf(const UnitArea &unit);
const CPelUnitBuf getResiBuf(const UnitArea &unit) const;
PelBuf getRecoBuf(const ComponentID compID);
const CPelBuf getRecoBuf(const ComponentID compID) const;
PelBuf getRecoBuf(const CompArea &blk);
const CPelBuf getRecoBuf(const CompArea &blk) const;
PelUnitBuf getRecoBuf(const UnitArea &unit);
const CPelUnitBuf getRecoBuf(const UnitArea &unit) const;
PelUnitBuf getRecoBuf();
const CPelUnitBuf getRecoBuf() const;
PelBuf getBuf(const ComponentID compID, const PictureType &type);
const CPelBuf getBuf(const ComponentID compID, const PictureType &type) const;
PelBuf getBuf(const CompArea &blk, const PictureType &type);
const CPelBuf getBuf(const CompArea &blk, const PictureType &type) const;
PelUnitBuf getBuf(const UnitArea &unit, const PictureType &type);
const CPelUnitBuf getBuf(const UnitArea &unit, const PictureType &type) const;
void extendPicBorder();
void finalInit( const SPS& sps, const PPS& pps );
int getPOC() const { return poc; }
void setBorderExtension( bool bFlag) { m_bIsBorderExtended = bFlag;}
Pel* getOrigin( const PictureType &type, const ComponentID compID ) const;
int getSpliceIdx(uint32_t idx) const { return m_spliceIdx[idx]; }
void setSpliceIdx(uint32_t idx, int poc) { m_spliceIdx[idx] = poc; }
void createSpliceIdx(int nums);
bool getSpliceFull();
public:
bool m_bIsBorderExtended;
bool referenced;
bool reconstructed;
bool neededForOutput;
bool usedByCurr;
bool longTerm;
bool topField;
bool fieldPic;
int m_prevQP[MAX_NUM_CHANNEL_TYPE];
int poc;
uint32_t layer;
uint32_t depth;
int* m_spliceIdx;
int m_ctuNums;
#if ENABLE_SPLIT_PARALLELISM
#if ENABLE_WPP_PARALLELISM
PelStorage m_bufs[( PARL_SPLIT_MAX_NUM_JOBS * PARL_WPP_MAX_NUM_THREADS )][NUM_PIC_TYPES];
#else
PelStorage m_bufs[PARL_SPLIT_MAX_NUM_JOBS][NUM_PIC_TYPES];
#endif
#else
PelStorage m_bufs[NUM_PIC_TYPES];
#endif
CodingStructure* cs;
std::deque<Slice*> slices;
SEIMessages SEIs;
void allocateNewSlice();
Slice *swapSliceObject(Slice * p, uint32_t i);
void clearSliceBuffer();
#if HEVC_TILES_WPP
TileMap* tileMap;
#endif
std::vector<AQpLayer*> aqlayer;
#if !KEEP_PRED_AND_RESI_SIGNALS
private:
UnitArea m_ctuArea;
#endif
#if ENABLE_SPLIT_PARALLELISM
public:
void finishParallelPart ( const UnitArea& ctuArea );
#if ENABLE_WPP_PARALLELISM
void finishCtuPart ( const UnitArea& ctuArea );
#endif
#endif
#if ENABLE_WPP_PARALLELISM || ENABLE_SPLIT_PARALLELISM
public:
Scheduler scheduler;
#endif
public:
SAOBlkParam *getSAO(int id = 0) { return &m_sao[id][0]; };
void resizeSAO(unsigned numEntries, int dstid) { m_sao[dstid].resize(numEntries); }
void copySAO(const Picture& src, int dstid) { std::copy(src.m_sao[0].begin(), src.m_sao[0].end(), m_sao[dstid].begin()); }
#if ENABLE_QPA
std::vector<double> m_uEnerHpCtu; ///< CTU-wise L2 or squared L1 norm of high-passed luma input
std::vector<Pel> m_iOffsetCtu; ///< CTU-wise DC offset (later QP index offset) of luma input
#endif
std::vector<SAOBlkParam> m_sao[2];
std::vector<uint8_t> m_alfCtuEnableFlag[MAX_NUM_COMPONENT];
uint8_t* getAlfCtuEnableFlag( int compIdx ) { return m_alfCtuEnableFlag[compIdx].data(); }
std::vector<uint8_t>* getAlfCtuEnableFlag() { return m_alfCtuEnableFlag; }
void resizeAlfCtuEnableFlag( int numEntries )
{
for( int compIdx = 0; compIdx < MAX_NUM_COMPONENT; compIdx++ )
{
m_alfCtuEnableFlag[compIdx].resize( numEntries );
std::fill( m_alfCtuEnableFlag[compIdx].begin(), m_alfCtuEnableFlag[compIdx].end(), 0 );
}
}
};
int calcAndPrintHashStatus(const CPelUnitBuf& pic, const class SEIDecodedPictureHash* pictureHashSEI, const BitDepths &bitDepths, const MsgLevel msgl);
typedef std::list<Picture*> PicList;
#endif