18d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/******************************************************************************
28d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
38d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * Copyright (C) 2015 The Android Open Source Project
48d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
58d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * Licensed under the Apache License, Version 2.0 (the "License");
68d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * you may not use this file except in compliance with the License.
78d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * You may obtain a copy of the License at:
88d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
98d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * http://www.apache.org/licenses/LICENSE-2.0
108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * Unless required by applicable law or agreed to in writing, software
128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * distributed under the License is distributed on an "AS IS" BASIS,
138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * See the License for the specific language governing permissions and
158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * limitations under the License.
168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *
178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *****************************************************************************
188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*/
208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/**
228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*******************************************************************************
238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @file
248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  ih264e_bitstream.h
258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @brief
278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  This file contains encoder bitstream engine related structures and
288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  interface prototypes
298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @author
318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  ittiam
328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S* @remarks
348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  none
358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*******************************************************************************
378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*/
388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#ifndef IH264E_BITSTREAM_H_
408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#define IH264E_BITSTREAM_H_
418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/*****************************************************************************/
438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/* Constant Macros                                                           */
448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/*****************************************************************************/
458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/**
478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S******************************************************************************
488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *  @brief      defines the maximum number of bits in a bitstream word
498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S******************************************************************************
508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S */
518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#define WORD_SIZE         32
528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/**
548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S******************************************************************************
558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *  @brief  The number of consecutive zero bytes for emulation prevention check
568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S******************************************************************************
578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S */
588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#define EPB_ZERO_BYTES      2
598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/**
618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S******************************************************************************
628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *  @brief  Emulation prevention insertion byte
638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S******************************************************************************
648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S */
658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#define EPB_BYTE            0x03
668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/**
693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K******************************************************************************
703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K *  @brief  Stream buffer allocated per frame should be atleast MIN_STREAM_SIZE
713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K******************************************************************************
723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K */
73205e6fe11056f892b3449aac437ff14f159149d4Harinarayanan K K#define MIN_STREAM_SIZE            0x800
743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/*****************************************************************************/
778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/* Function Macros                                                           */
788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/*****************************************************************************/
798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/**
818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S******************************************************************************
828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *  @brief   Macro to check if emulation prevention byte insertion is required
838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S******************************************************************************
848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S */
858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#define INSERT_EPB(zero_run, next_byte)                                       \
868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ((zero_run) == EPB_ZERO_BYTES) && (0 == ((next_byte) & 0xFC))
878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/**
898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S******************************************************************************
908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *  @brief   returns the bit position of a leading 1 (msb) in a code value
918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S******************************************************************************
928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S */
938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#if !MSVC
948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#define GETRANGE(r,value)   \
958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{                           \
968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    r = 0;                  \
978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    if(0 == value)          \
988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        r = 1;              \
998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    else                    \
1008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {                       \
1018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        r = 32-CLZ(value);  \
1028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }\
1038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S}
1048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#else
1058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#define GETRANGE(r,value)                 \
1068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{                                         \
1078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    unsigned long  msb_one_bit = 0;       \
1088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    r = _BitScanReverse(&msb_one_bit, value) ? (UWORD32)(msb_one_bit + 1) : 1 ; \
1098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S}
1108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#endif
1118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
1128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/**
1138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S******************************************************************************
1148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *  @brief   returns bits required to code a value
1158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S******************************************************************************
1168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S */
1173749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#define UE_LENGTH(bits,x)        \
1183749f6f435e79624f72841e866245d84195551cdHarinarayanan K K{                                \
1193749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    UWORD32 r_bit;               \
1203749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    GETRANGE(r_bit,x+1)          \
1213749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    bits =(((r_bit - 1) << 1)+1);\
1223749f6f435e79624f72841e866245d84195551cdHarinarayanan K K}                                \
1238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
1248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/**
1258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S******************************************************************************
1268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *  @brief  Inserts 1 byte and Emulation Prevention Byte(if any) into bitstream
1278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *          Increments the stream offset and zero run correspondingly
1288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S******************************************************************************
1298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S */
1308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#define PUTBYTE_EPB(ptr,off,byte,zero_run)                      \
1318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{                                                               \
1328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    if( INSERT_EPB(zero_run, byte) )                            \
1338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    {                                                           \
1348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        ptr[off] = EPB_BYTE;                                    \
1358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        off++;                                                  \
1368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        zero_run = 0;                                           \
1378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    }                                                           \
1388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                                                \
1398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    ptr[off] = byte;                                            \
1408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    off++;                                                      \
1418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    zero_run = byte ? 0 : zero_run+1;                           \
1428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S}                                                               \
1438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
1448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/**
1458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S******************************************************************************
1468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *  @brief  Ensures Byte alignment of the slice header
1478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S******************************************************************************
1488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S */
1498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#define BYTE_ALIGNMENT(ps_bitstrm) ih264e_put_rbsp_trailing_bits(ps_bitstrm)
1508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
1513749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/**
1523749f6f435e79624f72841e866245d84195551cdHarinarayanan K K******************************************************************************
1533749f6f435e79624f72841e866245d84195551cdHarinarayanan K K *  @brief  Gets number of  bits coded
1543749f6f435e79624f72841e866245d84195551cdHarinarayanan K K******************************************************************************
1553749f6f435e79624f72841e866245d84195551cdHarinarayanan K K */
1563749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
1573749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#define GET_NUM_BITS(ps_bitstream) ((ps_bitstream->u4_strm_buf_offset << 3) \
1583749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                                    + 32 - ps_bitstream->i4_bits_left_in_cw);
1593749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
1603749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
1613749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
1623749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/**
1633749f6f435e79624f72841e866245d84195551cdHarinarayanan K K******************************************************************************
1643749f6f435e79624f72841e866245d84195551cdHarinarayanan K K *  @macro Align bitstream to byte - Remainig bits are filled with '1'
1653749f6f435e79624f72841e866245d84195551cdHarinarayanan K K******************************************************************************
1663749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*/
1673749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#define BITSTREAM_BYTE_ALIGN(ps_bitstrm)                                    \
1683749f6f435e79624f72841e866245d84195551cdHarinarayanan K K   if (ps_bitstrm->i4_bits_left_in_cw & 0x07)                               \
1693749f6f435e79624f72841e866245d84195551cdHarinarayanan K K   {                                                                        \
1703749f6f435e79624f72841e866245d84195551cdHarinarayanan K K       const WORD32 len = (WORD32)((ps_bitstrm->i4_bits_left_in_cw) & 0x07);\
1713749f6f435e79624f72841e866245d84195551cdHarinarayanan K K       ih264e_put_bits(ps_bitstrm, (UWORD32)((1 << len) - 1), len);         \
1723749f6f435e79624f72841e866245d84195551cdHarinarayanan K K   }
1733749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
1743749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
1753749f6f435e79624f72841e866245d84195551cdHarinarayanan K K/**
1763749f6f435e79624f72841e866245d84195551cdHarinarayanan K K******************************************************************************
1773749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* flush the bits in cur word byte by byte  and copy to stream                *
1783749f6f435e79624f72841e866245d84195551cdHarinarayanan K K* (current word is assumed to be byte aligned)                               *
1793749f6f435e79624f72841e866245d84195551cdHarinarayanan K K******************************************************************************
1803749f6f435e79624f72841e866245d84195551cdHarinarayanan K K*/
1813749f6f435e79624f72841e866245d84195551cdHarinarayanan K K#define  BITSTREAM_FLUSH(ps_bitstrm)                                           \
1823749f6f435e79624f72841e866245d84195551cdHarinarayanan K K{                                                                              \
1833749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    WORD32 i;                                                                  \
1843749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    for (i = WORD_SIZE; i > ps_bitstrm->i4_bits_left_in_cw; i -= 8)            \
1853749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    {                                                                          \
1863749f6f435e79624f72841e866245d84195551cdHarinarayanan K K       UWORD8 u1_next_byte = (ps_bitstrm->u4_cur_word >> (i - 8)) & 0xFF;      \
1873749f6f435e79624f72841e866245d84195551cdHarinarayanan K K       PUTBYTE_EPB(ps_bitstrm->pu1_strm_buffer, ps_bitstrm->u4_strm_buf_offset,\
1883749f6f435e79624f72841e866245d84195551cdHarinarayanan K K                   u1_next_byte, ps_bitstrm->i4_zero_bytes_run);               \
1893749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    }                                                                          \
1903749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_bitstrm->u4_cur_word = 0;                                               \
1913749f6f435e79624f72841e866245d84195551cdHarinarayanan K K    ps_bitstrm->i4_bits_left_in_cw = WORD_SIZE;                                \
1923749f6f435e79624f72841e866245d84195551cdHarinarayanan K K}                                                                              \
1933749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
1943749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
1953749f6f435e79624f72841e866245d84195551cdHarinarayanan K K
1968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
1978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/*****************************************************************************/
1988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/* Structures                                                                */
1998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/*****************************************************************************/
2008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/**
2028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S******************************************************************************
2038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *  @brief      Bitstream context for encoder
2048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S******************************************************************************
2058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S */
2068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha Stypedef struct bitstrm
2078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{
2088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /** points to start of stream buffer.    */
2098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD8  *pu1_strm_buffer;
2108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /**
2128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S     *  max bitstream size (in bytes).
2138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S     *  Encoded stream shall not exceed this size.
2148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S     */
2158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD32 u4_max_strm_size;
2168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /**
2188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S     *  byte offset (w.r.t pu1_strm_buffer) where next byte would be written
2198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S     *  Bitstream engine makes sure it would not corrupt data beyond
2208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S     *  u4_max_strm_size bytes
2218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                 */
2228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD32 u4_strm_buf_offset;
2238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /**
2258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S     *  current bitstream word; It is a scratch word containing max of
2268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S     *  WORD_SIZE bits. Will be copied to stream buffer when the word is
2278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S     *  full
2288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                 */
2298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    UWORD32 u4_cur_word;
2308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /**
2328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S     *  signifies number of bits available in u4_cur_word
2338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S     *  bits from msb to i4_bits_left_in_cw of u4_cur_word have already been
2348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S     *  inserted next bits would be inserted from pos [i4_bits_left_in_cw-1]
2358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S     *  Range of this variable [1 : WORD_SIZE]
2368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                 */
2378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    WORD32  i4_bits_left_in_cw;
2388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    /**
2408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S     *  signifies the number of consecutive zero bytes propogated from previous
2418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S     *  word. It is used for emulation prevention byte insertion in the stream
2428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S                                 */
2438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S    WORD32  i4_zero_bytes_run;
2448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S} bitstrm_t;
2468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/*****************************************************************************/
2498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/* Extern Function Declarations                                              */
2508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/*****************************************************************************/
2518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/**
2538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S******************************************************************************
2548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
2558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @brief Initializes the encoder bitstream engine
2568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
2578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @par   Description
2588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  This routine needs to be called at start of slice/frame encode
2598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
2608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @param[in]   ps_bitstrm
2618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  pointer to bitstream context (handle)
2628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
2638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @param[in]   p1_bitstrm_buf
2648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  bitstream buffer pointer where the encoded stream is generated in byte order
2658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
2668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @param[in]   u4_max_bitstrm_size
2678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  indicates maximum bitstream buffer size. (in bytes)
2688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  If actual stream size exceeds the maximum size, encoder should
2698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*   1. Not corrupt data beyond u4_max_bitstrm_size bytes
2708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*   2. Report an error back to application indicating overflow
2718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
2728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @return      success or failure error code
2738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
2748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S******************************************************************************
2758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*/
2768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha SIH264E_ERROR_T    ih264e_bitstrm_init
2778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        (
2788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            bitstrm_t   *ps_bitstrm,
2798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            UWORD8      *pu1_bitstrm_buf,
2808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            UWORD32     u4_max_bitstrm_size
2818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        );
2828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
2838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/**
2848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S******************************************************************************
2858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
2868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @brief puts a code with specified number of bits into the bitstream
2878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
2888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @par   Description
2898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  inserts code_len number of bits from lsb of code_val into the
2908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  bitstream.  If the total bytes (u4_strm_buf_offset) exceeds max
2918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  available size (u4_max_strm_size), returns error without corrupting data
2928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  beyond it
2938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
2948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @param[in]    ps_bitstrm
2958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  pointer to bitstream context (handle)
2968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
2978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @param[in]    u4_code_val
2988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  code value that needs to be inserted in the stream.
2998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
3008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @param[in]    code_len
3018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  indicates code length (in bits) of code_val that would be inserted in
3028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  bitstream buffer size.
3038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
3048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @remarks     Assumptions: all bits from bit position code_len to msb of
3058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*   code_val shall be zero
3068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
3078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @return      success or failure error code
3088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
3098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S******************************************************************************
3108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*/
3118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha SIH264E_ERROR_T    ih264e_put_bits
3128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        (
3138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            bitstrm_t   *ps_bitstrm,
3148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            UWORD32     u4_code_val,
3158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            WORD32      code_len
3168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        );
3178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/**
3198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S******************************************************************************
3208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
3218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @brief inserts a 1-bit code into the bitstream
3228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
3238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @par   Description
3248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  inserts 1bit lsb of code_val into the bitstream
3258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  updates context members like u4_cur_word, u4_strm_buf_offset and
3268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  i4_bits_left_in_cw. If the total words (u4_strm_buf_offset) exceeds max
3278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  available size (u4_max_strm_size), returns error without corrupting data
3288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  beyond it
3298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
3308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @param[in]    ps_bitstrm
3318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  pointer to bitstream context (handle)
3328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
3338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @param[in]    u4_code_val
3348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  code value that needs to be inserted in the stream.
3358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
3368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @remarks     Assumptions: all bits from bit position 1 to msb of code_val
3378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  shall be zero
3388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
3398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @return      success or failure error code
3408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
3418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S******************************************************************************
3428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*/
3438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha SIH264E_ERROR_T    ih264e_put_bit
3448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        (
3458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            bitstrm_t   *ps_bitstrm,
3468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            UWORD32     u4_code_val
3478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        );
3488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/**
3508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S******************************************************************************
3518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
3528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @brief inserts rbsp trailing bits at the end of stream buffer (NAL)
3538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
3548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @par   Description
3558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  inserts rbsp trailing bits, updates context members like u4_cur_word and
3568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  i4_bits_left_in_cw and flushes the same in the bitstream buffer. If the
3578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  total words (u4_strm_buf_offset) exceeds max available size
3588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  (u4_max_strm_size), returns error without corrupting data beyond it
3598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
3608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @param[in]    ps_bitstrm
3618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  pointer to bitstream context (handle)
3628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
3638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @return      success or failure error code
3648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
3658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S******************************************************************************
3668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*/
3678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha SIH264E_ERROR_T    ih264e_put_rbsp_trailing_bits
3688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        (
3698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            bitstrm_t   *ps_bitstrm
3708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        );
3718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/**
3738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S******************************************************************************
3748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
3758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @brief puts exponential golomb code of a unsigned integer into bitstream
3768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
3778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @par   Description
3788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  computes uev code for given syntax element and inserts the same into
3798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  bitstream by calling ih264e_put_bits() interface.
3808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
3818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @param[in]    ps_bitstrm
3828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  pointer to bitstream context (handle)
3838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
3848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @param[in]    u4_code_num
3858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  unsigned integer input whose golomb code is written in stream
3868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
3878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @remarks     Assumptions: code value can be represented in less than 16bits
3888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
3898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @return      success or failure error code
3908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
3918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S******************************************************************************
3928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*/
3938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha SIH264E_ERROR_T    ih264e_put_uev
3948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        (
3958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            bitstrm_t   *ps_bitstrm,
3968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            UWORD32     u4_code_num
3978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        );
3988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
3998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/**
4008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S******************************************************************************
4018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
4028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @brief puts exponential golomb code of a signed integer into bitstream
4038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
4048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @par   Description
4058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  computes sev code for given syntax element and inserts the same into
4068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  bitstream by calling ih264e_put_bits() interface.
4078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
4088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @param[in]    ps_bitstrm
4098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  pointer to bitstream context (handle)
4108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
4118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @param[in]    syntax_elem
4128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  signed integer input whose golomb code is written in stream
4138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
4148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @remarks     Assumptions: code value can be represented in less than 16bits
4158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
4168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @return      success or failure error code
4178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
4188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S******************************************************************************
4198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*/
4208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha SIH264E_ERROR_T    ih264e_put_sev
4218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        (
4228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            bitstrm_t   *ps_bitstrm,
4238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            WORD32      syntax_elem
4248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        );
4258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
4268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/**
4278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S******************************************************************************
4288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
4298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @brief insert NAL start code prefix (0x000001) into bitstream with an option
4308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  of inserting leading_zero_8bits (which makes startcode prefix as 0x00000001)
4318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
4328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @par   Description
4338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  Although start code prefix could have been put by calling ih264e_put_bits(),
4348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  ih264e_put_nal_start_code_prefix() is specially added to make sure emulation
4358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  prevention insertion is not done for the NAL start code prefix which will
4368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  surely happen otherwise by calling ih264e_put_bits() interface.
4378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
4388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @param[in]    ps_bitstrm
4398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  pointer to bitstream context (handle)
4408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
4418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @param[in]    insert_leading_zero_8bits
4428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  flag indicating if one more zero bytes needs to prefixed before start code
4438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
4448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*  @return      success or failure error code
4458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*
4468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S******************************************************************************
4478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*/
4488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha SIH264E_ERROR_T    ih264e_put_nal_start_code_prefix
4498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        (
4508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            bitstrm_t   *ps_bitstrm,
4518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S            WORD32      insert_leading_zero_8bits
4528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S        );
4538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S
4548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#endif /* IH264E_BITSTREAM_H_ */
455