1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker *
3*495ae853SAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project
4*495ae853SAndroid Build Coastguard Worker *
5*495ae853SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*495ae853SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*495ae853SAndroid Build Coastguard Worker * You may obtain a copy of the License at:
8*495ae853SAndroid Build Coastguard Worker *
9*495ae853SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*495ae853SAndroid Build Coastguard Worker *
11*495ae853SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*495ae853SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*495ae853SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*495ae853SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*495ae853SAndroid Build Coastguard Worker * limitations under the License.
16*495ae853SAndroid Build Coastguard Worker *
17*495ae853SAndroid Build Coastguard Worker *****************************************************************************
18*495ae853SAndroid Build Coastguard Worker * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*495ae853SAndroid Build Coastguard Worker */
20*495ae853SAndroid Build Coastguard Worker
21*495ae853SAndroid Build Coastguard Worker /**
22*495ae853SAndroid Build Coastguard Worker *******************************************************************************
23*495ae853SAndroid Build Coastguard Worker * @file
24*495ae853SAndroid Build Coastguard Worker * ih264e_bitstream.h
25*495ae853SAndroid Build Coastguard Worker *
26*495ae853SAndroid Build Coastguard Worker * @brief
27*495ae853SAndroid Build Coastguard Worker * This file contains encoder bitstream engine related structures and
28*495ae853SAndroid Build Coastguard Worker * interface prototypes
29*495ae853SAndroid Build Coastguard Worker *
30*495ae853SAndroid Build Coastguard Worker * @author
31*495ae853SAndroid Build Coastguard Worker * ittiam
32*495ae853SAndroid Build Coastguard Worker *
33*495ae853SAndroid Build Coastguard Worker * @remarks
34*495ae853SAndroid Build Coastguard Worker * none
35*495ae853SAndroid Build Coastguard Worker *
36*495ae853SAndroid Build Coastguard Worker *******************************************************************************
37*495ae853SAndroid Build Coastguard Worker */
38*495ae853SAndroid Build Coastguard Worker
39*495ae853SAndroid Build Coastguard Worker #ifndef _IH264E_BITSTREAM_H_
40*495ae853SAndroid Build Coastguard Worker #define _IH264E_BITSTREAM_H_
41*495ae853SAndroid Build Coastguard Worker
42*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
43*495ae853SAndroid Build Coastguard Worker /* Constant Macros */
44*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
45*495ae853SAndroid Build Coastguard Worker
46*495ae853SAndroid Build Coastguard Worker /**
47*495ae853SAndroid Build Coastguard Worker ******************************************************************************
48*495ae853SAndroid Build Coastguard Worker * @brief defines the maximum number of bits in a bitstream word
49*495ae853SAndroid Build Coastguard Worker ******************************************************************************
50*495ae853SAndroid Build Coastguard Worker */
51*495ae853SAndroid Build Coastguard Worker #define WORD_SIZE 32
52*495ae853SAndroid Build Coastguard Worker
53*495ae853SAndroid Build Coastguard Worker /**
54*495ae853SAndroid Build Coastguard Worker ******************************************************************************
55*495ae853SAndroid Build Coastguard Worker * @brief The number of consecutive zero bytes for emulation prevention check
56*495ae853SAndroid Build Coastguard Worker ******************************************************************************
57*495ae853SAndroid Build Coastguard Worker */
58*495ae853SAndroid Build Coastguard Worker #define EPB_ZERO_BYTES 2
59*495ae853SAndroid Build Coastguard Worker
60*495ae853SAndroid Build Coastguard Worker /**
61*495ae853SAndroid Build Coastguard Worker ******************************************************************************
62*495ae853SAndroid Build Coastguard Worker * @brief Emulation prevention insertion byte
63*495ae853SAndroid Build Coastguard Worker ******************************************************************************
64*495ae853SAndroid Build Coastguard Worker */
65*495ae853SAndroid Build Coastguard Worker #define EPB_BYTE 0x03
66*495ae853SAndroid Build Coastguard Worker
67*495ae853SAndroid Build Coastguard Worker
68*495ae853SAndroid Build Coastguard Worker /**
69*495ae853SAndroid Build Coastguard Worker ******************************************************************************
70*495ae853SAndroid Build Coastguard Worker * @brief Stream buffer allocated per frame should be atleast MIN_STREAM_SIZE
71*495ae853SAndroid Build Coastguard Worker ******************************************************************************
72*495ae853SAndroid Build Coastguard Worker */
73*495ae853SAndroid Build Coastguard Worker #define MIN_STREAM_SIZE 0x800
74*495ae853SAndroid Build Coastguard Worker
75*495ae853SAndroid Build Coastguard Worker
76*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
77*495ae853SAndroid Build Coastguard Worker /* Function Macros */
78*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
79*495ae853SAndroid Build Coastguard Worker
80*495ae853SAndroid Build Coastguard Worker /**
81*495ae853SAndroid Build Coastguard Worker ******************************************************************************
82*495ae853SAndroid Build Coastguard Worker * @brief Macro to check if emulation prevention byte insertion is required
83*495ae853SAndroid Build Coastguard Worker ******************************************************************************
84*495ae853SAndroid Build Coastguard Worker */
85*495ae853SAndroid Build Coastguard Worker #define SHOULD_INSERT_EPB(zero_run, next_byte) \
86*495ae853SAndroid Build Coastguard Worker ((zero_run) == EPB_ZERO_BYTES) && (0 == ((next_byte) & 0xFC))
87*495ae853SAndroid Build Coastguard Worker
88*495ae853SAndroid Build Coastguard Worker /**
89*495ae853SAndroid Build Coastguard Worker ******************************************************************************
90*495ae853SAndroid Build Coastguard Worker * @brief returns the bit position of a leading 1 (msb) in a code value
91*495ae853SAndroid Build Coastguard Worker ******************************************************************************
92*495ae853SAndroid Build Coastguard Worker */
93*495ae853SAndroid Build Coastguard Worker #if !MSVC
94*495ae853SAndroid Build Coastguard Worker #define GETRANGE(r,value) \
95*495ae853SAndroid Build Coastguard Worker { \
96*495ae853SAndroid Build Coastguard Worker r = 0; \
97*495ae853SAndroid Build Coastguard Worker if(0 == value) \
98*495ae853SAndroid Build Coastguard Worker r = 1; \
99*495ae853SAndroid Build Coastguard Worker else \
100*495ae853SAndroid Build Coastguard Worker { \
101*495ae853SAndroid Build Coastguard Worker r = 32-CLZ(value); \
102*495ae853SAndroid Build Coastguard Worker }\
103*495ae853SAndroid Build Coastguard Worker }
104*495ae853SAndroid Build Coastguard Worker #else
105*495ae853SAndroid Build Coastguard Worker #define GETRANGE(r,value) \
106*495ae853SAndroid Build Coastguard Worker { \
107*495ae853SAndroid Build Coastguard Worker unsigned long msb_one_bit = 0; \
108*495ae853SAndroid Build Coastguard Worker r = _BitScanReverse(&msb_one_bit, value) ? (UWORD32)(msb_one_bit + 1) : 1 ; \
109*495ae853SAndroid Build Coastguard Worker }
110*495ae853SAndroid Build Coastguard Worker #endif
111*495ae853SAndroid Build Coastguard Worker
112*495ae853SAndroid Build Coastguard Worker /**
113*495ae853SAndroid Build Coastguard Worker ******************************************************************************
114*495ae853SAndroid Build Coastguard Worker * @brief returns bits required to code a value
115*495ae853SAndroid Build Coastguard Worker ******************************************************************************
116*495ae853SAndroid Build Coastguard Worker */
117*495ae853SAndroid Build Coastguard Worker #define UE_LENGTH(bits,x) \
118*495ae853SAndroid Build Coastguard Worker { \
119*495ae853SAndroid Build Coastguard Worker UWORD32 r_bit; \
120*495ae853SAndroid Build Coastguard Worker GETRANGE(r_bit,x+1) \
121*495ae853SAndroid Build Coastguard Worker bits =(((r_bit - 1) << 1)+1);\
122*495ae853SAndroid Build Coastguard Worker } \
123*495ae853SAndroid Build Coastguard Worker
124*495ae853SAndroid Build Coastguard Worker /**
125*495ae853SAndroid Build Coastguard Worker ******************************************************************************
126*495ae853SAndroid Build Coastguard Worker * @brief Inserts 1 byte and Emulation Prevention Byte(if any) into bitstream
127*495ae853SAndroid Build Coastguard Worker * Increments the stream offset and zero run correspondingly
128*495ae853SAndroid Build Coastguard Worker ******************************************************************************
129*495ae853SAndroid Build Coastguard Worker */
130*495ae853SAndroid Build Coastguard Worker #define PUTBYTE_EPB(ptr,off,byte,zero_run) \
131*495ae853SAndroid Build Coastguard Worker { \
132*495ae853SAndroid Build Coastguard Worker if( SHOULD_INSERT_EPB(zero_run, byte) ) \
133*495ae853SAndroid Build Coastguard Worker { \
134*495ae853SAndroid Build Coastguard Worker ptr[off] = EPB_BYTE; \
135*495ae853SAndroid Build Coastguard Worker off++; \
136*495ae853SAndroid Build Coastguard Worker zero_run = 0; \
137*495ae853SAndroid Build Coastguard Worker } \
138*495ae853SAndroid Build Coastguard Worker \
139*495ae853SAndroid Build Coastguard Worker ptr[off] = byte; \
140*495ae853SAndroid Build Coastguard Worker off++; \
141*495ae853SAndroid Build Coastguard Worker zero_run = byte ? 0 : zero_run+1; \
142*495ae853SAndroid Build Coastguard Worker } \
143*495ae853SAndroid Build Coastguard Worker
144*495ae853SAndroid Build Coastguard Worker /**
145*495ae853SAndroid Build Coastguard Worker ******************************************************************************
146*495ae853SAndroid Build Coastguard Worker * @brief Ensures Byte alignment of the slice header
147*495ae853SAndroid Build Coastguard Worker ******************************************************************************
148*495ae853SAndroid Build Coastguard Worker */
149*495ae853SAndroid Build Coastguard Worker #define BYTE_ALIGNMENT(ps_bitstrm) ih264e_put_rbsp_trailing_bits(ps_bitstrm)
150*495ae853SAndroid Build Coastguard Worker
151*495ae853SAndroid Build Coastguard Worker /**
152*495ae853SAndroid Build Coastguard Worker ******************************************************************************
153*495ae853SAndroid Build Coastguard Worker * @brief Gets number of bits coded
154*495ae853SAndroid Build Coastguard Worker ******************************************************************************
155*495ae853SAndroid Build Coastguard Worker */
156*495ae853SAndroid Build Coastguard Worker
157*495ae853SAndroid Build Coastguard Worker #define GET_NUM_BITS(ps_bitstream) ((ps_bitstream->u4_strm_buf_offset << 3) \
158*495ae853SAndroid Build Coastguard Worker + 32 - ps_bitstream->i4_bits_left_in_cw);
159*495ae853SAndroid Build Coastguard Worker
160*495ae853SAndroid Build Coastguard Worker
161*495ae853SAndroid Build Coastguard Worker
162*495ae853SAndroid Build Coastguard Worker /**
163*495ae853SAndroid Build Coastguard Worker ******************************************************************************
164*495ae853SAndroid Build Coastguard Worker * @macro Align bitstream to byte - Remainig bits are filled with '1'
165*495ae853SAndroid Build Coastguard Worker ******************************************************************************
166*495ae853SAndroid Build Coastguard Worker */
167*495ae853SAndroid Build Coastguard Worker #define BITSTREAM_BYTE_ALIGN(ps_bitstrm) \
168*495ae853SAndroid Build Coastguard Worker if (ps_bitstrm->i4_bits_left_in_cw & 0x07) \
169*495ae853SAndroid Build Coastguard Worker { \
170*495ae853SAndroid Build Coastguard Worker const WORD32 len = (WORD32)((ps_bitstrm->i4_bits_left_in_cw) & 0x07);\
171*495ae853SAndroid Build Coastguard Worker ih264e_put_bits(ps_bitstrm, (UWORD32)((1 << len) - 1), len); \
172*495ae853SAndroid Build Coastguard Worker } \
173*495ae853SAndroid Build Coastguard Worker
174*495ae853SAndroid Build Coastguard Worker
175*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
176*495ae853SAndroid Build Coastguard Worker /* Structures */
177*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
178*495ae853SAndroid Build Coastguard Worker
179*495ae853SAndroid Build Coastguard Worker /**
180*495ae853SAndroid Build Coastguard Worker ******************************************************************************
181*495ae853SAndroid Build Coastguard Worker * @brief Bitstream context for encoder
182*495ae853SAndroid Build Coastguard Worker ******************************************************************************
183*495ae853SAndroid Build Coastguard Worker */
184*495ae853SAndroid Build Coastguard Worker typedef struct bitstrm
185*495ae853SAndroid Build Coastguard Worker {
186*495ae853SAndroid Build Coastguard Worker /** points to start of stream buffer. */
187*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_strm_buffer;
188*495ae853SAndroid Build Coastguard Worker
189*495ae853SAndroid Build Coastguard Worker /**
190*495ae853SAndroid Build Coastguard Worker * max bitstream size (in bytes).
191*495ae853SAndroid Build Coastguard Worker * Encoded stream shall not exceed this size.
192*495ae853SAndroid Build Coastguard Worker */
193*495ae853SAndroid Build Coastguard Worker UWORD32 u4_max_strm_size;
194*495ae853SAndroid Build Coastguard Worker
195*495ae853SAndroid Build Coastguard Worker /**
196*495ae853SAndroid Build Coastguard Worker * byte offset (w.r.t pu1_strm_buffer) where next byte would be written
197*495ae853SAndroid Build Coastguard Worker * Bitstream engine makes sure it would not corrupt data beyond
198*495ae853SAndroid Build Coastguard Worker * u4_max_strm_size bytes
199*495ae853SAndroid Build Coastguard Worker */
200*495ae853SAndroid Build Coastguard Worker UWORD32 u4_strm_buf_offset;
201*495ae853SAndroid Build Coastguard Worker
202*495ae853SAndroid Build Coastguard Worker /**
203*495ae853SAndroid Build Coastguard Worker * current bitstream word; It is a scratch word containing max of
204*495ae853SAndroid Build Coastguard Worker * WORD_SIZE bits. Will be copied to stream buffer when the word is
205*495ae853SAndroid Build Coastguard Worker * full
206*495ae853SAndroid Build Coastguard Worker */
207*495ae853SAndroid Build Coastguard Worker UWORD32 u4_cur_word;
208*495ae853SAndroid Build Coastguard Worker
209*495ae853SAndroid Build Coastguard Worker /**
210*495ae853SAndroid Build Coastguard Worker * signifies number of bits available in u4_cur_word
211*495ae853SAndroid Build Coastguard Worker * bits from msb to i4_bits_left_in_cw of u4_cur_word have already been
212*495ae853SAndroid Build Coastguard Worker * inserted next bits would be inserted from pos [i4_bits_left_in_cw-1]
213*495ae853SAndroid Build Coastguard Worker * Range of this variable [1 : WORD_SIZE]
214*495ae853SAndroid Build Coastguard Worker */
215*495ae853SAndroid Build Coastguard Worker WORD32 i4_bits_left_in_cw;
216*495ae853SAndroid Build Coastguard Worker
217*495ae853SAndroid Build Coastguard Worker /**
218*495ae853SAndroid Build Coastguard Worker * signifies the number of consecutive zero bytes propogated from previous
219*495ae853SAndroid Build Coastguard Worker * word. It is used for emulation prevention byte insertion in the stream
220*495ae853SAndroid Build Coastguard Worker */
221*495ae853SAndroid Build Coastguard Worker WORD32 i4_zero_bytes_run;
222*495ae853SAndroid Build Coastguard Worker
223*495ae853SAndroid Build Coastguard Worker } bitstrm_t;
224*495ae853SAndroid Build Coastguard Worker
225*495ae853SAndroid Build Coastguard Worker
226*495ae853SAndroid Build Coastguard Worker /**
227*495ae853SAndroid Build Coastguard Worker ******************************************************************************
228*495ae853SAndroid Build Coastguard Worker * @brief Inserts 1 byte and Emulation Prevention Byte(if any) into bitstream
229*495ae853SAndroid Build Coastguard Worker * Increments the stream offset and zero run correspondingly
230*495ae853SAndroid Build Coastguard Worker ******************************************************************************
231*495ae853SAndroid Build Coastguard Worker */
ih264e_put_byte_epb(bitstrm_t * ps_bitstrm,UWORD8 byte)232*495ae853SAndroid Build Coastguard Worker static inline IH264E_ERROR_T ih264e_put_byte_epb(bitstrm_t *ps_bitstrm, UWORD8 byte)
233*495ae853SAndroid Build Coastguard Worker {
234*495ae853SAndroid Build Coastguard Worker if (SHOULD_INSERT_EPB(ps_bitstrm->i4_zero_bytes_run, byte))
235*495ae853SAndroid Build Coastguard Worker {
236*495ae853SAndroid Build Coastguard Worker if ((ps_bitstrm->u4_strm_buf_offset + 1) >= ps_bitstrm->u4_max_strm_size)
237*495ae853SAndroid Build Coastguard Worker {
238*495ae853SAndroid Build Coastguard Worker return IH264E_BITSTREAM_BUFFER_OVERFLOW;
239*495ae853SAndroid Build Coastguard Worker }
240*495ae853SAndroid Build Coastguard Worker ps_bitstrm->pu1_strm_buffer[ps_bitstrm->u4_strm_buf_offset++] = EPB_BYTE;
241*495ae853SAndroid Build Coastguard Worker ps_bitstrm->i4_zero_bytes_run = 0;
242*495ae853SAndroid Build Coastguard Worker }
243*495ae853SAndroid Build Coastguard Worker
244*495ae853SAndroid Build Coastguard Worker if ((ps_bitstrm->u4_strm_buf_offset + 1) >= ps_bitstrm->u4_max_strm_size)
245*495ae853SAndroid Build Coastguard Worker {
246*495ae853SAndroid Build Coastguard Worker return IH264E_BITSTREAM_BUFFER_OVERFLOW;
247*495ae853SAndroid Build Coastguard Worker }
248*495ae853SAndroid Build Coastguard Worker ps_bitstrm->pu1_strm_buffer[ps_bitstrm->u4_strm_buf_offset++] = byte;
249*495ae853SAndroid Build Coastguard Worker ps_bitstrm->i4_zero_bytes_run = byte ? 0 : ps_bitstrm->i4_zero_bytes_run + 1;
250*495ae853SAndroid Build Coastguard Worker
251*495ae853SAndroid Build Coastguard Worker return IH264E_SUCCESS;
252*495ae853SAndroid Build Coastguard Worker }
253*495ae853SAndroid Build Coastguard Worker
254*495ae853SAndroid Build Coastguard Worker /**
255*495ae853SAndroid Build Coastguard Worker ******************************************************************************
256*495ae853SAndroid Build Coastguard Worker * flush the bits in cur word byte by byte and copy to stream *
257*495ae853SAndroid Build Coastguard Worker * (current word is assumed to be byte aligned) *
258*495ae853SAndroid Build Coastguard Worker ******************************************************************************
259*495ae853SAndroid Build Coastguard Worker */
260*495ae853SAndroid Build Coastguard Worker #define BITSTREAM_FLUSH(ps_bitstrm, err) \
261*495ae853SAndroid Build Coastguard Worker { \
262*495ae853SAndroid Build Coastguard Worker WORD32 i; \
263*495ae853SAndroid Build Coastguard Worker for (i = WORD_SIZE; i > ps_bitstrm->i4_bits_left_in_cw; i -= 8) \
264*495ae853SAndroid Build Coastguard Worker { \
265*495ae853SAndroid Build Coastguard Worker UWORD8 u1_next_byte = (ps_bitstrm->u4_cur_word >> (i - 8)) & 0xFF; \
266*495ae853SAndroid Build Coastguard Worker err |= ih264e_put_byte_epb(ps_bitstrm, u1_next_byte); \
267*495ae853SAndroid Build Coastguard Worker } \
268*495ae853SAndroid Build Coastguard Worker if (err == IH264E_SUCCESS) { \
269*495ae853SAndroid Build Coastguard Worker ps_bitstrm->u4_cur_word = 0; \
270*495ae853SAndroid Build Coastguard Worker ps_bitstrm->i4_bits_left_in_cw = WORD_SIZE; \
271*495ae853SAndroid Build Coastguard Worker } \
272*495ae853SAndroid Build Coastguard Worker }
273*495ae853SAndroid Build Coastguard Worker
274*495ae853SAndroid Build Coastguard Worker
275*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
276*495ae853SAndroid Build Coastguard Worker /* Function Declarations */
277*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
278*495ae853SAndroid Build Coastguard Worker
279*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T ih264e_bitstrm_init(bitstrm_t *ps_bitstrm,
280*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_bitstrm_buf,
281*495ae853SAndroid Build Coastguard Worker UWORD32 u4_max_bitstrm_size);
282*495ae853SAndroid Build Coastguard Worker
283*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T ih264e_put_bits(bitstrm_t *ps_bitstrm, UWORD32 u4_code_val,
284*495ae853SAndroid Build Coastguard Worker WORD32 code_len);
285*495ae853SAndroid Build Coastguard Worker
286*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T ih264e_put_bit(bitstrm_t *ps_bitstrm, UWORD32 u4_code_val);
287*495ae853SAndroid Build Coastguard Worker
288*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T ih264e_put_rbsp_trailing_bits(bitstrm_t *ps_bitstrm);
289*495ae853SAndroid Build Coastguard Worker
290*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T ih264e_put_uev(bitstrm_t *ps_bitstrm, UWORD32 u4_code_num);
291*495ae853SAndroid Build Coastguard Worker
292*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T ih264e_put_sev(bitstrm_t *ps_bitstrm, WORD32 syntax_elem);
293*495ae853SAndroid Build Coastguard Worker
294*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T ih264e_put_nal_start_code_prefix(bitstrm_t *ps_bitstrm,
295*495ae853SAndroid Build Coastguard Worker WORD32 insert_leading_zero_8bits);
296*495ae853SAndroid Build Coastguard Worker
297*495ae853SAndroid Build Coastguard Worker #endif /* _IH264E_BITSTREAM_H_ */
298