xref: /aosp_15_r20/external/libmpeg2/decoder/impeg2d_bitstream.h (revision a97c2a1f0a796dc32bed80d3353c69c5fc07c750)
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