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