You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
201 lines
8.2 KiB
201 lines
8.2 KiB
/******************************************************************************
|
|
*
|
|
* 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_ */
|