/****************************************************************************** * * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ***************************************************************************** * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ /** ****************************************************************************** * * @file * ihevce_bitstream.h * * @brief * This file contains encoder bitstream engine related structures and * interface prototypes * * @author * ittiam * ****************************************************************************** */ #ifndef _IHEVCE_BITSTREAM_H_ #define _IHEVCE_BITSTREAM_H_ /*****************************************************************************/ /* Constant Macros */ /*****************************************************************************/ /** ****************************************************************************** * @brief defines the maximum number of bits in a bitstream word ****************************************************************************** */ #define WORD_SIZE 32 /** ****************************************************************************** * @brief The number of consecutive zero bytes for emulation prevention check ****************************************************************************** */ #define EPB_ZERO_BYTES 2 /** ****************************************************************************** * @brief Emulation prevention insertion byte ****************************************************************************** */ #define EPB_BYTE 0x03 /** ****************************************************************************** * @brief Maximum number of NALs in a frame ****************************************************************************** */ #define MAX_NALS_IN_AU 256 /*****************************************************************************/ /* Function Macros */ /*****************************************************************************/ /** ****************************************************************************** * @brief Macro to check if emulation prevention byte insertion is required ****************************************************************************** */ #define INSERT_EPB(zero_run, next_byte) ((zero_run) == EPB_ZERO_BYTES) && (0 == ((next_byte)&0xFC)) /** ****************************************************************************** * @brief returns bits required to code a value ****************************************************************************** */ #define UE_LENGTH(bits, x) \ { \ UWORD32 r_bit; \ GETRANGE(r_bit, x + 1) \ bits = (((r_bit - 1) << 1) + 1); \ } /** ****************************************************************************** * @brief Inserts 1 byte and Emulation Prevention Byte(if any) into bitstream * Increments the stream offset and zero run correspondingly ****************************************************************************** */ #define PUTBYTE_EPB(ptr, off, byte, zero_run) \ { \ if(INSERT_EPB(zero_run, byte)) \ { \ ptr[off] = EPB_BYTE; \ off++; \ zero_run = 0; \ } \ \ ptr[off] = byte; \ off++; \ zero_run = byte ? 0 : zero_run + 1; \ } /** ****************************************************************************** * @brief Ensures Byte alignment of the slice header ****************************************************************************** */ #define BYTE_ALIGNMENT(ps_bitstrm) ihevce_put_rbsp_trailing_bits(ps_bitstrm) /*****************************************************************************/ /* Structures */ /*****************************************************************************/ /** ****************************************************************************** * @brief Bitstream context for encoder ****************************************************************************** */ typedef struct bitstrm { /** points to start of stream buffer. */ UWORD8 *pu1_strm_buffer; /** * max bitstream size (in bytes). * Encoded stream shall not exceed this size. */ UWORD32 u4_max_strm_size; /** `* byte offset (w.r.t pu1_strm_buffer) where next byte would be written * Bitstream engine makes sure it would not corrupt data beyond * u4_max_strm_size bytes */ UWORD32 u4_strm_buf_offset; /** * current bitstream word; It is a scratch word containing max of * WORD_SIZE bits. Will be copied to stream buffer when the word is * full */ UWORD32 u4_cur_word; /** * signifies number of bits available in u4_cur_word * bits from msb to i4_bits_left_in_cw of u4_cur_word have already been * inserted next bits would be inserted from pos [i4_bits_left_in_cw-1] * Range of this variable [1 : WORD_SIZE] */ WORD32 i4_bits_left_in_cw; /** * signifies the number of consecutive zero bytes propogated from previous * word. It is used for emulation prevention byte insertion in the stream */ WORD32 i4_zero_bytes_run; /** Total number of NAL units in the output buffer; Shall not exceed * MAX_NALS_IN_AU */ WORD32 i4_num_nal; /** Pointer to start of each NAL unit in the output buffer */ UWORD8 *apu1_nal_start[MAX_NALS_IN_AU]; } bitstrm_t; /*****************************************************************************/ /* Extern Function Declarations */ /*****************************************************************************/ IHEVCE_ERROR_T ihevce_bitstrm_init(bitstrm_t *ps_bitstrm, UWORD8 *pu1_bitstrm_buf, UWORD32 u4_max_bitstrm_size); IHEVCE_ERROR_T ihevce_put_bits(bitstrm_t *ps_bitstrm, UWORD32 u4_code_val, WORD32 code_len); IHEVCE_ERROR_T ihevce_put_bit(bitstrm_t *ps_bitstrm, UWORD32 u4_code_val); IHEVCE_ERROR_T ihevce_put_rbsp_trailing_bits(bitstrm_t *ps_bitstrm); IHEVCE_ERROR_T ihevce_put_uev(bitstrm_t *ps_bitstrm, UWORD32 u4_code_num); IHEVCE_ERROR_T ihevce_put_sev(bitstrm_t *ps_bitstrm, WORD32 syntax_elem); IHEVCE_ERROR_T ihevce_put_nal_start_code_prefix(bitstrm_t *ps_bitstrm, WORD32 insert_leading_zero_8bits); #endif /* _IHEVCE_BITSTREAM_H_ */