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