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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
/*****************************************************************************
* Copyright (C) 2013-2020 MulticoreWare, Inc
*
* Authors: Steve Borho <steve@borho.org>
* Min Chen <chenm003@163.com>
* 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 license @ x265.com.
*****************************************************************************/
#ifndef X265_SAO_H
#define X265_SAO_H
#include "common.h"
#include "frame.h"
#include "entropy.h"
namespace X265_NS {
// private namespace
enum SAOType
{
SAO_EO_0 = 0,
SAO_EO_1,
SAO_EO_2,
SAO_EO_3,
SAO_BO,
MAX_NUM_SAO_TYPE
};
class SAO
{
public:
enum { SAO_MAX_DEPTH = 4 };
enum { SAO_BO_BITS = 5 };
enum { MAX_NUM_SAO_CLASS = 32 };
enum { SAO_BIT_INC = 0 }; /* in HM12.0, it wrote as X265_MAX(X265_DEPTH - 10, 0) */
enum { OFFSET_THRESH = 1 << X265_MIN(X265_DEPTH - 5, 5) };
enum { NUM_EDGETYPE = 5 };
enum { NUM_PLANE = 3 };
enum { SAO_DEPTHRATE_SIZE = 4 };
static const uint32_t s_eoTable[NUM_EDGETYPE];
typedef int32_t PerClass[MAX_NUM_SAO_TYPE][MAX_NUM_SAO_CLASS];
typedef int32_t PerPlane[NUM_PLANE][MAX_NUM_SAO_TYPE][MAX_NUM_SAO_CLASS];
protected:
/* allocated per part */
PerPlane m_count;
PerPlane m_offset;
PerPlane m_offsetOrg;
/* allocated per CTU */
PerPlane* m_countPreDblk;
PerPlane* m_offsetOrgPreDblk;
double* m_depthSaoRate;
int8_t m_offsetBo[NUM_PLANE][MAX_NUM_SAO_CLASS];
int8_t m_offsetEo[NUM_PLANE][NUM_EDGETYPE];
int m_chromaFormat;
int m_numCuInWidth;
int m_numCuInHeight;
int m_hChromaShift;
int m_vChromaShift;
pixel* m_clipTable;
pixel* m_clipTableBase;
pixel* m_tmpU[3];
pixel* m_tmpL1[3];
pixel* m_tmpL2[3];
public:
struct SAOContexts
{
Entropy cur;
Entropy next;
Entropy temp;
};
Frame* m_frame;
Entropy m_entropyCoder;
SAOContexts m_rdContexts;
x265_param* m_param;
int m_refDepth;
int m_numNoSao[2];
SAO();
bool create(x265_param* param, int initCommon);
void createFromRootNode(SAO *root);
void destroy(int destoryCommon);
void allocSaoParam(SAOParam* saoParam) const;
void startSlice(Frame* pic, Entropy& initState);
void resetStats();
// CTU-based SAO process without slice granularity
void applyPixelOffsets(int addr, int typeIdx, int plane);
void processSaoUnitRow(SaoCtuParam* ctuParam, int idxY, int plane);
void generateLumaOffsets(SaoCtuParam* ctuParam, int idxY, int idxX);
void generateChromaOffsets(SaoCtuParam* ctuParam[3], int idxY, int idxX);
void calcSaoStatsCTU(int addr, int plane);
void calcSaoStatsCu_BeforeDblk(Frame* pic, int idxX, int idxY);
void saoLumaComponentParamDist(SAOParam* saoParam, int addr, int64_t& rateDist, int64_t* lambda, int64_t& bestCost);
void saoChromaComponentParamDist(SAOParam* saoParam, int addr, int64_t& rateDist, int64_t* lambda, int64_t& bestCost);
void estIterOffset(int typeIdx, int64_t lambda, int32_t count, int32_t offsetOrg, int32_t& offset, int32_t& distClasses, int64_t& costClasses);
void rdoSaoUnitRowEnd(const SAOParam* saoParam, int numctus);
void rdoSaoUnitCu(SAOParam* saoParam, int rowBaseAddr, int idxX, int addr);
int64_t calcSaoRdoCost(int64_t distortion, uint32_t bits, int64_t lambda);
void saoStatsInitialOffset(int addr, int planes);
friend class FrameFilter;
};
}
#endif // ifndef X265_SAO_H
|