summaryrefslogtreecommitdiff
path: root/decoder/impeg2d_bitstream.h
blob: 4ce4013eb9dcb21719279a82254e869a55eed9a4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/******************************************************************************
 *
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *****************************************************************************
 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
*/
/*****************************************************************************/
/*                                                                           */
/*  File Name         : impeg2d_bitstream.h                                       */
/*                                                                           */
/*  Description       : This file contains all the necessary examples to     */
/*                      establish a consistent use of Ittiam C coding        */
/*                      standards (based on Indian Hill C Standards)         */
/*                                                                           */
/*  List of Functions : <List the functions defined in this file>            */
/*                                                                           */
/*  Issues / Problems : None                                                 */
/*                                                                           */
/*  Revision History  :                                                      */
/*                                                                           */
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
/*         10 01 2005   Ittiam          Draft                                */
/*                                                                           */
/*****************************************************************************/
#ifndef __IMPEG2D_BITSTREAM_H__
#define __IMPEG2D_BITSTREAM_H__



/* Structure for the stream */
typedef struct _stream_t
{
    void    *pv_bs_buf;               /* Pointer to buffer containing the
                                        bitstream                    */

    UWORD32  *pu4_buf_aligned;         /* Pointer to the buffer after alignment correction,
                                         It points to the currently usable buffer */

    UWORD32  u4_offset;                  /* Offset in the buffer for the current bit */

    UWORD32  u4_buf;                  /* Buffer storing the current word */

    UWORD32  u4_buf_nxt;              /* Buffer storing the next Word */

    UWORD32  u4_max_offset;            /* Max Bit stream buffer offset in bytes for error checks */
} stream_t;

#define GET_MARKER_BIT(dec,stream)                                             \
{                                                                              \
    if (impeg2d_bit_stream_get(stream,1) != 0x1) {                             \
    /* No need to return error if marker is not present. */                    \
    }                                                                          \
}

/* Define A macro for inlining of FlushBits */
#define     FLUSH_BITS(u4_offset,u4_buf,u4_buf_nxt,u4_no_bits,pu4_buf_aligned) \
{                                                                              \
        UWORD32     u4_temp;                                                   \
                                                                               \
        if (((u4_offset & 0x1f) + u4_no_bits)>= 32)                            \
        {                                                                      \
            u4_buf              = u4_buf_nxt;                                  \
                                                                               \
            u4_temp             = *(pu4_buf_aligned)++;                        \
                                                                               \
            CONV_LE_TO_BE(u4_buf_nxt,u4_temp)                                  \
        }                                                                      \
        u4_offset               += u4_no_bits;                                 \
}

/* Macro to initialize the variables from stream */
#define GET_TEMP_STREAM_DATA(u4_buf,u4_buf_nxt,u4_offset,pu4_buf_aligned,stream)    \
{                                                                                   \
    u4_buf = stream->u4_buf;                                                        \
    u4_buf_nxt = stream->u4_buf_nxt;                                                \
    u4_offset = stream->u4_offset;                                                     \
    pu4_buf_aligned = stream->pu4_buf_aligned;                                      \
}

/* Macro to put the stream variable values back */
#define PUT_TEMP_STREAM_DATA(u4_buf,u4_buf_nxt,u4_offset,pu4_buf_aligned,stream)    \
{                                                                                   \
    stream->u4_buf = u4_buf;                                                        \
    stream->u4_buf_nxt = u4_buf_nxt;                                                \
    stream->u4_offset = u4_offset;                                                     \
    stream->pu4_buf_aligned = pu4_buf_aligned;                                      \
}

/* Macro to implement the get bits inline (ibits_nxt_inline) */
#define IBITS_NXT(u4_buf, u4_buf_nxt, u4_offset, u4_bits, no_of_bits)              \
{                                                                                   \
    UWORD8 u4_bit_ptr;                                                              \
    UWORD32 u4_temp;                                                                \
                                                                                    \
    u4_bit_ptr  = u4_offset & 0x1F;                                                 \
    u4_bits     = u4_buf << u4_bit_ptr;                                             \
                                                                                    \
    u4_bit_ptr  += no_of_bits;                                                      \
                                                                                    \
    if(32 < u4_bit_ptr)                                                             \
    {                                                                               \
        /*  Read bits from the next word if necessary */                            \
        u4_temp     = u4_buf_nxt;                                           \
        u4_bit_ptr  &= (BITS_IN_INT - 1);                                           \
                                                                                    \
        u4_temp     = (u4_temp >> (BITS_IN_INT - u4_bit_ptr));                      \
                                                                                    \
    /* u4_temp consists of bits,if any that had to be read from the next word*/     \
    /* of the buffer.The bits read from both the words are concatenated and*/       \
    /* moved to the least significant positions of 'u4_bits'*/                      \
            u4_bits = (u4_bits >> (32 - no_of_bits)) | u4_temp;                     \
        }                                                                           \
        else                                                                        \
        {                                                                           \
            u4_bits = (u4_bits >> (32 - no_of_bits));                               \
        }                                                                           \
}

/* Macro to implement the get bits inline (ibits_get_inline) */
#define IBITS_GET(u4_buf,u4_buf_nxt,u4_offset,u4_bits,pu4_buf_aligned,no_of_bits)   \
{                                                                                   \
    IBITS_NXT(u4_buf, u4_buf_nxt, u4_offset, u4_bits, no_of_bits)                   \
    FLUSH_BITS(u4_offset,u4_buf,u4_buf_nxt,no_of_bits,pu4_buf_aligned)              \
}

void impeg2d_bit_stream_init(stream_t *stream,
                             UWORD8 *byteBuf,
                             UWORD32 u4_max_offset);
INLINE UWORD8 impeg2d_bit_stream_get_bit(stream_t *stream);
INLINE void impeg2d_bit_stream_flush(void* ctxt, UWORD32 NoOfBits);
INLINE void impeg2d_bit_stream_flush_to_byte_boundary(void* ctxt);
INLINE UWORD32 impeg2d_bit_stream_nxt(stream_t *stream, WORD32 NoOfBits);

INLINE UWORD32 impeg2d_bit_stream_get(void* ctxt, UWORD32 numBits);
INLINE UWORD32 impeg2d_bit_stream_num_bits_read(void* ctxt);







#endif /* __IMPEG2D_BITSTREAM_H__ */