/******************************************************************************
*
* 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_ */