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* @brief Generates VUI (Video usability information) 143* 144* @par Description 145* This function generates VUI header as per the spec 146* 147* @param[in] ps_bitstrm 148* pointer to bitstream context (handle) 149* 150* @param[in] ps_vui 151* pointer to structure containing VUI data 152 153* 154* @return success or failure error code 155* 156****************************************************************************** 157*/ 158WORD32 ih264e_generate_vui(bitstrm_t *ps_bitstrm, vui_t *ps_vui) 159{ 160 WORD32 return_status = IH264E_SUCCESS; 161 162 /* aspect_ratio_info_present_flag */ 163 PUT_BITS(ps_bitstrm, ps_vui->u1_aspect_ratio_info_present_flag, 1, 164 return_status, "aspect_ratio_info_present_flag"); 165 166 if(ps_vui->u1_aspect_ratio_info_present_flag) 167 { /* aspect_ratio_idc */ 168 PUT_BITS(ps_bitstrm, ps_vui->u1_aspect_ratio_idc, 8, return_status, 169 "aspect_ratio_idc"); 170 if(255 == ps_vui->u1_aspect_ratio_idc) /* Extended_SAR */ 171 { /* sar_width */ 172 PUT_BITS(ps_bitstrm, ps_vui->u2_sar_width, 16, return_status, 173 "sar_width"); 174 /* sar_height */ 175 PUT_BITS(ps_bitstrm, ps_vui->u2_sar_height, 16, return_status, 176 "sar_height"); 177 } 178 179 } 180 /* overscan_info_present_flag */ 181 PUT_BITS(ps_bitstrm, ps_vui->u1_overscan_info_present_flag, 1, 182 return_status, "overscan_info_present_flag"); 183 184 if(ps_vui->u1_overscan_info_present_flag) 185 { 186 /* overscan_appropriate_flag */ 187 PUT_BITS(ps_bitstrm, ps_vui->u1_overscan_appropriate_flag, 1, 188 return_status, "overscan_appropriate_flag"); 189 190 } 191 /* video_signal_type_present_flag */ 192 PUT_BITS(ps_bitstrm, ps_vui->u1_video_signal_type_present_flag, 1, 193 return_status, "video_signal_type_present_flag"); 194 195 if(ps_vui->u1_video_signal_type_present_flag) 196 { /* video_format */ 197 PUT_BITS(ps_bitstrm, ps_vui->u1_video_format, 3, return_status, 198 "video_format"); 199 200 /* video_full_range_flag */ 201 PUT_BITS(ps_bitstrm, ps_vui->u1_video_full_range_flag, 1, return_status, 202 "video_full_range_flag"); 203 204 /* colour_description_present_flag */ 205 PUT_BITS(ps_bitstrm, ps_vui->u1_colour_description_present_flag, 1, 206 return_status, "colour_description_present_flag"); 207 208 if(ps_vui->u1_colour_description_present_flag) 209 { 210 /* colour_primaries */ 211 PUT_BITS(ps_bitstrm, ps_vui->u1_colour_primaries, 8, return_status, 212 "colour_primaries"); 213 214 /* transfer_characteristics */ 215 PUT_BITS(ps_bitstrm, ps_vui->u1_transfer_characteristics, 8, 216 return_status, "transfer_characteristics"); 217 218 /* matrix_coefficients */ 219 PUT_BITS(ps_bitstrm, ps_vui->u1_matrix_coefficients, 8, 220 return_status, "matrix_coefficients"); 221 } 222 223 } 224 225 /* chroma_loc_info_present_flag */ 226 PUT_BITS(ps_bitstrm, ps_vui->u1_chroma_loc_info_present_flag, 1, 227 return_status, "chroma_loc_info_present_flag"); 228 229 if(ps_vui->u1_chroma_loc_info_present_flag) 230 { 231 /* chroma_sample_loc_type_top_field */ 232 PUT_BITS_UEV(ps_bitstrm, ps_vui->u1_chroma_sample_loc_type_top_field, 233 return_status, "chroma_sample_loc_type_top_field"); 234 235 /* chroma_sample_loc_type_bottom_field */ 236 PUT_BITS_UEV(ps_bitstrm, ps_vui->u1_chroma_sample_loc_type_bottom_field, 237 return_status, "chroma_sample_loc_type_bottom_field"); 238 } 239 240 /* timing_info_present_flag */ 241 PUT_BITS(ps_bitstrm, ps_vui->u1_vui_timing_info_present_flag, 1, 242 return_status, "timing_info_present_flag"); 243 244 if(ps_vui->u1_vui_timing_info_present_flag) 245 { 246 /* num_units_in_tick */ 247 PUT_BITS(ps_bitstrm, ps_vui->u4_vui_num_units_in_tick, 32, 248 return_status, "num_units_in_tick"); 249 250 /* time_scale */ 251 PUT_BITS(ps_bitstrm, ps_vui->u4_vui_time_scale, 32, return_status, 252 "time_scale"); 253 254 /* fixed_frame_rate_flag */ 255 PUT_BITS(ps_bitstrm, ps_vui->u1_fixed_frame_rate_flag, 1, return_status, 256 "fixed_frame_rate_flag"); 257 258 } 259 260 /* nal_hrd_parameters_present_flag */ 261 PUT_BITS(ps_bitstrm, ps_vui->u1_nal_hrd_parameters_present_flag, 1, 262 return_status, "nal_hrd_parameters_present_flag"); 263 264 if(ps_vui->u1_nal_hrd_parameters_present_flag) 265 { 266 hrd_params_t * ps_hrd_params = &ps_vui->s_nal_hrd_parameters; 267 WORD32 i; 268 /* cpb_cnt_minus1 */ 269 PUT_BITS_UEV(ps_bitstrm, ps_hrd_params->u1_cpb_cnt_minus1, 270 return_status, "cpb_cnt_minus1"); 271 272 /* bit_rate_scale */ 273 PUT_BITS(ps_bitstrm, ps_hrd_params->u4_bit_rate_scale, 4, return_status, 274 "bit_rate_scale"); 275 276 /* cpb_size_scale */ 277 PUT_BITS(ps_bitstrm, ps_hrd_params->u4_cpb_size_scale, 4, return_status, 278 "cpb_size_scale"); 279 for(i = 0; i < ps_hrd_params->u1_cpb_cnt_minus1; i++) 280 { 281 /* bit_rate_value_minus1[SchedSelIdx] */ 282 PUT_BITS_UEV(ps_bitstrm, 283 ps_hrd_params->au4_bit_rate_value_minus1[i], 284 return_status, "bit_rate_value_minus1[SchedSelIdx]"); 285 286 /* cpb_size_value_minus1[SchedSelIdx] */ 287 PUT_BITS_UEV(ps_bitstrm, 288 ps_hrd_params->au4_cpb_size_value_minus1[i], 289 return_status, "cpb_size_value_minus1[SchedSelIdx]"); 290 291 /* cbr_flag[SchedSelIdx] */ 292 PUT_BITS(ps_bitstrm, ps_hrd_params->au1_cbr_flag[i], 1, 293 return_status, "cbr_flag[SchedSelIdx]"); 294 } 295 296 /* initial_cpb_removal_delay_length_minus1 */ 297 PUT_BITS(ps_bitstrm, 298 ps_hrd_params->u1_initial_cpb_removal_delay_length_minus1, 5, 299 return_status, "initial_cpb_removal_delay_length_minus1"); 300 301 /* cpb_removal_delay_length_minus1 */ 302 PUT_BITS(ps_bitstrm, ps_hrd_params->u1_cpb_removal_delay_length_minus1, 303 5, return_status, "cpb_removal_delay_length_minus1"); 304 305 /* dpb_output_delay_length_minus1 */ 306 PUT_BITS(ps_bitstrm, ps_hrd_params->u1_dpb_output_delay_length_minus1, 307 5, return_status, "dpb_output_delay_length_minus1"); 308 309 /* time_offset_length */ 310 PUT_BITS(ps_bitstrm, ps_hrd_params->u1_time_offset_length, 5, 311 return_status, "time_offset_length"); 312 } 313 314 /* vcl_hrd_parameters_present_flag */ 315 PUT_BITS(ps_bitstrm, ps_vui->u1_vcl_hrd_parameters_present_flag, 1, 316 return_status, "vcl_hrd_parameters_present_flag"); 317 318 if(ps_vui->u1_vcl_hrd_parameters_present_flag) 319 { 320 hrd_params_t * ps_hrd_params = &ps_vui->s_vcl_hrd_parameters; 321 WORD32 i; 322 /* cpb_cnt_minus1 */ 323 PUT_BITS_UEV(ps_bitstrm, ps_hrd_params->u1_cpb_cnt_minus1, 324 return_status, "cpb_cnt_minus1"); 325 326 /* bit_rate_scale */ 327 PUT_BITS(ps_bitstrm, ps_hrd_params->u4_bit_rate_scale, 4, return_status, 328 "bit_rate_scale"); 329 330 /* cpb_size_scale */ 331 PUT_BITS(ps_bitstrm, ps_hrd_params->u4_cpb_size_scale, 4, return_status, 332 "cpb_size_scale"); 333 for(i = 0; i < ps_hrd_params->u1_cpb_cnt_minus1; i++) 334 { 335 /* bit_rate_value_minus1[SchedSelIdx] */ 336 PUT_BITS_UEV(ps_bitstrm, 337 ps_hrd_params->au4_bit_rate_value_minus1[i], 338 return_status, "bit_rate_value_minus1[SchedSelIdx]"); 339 340 /* cpb_size_value_minus1[SchedSelIdx] */ 341 PUT_BITS_UEV(ps_bitstrm, 342 ps_hrd_params->au4_cpb_size_value_minus1[i], 343 return_status, "cpb_size_value_minus1[SchedSelIdx]"); 344 345 /* cbr_flag[SchedSelIdx] */ 346 PUT_BITS(ps_bitstrm, ps_hrd_params->au1_cbr_flag[i], 1, 347 return_status, "cbr_flag[SchedSelIdx]"); 348 } 349 350 /* initial_cpb_removal_delay_length_minus1 */ 351 PUT_BITS(ps_bitstrm, 352 ps_hrd_params->u1_initial_cpb_removal_delay_length_minus1, 5, 353 return_status, "initial_cpb_removal_delay_length_minus1"); 354 355 /* cpb_removal_delay_length_minus1 */ 356 PUT_BITS(ps_bitstrm, ps_hrd_params->u1_cpb_removal_delay_length_minus1, 357 5, return_status, "cpb_removal_delay_length_minus1"); 358 359 /* dpb_output_delay_length_minus1 */ 360 PUT_BITS(ps_bitstrm, ps_hrd_params->u1_dpb_output_delay_length_minus1, 361 5, return_status, "dpb_output_delay_length_minus1"); 362 363 /* time_offset_length */ 364 PUT_BITS(ps_bitstrm, ps_hrd_params->u1_time_offset_length, 5, 365 return_status, "time_offset_length"); 366 } 367 368 if(ps_vui->u1_nal_hrd_parameters_present_flag 369 || ps_vui->u1_vcl_hrd_parameters_present_flag) 370 { 371 /* low_delay_hrd_flag */ 372 PUT_BITS(ps_bitstrm, ps_vui->u1_low_delay_hrd_flag, 1, return_status, 373 "low_delay_hrd_flag"); 374 } 375 /* pic_struct_present_flag */ 376 PUT_BITS(ps_bitstrm, ps_vui->u1_pic_struct_present_flag, 1, return_status, 377 "pic_struct_present_flag"); 378 379 /* bitstream_restriction_flag */ 380 PUT_BITS(ps_bitstrm, ps_vui->u1_bitstream_restriction_flag, 1, 381 return_status, "bitstream_restriction_flag"); 382 383 if(ps_vui->u1_bitstream_restriction_flag == 1) 384 { 385 /* motion_vectors_over_pic_boundaries_flag */ 386 PUT_BITS(ps_bitstrm, ps_vui->u1_motion_vectors_over_pic_boundaries_flag, 387 1, return_status, "motion_vectors_over_pic_boundaries_flag"); 388 389 /* max_bytes_per_pic_denom */ 390 PUT_BITS_UEV(ps_bitstrm, ps_vui->u1_max_bytes_per_pic_denom, 391 return_status, "max_bytes_per_pic_denom"); 392 393 /* max_bits_per_mb_denom */ 394 PUT_BITS_UEV(ps_bitstrm, ps_vui->u1_max_bits_per_mb_denom, 395 return_status, "max_bits_per_mb_denom"); 396 397 /* log2_max_mv_length_horizontal */ 398 PUT_BITS_UEV(ps_bitstrm, ps_vui->u1_log2_max_mv_length_horizontal, 399 return_status, "log2_max_mv_length_horizontal"); 400 401 /* log2_max_mv_length_vertical */ 402 PUT_BITS_UEV(ps_bitstrm, ps_vui->u1_log2_max_mv_length_vertical, 403 return_status, "log2_max_mv_length_vertical"); 404 405 /* max_num_reorder_frames */ 406 PUT_BITS_UEV(ps_bitstrm, ps_vui->u1_num_reorder_frames, return_status, 407 "max_num_reorder_frames"); 408 409 /* max_dec_frame_buffering */ 410 PUT_BITS_UEV(ps_bitstrm, ps_vui->u1_max_dec_frame_buffering, 411 return_status, "max_dec_frame_buffering"); 412 } 413 414 return return_status; 415} 416 417/** 418****************************************************************************** 419* 420* @brief Generates SPS (Sequence Parameter Set) 421* 422* @par Description 423* This function generates Sequence Parameter Set header as per the spec 424* 425* @param[in] ps_bitstrm 426* pointer to bitstream context (handle) 427* 428* @param[in] ps_sps 429* pointer to structure containing SPS data 430* 431* @param[in] ps_vui 432* pointer to structure containing VUI data 433* 434* @return success or failure error code 435* 436****************************************************************************** 437*/ 438WORD32 ih264e_generate_sps(bitstrm_t *ps_bitstrm, sps_t *ps_sps, vui_t *ps_vui) 439{ 440 WORD32 return_status = IH264E_SUCCESS; 441 WORD32 i; 442 WORD8 i1_nal_unit_type = 7; 443 WORD8 i1_nal_ref_idc = 3; 444 445 /* Insert Start Code */ 446 return_status |= ih264e_put_nal_start_code_prefix(ps_bitstrm, 1); 447 448 /* Insert Nal Unit Header */ 449 return_status |= ih264e_generate_nal_unit_header(ps_bitstrm, i1_nal_unit_type, i1_nal_ref_idc); 450 451 /* profile_idc */ 452 PUT_BITS(ps_bitstrm, ps_sps->u1_profile_idc, 8, return_status, "profile_idc"); 453 454 /* constrained_set_flags */ 455 PUT_BITS(ps_bitstrm, ps_sps->u1_constraint_set0_flag, 1, return_status, "constrained_set0_flag"); 456 PUT_BITS(ps_bitstrm, ps_sps->u1_constraint_set1_flag, 1, return_status, "constrained_set1_flag"); 457 PUT_BITS(ps_bitstrm, ps_sps->u1_constraint_set2_flag, 1, return_status, "constrained_set2_flag"); 458 PUT_BITS(ps_bitstrm, ps_sps->u1_constraint_set3_flag, 1, return_status, "constrained_set3_flag"); 459 460 /* reserved_zero_four_bits */ 461 PUT_BITS(ps_bitstrm, 0, 4, return_status, "reserved_zero_four_bits"); 462 463 /* level_idc */ 464 PUT_BITS(ps_bitstrm, ps_sps->u1_level_idc, 8, return_status, "level_idc"); 465 466 /* seq_parameter_set_id */ 467 PUT_BITS_UEV(ps_bitstrm, ps_sps->u1_sps_id, return_status, "seq_parameter_set_id"); 468 469 if (ps_sps->u1_profile_idc >= IH264_PROFILE_HIGH) 470 { 471 /* chroma_format_idc */ 472 PUT_BITS_UEV(ps_bitstrm, ps_sps->u1_chroma_format_idc, return_status, "chroma_format_idc"); 473 474 if (ps_sps->u1_chroma_format_idc == CHROMA_FMT_IDC_YUV444) 475 { 476 /* i1_residual_colour_transform_flag */ 477 PUT_BITS(ps_bitstrm, ps_sps->i1_residual_colour_transform_flag, 1, return_status, "i1_residual_colour_transform_flag"); 478 } 479 480 /* bit_depth_luma_minus8 */ 481 PUT_BITS_UEV(ps_bitstrm, (ps_sps->i1_bit_depth_luma - 8), return_status, "bit_depth_luma_minus8"); 482 483 /* bit_depth_chroma_minus8 */ 484 PUT_BITS_UEV(ps_bitstrm, (ps_sps->i1_bit_depth_chroma - 8), return_status, "bit_depth_chroma_minus8"); 485 486 /* qpprime_y_zero_transform_bypass_flag */ 487 PUT_BITS(ps_bitstrm, ps_sps->i1_qpprime_y_zero_transform_bypass_flag, 1, return_status, "qpprime_y_zero_transform_bypass_flag"); 488 489 /* seq_scaling_matrix_present_flag */ 490 PUT_BITS(ps_bitstrm, ps_sps->i1_seq_scaling_matrix_present_flag, 1, return_status, "seq_scaling_matrix_present_flag"); 491 492 /* seq_scaling_list */ 493 if (ps_sps->i1_seq_scaling_matrix_present_flag) 494 { 495 /* TODO_LATER: Will be enabled once scaling list support is added */ 496 } 497 } 498 499 /* log2_max_frame_num_minus4 */ 500 PUT_BITS_UEV(ps_bitstrm, (ps_sps->i1_log2_max_frame_num - 4), return_status, "log2_max_frame_num_minus4"); 501 502 /* pic_order_cnt_type */ 503 PUT_BITS_UEV(ps_bitstrm, ps_sps->i1_pic_order_cnt_type, return_status, "pic_order_cnt_type"); 504 505 if (ps_sps->i1_pic_order_cnt_type == 0) 506 { 507 /* log2_max_pic_order_cnt_lsb_minus4 */ 508 PUT_BITS_UEV(ps_bitstrm, (ps_sps->i1_log2_max_pic_order_cnt_lsb - 4), return_status, "log2_max_pic_order_cnt_lsb_minus4"); 509 } 510 else if (ps_sps->i1_pic_order_cnt_type == 1) 511 { 512 /* delta_pic_order_always_zero_flag */ 513 PUT_BITS(ps_bitstrm, ps_sps->i1_delta_pic_order_always_zero_flag, 1, return_status, "delta_pic_order_always_zero_flag"); 514 515 /* offset_for_non_ref_pic */ 516 PUT_BITS_SEV(ps_bitstrm, ps_sps->i4_offset_for_non_ref_pic, return_status, "offset_for_non_ref_pic"); 517 518 /* offset_for_top_to_bottom_field */ 519 PUT_BITS_SEV(ps_bitstrm, ps_sps->i4_offset_for_top_to_bottom_field, return_status, "offset_for_top_to_bottom_field"); 520 521 /* num_ref_frames_in_pic_order_cnt_cycle */ 522 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"); 523 524 /* Offset for ref frame */ 525 for (i=0; i<ps_sps->u1_num_ref_frames_in_pic_order_cnt_cycle; i++) 526 { 527 /* offset_for_ref_frame */ 528 PUT_BITS_SEV(ps_bitstrm, ps_sps->ai4_offset_for_ref_frame[i], return_status, "offset_for_ref_frame"); 529 } 530 } 531 532 /* num_ref_frames */ 533 PUT_BITS_UEV(ps_bitstrm, ps_sps->u1_max_num_ref_frames, return_status, "num_ref_frames"); 534 535 /* gaps_in_frame_num_value_allowed_flag */ 536 PUT_BITS(ps_bitstrm, ps_sps->i1_gaps_in_frame_num_value_allowed_flag, 1, return_status, "gaps_in_frame_num_value_allowed_flag"); 537 538 /* pic_width_in_mbs_minus1 */ 539 PUT_BITS_UEV(ps_bitstrm, ps_sps->i2_pic_width_in_mbs_minus1, return_status, "pic_width_in_mbs_minus1"); 540 541 /* pic_height_in_map_units_minus1 */ 542 PUT_BITS_UEV(ps_bitstrm, ps_sps->i2_pic_height_in_map_units_minus1, return_status, "pic_height_in_map_units_minus1"); 543 544 /* frame_mbs_only_flag */ 545 PUT_BITS(ps_bitstrm, ps_sps->i1_frame_mbs_only_flag, 1, return_status, "frame_mbs_only_flag"); 546 547 if (!ps_sps->i1_frame_mbs_only_flag) 548 { 549 /* mb_adaptive_frame_field_flag */ 550 PUT_BITS(ps_bitstrm, ps_sps->i1_mb_adaptive_frame_field_flag, 1, return_status, "mb_adaptive_frame_field_flag"); 551 } 552 553 /* direct_8x8_inference_flag */ 554 PUT_BITS(ps_bitstrm, ps_sps->i1_direct_8x8_inference_flag, 1, return_status, "direct_8x8_inference_flag"); 555 556 /* frame_cropping_flag */ 557 PUT_BITS(ps_bitstrm, ps_sps->i1_frame_cropping_flag, 1, return_status, "frame_cropping_flag"); 558 559 if (ps_sps->i1_frame_cropping_flag) 560 { 561 /* frame_crop_left_offset */ 562 PUT_BITS_UEV(ps_bitstrm, ps_sps->i2_frame_crop_left_offset, return_status, "frame_crop_left_offset"); 563 564 /* frame_crop_right_offset */ 565 PUT_BITS_UEV(ps_bitstrm, ps_sps->i2_frame_crop_right_offset, return_status, "frame_crop_right_offset"); 566 567 /* frame_crop_top_offset */ 568 PUT_BITS_UEV(ps_bitstrm, ps_sps->i2_frame_crop_top_offset, return_status, "frame_crop_top_offset"); 569 570 /* frame_crop_bottom_offset */ 571 PUT_BITS_UEV(ps_bitstrm, ps_sps->i2_frame_crop_bottom_offset, return_status, "frame_crop_bottom_offset"); 572 } 573 574 /* vui_parameters_present_flag */ 575 PUT_BITS(ps_bitstrm, ps_sps->i1_vui_parameters_present_flag, 1, return_status, "vui_parameters_present_flag"); 576 577 if (ps_sps->i1_vui_parameters_present_flag) 578 { 579 /* Add vui parameters to the bitstream */; 580 return_status |= ih264e_generate_vui(ps_bitstrm, ps_vui); 581 } 582 583 /* rbsp trailing bits */ 584 return_status |= ih264e_put_rbsp_trailing_bits(ps_bitstrm); 585 586 return return_status; 587} 588 589/** 590****************************************************************************** 591* 592* @brief Generates PPS (Picture Parameter Set) 593* 594* @par Description 595* Generate Picture Parameter Set as per Section 7.3.2.2 596* 597* @param[in] ps_bitstrm 598* pointer to bitstream context (handle) 599* 600* @param[in] ps_pps 601* pointer to structure containing PPS data 602* 603* @return success or failure error code 604* 605****************************************************************************** 606*/ 607WORD32 ih264e_generate_pps(bitstrm_t *ps_bitstrm, pps_t *ps_pps, sps_t *ps_sps) 608{ 609 WORD32 return_status = IH264E_SUCCESS; 610 611 /* Insert the NAL start code */ 612 return_status |= ih264e_put_nal_start_code_prefix(ps_bitstrm, 1); 613 614 /* Insert Nal Unit Header */ 615 PUT_BITS(ps_bitstrm, NAL_PPS_FIRST_BYTE, 8, return_status, "pps_header"); 616 617 /* pic_parameter_set_id */ 618 PUT_BITS_UEV(ps_bitstrm, ps_pps->u1_pps_id, return_status, "pic_parameter_set_id"); 619 620 /* seq_parameter_set_id */ 621 PUT_BITS_UEV(ps_bitstrm, ps_pps->u1_sps_id, return_status, "seq_parameter_set_id"); 622 623 /* Entropy coding : 0-VLC; 1 - CABAC */ 624 PUT_BITS(ps_bitstrm, ps_pps->u1_entropy_coding_mode_flag, 1, return_status, "Entropy coding : 0-VLC; 1 - CABAC"); 625 626 /* Pic order present flag */ 627 PUT_BITS(ps_bitstrm, ps_pps->u1_pic_order_present_flag, 1, return_status, "Pic order present flag"); 628 629 /* Number of slice groups */ 630 PUT_BITS_UEV(ps_bitstrm, ps_pps->u1_num_slice_groups - 1, return_status, "Number of slice groups"); 631 632 if (ps_pps->u1_num_slice_groups > 1) 633 { 634 /* TODO_LATER: Currently the number of slice groups minus 1 is 0. 635 * If this is not the case, we have to add Slice group map type to the bit stream*/ 636 } 637 638 /* num_ref_idx_l0_default_active_minus1 */ 639 PUT_BITS_UEV(ps_bitstrm, ps_pps->i1_num_ref_idx_l0_default_active - 1, return_status, "num_ref_idx_l0_default_active_minus1"); 640 641 /* num_ref_idx_l1_default_active_minus1 */ 642 PUT_BITS_UEV(ps_bitstrm, ps_pps->i1_num_ref_idx_l1_default_active - 1, return_status, "num_ref_idx_l1_default_active_minus1"); 643 644 /* weighted_pred_flag */ 645 PUT_BITS(ps_bitstrm, ps_pps->i1_weighted_pred_flag, 1, return_status, "weighted_pred_flag"); 646 647 /* weighted_bipred_flag */ 648 PUT_BITS(ps_bitstrm, ps_pps->i1_weighted_bipred_idc, 2, return_status, "weighted_bipred_idc"); 649 650 /* pic_init_qp_minus26 */ 651 PUT_BITS_SEV(ps_bitstrm, ps_pps->i1_pic_init_qp - 26, return_status, "pic_init_qp_minus26"); 652 653 /* pic_init_qs_minus26 */ 654 PUT_BITS_SEV(ps_bitstrm, ps_pps->i1_pic_init_qs - 26, return_status, "pic_init_qs_minus26"); 655 656 /* chroma_qp_index_offset */ 657 PUT_BITS_SEV(ps_bitstrm, ps_pps->i1_chroma_qp_index_offset, return_status, "chroma_qp_index_offset"); 658 659 /* deblocking_filter_control_present_flag */ 660 PUT_BITS(ps_bitstrm, ps_pps->i1_deblocking_filter_control_present_flag, 1, return_status, "deblocking_filter_control_present_flag"); 661 662 /* constrained_intra_pred_flag */ 663 PUT_BITS(ps_bitstrm, ps_pps->i1_constrained_intra_pred_flag, 1, return_status, "constrained_intra_pred_flag"); 664 665 /*redundant_pic_cnt_present_flag */ 666 PUT_BITS(ps_bitstrm, ps_pps->i1_redundant_pic_cnt_present_flag, 1, return_status, "redundant_pic_cnt_present_flag"); 667 668 if (ps_sps->u1_profile_idc >= IH264_PROFILE_HIGH) 669 { 670 /* transform_8x8_mode_flag */ 671 PUT_BITS(ps_bitstrm, ps_pps->i1_transform_8x8_mode_flag, 1, return_status, "transform_8x8_mode_flag"); 672 673 /* pic_scaling_matrix_present_flag */ 674 PUT_BITS(ps_bitstrm, ps_pps->i1_pic_scaling_matrix_present_flag, 1, return_status, "pic_scaling_matrix_present_flag"); 675 676 if(ps_pps->i1_pic_scaling_matrix_present_flag) 677 { 678 /* TODO_LATER: Will be enabled once scaling list support is added */ 679 } 680 681 /* Second chroma QP offset */ 682 PUT_BITS_SEV(ps_bitstrm, ps_pps->i1_second_chroma_qp_index_offset, return_status, "Second chroma QP offset"); 683 } 684 685 return_status |= ih264e_put_rbsp_trailing_bits(ps_bitstrm); 686 687 return return_status; 688} 689 690/** 691****************************************************************************** 692* 693* @brief Generates Slice Header 694* 695* @par Description 696* Generate Slice Header as per Section 7.3.5.1 697* 698* @param[inout] ps_bitstrm 699* pointer to bitstream context for generating slice header 700* 701* @param[in] ps_slice_hdr 702* pointer to slice header params 703* 704* @param[in] ps_pps 705* pointer to pps params referred by slice 706* 707* @param[in] ps_sps 708* pointer to sps params referred by slice 709* 710* @param[out] ps_dup_bit_strm_ent_offset 711* Bitstream struct to store bitstream state 712* 713* @param[out] pu4_first_slice_start_offset 714* first slice offset is returned 715* 716* @return success or failure error code 717* 718****************************************************************************** 719*/ 720WORD32 ih264e_generate_slice_header(bitstrm_t *ps_bitstrm, 721 slice_header_t *ps_slice_hdr, 722 pps_t *ps_pps, 723 sps_t *ps_sps) 724{ 725 726 WORD32 return_status = IH264E_SUCCESS; 727 728 /* Insert start code */ 729 return_status |= ih264e_put_nal_start_code_prefix(ps_bitstrm, 1); 730 731 /* Insert Nal Unit Header */ 732 return_status |= ih264e_generate_nal_unit_header(ps_bitstrm, ps_slice_hdr->i1_nal_unit_type, ps_slice_hdr->i1_nal_unit_idc); 733 734 /* first_mb_in_slice */ 735 PUT_BITS_UEV(ps_bitstrm, ps_slice_hdr->u2_first_mb_in_slice, return_status, "first_mb_in_slice"); 736 737 /* slice_type */ 738 PUT_BITS_UEV(ps_bitstrm, ps_slice_hdr->u1_slice_type, return_status, "slice_type"); 739 740 /* pic_parameter_set_id */ 741 PUT_BITS_UEV(ps_bitstrm, ps_slice_hdr->u1_pps_id, return_status, "pic_parameter_set_id"); 742 743 /* frame_num */ 744 PUT_BITS(ps_bitstrm, ps_slice_hdr->i4_frame_num, ps_sps->i1_log2_max_frame_num, return_status, "frame_num"); 745 746 if (!ps_sps->i1_frame_mbs_only_flag) 747 { 748 /* field_pic_flag */ 749 PUT_BITS(ps_bitstrm, ps_slice_hdr->i1_field_pic_flag, 1, return_status, "field_pic_flag"); 750 751 if(ps_slice_hdr->i1_field_pic_flag) 752 { 753 /* bottom_field_flag */ 754 PUT_BITS(ps_bitstrm, ps_slice_hdr->i1_bottom_field_flag, 1, return_status, "bottom_field_flag"); 755 } 756 } 757 758 if (ps_slice_hdr->i1_nal_unit_type == 5) 759 { 760 /* u2_idr_pic_id */ 761 PUT_BITS_UEV(ps_bitstrm, ps_slice_hdr->u2_idr_pic_id, return_status, "u2_idr_pic_id"); 762 } 763 764 if (ps_sps->i1_pic_order_cnt_type == 0) 765 { 766 /* pic_order_cnt_lsb */ 767 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"); 768 769 if(ps_pps->u1_pic_order_present_flag && !ps_slice_hdr->i1_field_pic_flag) 770 { 771 /* delta_pic_order_cnt_bottom */ 772 PUT_BITS_SEV(ps_bitstrm, ps_slice_hdr->i4_delta_pic_order_cnt_bottom, return_status, "delta_pic_order_cnt_bottom"); 773 } 774 } 775 776 if (ps_sps->i1_pic_order_cnt_type == 1 && !ps_sps->i1_delta_pic_order_always_zero_flag) 777 { 778 /* delta_pic_order_cnt[0] */ 779 PUT_BITS_SEV(ps_bitstrm, ps_slice_hdr->ai4_delta_pic_order_cnt[0], return_status, "delta_pic_order_cnt[0]"); 780 781 if (ps_pps->u1_pic_order_present_flag && !ps_slice_hdr->i1_field_pic_flag) 782 { 783 /* delta_pic_order_cnt[1] */ 784 PUT_BITS_SEV(ps_bitstrm, ps_slice_hdr->ai4_delta_pic_order_cnt[1], return_status, "delta_pic_order_cnt[1]"); 785 } 786 } 787 788 if (ps_pps->i1_redundant_pic_cnt_present_flag) 789 { 790 /* redundant_pic_cnt */ 791 PUT_BITS_UEV(ps_bitstrm, ps_slice_hdr->u1_redundant_pic_cnt, return_status, "redundant_pic_cnt"); 792 } 793 794 if (ps_slice_hdr->u1_slice_type == BSLICE) 795 { 796 /* direct_spatial_mv_pred_flag */ 797 PUT_BITS(ps_bitstrm, ps_slice_hdr->u1_direct_spatial_mv_pred_flag, 1, return_status, "direct_spatial_mv_pred_flag"); 798 } 799 800 if (ps_slice_hdr->u1_slice_type == PSLICE || ps_slice_hdr->u1_slice_type == SPSLICE || ps_slice_hdr->u1_slice_type == BSLICE) 801 { 802 /* num_ref_idx_active_override_flag */ 803 PUT_BITS(ps_bitstrm, ps_slice_hdr->u1_num_ref_idx_active_override_flag, 1, return_status, "num_ref_idx_active_override_flag"); 804 805 if (ps_slice_hdr->u1_num_ref_idx_active_override_flag) 806 { 807 /* num_ref_idx_l0_active_minus1 */ 808 PUT_BITS_UEV(ps_bitstrm, ps_slice_hdr->i1_num_ref_idx_l0_active - 1, return_status, "num_ref_idx_l0_active_minus1"); 809 810 if (ps_slice_hdr->u1_slice_type == BSLICE) 811 { 812 /* num_ref_idx_l1_active_minus1 */ 813 PUT_BITS_UEV(ps_bitstrm, ps_slice_hdr->i1_num_ref_idx_l1_active - 1, return_status, "num_ref_idx_l1_active_minus1"); 814 } 815 } 816 } 817 818 /* ref_idx_reordering */ 819 /* TODO: ref_idx_reordering */ 820 if ((ps_slice_hdr->u1_slice_type != ISLICE) && (ps_slice_hdr->u1_slice_type != SISLICE)) 821 { 822 /* ref_pic_list_reordering_flag_l0 */ 823 PUT_BITS(ps_bitstrm, ps_slice_hdr->u1_ref_idx_reordering_flag_l0, 1, return_status, "ref_pic_list_reordering_flag_l0"); 824 825 if (ps_slice_hdr->u1_ref_idx_reordering_flag_l0) 826 { 827 828 } 829 } 830 831 if (ps_slice_hdr->u1_slice_type == BSLICE) 832 { 833 /* ref_pic_list_reordering_flag_l1 */ 834 PUT_BITS(ps_bitstrm, ps_slice_hdr->u1_ref_idx_reordering_flag_l1, 1, return_status, "ref_pic_list_reordering_flag_l1"); 835 836 if (ps_slice_hdr->u1_ref_idx_reordering_flag_l1) 837 { 838 839 } 840 } 841 842 if ((ps_pps->i1_weighted_pred_flag && 843 (ps_slice_hdr->u1_slice_type == PSLICE || ps_slice_hdr->u1_slice_type == SPSLICE)) || 844 (ps_slice_hdr->u1_slice_type == BSLICE && ps_pps->i1_weighted_bipred_idc == 1)) 845 { 846 /* TODO_LATER: Currently there is no support for weighted prediction. 847 This needs to be updated when the support is added */ 848 } 849 850 if (ps_slice_hdr->i1_nal_unit_idc != 0) 851 { 852 if (ps_slice_hdr->i1_nal_unit_type == 5) 853 { 854 /* no_output_of_prior_pics_flag */ 855 PUT_BITS(ps_bitstrm, ps_slice_hdr->u1_no_output_of_prior_pics_flag , 1, return_status, "no_output_of_prior_pics_flag "); 856 857 /* long_term_reference_flag */ 858 PUT_BITS(ps_bitstrm, ps_slice_hdr->u1_long_term_reference_flag , 1, return_status, "long_term_reference_flag "); 859 } 860 else 861 { 862 /* adaptive_ref_pic_marking_mode_flag */ 863 PUT_BITS(ps_bitstrm, ps_slice_hdr->u1_adaptive_ref_pic_marking_mode_flag , 1, return_status, "adaptive_ref_pic_marking_mode_flag "); 864 865 if (ps_slice_hdr->u1_adaptive_ref_pic_marking_mode_flag) 866 { 867 /* TODO: if the reference picture marking mode is adaptive 868 add these fields in the bit-stream */ 869 } 870 } 871 } 872 873 if (ps_slice_hdr->u1_entropy_coding_mode_flag && ps_slice_hdr->u1_slice_type != ISLICE && 874 ps_slice_hdr->u1_slice_type != SISLICE) 875 { 876 /* cabac_init_idc */ 877 PUT_BITS_UEV(ps_bitstrm, ps_slice_hdr->i1_cabac_init_idc, return_status, "cabac_init_idc"); 878 } 879 880 /* slice_qp_delta */ 881 PUT_BITS_SEV(ps_bitstrm, ps_slice_hdr->i1_slice_qp - ps_pps->i1_pic_init_qp, return_status, "slice_qp_delta"); 882 883 if (ps_slice_hdr->u1_slice_type == SPSLICE || ps_slice_hdr->u1_slice_type == SISLICE) 884 { 885 if (ps_slice_hdr->u1_slice_type == SPSLICE) 886 { 887 /* sp_for_switch_flag */ 888 PUT_BITS(ps_bitstrm, ps_slice_hdr->u1_sp_for_switch_flag , 1, return_status, "sp_for_switch_flag"); 889 } 890 /* slice_qs_delta */ 891 PUT_BITS_SEV(ps_bitstrm, ps_slice_hdr->u1_slice_qs - ps_pps->i1_pic_init_qs, return_status, "slice_qs_delta"); 892 } 893 894 if (ps_pps->i1_deblocking_filter_control_present_flag) 895 { 896 /* disable_deblocking_filter_idc */ 897 PUT_BITS_UEV(ps_bitstrm, ps_slice_hdr->u1_disable_deblocking_filter_idc, return_status, "disable_deblocking_filter_idc"); 898 899 if(ps_slice_hdr->u1_disable_deblocking_filter_idc != 1) 900 { 901 /* slice_alpha_c0_offset_div2 */ 902 PUT_BITS_SEV(ps_bitstrm, ps_slice_hdr->i1_slice_alpha_c0_offset_div2, return_status, "slice_alpha_c0_offset_div2"); 903 904 /* slice_beta_offset_div2 */ 905 PUT_BITS_SEV(ps_bitstrm, ps_slice_hdr->i1_slice_beta_offset_div2, return_status, "slice_beta_offset_div2"); 906 } 907 } 908 909 if (ps_slice_hdr->u1_num_slice_groups_minus1 > 0 && 910 ps_pps->u1_slice_group_map_type >= 3 && 911 ps_pps->u1_slice_group_map_type <= 5) 912 { 913 /* slice_group_change_cycle */ 914 /* TODO_LATER: Currently the number of slice groups minus 1 is 0. 915 * If this is not the case, we have to add Slice group map type to the bit stream */ 916 } 917 918 return return_status; 919} 920 921/** 922****************************************************************************** 923* 924* @brief Populates VUI structure 925* 926* @par Description 927* Populates VUI structure for its use in header generation 928* 929* @param[in] ps_codec 930* pointer to encoder context 931* 932* @return success or failure error code 933* 934****************************************************************************** 935*/ 936IH264E_ERROR_T ih264e_populate_vui(codec_t *ps_codec) 937{ 938 939 vui_t *ps_vui = &ps_codec->s_cfg.s_vui; 940 sps_t *ps_sps = ps_codec->ps_sps_base + ps_codec->i4_sps_id; 941 942 943 ps_vui->u1_nal_hrd_parameters_present_flag = 0; 944 ps_vui->u1_vcl_hrd_parameters_present_flag = 0; 945 946 ps_vui->u1_bitstream_restriction_flag = 1; 947 ps_vui->u1_motion_vectors_over_pic_boundaries_flag = 1; 948 ps_vui->u1_max_bytes_per_pic_denom = 0; 949 ps_vui->u1_max_bits_per_mb_denom = 0; 950 ps_vui->u1_log2_max_mv_length_horizontal = 16; 951 ps_vui->u1_log2_max_mv_length_vertical = 16; 952 953 if(ps_codec->s_cfg.u4_num_bframes == 0) 954 { 955 ps_vui->u1_num_reorder_frames = 0; 956 } 957 else 958 { 959 ps_vui->u1_num_reorder_frames = 1; 960 } 961 962 ps_vui->u1_max_dec_frame_buffering = ps_sps->u1_max_num_ref_frames; 963 964 965 return 0; 966} 967 968 969 970/** 971****************************************************************************** 972* 973* @brief Populates sps structure 974* 975* @par Description 976* Populates sps structure for its use in header generation 977* 978* @param[in] ps_codec 979* pointer to encoder context 980* 981* @param[out] ps_sps 982* pointer to sps params that needs to be populated 983* 984* @return success or failure error code 985* 986****************************************************************************** 987*/ 988IH264E_ERROR_T ih264e_populate_sps(codec_t *ps_codec, sps_t *ps_sps) 989{ 990 /* active config parameters */ 991 cfg_params_t *ps_cfg = &(ps_codec->s_cfg); 992 993// /* level */ 994// IH264_LEVEL_T level_idc; 995 996 /* error_status */ 997 IH264E_ERROR_T i4_err_code = IH264E_FAIL; 998 999 /* profile */ 1000 /* 1001 * Baseline profile supports, 8 bits per sample, 4:2:0 format, CAVLC. 1002 * B frames are not allowed. Further, Flexible mb ordering, Redundant slices, Arbitrary slice ordering are supported. 1003 * The constrained baseline profile is baseline profile minus ASO, FMO and redundant slices. 1004 * To the constrained baseline profile if we add support for B slices, support for encoding interlaced frames, 1005 * support for weighted prediction and introduce CABAC entropy coding then we have Main Profile. 1006 */ 1007 if ((ps_cfg->u4_num_bframes) || (ps_cfg->e_content_type != IV_PROGRESSIVE) || 1008 (ps_cfg->u4_entropy_coding_mode == CABAC) || (ps_cfg->u4_weighted_prediction)) 1009 { 1010 ps_sps->u1_profile_idc = IH264_PROFILE_MAIN; 1011 } 1012 else 1013 { 1014 ps_sps->u1_profile_idc = IH264_PROFILE_BASELINE; 1015 } 1016 1017 /* level */ 1018 ps_sps->u1_level_idc = MAX(ps_cfg->u4_max_level, 1019 (UWORD32)ih264e_get_min_level(ps_cfg->u4_max_wd, ps_cfg->u4_max_ht)); 1020 1021 /* constrained flags */ 1022 /* 1023 * baseline profile automatically implies set 0 flag 1024 */ 1025 ps_sps->u1_constraint_set0_flag = (ps_sps->u1_profile_idc == IH264_PROFILE_BASELINE); 1026 /* 1027 * main profile automatically implies set 1 flag 1028 * Although the encoder says it supports Baseline profile it actually supports constrained 1029 * baseline profile as ASO, FMO and redundant slices are not supported 1030 */ 1031 ps_sps->u1_constraint_set1_flag = (ps_sps->u1_profile_idc <= IH264_PROFILE_MAIN); 1032 /* 1033 * extended profile is not supported 1034 */ 1035 ps_sps->u1_constraint_set2_flag = 0x00; 1036 /* 1037 * level 1b or level 11 1038 */ 1039 if (ps_sps->u1_level_idc == IH264_LEVEL_1B) 1040 { 1041 ps_sps->u1_constraint_set3_flag = 0; 1042 ps_sps->u1_level_idc = IH264_LEVEL_11; 1043 } 1044 else 1045 { 1046 ps_sps->u1_constraint_set3_flag = 0; 1047 } 1048 1049 /* active sps id */ 1050 ps_sps->u1_sps_id = ps_codec->i4_sps_id; 1051 1052 if (ps_sps->u1_profile_idc >= IH264_PROFILE_HIGH) 1053 { 1054 /* chroma format idc */ 1055 ps_sps->u1_chroma_format_idc = CHROMA_FMT_IDC_YUV420; 1056 1057 /* residual_colour_transform_flag */ 1058 ps_sps->i1_residual_colour_transform_flag = 0; 1059 1060 /* luma bit depth 8 */ 1061 ps_sps->i1_bit_depth_luma = 8; 1062 1063 /* chroma bit depth 8 */ 1064 ps_sps->i1_bit_depth_chroma = 8; 1065 1066 /* qpprime_y_zero_transform_bypass_flag */ 1067 ps_sps->i1_qpprime_y_zero_transform_bypass_flag = 0; 1068 1069 /* seq_scaling_matrix_present_flag */ 1070 ps_sps->i1_seq_scaling_matrix_present_flag = 0; 1071 1072 if (ps_sps->i1_seq_scaling_matrix_present_flag) 1073 { 1074 /* TODO_LATER: Will be enabled once scaling list support is added */ 1075 } 1076 } 1077 1078 /* log2_max_frame_num_minus4 */ 1079 ps_sps->i1_log2_max_frame_num = 16; 1080 1081 /* pic_order_cnt_type */ 1082 ps_sps->i1_pic_order_cnt_type = 2; 1083 1084 if (ps_codec->i4_non_ref_frames_in_stream) 1085 { 1086 ps_sps->i1_pic_order_cnt_type = 0; 1087 } 1088 1089 /* log2_max_pic_order_cnt_lsb_minus4 */ 1090 ps_sps->i1_log2_max_pic_order_cnt_lsb = 8; 1091 1092 /* TODO : add support for other poc types */ 1093 if (ps_sps->i1_pic_order_cnt_type == 0) 1094 { 1095 1096 } 1097 else if (ps_sps->i1_pic_order_cnt_type == 1) 1098 { 1099 1100 } 1101 1102 /* num_ref_frames */ 1103 /* TODO : Should we have a flexible num ref frames */ 1104 if (ps_codec->s_cfg.u4_num_bframes > 0) 1105 { 1106 ps_sps->u1_max_num_ref_frames = 2; 1107 } 1108 else 1109 { 1110 ps_sps->u1_max_num_ref_frames = 1; 1111 } 1112 1113 /* gaps_in_frame_num_value_allowed_flag */ 1114 ps_sps->i1_gaps_in_frame_num_value_allowed_flag = 0; 1115 1116 /* pic width in mb - 1 */ 1117 ps_sps->i2_pic_width_in_mbs_minus1 = ps_cfg->i4_wd_mbs - 1; 1118 1119 /* pic height in mb - 1 */ 1120 ps_sps->i2_pic_height_in_map_units_minus1 = ps_cfg->i4_ht_mbs - 1;; 1121 1122 /* frame_mbs_only_flag, no support for interlace encoding */ 1123 ps_sps->i1_frame_mbs_only_flag = 1; 1124 1125 /* mb_adaptive_frame_field_flag */ 1126 if (ps_sps->i1_frame_mbs_only_flag == 0) 1127 { 1128 ps_sps->i1_mb_adaptive_frame_field_flag = 0; 1129 } 1130 1131 /* direct_8x8_inference_flag */ 1132 if (ps_sps->u1_level_idc < IH264_LEVEL_30) 1133 { 1134 ps_sps->i1_direct_8x8_inference_flag = 0; 1135 } 1136 else 1137 { 1138 ps_sps->i1_direct_8x8_inference_flag = 1; 1139 } 1140 1141 /* cropping params */ 1142 /*NOTE : Cropping values depend on the chroma format 1143 * For our case ,decoder interprets the cropping values as 2*num pixels 1144 * Hence the difference in the disp width and width must be halved before sending 1145 * to get the expected results 1146 */ 1147 ps_sps->i1_frame_cropping_flag = 0; 1148 ps_sps->i2_frame_crop_left_offset = 0; 1149 ps_sps->i2_frame_crop_right_offset = (ps_codec->s_cfg.u4_wd - ps_codec->s_cfg.u4_disp_wd)>>1; 1150 ps_sps->i2_frame_crop_top_offset = 0; 1151 ps_sps->i2_frame_crop_bottom_offset = (ps_codec->s_cfg.u4_ht - ps_codec->s_cfg.u4_disp_ht)>>1; 1152 1153 if (ps_sps->i2_frame_crop_left_offset || 1154 ps_sps->i2_frame_crop_right_offset || 1155 ps_sps->i2_frame_crop_top_offset || 1156 ps_sps->i2_frame_crop_bottom_offset) 1157 { 1158 ps_sps->i1_frame_cropping_flag = 1; 1159 } 1160 1161 /* vui params */ 1162 ps_sps->i1_vui_parameters_present_flag = 1; 1163 1164 if (ps_sps->i1_vui_parameters_present_flag) 1165 { 1166 /* populate vui params */ 1167 ih264e_populate_vui(ps_codec); 1168 } 1169 1170 return i4_err_code; 1171} 1172 1173/** 1174****************************************************************************** 1175* 1176* @brief Populates pps structure 1177* 1178* @par Description 1179* Populates pps structure for its use in header generation 1180* 1181* @param[in] ps_codec 1182* pointer to encoder context 1183* 1184* @param[out] ps_pps 1185* pointer to pps params that needs to be populated 1186* 1187* @return success or failure error code 1188* 1189****************************************************************************** 1190*/ 1191IH264E_ERROR_T ih264e_populate_pps(codec_t *ps_codec, pps_t *ps_pps) 1192{ 1193 /* active config parameters */ 1194 cfg_params_t *ps_cfg = &(ps_codec->s_cfg); 1195 1196 /* seq_parameter_set_id */ 1197 ps_pps->u1_sps_id = ps_codec->i4_sps_id; 1198 1199 /* pic_parameter_set_id */ 1200 ps_pps->u1_pps_id = ps_codec->i4_pps_id; 1201 1202 /* entropy_coding_mode */ 1203 ps_pps->u1_entropy_coding_mode_flag = ps_cfg->u4_entropy_coding_mode; 1204 1205 /* pic_order_present_flag is unset if we don't have feilds */ 1206 ps_pps->u1_pic_order_present_flag = 0; 1207 1208 /* Currently number of slice groups supported are 1 */ 1209 ps_pps->u1_num_slice_groups = 1; 1210 1211 if (ps_pps->u1_num_slice_groups - 1) 1212 { 1213 /* TODO_LATER: Currently the number of slice groups minus 1 is 0. 1214 * If this is not the case, we have to add Slice group map type to the bit stream*/ 1215 } 1216 1217 /* number of reference frames for list 0 */ 1218 /* FIXME : fix this hard coded value */ 1219 ps_pps->i1_num_ref_idx_l0_default_active = 1; 1220 1221 /* number of reference frames for list 1 */ 1222 ps_pps->i1_num_ref_idx_l1_default_active = 1; 1223 1224 /* weighted prediction for now is disabled */ 1225 ps_pps->i1_weighted_pred_flag = 0; 1226 ps_pps->i1_weighted_bipred_idc = 0; 1227 1228 /* The intent is to not signal qp from pps. Rather send the same in slice headers */ 1229 ps_pps->i1_pic_init_qp = 0; 1230 1231 /* The intent is to not signal qp from pps. Rather send the same in slice headers */ 1232 ps_pps->i1_pic_init_qs = 0; 1233 1234 /* The intent is to not signal qp from pps. Rather send the same in slice headers */ 1235 ps_pps->i1_chroma_qp_index_offset = 0; 1236 1237 /* deblocking filter flags present in slice header */ 1238 ps_pps->i1_deblocking_filter_control_present_flag = 1; 1239 1240 /* constrained intra prediction */ 1241 ps_pps->i1_constrained_intra_pred_flag = ps_cfg->u4_constrained_intra_pred; 1242 1243 /* sending redundant slices is not supported for now */ 1244 ps_pps->i1_redundant_pic_cnt_present_flag = 0; 1245 1246 ps_pps->u1_slice_group_map_type = 0; 1247 return IH264E_SUCCESS; 1248} 1249 1250/** 1251****************************************************************************** 1252* 1253* @brief Populates slice header structure 1254* 1255* @par Description 1256* Populates slice header structure for its use in header generation 1257* 1258* @param[in] ps_proc 1259* pointer to proc context 1260* 1261* @param[out] ps_slice_hdr 1262* pointer to slice header structure that needs to be populated 1263* 1264* @param[in] ps_pps 1265* pointer to pps params structure referred by the slice 1266* 1267* @param[in] ps_sps 1268* pointer to sps params referred by the pps 1269* 1270* @return success or failure error code 1271* 1272****************************************************************************** 1273*/ 1274WORD32 ih264e_populate_slice_header(process_ctxt_t *ps_proc, 1275 slice_header_t *ps_slice_hdr, 1276 pps_t *ps_pps, 1277 sps_t *ps_sps) 1278{ 1279 /* entropy context */ 1280 entropy_ctxt_t *ps_entropy = &ps_proc->s_entropy; 1281 1282 codec_t *ps_codec = ps_proc->ps_codec; 1283 1284 if (ps_proc->ps_codec->u4_is_curr_frm_ref) 1285 { 1286 ps_slice_hdr->i1_nal_unit_idc = 3; 1287 } 1288 else 1289 { 1290 ps_slice_hdr->i1_nal_unit_idc = 0; 1291 } 1292 1293 /* start mb address */ 1294 ps_slice_hdr->u2_first_mb_in_slice = ps_entropy->i4_mb_start_add; 1295 1296 /* slice type */ 1297 ps_slice_hdr->u1_slice_type = ps_proc->i4_slice_type; 1298 1299 /* pic_parameter_set_id */ 1300 ps_slice_hdr->u1_pps_id = ps_pps->u1_pps_id; 1301 1302 /* Separate color plane flag is 0, 1303 * hence the syntax element color_plane_id not included */ 1304 1305 /* frame num */ 1306 ps_slice_hdr->i4_frame_num = ps_proc->i4_frame_num; 1307 1308 /* frame_mbs_only_flag, no support for interlace encoding */ 1309 if (!ps_sps->i1_frame_mbs_only_flag) 1310 { 1311 ps_slice_hdr->i1_field_pic_flag = 0; 1312 1313 if (ps_slice_hdr->i1_field_pic_flag) 1314 { 1315 ps_slice_hdr->i1_bottom_field_flag = 0; 1316 } 1317 } 1318 1319 /* idr pic id */ 1320 if (ps_proc->u4_is_idr) 1321 { 1322 ps_slice_hdr->u2_idr_pic_id = ps_proc->u4_idr_pic_id; 1323 ps_slice_hdr->i1_nal_unit_type = 5; 1324 } 1325 else 1326 { 1327 ps_slice_hdr->i1_nal_unit_type = 1; 1328 } 1329 1330 if (ps_sps->i1_pic_order_cnt_type == 0) 1331 { 1332 1333 WORD32 i4_poc; 1334 i4_poc = ps_codec->i4_poc; 1335 i4_poc %= (1 << ps_sps->i1_log2_max_pic_order_cnt_lsb); 1336 ps_slice_hdr->i4_pic_order_cnt_lsb = i4_poc; 1337 } 1338 /* TODO add support for poc type 1 */ 1339 else if (ps_sps->i1_pic_order_cnt_type == 1) 1340 { 1341 1342 } 1343 1344 1345 /* 1346 * redundant slices are not currently supported. 1347 * Hence the syntax element redundant slice cnt is not initialized 1348 */ 1349 if (ps_pps->i1_redundant_pic_cnt_present_flag) 1350 { 1351 1352 } 1353 1354 /* direct spatial mv pred flag */ 1355 if (ps_proc->i4_slice_type == BSLICE) 1356 { 1357 ps_slice_hdr->u1_direct_spatial_mv_pred_flag = 1; 1358 } 1359 1360 if (ps_proc->i4_slice_type == PSLICE || ps_proc->i4_slice_type == SPSLICE || ps_proc->i4_slice_type == BSLICE) 1361 { 1362 /* num_ref_idx_active_override_flag */ 1363 ps_slice_hdr->u1_num_ref_idx_active_override_flag = 0; 1364 1365 if (ps_slice_hdr->u1_num_ref_idx_active_override_flag) 1366 { 1367 /* num_ref_idx_l0_active_minus1 */ 1368 1369 if (ps_proc->i4_slice_type == BSLICE) 1370 { 1371 /* num_ref_idx_l1_active_minus1 */ 1372 1373 } 1374 } 1375 } 1376 1377 /* ref_idx_reordering */ 1378 /* TODO: ref_idx_reordering */ 1379 if ((ps_proc->i4_slice_type != ISLICE) && (ps_proc->i4_slice_type != SISLICE)) 1380 { 1381 /* ref_pic_list_reordering_flag_l0 */ 1382 ps_slice_hdr->u1_ref_idx_reordering_flag_l0 = 0; 1383 1384 if (ps_slice_hdr->u1_ref_idx_reordering_flag_l0) 1385 { 1386 1387 } 1388 1389 /* ref_pic_list_reordering_flag_l1 */ 1390 ps_slice_hdr->u1_ref_idx_reordering_flag_l1 = 0; 1391 1392 if (ps_slice_hdr->u1_ref_idx_reordering_flag_l1) 1393 { 1394 1395 } 1396 } 1397 1398 1399 /* Currently we do not support weighted pred */ 1400 /* ps_slice_hdr->u1_weighted_bipred_idc = 0; */ 1401 1402 if ((ps_pps->i1_weighted_pred_flag && 1403 (ps_proc->i4_slice_type == PSLICE || ps_proc->i4_slice_type == SPSLICE)) || 1404 (ps_proc->i4_slice_type == BSLICE && ps_pps->i1_weighted_bipred_idc == 1)) 1405 { 1406 /* TODO_LATER: Currently there is no support for weighted prediction. 1407 This needs to be updated when the support is added */ 1408 } 1409 1410 if (ps_slice_hdr->i1_nal_unit_idc != 0) 1411 { 1412 if (ps_slice_hdr->i1_nal_unit_type == 5) 1413 { 1414 /* no_output_of_prior_pics_flag */ 1415 ps_slice_hdr->u1_no_output_of_prior_pics_flag = 0; 1416 1417 /* long_term_reference_flag */ 1418 ps_slice_hdr->u1_long_term_reference_flag = 0; 1419 } 1420 else 1421 { 1422 /* adaptive_ref_pic_marking_mode_flag */ 1423 ps_slice_hdr->u1_adaptive_ref_pic_marking_mode_flag = 0; 1424 1425 if (ps_slice_hdr->u1_adaptive_ref_pic_marking_mode_flag) 1426 { 1427 /* TODO: if the reference picture marking mode is adaptive 1428 add these fields in the bit-stream */ 1429 } 1430 } 1431 } 1432 1433 /* entropy coding mode flag */ 1434 ps_slice_hdr->u1_entropy_coding_mode_flag = ps_entropy->u1_entropy_coding_mode_flag; 1435 1436 if (ps_slice_hdr->u1_entropy_coding_mode_flag && ps_proc->i4_slice_type != ISLICE && 1437 ps_proc->i4_slice_type != SISLICE) 1438 { 1439 /* cabac_init_idc */ 1440 } 1441 1442 /* slice qp */ 1443 ps_slice_hdr->i1_slice_qp = ps_proc->u4_frame_qp; 1444 1445 if (ps_proc->i4_slice_type == SPSLICE || ps_proc->i4_slice_type == SISLICE) 1446 { 1447 if (ps_proc->i4_slice_type == SPSLICE) 1448 { 1449 /* sp_for_switch_flag */ 1450 } 1451 /* slice_qs_delta */ 1452 } 1453 1454 if (ps_pps->i1_deblocking_filter_control_present_flag) 1455 { 1456 /* disable_deblocking_filter_idc */ 1457 ps_slice_hdr->u1_disable_deblocking_filter_idc = ps_proc->u4_disable_deblock_level; 1458 1459 if (ps_slice_hdr->u1_disable_deblocking_filter_idc != 1) 1460 { 1461 /* slice_alpha_c0_offset_div2 */ 1462 ps_slice_hdr->i1_slice_alpha_c0_offset_div2 = 0; 1463 1464 /* slice_beta_offset_div2 */ 1465 ps_slice_hdr->i1_slice_beta_offset_div2 = 0; 1466 } 1467 } 1468 ps_slice_hdr->u1_num_slice_groups_minus1 = 0; 1469 if(ps_slice_hdr->u1_num_slice_groups_minus1 > 0 && 1470 ps_pps->u1_slice_group_map_type >= 3 && 1471 ps_pps->u1_slice_group_map_type <= 5) 1472 { 1473 /* slice_group_change_cycle */ 1474 /* TODO_LATER: Currently the number of slice groups minus 1 is 0. 1475 * If this is not the case, we have to add Slice group map type to the bit stream */ 1476 } 1477 1478 ps_slice_hdr->i1_cabac_init_idc = CABAC_INIT_IDC; 1479 1480 return IH264E_SUCCESS; 1481} 1482 1483/** 1484****************************************************************************** 1485* 1486* @brief inserts FILLER Nal Unit. 1487* 1488* @par Description 1489* In constant bit rate rc mode, when the bits generated by the codec is 1490* underflowing the target bit rate, the encoder library inserts filler nal unit. 1491* 1492* @param[in] ps_bitstrm 1493* pointer to bitstream context (handle) 1494* 1495* @param[in] insert_fill_bytes 1496* Number of fill bytes to be inserted 1497* 1498* @return success or failure error code 1499* 1500****************************************************************************** 1501*/ 1502IH264E_ERROR_T ih264e_add_filler_nal_unit(bitstrm_t *ps_bitstrm, 1503 WORD32 insert_fill_bytes) 1504{ 1505 WORD32 i4_num_words_to_fill, i4_words_filled; 1506 1507 IH264E_ERROR_T return_status = IH264E_SUCCESS; 1508 1509 /* Insert the NAL start code */ 1510 return_status |= ih264e_put_nal_start_code_prefix(ps_bitstrm, 1); 1511 1512 if (ps_bitstrm->u4_strm_buf_offset + insert_fill_bytes >= ps_bitstrm->u4_max_strm_size) 1513 { 1514 return (IH264E_BITSTREAM_BUFFER_OVERFLOW); 1515 } 1516 1517 /* Insert Nal Unit Header */ 1518 PUT_BITS(ps_bitstrm, NAL_FILLER_FIRST_BYTE, 8, return_status, "filler_header"); 1519 1520 PUT_BITS(ps_bitstrm, 0xFFFFFF, 24, return_status, "fill bytes"); 1521 1522 /* Initializing Variables */ 1523 i4_words_filled = 1; 1524 1525 /****************************************************/ 1526 /* Flooring the number of bytes for be stuffed to */ 1527 /* WORD unit */ 1528 /****************************************************/ 1529 i4_num_words_to_fill = (insert_fill_bytes >> 2); 1530 1531 /****************************************************/ 1532 /* Reducing already 4 bytes filled. In case stuffing*/ 1533 /* is <= 4 bytes, we are actually not stuffing */ 1534 /* anything */ 1535 /****************************************************/ 1536 i4_num_words_to_fill -= i4_words_filled; 1537 1538 while (i4_num_words_to_fill > 0) 1539 { 1540 /* Insert Nal Unit Header */ 1541 PUT_BITS(ps_bitstrm, 0xFFFFFFFF, 32, return_status, "fill bytes"); 1542 1543 i4_num_words_to_fill-- ; 1544 } 1545 1546 return_status |= ih264e_put_rbsp_trailing_bits(ps_bitstrm); 1547 1548 return return_status; 1549} 1550 1551