这个里面有一个困扰我好久的成员函数 就是那么多buffer是哪里分配的内存,终于让我找到了 PelStorage m_bufs[NUM_PIC_TYPES]的成员变量,读取了每一帧的数据然后分配内存储存到里面。
就只看了buffer相关的函数和变量,其他没接触过的都没往上写。
关于图片类型
enum PictureType
{
PIC_RECONSTRUCTION = 0,
PIC_ORIGINAL,
#if JVET_M0427_INLOOP_RESHAPER
PIC_TRUE_ORIGINAL,
#endif
PIC_PREDICTION,
PIC_RESIDUAL,
PIC_ORG_RESI,
NUM_PIC_TYPES
};
struct Picture : public UnitArea//储存了一个CU的三个通道的CompArea信息 坐标和尺寸
{
uint32_t margin;//距离
Picture();//构造函数
//给各个图片分配内存 原始图片 重构图片 残差图片等等 大小为size大小
void create(const ChromaFormat &_chromaFormat, const Size &size, const unsigned _maxCUSize, const unsigned margin, const bool bDecoder);
void destroy();//清空内存 析构函数
void createTempBuffers( const unsigned _maxCUSize );//临时的bufffer 只有maxCUSize大小
void destroyTempBuffers();
PelBuf getOrigBuf(const CompArea &blk);//返回原始图像 一个分量 把指针指到了原始图像中的相对坐标位置
const CPelBuf getOrigBuf(const CompArea &blk) const;
PelUnitBuf getOrigBuf(const UnitArea &unit);//返回原始图像 三个分量 把指针指到了原始图像 但是Area是输入的Area没变
const CPelUnitBuf getOrigBuf(const UnitArea &unit) const;
PelUnitBuf getOrigBuf();//返回原始图像 PelStorage
const CPelUnitBuf getOrigBuf() const;
#if JVET_M0427_INLOOP_RESHAPER
PelBuf getOrigBuf(const ComponentID compID);
const CPelBuf getOrigBuf(const ComponentID compID) const;
PelUnitBuf getTrueOrigBuf();
const CPelUnitBuf getTrueOrigBuf() const;
PelBuf getTrueOrigBuf(const CompArea &blk);
const CPelBuf getTrueOrigBuf(const CompArea &blk) const;
#endif
//返回预测的Buffer
PelBuf getPredBuf(const CompArea &blk);
const CPelBuf getPredBuf(const CompArea &blk) const;
PelUnitBuf getPredBuf(const UnitArea &unit);
const CPelUnitBuf getPredBuf(const UnitArea &unit) const;
//返回残差Buffer
PelBuf getResiBuf(const CompArea &blk);
const CPelBuf getResiBuf(const CompArea &blk) const;
PelUnitBuf getResiBuf(const UnitArea &unit);
const CPelUnitBuf getResiBuf(const UnitArea &unit) const;
//返回重构Buffer
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;//返回原始图像的分配内存的坐标 PelStorage 里的原始指针
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;//是否重构
int m_prevQP[MAX_NUM_CHANNEL_TYPE];//初始QP
int poc;//帧数
uint32_t layer;
uint32_t depth;
int* m_spliceIdx;
int m_ctuNums;//有几个CTU
#if ENABLE_SPLIT_PARALLELISM
PelStorage m_bufs[PARL_SPLIT_MAX_NUM_JOBS][NUM_PIC_TYPES];
#endif
#else
//就是这个变量 给分配内存然后把指针复制给各个buf的T变量
PelStorage m_bufs[NUM_PIC_TYPES];//分配内存 编码,残差,量化等信息对应的picture分配内存
#endif
CodingStructure* cs;
std::deque<Slice*> slices;
SEIMessages SEIs;
#if !KEEP_PRED_AND_RESI_SIGNALS
private:
UnitArea m_ctuArea;
#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; }
};