xref: /rockchip-linux_mpp/mpp/base/mpp_bitread.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka *
3*437bfbebSnyanmisaka * Copyright 2015 Rockchip Electronics Co. LTD
4*437bfbebSnyanmisaka *
5*437bfbebSnyanmisaka * Licensed under the Apache License, Version 2.0 (the "License");
6*437bfbebSnyanmisaka * you may not use this file except in compliance with the License.
7*437bfbebSnyanmisaka * You may obtain a copy of the License at
8*437bfbebSnyanmisaka *
9*437bfbebSnyanmisaka *      http://www.apache.org/licenses/LICENSE-2.0
10*437bfbebSnyanmisaka *
11*437bfbebSnyanmisaka * Unless required by applicable law or agreed to in writing, software
12*437bfbebSnyanmisaka * distributed under the License is distributed on an "AS IS" BASIS,
13*437bfbebSnyanmisaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*437bfbebSnyanmisaka * See the License for the specific language governing permissions and
15*437bfbebSnyanmisaka * limitations under the License.
16*437bfbebSnyanmisaka */
17*437bfbebSnyanmisaka 
18*437bfbebSnyanmisaka #include <stdlib.h>
19*437bfbebSnyanmisaka #include <string.h>
20*437bfbebSnyanmisaka #include "rk_type.h"
21*437bfbebSnyanmisaka #include "mpp_mem.h"
22*437bfbebSnyanmisaka #include "mpp_bitread.h"
23*437bfbebSnyanmisaka 
update_curbyte_default(BitReadCtx_t * bitctx)24*437bfbebSnyanmisaka static MPP_RET update_curbyte_default(BitReadCtx_t *bitctx)
25*437bfbebSnyanmisaka {
26*437bfbebSnyanmisaka     if (bitctx->bytes_left_ < 1)
27*437bfbebSnyanmisaka         return  MPP_ERR_READ_BIT;
28*437bfbebSnyanmisaka 
29*437bfbebSnyanmisaka     // Load a new byte and advance pointers.
30*437bfbebSnyanmisaka     bitctx->curr_byte_ = *bitctx->data_++ & 0xff;
31*437bfbebSnyanmisaka     --bitctx->bytes_left_;
32*437bfbebSnyanmisaka     bitctx->num_remaining_bits_in_curr_byte_ = 8;
33*437bfbebSnyanmisaka     bitctx->prev_two_bytes_ = (bitctx->prev_two_bytes_ << 8) | bitctx->curr_byte_;
34*437bfbebSnyanmisaka 
35*437bfbebSnyanmisaka     return MPP_OK;
36*437bfbebSnyanmisaka }
37*437bfbebSnyanmisaka 
update_curbyte_h264(BitReadCtx_t * bitctx)38*437bfbebSnyanmisaka static MPP_RET update_curbyte_h264(BitReadCtx_t *bitctx)
39*437bfbebSnyanmisaka {
40*437bfbebSnyanmisaka     if (bitctx->bytes_left_ < 1)
41*437bfbebSnyanmisaka         return  MPP_ERR_READ_BIT;
42*437bfbebSnyanmisaka 
43*437bfbebSnyanmisaka     // Emulation prevention three-byte detection.
44*437bfbebSnyanmisaka     // If a sequence of 0x000003 is found, skip (ignore) the last byte (0x03).
45*437bfbebSnyanmisaka     if ((*bitctx->data_ == 0x03)
46*437bfbebSnyanmisaka         && ((bitctx->prev_two_bytes_ & 0xffff) == 0)) {
47*437bfbebSnyanmisaka         // Detected 0x000003, skip last byte.
48*437bfbebSnyanmisaka         ++bitctx->data_;
49*437bfbebSnyanmisaka         --bitctx->bytes_left_;
50*437bfbebSnyanmisaka         ++bitctx->emulation_prevention_bytes_;
51*437bfbebSnyanmisaka         bitctx->used_bits += 8;
52*437bfbebSnyanmisaka         // Need another full three bytes before we can detect the sequence again.
53*437bfbebSnyanmisaka         bitctx->prev_two_bytes_ = 0xffff;
54*437bfbebSnyanmisaka         if (bitctx->bytes_left_ < 1)
55*437bfbebSnyanmisaka             return  MPP_ERR_READ_BIT;
56*437bfbebSnyanmisaka     }
57*437bfbebSnyanmisaka     // Load a new byte and advance pointers.
58*437bfbebSnyanmisaka     bitctx->curr_byte_ = *bitctx->data_++ & 0xff;
59*437bfbebSnyanmisaka     --bitctx->bytes_left_;
60*437bfbebSnyanmisaka     bitctx->num_remaining_bits_in_curr_byte_ = 8;
61*437bfbebSnyanmisaka     bitctx->prev_two_bytes_ = (bitctx->prev_two_bytes_ << 8) | bitctx->curr_byte_;
62*437bfbebSnyanmisaka 
63*437bfbebSnyanmisaka     return MPP_OK;
64*437bfbebSnyanmisaka }
65*437bfbebSnyanmisaka 
update_curbyte_h2645_sei(BitReadCtx_t * bitctx)66*437bfbebSnyanmisaka static MPP_RET update_curbyte_h2645_sei(BitReadCtx_t *bitctx)
67*437bfbebSnyanmisaka {
68*437bfbebSnyanmisaka     if (bitctx->bytes_left_ < 1)
69*437bfbebSnyanmisaka         return  MPP_ERR_READ_BIT;
70*437bfbebSnyanmisaka 
71*437bfbebSnyanmisaka     // Emulation prevention three-byte detection.
72*437bfbebSnyanmisaka     // If a sequence of 0x000003 is found, skip (ignore) the last byte (0x03).
73*437bfbebSnyanmisaka     if ((*bitctx->data_ == 0x03)
74*437bfbebSnyanmisaka         && ((bitctx->prev_two_bytes_ & 0xffff) == 0)) {
75*437bfbebSnyanmisaka         // Detected 0x000003, skip last byte.
76*437bfbebSnyanmisaka         ++bitctx->data_;
77*437bfbebSnyanmisaka         // Need another full three bytes before we can detect the sequence again.
78*437bfbebSnyanmisaka         bitctx->prev_two_bytes_ = 0xffff;
79*437bfbebSnyanmisaka     }
80*437bfbebSnyanmisaka     // Load a new byte and advance pointers.
81*437bfbebSnyanmisaka     bitctx->curr_byte_ = *bitctx->data_++ & 0xff;
82*437bfbebSnyanmisaka     --bitctx->bytes_left_;
83*437bfbebSnyanmisaka     bitctx->num_remaining_bits_in_curr_byte_ = 8;
84*437bfbebSnyanmisaka     bitctx->prev_two_bytes_ = (bitctx->prev_two_bytes_ << 8) | bitctx->curr_byte_;
85*437bfbebSnyanmisaka 
86*437bfbebSnyanmisaka     return MPP_OK;
87*437bfbebSnyanmisaka }
88*437bfbebSnyanmisaka 
update_curbyte_avs2(BitReadCtx_t * bitctx)89*437bfbebSnyanmisaka static MPP_RET update_curbyte_avs2(BitReadCtx_t *bitctx)
90*437bfbebSnyanmisaka {
91*437bfbebSnyanmisaka     if (bitctx->bytes_left_ < 1)
92*437bfbebSnyanmisaka         return MPP_ERR_READ_BIT;
93*437bfbebSnyanmisaka 
94*437bfbebSnyanmisaka     if (*bitctx->data_ == 0x02 && ((bitctx->prev_two_bytes_ & 0xffff) == 0)) {
95*437bfbebSnyanmisaka         // Detected 0x000002, get 2 bits from next byte
96*437bfbebSnyanmisaka         bitctx->curr_byte_ = 0;
97*437bfbebSnyanmisaka         bitctx->num_remaining_bits_in_curr_byte_ = 6;
98*437bfbebSnyanmisaka         ++bitctx->data_;
99*437bfbebSnyanmisaka     } else {
100*437bfbebSnyanmisaka         bitctx->curr_byte_ = *bitctx->data_++ & 0xff;
101*437bfbebSnyanmisaka         bitctx->num_remaining_bits_in_curr_byte_ = 8;
102*437bfbebSnyanmisaka     }
103*437bfbebSnyanmisaka     // Load a new byte and advance pointers.
104*437bfbebSnyanmisaka     bitctx->prev_two_bytes_ = (bitctx->prev_two_bytes_ << 8) | bitctx->curr_byte_;
105*437bfbebSnyanmisaka     --bitctx->bytes_left_;
106*437bfbebSnyanmisaka 
107*437bfbebSnyanmisaka     return MPP_OK;
108*437bfbebSnyanmisaka }
109*437bfbebSnyanmisaka 
110*437bfbebSnyanmisaka /*!
111*437bfbebSnyanmisaka ***********************************************************************
112*437bfbebSnyanmisaka * \brief
113*437bfbebSnyanmisaka *   Read |num_bits| (1 to 31 inclusive) from the stream and return them
114*437bfbebSnyanmisaka *   in |out|, with first bit in the stream as MSB in |out| at position
115*437bfbebSnyanmisaka *   (|num_bits| - 1)
116*437bfbebSnyanmisaka ***********************************************************************
117*437bfbebSnyanmisaka */
mpp_read_bits(BitReadCtx_t * bitctx,RK_S32 num_bits,RK_S32 * out)118*437bfbebSnyanmisaka MPP_RET mpp_read_bits(BitReadCtx_t *bitctx, RK_S32 num_bits, RK_S32 *out)
119*437bfbebSnyanmisaka {
120*437bfbebSnyanmisaka     RK_S32 bits_left = num_bits;
121*437bfbebSnyanmisaka     *out = 0;
122*437bfbebSnyanmisaka     if (num_bits > 31) {
123*437bfbebSnyanmisaka         return  MPP_ERR_READ_BIT;
124*437bfbebSnyanmisaka     }
125*437bfbebSnyanmisaka     while (bitctx->num_remaining_bits_in_curr_byte_ < bits_left) {
126*437bfbebSnyanmisaka         // Take all that's left in current byte, shift to make space for the rest.
127*437bfbebSnyanmisaka         *out |= (bitctx->curr_byte_ << (bits_left - bitctx->num_remaining_bits_in_curr_byte_));
128*437bfbebSnyanmisaka         bits_left -= bitctx->num_remaining_bits_in_curr_byte_;
129*437bfbebSnyanmisaka         if (bitctx->update_curbyte(bitctx)) {
130*437bfbebSnyanmisaka             return  MPP_ERR_READ_BIT;
131*437bfbebSnyanmisaka         }
132*437bfbebSnyanmisaka     }
133*437bfbebSnyanmisaka     *out |= (bitctx->curr_byte_ >> (bitctx->num_remaining_bits_in_curr_byte_ - bits_left));
134*437bfbebSnyanmisaka     *out &= ((1 << num_bits) - 1);
135*437bfbebSnyanmisaka     bitctx->num_remaining_bits_in_curr_byte_ -= bits_left;
136*437bfbebSnyanmisaka     bitctx->used_bits += num_bits;
137*437bfbebSnyanmisaka 
138*437bfbebSnyanmisaka     return MPP_OK;
139*437bfbebSnyanmisaka }
140*437bfbebSnyanmisaka /*!
141*437bfbebSnyanmisaka ***********************************************************************
142*437bfbebSnyanmisaka * \brief
143*437bfbebSnyanmisaka *   read more than 32 bits data
144*437bfbebSnyanmisaka ***********************************************************************
145*437bfbebSnyanmisaka */
mpp_read_longbits(BitReadCtx_t * bitctx,RK_S32 num_bits,RK_U32 * out)146*437bfbebSnyanmisaka MPP_RET mpp_read_longbits(BitReadCtx_t *bitctx, RK_S32 num_bits, RK_U32 *out)
147*437bfbebSnyanmisaka {
148*437bfbebSnyanmisaka     RK_S32 val = 0, val1 = 0;
149*437bfbebSnyanmisaka 
150*437bfbebSnyanmisaka     if (num_bits < 32)
151*437bfbebSnyanmisaka         return mpp_read_bits(bitctx, num_bits, (RK_S32 *)out);
152*437bfbebSnyanmisaka 
153*437bfbebSnyanmisaka     if (mpp_read_bits(bitctx, 16, &val)) {
154*437bfbebSnyanmisaka         return  MPP_ERR_READ_BIT;
155*437bfbebSnyanmisaka     }
156*437bfbebSnyanmisaka     if (mpp_read_bits(bitctx, (num_bits - 16), &val1)) {
157*437bfbebSnyanmisaka         return  MPP_ERR_READ_BIT;
158*437bfbebSnyanmisaka     }
159*437bfbebSnyanmisaka 
160*437bfbebSnyanmisaka     *out = (RK_U32)((val << 16) | val1);
161*437bfbebSnyanmisaka 
162*437bfbebSnyanmisaka     return MPP_OK;
163*437bfbebSnyanmisaka }
164*437bfbebSnyanmisaka /*!
165*437bfbebSnyanmisaka ***********************************************************************
166*437bfbebSnyanmisaka * \brief
167*437bfbebSnyanmisaka *   skip bits (0 - 31)
168*437bfbebSnyanmisaka ***********************************************************************
169*437bfbebSnyanmisaka */
mpp_skip_bits(BitReadCtx_t * bitctx,RK_S32 num_bits)170*437bfbebSnyanmisaka MPP_RET mpp_skip_bits(BitReadCtx_t *bitctx, RK_S32 num_bits)
171*437bfbebSnyanmisaka {
172*437bfbebSnyanmisaka     RK_S32 bits_left = num_bits;
173*437bfbebSnyanmisaka 
174*437bfbebSnyanmisaka     while (bitctx->num_remaining_bits_in_curr_byte_ < bits_left) {
175*437bfbebSnyanmisaka         // Take all that's left in current byte, shift to make space for the rest.
176*437bfbebSnyanmisaka         bits_left -= bitctx->num_remaining_bits_in_curr_byte_;
177*437bfbebSnyanmisaka         if (bitctx->update_curbyte(bitctx)) {
178*437bfbebSnyanmisaka             return  MPP_ERR_READ_BIT;
179*437bfbebSnyanmisaka         }
180*437bfbebSnyanmisaka     }
181*437bfbebSnyanmisaka     bitctx->num_remaining_bits_in_curr_byte_ -= bits_left;
182*437bfbebSnyanmisaka     bitctx->used_bits += num_bits;
183*437bfbebSnyanmisaka 
184*437bfbebSnyanmisaka     return MPP_OK;
185*437bfbebSnyanmisaka }
186*437bfbebSnyanmisaka /*!
187*437bfbebSnyanmisaka ***********************************************************************
188*437bfbebSnyanmisaka * \brief
189*437bfbebSnyanmisaka *   skip bits long (0 - 32)
190*437bfbebSnyanmisaka ***********************************************************************
191*437bfbebSnyanmisaka */
mpp_skip_longbits(BitReadCtx_t * bitctx,RK_S32 num_bits)192*437bfbebSnyanmisaka MPP_RET mpp_skip_longbits(BitReadCtx_t *bitctx, RK_S32 num_bits)
193*437bfbebSnyanmisaka {
194*437bfbebSnyanmisaka     if (num_bits < 32)
195*437bfbebSnyanmisaka         return mpp_skip_bits(bitctx, num_bits);
196*437bfbebSnyanmisaka 
197*437bfbebSnyanmisaka     if (mpp_skip_bits(bitctx, 16)) {
198*437bfbebSnyanmisaka         return  MPP_ERR_READ_BIT;
199*437bfbebSnyanmisaka     }
200*437bfbebSnyanmisaka     if (mpp_skip_bits(bitctx, (num_bits - 16))) {
201*437bfbebSnyanmisaka         return  MPP_ERR_READ_BIT;
202*437bfbebSnyanmisaka     }
203*437bfbebSnyanmisaka     return MPP_OK;
204*437bfbebSnyanmisaka }
205*437bfbebSnyanmisaka /*!
206*437bfbebSnyanmisaka ***********************************************************************
207*437bfbebSnyanmisaka * \brief
208*437bfbebSnyanmisaka *   show bits (0 - 31)
209*437bfbebSnyanmisaka ***********************************************************************
210*437bfbebSnyanmisaka */
mpp_show_bits(BitReadCtx_t * bitctx,RK_S32 num_bits,RK_S32 * out)211*437bfbebSnyanmisaka MPP_RET mpp_show_bits(BitReadCtx_t *bitctx, RK_S32 num_bits, RK_S32 *out)
212*437bfbebSnyanmisaka {
213*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
214*437bfbebSnyanmisaka     BitReadCtx_t tmp_ctx = *bitctx;
215*437bfbebSnyanmisaka 
216*437bfbebSnyanmisaka     if (num_bits < 32)
217*437bfbebSnyanmisaka         ret = mpp_read_bits(&tmp_ctx, num_bits, out);
218*437bfbebSnyanmisaka     else
219*437bfbebSnyanmisaka         ret = mpp_read_longbits(&tmp_ctx, num_bits, (RK_U32 *)out);
220*437bfbebSnyanmisaka 
221*437bfbebSnyanmisaka     return ret;
222*437bfbebSnyanmisaka }
223*437bfbebSnyanmisaka /*!
224*437bfbebSnyanmisaka ***********************************************************************
225*437bfbebSnyanmisaka * \brief
226*437bfbebSnyanmisaka *   show long bits (0 - 32)
227*437bfbebSnyanmisaka ***********************************************************************
228*437bfbebSnyanmisaka */
mpp_show_longbits(BitReadCtx_t * bitctx,RK_S32 num_bits,RK_U32 * out)229*437bfbebSnyanmisaka MPP_RET mpp_show_longbits(BitReadCtx_t *bitctx, RK_S32 num_bits, RK_U32 *out)
230*437bfbebSnyanmisaka {
231*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
232*437bfbebSnyanmisaka     BitReadCtx_t tmp_ctx = *bitctx;
233*437bfbebSnyanmisaka 
234*437bfbebSnyanmisaka     ret = mpp_read_longbits(&tmp_ctx, num_bits, out);
235*437bfbebSnyanmisaka 
236*437bfbebSnyanmisaka     return ret;
237*437bfbebSnyanmisaka }
238*437bfbebSnyanmisaka /*!
239*437bfbebSnyanmisaka ***********************************************************************
240*437bfbebSnyanmisaka * \brief
241*437bfbebSnyanmisaka *   read unsigned data
242*437bfbebSnyanmisaka ***********************************************************************
243*437bfbebSnyanmisaka */
mpp_read_ue(BitReadCtx_t * bitctx,RK_U32 * val)244*437bfbebSnyanmisaka MPP_RET mpp_read_ue(BitReadCtx_t *bitctx, RK_U32 *val)
245*437bfbebSnyanmisaka {
246*437bfbebSnyanmisaka     RK_S32 num_bits = -1;
247*437bfbebSnyanmisaka     RK_S32 bit;
248*437bfbebSnyanmisaka     RK_S32 rest;
249*437bfbebSnyanmisaka     // Count the number of contiguous zero bits.
250*437bfbebSnyanmisaka     do {
251*437bfbebSnyanmisaka         if (mpp_read_bits(bitctx, 1, &bit)) {
252*437bfbebSnyanmisaka             return  MPP_ERR_READ_BIT;
253*437bfbebSnyanmisaka         }
254*437bfbebSnyanmisaka         num_bits++;
255*437bfbebSnyanmisaka     } while (bit == 0);
256*437bfbebSnyanmisaka     if (num_bits > 31) {
257*437bfbebSnyanmisaka         return  MPP_ERR_READ_BIT;
258*437bfbebSnyanmisaka     }
259*437bfbebSnyanmisaka     // Calculate exp-Golomb code value of size num_bits.
260*437bfbebSnyanmisaka     *val = (1 << num_bits) - 1;
261*437bfbebSnyanmisaka     if (num_bits > 0) {
262*437bfbebSnyanmisaka         if (mpp_read_bits(bitctx, num_bits, &rest)) {
263*437bfbebSnyanmisaka             return  MPP_ERR_READ_BIT;
264*437bfbebSnyanmisaka         }
265*437bfbebSnyanmisaka         *val += rest;
266*437bfbebSnyanmisaka     }
267*437bfbebSnyanmisaka 
268*437bfbebSnyanmisaka     return MPP_OK;
269*437bfbebSnyanmisaka }
270*437bfbebSnyanmisaka /*!
271*437bfbebSnyanmisaka ***********************************************************************
272*437bfbebSnyanmisaka * \brief
273*437bfbebSnyanmisaka *   read signed data
274*437bfbebSnyanmisaka ***********************************************************************
275*437bfbebSnyanmisaka */
mpp_read_se(BitReadCtx_t * bitctx,RK_S32 * val)276*437bfbebSnyanmisaka MPP_RET mpp_read_se(BitReadCtx_t *bitctx, RK_S32 *val)
277*437bfbebSnyanmisaka {
278*437bfbebSnyanmisaka     RK_U32 ue;
279*437bfbebSnyanmisaka 
280*437bfbebSnyanmisaka     if (mpp_read_ue(bitctx, &ue)) {
281*437bfbebSnyanmisaka         return  MPP_ERR_READ_BIT;
282*437bfbebSnyanmisaka     }
283*437bfbebSnyanmisaka     if (ue % 2 == 0) { // odd
284*437bfbebSnyanmisaka         *val = -(RK_S32)(ue >> 1);
285*437bfbebSnyanmisaka     } else {
286*437bfbebSnyanmisaka         *val = (RK_S32)((ue >> 1) + 1);
287*437bfbebSnyanmisaka     }
288*437bfbebSnyanmisaka     return MPP_OK;
289*437bfbebSnyanmisaka }
290*437bfbebSnyanmisaka 
291*437bfbebSnyanmisaka /*!
292*437bfbebSnyanmisaka ***********************************************************************
293*437bfbebSnyanmisaka * \brief
294*437bfbebSnyanmisaka *   check whether has more rbsp data
295*437bfbebSnyanmisaka ***********************************************************************
296*437bfbebSnyanmisaka */
mpp_has_more_rbsp_data(BitReadCtx_t * bitctx)297*437bfbebSnyanmisaka RK_U32 mpp_has_more_rbsp_data(BitReadCtx_t *bitctx)
298*437bfbebSnyanmisaka {
299*437bfbebSnyanmisaka     // remove tail byte which equal zero
300*437bfbebSnyanmisaka     while (bitctx->bytes_left_ &&
301*437bfbebSnyanmisaka            bitctx->data_[bitctx->bytes_left_ - 1] == 0)
302*437bfbebSnyanmisaka         bitctx->bytes_left_--;
303*437bfbebSnyanmisaka 
304*437bfbebSnyanmisaka     // Make sure we have more bits, if we are at 0 bits in current byte
305*437bfbebSnyanmisaka     // and updating current byte fails, we don't have more data anyway.
306*437bfbebSnyanmisaka     if (bitctx->num_remaining_bits_in_curr_byte_ == 0 && bitctx->update_curbyte(bitctx))
307*437bfbebSnyanmisaka         return 0;
308*437bfbebSnyanmisaka     // On last byte?
309*437bfbebSnyanmisaka     if (bitctx->bytes_left_)
310*437bfbebSnyanmisaka         return 1;
311*437bfbebSnyanmisaka     // Last byte, look for stop bit;
312*437bfbebSnyanmisaka     // We have more RBSP data if the last non-zero bit we find is not the
313*437bfbebSnyanmisaka     // first available bit.
314*437bfbebSnyanmisaka     if (bitctx->num_remaining_bits_in_curr_byte_)
315*437bfbebSnyanmisaka         return (bitctx->curr_byte_ &
316*437bfbebSnyanmisaka                 ((1 << (bitctx->num_remaining_bits_in_curr_byte_ - 1)) - 1)) != 0;
317*437bfbebSnyanmisaka     else
318*437bfbebSnyanmisaka         return 0;
319*437bfbebSnyanmisaka }
320*437bfbebSnyanmisaka /*!
321*437bfbebSnyanmisaka ***********************************************************************
322*437bfbebSnyanmisaka * \brief
323*437bfbebSnyanmisaka *   initialize bit read context
324*437bfbebSnyanmisaka ***********************************************************************
325*437bfbebSnyanmisaka */
mpp_set_bitread_ctx(BitReadCtx_t * bitctx,RK_U8 * data,RK_S32 size)326*437bfbebSnyanmisaka void mpp_set_bitread_ctx(BitReadCtx_t *bitctx, RK_U8 *data, RK_S32 size)
327*437bfbebSnyanmisaka {
328*437bfbebSnyanmisaka     memset(bitctx, 0, sizeof(BitReadCtx_t));
329*437bfbebSnyanmisaka     bitctx->data_ = data;
330*437bfbebSnyanmisaka     bitctx->bytes_left_ = size;
331*437bfbebSnyanmisaka     bitctx->num_remaining_bits_in_curr_byte_ = 0;
332*437bfbebSnyanmisaka     // Initially set to 0xffff to accept all initial two-byte sequences.
333*437bfbebSnyanmisaka     bitctx->prev_two_bytes_ = 0xffff;
334*437bfbebSnyanmisaka     bitctx->emulation_prevention_bytes_ = 0;
335*437bfbebSnyanmisaka     // add
336*437bfbebSnyanmisaka     bitctx->buf = data;
337*437bfbebSnyanmisaka     bitctx->buf_len = size;
338*437bfbebSnyanmisaka     bitctx->used_bits = 0;
339*437bfbebSnyanmisaka     mpp_set_bitread_pseudo_code_type(bitctx, PSEUDO_CODE_NONE);
340*437bfbebSnyanmisaka }
341*437bfbebSnyanmisaka 
mpp_set_bitread_pseudo_code_type(BitReadCtx_t * bitctx,PseudoCodeType type)342*437bfbebSnyanmisaka void mpp_set_bitread_pseudo_code_type(BitReadCtx_t *bitctx, PseudoCodeType type)
343*437bfbebSnyanmisaka {
344*437bfbebSnyanmisaka     bitctx->prevention_type = type;
345*437bfbebSnyanmisaka     switch (type) {
346*437bfbebSnyanmisaka     case PSEUDO_CODE_H264_H265:
347*437bfbebSnyanmisaka         bitctx->update_curbyte = update_curbyte_h264;
348*437bfbebSnyanmisaka         break;
349*437bfbebSnyanmisaka     case PSEUDO_CODE_H264_H265_SEI:
350*437bfbebSnyanmisaka         bitctx->update_curbyte = update_curbyte_h2645_sei;
351*437bfbebSnyanmisaka         break;
352*437bfbebSnyanmisaka     case PSEUDO_CODE_AVS2:
353*437bfbebSnyanmisaka         bitctx->update_curbyte = update_curbyte_avs2;
354*437bfbebSnyanmisaka         break;
355*437bfbebSnyanmisaka     default:
356*437bfbebSnyanmisaka         bitctx->update_curbyte = update_curbyte_default;
357*437bfbebSnyanmisaka         break;
358*437bfbebSnyanmisaka     }
359*437bfbebSnyanmisaka }
360*437bfbebSnyanmisaka 
361*437bfbebSnyanmisaka /*!
362*437bfbebSnyanmisaka ***********************************************************************
363*437bfbebSnyanmisaka * \brief
364*437bfbebSnyanmisaka *   align data and get current point
365*437bfbebSnyanmisaka ***********************************************************************
366*437bfbebSnyanmisaka */
mpp_align_get_bits(BitReadCtx_t * bitctx)367*437bfbebSnyanmisaka RK_U8 *mpp_align_get_bits(BitReadCtx_t *bitctx)
368*437bfbebSnyanmisaka {
369*437bfbebSnyanmisaka     int n = bitctx->num_remaining_bits_in_curr_byte_;
370*437bfbebSnyanmisaka     if (n)
371*437bfbebSnyanmisaka         mpp_skip_bits(bitctx, n);
372*437bfbebSnyanmisaka     return bitctx->data_;
373*437bfbebSnyanmisaka }
374*437bfbebSnyanmisaka 
mpp_get_bits_left(BitReadCtx_t * bitctx)375*437bfbebSnyanmisaka RK_S32 mpp_get_bits_left(BitReadCtx_t *bitctx)
376*437bfbebSnyanmisaka {
377*437bfbebSnyanmisaka     return  bitctx->bytes_left_ * 8 + bitctx->num_remaining_bits_in_curr_byte_;
378*437bfbebSnyanmisaka }
379*437bfbebSnyanmisaka 
mpp_get_bits_count(BitReadCtx_t * bitctx)380*437bfbebSnyanmisaka RK_S32 mpp_get_bits_count(BitReadCtx_t *bitctx)
381*437bfbebSnyanmisaka {
382*437bfbebSnyanmisaka     return bitctx->used_bits;
383*437bfbebSnyanmisaka }
384