ih264e_encode_header.c revision 4adb9f492336cd3f6204201eac52b29166179cb4
1/******************************************************************************
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_encode_header.c
25*
26* @brief
27*  This file contains function definitions related to header encoding.
28*
29* @author
30*  ittiam
31*
32* @par List of Functions:
33*  - ih264e_generate_nal_unit_header()
34*  - ih264e_generate_sps()
35*  - ih264e_generate_pps()
36*  - ih264e_generate_slice_header()
37*  - ih264e_get_level()
38*  - ih264e_populate_sps()
39*  - ih264e_populate_pps()
40*  - ih264e_populate_slice_header()
41*  - ih264e_add_filler_nal_unit()
42*
43* @remarks
44*  None
45*
46*******************************************************************************
47*/
48
49/*****************************************************************************/
50/* File Includes                                                             */
51/*****************************************************************************/
52
53/* System include files */
54#include <stdio.h>
55#include <stddef.h>
56#include <stdlib.h>
57#include <string.h>
58#include <assert.h>
59
60/* User Include Files */
61#include "ih264_typedefs.h"
62#include "iv2.h"
63#include "ive2.h"
64#include "ih264e.h"
65#include "ithread.h"
66#include "ih264e_config.h"
67#include "ih264e_trace.h"
68#include "ih264e_error.h"
69#include "ih264e_bitstream.h"
70#include "ih264_debug.h"
71#include "ih264_defs.h"
72#include "ime_distortion_metrics.h"
73#include "ime_defs.h"
74#include "ime_structs.h"
75#include "ih264_error.h"
76#include "ih264_structs.h"
77#include "ih264_trans_quant_itrans_iquant.h"
78#include "ih264_inter_pred_filters.h"
79#include "ih264_mem_fns.h"
80#include "ih264_padding.h"
81#include "ih264_intra_pred_filters.h"
82#include "ih264_deblk_edge_filters.h"
83#include "ih264_cabac_tables.h"
84#include "ih264e_defs.h"
85#include "irc_cntrl_param.h"
86#include "irc_frame_info_collector.h"
87#include "ih264e_rate_control.h"
88#include "ih264e_cabac_structs.h"
89#include "ih264e_structs.h"
90#include "ih264e_encode_header.h"
91#include "ih264_common_tables.h"
92#include "ih264_macros.h"
93#include "ih264e_utils.h"
94
95
96/*****************************************************************************/
97/* Function Definitions                                                      */
98/*****************************************************************************/
99
100/**
101******************************************************************************
102*
103* @brief Generate nal unit header in the stream as per section 7.4.1
104*
105* @par   Description
106*  Inserts Nal unit header syntax as per section 7.4.1
107*
108* @param[inout]   ps_bitstrm
109*  pointer to bitstream context (handle)
110*
111* @param[in]   nal_unit_type
112*  nal type to be inserted
113*
114* @param[in]   nal_ref_idc
115*  nal ref idc to be inserted
116*
117* @return      success or failure error code
118*
119******************************************************************************
120*/
121static WORD32 ih264e_generate_nal_unit_header(bitstrm_t *ps_bitstrm,
122                                              WORD32 nal_unit_type,
123                                              WORD32 nal_ref_idc)
124{
125    WORD32 return_status = IH264E_SUCCESS;
126
127    /* sanity checks */
128    ASSERT((nal_unit_type > 0) && (nal_unit_type < 32));
129
130    /* forbidden_zero_bit + nal_ref_idc + nal_unit_type */
131    PUT_BITS(ps_bitstrm,
132             ((nal_ref_idc << 5) + nal_unit_type),
133             (1+2+5), /*1 forbidden zero bit + 2 nal_ref_idc + 5 nal_unit_type */
134             return_status,
135             "nal_unit_header");
136
137    return(return_status);
138}
139
140/**
141******************************************************************************
142*
143* @brief Generates SPS (Sequence Parameter Set)
144*
145* @par   Description
146*  This function generates Sequence Parameter Set header as per the spec
147*
148* @param[in]   ps_bitstrm
149*  pointer to bitstream context (handle)
150*
151* @param[in]   ps_sps
152*  pointer to structure containing SPS data
153*
154* @return      success or failure error code
155*
156******************************************************************************
157*/
158WORD32 ih264e_generate_sps(bitstrm_t *ps_bitstrm, sps_t *ps_sps)
159{
160    WORD32 return_status = IH264E_SUCCESS;
161    WORD32 i;
162    WORD8  i1_nal_unit_type = 7;
163    WORD8  i1_nal_ref_idc = 3;
164
165    /* Insert Start Code */
166    return_status |= ih264e_put_nal_start_code_prefix(ps_bitstrm, 1);
167
168    /* Insert Nal Unit Header */
169    return_status |= ih264e_generate_nal_unit_header(ps_bitstrm, i1_nal_unit_type, i1_nal_ref_idc);
170
171    /* profile_idc */
172    PUT_BITS(ps_bitstrm, ps_sps->u1_profile_idc, 8, return_status, "profile_idc");
173
174    /* constrained_set_flags */
175    PUT_BITS(ps_bitstrm, ps_sps->u1_constraint_set0_flag, 1, return_status, "constrained_set0_flag");
176    PUT_BITS(ps_bitstrm, ps_sps->u1_constraint_set1_flag, 1, return_status, "constrained_set1_flag");
177    PUT_BITS(ps_bitstrm, ps_sps->u1_constraint_set2_flag, 1, return_status, "constrained_set2_flag");
178    PUT_BITS(ps_bitstrm, ps_sps->u1_constraint_set3_flag, 1, return_status, "constrained_set3_flag");
179
180    /* reserved_zero_four_bits */
181    PUT_BITS(ps_bitstrm, 0, 4, return_status, "reserved_zero_four_bits");
182
183    /* level_idc */
184    PUT_BITS(ps_bitstrm, ps_sps->u1_level_idc, 8, return_status, "level_idc");
185
186    /* seq_parameter_set_id */
187    PUT_BITS_UEV(ps_bitstrm, ps_sps->u1_sps_id, return_status, "seq_parameter_set_id");
188
189    if (ps_sps->u1_profile_idc >= IH264_PROFILE_HIGH)
190    {
191        /* chroma_format_idc */
192        PUT_BITS_UEV(ps_bitstrm, ps_sps->u1_chroma_format_idc, return_status, "chroma_format_idc");
193
194        if (ps_sps->u1_chroma_format_idc == CHROMA_FMT_IDC_YUV444)
195        {
196            /* i1_residual_colour_transform_flag */
197            PUT_BITS(ps_bitstrm, ps_sps->i1_residual_colour_transform_flag, 1, return_status, "i1_residual_colour_transform_flag");
198        }
199
200        /* bit_depth_luma_minus8 */
201        PUT_BITS_UEV(ps_bitstrm, (ps_sps->i1_bit_depth_luma - 8), return_status, "bit_depth_luma_minus8");
202
203        /* bit_depth_chroma_minus8 */
204        PUT_BITS_UEV(ps_bitstrm, (ps_sps->i1_bit_depth_chroma - 8), return_status, "bit_depth_chroma_minus8");
205
206        /* qpprime_y_zero_transform_bypass_flag */
207        PUT_BITS(ps_bitstrm, ps_sps->i1_qpprime_y_zero_transform_bypass_flag, 1, return_status, "qpprime_y_zero_transform_bypass_flag");
208
209        /* seq_scaling_matrix_present_flag */
210        PUT_BITS(ps_bitstrm, ps_sps->i1_seq_scaling_matrix_present_flag, 1, return_status, "seq_scaling_matrix_present_flag");
211
212        /* seq_scaling_list */
213        if (ps_sps->i1_seq_scaling_matrix_present_flag)
214        {
215            /* TODO_LATER: Will be enabled once scaling list support is added */
216        }
217    }
218
219    /* log2_max_frame_num_minus4 */
220    PUT_BITS_UEV(ps_bitstrm, (ps_sps->i1_log2_max_frame_num - 4), return_status, "log2_max_frame_num_minus4");
221
222    /* pic_order_cnt_type */
223    PUT_BITS_UEV(ps_bitstrm, ps_sps->i1_pic_order_cnt_type, return_status, "pic_order_cnt_type");
224
225    if (ps_sps->i1_pic_order_cnt_type == 0)
226    {
227        /* log2_max_pic_order_cnt_lsb_minus4 */
228        PUT_BITS_UEV(ps_bitstrm, (ps_sps->i1_log2_max_pic_order_cnt_lsb - 4), return_status, "log2_max_pic_order_cnt_lsb_minus4");
229    }
230    else if (ps_sps->i1_pic_order_cnt_type == 1)
231    {
232        /* delta_pic_order_always_zero_flag */
233        PUT_BITS(ps_bitstrm, ps_sps->i1_delta_pic_order_always_zero_flag, 1, return_status, "delta_pic_order_always_zero_flag");
234
235        /* offset_for_non_ref_pic */
236        PUT_BITS_SEV(ps_bitstrm, ps_sps->i4_offset_for_non_ref_pic, return_status, "offset_for_non_ref_pic");
237
238        /* offset_for_top_to_bottom_field */
239        PUT_BITS_SEV(ps_bitstrm, ps_sps->i4_offset_for_top_to_bottom_field, return_status, "offset_for_top_to_bottom_field");
240
241        /* num_ref_frames_in_pic_order_cnt_cycle */
242        PUT_BITS_UEV(ps_bitstrm, ps_sps->u1_num_ref_frames_in_pic_order_cnt_cycle, return_status, "num_ref_frames_in_pic_order_cnt_cycle");
243
244        /* Offset for ref frame */
245        for (i=0; i<ps_sps->u1_num_ref_frames_in_pic_order_cnt_cycle; i++)
246        {
247            /* offset_for_ref_frame */
248            PUT_BITS_SEV(ps_bitstrm, ps_sps->ai4_offset_for_ref_frame[i], return_status, "offset_for_ref_frame");
249        }
250    }
251
252    /* num_ref_frames */
253    PUT_BITS_UEV(ps_bitstrm, ps_sps->u1_max_num_ref_frames, return_status, "num_ref_frames");
254
255    /* gaps_in_frame_num_value_allowed_flag */
256    PUT_BITS(ps_bitstrm, ps_sps->i1_gaps_in_frame_num_value_allowed_flag, 1, return_status, "gaps_in_frame_num_value_allowed_flag");
257
258    /* pic_width_in_mbs_minus1 */
259    PUT_BITS_UEV(ps_bitstrm, ps_sps->i2_pic_width_in_mbs_minus1, return_status, "pic_width_in_mbs_minus1");
260
261    /* pic_height_in_map_units_minus1 */
262    PUT_BITS_UEV(ps_bitstrm, ps_sps->i2_pic_height_in_map_units_minus1, return_status, "pic_height_in_map_units_minus1");
263
264    /* frame_mbs_only_flag */
265    PUT_BITS(ps_bitstrm, ps_sps->i1_frame_mbs_only_flag, 1, return_status, "frame_mbs_only_flag");
266
267    if (!ps_sps->i1_frame_mbs_only_flag)
268    {
269        /* mb_adaptive_frame_field_flag */
270        PUT_BITS(ps_bitstrm, ps_sps->i1_mb_adaptive_frame_field_flag, 1, return_status, "mb_adaptive_frame_field_flag");
271    }
272
273    /* direct_8x8_inference_flag */
274    PUT_BITS(ps_bitstrm, ps_sps->i1_direct_8x8_inference_flag, 1, return_status, "direct_8x8_inference_flag");
275
276    /* frame_cropping_flag */
277    PUT_BITS(ps_bitstrm, ps_sps->i1_frame_cropping_flag, 1, return_status, "frame_cropping_flag");
278
279    if (ps_sps->i1_frame_cropping_flag)
280    {
281        /* frame_crop_left_offset */
282        PUT_BITS_UEV(ps_bitstrm, ps_sps->i2_frame_crop_left_offset, return_status, "frame_crop_left_offset");
283
284        /* frame_crop_right_offset */
285        PUT_BITS_UEV(ps_bitstrm, ps_sps->i2_frame_crop_right_offset, return_status, "frame_crop_right_offset");
286
287        /* frame_crop_top_offset */
288        PUT_BITS_UEV(ps_bitstrm, ps_sps->i2_frame_crop_top_offset, return_status, "frame_crop_top_offset");
289
290        /* frame_crop_bottom_offset */
291        PUT_BITS_UEV(ps_bitstrm, ps_sps->i2_frame_crop_bottom_offset, return_status, "frame_crop_bottom_offset");
292    }
293
294    /* vui_parameters_present_flag */
295    PUT_BITS(ps_bitstrm, ps_sps->i1_vui_parameters_present_flag, 1, return_status, "vui_parameters_present_flag");
296
297    if (ps_sps->i1_vui_parameters_present_flag)
298    {
299        /* Add vui parameters to the bitstream */;
300    }
301
302    /* rbsp trailing bits */
303    return_status |= ih264e_put_rbsp_trailing_bits(ps_bitstrm);
304
305    return return_status;
306}
307
308/**
309******************************************************************************
310*
311* @brief Generates PPS (Picture Parameter Set)
312*
313* @par   Description
314*  Generate Picture Parameter Set as per Section 7.3.2.2
315*
316* @param[in]   ps_bitstrm
317*  pointer to bitstream context (handle)
318*
319* @param[in]   ps_pps
320*  pointer to structure containing PPS data
321*
322* @return      success or failure error code
323*
324******************************************************************************
325*/
326WORD32 ih264e_generate_pps(bitstrm_t *ps_bitstrm, pps_t *ps_pps, sps_t *ps_sps)
327{
328    WORD32 return_status = IH264E_SUCCESS;
329
330    /* Insert the NAL start code */
331    return_status |= ih264e_put_nal_start_code_prefix(ps_bitstrm, 1);
332
333    /* Insert Nal Unit Header */
334    PUT_BITS(ps_bitstrm, NAL_PPS_FIRST_BYTE, 8, return_status, "pps_header");
335
336    /* pic_parameter_set_id */
337    PUT_BITS_UEV(ps_bitstrm, ps_pps->u1_pps_id, return_status, "pic_parameter_set_id");
338
339    /* seq_parameter_set_id */
340    PUT_BITS_UEV(ps_bitstrm, ps_pps->u1_sps_id, return_status, "seq_parameter_set_id");
341
342    /* Entropy coding : 0-VLC; 1 - CABAC */
343    PUT_BITS(ps_bitstrm, ps_pps->u1_entropy_coding_mode_flag, 1, return_status, "Entropy coding : 0-VLC; 1 - CABAC");
344
345    /* Pic order present flag */
346    PUT_BITS(ps_bitstrm, ps_pps->u1_pic_order_present_flag, 1, return_status, "Pic order present flag");
347
348    /* Number of slice groups */
349    PUT_BITS_UEV(ps_bitstrm, ps_pps->u1_num_slice_groups - 1, return_status, "Number of slice groups");
350
351    if (ps_pps->u1_num_slice_groups > 1)
352    {
353        /* TODO_LATER: Currently the number of slice groups minus 1 is 0.
354         * If this is not the case, we have to add Slice group map type to the bit stream*/
355    }
356
357    /* num_ref_idx_l0_default_active_minus1 */
358    PUT_BITS_UEV(ps_bitstrm, ps_pps->i1_num_ref_idx_l0_default_active - 1, return_status, "num_ref_idx_l0_default_active_minus1");
359
360    /* num_ref_idx_l1_default_active_minus1 */
361    PUT_BITS_UEV(ps_bitstrm, ps_pps->i1_num_ref_idx_l1_default_active - 1, return_status, "num_ref_idx_l1_default_active_minus1");
362
363    /* weighted_pred_flag */
364    PUT_BITS(ps_bitstrm, ps_pps->i1_weighted_pred_flag, 1, return_status, "weighted_pred_flag");
365
366    /* weighted_bipred_flag */
367    PUT_BITS(ps_bitstrm, ps_pps->i1_weighted_bipred_idc, 2, return_status, "weighted_bipred_idc");
368
369    /* pic_init_qp_minus26 */
370    PUT_BITS_SEV(ps_bitstrm, ps_pps->i1_pic_init_qp - 26, return_status, "pic_init_qp_minus26");
371
372    /* pic_init_qs_minus26 */
373    PUT_BITS_SEV(ps_bitstrm, ps_pps->i1_pic_init_qs - 26, return_status, "pic_init_qs_minus26");
374
375    /* chroma_qp_index_offset */
376    PUT_BITS_SEV(ps_bitstrm, ps_pps->i1_chroma_qp_index_offset, return_status, "chroma_qp_index_offset");
377
378    /* deblocking_filter_control_present_flag */
379    PUT_BITS(ps_bitstrm, ps_pps->i1_deblocking_filter_control_present_flag, 1, return_status, "deblocking_filter_control_present_flag");
380
381    /* constrained_intra_pred_flag */
382    PUT_BITS(ps_bitstrm, ps_pps->i1_constrained_intra_pred_flag, 1, return_status, "constrained_intra_pred_flag");
383
384    /*redundant_pic_cnt_present_flag */
385    PUT_BITS(ps_bitstrm, ps_pps->i1_redundant_pic_cnt_present_flag, 1, return_status, "redundant_pic_cnt_present_flag");
386
387    if (ps_sps->u1_profile_idc >= IH264_PROFILE_HIGH)
388    {
389        /* transform_8x8_mode_flag */
390        PUT_BITS(ps_bitstrm, ps_pps->i1_transform_8x8_mode_flag, 1, return_status, "transform_8x8_mode_flag");
391
392        /* pic_scaling_matrix_present_flag */
393        PUT_BITS(ps_bitstrm, ps_pps->i1_pic_scaling_matrix_present_flag, 1, return_status, "pic_scaling_matrix_present_flag");
394
395        if(ps_pps->i1_pic_scaling_matrix_present_flag)
396        {
397            /* TODO_LATER: Will be enabled once scaling list support is added */
398        }
399
400        /* Second chroma QP offset */
401        PUT_BITS_SEV(ps_bitstrm, ps_pps->i1_second_chroma_qp_index_offset, return_status, "Second chroma QP offset");
402    }
403
404    return_status |= ih264e_put_rbsp_trailing_bits(ps_bitstrm);
405
406    return return_status;
407}
408
409/**
410******************************************************************************
411*
412* @brief Generates Slice Header
413*
414* @par   Description
415*  Generate Slice Header as per Section 7.3.5.1
416*
417* @param[inout]   ps_bitstrm
418*  pointer to bitstream context for generating slice header
419*
420* @param[in]   ps_slice_hdr
421*  pointer to slice header params
422*
423* @param[in]   ps_pps
424*  pointer to pps params referred by slice
425*
426* @param[in]   ps_sps
427*  pointer to sps params referred by slice
428*
429* @param[out]   ps_dup_bit_strm_ent_offset
430*  Bitstream struct to store bitstream state
431*
432* @param[out]   pu4_first_slice_start_offset
433*  first slice offset is returned
434*
435* @return      success or failure error code
436*
437******************************************************************************
438*/
439WORD32 ih264e_generate_slice_header(bitstrm_t *ps_bitstrm,
440                                    slice_header_t *ps_slice_hdr,
441                                    pps_t *ps_pps,
442                                    sps_t *ps_sps)
443{
444
445    WORD32 return_status = IH264E_SUCCESS;
446
447    /* Insert start code */
448    return_status |= ih264e_put_nal_start_code_prefix(ps_bitstrm, 1);
449
450    /* Insert Nal Unit Header */
451    return_status |= ih264e_generate_nal_unit_header(ps_bitstrm, ps_slice_hdr->i1_nal_unit_type, ps_slice_hdr->i1_nal_unit_idc);
452
453    /* first_mb_in_slice */
454    PUT_BITS_UEV(ps_bitstrm, ps_slice_hdr->u2_first_mb_in_slice, return_status, "first_mb_in_slice");
455
456    /* slice_type */
457    PUT_BITS_UEV(ps_bitstrm, ps_slice_hdr->u1_slice_type, return_status, "slice_type");
458
459    /* pic_parameter_set_id */
460    PUT_BITS_UEV(ps_bitstrm, ps_slice_hdr->u1_pps_id, return_status, "pic_parameter_set_id");
461
462    /* frame_num */
463    PUT_BITS(ps_bitstrm, ps_slice_hdr->i4_frame_num, ps_sps->i1_log2_max_frame_num, return_status, "frame_num");
464
465    if (!ps_sps->i1_frame_mbs_only_flag)
466    {
467        /* field_pic_flag */
468        PUT_BITS(ps_bitstrm, ps_slice_hdr->i1_field_pic_flag, 1, return_status, "field_pic_flag");
469
470        if(ps_slice_hdr->i1_field_pic_flag)
471        {
472            /* bottom_field_flag */
473            PUT_BITS(ps_bitstrm, ps_slice_hdr->i1_bottom_field_flag, 1, return_status, "bottom_field_flag");
474        }
475    }
476
477    if (ps_slice_hdr->i1_nal_unit_type == 5)
478    {
479        /* u2_idr_pic_id */
480        PUT_BITS_UEV(ps_bitstrm, ps_slice_hdr->u2_idr_pic_id, return_status, "u2_idr_pic_id");
481    }
482
483    if (ps_sps->i1_pic_order_cnt_type == 0)
484    {
485        /* pic_order_cnt_lsb */
486        PUT_BITS(ps_bitstrm, ps_slice_hdr->i4_pic_order_cnt_lsb, ps_sps->i1_log2_max_pic_order_cnt_lsb, return_status, "pic_order_cnt_lsb");
487
488        if(ps_pps->u1_pic_order_present_flag && !ps_slice_hdr->i1_field_pic_flag)
489        {
490            /* delta_pic_order_cnt_bottom */
491            PUT_BITS_SEV(ps_bitstrm, ps_slice_hdr->i4_delta_pic_order_cnt_bottom, return_status, "delta_pic_order_cnt_bottom");
492        }
493    }
494
495    if (ps_sps->i1_pic_order_cnt_type == 1 && !ps_sps->i1_delta_pic_order_always_zero_flag)
496    {
497        /* delta_pic_order_cnt[0] */
498        PUT_BITS_SEV(ps_bitstrm, ps_slice_hdr->ai4_delta_pic_order_cnt[0], return_status, "delta_pic_order_cnt[0]");
499
500        if (ps_pps->u1_pic_order_present_flag && !ps_slice_hdr->i1_field_pic_flag)
501        {
502            /* delta_pic_order_cnt[1] */
503            PUT_BITS_SEV(ps_bitstrm, ps_slice_hdr->ai4_delta_pic_order_cnt[1], return_status, "delta_pic_order_cnt[1]");
504        }
505    }
506
507    if (ps_pps->i1_redundant_pic_cnt_present_flag)
508    {
509        /* redundant_pic_cnt */
510        PUT_BITS_UEV(ps_bitstrm, ps_slice_hdr->u1_redundant_pic_cnt, return_status, "redundant_pic_cnt");
511    }
512
513    if (ps_slice_hdr->u1_slice_type == BSLICE)
514    {
515        /* direct_spatial_mv_pred_flag */
516        PUT_BITS(ps_bitstrm, ps_slice_hdr->u1_direct_spatial_mv_pred_flag, 1, return_status, "direct_spatial_mv_pred_flag");
517    }
518
519    if (ps_slice_hdr->u1_slice_type == PSLICE || ps_slice_hdr->u1_slice_type == SPSLICE || ps_slice_hdr->u1_slice_type == BSLICE)
520    {
521        /* num_ref_idx_active_override_flag */
522        PUT_BITS(ps_bitstrm, ps_slice_hdr->u1_num_ref_idx_active_override_flag, 1, return_status, "num_ref_idx_active_override_flag");
523
524        if (ps_slice_hdr->u1_num_ref_idx_active_override_flag)
525        {
526            /* num_ref_idx_l0_active_minus1 */
527            PUT_BITS_UEV(ps_bitstrm, ps_slice_hdr->i1_num_ref_idx_l0_active - 1, return_status, "num_ref_idx_l0_active_minus1");
528
529            if (ps_slice_hdr->u1_slice_type == BSLICE)
530            {
531                /* num_ref_idx_l1_active_minus1 */
532                PUT_BITS_UEV(ps_bitstrm, ps_slice_hdr->i1_num_ref_idx_l1_active - 1, return_status, "num_ref_idx_l1_active_minus1");
533            }
534        }
535    }
536
537    /* ref_idx_reordering */
538    /* TODO: ref_idx_reordering */
539    if ((ps_slice_hdr->u1_slice_type != ISLICE) && (ps_slice_hdr->u1_slice_type != SISLICE))
540    {
541        /* ref_pic_list_reordering_flag_l0 */
542        PUT_BITS(ps_bitstrm, ps_slice_hdr->u1_ref_idx_reordering_flag_l0, 1, return_status, "ref_pic_list_reordering_flag_l0");
543
544        if (ps_slice_hdr->u1_ref_idx_reordering_flag_l0)
545        {
546
547        }
548    }
549
550    if (ps_slice_hdr->u1_slice_type == BSLICE)
551    {
552        /* ref_pic_list_reordering_flag_l1 */
553        PUT_BITS(ps_bitstrm, ps_slice_hdr->u1_ref_idx_reordering_flag_l1, 1, return_status, "ref_pic_list_reordering_flag_l1");
554
555        if (ps_slice_hdr->u1_ref_idx_reordering_flag_l1)
556        {
557
558        }
559    }
560
561    if ((ps_pps->i1_weighted_pred_flag &&
562                    (ps_slice_hdr->u1_slice_type == PSLICE || ps_slice_hdr->u1_slice_type == SPSLICE)) ||
563                    (ps_slice_hdr->u1_slice_type == BSLICE && ps_pps->i1_weighted_bipred_idc == 1))
564    {
565        /* TODO_LATER: Currently there is no support for weighted prediction.
566         This needs to be updated when the support is added */
567    }
568
569    if (ps_slice_hdr->i1_nal_unit_idc != 0)
570    {
571        if (ps_slice_hdr->i1_nal_unit_type == 5)
572        {
573            /* no_output_of_prior_pics_flag  */
574            PUT_BITS(ps_bitstrm, ps_slice_hdr->u1_no_output_of_prior_pics_flag , 1, return_status, "no_output_of_prior_pics_flag ");
575
576            /* long_term_reference_flag  */
577            PUT_BITS(ps_bitstrm, ps_slice_hdr->u1_long_term_reference_flag , 1, return_status, "long_term_reference_flag ");
578        }
579        else
580        {
581            /* adaptive_ref_pic_marking_mode_flag  */
582            PUT_BITS(ps_bitstrm, ps_slice_hdr->u1_adaptive_ref_pic_marking_mode_flag , 1, return_status, "adaptive_ref_pic_marking_mode_flag ");
583
584            if (ps_slice_hdr->u1_adaptive_ref_pic_marking_mode_flag)
585            {
586                /* TODO: if the reference picture marking mode is adaptive
587                 add these fields in the bit-stream */
588            }
589        }
590    }
591
592    if (ps_slice_hdr->u1_entropy_coding_mode_flag && ps_slice_hdr->u1_slice_type != ISLICE &&
593                    ps_slice_hdr->u1_slice_type != SISLICE)
594    {
595        /* cabac_init_idc */
596        PUT_BITS_UEV(ps_bitstrm, ps_slice_hdr->i1_cabac_init_idc, return_status, "cabac_init_idc");
597    }
598
599    /* slice_qp_delta */
600    PUT_BITS_SEV(ps_bitstrm, ps_slice_hdr->i1_slice_qp - ps_pps->i1_pic_init_qp, return_status, "slice_qp_delta");
601
602    if (ps_slice_hdr->u1_slice_type == SPSLICE || ps_slice_hdr->u1_slice_type == SISLICE)
603    {
604        if (ps_slice_hdr->u1_slice_type == SPSLICE)
605        {
606            /* sp_for_switch_flag */
607            PUT_BITS(ps_bitstrm, ps_slice_hdr->u1_sp_for_switch_flag , 1, return_status, "sp_for_switch_flag");
608        }
609        /* slice_qs_delta */
610        PUT_BITS_SEV(ps_bitstrm, ps_slice_hdr->u1_slice_qs - ps_pps->i1_pic_init_qs, return_status, "slice_qs_delta");
611    }
612
613    if (ps_pps->i1_deblocking_filter_control_present_flag)
614    {
615        /* disable_deblocking_filter_idc */
616        PUT_BITS_UEV(ps_bitstrm, ps_slice_hdr->u1_disable_deblocking_filter_idc, return_status, "disable_deblocking_filter_idc");
617
618        if(ps_slice_hdr->u1_disable_deblocking_filter_idc != 1)
619        {
620            /* slice_alpha_c0_offset_div2 */
621            PUT_BITS_SEV(ps_bitstrm, ps_slice_hdr->i1_slice_alpha_c0_offset_div2, return_status, "slice_alpha_c0_offset_div2");
622
623            /* slice_beta_offset_div2 */
624            PUT_BITS_SEV(ps_bitstrm, ps_slice_hdr->i1_slice_beta_offset_div2, return_status, "slice_beta_offset_div2");
625        }
626    }
627
628    if (ps_slice_hdr->u1_num_slice_groups_minus1 > 0 &&
629                    ps_pps->u1_slice_group_map_type >= 3 &&
630                    ps_pps->u1_slice_group_map_type <= 5)
631    {
632        /* slice_group_change_cycle */
633        /* TODO_LATER: Currently the number of slice groups minus 1 is 0.
634         * If this is not the case, we have to add Slice group map type to the bit stream */
635    }
636
637    return return_status;
638}
639
640
641
642/**
643******************************************************************************
644*
645* @brief Populates sps structure
646*
647* @par   Description
648*  Populates sps structure for its use in header generation
649*
650* @param[in]   ps_codec
651*  pointer to encoder context
652*
653* @param[out]  ps_sps
654*  pointer to sps params that needs to be populated
655*
656* @return      success or failure error code
657*
658******************************************************************************
659*/
660IH264E_ERROR_T ih264e_populate_sps(codec_t *ps_codec, sps_t *ps_sps)
661{
662    /* active config parameters */
663    cfg_params_t    *ps_cfg = &(ps_codec->s_cfg);
664
665//    /* level */
666//    IH264_LEVEL_T   level_idc;
667
668    /* error_status */
669    IH264E_ERROR_T i4_err_code = IH264E_FAIL;
670
671    /* profile */
672    /*
673     * Baseline profile supports, 8 bits per sample, 4:2:0 format, CAVLC.
674     * B frames are not allowed. Further, Flexible mb ordering, Redundant slices, Arbitrary slice ordering are supported.
675     * The constrained baseline profile is baseline profile minus ASO, FMO and redundant slices.
676     * To the constrained baseline profile if we add support for B slices, support for encoding interlaced frames,
677     * support for weighted prediction and introduce CABAC entropy coding then we have Main Profile.
678     */
679    if ((ps_cfg->u4_num_bframes) || (ps_cfg->e_content_type != IV_PROGRESSIVE) ||
680        (ps_cfg->u4_entropy_coding_mode == CABAC) || (ps_cfg->u4_weighted_prediction))
681    {
682        ps_sps->u1_profile_idc = IH264_PROFILE_MAIN;
683    }
684    else
685    {
686        ps_sps->u1_profile_idc = IH264_PROFILE_BASELINE;
687    }
688
689    /* level */
690    ps_sps->u1_level_idc = MAX(ps_cfg->u4_max_level,
691                               (UWORD32)ih264e_get_min_level(ps_cfg->u4_max_wd, ps_cfg->u4_max_ht));
692
693    /* constrained flags */
694    /*
695     * baseline profile automatically implies set 0 flag
696     */
697    ps_sps->u1_constraint_set0_flag = (ps_sps->u1_profile_idc == IH264_PROFILE_BASELINE);
698    /*
699     * main profile automatically implies set 1 flag
700     * Although the encoder says it supports Baseline profile it actually supports constrained
701     * baseline profile as ASO, FMO and redundant slices are not supported
702     */
703    ps_sps->u1_constraint_set1_flag = (ps_sps->u1_profile_idc <= IH264_PROFILE_MAIN);
704    /*
705     * extended profile is not supported
706     */
707    ps_sps->u1_constraint_set2_flag = 0x00;
708    /*
709     * level 1b or level 11
710     */
711    if (ps_sps->u1_level_idc == IH264_LEVEL_1B)
712    {
713        ps_sps->u1_constraint_set3_flag = 0;
714        ps_sps->u1_level_idc = IH264_LEVEL_11;
715    }
716    else
717    {
718        ps_sps->u1_constraint_set3_flag = 0;
719    }
720
721    /* active sps id */
722    ps_sps->u1_sps_id = ps_codec->i4_sps_id;
723
724    if (ps_sps->u1_profile_idc >= IH264_PROFILE_HIGH)
725    {
726        /* chroma format idc */
727        ps_sps->u1_chroma_format_idc = CHROMA_FMT_IDC_YUV420;
728
729        /* residual_colour_transform_flag */
730        ps_sps->i1_residual_colour_transform_flag = 0;
731
732        /* luma bit depth 8 */
733        ps_sps->i1_bit_depth_luma = 8;
734
735        /* chroma bit depth 8 */
736        ps_sps->i1_bit_depth_chroma = 8;
737
738        /* qpprime_y_zero_transform_bypass_flag */
739        ps_sps->i1_qpprime_y_zero_transform_bypass_flag = 0;
740
741        /* seq_scaling_matrix_present_flag */
742        ps_sps->i1_seq_scaling_matrix_present_flag = 0;
743
744        if (ps_sps->i1_seq_scaling_matrix_present_flag)
745        {
746            /* TODO_LATER: Will be enabled once scaling list support is added */
747        }
748    }
749
750    /* log2_max_frame_num_minus4 */
751    ps_sps->i1_log2_max_frame_num = 16;
752
753    /* pic_order_cnt_type */
754    ps_sps->i1_pic_order_cnt_type = 2;
755
756    if (ps_codec->i4_non_ref_frames_in_stream)
757    {
758        ps_sps->i1_pic_order_cnt_type = 0;
759    }
760
761    /* log2_max_pic_order_cnt_lsb_minus4 */
762    ps_sps->i1_log2_max_pic_order_cnt_lsb = 8;
763
764    /* TODO : add support for other poc types */
765    if (ps_sps->i1_pic_order_cnt_type == 0)
766    {
767
768    }
769    else if (ps_sps->i1_pic_order_cnt_type == 1)
770    {
771
772    }
773
774    /* num_ref_frames */
775    /* TODO : Should we have a flexible num ref frames */
776    if (ps_codec->s_cfg.u4_num_bframes > 0)
777    {
778        ps_sps->u1_max_num_ref_frames = 2;
779    }
780    else
781    {
782        ps_sps->u1_max_num_ref_frames = 1;
783    }
784
785    /* gaps_in_frame_num_value_allowed_flag */
786    ps_sps->i1_gaps_in_frame_num_value_allowed_flag = 0;
787
788    /* pic width in mb - 1 */
789    ps_sps->i2_pic_width_in_mbs_minus1 = ps_cfg->i4_wd_mbs - 1;
790
791    /* pic height in mb - 1 */
792    ps_sps->i2_pic_height_in_map_units_minus1 = ps_cfg->i4_ht_mbs - 1;;
793
794    /* frame_mbs_only_flag, no support for interlace encoding */
795    ps_sps->i1_frame_mbs_only_flag = 1;
796
797    /* mb_adaptive_frame_field_flag */
798    if (ps_sps->i1_frame_mbs_only_flag == 0)
799    {
800        ps_sps->i1_mb_adaptive_frame_field_flag = 0;
801    }
802
803    /* direct_8x8_inference_flag */
804    ps_sps->i1_direct_8x8_inference_flag = 0;
805
806    /* cropping params */
807    /*NOTE : Cropping values depend on the chroma format
808     * For our case ,decoder interprets the cropping values as 2*num pixels
809     * Hence the difference in the disp width and width must be halved before sending
810     * to get the expected results
811     */
812    ps_sps->i1_frame_cropping_flag      = 0;
813    ps_sps->i2_frame_crop_left_offset   = 0;
814    ps_sps->i2_frame_crop_right_offset  = (ps_codec->s_cfg.u4_wd - ps_codec->s_cfg.u4_disp_wd)>>1;
815    ps_sps->i2_frame_crop_top_offset    = 0;
816    ps_sps->i2_frame_crop_bottom_offset = (ps_codec->s_cfg.u4_ht - ps_codec->s_cfg.u4_disp_ht)>>1;
817
818    if (ps_sps->i2_frame_crop_left_offset    ||
819                    ps_sps->i2_frame_crop_right_offset   ||
820                    ps_sps->i2_frame_crop_top_offset     ||
821                    ps_sps->i2_frame_crop_bottom_offset)
822    {
823        ps_sps->i1_frame_cropping_flag      = 1;
824    }
825
826    /* vui params */
827    ps_sps->i1_vui_parameters_present_flag = 0;
828
829    if (ps_sps->i1_vui_parameters_present_flag)
830    {
831        /* populate vui params */
832    }
833
834    return i4_err_code;
835}
836
837/**
838******************************************************************************
839*
840* @brief Populates pps structure
841*
842* @par   Description
843*  Populates pps structure for its use in header generation
844*
845* @param[in]   ps_codec
846*  pointer to encoder context
847*
848* @param[out]  ps_pps
849*  pointer to pps params that needs to be populated
850*
851* @return      success or failure error code
852*
853******************************************************************************
854*/
855IH264E_ERROR_T ih264e_populate_pps(codec_t *ps_codec, pps_t *ps_pps)
856{
857    /* active config parameters */
858    cfg_params_t    *ps_cfg = &(ps_codec->s_cfg);
859
860    /* seq_parameter_set_id */
861    ps_pps->u1_sps_id = ps_codec->i4_sps_id;
862
863    /* pic_parameter_set_id */
864    ps_pps->u1_pps_id = ps_codec->i4_pps_id;
865
866    /* entropy_coding_mode */
867    ps_pps->u1_entropy_coding_mode_flag = ps_cfg->u4_entropy_coding_mode;
868
869    /* pic_order_present_flag is unset if we don't have feilds */
870    ps_pps->u1_pic_order_present_flag = 0;
871
872    /* Currently number of slice groups supported are 1 */
873    ps_pps->u1_num_slice_groups = 1;
874
875    if (ps_pps->u1_num_slice_groups - 1)
876    {
877        /* TODO_LATER: Currently the number of slice groups minus 1 is 0.
878         * If this is not the case, we have to add Slice group map type to the bit stream*/
879    }
880
881    /* number of reference frames for list 0 */
882    /* FIXME : fix this hard coded value */
883    ps_pps->i1_num_ref_idx_l0_default_active = 1;
884
885    /* number of reference frames for list 1 */
886    ps_pps->i1_num_ref_idx_l1_default_active = 1;
887
888    /* weighted prediction for now is disabled */
889    ps_pps->i1_weighted_pred_flag = 0;
890    ps_pps->i1_weighted_bipred_idc = 0;
891
892    /* The intent is to not signal qp from pps. Rather send the same in slice headers */
893    ps_pps->i1_pic_init_qp = 0;
894
895    /* The intent is to not signal qp from pps. Rather send the same in slice headers */
896    ps_pps->i1_pic_init_qs = 0;
897
898    /* The intent is to not signal qp from pps. Rather send the same in slice headers */
899    ps_pps->i1_chroma_qp_index_offset = 0;
900
901    /* deblocking filter flags present in slice header */
902    ps_pps->i1_deblocking_filter_control_present_flag = 1;
903
904    /* constrained intra prediction */
905    ps_pps->i1_constrained_intra_pred_flag = ps_cfg->u4_constrained_intra_pred;
906
907    /* sending redundant slices is not supported for now */
908    ps_pps->i1_redundant_pic_cnt_present_flag = 0;
909
910    ps_pps->u1_slice_group_map_type = 0;
911    return IH264E_SUCCESS;
912}
913
914/**
915******************************************************************************
916*
917* @brief Populates slice header structure
918*
919* @par   Description
920*  Populates slice header structure for its use in header generation
921*
922* @param[in]  ps_proc
923*  pointer to proc context
924*
925* @param[out]  ps_slice_hdr
926*  pointer to slice header structure that needs to be populated
927*
928* @param[in]  ps_pps
929*  pointer to pps params structure referred by the slice
930*
931* @param[in]   ps_sps
932*  pointer to sps params referred by the pps
933*
934* @return      success or failure error code
935*
936******************************************************************************
937*/
938WORD32 ih264e_populate_slice_header(process_ctxt_t *ps_proc,
939                                    slice_header_t *ps_slice_hdr,
940                                    pps_t *ps_pps,
941                                    sps_t *ps_sps)
942{
943    /* entropy context */
944    entropy_ctxt_t *ps_entropy = &ps_proc->s_entropy;
945
946    codec_t *ps_codec = ps_proc->ps_codec;
947
948    if (ps_proc->ps_codec->u4_is_curr_frm_ref)
949    {
950        ps_slice_hdr->i1_nal_unit_idc = 3;
951    }
952    else
953    {
954        ps_slice_hdr->i1_nal_unit_idc = 0;
955    }
956
957    /* start mb address */
958    ps_slice_hdr->u2_first_mb_in_slice = ps_entropy->i4_mb_start_add;
959
960    /* slice type */
961    ps_slice_hdr->u1_slice_type = ps_proc->i4_slice_type;
962
963    /* pic_parameter_set_id */
964    ps_slice_hdr->u1_pps_id = ps_pps->u1_pps_id;
965
966    /* Separate color plane flag is 0,
967     * hence the syntax element color_plane_id not included */
968
969    /* frame num */
970    ps_slice_hdr->i4_frame_num = ps_proc->i4_frame_num;
971
972    /* frame_mbs_only_flag, no support for interlace encoding */
973    if (!ps_sps->i1_frame_mbs_only_flag)
974    {
975        ps_slice_hdr->i1_field_pic_flag = 0;
976
977        if (ps_slice_hdr->i1_field_pic_flag)
978        {
979            ps_slice_hdr->i1_bottom_field_flag = 0;
980        }
981    }
982
983    /* idr pic id */
984    if (ps_proc->u4_is_idr)
985    {
986        ps_slice_hdr->u2_idr_pic_id = ps_proc->u4_idr_pic_id;
987        ps_slice_hdr->i1_nal_unit_type = 5;
988    }
989    else
990    {
991        ps_slice_hdr->i1_nal_unit_type = 1;
992    }
993
994    if (ps_sps->i1_pic_order_cnt_type == 0)
995    {
996
997        WORD32 i4_poc;
998        i4_poc = ps_codec->i4_poc;
999        i4_poc %= (1 << ps_sps->i1_log2_max_pic_order_cnt_lsb);
1000        ps_slice_hdr->i4_pic_order_cnt_lsb = i4_poc;
1001    }
1002    /* TODO add support for poc type 1 */
1003    else if (ps_sps->i1_pic_order_cnt_type == 1)
1004    {
1005
1006    }
1007
1008
1009    /*
1010     * redundant slices are not currently supported.
1011     * Hence the syntax element redundant slice cnt is not initialized
1012     */
1013    if (ps_pps->i1_redundant_pic_cnt_present_flag)
1014    {
1015
1016    }
1017
1018    /* direct spatial mv pred flag */
1019    if (ps_proc->i4_slice_type == BSLICE)
1020    {
1021        ps_slice_hdr->u1_direct_spatial_mv_pred_flag = 1;
1022    }
1023
1024    if (ps_proc->i4_slice_type == PSLICE || ps_proc->i4_slice_type == SPSLICE || ps_proc->i4_slice_type == BSLICE)
1025    {
1026        /* num_ref_idx_active_override_flag */
1027        ps_slice_hdr->u1_num_ref_idx_active_override_flag = 0;
1028
1029        if (ps_slice_hdr->u1_num_ref_idx_active_override_flag)
1030        {
1031            /* num_ref_idx_l0_active_minus1 */
1032
1033            if (ps_proc->i4_slice_type == BSLICE)
1034            {
1035                /* num_ref_idx_l1_active_minus1 */
1036
1037            }
1038        }
1039    }
1040
1041    /* ref_idx_reordering */
1042    /* TODO: ref_idx_reordering */
1043    if ((ps_proc->i4_slice_type != ISLICE) && (ps_proc->i4_slice_type != SISLICE))
1044    {
1045        /* ref_pic_list_reordering_flag_l0 */
1046        ps_slice_hdr->u1_ref_idx_reordering_flag_l0 = 0;
1047
1048        if (ps_slice_hdr->u1_ref_idx_reordering_flag_l0)
1049        {
1050
1051        }
1052
1053        /* ref_pic_list_reordering_flag_l1 */
1054        ps_slice_hdr->u1_ref_idx_reordering_flag_l1 = 0;
1055
1056        if (ps_slice_hdr->u1_ref_idx_reordering_flag_l1)
1057        {
1058
1059        }
1060    }
1061
1062
1063    /* Currently we do not support weighted pred */
1064    /* ps_slice_hdr->u1_weighted_bipred_idc = 0; */
1065
1066    if ((ps_pps->i1_weighted_pred_flag &&
1067                    (ps_proc->i4_slice_type == PSLICE || ps_proc->i4_slice_type == SPSLICE)) ||
1068                    (ps_proc->i4_slice_type == BSLICE && ps_pps->i1_weighted_bipred_idc == 1))
1069    {
1070        /* TODO_LATER: Currently there is no support for weighted prediction.
1071             This needs to be updated when the support is added */
1072    }
1073
1074    if (ps_slice_hdr->i1_nal_unit_idc != 0)
1075    {
1076        if (ps_slice_hdr->i1_nal_unit_type == 5)
1077        {
1078            /* no_output_of_prior_pics_flag  */
1079            ps_slice_hdr->u1_no_output_of_prior_pics_flag = 0;
1080
1081            /* long_term_reference_flag  */
1082            ps_slice_hdr->u1_long_term_reference_flag = 0;
1083        }
1084        else
1085        {
1086            /* adaptive_ref_pic_marking_mode_flag  */
1087            ps_slice_hdr->u1_adaptive_ref_pic_marking_mode_flag = 0;
1088
1089            if (ps_slice_hdr->u1_adaptive_ref_pic_marking_mode_flag)
1090            {
1091                /* TODO: if the reference picture marking mode is adaptive
1092                     add these fields in the bit-stream */
1093            }
1094        }
1095    }
1096
1097    /* entropy coding mode flag */
1098    ps_slice_hdr->u1_entropy_coding_mode_flag = ps_entropy->u1_entropy_coding_mode_flag;
1099
1100    if (ps_slice_hdr->u1_entropy_coding_mode_flag && ps_proc->i4_slice_type != ISLICE &&
1101                    ps_proc->i4_slice_type != SISLICE)
1102    {
1103        /* cabac_init_idc */
1104    }
1105
1106    /* slice qp */
1107    ps_slice_hdr->i1_slice_qp = ps_proc->u4_frame_qp;
1108
1109    if (ps_proc->i4_slice_type == SPSLICE || ps_proc->i4_slice_type == SISLICE)
1110    {
1111        if (ps_proc->i4_slice_type == SPSLICE)
1112        {
1113            /* sp_for_switch_flag */
1114        }
1115        /* slice_qs_delta */
1116    }
1117
1118    if (ps_pps->i1_deblocking_filter_control_present_flag)
1119    {
1120        /* disable_deblocking_filter_idc */
1121        ps_slice_hdr->u1_disable_deblocking_filter_idc = ps_proc->u4_disable_deblock_level;
1122
1123        if (ps_slice_hdr->u1_disable_deblocking_filter_idc != 1)
1124        {
1125            /* slice_alpha_c0_offset_div2 */
1126            ps_slice_hdr->i1_slice_alpha_c0_offset_div2 = 0;
1127
1128            /* slice_beta_offset_div2 */
1129            ps_slice_hdr->i1_slice_beta_offset_div2 = 0;
1130        }
1131    }
1132    ps_slice_hdr->u1_num_slice_groups_minus1 = 0;
1133    if(ps_slice_hdr->u1_num_slice_groups_minus1 > 0 &&
1134        ps_pps->u1_slice_group_map_type >= 3 &&
1135        ps_pps->u1_slice_group_map_type <= 5)
1136    {
1137        /* slice_group_change_cycle */
1138        /* TODO_LATER: Currently the number of slice groups minus 1 is 0.
1139         * If this is not the case, we have to add Slice group map type to the bit stream */
1140    }
1141
1142    ps_slice_hdr->i1_cabac_init_idc = CABAC_INIT_IDC;
1143
1144    return IH264E_SUCCESS;
1145}
1146
1147/**
1148******************************************************************************
1149*
1150* @brief inserts FILLER Nal Unit.
1151*
1152* @par   Description
1153*  In constant bit rate rc mode, when the bits generated by the codec is
1154*  underflowing the target bit rate, the encoder library inserts filler nal unit.
1155*
1156* @param[in]    ps_bitstrm
1157*  pointer to bitstream context (handle)
1158*
1159* @param[in]    insert_fill_bytes
1160*  Number of fill bytes to be inserted
1161*
1162* @return      success or failure error code
1163*
1164******************************************************************************
1165*/
1166IH264E_ERROR_T ih264e_add_filler_nal_unit(bitstrm_t *ps_bitstrm,
1167                                          WORD32 insert_fill_bytes)
1168{
1169    WORD32  i4_num_words_to_fill, i4_words_filled;
1170
1171    IH264E_ERROR_T return_status = IH264E_SUCCESS;
1172
1173    /* Insert the NAL start code */
1174    return_status |= ih264e_put_nal_start_code_prefix(ps_bitstrm, 1);
1175
1176    if (ps_bitstrm->u4_strm_buf_offset + insert_fill_bytes >= ps_bitstrm->u4_max_strm_size)
1177    {
1178        return (IH264E_BITSTREAM_BUFFER_OVERFLOW);
1179    }
1180
1181    /* Insert Nal Unit Header */
1182    PUT_BITS(ps_bitstrm, NAL_FILLER_FIRST_BYTE, 8, return_status, "filler_header");
1183
1184    PUT_BITS(ps_bitstrm, 0xFFFFFF, 24, return_status, "fill bytes");
1185
1186    /* Initializing Variables                           */
1187    i4_words_filled    = 1;
1188
1189    /****************************************************/
1190    /* Flooring the number of bytes for be stuffed to   */
1191    /* WORD unit                                        */
1192    /****************************************************/
1193    i4_num_words_to_fill = (insert_fill_bytes >> 2);
1194
1195    /****************************************************/
1196    /* Reducing already 4 bytes filled. In case stuffing*/
1197    /* is <= 4 bytes, we are actually not stuffing      */
1198    /* anything                                         */
1199    /****************************************************/
1200    i4_num_words_to_fill -= i4_words_filled;
1201
1202    while (i4_num_words_to_fill > 0)
1203    {
1204        /* Insert Nal Unit Header */
1205        PUT_BITS(ps_bitstrm, 0xFFFFFFFF, 32, return_status, "fill bytes");
1206
1207        i4_num_words_to_fill-- ;
1208    }
1209
1210    return_status |= ih264e_put_rbsp_trailing_bits(ps_bitstrm);
1211
1212    return return_status;
1213}
1214
1215