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_cabac"
18*437bfbebSnyanmisaka
19*437bfbebSnyanmisaka #include "mpp_mem.h"
20*437bfbebSnyanmisaka #include "mpp_common.h"
21*437bfbebSnyanmisaka
22*437bfbebSnyanmisaka #include "h265e_slice.h"
23*437bfbebSnyanmisaka #include "h265e_codec.h"
24*437bfbebSnyanmisaka #include "h265e_enctropy.h"
25*437bfbebSnyanmisaka
26*437bfbebSnyanmisaka #ifdef __GNUC__ /* GCCs builtin atomics */
27*437bfbebSnyanmisaka #define CLZ32(id, x) id = (unsigned long)__builtin_clz(x) ^ 31
28*437bfbebSnyanmisaka #elif defined(_MSC_VER) /* Windows atomic intrinsics */
29*437bfbebSnyanmisaka #define CLZ32(id, x) _BitScanReverse(&id, x)
30*437bfbebSnyanmisaka #endif
31*437bfbebSnyanmisaka
32*437bfbebSnyanmisaka const RK_U8 g_lpsTable[64][4] = {
33*437bfbebSnyanmisaka { 128, 176, 208, 240 },
34*437bfbebSnyanmisaka { 128, 167, 197, 227 },
35*437bfbebSnyanmisaka { 128, 158, 187, 216 },
36*437bfbebSnyanmisaka { 123, 150, 178, 205 },
37*437bfbebSnyanmisaka { 116, 142, 169, 195 },
38*437bfbebSnyanmisaka { 111, 135, 160, 185 },
39*437bfbebSnyanmisaka { 105, 128, 152, 175 },
40*437bfbebSnyanmisaka { 100, 122, 144, 166 },
41*437bfbebSnyanmisaka { 95, 116, 137, 158 },
42*437bfbebSnyanmisaka { 90, 110, 130, 150 },
43*437bfbebSnyanmisaka { 85, 104, 123, 142 },
44*437bfbebSnyanmisaka { 81, 99, 117, 135 },
45*437bfbebSnyanmisaka { 77, 94, 111, 128 },
46*437bfbebSnyanmisaka { 73, 89, 105, 122 },
47*437bfbebSnyanmisaka { 69, 85, 100, 116 },
48*437bfbebSnyanmisaka { 66, 80, 95, 110 },
49*437bfbebSnyanmisaka { 62, 76, 90, 104 },
50*437bfbebSnyanmisaka { 59, 72, 86, 99 },
51*437bfbebSnyanmisaka { 56, 69, 81, 94 },
52*437bfbebSnyanmisaka { 53, 65, 77, 89 },
53*437bfbebSnyanmisaka { 51, 62, 73, 85 },
54*437bfbebSnyanmisaka { 48, 59, 69, 80 },
55*437bfbebSnyanmisaka { 46, 56, 66, 76 },
56*437bfbebSnyanmisaka { 43, 53, 63, 72 },
57*437bfbebSnyanmisaka { 41, 50, 59, 69 },
58*437bfbebSnyanmisaka { 39, 48, 56, 65 },
59*437bfbebSnyanmisaka { 37, 45, 54, 62 },
60*437bfbebSnyanmisaka { 35, 43, 51, 59 },
61*437bfbebSnyanmisaka { 33, 41, 48, 56 },
62*437bfbebSnyanmisaka { 32, 39, 46, 53 },
63*437bfbebSnyanmisaka { 30, 37, 43, 50 },
64*437bfbebSnyanmisaka { 29, 35, 41, 48 },
65*437bfbebSnyanmisaka { 27, 33, 39, 45 },
66*437bfbebSnyanmisaka { 26, 31, 37, 43 },
67*437bfbebSnyanmisaka { 24, 30, 35, 41 },
68*437bfbebSnyanmisaka { 23, 28, 33, 39 },
69*437bfbebSnyanmisaka { 22, 27, 32, 37 },
70*437bfbebSnyanmisaka { 21, 26, 30, 35 },
71*437bfbebSnyanmisaka { 20, 24, 29, 33 },
72*437bfbebSnyanmisaka { 19, 23, 27, 31 },
73*437bfbebSnyanmisaka { 18, 22, 26, 30 },
74*437bfbebSnyanmisaka { 17, 21, 25, 28 },
75*437bfbebSnyanmisaka { 16, 20, 23, 27 },
76*437bfbebSnyanmisaka { 15, 19, 22, 25 },
77*437bfbebSnyanmisaka { 14, 18, 21, 24 },
78*437bfbebSnyanmisaka { 14, 17, 20, 23 },
79*437bfbebSnyanmisaka { 13, 16, 19, 22 },
80*437bfbebSnyanmisaka { 12, 15, 18, 21 },
81*437bfbebSnyanmisaka { 12, 14, 17, 20 },
82*437bfbebSnyanmisaka { 11, 14, 16, 19 },
83*437bfbebSnyanmisaka { 11, 13, 15, 18 },
84*437bfbebSnyanmisaka { 10, 12, 15, 17 },
85*437bfbebSnyanmisaka { 10, 12, 14, 16 },
86*437bfbebSnyanmisaka { 9, 11, 13, 15 },
87*437bfbebSnyanmisaka { 9, 11, 12, 14 },
88*437bfbebSnyanmisaka { 8, 10, 12, 14 },
89*437bfbebSnyanmisaka { 8, 9, 11, 13 },
90*437bfbebSnyanmisaka { 7, 9, 11, 12 },
91*437bfbebSnyanmisaka { 7, 9, 10, 12 },
92*437bfbebSnyanmisaka { 7, 8, 10, 11 },
93*437bfbebSnyanmisaka { 6, 8, 9, 11 },
94*437bfbebSnyanmisaka { 6, 7, 9, 10 },
95*437bfbebSnyanmisaka { 6, 7, 8, 9 },
96*437bfbebSnyanmisaka { 2, 2, 2, 2 }
97*437bfbebSnyanmisaka };
98*437bfbebSnyanmisaka
99*437bfbebSnyanmisaka const RK_U8 g_nextState[128][2] = {
100*437bfbebSnyanmisaka { 2, 1 }, { 0, 3 }, { 4, 0 }, { 1, 5 }, { 6, 2 }, { 3, 7 }, { 8, 4 }, { 5, 9 },
101*437bfbebSnyanmisaka { 10, 4 }, { 5, 11 }, { 12, 8 }, { 9, 13 }, { 14, 8 }, { 9, 15 }, { 16, 10 }, { 11, 17 },
102*437bfbebSnyanmisaka { 18, 12 }, { 13, 19 }, { 20, 14 }, { 15, 21 }, { 22, 16 }, { 17, 23 }, { 24, 18 }, { 19, 25 },
103*437bfbebSnyanmisaka { 26, 18 }, { 19, 27 }, { 28, 22 }, { 23, 29 }, { 30, 22 }, { 23, 31 }, { 32, 24 }, { 25, 33 },
104*437bfbebSnyanmisaka { 34, 26 }, { 27, 35 }, { 36, 26 }, { 27, 37 }, { 38, 30 }, { 31, 39 }, { 40, 30 }, { 31, 41 },
105*437bfbebSnyanmisaka { 42, 32 }, { 33, 43 }, { 44, 32 }, { 33, 45 }, { 46, 36 }, { 37, 47 }, { 48, 36 }, { 37, 49 },
106*437bfbebSnyanmisaka { 50, 38 }, { 39, 51 }, { 52, 38 }, { 39, 53 }, { 54, 42 }, { 43, 55 }, { 56, 42 }, { 43, 57 },
107*437bfbebSnyanmisaka { 58, 44 }, { 45, 59 }, { 60, 44 }, { 45, 61 }, { 62, 46 }, { 47, 63 }, { 64, 48 }, { 49, 65 },
108*437bfbebSnyanmisaka { 66, 48 }, { 49, 67 }, { 68, 50 }, { 51, 69 }, { 70, 52 }, { 53, 71 }, { 72, 52 }, { 53, 73 },
109*437bfbebSnyanmisaka { 74, 54 }, { 55, 75 }, { 76, 54 }, { 55, 77 }, { 78, 56 }, { 57, 79 }, { 80, 58 }, { 59, 81 },
110*437bfbebSnyanmisaka { 82, 58 }, { 59, 83 }, { 84, 60 }, { 61, 85 }, { 86, 60 }, { 61, 87 }, { 88, 60 }, { 61, 89 },
111*437bfbebSnyanmisaka { 90, 62 }, { 63, 91 }, { 92, 64 }, { 65, 93 }, { 94, 64 }, { 65, 95 }, { 96, 66 }, { 67, 97 },
112*437bfbebSnyanmisaka { 98, 66 }, { 67, 99 }, { 100, 66 }, { 67, 101 }, { 102, 68 }, { 69, 103 }, { 104, 68 }, { 69, 105 },
113*437bfbebSnyanmisaka { 106, 70 }, { 71, 107 }, { 108, 70 }, { 71, 109 }, { 110, 70 }, { 71, 111 }, { 112, 72 }, { 73, 113 },
114*437bfbebSnyanmisaka { 114, 72 }, { 73, 115 }, { 116, 72 }, { 73, 117 }, { 118, 74 }, { 75, 119 }, { 120, 74 }, { 75, 121 },
115*437bfbebSnyanmisaka { 122, 74 }, { 75, 123 }, { 124, 76 }, { 77, 125 }, { 124, 76 }, { 77, 125 }, { 126, 126 }, { 127, 127 }
116*437bfbebSnyanmisaka };
117*437bfbebSnyanmisaka
sbacInit(RK_S32 qp,RK_S32 initValue)118*437bfbebSnyanmisaka RK_U8 sbacInit(RK_S32 qp, RK_S32 initValue)
119*437bfbebSnyanmisaka {
120*437bfbebSnyanmisaka RK_S32 slope = (initValue >> 4) * 5 - 45;
121*437bfbebSnyanmisaka RK_S32 offset = ((initValue & 15) << 3) - 16;
122*437bfbebSnyanmisaka RK_S32 initState = MPP_MIN(MPP_MAX(1, (((slope * qp) >> 4) + offset)), 126);
123*437bfbebSnyanmisaka RK_U32 mpState = (initState >= 64);
124*437bfbebSnyanmisaka RK_U8 m_state = ((mpState ? (initState - 64) : (63 - initState)) << 1) + mpState;
125*437bfbebSnyanmisaka
126*437bfbebSnyanmisaka return m_state;
127*437bfbebSnyanmisaka }
128*437bfbebSnyanmisaka
initBuffer(H265eContextModel_t * contextModel,SliceType sliceType,RK_U8 cabacIntFlag,RK_S32 qp,RK_U8 * ctxModel,RK_S32 size)129*437bfbebSnyanmisaka static void initBuffer(H265eContextModel_t* contextModel, SliceType sliceType, RK_U8 cabacIntFlag, RK_S32 qp, RK_U8* ctxModel, RK_S32 size)
130*437bfbebSnyanmisaka {
131*437bfbebSnyanmisaka RK_S8 initType = 0;
132*437bfbebSnyanmisaka RK_S32 n = 0;
133*437bfbebSnyanmisaka h265e_dbg_skip("sliceType = %d", sliceType);
134*437bfbebSnyanmisaka if (sliceType == I_SLICE)
135*437bfbebSnyanmisaka initType = 0;
136*437bfbebSnyanmisaka else if (sliceType == P_SLICE)
137*437bfbebSnyanmisaka initType = cabacIntFlag ? 2 : 1;
138*437bfbebSnyanmisaka else
139*437bfbebSnyanmisaka initType = cabacIntFlag ? 1 : 2;
140*437bfbebSnyanmisaka
141*437bfbebSnyanmisaka ctxModel += (2 - initType) * size;
142*437bfbebSnyanmisaka
143*437bfbebSnyanmisaka for (n = 0; n < size; n++) {
144*437bfbebSnyanmisaka contextModel[n].m_state = sbacInit(qp, ctxModel[n]);
145*437bfbebSnyanmisaka //mpp_log("contextModel[%d].m_state = %d", n, contextModel[n].m_state);
146*437bfbebSnyanmisaka contextModel[n].bBinsCoded = 0;
147*437bfbebSnyanmisaka }
148*437bfbebSnyanmisaka }
149*437bfbebSnyanmisaka
h265e_reset_enctropy(void * slice_ctx)150*437bfbebSnyanmisaka void h265e_reset_enctropy(void *slice_ctx)
151*437bfbebSnyanmisaka {
152*437bfbebSnyanmisaka H265eSlice *slice = (H265eSlice *)slice_ctx;
153*437bfbebSnyanmisaka RK_U8 cabacInitFlag = slice->m_cabacInitFlag;
154*437bfbebSnyanmisaka RK_S32 qp = slice->m_sliceQp;
155*437bfbebSnyanmisaka SliceType sliceType = slice->m_sliceType;
156*437bfbebSnyanmisaka
157*437bfbebSnyanmisaka h265e_dbg_func("enter\n");
158*437bfbebSnyanmisaka initBuffer(&slice->m_contextModels[OFF_SPLIT_FLAG_CTX], sliceType, cabacInitFlag, qp, (RK_U8*)INIT_SPLIT_FLAG, NUM_SPLIT_FLAG_CTX);
159*437bfbebSnyanmisaka initBuffer(&slice->m_contextModels[OFF_SKIP_FLAG_CTX], sliceType, cabacInitFlag, qp, (RK_U8*)INIT_SKIP_FLAG, NUM_SKIP_FLAG_CTX);
160*437bfbebSnyanmisaka initBuffer(&slice->m_contextModels[OFF_MERGE_FLAG_EXT_CTX], sliceType, cabacInitFlag, qp, (RK_U8*)INIT_MERGE_FLAG_EXT, NUM_MERGE_FLAG_EXT_CTX);
161*437bfbebSnyanmisaka initBuffer(&slice->m_contextModels[OFF_MERGE_IDX_EXT_CTX], sliceType, cabacInitFlag, qp, (uint8_t*)INIT_MERGE_IDX_EXT, NUM_MERGE_IDX_EXT_CTX);
162*437bfbebSnyanmisaka
163*437bfbebSnyanmisaka h265e_dbg_func("leave\n");
164*437bfbebSnyanmisaka }
165*437bfbebSnyanmisaka
h265e_cabac_resetBits(H265eCabacCtx * cabac_ctx)166*437bfbebSnyanmisaka void h265e_cabac_resetBits(H265eCabacCtx *cabac_ctx)
167*437bfbebSnyanmisaka {
168*437bfbebSnyanmisaka h265e_dbg_func("enter\n");
169*437bfbebSnyanmisaka
170*437bfbebSnyanmisaka cabac_ctx->m_low = 0;
171*437bfbebSnyanmisaka cabac_ctx->m_bitsLeft = -12;
172*437bfbebSnyanmisaka cabac_ctx->m_numBufferedBytes = 0;
173*437bfbebSnyanmisaka cabac_ctx->m_bufferedByte = 0xff;
174*437bfbebSnyanmisaka cabac_ctx->m_fracBits = 0;
175*437bfbebSnyanmisaka
176*437bfbebSnyanmisaka h265e_dbg_func("leave\n");
177*437bfbebSnyanmisaka }
178*437bfbebSnyanmisaka
h265e_cabac_start(H265eCabacCtx * cabac_ctx)179*437bfbebSnyanmisaka void h265e_cabac_start(H265eCabacCtx *cabac_ctx)
180*437bfbebSnyanmisaka {
181*437bfbebSnyanmisaka h265e_dbg_func("enter\n");
182*437bfbebSnyanmisaka cabac_ctx->m_low = 0;
183*437bfbebSnyanmisaka cabac_ctx->m_range = 510;
184*437bfbebSnyanmisaka cabac_ctx->m_bitsLeft = -12;
185*437bfbebSnyanmisaka cabac_ctx->m_numBufferedBytes = 0;
186*437bfbebSnyanmisaka cabac_ctx->m_bufferedByte = 0xff;
187*437bfbebSnyanmisaka }
188*437bfbebSnyanmisaka
h265e_cabac_init(H265eCabacCtx * cabac_ctx,MppWriteCtx * bitIf)189*437bfbebSnyanmisaka void h265e_cabac_init(H265eCabacCtx *cabac_ctx, MppWriteCtx * bitIf)
190*437bfbebSnyanmisaka {
191*437bfbebSnyanmisaka h265e_dbg_func("enter\n");
192*437bfbebSnyanmisaka cabac_ctx->m_bitIf = bitIf;
193*437bfbebSnyanmisaka h265e_cabac_start(cabac_ctx);
194*437bfbebSnyanmisaka h265e_dbg_func("leave\n");
195*437bfbebSnyanmisaka }
196*437bfbebSnyanmisaka
h265e_cabac_writeOut(H265eCabacCtx * cabac_ctx)197*437bfbebSnyanmisaka void h265e_cabac_writeOut(H265eCabacCtx *cabac_ctx)
198*437bfbebSnyanmisaka {
199*437bfbebSnyanmisaka MppWriteCtx* s = cabac_ctx->m_bitIf;
200*437bfbebSnyanmisaka RK_U32 leadByte = cabac_ctx->m_low >> (13 + cabac_ctx->m_bitsLeft);
201*437bfbebSnyanmisaka RK_U32 low_mask = (RK_U32)(~0) >> (11 + 8 - cabac_ctx->m_bitsLeft);
202*437bfbebSnyanmisaka h265e_dbg_func("enter\n");
203*437bfbebSnyanmisaka
204*437bfbebSnyanmisaka cabac_ctx->m_bitsLeft -= 8;
205*437bfbebSnyanmisaka cabac_ctx->m_low &= low_mask;
206*437bfbebSnyanmisaka
207*437bfbebSnyanmisaka if (leadByte == 0xff) {
208*437bfbebSnyanmisaka cabac_ctx->m_numBufferedBytes++;
209*437bfbebSnyanmisaka } else {
210*437bfbebSnyanmisaka RK_U32 numBufferedBytes = cabac_ctx->m_numBufferedBytes;
211*437bfbebSnyanmisaka if (numBufferedBytes > 0) {
212*437bfbebSnyanmisaka RK_U32 carry = leadByte >> 8;
213*437bfbebSnyanmisaka RK_U32 byteTowrite = cabac_ctx->m_bufferedByte + carry;
214*437bfbebSnyanmisaka mpp_writer_put_bits(s, byteTowrite, 8);
215*437bfbebSnyanmisaka h265e_dbg_skip("byteTowrite = %x", byteTowrite);
216*437bfbebSnyanmisaka byteTowrite = (0xff + carry) & 0xff;
217*437bfbebSnyanmisaka while (numBufferedBytes > 1) {
218*437bfbebSnyanmisaka h265e_dbg_skip("byteTowrite = %x", byteTowrite);
219*437bfbebSnyanmisaka mpp_writer_put_bits(s, byteTowrite, 8);
220*437bfbebSnyanmisaka numBufferedBytes--;
221*437bfbebSnyanmisaka }
222*437bfbebSnyanmisaka }
223*437bfbebSnyanmisaka cabac_ctx->m_numBufferedBytes = 1;
224*437bfbebSnyanmisaka cabac_ctx->m_bufferedByte = (uint8_t)leadByte;
225*437bfbebSnyanmisaka }
226*437bfbebSnyanmisaka
227*437bfbebSnyanmisaka h265e_dbg_func("leave\n");
228*437bfbebSnyanmisaka }
229*437bfbebSnyanmisaka
230*437bfbebSnyanmisaka /**
231*437bfbebSnyanmisaka * \brief Encode bin
232*437bfbebSnyanmisaka *
233*437bfbebSnyanmisaka * \param binValue bin value
234*437bfbebSnyanmisaka * \param rcCtxModel context model
235*437bfbebSnyanmisaka */
h265e_cabac_encodeBin(H265eCabacCtx * cabac_ctx,H265eContextModel_t * ctxModel,RK_U32 binValue)236*437bfbebSnyanmisaka void h265e_cabac_encodeBin(H265eCabacCtx *cabac_ctx, H265eContextModel_t *ctxModel, RK_U32 binValue)
237*437bfbebSnyanmisaka {
238*437bfbebSnyanmisaka RK_U32 mstate = ctxModel->m_state;
239*437bfbebSnyanmisaka
240*437bfbebSnyanmisaka h265e_dbg_func("enter\n");
241*437bfbebSnyanmisaka
242*437bfbebSnyanmisaka // mpp_log("before m_low %d ctxModel.m_state %d m_range %d \n", cabac_ctx->m_low, ctxModel->m_state,cabac_ctx->m_range);
243*437bfbebSnyanmisaka ctxModel->m_state = sbacNext(mstate, binValue);
244*437bfbebSnyanmisaka
245*437bfbebSnyanmisaka ctxModel->bBinsCoded = 1;
246*437bfbebSnyanmisaka RK_U32 range = cabac_ctx->m_range;
247*437bfbebSnyanmisaka RK_U32 state = sbacGetState(mstate);
248*437bfbebSnyanmisaka RK_U32 lps = g_lpsTable[state][((uint8_t)range >> 6)];
249*437bfbebSnyanmisaka range -= lps;
250*437bfbebSnyanmisaka
251*437bfbebSnyanmisaka // mpp_log("ctxModel.m_state %d binValue %d \n", ctxModel->m_state, binValue);
252*437bfbebSnyanmisaka // assert(lps >= 2);
253*437bfbebSnyanmisaka
254*437bfbebSnyanmisaka RK_S32 numBits = (RK_U32)(range - 256) >> 31;
255*437bfbebSnyanmisaka RK_U32 low = cabac_ctx->m_low;
256*437bfbebSnyanmisaka
257*437bfbebSnyanmisaka // NOTE: MPS must be LOWEST bit in mstate
258*437bfbebSnyanmisaka // assert(((binValue ^ mstate) & 1) == (binValue != sbacGetMps(mstate)));
259*437bfbebSnyanmisaka if ((binValue ^ mstate) & 1) {
260*437bfbebSnyanmisaka unsigned long idx;
261*437bfbebSnyanmisaka CLZ32(idx, lps);
262*437bfbebSnyanmisaka // assert(state != 63 || idx == 1);
263*437bfbebSnyanmisaka
264*437bfbebSnyanmisaka numBits = 8 - idx;
265*437bfbebSnyanmisaka if (state >= 63)
266*437bfbebSnyanmisaka numBits = 6;
267*437bfbebSnyanmisaka // assert(numBits <= 6);
268*437bfbebSnyanmisaka
269*437bfbebSnyanmisaka low += range;
270*437bfbebSnyanmisaka range = lps;
271*437bfbebSnyanmisaka }
272*437bfbebSnyanmisaka cabac_ctx->m_low = (low << numBits);
273*437bfbebSnyanmisaka cabac_ctx->m_range = (range << numBits);
274*437bfbebSnyanmisaka cabac_ctx->m_bitsLeft += numBits;
275*437bfbebSnyanmisaka
276*437bfbebSnyanmisaka // mpp_log("after m_low %d ctxModel.m_state %d m_range %d \n", cabac_ctx->m_low, ctxModel->m_state,cabac_ctx->m_range);
277*437bfbebSnyanmisaka if (cabac_ctx->m_bitsLeft >= 0) {
278*437bfbebSnyanmisaka h265e_cabac_writeOut(cabac_ctx);
279*437bfbebSnyanmisaka }
280*437bfbebSnyanmisaka
281*437bfbebSnyanmisaka h265e_dbg_func("leave\n");
282*437bfbebSnyanmisaka }
283*437bfbebSnyanmisaka
h265e_cabac_encodeBinTrm(H265eCabacCtx * cabac_ctx,RK_U32 binValue)284*437bfbebSnyanmisaka void h265e_cabac_encodeBinTrm(H265eCabacCtx *cabac_ctx, RK_U32 binValue)
285*437bfbebSnyanmisaka {
286*437bfbebSnyanmisaka h265e_dbg_func("enter\n");
287*437bfbebSnyanmisaka
288*437bfbebSnyanmisaka // mpp_log("encodeBinTrm m_range %d binValue %d \n", cabac_ctx->m_range, binValue);
289*437bfbebSnyanmisaka cabac_ctx->m_range -= 2;
290*437bfbebSnyanmisaka if (binValue) {
291*437bfbebSnyanmisaka cabac_ctx->m_low += cabac_ctx->m_range;
292*437bfbebSnyanmisaka cabac_ctx->m_low <<= 7;
293*437bfbebSnyanmisaka cabac_ctx->m_range = 2 << 7;
294*437bfbebSnyanmisaka cabac_ctx->m_bitsLeft += 7;
295*437bfbebSnyanmisaka } else if (cabac_ctx->m_range >= 256) {
296*437bfbebSnyanmisaka return;
297*437bfbebSnyanmisaka } else {
298*437bfbebSnyanmisaka cabac_ctx->m_low <<= 1;
299*437bfbebSnyanmisaka cabac_ctx->m_range <<= 1;
300*437bfbebSnyanmisaka cabac_ctx->m_bitsLeft++;
301*437bfbebSnyanmisaka }
302*437bfbebSnyanmisaka
303*437bfbebSnyanmisaka if (cabac_ctx->m_bitsLeft >= 0) {
304*437bfbebSnyanmisaka h265e_cabac_writeOut(cabac_ctx);
305*437bfbebSnyanmisaka }
306*437bfbebSnyanmisaka
307*437bfbebSnyanmisaka h265e_dbg_func("leave\n");
308*437bfbebSnyanmisaka }
309*437bfbebSnyanmisaka
h265e_cabac_finish(H265eCabacCtx * cabac_ctx)310*437bfbebSnyanmisaka void h265e_cabac_finish(H265eCabacCtx *cabac_ctx)
311*437bfbebSnyanmisaka {
312*437bfbebSnyanmisaka MppWriteCtx* s = cabac_ctx->m_bitIf;
313*437bfbebSnyanmisaka
314*437bfbebSnyanmisaka h265e_dbg_func("enter\n");
315*437bfbebSnyanmisaka
316*437bfbebSnyanmisaka if (cabac_ctx->m_low >> (21 + cabac_ctx->m_bitsLeft)) {
317*437bfbebSnyanmisaka
318*437bfbebSnyanmisaka mpp_writer_put_bits(s, cabac_ctx->m_bufferedByte + 1, 8);
319*437bfbebSnyanmisaka while (cabac_ctx->m_numBufferedBytes > 1) {
320*437bfbebSnyanmisaka mpp_writer_put_bits(s, 0, 8);
321*437bfbebSnyanmisaka cabac_ctx->m_numBufferedBytes--;
322*437bfbebSnyanmisaka }
323*437bfbebSnyanmisaka
324*437bfbebSnyanmisaka cabac_ctx->m_low -= 1 << (21 + cabac_ctx->m_bitsLeft);
325*437bfbebSnyanmisaka } else {
326*437bfbebSnyanmisaka if (cabac_ctx->m_numBufferedBytes > 0) {
327*437bfbebSnyanmisaka
328*437bfbebSnyanmisaka mpp_writer_put_bits(s, cabac_ctx->m_bufferedByte , 8);
329*437bfbebSnyanmisaka }
330*437bfbebSnyanmisaka while (cabac_ctx->m_numBufferedBytes > 1) {
331*437bfbebSnyanmisaka mpp_writer_put_bits(s, 0xff , 8);
332*437bfbebSnyanmisaka cabac_ctx->m_numBufferedBytes--;
333*437bfbebSnyanmisaka }
334*437bfbebSnyanmisaka }
335*437bfbebSnyanmisaka mpp_writer_put_bits(s, cabac_ctx->m_low >> 8 , 13 + cabac_ctx->m_bitsLeft);
336*437bfbebSnyanmisaka
337*437bfbebSnyanmisaka h265e_dbg_func("leave\n");
338*437bfbebSnyanmisaka }
339*437bfbebSnyanmisaka
h265e_cabac_flush(H265eCabacCtx * cabac_ctx)340*437bfbebSnyanmisaka void h265e_cabac_flush(H265eCabacCtx *cabac_ctx)
341*437bfbebSnyanmisaka {
342*437bfbebSnyanmisaka MppWriteCtx* s = cabac_ctx->m_bitIf;
343*437bfbebSnyanmisaka
344*437bfbebSnyanmisaka h265e_dbg_func("enter\n");
345*437bfbebSnyanmisaka
346*437bfbebSnyanmisaka h265e_cabac_encodeBinTrm(cabac_ctx, 1);
347*437bfbebSnyanmisaka h265e_cabac_finish(cabac_ctx);
348*437bfbebSnyanmisaka mpp_writer_put_bits(s, 1, 1);
349*437bfbebSnyanmisaka mpp_writer_align_zero(s);
350*437bfbebSnyanmisaka h265e_cabac_start(cabac_ctx);
351*437bfbebSnyanmisaka
352*437bfbebSnyanmisaka h265e_dbg_func("leave\n");
353*437bfbebSnyanmisaka }
354