1*c83a76b0SSuyog Pawar /****************************************************************************** 2*c83a76b0SSuyog Pawar * 3*c83a76b0SSuyog Pawar * Copyright (C) 2018 The Android Open Source Project 4*c83a76b0SSuyog Pawar * 5*c83a76b0SSuyog Pawar * Licensed under the Apache License, Version 2.0 (the "License"); 6*c83a76b0SSuyog Pawar * you may not use this file except in compliance with the License. 7*c83a76b0SSuyog Pawar * You may obtain a copy of the License at: 8*c83a76b0SSuyog Pawar * 9*c83a76b0SSuyog Pawar * http://www.apache.org/licenses/LICENSE-2.0 10*c83a76b0SSuyog Pawar * 11*c83a76b0SSuyog Pawar * Unless required by applicable law or agreed to in writing, software 12*c83a76b0SSuyog Pawar * distributed under the License is distributed on an "AS IS" BASIS, 13*c83a76b0SSuyog Pawar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*c83a76b0SSuyog Pawar * See the License for the specific language governing permissions and 15*c83a76b0SSuyog Pawar * limitations under the License. 16*c83a76b0SSuyog Pawar * 17*c83a76b0SSuyog Pawar ***************************************************************************** 18*c83a76b0SSuyog Pawar * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore 19*c83a76b0SSuyog Pawar */ 20*c83a76b0SSuyog Pawar 21*c83a76b0SSuyog Pawar /** 22*c83a76b0SSuyog Pawar ****************************************************************************** 23*c83a76b0SSuyog Pawar * 24*c83a76b0SSuyog Pawar * @file 25*c83a76b0SSuyog Pawar * ihevce_bitstream.h 26*c83a76b0SSuyog Pawar * 27*c83a76b0SSuyog Pawar * @brief 28*c83a76b0SSuyog Pawar * This file contains encoder bitstream engine related structures and 29*c83a76b0SSuyog Pawar * interface prototypes 30*c83a76b0SSuyog Pawar * 31*c83a76b0SSuyog Pawar * @author 32*c83a76b0SSuyog Pawar * ittiam 33*c83a76b0SSuyog Pawar * 34*c83a76b0SSuyog Pawar ****************************************************************************** 35*c83a76b0SSuyog Pawar */ 36*c83a76b0SSuyog Pawar 37*c83a76b0SSuyog Pawar #ifndef _IHEVCE_BITSTREAM_H_ 38*c83a76b0SSuyog Pawar #define _IHEVCE_BITSTREAM_H_ 39*c83a76b0SSuyog Pawar 40*c83a76b0SSuyog Pawar /*****************************************************************************/ 41*c83a76b0SSuyog Pawar /* Constant Macros */ 42*c83a76b0SSuyog Pawar /*****************************************************************************/ 43*c83a76b0SSuyog Pawar 44*c83a76b0SSuyog Pawar /** 45*c83a76b0SSuyog Pawar ****************************************************************************** 46*c83a76b0SSuyog Pawar * @brief defines the maximum number of bits in a bitstream word 47*c83a76b0SSuyog Pawar ****************************************************************************** 48*c83a76b0SSuyog Pawar */ 49*c83a76b0SSuyog Pawar #define WORD_SIZE 32 50*c83a76b0SSuyog Pawar 51*c83a76b0SSuyog Pawar /** 52*c83a76b0SSuyog Pawar ****************************************************************************** 53*c83a76b0SSuyog Pawar * @brief The number of consecutive zero bytes for emulation prevention check 54*c83a76b0SSuyog Pawar ****************************************************************************** 55*c83a76b0SSuyog Pawar */ 56*c83a76b0SSuyog Pawar #define EPB_ZERO_BYTES 2 57*c83a76b0SSuyog Pawar 58*c83a76b0SSuyog Pawar /** 59*c83a76b0SSuyog Pawar ****************************************************************************** 60*c83a76b0SSuyog Pawar * @brief Emulation prevention insertion byte 61*c83a76b0SSuyog Pawar ****************************************************************************** 62*c83a76b0SSuyog Pawar */ 63*c83a76b0SSuyog Pawar #define EPB_BYTE 0x03 64*c83a76b0SSuyog Pawar 65*c83a76b0SSuyog Pawar /** 66*c83a76b0SSuyog Pawar ****************************************************************************** 67*c83a76b0SSuyog Pawar * @brief Maximum number of NALs in a frame 68*c83a76b0SSuyog Pawar ****************************************************************************** 69*c83a76b0SSuyog Pawar */ 70*c83a76b0SSuyog Pawar #define MAX_NALS_IN_AU 256 71*c83a76b0SSuyog Pawar 72*c83a76b0SSuyog Pawar /*****************************************************************************/ 73*c83a76b0SSuyog Pawar /* Function Macros */ 74*c83a76b0SSuyog Pawar /*****************************************************************************/ 75*c83a76b0SSuyog Pawar 76*c83a76b0SSuyog Pawar /** 77*c83a76b0SSuyog Pawar ****************************************************************************** 78*c83a76b0SSuyog Pawar * @brief Macro to check if emulation prevention byte insertion is required 79*c83a76b0SSuyog Pawar ****************************************************************************** 80*c83a76b0SSuyog Pawar */ 81*c83a76b0SSuyog Pawar #define INSERT_EPB(zero_run, next_byte) ((zero_run) == EPB_ZERO_BYTES) && (0 == ((next_byte)&0xFC)) 82*c83a76b0SSuyog Pawar 83*c83a76b0SSuyog Pawar /** 84*c83a76b0SSuyog Pawar ****************************************************************************** 85*c83a76b0SSuyog Pawar * @brief returns bits required to code a value 86*c83a76b0SSuyog Pawar ****************************************************************************** 87*c83a76b0SSuyog Pawar */ 88*c83a76b0SSuyog Pawar #define UE_LENGTH(bits, x) \ 89*c83a76b0SSuyog Pawar { \ 90*c83a76b0SSuyog Pawar UWORD32 r_bit; \ 91*c83a76b0SSuyog Pawar GETRANGE(r_bit, x + 1) \ 92*c83a76b0SSuyog Pawar bits = (((r_bit - 1) << 1) + 1); \ 93*c83a76b0SSuyog Pawar } 94*c83a76b0SSuyog Pawar 95*c83a76b0SSuyog Pawar /** 96*c83a76b0SSuyog Pawar ****************************************************************************** 97*c83a76b0SSuyog Pawar * @brief Inserts 1 byte and Emulation Prevention Byte(if any) into bitstream 98*c83a76b0SSuyog Pawar * Increments the stream offset and zero run correspondingly 99*c83a76b0SSuyog Pawar ****************************************************************************** 100*c83a76b0SSuyog Pawar */ 101*c83a76b0SSuyog Pawar #define PUTBYTE_EPB(ptr, off, byte, zero_run) \ 102*c83a76b0SSuyog Pawar { \ 103*c83a76b0SSuyog Pawar if(INSERT_EPB(zero_run, byte)) \ 104*c83a76b0SSuyog Pawar { \ 105*c83a76b0SSuyog Pawar ptr[off] = EPB_BYTE; \ 106*c83a76b0SSuyog Pawar off++; \ 107*c83a76b0SSuyog Pawar zero_run = 0; \ 108*c83a76b0SSuyog Pawar } \ 109*c83a76b0SSuyog Pawar \ 110*c83a76b0SSuyog Pawar ptr[off] = byte; \ 111*c83a76b0SSuyog Pawar off++; \ 112*c83a76b0SSuyog Pawar zero_run = byte ? 0 : zero_run + 1; \ 113*c83a76b0SSuyog Pawar } 114*c83a76b0SSuyog Pawar 115*c83a76b0SSuyog Pawar /** 116*c83a76b0SSuyog Pawar ****************************************************************************** 117*c83a76b0SSuyog Pawar * @brief Ensures Byte alignment of the slice header 118*c83a76b0SSuyog Pawar ****************************************************************************** 119*c83a76b0SSuyog Pawar */ 120*c83a76b0SSuyog Pawar 121*c83a76b0SSuyog Pawar #define BYTE_ALIGNMENT(ps_bitstrm) ihevce_put_rbsp_trailing_bits(ps_bitstrm) 122*c83a76b0SSuyog Pawar 123*c83a76b0SSuyog Pawar /*****************************************************************************/ 124*c83a76b0SSuyog Pawar /* Structures */ 125*c83a76b0SSuyog Pawar /*****************************************************************************/ 126*c83a76b0SSuyog Pawar 127*c83a76b0SSuyog Pawar /** 128*c83a76b0SSuyog Pawar ****************************************************************************** 129*c83a76b0SSuyog Pawar * @brief Bitstream context for encoder 130*c83a76b0SSuyog Pawar ****************************************************************************** 131*c83a76b0SSuyog Pawar */ 132*c83a76b0SSuyog Pawar typedef struct bitstrm 133*c83a76b0SSuyog Pawar { 134*c83a76b0SSuyog Pawar /** points to start of stream buffer. */ 135*c83a76b0SSuyog Pawar UWORD8 *pu1_strm_buffer; 136*c83a76b0SSuyog Pawar 137*c83a76b0SSuyog Pawar /** 138*c83a76b0SSuyog Pawar * max bitstream size (in bytes). 139*c83a76b0SSuyog Pawar * Encoded stream shall not exceed this size. 140*c83a76b0SSuyog Pawar */ 141*c83a76b0SSuyog Pawar UWORD32 u4_max_strm_size; 142*c83a76b0SSuyog Pawar 143*c83a76b0SSuyog Pawar /** 144*c83a76b0SSuyog Pawar `* byte offset (w.r.t pu1_strm_buffer) where next byte would be written 145*c83a76b0SSuyog Pawar * Bitstream engine makes sure it would not corrupt data beyond 146*c83a76b0SSuyog Pawar * u4_max_strm_size bytes 147*c83a76b0SSuyog Pawar */ 148*c83a76b0SSuyog Pawar UWORD32 u4_strm_buf_offset; 149*c83a76b0SSuyog Pawar 150*c83a76b0SSuyog Pawar /** 151*c83a76b0SSuyog Pawar * current bitstream word; It is a scratch word containing max of 152*c83a76b0SSuyog Pawar * WORD_SIZE bits. Will be copied to stream buffer when the word is 153*c83a76b0SSuyog Pawar * full 154*c83a76b0SSuyog Pawar */ 155*c83a76b0SSuyog Pawar UWORD32 u4_cur_word; 156*c83a76b0SSuyog Pawar 157*c83a76b0SSuyog Pawar /** 158*c83a76b0SSuyog Pawar * signifies number of bits available in u4_cur_word 159*c83a76b0SSuyog Pawar * bits from msb to i4_bits_left_in_cw of u4_cur_word have already been 160*c83a76b0SSuyog Pawar * inserted next bits would be inserted from pos [i4_bits_left_in_cw-1] 161*c83a76b0SSuyog Pawar * Range of this variable [1 : WORD_SIZE] 162*c83a76b0SSuyog Pawar */ 163*c83a76b0SSuyog Pawar WORD32 i4_bits_left_in_cw; 164*c83a76b0SSuyog Pawar 165*c83a76b0SSuyog Pawar /** 166*c83a76b0SSuyog Pawar * signifies the number of consecutive zero bytes propogated from previous 167*c83a76b0SSuyog Pawar * word. It is used for emulation prevention byte insertion in the stream 168*c83a76b0SSuyog Pawar */ 169*c83a76b0SSuyog Pawar WORD32 i4_zero_bytes_run; 170*c83a76b0SSuyog Pawar 171*c83a76b0SSuyog Pawar /** Total number of NAL units in the output buffer; Shall not exceed 172*c83a76b0SSuyog Pawar * MAX_NALS_IN_AU */ 173*c83a76b0SSuyog Pawar WORD32 i4_num_nal; 174*c83a76b0SSuyog Pawar 175*c83a76b0SSuyog Pawar /** Pointer to start of each NAL unit in the output buffer */ 176*c83a76b0SSuyog Pawar UWORD8 *apu1_nal_start[MAX_NALS_IN_AU]; 177*c83a76b0SSuyog Pawar 178*c83a76b0SSuyog Pawar } bitstrm_t; 179*c83a76b0SSuyog Pawar 180*c83a76b0SSuyog Pawar /*****************************************************************************/ 181*c83a76b0SSuyog Pawar /* Extern Function Declarations */ 182*c83a76b0SSuyog Pawar /*****************************************************************************/ 183*c83a76b0SSuyog Pawar 184*c83a76b0SSuyog Pawar IHEVCE_ERROR_T 185*c83a76b0SSuyog Pawar ihevce_bitstrm_init(bitstrm_t *ps_bitstrm, UWORD8 *pu1_bitstrm_buf, UWORD32 u4_max_bitstrm_size); 186*c83a76b0SSuyog Pawar 187*c83a76b0SSuyog Pawar IHEVCE_ERROR_T ihevce_put_bits(bitstrm_t *ps_bitstrm, UWORD32 u4_code_val, WORD32 code_len); 188*c83a76b0SSuyog Pawar 189*c83a76b0SSuyog Pawar IHEVCE_ERROR_T ihevce_put_bit(bitstrm_t *ps_bitstrm, UWORD32 u4_code_val); 190*c83a76b0SSuyog Pawar 191*c83a76b0SSuyog Pawar IHEVCE_ERROR_T ihevce_put_rbsp_trailing_bits(bitstrm_t *ps_bitstrm); 192*c83a76b0SSuyog Pawar 193*c83a76b0SSuyog Pawar IHEVCE_ERROR_T ihevce_put_uev(bitstrm_t *ps_bitstrm, UWORD32 u4_code_num); 194*c83a76b0SSuyog Pawar 195*c83a76b0SSuyog Pawar IHEVCE_ERROR_T ihevce_put_sev(bitstrm_t *ps_bitstrm, WORD32 syntax_elem); 196*c83a76b0SSuyog Pawar 197*c83a76b0SSuyog Pawar IHEVCE_ERROR_T 198*c83a76b0SSuyog Pawar ihevce_put_nal_start_code_prefix(bitstrm_t *ps_bitstrm, WORD32 insert_leading_zero_8bits); 199*c83a76b0SSuyog Pawar 200*c83a76b0SSuyog Pawar #endif /* _IHEVCE_BITSTREAM_H_ */ 201