1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka * Copyright 2015 Rockchip Electronics Co. LTD
3*437bfbebSnyanmisaka *
4*437bfbebSnyanmisaka * Licensed under the Apache License, Version 2.0 (the "License");
5*437bfbebSnyanmisaka * you may not use this file except in compliance with the License.
6*437bfbebSnyanmisaka * You may obtain a copy of the License at
7*437bfbebSnyanmisaka *
8*437bfbebSnyanmisaka * http://www.apache.org/licenses/LICENSE-2.0
9*437bfbebSnyanmisaka *
10*437bfbebSnyanmisaka * Unless required by applicable law or agreed to in writing, software
11*437bfbebSnyanmisaka * distributed under the License is distributed on an "AS IS" BASIS,
12*437bfbebSnyanmisaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*437bfbebSnyanmisaka * See the License for the specific language governing permissions and
14*437bfbebSnyanmisaka * limitations under the License.
15*437bfbebSnyanmisaka */
16*437bfbebSnyanmisaka
17*437bfbebSnyanmisaka #define MODULE_TAG "h265e_ps"
18*437bfbebSnyanmisaka
19*437bfbebSnyanmisaka #include <string.h>
20*437bfbebSnyanmisaka
21*437bfbebSnyanmisaka #include "mpp_mem.h"
22*437bfbebSnyanmisaka #include "mpp_soc.h"
23*437bfbebSnyanmisaka #include "mpp_common.h"
24*437bfbebSnyanmisaka
25*437bfbebSnyanmisaka #include "h265e_ps.h"
26*437bfbebSnyanmisaka #include "mpp_enc_ref.h"
27*437bfbebSnyanmisaka
28*437bfbebSnyanmisaka #define MAX_UINT 0xFFFFFFFFU
29*437bfbebSnyanmisaka
30*437bfbebSnyanmisaka typedef struct H265levelspec_t {
31*437bfbebSnyanmisaka RK_U32 maxLumaSamples;
32*437bfbebSnyanmisaka RK_U32 maxLumaSamplesPerSecond;
33*437bfbebSnyanmisaka RK_U32 maxBitrateMain;
34*437bfbebSnyanmisaka RK_U32 maxBitrateHigh;
35*437bfbebSnyanmisaka RK_U32 maxCpbSizeMain;
36*437bfbebSnyanmisaka RK_U32 maxCpbSizeHigh;
37*437bfbebSnyanmisaka RK_U32 minCompressionRatio;
38*437bfbebSnyanmisaka RK_S32 levelEnum;
39*437bfbebSnyanmisaka const char* name;
40*437bfbebSnyanmisaka RK_S32 levelIdc;
41*437bfbebSnyanmisaka } H265levelspec;
42*437bfbebSnyanmisaka
43*437bfbebSnyanmisaka H265levelspec levels[] = {
44*437bfbebSnyanmisaka { 36864, 552960, 128, MAX_UINT, 350, MAX_UINT, 2, H265_LEVEL1, "1", 10 },
45*437bfbebSnyanmisaka { 122880, 3686400, 1500, MAX_UINT, 1500, MAX_UINT, 2, H265_LEVEL2, "2", 20 },
46*437bfbebSnyanmisaka { 245760, 7372800, 3000, MAX_UINT, 3000, MAX_UINT, 2, H265_LEVEL2_1, "2.1", 21 },
47*437bfbebSnyanmisaka { 552960, 16588800, 6000, MAX_UINT, 6000, MAX_UINT, 2, H265_LEVEL3, "3", 30 },
48*437bfbebSnyanmisaka { 983040, 33177600, 10000, MAX_UINT, 10000, MAX_UINT, 2, H265_LEVEL3_1, "3.1", 31 },
49*437bfbebSnyanmisaka { 2228224, 66846720, 12000, 30000, 12000, 30000, 4, H265_LEVEL4, "4", 40 },
50*437bfbebSnyanmisaka { 2228224, 133693440, 20000, 50000, 20000, 50000, 4, H265_LEVEL4_1, "4.1", 41 },
51*437bfbebSnyanmisaka { 8912896, 267386880, 25000, 100000, 25000, 100000, 6, H265_LEVEL5, "5", 50 },
52*437bfbebSnyanmisaka { 8912896, 534773760, 40000, 160000, 40000, 160000, 8, H265_LEVEL5_1, "5.1", 51 },
53*437bfbebSnyanmisaka { 8912896, 1069547520, 60000, 240000, 60000, 240000, 8, H265_LEVEL5_2, "5.2", 52 },
54*437bfbebSnyanmisaka { 35651584, 1069547520, 60000, 240000, 60000, 240000, 8, H265_LEVEL6, "6", 60 },
55*437bfbebSnyanmisaka { 35651584, 2139095040, 120000, 480000, 120000, 480000, 8, H265_LEVEL6_1, "6.1", 61 },
56*437bfbebSnyanmisaka { 35651584, 4278190080U, 240000, 800000, 240000, 800000, 6, H265_LEVEL6_2, "6.2", 62 },
57*437bfbebSnyanmisaka { MAX_UINT, MAX_UINT, MAX_UINT, MAX_UINT, MAX_UINT, MAX_UINT, 1, H265_LEVEL8_5, "8.5", 85 },
58*437bfbebSnyanmisaka };
59*437bfbebSnyanmisaka
init_zscan2raster(RK_S32 maxDepth,RK_S32 depth,RK_U32 startVal,RK_U32 ** curIdx)60*437bfbebSnyanmisaka void init_zscan2raster(RK_S32 maxDepth, RK_S32 depth, RK_U32 startVal, RK_U32** curIdx)
61*437bfbebSnyanmisaka {
62*437bfbebSnyanmisaka RK_S32 stride = 1 << (maxDepth - 1);
63*437bfbebSnyanmisaka if (depth == maxDepth) {
64*437bfbebSnyanmisaka (*curIdx)[0] = startVal;
65*437bfbebSnyanmisaka (*curIdx)++;
66*437bfbebSnyanmisaka } else {
67*437bfbebSnyanmisaka RK_S32 step = stride >> depth;
68*437bfbebSnyanmisaka init_zscan2raster(maxDepth, depth + 1, startVal, curIdx);
69*437bfbebSnyanmisaka init_zscan2raster(maxDepth, depth + 1, startVal + step, curIdx);
70*437bfbebSnyanmisaka init_zscan2raster(maxDepth, depth + 1, startVal + step * stride, curIdx);
71*437bfbebSnyanmisaka init_zscan2raster(maxDepth, depth + 1, startVal + step * stride + step, curIdx);
72*437bfbebSnyanmisaka }
73*437bfbebSnyanmisaka }
74*437bfbebSnyanmisaka
init_raster2zscan(RK_U32 maxCUSize,RK_U32 maxDepth,RK_U32 * raster2zscan,RK_U32 * zscan2raster)75*437bfbebSnyanmisaka void init_raster2zscan(RK_U32 maxCUSize, RK_U32 maxDepth, RK_U32 *raster2zscan, RK_U32 *zscan2raster)
76*437bfbebSnyanmisaka {
77*437bfbebSnyanmisaka RK_U32 unitSize = maxCUSize >> (maxDepth - 1);
78*437bfbebSnyanmisaka RK_U32 numPartInCUSize = (RK_U32)maxCUSize / unitSize;
79*437bfbebSnyanmisaka RK_U32 i;
80*437bfbebSnyanmisaka
81*437bfbebSnyanmisaka for ( i = 0; i < numPartInCUSize * numPartInCUSize; i++) {
82*437bfbebSnyanmisaka raster2zscan[zscan2raster[i]] = i;
83*437bfbebSnyanmisaka }
84*437bfbebSnyanmisaka }
85*437bfbebSnyanmisaka
init_raster2pelxy(RK_U32 maxCUSize,RK_U32 maxDepth,RK_U32 * raster2pelx,RK_U32 * raster2pely)86*437bfbebSnyanmisaka void init_raster2pelxy(RK_U32 maxCUSize, RK_U32 maxDepth, RK_U32 *raster2pelx, RK_U32 *raster2pely)
87*437bfbebSnyanmisaka {
88*437bfbebSnyanmisaka RK_U32 i;
89*437bfbebSnyanmisaka
90*437bfbebSnyanmisaka RK_U32* tempx = &raster2pelx[0];
91*437bfbebSnyanmisaka RK_U32* tempy = &raster2pely[0];
92*437bfbebSnyanmisaka
93*437bfbebSnyanmisaka RK_U32 unitSize = maxCUSize >> (maxDepth - 1);
94*437bfbebSnyanmisaka
95*437bfbebSnyanmisaka RK_U32 numPartInCUSize = maxCUSize / unitSize;
96*437bfbebSnyanmisaka
97*437bfbebSnyanmisaka tempx[0] = 0;
98*437bfbebSnyanmisaka tempx++;
99*437bfbebSnyanmisaka for (i = 1; i < numPartInCUSize; i++) {
100*437bfbebSnyanmisaka tempx[0] = tempx[-1] + unitSize;
101*437bfbebSnyanmisaka tempx++;
102*437bfbebSnyanmisaka }
103*437bfbebSnyanmisaka
104*437bfbebSnyanmisaka for (i = 1; i < numPartInCUSize; i++) {
105*437bfbebSnyanmisaka memcpy(tempx, tempx - numPartInCUSize, sizeof(RK_U32) * numPartInCUSize);
106*437bfbebSnyanmisaka tempx += numPartInCUSize;
107*437bfbebSnyanmisaka }
108*437bfbebSnyanmisaka
109*437bfbebSnyanmisaka for (i = 1; i < numPartInCUSize * numPartInCUSize; i++) {
110*437bfbebSnyanmisaka tempy[i] = (i / numPartInCUSize) * unitSize;
111*437bfbebSnyanmisaka }
112*437bfbebSnyanmisaka }
113*437bfbebSnyanmisaka
h265e_set_vps(H265eCtx * ctx,H265eVps * vps)114*437bfbebSnyanmisaka MPP_RET h265e_set_vps(H265eCtx *ctx, H265eVps *vps)
115*437bfbebSnyanmisaka {
116*437bfbebSnyanmisaka RK_S32 i;
117*437bfbebSnyanmisaka MppEncH265Cfg *codec = &ctx->cfg->h265;
118*437bfbebSnyanmisaka ProfileTierLevel *profileTierLevel = &vps->m_ptl.m_generalPTL;
119*437bfbebSnyanmisaka MppEncPrepCfg *prep = &ctx->cfg->prep;
120*437bfbebSnyanmisaka MppEncRefCfg ref_cfg = ctx->cfg->ref_cfg;
121*437bfbebSnyanmisaka RK_U32 maxlumas = prep->width * prep->height;
122*437bfbebSnyanmisaka RK_S32 level_idc = H265_LEVEL_NONE;
123*437bfbebSnyanmisaka MppEncRefCfgImpl *refs = (MppEncRefCfgImpl *)ref_cfg;
124*437bfbebSnyanmisaka
125*437bfbebSnyanmisaka vps->m_VPSId = 0;
126*437bfbebSnyanmisaka vps->m_maxTLayers = refs->max_tlayers ? refs->max_tlayers : 1;
127*437bfbebSnyanmisaka vps->m_maxLayers = vps->m_maxTLayers;
128*437bfbebSnyanmisaka vps->m_bTemporalIdNestingFlag = 1;
129*437bfbebSnyanmisaka vps->m_numHrdParameters = 0;
130*437bfbebSnyanmisaka vps->m_maxNuhReservedZeroLayerId = 0;
131*437bfbebSnyanmisaka vps->m_hrdParameters = NULL;
132*437bfbebSnyanmisaka vps->m_hrdOpSetIdx = NULL;
133*437bfbebSnyanmisaka vps->m_cprmsPresentFlag = NULL;
134*437bfbebSnyanmisaka for (i = 0; i < MAX_SUB_LAYERS; i++) {
135*437bfbebSnyanmisaka vps->m_numReorderPics[i] = 0;
136*437bfbebSnyanmisaka vps->m_maxDecPicBuffering[i] = MPP_MIN(MAX_REFS, MPP_MAX((vps->m_numReorderPics[i] + 3), codec->num_ref) + vps->m_numReorderPics[i]);
137*437bfbebSnyanmisaka vps->m_maxLatencyIncrease[i] = 0;
138*437bfbebSnyanmisaka }
139*437bfbebSnyanmisaka memset(profileTierLevel->m_profileCompatibilityFlag, 0, sizeof(profileTierLevel->m_profileCompatibilityFlag));
140*437bfbebSnyanmisaka memset(vps->m_ptl.m_subLayerProfilePresentFlag, 0, sizeof(vps->m_ptl.m_subLayerProfilePresentFlag));
141*437bfbebSnyanmisaka memset(vps->m_ptl.m_subLayerLevelPresentFlag, 0, sizeof(vps->m_ptl.m_subLayerLevelPresentFlag));
142*437bfbebSnyanmisaka for (i = 0; i < (RK_S32)MPP_ARRAY_ELEMS(levels); i++) {
143*437bfbebSnyanmisaka if (levels[i].maxLumaSamples >= maxlumas) {
144*437bfbebSnyanmisaka level_idc = levels[i].levelEnum;
145*437bfbebSnyanmisaka break;
146*437bfbebSnyanmisaka }
147*437bfbebSnyanmisaka }
148*437bfbebSnyanmisaka
149*437bfbebSnyanmisaka profileTierLevel->m_profileSpace = 0;
150*437bfbebSnyanmisaka if (codec->level < level_idc) {
151*437bfbebSnyanmisaka profileTierLevel->m_levelIdc = level_idc;
152*437bfbebSnyanmisaka } else {
153*437bfbebSnyanmisaka profileTierLevel->m_levelIdc = codec->level;
154*437bfbebSnyanmisaka }
155*437bfbebSnyanmisaka profileTierLevel->m_tierFlag = codec->tier ? 1 : 0;
156*437bfbebSnyanmisaka
157*437bfbebSnyanmisaka if (prep->format == MPP_FMT_YUV400) {
158*437bfbebSnyanmisaka /* general_profile_idc == 4 */
159*437bfbebSnyanmisaka codec->profile = MPP_PROFILE_HEVC_FORMAT_RANGE_EXTENDIONS;
160*437bfbebSnyanmisaka profileTierLevel->m_max12bitConstraintFlag = 1;
161*437bfbebSnyanmisaka profileTierLevel->m_max10bitConstraintFlag = 1;
162*437bfbebSnyanmisaka profileTierLevel->m_max8bitConstraintFlag = 1;
163*437bfbebSnyanmisaka profileTierLevel->m_max422chromaConstraintFlag = 1;
164*437bfbebSnyanmisaka profileTierLevel->m_max420chromaConstraintFlag = 1;
165*437bfbebSnyanmisaka profileTierLevel->m_maxMonochromaConstraintFlag = 1;
166*437bfbebSnyanmisaka profileTierLevel->m_lowerBitRateConstraintFlag = 1;
167*437bfbebSnyanmisaka } else {
168*437bfbebSnyanmisaka /* general_profile_idc == 2 */
169*437bfbebSnyanmisaka profileTierLevel->m_profileCompatibilityFlag[2] = 1;
170*437bfbebSnyanmisaka }
171*437bfbebSnyanmisaka
172*437bfbebSnyanmisaka profileTierLevel->m_profileIdc = codec->profile;
173*437bfbebSnyanmisaka profileTierLevel->m_profileCompatibilityFlag[codec->profile] = 1;
174*437bfbebSnyanmisaka profileTierLevel->m_progressiveSourceFlag = 1;
175*437bfbebSnyanmisaka profileTierLevel->m_nonPackedConstraintFlag = 0;
176*437bfbebSnyanmisaka profileTierLevel->m_frameOnlyConstraintFlag = 0;
177*437bfbebSnyanmisaka return MPP_OK;
178*437bfbebSnyanmisaka }
179*437bfbebSnyanmisaka
h265e_set_sps(H265eCtx * ctx,H265eSps * sps,H265eVps * vps)180*437bfbebSnyanmisaka MPP_RET h265e_set_sps(H265eCtx *ctx, H265eSps *sps, H265eVps *vps)
181*437bfbebSnyanmisaka {
182*437bfbebSnyanmisaka RK_U32 i, c;
183*437bfbebSnyanmisaka MppEncH265Cfg *codec = &ctx->cfg->h265;
184*437bfbebSnyanmisaka MppEncPrepCfg *prep = &ctx->cfg->prep;
185*437bfbebSnyanmisaka MppEncRcCfg *rc = &ctx->cfg->rc;
186*437bfbebSnyanmisaka MppEncRefCfg ref_cfg = ctx->cfg->ref_cfg;
187*437bfbebSnyanmisaka MppEncVuiCfg *vui = &codec->vui;
188*437bfbebSnyanmisaka MppFrameFormat fmt = prep->format;
189*437bfbebSnyanmisaka RK_S32 i_timebase_num = rc->fps_out_denom;
190*437bfbebSnyanmisaka RK_S32 i_timebase_den = rc->fps_out_num;
191*437bfbebSnyanmisaka RK_U8 convertToBit[MAX_CU_SIZE + 1];
192*437bfbebSnyanmisaka RK_U32 maxCUDepth, minCUDepth, addCUDepth;
193*437bfbebSnyanmisaka RK_S32 pad[2] = {0};
194*437bfbebSnyanmisaka RK_S32 minCUSize, log2MinCUSize;
195*437bfbebSnyanmisaka RK_S32 tuQTMinLog2Size = 2, tuQTMaxLog2Size;
196*437bfbebSnyanmisaka MppEncCpbInfo *cpb_info = mpp_enc_ref_cfg_get_cpb_info(ref_cfg);
197*437bfbebSnyanmisaka RockchipSocType soc_type;
198*437bfbebSnyanmisaka RK_U32 *tmp = &sps->zscan2raster[0];
199*437bfbebSnyanmisaka
200*437bfbebSnyanmisaka memset(convertToBit, -1, sizeof(convertToBit));
201*437bfbebSnyanmisaka c = 0;
202*437bfbebSnyanmisaka for (i = 4; i <= MAX_CU_SIZE; i *= 2) {
203*437bfbebSnyanmisaka convertToBit[i] = c;
204*437bfbebSnyanmisaka c++;
205*437bfbebSnyanmisaka }
206*437bfbebSnyanmisaka
207*437bfbebSnyanmisaka maxCUDepth = (uint32_t)convertToBit[codec->max_cu_size];
208*437bfbebSnyanmisaka
209*437bfbebSnyanmisaka minCUDepth = (codec->max_cu_size >> (maxCUDepth - 1));
210*437bfbebSnyanmisaka
211*437bfbebSnyanmisaka tuQTMaxLog2Size = convertToBit[codec->max_cu_size] + 2 - 1;
212*437bfbebSnyanmisaka soc_type = mpp_get_soc_type();
213*437bfbebSnyanmisaka if (soc_type == ROCKCHIP_SOC_RK3576 || soc_type == ROCKCHIP_SOC_RV1126B) {
214*437bfbebSnyanmisaka tuQTMaxLog2Size = tuQTMaxLog2Size + 1;
215*437bfbebSnyanmisaka }
216*437bfbebSnyanmisaka
217*437bfbebSnyanmisaka addCUDepth = 0;
218*437bfbebSnyanmisaka while ((RK_U32)(codec->max_cu_size >> maxCUDepth) > (1u << (tuQTMinLog2Size + addCUDepth))) {
219*437bfbebSnyanmisaka addCUDepth++;
220*437bfbebSnyanmisaka }
221*437bfbebSnyanmisaka
222*437bfbebSnyanmisaka maxCUDepth += addCUDepth;
223*437bfbebSnyanmisaka addCUDepth++;
224*437bfbebSnyanmisaka init_zscan2raster(maxCUDepth + 1, 1, 0, &tmp );
225*437bfbebSnyanmisaka init_raster2zscan(codec->max_cu_size, maxCUDepth + 1, &sps->raster2zscan[0], &sps->zscan2raster[0]);
226*437bfbebSnyanmisaka init_raster2pelxy(codec->max_cu_size, maxCUDepth + 1, &sps->raster2pelx[0], &sps->raster2pely[0]);
227*437bfbebSnyanmisaka
228*437bfbebSnyanmisaka memset(&sps->m_conformanceWindow, 0, sizeof(H265eCropInfo));
229*437bfbebSnyanmisaka if ((prep->width % minCUDepth) != 0) {
230*437bfbebSnyanmisaka RK_U32 padsize = 0;
231*437bfbebSnyanmisaka RK_U32 rem = prep->width % minCUDepth;
232*437bfbebSnyanmisaka padsize = minCUDepth - rem;
233*437bfbebSnyanmisaka pad[0] = padsize; //pad width
234*437bfbebSnyanmisaka
235*437bfbebSnyanmisaka /* set the confirmation window offsets */
236*437bfbebSnyanmisaka sps->m_conformanceWindow.m_enabledFlag = 1;
237*437bfbebSnyanmisaka sps->m_conformanceWindow.m_winRightOffset = pad[0];
238*437bfbebSnyanmisaka }
239*437bfbebSnyanmisaka
240*437bfbebSnyanmisaka if ((prep->height % minCUDepth) != 0) {
241*437bfbebSnyanmisaka RK_U32 padsize = 0;
242*437bfbebSnyanmisaka RK_U32 rem = prep->height % minCUDepth;
243*437bfbebSnyanmisaka padsize = minCUDepth - rem;
244*437bfbebSnyanmisaka pad[1] = padsize; //pad height
245*437bfbebSnyanmisaka
246*437bfbebSnyanmisaka /* set the confirmation window offsets */
247*437bfbebSnyanmisaka sps->m_conformanceWindow.m_enabledFlag = 1;
248*437bfbebSnyanmisaka sps->m_conformanceWindow.m_winBottomOffset = pad[1];
249*437bfbebSnyanmisaka }
250*437bfbebSnyanmisaka // pad[0] = p->sourceWidth - p->oldSourceWidth;
251*437bfbebSnyanmisaka // pad[1] = p->sourceHeight - p->oldSourceHeight;
252*437bfbebSnyanmisaka
253*437bfbebSnyanmisaka sps->m_SPSId = 0;
254*437bfbebSnyanmisaka sps->m_VPSId = 0;
255*437bfbebSnyanmisaka sps->m_chromaFormatIdc = (fmt == MPP_FMT_YUV400) ? H265_CHROMA_400 : H265_CHROMA_420;
256*437bfbebSnyanmisaka sps->m_maxTLayers = vps->m_maxLayers;
257*437bfbebSnyanmisaka sps->m_picWidthInLumaSamples = prep->width + pad[0];
258*437bfbebSnyanmisaka sps->m_picHeightInLumaSamples = prep->height + pad[1];
259*437bfbebSnyanmisaka sps->m_log2MinCodingBlockSize = 0;
260*437bfbebSnyanmisaka sps->m_log2DiffMaxMinCodingBlockSize = 0 ;
261*437bfbebSnyanmisaka sps->m_maxCUSize = codec->max_cu_size;
262*437bfbebSnyanmisaka sps->m_maxCUDepth = maxCUDepth;
263*437bfbebSnyanmisaka sps->m_addCUDepth = addCUDepth;
264*437bfbebSnyanmisaka sps->m_RPSList.m_numberOfReferencePictureSets = 0;
265*437bfbebSnyanmisaka sps->m_RPSList.m_referencePictureSets = NULL;
266*437bfbebSnyanmisaka
267*437bfbebSnyanmisaka minCUSize = sps->m_maxCUSize >> (sps->m_maxCUDepth - addCUDepth);
268*437bfbebSnyanmisaka log2MinCUSize = 0;
269*437bfbebSnyanmisaka while (minCUSize > 1) {
270*437bfbebSnyanmisaka minCUSize >>= 1;
271*437bfbebSnyanmisaka log2MinCUSize++;
272*437bfbebSnyanmisaka }
273*437bfbebSnyanmisaka sps->m_log2MinCodingBlockSize = log2MinCUSize;
274*437bfbebSnyanmisaka sps->m_log2DiffMaxMinCodingBlockSize = sps->m_maxCUDepth - addCUDepth;
275*437bfbebSnyanmisaka
276*437bfbebSnyanmisaka sps->m_pcmLog2MaxSize = 5;
277*437bfbebSnyanmisaka sps->m_usePCM = 0;
278*437bfbebSnyanmisaka sps->m_pcmLog2MinSize = 3;
279*437bfbebSnyanmisaka
280*437bfbebSnyanmisaka
281*437bfbebSnyanmisaka sps->m_bLongTermRefsPresent = 0;
282*437bfbebSnyanmisaka sps->m_quadtreeTULog2MaxSize = tuQTMaxLog2Size;
283*437bfbebSnyanmisaka sps->m_quadtreeTULog2MinSize = tuQTMinLog2Size;
284*437bfbebSnyanmisaka sps->m_quadtreeTUMaxDepthInter = 1; //tuQTMaxInterDepth
285*437bfbebSnyanmisaka sps->m_quadtreeTUMaxDepthIntra = 1; //tuQTMaxIntraDepth
286*437bfbebSnyanmisaka sps->m_useLossless = 0;
287*437bfbebSnyanmisaka
288*437bfbebSnyanmisaka for (i = 0; i < (maxCUDepth - addCUDepth); i++) {
289*437bfbebSnyanmisaka sps->m_iAMPAcc[i] = codec->amp_enable;
290*437bfbebSnyanmisaka }
291*437bfbebSnyanmisaka sps->m_useAMP = codec->amp_enable;
292*437bfbebSnyanmisaka for (i = maxCUDepth - addCUDepth; i < maxCUDepth; i++) {
293*437bfbebSnyanmisaka sps->m_iAMPAcc[i] = codec->amp_enable;
294*437bfbebSnyanmisaka }
295*437bfbebSnyanmisaka
296*437bfbebSnyanmisaka sps->m_bitDepthY = 8;
297*437bfbebSnyanmisaka sps->m_bitDepthC = 8;
298*437bfbebSnyanmisaka sps->m_qpBDOffsetY = 0;
299*437bfbebSnyanmisaka sps->m_qpBDOffsetC = 0;
300*437bfbebSnyanmisaka
301*437bfbebSnyanmisaka sps->m_bUseSAO = codec->sao_enable;
302*437bfbebSnyanmisaka sps->m_bTemporalIdNestingFlag = 1;
303*437bfbebSnyanmisaka
304*437bfbebSnyanmisaka for (i = 0; i < sps->m_maxTLayers; i++) {
305*437bfbebSnyanmisaka sps->m_maxDecPicBuffering[i] = vps->m_maxDecPicBuffering[i];
306*437bfbebSnyanmisaka sps->m_numReorderPics[i] = vps->m_numReorderPics[i];
307*437bfbebSnyanmisaka }
308*437bfbebSnyanmisaka
309*437bfbebSnyanmisaka sps->m_pcmBitDepthLuma = 8;
310*437bfbebSnyanmisaka sps->m_pcmBitDepthChroma = 8;
311*437bfbebSnyanmisaka
312*437bfbebSnyanmisaka sps->m_bPCMFilterDisableFlag = 0;
313*437bfbebSnyanmisaka sps->m_scalingListEnabledFlag = codec->trans_cfg.scaling_list_mode == 0 ? 0 : 1;
314*437bfbebSnyanmisaka
315*437bfbebSnyanmisaka sps->m_bitsForPOC = 16;
316*437bfbebSnyanmisaka sps->m_numLongTermRefPicSPS = 0;
317*437bfbebSnyanmisaka sps->m_maxTrSize = 32;
318*437bfbebSnyanmisaka sps->m_bLongTermRefsPresent = 0;
319*437bfbebSnyanmisaka sps->m_TMVPFlagsPresent = codec->tmvp_enable;
320*437bfbebSnyanmisaka sps->m_useStrongIntraSmoothing = codec->cu_cfg.strong_intra_smoothing_enabled_flag;
321*437bfbebSnyanmisaka if (cpb_info->max_lt_cnt) {
322*437bfbebSnyanmisaka sps->m_numLongTermRefPicSPS = cpb_info->max_lt_cnt;
323*437bfbebSnyanmisaka sps->m_bLongTermRefsPresent = 1;
324*437bfbebSnyanmisaka sps->m_TMVPFlagsPresent = 0;
325*437bfbebSnyanmisaka codec->tmvp_enable = 0;
326*437bfbebSnyanmisaka } else if (cpb_info->max_st_tid) {
327*437bfbebSnyanmisaka sps->m_TMVPFlagsPresent = 0;
328*437bfbebSnyanmisaka }
329*437bfbebSnyanmisaka
330*437bfbebSnyanmisaka if (rc->drop_mode == MPP_ENC_RC_DROP_FRM_PSKIP) {
331*437bfbebSnyanmisaka codec->tmvp_enable = 0;
332*437bfbebSnyanmisaka sps->m_TMVPFlagsPresent = 0;
333*437bfbebSnyanmisaka codec->sao_enable = 0;
334*437bfbebSnyanmisaka sps->m_bUseSAO = 0;
335*437bfbebSnyanmisaka }
336*437bfbebSnyanmisaka
337*437bfbebSnyanmisaka sps->m_ptl = &vps->m_ptl;
338*437bfbebSnyanmisaka sps->m_vuiParametersPresentFlag = vui->vui_en;
339*437bfbebSnyanmisaka if (sps->m_vuiParametersPresentFlag) {
340*437bfbebSnyanmisaka sps->vui.m_aspectRatioInfoPresentFlag = 0;
341*437bfbebSnyanmisaka sps->vui.m_aspectRatioIdc = 0;
342*437bfbebSnyanmisaka sps->vui.m_sarWidth = 0;
343*437bfbebSnyanmisaka sps->vui.m_sarHeight = 0;
344*437bfbebSnyanmisaka sps->vui.m_overscanInfoPresentFlag = 0;
345*437bfbebSnyanmisaka sps->vui.m_overscanAppropriateFlag = 0;
346*437bfbebSnyanmisaka sps->vui.m_videoSignalTypePresentFlag = 0;
347*437bfbebSnyanmisaka sps->vui.m_videoFormat = MPP_FRAME_VIDEO_FMT_UNSPECIFIED;
348*437bfbebSnyanmisaka if (prep->range == MPP_FRAME_RANGE_JPEG) {
349*437bfbebSnyanmisaka sps->vui.m_videoFullRangeFlag = 1;
350*437bfbebSnyanmisaka sps->vui.m_videoSignalTypePresentFlag = 1;
351*437bfbebSnyanmisaka }
352*437bfbebSnyanmisaka
353*437bfbebSnyanmisaka if ((prep->colorprim <= MPP_FRAME_PRI_JEDEC_P22 &&
354*437bfbebSnyanmisaka prep->colorprim != MPP_FRAME_PRI_UNSPECIFIED) ||
355*437bfbebSnyanmisaka (prep->colortrc <= MPP_FRAME_TRC_ARIB_STD_B67 &&
356*437bfbebSnyanmisaka prep->colortrc != MPP_FRAME_TRC_UNSPECIFIED) ||
357*437bfbebSnyanmisaka (prep->color <= MPP_FRAME_SPC_ICTCP &&
358*437bfbebSnyanmisaka prep->color != MPP_FRAME_SPC_UNSPECIFIED)) {
359*437bfbebSnyanmisaka sps->vui.m_videoSignalTypePresentFlag = 1;
360*437bfbebSnyanmisaka sps->vui.m_colourDescriptionPresentFlag = 1;
361*437bfbebSnyanmisaka sps->vui.m_colourPrimaries = prep->colorprim;
362*437bfbebSnyanmisaka sps->vui.m_transferCharacteristics = prep->colortrc;
363*437bfbebSnyanmisaka sps->vui.m_matrixCoefficients = prep->color;
364*437bfbebSnyanmisaka }
365*437bfbebSnyanmisaka
366*437bfbebSnyanmisaka sps->vui.m_chromaLocInfoPresentFlag = 0;
367*437bfbebSnyanmisaka sps->vui.m_chromaSampleLocTypeTopField = 0;
368*437bfbebSnyanmisaka sps->vui.m_chromaSampleLocTypeBottomField = 0;
369*437bfbebSnyanmisaka sps->vui.m_neutralChromaIndicationFlag = 0;
370*437bfbebSnyanmisaka sps->vui.m_fieldSeqFlag = 0;
371*437bfbebSnyanmisaka sps->vui.m_frameFieldInfoPresentFlag = 0;
372*437bfbebSnyanmisaka sps->vui.m_hrdParametersPresentFlag = 0;
373*437bfbebSnyanmisaka sps->vui.m_bitstreamRestrictionFlag = 0;
374*437bfbebSnyanmisaka sps->vui.m_tilesFixedStructureFlag = 0;
375*437bfbebSnyanmisaka sps->vui.m_motionVectorsOverPicBoundariesFlag = 1;
376*437bfbebSnyanmisaka sps->vui.m_restrictedRefPicListsFlag = 1;
377*437bfbebSnyanmisaka sps->vui.m_minSpatialSegmentationIdc = 0;
378*437bfbebSnyanmisaka sps->vui.m_maxBytesPerPicDenom = 2;
379*437bfbebSnyanmisaka sps->vui.m_maxBitsPerMinCuDenom = 1;
380*437bfbebSnyanmisaka sps->vui.m_log2MaxMvLengthHorizontal = 15;
381*437bfbebSnyanmisaka sps->vui.m_log2MaxMvLengthVertical = 15;
382*437bfbebSnyanmisaka if (vui->vui_aspect_ratio) {
383*437bfbebSnyanmisaka sps->vui.m_aspectRatioInfoPresentFlag = !!vui->vui_aspect_ratio;
384*437bfbebSnyanmisaka sps->vui.m_aspectRatioIdc = vui->vui_aspect_ratio;
385*437bfbebSnyanmisaka }
386*437bfbebSnyanmisaka sps->vui.m_timingInfo.m_timingInfoPresentFlag = 1;
387*437bfbebSnyanmisaka sps->vui.m_timingInfo.m_numUnitsInTick = i_timebase_num;
388*437bfbebSnyanmisaka sps->vui.m_timingInfo.m_timeScale = i_timebase_den;
389*437bfbebSnyanmisaka }
390*437bfbebSnyanmisaka
391*437bfbebSnyanmisaka
392*437bfbebSnyanmisaka
393*437bfbebSnyanmisaka for (i = 0; i < MAX_SUB_LAYERS; i++) {
394*437bfbebSnyanmisaka sps->m_maxLatencyIncrease[i] = 0;
395*437bfbebSnyanmisaka }
396*437bfbebSnyanmisaka // sps->m_scalingList = NULL;
397*437bfbebSnyanmisaka memset(sps->m_ltRefPicPocLsbSps, 0, sizeof(sps->m_ltRefPicPocLsbSps));
398*437bfbebSnyanmisaka memset(sps->m_usedByCurrPicLtSPSFlag, 0, sizeof(sps->m_usedByCurrPicLtSPSFlag));
399*437bfbebSnyanmisaka return 0;
400*437bfbebSnyanmisaka }
401*437bfbebSnyanmisaka
h265e_set_pps(H265eCtx * ctx,H265ePps * pps,H265eSps * sps)402*437bfbebSnyanmisaka MPP_RET h265e_set_pps(H265eCtx *ctx, H265ePps *pps, H265eSps *sps)
403*437bfbebSnyanmisaka {
404*437bfbebSnyanmisaka MppEncH265Cfg *codec = &ctx->cfg->h265;
405*437bfbebSnyanmisaka
406*437bfbebSnyanmisaka pps->m_bConstrainedIntraPred = codec->const_intra_pred;
407*437bfbebSnyanmisaka pps->m_PPSId = 0;
408*437bfbebSnyanmisaka pps->m_SPSId = 0;
409*437bfbebSnyanmisaka pps->m_picInitQPMinus26 = 0;
410*437bfbebSnyanmisaka pps->m_useDQP = 1;
411*437bfbebSnyanmisaka pps->m_maxCuDQPDepth = codec->trans_cfg.diff_cu_qp_delta_depth;
412*437bfbebSnyanmisaka pps->m_minCuDQPSize = (sps->m_maxCUSize >> pps->m_maxCuDQPDepth);
413*437bfbebSnyanmisaka
414*437bfbebSnyanmisaka pps->m_sps = sps;
415*437bfbebSnyanmisaka pps->m_bSliceChromaQpFlag = 0;
416*437bfbebSnyanmisaka pps->m_chromaCbQpOffset = codec->trans_cfg.cb_qp_offset;
417*437bfbebSnyanmisaka /* rkvenc hw only support one color qp offset. Set all offset to cb offset*/
418*437bfbebSnyanmisaka pps->m_chromaCrQpOffset = codec->trans_cfg.cb_qp_offset;
419*437bfbebSnyanmisaka
420*437bfbebSnyanmisaka pps->m_entropyCodingSyncEnabledFlag = 0;
421*437bfbebSnyanmisaka pps->m_bUseWeightPred = 0;
422*437bfbebSnyanmisaka pps->m_useWeightedBiPred = 0;
423*437bfbebSnyanmisaka pps->m_outputFlagPresentFlag = 0;
424*437bfbebSnyanmisaka pps->m_signHideFlag = 0;
425*437bfbebSnyanmisaka pps->m_picInitQPMinus26 = codec->intra_qp - 26;
426*437bfbebSnyanmisaka pps->m_LFCrossSliceBoundaryFlag = codec->lpf_acs_sli_en;
427*437bfbebSnyanmisaka pps->m_deblockingFilterControlPresentFlag = !codec->dblk_cfg.slice_deblocking_filter_disabled_flag;
428*437bfbebSnyanmisaka if (pps->m_deblockingFilterControlPresentFlag) {
429*437bfbebSnyanmisaka pps->m_deblockingFilterOverrideEnabledFlag = 0;
430*437bfbebSnyanmisaka pps->m_picDisableDeblockingFilterFlag = 0;
431*437bfbebSnyanmisaka if (!pps->m_picDisableDeblockingFilterFlag) {
432*437bfbebSnyanmisaka pps->m_deblockingFilterBetaOffsetDiv2 = codec->dblk_cfg.slice_beta_offset_div2;
433*437bfbebSnyanmisaka pps->m_deblockingFilterTcOffsetDiv2 = codec->dblk_cfg.slice_tc_offset_div2;
434*437bfbebSnyanmisaka }
435*437bfbebSnyanmisaka } else {
436*437bfbebSnyanmisaka pps->m_deblockingFilterOverrideEnabledFlag = 0;
437*437bfbebSnyanmisaka pps->m_picDisableDeblockingFilterFlag = 1;
438*437bfbebSnyanmisaka pps->m_deblockingFilterBetaOffsetDiv2 = 0;
439*437bfbebSnyanmisaka pps->m_deblockingFilterTcOffsetDiv2 = 0;
440*437bfbebSnyanmisaka }
441*437bfbebSnyanmisaka
442*437bfbebSnyanmisaka pps->m_listsModificationPresentFlag = 1;
443*437bfbebSnyanmisaka pps->m_log2ParallelMergeLevelMinus2 = 0;
444*437bfbebSnyanmisaka pps->m_numRefIdxL0DefaultActive = 1;
445*437bfbebSnyanmisaka pps->m_numRefIdxL1DefaultActive = 1;
446*437bfbebSnyanmisaka pps->m_transquantBypassEnableFlag = codec->trans_cfg.transquant_bypass_enabled_flag;
447*437bfbebSnyanmisaka pps->m_useTransformSkip = codec->trans_cfg.transform_skip_enabled_flag;
448*437bfbebSnyanmisaka
449*437bfbebSnyanmisaka pps->m_entropyCodingSyncEnabledFlag = 0;
450*437bfbebSnyanmisaka pps->m_signHideFlag = 0;
451*437bfbebSnyanmisaka pps->m_cabacInitPresentFlag = codec->entropy_cfg.cabac_init_flag;
452*437bfbebSnyanmisaka pps->m_encCABACTableIdx = I_SLICE;
453*437bfbebSnyanmisaka pps->m_sliceHeaderExtensionPresentFlag = 0;
454*437bfbebSnyanmisaka pps->m_numExtraSliceHeaderBits = 0;
455*437bfbebSnyanmisaka pps->m_tiles_enabled_flag = 0;
456*437bfbebSnyanmisaka pps->m_bTileUniformSpacing = 0;
457*437bfbebSnyanmisaka pps->m_nNumTileRowsMinus1 = 0;
458*437bfbebSnyanmisaka pps->m_nNumTileColumnsMinus1 = 0;
459*437bfbebSnyanmisaka pps->m_loopFilterAcrossTilesEnabledFlag = !codec->lpf_acs_tile_disable;
460*437bfbebSnyanmisaka {
461*437bfbebSnyanmisaka RockchipSocType soc_type = mpp_get_soc_type();
462*437bfbebSnyanmisaka RK_S32 index;
463*437bfbebSnyanmisaka RK_S32 mb_w = (sps->m_picWidthInLumaSamples + sps->m_maxCUSize - 1) / sps->m_maxCUSize;
464*437bfbebSnyanmisaka RK_S32 mb_h = (sps->m_picHeightInLumaSamples + sps->m_maxCUSize - 1) / sps->m_maxCUSize;
465*437bfbebSnyanmisaka RK_S32 tile_width;
466*437bfbebSnyanmisaka
467*437bfbebSnyanmisaka /* check tile support on rk3566 and rk3568 */
468*437bfbebSnyanmisaka if (soc_type == ROCKCHIP_SOC_RK3566 || soc_type == ROCKCHIP_SOC_RK3568) {
469*437bfbebSnyanmisaka pps->m_nNumTileColumnsMinus1 = (sps->m_picWidthInLumaSamples - 1) / 1920 ;
470*437bfbebSnyanmisaka } else if (soc_type == ROCKCHIP_SOC_RK3588) {
471*437bfbebSnyanmisaka if (sps->m_picWidthInLumaSamples > 8192) {
472*437bfbebSnyanmisaka /* 4 tile for over 8k encoding */
473*437bfbebSnyanmisaka pps->m_nNumTileColumnsMinus1 = 3;
474*437bfbebSnyanmisaka } else if (sps->m_picWidthInLumaSamples > 4096) {
475*437bfbebSnyanmisaka /* 2 tile for 4k ~ 8k encoding */
476*437bfbebSnyanmisaka pps->m_nNumTileColumnsMinus1 = 1;
477*437bfbebSnyanmisaka } else {
478*437bfbebSnyanmisaka /* 1 tile for less 4k encoding and use 2 tile on auto tile enabled */
479*437bfbebSnyanmisaka pps->m_nNumTileColumnsMinus1 = codec->auto_tile ? 1 : 0;
480*437bfbebSnyanmisaka }
481*437bfbebSnyanmisaka }
482*437bfbebSnyanmisaka if (pps->m_nNumTileColumnsMinus1) {
483*437bfbebSnyanmisaka pps->m_tiles_enabled_flag = 1;
484*437bfbebSnyanmisaka pps->m_bTileUniformSpacing = 1;
485*437bfbebSnyanmisaka pps->m_loopFilterAcrossTilesEnabledFlag = !codec->lpf_acs_tile_disable;
486*437bfbebSnyanmisaka
487*437bfbebSnyanmisaka /* calc width per tile */
488*437bfbebSnyanmisaka for (index = 0; index < pps->m_nNumTileColumnsMinus1; index++) {
489*437bfbebSnyanmisaka tile_width = (index + 1) * mb_w / (pps->m_nNumTileColumnsMinus1 + 1) -
490*437bfbebSnyanmisaka index * mb_w / (pps->m_nNumTileColumnsMinus1 + 1);
491*437bfbebSnyanmisaka pps->m_nTileColumnWidthArray[index] = tile_width;
492*437bfbebSnyanmisaka pps->m_nTileRowHeightArray[index] = mb_h;
493*437bfbebSnyanmisaka }
494*437bfbebSnyanmisaka tile_width = mb_w - index * mb_w / (pps->m_nNumTileColumnsMinus1 + 1);
495*437bfbebSnyanmisaka pps->m_nTileColumnWidthArray[index] = tile_width;
496*437bfbebSnyanmisaka pps->m_nTileRowHeightArray[index] = mb_h;
497*437bfbebSnyanmisaka }
498*437bfbebSnyanmisaka }
499*437bfbebSnyanmisaka
500*437bfbebSnyanmisaka return 0;
501*437bfbebSnyanmisaka }
502