1*a97c2a1fSXin Li /****************************************************************************** 2*a97c2a1fSXin Li * 3*a97c2a1fSXin Li * Copyright (C) 2015 The Android Open Source Project 4*a97c2a1fSXin Li * 5*a97c2a1fSXin Li * Licensed under the Apache License, Version 2.0 (the "License"); 6*a97c2a1fSXin Li * you may not use this file except in compliance with the License. 7*a97c2a1fSXin Li * You may obtain a copy of the License at: 8*a97c2a1fSXin Li * 9*a97c2a1fSXin Li * http://www.apache.org/licenses/LICENSE-2.0 10*a97c2a1fSXin Li * 11*a97c2a1fSXin Li * Unless required by applicable law or agreed to in writing, software 12*a97c2a1fSXin Li * distributed under the License is distributed on an "AS IS" BASIS, 13*a97c2a1fSXin Li * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*a97c2a1fSXin Li * See the License for the specific language governing permissions and 15*a97c2a1fSXin Li * limitations under the License. 16*a97c2a1fSXin Li * 17*a97c2a1fSXin Li ***************************************************************************** 18*a97c2a1fSXin Li * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore 19*a97c2a1fSXin Li */ 20*a97c2a1fSXin Li /*****************************************************************************/ 21*a97c2a1fSXin Li /* */ 22*a97c2a1fSXin Li /* File Name : impeg2d_bitstream.h */ 23*a97c2a1fSXin Li /* */ 24*a97c2a1fSXin Li /* Description : This file contains all the necessary examples to */ 25*a97c2a1fSXin Li /* establish a consistent use of Ittiam C coding */ 26*a97c2a1fSXin Li /* standards (based on Indian Hill C Standards) */ 27*a97c2a1fSXin Li /* */ 28*a97c2a1fSXin Li /* List of Functions : <List the functions defined in this file> */ 29*a97c2a1fSXin Li /* */ 30*a97c2a1fSXin Li /* Issues / Problems : None */ 31*a97c2a1fSXin Li /* */ 32*a97c2a1fSXin Li /* Revision History : */ 33*a97c2a1fSXin Li /* */ 34*a97c2a1fSXin Li /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 35*a97c2a1fSXin Li /* 10 01 2005 Ittiam Draft */ 36*a97c2a1fSXin Li /* */ 37*a97c2a1fSXin Li /*****************************************************************************/ 38*a97c2a1fSXin Li #ifndef __IMPEG2D_BITSTREAM_H__ 39*a97c2a1fSXin Li #define __IMPEG2D_BITSTREAM_H__ 40*a97c2a1fSXin Li 41*a97c2a1fSXin Li 42*a97c2a1fSXin Li 43*a97c2a1fSXin Li /* Structure for the stream */ 44*a97c2a1fSXin Li typedef struct _stream_t 45*a97c2a1fSXin Li { 46*a97c2a1fSXin Li void *pv_bs_buf; /* Pointer to buffer containing the 47*a97c2a1fSXin Li bitstream */ 48*a97c2a1fSXin Li 49*a97c2a1fSXin Li UWORD32 *pu4_buf_aligned; /* Pointer to the buffer after alignment correction, 50*a97c2a1fSXin Li It points to the currently usable buffer */ 51*a97c2a1fSXin Li 52*a97c2a1fSXin Li UWORD32 u4_offset; /* Offset in the buffer for the current bit */ 53*a97c2a1fSXin Li 54*a97c2a1fSXin Li UWORD32 u4_buf; /* Buffer storing the current word */ 55*a97c2a1fSXin Li 56*a97c2a1fSXin Li UWORD32 u4_buf_nxt; /* Buffer storing the next Word */ 57*a97c2a1fSXin Li 58*a97c2a1fSXin Li UWORD32 u4_max_offset; /* Max Bit stream buffer offset in bytes for error checks */ 59*a97c2a1fSXin Li } stream_t; 60*a97c2a1fSXin Li 61*a97c2a1fSXin Li #define GET_MARKER_BIT(dec,stream) \ 62*a97c2a1fSXin Li { \ 63*a97c2a1fSXin Li if (impeg2d_bit_stream_get(stream,1) != 0x1) { \ 64*a97c2a1fSXin Li /* No need to return error if marker is not present. */ \ 65*a97c2a1fSXin Li } \ 66*a97c2a1fSXin Li } 67*a97c2a1fSXin Li 68*a97c2a1fSXin Li /* Define A macro for inlining of FlushBits */ 69*a97c2a1fSXin Li #define FLUSH_BITS(u4_offset,u4_buf,u4_buf_nxt,u4_no_bits,pu4_buf_aligned) \ 70*a97c2a1fSXin Li { \ 71*a97c2a1fSXin Li UWORD32 u4_temp; \ 72*a97c2a1fSXin Li \ 73*a97c2a1fSXin Li if (((u4_offset & 0x1f) + u4_no_bits)>= 32) \ 74*a97c2a1fSXin Li { \ 75*a97c2a1fSXin Li u4_buf = u4_buf_nxt; \ 76*a97c2a1fSXin Li \ 77*a97c2a1fSXin Li u4_temp = *(pu4_buf_aligned)++; \ 78*a97c2a1fSXin Li \ 79*a97c2a1fSXin Li CONV_LE_TO_BE(u4_buf_nxt,u4_temp) \ 80*a97c2a1fSXin Li } \ 81*a97c2a1fSXin Li u4_offset += u4_no_bits; \ 82*a97c2a1fSXin Li } 83*a97c2a1fSXin Li 84*a97c2a1fSXin Li /* Macro to initialize the variables from stream */ 85*a97c2a1fSXin Li #define GET_TEMP_STREAM_DATA(u4_buf,u4_buf_nxt,u4_offset,pu4_buf_aligned,stream) \ 86*a97c2a1fSXin Li { \ 87*a97c2a1fSXin Li u4_buf = stream->u4_buf; \ 88*a97c2a1fSXin Li u4_buf_nxt = stream->u4_buf_nxt; \ 89*a97c2a1fSXin Li u4_offset = stream->u4_offset; \ 90*a97c2a1fSXin Li pu4_buf_aligned = stream->pu4_buf_aligned; \ 91*a97c2a1fSXin Li } 92*a97c2a1fSXin Li 93*a97c2a1fSXin Li /* Macro to put the stream variable values back */ 94*a97c2a1fSXin Li #define PUT_TEMP_STREAM_DATA(u4_buf,u4_buf_nxt,u4_offset,pu4_buf_aligned,stream) \ 95*a97c2a1fSXin Li { \ 96*a97c2a1fSXin Li stream->u4_buf = u4_buf; \ 97*a97c2a1fSXin Li stream->u4_buf_nxt = u4_buf_nxt; \ 98*a97c2a1fSXin Li stream->u4_offset = u4_offset; \ 99*a97c2a1fSXin Li stream->pu4_buf_aligned = pu4_buf_aligned; \ 100*a97c2a1fSXin Li } 101*a97c2a1fSXin Li 102*a97c2a1fSXin Li /* Macro to implement the get bits inline (ibits_nxt_inline) */ 103*a97c2a1fSXin Li #define IBITS_NXT(u4_buf, u4_buf_nxt, u4_offset, u4_bits, no_of_bits) \ 104*a97c2a1fSXin Li { \ 105*a97c2a1fSXin Li UWORD8 u4_bit_ptr; \ 106*a97c2a1fSXin Li UWORD32 u4_temp; \ 107*a97c2a1fSXin Li \ 108*a97c2a1fSXin Li u4_bit_ptr = u4_offset & 0x1F; \ 109*a97c2a1fSXin Li u4_bits = u4_buf << u4_bit_ptr; \ 110*a97c2a1fSXin Li \ 111*a97c2a1fSXin Li u4_bit_ptr += no_of_bits; \ 112*a97c2a1fSXin Li \ 113*a97c2a1fSXin Li if(32 < u4_bit_ptr) \ 114*a97c2a1fSXin Li { \ 115*a97c2a1fSXin Li /* Read bits from the next word if necessary */ \ 116*a97c2a1fSXin Li u4_temp = u4_buf_nxt; \ 117*a97c2a1fSXin Li u4_bit_ptr &= (BITS_IN_INT - 1); \ 118*a97c2a1fSXin Li \ 119*a97c2a1fSXin Li u4_temp = (u4_temp >> (BITS_IN_INT - u4_bit_ptr)); \ 120*a97c2a1fSXin Li \ 121*a97c2a1fSXin Li /* u4_temp consists of bits,if any that had to be read from the next word*/ \ 122*a97c2a1fSXin Li /* of the buffer.The bits read from both the words are concatenated and*/ \ 123*a97c2a1fSXin Li /* moved to the least significant positions of 'u4_bits'*/ \ 124*a97c2a1fSXin Li u4_bits = (u4_bits >> (32 - no_of_bits)) | u4_temp; \ 125*a97c2a1fSXin Li } \ 126*a97c2a1fSXin Li else \ 127*a97c2a1fSXin Li { \ 128*a97c2a1fSXin Li u4_bits = (u4_bits >> (32 - no_of_bits)); \ 129*a97c2a1fSXin Li } \ 130*a97c2a1fSXin Li } 131*a97c2a1fSXin Li 132*a97c2a1fSXin Li /* Macro to implement the get bits inline (ibits_get_inline) */ 133*a97c2a1fSXin Li #define IBITS_GET(u4_buf,u4_buf_nxt,u4_offset,u4_bits,pu4_buf_aligned,no_of_bits) \ 134*a97c2a1fSXin Li { \ 135*a97c2a1fSXin Li IBITS_NXT(u4_buf, u4_buf_nxt, u4_offset, u4_bits, no_of_bits) \ 136*a97c2a1fSXin Li FLUSH_BITS(u4_offset,u4_buf,u4_buf_nxt,no_of_bits,pu4_buf_aligned) \ 137*a97c2a1fSXin Li } 138*a97c2a1fSXin Li 139*a97c2a1fSXin Li void impeg2d_bit_stream_init(stream_t *stream, 140*a97c2a1fSXin Li UWORD8 *byteBuf, 141*a97c2a1fSXin Li UWORD32 u4_max_offset); 142*a97c2a1fSXin Li UWORD8 impeg2d_bit_stream_get_bit(stream_t *stream); 143*a97c2a1fSXin Li void impeg2d_bit_stream_flush(void* ctxt, UWORD32 NoOfBits); 144*a97c2a1fSXin Li void impeg2d_bit_stream_flush_to_byte_boundary(void* ctxt); 145*a97c2a1fSXin Li UWORD32 impeg2d_bit_stream_nxt(stream_t *stream, WORD32 NoOfBits); 146*a97c2a1fSXin Li 147*a97c2a1fSXin Li UWORD32 impeg2d_bit_stream_get(void* ctxt, UWORD32 numBits); 148*a97c2a1fSXin Li UWORD32 impeg2d_bit_stream_num_bits_read(void* ctxt); 149*a97c2a1fSXin Li 150*a97c2a1fSXin Li 151*a97c2a1fSXin Li 152*a97c2a1fSXin Li 153*a97c2a1fSXin Li 154*a97c2a1fSXin Li 155*a97c2a1fSXin Li 156*a97c2a1fSXin Li #endif /* __IMPEG2D_BITSTREAM_H__ */ 157