xref: /rockchip-linux_mpp/mpp/base/inc/mpp_bitread.h (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 #ifndef __MPP_BITREAD_H__
18*437bfbebSnyanmisaka #define __MPP_BITREAD_H__
19*437bfbebSnyanmisaka 
20*437bfbebSnyanmisaka #include <stdio.h>
21*437bfbebSnyanmisaka #include <assert.h>
22*437bfbebSnyanmisaka 
23*437bfbebSnyanmisaka #include "mpp_err.h"
24*437bfbebSnyanmisaka #include "mpp_common.h"
25*437bfbebSnyanmisaka 
26*437bfbebSnyanmisaka #define   __BITREAD_ERR   __bitread_error
27*437bfbebSnyanmisaka 
28*437bfbebSnyanmisaka #define READ_ONEBIT(bitctx, out)\
29*437bfbebSnyanmisaka     do {\
30*437bfbebSnyanmisaka         RK_S32 _out; \
31*437bfbebSnyanmisaka         bitctx->ret = mpp_read_bits(bitctx, 1, &_out); \
32*437bfbebSnyanmisaka         if (!bitctx->ret) { *out = _out; }\
33*437bfbebSnyanmisaka         else { goto __BITREAD_ERR; }\
34*437bfbebSnyanmisaka     } while (0)
35*437bfbebSnyanmisaka 
36*437bfbebSnyanmisaka #define READ_BITS(bitctx, num_bits, out)\
37*437bfbebSnyanmisaka     do {\
38*437bfbebSnyanmisaka         RK_S32 _out; \
39*437bfbebSnyanmisaka         bitctx->ret = mpp_read_bits(bitctx, num_bits, &_out); \
40*437bfbebSnyanmisaka         if (!bitctx->ret) { *out = _out; }\
41*437bfbebSnyanmisaka         else { goto __BITREAD_ERR; }\
42*437bfbebSnyanmisaka     } while (0)
43*437bfbebSnyanmisaka 
44*437bfbebSnyanmisaka #define READ_BITS_LONG(bitctx, num_bits, out)\
45*437bfbebSnyanmisaka     do {\
46*437bfbebSnyanmisaka         RK_U32 _out; \
47*437bfbebSnyanmisaka         bitctx->ret = mpp_read_longbits(bitctx, num_bits, &_out); \
48*437bfbebSnyanmisaka         if (!bitctx->ret) { *out = _out; }\
49*437bfbebSnyanmisaka         else { goto __BITREAD_ERR; }\
50*437bfbebSnyanmisaka     } while (0)
51*437bfbebSnyanmisaka 
52*437bfbebSnyanmisaka #define SHOW_BITS(bitctx, num_bits, out)\
53*437bfbebSnyanmisaka     do {\
54*437bfbebSnyanmisaka         RK_S32 _out; \
55*437bfbebSnyanmisaka         bitctx->ret = mpp_show_bits(bitctx, num_bits, &_out); \
56*437bfbebSnyanmisaka         if (!bitctx->ret) { *out = _out; }\
57*437bfbebSnyanmisaka         else { goto __BITREAD_ERR; }\
58*437bfbebSnyanmisaka     } while (0)
59*437bfbebSnyanmisaka 
60*437bfbebSnyanmisaka #define SHOW_BITS_LONG(bitctx, num_bits, out)\
61*437bfbebSnyanmisaka     do {\
62*437bfbebSnyanmisaka         RK_U32 _out; \
63*437bfbebSnyanmisaka         bitctx->ret = mpp_show_longbits(bitctx, num_bits, &_out); \
64*437bfbebSnyanmisaka         if (!bitctx->ret) { *out = _out; }\
65*437bfbebSnyanmisaka         else { goto __BITREAD_ERR; }\
66*437bfbebSnyanmisaka     } while (0)
67*437bfbebSnyanmisaka 
68*437bfbebSnyanmisaka #define SKIP_BITS(bitctx, num_bits)\
69*437bfbebSnyanmisaka     do {\
70*437bfbebSnyanmisaka         bitctx->ret = mpp_skip_longbits(bitctx, num_bits); \
71*437bfbebSnyanmisaka         if (bitctx->ret) { goto __BITREAD_ERR; }\
72*437bfbebSnyanmisaka     } while (0)
73*437bfbebSnyanmisaka 
74*437bfbebSnyanmisaka #define SKIP_BITS_LONG(bitctx, num_bits)\
75*437bfbebSnyanmisaka     do {\
76*437bfbebSnyanmisaka         bitctx->ret = mpp_skip_longbits(bitctx, num_bits); \
77*437bfbebSnyanmisaka         if (bitctx->ret) { goto __BITREAD_ERR; }\
78*437bfbebSnyanmisaka     } while (0)
79*437bfbebSnyanmisaka 
80*437bfbebSnyanmisaka #define READ_UE(bitctx, out)\
81*437bfbebSnyanmisaka     do {\
82*437bfbebSnyanmisaka         RK_U32 _out; \
83*437bfbebSnyanmisaka         bitctx->ret = mpp_read_ue(bitctx, &_out); \
84*437bfbebSnyanmisaka         if (!bitctx->ret) { *out = _out; }\
85*437bfbebSnyanmisaka         else { goto __BITREAD_ERR; }\
86*437bfbebSnyanmisaka     } while (0)
87*437bfbebSnyanmisaka 
88*437bfbebSnyanmisaka #define READ_SE(bitctx, out)\
89*437bfbebSnyanmisaka     do {\
90*437bfbebSnyanmisaka         RK_S32 _out; \
91*437bfbebSnyanmisaka         bitctx->ret = mpp_read_se(bitctx, &_out); \
92*437bfbebSnyanmisaka         if (!bitctx->ret) { *out = _out; }\
93*437bfbebSnyanmisaka         else { goto __BITREAD_ERR; }\
94*437bfbebSnyanmisaka     } while (0)
95*437bfbebSnyanmisaka 
96*437bfbebSnyanmisaka typedef enum  PseudoCodeType_e {
97*437bfbebSnyanmisaka     PSEUDO_CODE_NONE = 0,
98*437bfbebSnyanmisaka     PSEUDO_CODE_H264_H265,
99*437bfbebSnyanmisaka     PSEUDO_CODE_H264_H265_SEI,
100*437bfbebSnyanmisaka     PSEUDO_CODE_AVS2,
101*437bfbebSnyanmisaka     PSEUDO_CODE_BUT
102*437bfbebSnyanmisaka } PseudoCodeType;
103*437bfbebSnyanmisaka 
104*437bfbebSnyanmisaka typedef struct bitread_ctx_t {
105*437bfbebSnyanmisaka     // Pointer to the next unread (not in curr_byte_) byte in the stream.
106*437bfbebSnyanmisaka     RK_U8 *data_;
107*437bfbebSnyanmisaka     // Bytes left in the stream (without the curr_byte_).
108*437bfbebSnyanmisaka     RK_U32 bytes_left_;
109*437bfbebSnyanmisaka     // Contents of the current byte; first unread bit starting at position
110*437bfbebSnyanmisaka     // 8 - num_remaining_bits_in_curr_byte_ from MSB.
111*437bfbebSnyanmisaka     RK_S64 curr_byte_;
112*437bfbebSnyanmisaka     // Number of bits remaining in curr_byte_
113*437bfbebSnyanmisaka     RK_S32 num_remaining_bits_in_curr_byte_;
114*437bfbebSnyanmisaka     // Used in emulation prevention three byte detection (see spec).
115*437bfbebSnyanmisaka     // Initially set to 0xffff to accept all initial two-byte sequences.
116*437bfbebSnyanmisaka     RK_S64 prev_two_bytes_;
117*437bfbebSnyanmisaka     // Number of emulation presentation bytes (0x000003) we met.
118*437bfbebSnyanmisaka     RK_S64 emulation_prevention_bytes_;
119*437bfbebSnyanmisaka     // count PPS SPS SEI read bits
120*437bfbebSnyanmisaka     RK_S32 used_bits;
121*437bfbebSnyanmisaka     RK_U8  *buf;
122*437bfbebSnyanmisaka     RK_S32 buf_len;
123*437bfbebSnyanmisaka     // ctx
124*437bfbebSnyanmisaka     MPP_RET   ret;
125*437bfbebSnyanmisaka     PseudoCodeType prevention_type;
126*437bfbebSnyanmisaka     MPP_RET (*update_curbyte)(struct bitread_ctx_t *bitctx);
127*437bfbebSnyanmisaka } BitReadCtx_t;
128*437bfbebSnyanmisaka 
129*437bfbebSnyanmisaka 
130*437bfbebSnyanmisaka #ifdef  __cplusplus
131*437bfbebSnyanmisaka extern "C" {
132*437bfbebSnyanmisaka #endif
133*437bfbebSnyanmisaka 
134*437bfbebSnyanmisaka //!< set bit read context
135*437bfbebSnyanmisaka void    mpp_set_bitread_ctx(BitReadCtx_t *bitctx, RK_U8 *data, RK_S32 size);
136*437bfbebSnyanmisaka 
137*437bfbebSnyanmisaka //!< Read bits (1-31)
138*437bfbebSnyanmisaka MPP_RET mpp_read_bits(BitReadCtx_t *bitctx, RK_S32 num_bits, RK_S32 *out);
139*437bfbebSnyanmisaka 
140*437bfbebSnyanmisaka //!< Read bits (1-32)
141*437bfbebSnyanmisaka MPP_RET mpp_read_longbits(BitReadCtx_t *bitctx, RK_S32 num_bits, RK_U32 *out);
142*437bfbebSnyanmisaka 
143*437bfbebSnyanmisaka //!< Show bits (1-31)
144*437bfbebSnyanmisaka MPP_RET mpp_show_bits(BitReadCtx_t *bitctx, RK_S32 num_bits, RK_S32 *out);
145*437bfbebSnyanmisaka 
146*437bfbebSnyanmisaka //!< Show bits (1-32)
147*437bfbebSnyanmisaka MPP_RET mpp_show_longbits(BitReadCtx_t *bitctx, RK_S32 num_bits, RK_U32 *out);
148*437bfbebSnyanmisaka 
149*437bfbebSnyanmisaka //!< skip bits(1-31)
150*437bfbebSnyanmisaka MPP_RET mpp_skip_bits(BitReadCtx_t *bitctx, RK_S32 num_bits);
151*437bfbebSnyanmisaka 
152*437bfbebSnyanmisaka //!< skip bits(1-32)
153*437bfbebSnyanmisaka MPP_RET mpp_skip_longbits(BitReadCtx_t *bitctx, RK_S32 num_bits);
154*437bfbebSnyanmisaka 
155*437bfbebSnyanmisaka //!< read ue(1-32)
156*437bfbebSnyanmisaka MPP_RET mpp_read_ue(BitReadCtx_t *bitctx, RK_U32* val);
157*437bfbebSnyanmisaka 
158*437bfbebSnyanmisaka //!< read se(1-31)
159*437bfbebSnyanmisaka MPP_RET mpp_read_se(BitReadCtx_t *bitctx, RK_S32* val);
160*437bfbebSnyanmisaka 
161*437bfbebSnyanmisaka void mpp_set_bitread_pseudo_code_type(BitReadCtx_t *bitctx, PseudoCodeType type);
162*437bfbebSnyanmisaka 
163*437bfbebSnyanmisaka //!< check whether has more rbsp data(used in h264)
164*437bfbebSnyanmisaka RK_U32  mpp_has_more_rbsp_data(BitReadCtx_t * bitctx);
165*437bfbebSnyanmisaka 
166*437bfbebSnyanmisaka //!< align bits and get current pointer
167*437bfbebSnyanmisaka RK_U8  *mpp_align_get_bits(BitReadCtx_t *bitctx);
168*437bfbebSnyanmisaka 
169*437bfbebSnyanmisaka RK_S32 mpp_get_bits_left(BitReadCtx_t *bitctx);
170*437bfbebSnyanmisaka 
171*437bfbebSnyanmisaka RK_S32 mpp_get_bits_count(BitReadCtx_t *bitctx);
172*437bfbebSnyanmisaka 
173*437bfbebSnyanmisaka #ifdef  __cplusplus
174*437bfbebSnyanmisaka }
175*437bfbebSnyanmisaka #endif
176*437bfbebSnyanmisaka 
177*437bfbebSnyanmisaka 
178*437bfbebSnyanmisaka #endif /* __MPP_BITREAD_H__ */
179