blob: 5b5c70087ec908024a950c4291255295acef1bd2 [file] [log] [blame]
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301/******************************************************************************
2 *
3 * Copyright (C) 2015 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 *****************************************************************************
18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*/
20
21/**
22*******************************************************************************
23* @file
24* ih264e_bitstream.h
25*
26* @brief
27* This file contains encoder bitstream engine related structures and
28* interface prototypes
29*
30* @author
31* ittiam
32*
33* @remarks
34* none
35*
36*******************************************************************************
37*/
38
39#ifndef IH264E_BITSTREAM_H_
40#define IH264E_BITSTREAM_H_
41
42/*****************************************************************************/
43/* Constant Macros */
44/*****************************************************************************/
45
46/**
47******************************************************************************
48 * @brief defines the maximum number of bits in a bitstream word
49******************************************************************************
50 */
51#define WORD_SIZE 32
52
53/**
54******************************************************************************
55 * @brief The number of consecutive zero bytes for emulation prevention check
56******************************************************************************
57 */
58#define EPB_ZERO_BYTES 2
59
60/**
61******************************************************************************
62 * @brief Emulation prevention insertion byte
63******************************************************************************
64 */
65#define EPB_BYTE 0x03
66
67
Harinarayanan K K134291e2015-06-18 16:03:38 +053068/**
69******************************************************************************
70 * @brief Stream buffer allocated per frame should be atleast MIN_STREAM_SIZE
71******************************************************************************
72 */
Harinarayanan K Kd2d469e2015-06-19 14:45:44 +053073#define MIN_STREAM_SIZE 0x800
Harinarayanan K K134291e2015-06-18 16:03:38 +053074
75
Hamsalekha S8d3d3032015-03-13 21:24:58 +053076/*****************************************************************************/
77/* Function Macros */
78/*****************************************************************************/
79
80/**
81******************************************************************************
82 * @brief Macro to check if emulation prevention byte insertion is required
83******************************************************************************
84 */
85#define INSERT_EPB(zero_run, next_byte) \
86 ((zero_run) == EPB_ZERO_BYTES) && (0 == ((next_byte) & 0xFC))
87
88/**
89******************************************************************************
90 * @brief returns the bit position of a leading 1 (msb) in a code value
91******************************************************************************
92 */
93#if !MSVC
94#define GETRANGE(r,value) \
95{ \
96 r = 0; \
97 if(0 == value) \
98 r = 1; \
99 else \
100 { \
101 r = 32-CLZ(value); \
102 }\
103}
104#else
105#define GETRANGE(r,value) \
106{ \
107 unsigned long msb_one_bit = 0; \
108 r = _BitScanReverse(&msb_one_bit, value) ? (UWORD32)(msb_one_bit + 1) : 1 ; \
109}
110#endif
111
112/**
113******************************************************************************
114 * @brief returns bits required to code a value
115******************************************************************************
116 */
Harinarayanan K K134291e2015-06-18 16:03:38 +0530117#define UE_LENGTH(bits,x) \
118{ \
119 UWORD32 r_bit; \
120 GETRANGE(r_bit,x+1) \
121 bits =(((r_bit - 1) << 1)+1);\
122} \
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530123
124/**
125******************************************************************************
126 * @brief Inserts 1 byte and Emulation Prevention Byte(if any) into bitstream
127 * Increments the stream offset and zero run correspondingly
128******************************************************************************
129 */
130#define PUTBYTE_EPB(ptr,off,byte,zero_run) \
131{ \
132 if( INSERT_EPB(zero_run, byte) ) \
133 { \
134 ptr[off] = EPB_BYTE; \
135 off++; \
136 zero_run = 0; \
137 } \
138 \
139 ptr[off] = byte; \
140 off++; \
141 zero_run = byte ? 0 : zero_run+1; \
142} \
143
144/**
145******************************************************************************
146 * @brief Ensures Byte alignment of the slice header
147******************************************************************************
148 */
149#define BYTE_ALIGNMENT(ps_bitstrm) ih264e_put_rbsp_trailing_bits(ps_bitstrm)
150
Harinarayanan K K134291e2015-06-18 16:03:38 +0530151/**
152******************************************************************************
153 * @brief Gets number of bits coded
154******************************************************************************
155 */
156
157#define GET_NUM_BITS(ps_bitstream) ((ps_bitstream->u4_strm_buf_offset << 3) \
158 + 32 - ps_bitstream->i4_bits_left_in_cw);
159
160
161
162/**
163******************************************************************************
164 * @macro Align bitstream to byte - Remainig bits are filled with '1'
165******************************************************************************
166*/
167#define BITSTREAM_BYTE_ALIGN(ps_bitstrm) \
168 if (ps_bitstrm->i4_bits_left_in_cw & 0x07) \
169 { \
170 const WORD32 len = (WORD32)((ps_bitstrm->i4_bits_left_in_cw) & 0x07);\
171 ih264e_put_bits(ps_bitstrm, (UWORD32)((1 << len) - 1), len); \
Neelkamal Semwal10910bf2021-03-10 10:03:39 +0530172 } \
Harinarayanan K K134291e2015-06-18 16:03:38 +0530173
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530174
175/*****************************************************************************/
176/* Structures */
177/*****************************************************************************/
178
179/**
180******************************************************************************
181 * @brief Bitstream context for encoder
182******************************************************************************
183 */
184typedef struct bitstrm
185{
186 /** points to start of stream buffer. */
187 UWORD8 *pu1_strm_buffer;
188
189 /**
190 * max bitstream size (in bytes).
191 * Encoded stream shall not exceed this size.
192 */
193 UWORD32 u4_max_strm_size;
194
195 /**
196 * byte offset (w.r.t pu1_strm_buffer) where next byte would be written
197 * Bitstream engine makes sure it would not corrupt data beyond
198 * u4_max_strm_size bytes
199 */
200 UWORD32 u4_strm_buf_offset;
201
202 /**
203 * current bitstream word; It is a scratch word containing max of
204 * WORD_SIZE bits. Will be copied to stream buffer when the word is
205 * full
206 */
207 UWORD32 u4_cur_word;
208
209 /**
210 * signifies number of bits available in u4_cur_word
211 * bits from msb to i4_bits_left_in_cw of u4_cur_word have already been
212 * inserted next bits would be inserted from pos [i4_bits_left_in_cw-1]
213 * Range of this variable [1 : WORD_SIZE]
214 */
215 WORD32 i4_bits_left_in_cw;
216
217 /**
218 * signifies the number of consecutive zero bytes propogated from previous
219 * word. It is used for emulation prevention byte insertion in the stream
220 */
221 WORD32 i4_zero_bytes_run;
222
223} bitstrm_t;
224
225
Neelkamal Semwal10910bf2021-03-10 10:03:39 +0530226/**
227******************************************************************************
228* @brief Inserts 1 byte and Emulation Prevention Byte(if any) into bitstream
229* Increments the stream offset and zero run correspondingly
230******************************************************************************
231*/
232static inline IH264E_ERROR_T ih264e_put_byte_epb(bitstrm_t *ps_bitstrm, UWORD8 byte)
233{
234 if (INSERT_EPB(ps_bitstrm->i4_zero_bytes_run, byte))
235 {
236 if ((ps_bitstrm->u4_strm_buf_offset + 1) >= ps_bitstrm->u4_max_strm_size)
237 {
238 return IH264E_BITSTREAM_BUFFER_OVERFLOW;
239 }
240 ps_bitstrm->pu1_strm_buffer[ps_bitstrm->u4_strm_buf_offset++] = EPB_BYTE;
241 ps_bitstrm->i4_zero_bytes_run = 0;
242 }
243
244 if ((ps_bitstrm->u4_strm_buf_offset + 1) >= ps_bitstrm->u4_max_strm_size)
245 {
246 return IH264E_BITSTREAM_BUFFER_OVERFLOW;
247 }
248 ps_bitstrm->pu1_strm_buffer[ps_bitstrm->u4_strm_buf_offset++] = byte;
249 ps_bitstrm->i4_zero_bytes_run = byte ? 0 : ps_bitstrm->i4_zero_bytes_run + 1;
250
251 return IH264E_SUCCESS;
252}
253
254/**
255******************************************************************************
256* flush the bits in cur word byte by byte and copy to stream *
257* (current word is assumed to be byte aligned) *
258******************************************************************************
259*/
260#define BITSTREAM_FLUSH(ps_bitstrm, err) \
261{ \
262 WORD32 i; \
263 for (i = WORD_SIZE; i > ps_bitstrm->i4_bits_left_in_cw; i -= 8) \
264 { \
265 UWORD8 u1_next_byte = (ps_bitstrm->u4_cur_word >> (i - 8)) & 0xFF; \
266 err |= ih264e_put_byte_epb(ps_bitstrm, u1_next_byte); \
267 } \
268 ps_bitstrm->u4_cur_word = 0; \
269 ps_bitstrm->i4_bits_left_in_cw = WORD_SIZE; \
270} \
271
272
273
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530274/*****************************************************************************/
275/* Extern Function Declarations */
276/*****************************************************************************/
277
278/**
279******************************************************************************
280*
281* @brief Initializes the encoder bitstream engine
282*
283* @par Description
284* This routine needs to be called at start of slice/frame encode
285*
286* @param[in] ps_bitstrm
287* pointer to bitstream context (handle)
288*
289* @param[in] p1_bitstrm_buf
290* bitstream buffer pointer where the encoded stream is generated in byte order
291*
292* @param[in] u4_max_bitstrm_size
293* indicates maximum bitstream buffer size. (in bytes)
294* If actual stream size exceeds the maximum size, encoder should
295* 1. Not corrupt data beyond u4_max_bitstrm_size bytes
296* 2. Report an error back to application indicating overflow
297*
298* @return success or failure error code
299*
300******************************************************************************
301*/
302IH264E_ERROR_T ih264e_bitstrm_init
303 (
304 bitstrm_t *ps_bitstrm,
305 UWORD8 *pu1_bitstrm_buf,
306 UWORD32 u4_max_bitstrm_size
307 );
308
309/**
310******************************************************************************
311*
312* @brief puts a code with specified number of bits into the bitstream
313*
314* @par Description
315* inserts code_len number of bits from lsb of code_val into the
316* bitstream. If the total bytes (u4_strm_buf_offset) exceeds max
317* available size (u4_max_strm_size), returns error without corrupting data
318* beyond it
319*
320* @param[in] ps_bitstrm
321* pointer to bitstream context (handle)
322*
323* @param[in] u4_code_val
324* code value that needs to be inserted in the stream.
325*
326* @param[in] code_len
327* indicates code length (in bits) of code_val that would be inserted in
328* bitstream buffer size.
329*
330* @remarks Assumptions: all bits from bit position code_len to msb of
331* code_val shall be zero
332*
333* @return success or failure error code
334*
335******************************************************************************
336*/
337IH264E_ERROR_T ih264e_put_bits
338 (
339 bitstrm_t *ps_bitstrm,
340 UWORD32 u4_code_val,
341 WORD32 code_len
342 );
343
344/**
345******************************************************************************
346*
347* @brief inserts a 1-bit code into the bitstream
348*
349* @par Description
350* inserts 1bit lsb of code_val into the bitstream
351* updates context members like u4_cur_word, u4_strm_buf_offset and
352* i4_bits_left_in_cw. If the total words (u4_strm_buf_offset) exceeds max
353* available size (u4_max_strm_size), returns error without corrupting data
354* beyond it
355*
356* @param[in] ps_bitstrm
357* pointer to bitstream context (handle)
358*
359* @param[in] u4_code_val
360* code value that needs to be inserted in the stream.
361*
362* @remarks Assumptions: all bits from bit position 1 to msb of code_val
363* shall be zero
364*
365* @return success or failure error code
366*
367******************************************************************************
368*/
369IH264E_ERROR_T ih264e_put_bit
370 (
371 bitstrm_t *ps_bitstrm,
372 UWORD32 u4_code_val
373 );
374
375/**
376******************************************************************************
377*
378* @brief inserts rbsp trailing bits at the end of stream buffer (NAL)
379*
380* @par Description
381* inserts rbsp trailing bits, updates context members like u4_cur_word and
382* i4_bits_left_in_cw and flushes the same in the bitstream buffer. If the
383* total words (u4_strm_buf_offset) exceeds max available size
384* (u4_max_strm_size), returns error without corrupting data beyond it
385*
386* @param[in] ps_bitstrm
387* pointer to bitstream context (handle)
388*
389* @return success or failure error code
390*
391******************************************************************************
392*/
393IH264E_ERROR_T ih264e_put_rbsp_trailing_bits
394 (
395 bitstrm_t *ps_bitstrm
396 );
397
398/**
399******************************************************************************
400*
401* @brief puts exponential golomb code of a unsigned integer into bitstream
402*
403* @par Description
404* computes uev code for given syntax element and inserts the same into
405* bitstream by calling ih264e_put_bits() interface.
406*
407* @param[in] ps_bitstrm
408* pointer to bitstream context (handle)
409*
410* @param[in] u4_code_num
411* unsigned integer input whose golomb code is written in stream
412*
413* @remarks Assumptions: code value can be represented in less than 16bits
414*
415* @return success or failure error code
416*
417******************************************************************************
418*/
419IH264E_ERROR_T ih264e_put_uev
420 (
421 bitstrm_t *ps_bitstrm,
422 UWORD32 u4_code_num
423 );
424
425/**
426******************************************************************************
427*
428* @brief puts exponential golomb code of a signed integer into bitstream
429*
430* @par Description
431* computes sev code for given syntax element and inserts the same into
432* bitstream by calling ih264e_put_bits() interface.
433*
434* @param[in] ps_bitstrm
435* pointer to bitstream context (handle)
436*
437* @param[in] syntax_elem
438* signed integer input whose golomb code is written in stream
439*
440* @remarks Assumptions: code value can be represented in less than 16bits
441*
442* @return success or failure error code
443*
444******************************************************************************
445*/
446IH264E_ERROR_T ih264e_put_sev
447 (
448 bitstrm_t *ps_bitstrm,
449 WORD32 syntax_elem
450 );
451
452/**
453******************************************************************************
454*
455* @brief insert NAL start code prefix (0x000001) into bitstream with an option
456* of inserting leading_zero_8bits (which makes startcode prefix as 0x00000001)
457*
458* @par Description
459* Although start code prefix could have been put by calling ih264e_put_bits(),
460* ih264e_put_nal_start_code_prefix() is specially added to make sure emulation
461* prevention insertion is not done for the NAL start code prefix which will
462* surely happen otherwise by calling ih264e_put_bits() interface.
463*
464* @param[in] ps_bitstrm
465* pointer to bitstream context (handle)
466*
467* @param[in] insert_leading_zero_8bits
468* flag indicating if one more zero bytes needs to prefixed before start code
469*
470* @return success or failure error code
471*
472******************************************************************************
473*/
474IH264E_ERROR_T ih264e_put_nal_start_code_prefix
475 (
476 bitstrm_t *ps_bitstrm,
477 WORD32 insert_leading_zero_8bits
478 );
479
480#endif /* IH264E_BITSTREAM_H_ */