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