1 /* 2 * This file is part of FFmpeg. 3 * 4 * FFmpeg is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Lesser General Public 6 * License as published by the Free Software Foundation; either 7 * version 2.1 of the License, or (at your option) any later version. 8 * 9 * FFmpeg is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Lesser General Public License for more details. 13 * 14 * You should have received a copy of the GNU Lesser General Public 15 * License along with FFmpeg; if not, write to the Free Software 16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17 */ 18 19 #ifndef AVCODEC_CBS_H264_H 20 #define AVCODEC_CBS_H264_H 21 22 #include <stddef.h> 23 #include <stdint.h> 24 25 #include "cbs.h" 26 #include "cbs_h2645.h" 27 #include "h264.h" 28 29 30 enum { 31 // This limit is arbitrary - it is sufficient for one message of each 32 // type plus some repeats, and will therefore easily cover all sane 33 // streams. However, it is possible to make technically-valid streams 34 // for which it will fail (for example, by including a large number of 35 // user-data-unregistered messages). 36 H264_MAX_SEI_PAYLOADS = 64, 37 }; 38 39 40 typedef struct H264RawNALUnitHeader { 41 uint8_t nal_ref_idc; 42 uint8_t nal_unit_type; 43 44 uint8_t svc_extension_flag; 45 uint8_t avc_3d_extension_flag; 46 } H264RawNALUnitHeader; 47 48 typedef struct H264RawScalingList { 49 int8_t delta_scale[64]; 50 } H264RawScalingList; 51 52 typedef struct H264RawHRD { 53 uint8_t cpb_cnt_minus1; 54 uint8_t bit_rate_scale; 55 uint8_t cpb_size_scale; 56 57 uint32_t bit_rate_value_minus1[H264_MAX_CPB_CNT]; 58 uint32_t cpb_size_value_minus1[H264_MAX_CPB_CNT]; 59 uint8_t cbr_flag[H264_MAX_CPB_CNT]; 60 61 uint8_t initial_cpb_removal_delay_length_minus1; 62 uint8_t cpb_removal_delay_length_minus1; 63 uint8_t dpb_output_delay_length_minus1; 64 uint8_t time_offset_length; 65 } H264RawHRD; 66 67 typedef struct H264RawVUI { 68 uint8_t aspect_ratio_info_present_flag; 69 uint8_t aspect_ratio_idc; 70 uint16_t sar_width; 71 uint16_t sar_height; 72 73 uint8_t overscan_info_present_flag; 74 uint8_t overscan_appropriate_flag; 75 76 uint8_t video_signal_type_present_flag; 77 uint8_t video_format; 78 uint8_t video_full_range_flag; 79 uint8_t colour_description_present_flag; 80 uint8_t colour_primaries; 81 uint8_t transfer_characteristics; 82 uint8_t matrix_coefficients; 83 84 uint8_t chroma_loc_info_present_flag; 85 uint8_t chroma_sample_loc_type_top_field; 86 uint8_t chroma_sample_loc_type_bottom_field; 87 88 uint8_t timing_info_present_flag; 89 uint32_t num_units_in_tick; 90 uint32_t time_scale; 91 uint8_t fixed_frame_rate_flag; 92 93 uint8_t nal_hrd_parameters_present_flag; 94 H264RawHRD nal_hrd_parameters; 95 uint8_t vcl_hrd_parameters_present_flag; 96 H264RawHRD vcl_hrd_parameters; 97 uint8_t low_delay_hrd_flag; 98 99 uint8_t pic_struct_present_flag; 100 101 uint8_t bitstream_restriction_flag; 102 uint8_t motion_vectors_over_pic_boundaries_flag; 103 uint8_t max_bytes_per_pic_denom; 104 uint8_t max_bits_per_mb_denom; 105 uint8_t log2_max_mv_length_horizontal; 106 uint8_t log2_max_mv_length_vertical; 107 uint8_t max_num_reorder_frames; 108 uint8_t max_dec_frame_buffering; 109 } H264RawVUI; 110 111 typedef struct H264RawSPS { 112 H264RawNALUnitHeader nal_unit_header; 113 114 uint8_t profile_idc; 115 uint8_t constraint_set0_flag; 116 uint8_t constraint_set1_flag; 117 uint8_t constraint_set2_flag; 118 uint8_t constraint_set3_flag; 119 uint8_t constraint_set4_flag; 120 uint8_t constraint_set5_flag; 121 uint8_t reserved_zero_2bits; 122 uint8_t level_idc; 123 124 uint8_t seq_parameter_set_id; 125 126 uint8_t chroma_format_idc; 127 uint8_t separate_colour_plane_flag; 128 uint8_t bit_depth_luma_minus8; 129 uint8_t bit_depth_chroma_minus8; 130 uint8_t qpprime_y_zero_transform_bypass_flag; 131 132 uint8_t seq_scaling_matrix_present_flag; 133 uint8_t seq_scaling_list_present_flag[12]; 134 H264RawScalingList scaling_list_4x4[6]; 135 H264RawScalingList scaling_list_8x8[6]; 136 137 uint8_t log2_max_frame_num_minus4; 138 uint8_t pic_order_cnt_type; 139 uint8_t log2_max_pic_order_cnt_lsb_minus4; 140 uint8_t delta_pic_order_always_zero_flag; 141 int32_t offset_for_non_ref_pic; 142 int32_t offset_for_top_to_bottom_field; 143 uint8_t num_ref_frames_in_pic_order_cnt_cycle; 144 int32_t offset_for_ref_frame[256]; 145 146 uint8_t max_num_ref_frames; 147 uint8_t gaps_in_frame_num_allowed_flag; 148 149 uint16_t pic_width_in_mbs_minus1; 150 uint16_t pic_height_in_map_units_minus1; 151 152 uint8_t frame_mbs_only_flag; 153 uint8_t mb_adaptive_frame_field_flag; 154 uint8_t direct_8x8_inference_flag; 155 156 uint8_t frame_cropping_flag; 157 uint16_t frame_crop_left_offset; 158 uint16_t frame_crop_right_offset; 159 uint16_t frame_crop_top_offset; 160 uint16_t frame_crop_bottom_offset; 161 162 uint8_t vui_parameters_present_flag; 163 H264RawVUI vui; 164 } H264RawSPS; 165 166 typedef struct H264RawSPSExtension { 167 H264RawNALUnitHeader nal_unit_header; 168 169 uint8_t seq_parameter_set_id; 170 171 uint8_t aux_format_idc; 172 uint8_t bit_depth_aux_minus8; 173 uint8_t alpha_incr_flag; 174 uint16_t alpha_opaque_value; 175 uint16_t alpha_transparent_value; 176 177 uint8_t additional_extension_flag; 178 } H264RawSPSExtension; 179 180 typedef struct H264RawPPS { 181 H264RawNALUnitHeader nal_unit_header; 182 183 uint8_t pic_parameter_set_id; 184 uint8_t seq_parameter_set_id; 185 186 uint8_t entropy_coding_mode_flag; 187 uint8_t bottom_field_pic_order_in_frame_present_flag; 188 189 uint8_t num_slice_groups_minus1; 190 uint8_t slice_group_map_type; 191 uint16_t run_length_minus1[H264_MAX_SLICE_GROUPS]; 192 uint16_t top_left[H264_MAX_SLICE_GROUPS]; 193 uint16_t bottom_right[H264_MAX_SLICE_GROUPS]; 194 uint8_t slice_group_change_direction_flag; 195 uint16_t slice_group_change_rate_minus1; 196 uint16_t pic_size_in_map_units_minus1; 197 198 uint8_t *slice_group_id; 199 AVBufferRef *slice_group_id_ref; 200 201 uint8_t num_ref_idx_l0_default_active_minus1; 202 uint8_t num_ref_idx_l1_default_active_minus1; 203 204 uint8_t weighted_pred_flag; 205 uint8_t weighted_bipred_idc; 206 207 int8_t pic_init_qp_minus26; 208 int8_t pic_init_qs_minus26; 209 int8_t chroma_qp_index_offset; 210 211 uint8_t deblocking_filter_control_present_flag; 212 uint8_t constrained_intra_pred_flag; 213 214 uint8_t more_rbsp_data; 215 216 uint8_t redundant_pic_cnt_present_flag; 217 uint8_t transform_8x8_mode_flag; 218 219 uint8_t pic_scaling_matrix_present_flag; 220 uint8_t pic_scaling_list_present_flag[12]; 221 H264RawScalingList scaling_list_4x4[6]; 222 H264RawScalingList scaling_list_8x8[6]; 223 224 int8_t second_chroma_qp_index_offset; 225 } H264RawPPS; 226 227 typedef struct H264RawAUD { 228 H264RawNALUnitHeader nal_unit_header; 229 230 uint8_t primary_pic_type; 231 } H264RawAUD; 232 233 typedef struct H264RawSEIBufferingPeriod { 234 uint8_t seq_parameter_set_id; 235 struct { 236 uint32_t initial_cpb_removal_delay[H264_MAX_CPB_CNT]; 237 uint32_t initial_cpb_removal_delay_offset[H264_MAX_CPB_CNT]; 238 } nal, vcl; 239 } H264RawSEIBufferingPeriod; 240 241 typedef struct H264RawSEIPicTimestamp { 242 uint8_t ct_type; 243 uint8_t nuit_field_based_flag; 244 uint8_t counting_type; 245 uint8_t full_timestamp_flag; 246 uint8_t discontinuity_flag; 247 uint8_t cnt_dropped_flag; 248 uint8_t n_frames; 249 uint8_t seconds_flag; 250 uint8_t seconds_value; 251 uint8_t minutes_flag; 252 uint8_t minutes_value; 253 uint8_t hours_flag; 254 uint8_t hours_value; 255 int32_t time_offset; 256 } H264RawSEIPicTimestamp; 257 258 typedef struct H264RawSEIPicTiming { 259 uint32_t cpb_removal_delay; 260 uint32_t dpb_output_delay; 261 uint8_t pic_struct; 262 uint8_t clock_timestamp_flag[3]; 263 H264RawSEIPicTimestamp timestamp[3]; 264 } H264RawSEIPicTiming; 265 266 typedef struct H264RawSEIPanScanRect { 267 uint32_t pan_scan_rect_id; 268 uint8_t pan_scan_rect_cancel_flag; 269 uint8_t pan_scan_cnt_minus1; 270 int32_t pan_scan_rect_left_offset[3]; 271 int32_t pan_scan_rect_right_offset[3]; 272 int32_t pan_scan_rect_top_offset[3]; 273 int32_t pan_scan_rect_bottom_offset[3]; 274 uint16_t pan_scan_rect_repetition_period; 275 } H264RawSEIPanScanRect; 276 277 typedef struct H264RawSEIUserDataRegistered { 278 uint8_t itu_t_t35_country_code; 279 uint8_t itu_t_t35_country_code_extension_byte; 280 uint8_t *data; 281 size_t data_length; 282 AVBufferRef *data_ref; 283 } H264RawSEIUserDataRegistered; 284 285 typedef struct H264RawSEIUserDataUnregistered { 286 uint8_t uuid_iso_iec_11578[16]; 287 uint8_t *data; 288 size_t data_length; 289 AVBufferRef *data_ref; 290 } H264RawSEIUserDataUnregistered; 291 292 typedef struct H264RawSEIRecoveryPoint { 293 uint16_t recovery_frame_cnt; 294 uint8_t exact_match_flag; 295 uint8_t broken_link_flag; 296 uint8_t changing_slice_group_idc; 297 } H264RawSEIRecoveryPoint; 298 299 typedef struct H264RawSEIDisplayOrientation { 300 uint8_t display_orientation_cancel_flag; 301 uint8_t hor_flip; 302 uint8_t ver_flip; 303 uint16_t anticlockwise_rotation; 304 uint16_t display_orientation_repetition_period; 305 uint8_t display_orientation_extension_flag; 306 } H264RawSEIDisplayOrientation; 307 308 typedef struct H264RawSEIMasteringDisplayColourVolume { 309 uint16_t display_primaries_x[3]; 310 uint16_t display_primaries_y[3]; 311 uint16_t white_point_x; 312 uint16_t white_point_y; 313 uint32_t max_display_mastering_luminance; 314 uint32_t min_display_mastering_luminance; 315 } H264RawSEIMasteringDisplayColourVolume; 316 317 typedef struct H264RawSEIAlternativeTransferCharacteristics { 318 uint8_t preferred_transfer_characteristics; 319 } H264RawSEIAlternativeTransferCharacteristics; 320 321 typedef struct H264RawSEIPayload { 322 uint32_t payload_type; 323 uint32_t payload_size; 324 union { 325 H264RawSEIBufferingPeriod buffering_period; 326 H264RawSEIPicTiming pic_timing; 327 H264RawSEIPanScanRect pan_scan_rect; 328 // H264RawSEIFiller filler -> no fields. 329 H264RawSEIUserDataRegistered user_data_registered; 330 H264RawSEIUserDataUnregistered user_data_unregistered; 331 H264RawSEIRecoveryPoint recovery_point; 332 H264RawSEIDisplayOrientation display_orientation; 333 H264RawSEIMasteringDisplayColourVolume mastering_display_colour_volume; 334 H264RawSEIAlternativeTransferCharacteristics 335 alternative_transfer_characteristics; 336 struct { 337 uint8_t *data; 338 size_t data_length; 339 AVBufferRef *data_ref; 340 } other; 341 } payload; 342 } H264RawSEIPayload; 343 344 typedef struct H264RawSEI { 345 H264RawNALUnitHeader nal_unit_header; 346 347 H264RawSEIPayload payload[H264_MAX_SEI_PAYLOADS]; 348 uint8_t payload_count; 349 } H264RawSEI; 350 351 typedef struct H264RawSliceHeader { 352 H264RawNALUnitHeader nal_unit_header; 353 354 uint32_t first_mb_in_slice; 355 uint8_t slice_type; 356 357 uint8_t pic_parameter_set_id; 358 359 uint8_t colour_plane_id; 360 361 uint16_t frame_num; 362 uint8_t field_pic_flag; 363 uint8_t bottom_field_flag; 364 365 uint16_t idr_pic_id; 366 367 uint16_t pic_order_cnt_lsb; 368 int32_t delta_pic_order_cnt_bottom; 369 int32_t delta_pic_order_cnt[2]; 370 371 uint8_t redundant_pic_cnt; 372 uint8_t direct_spatial_mv_pred_flag; 373 374 uint8_t num_ref_idx_active_override_flag; 375 uint8_t num_ref_idx_l0_active_minus1; 376 uint8_t num_ref_idx_l1_active_minus1; 377 378 uint8_t ref_pic_list_modification_flag_l0; 379 uint8_t ref_pic_list_modification_flag_l1; 380 struct { 381 uint8_t modification_of_pic_nums_idc; 382 int32_t abs_diff_pic_num_minus1; 383 uint8_t long_term_pic_num; 384 } rplm_l0[H264_MAX_RPLM_COUNT], rplm_l1[H264_MAX_RPLM_COUNT]; 385 386 uint8_t luma_log2_weight_denom; 387 uint8_t chroma_log2_weight_denom; 388 389 uint8_t luma_weight_l0_flag[H264_MAX_REFS]; 390 int8_t luma_weight_l0[H264_MAX_REFS]; 391 int8_t luma_offset_l0[H264_MAX_REFS]; 392 uint8_t chroma_weight_l0_flag[H264_MAX_REFS]; 393 int8_t chroma_weight_l0[H264_MAX_REFS][2]; 394 int8_t chroma_offset_l0[H264_MAX_REFS][2]; 395 396 uint8_t luma_weight_l1_flag[H264_MAX_REFS]; 397 int8_t luma_weight_l1[H264_MAX_REFS]; 398 int8_t luma_offset_l1[H264_MAX_REFS]; 399 uint8_t chroma_weight_l1_flag[H264_MAX_REFS]; 400 int8_t chroma_weight_l1[H264_MAX_REFS][2]; 401 int8_t chroma_offset_l1[H264_MAX_REFS][2]; 402 403 uint8_t no_output_of_prior_pics_flag; 404 uint8_t long_term_reference_flag; 405 406 uint8_t adaptive_ref_pic_marking_mode_flag; 407 struct { 408 uint8_t memory_management_control_operation; 409 int32_t difference_of_pic_nums_minus1; 410 uint8_t long_term_pic_num; 411 uint8_t long_term_frame_idx; 412 uint8_t max_long_term_frame_idx_plus1; 413 } mmco[H264_MAX_MMCO_COUNT]; 414 415 uint8_t cabac_init_idc; 416 417 int8_t slice_qp_delta; 418 419 uint8_t sp_for_switch_flag; 420 int8_t slice_qs_delta; 421 422 uint8_t disable_deblocking_filter_idc; 423 int8_t slice_alpha_c0_offset_div2; 424 int8_t slice_beta_offset_div2; 425 426 uint16_t slice_group_change_cycle; 427 } H264RawSliceHeader; 428 429 typedef struct H264RawSlice { 430 H264RawSliceHeader header; 431 432 uint8_t *data; 433 size_t data_size; 434 int data_bit_start; 435 AVBufferRef *data_ref; 436 } H264RawSlice; 437 438 typedef struct H264RawFiller { 439 H264RawNALUnitHeader nal_unit_header; 440 441 uint32_t filler_size; 442 } H264RawFiller; 443 444 445 typedef struct CodedBitstreamH264Context { 446 // Reader/writer context in common with the H.265 implementation. 447 CodedBitstreamH2645Context common; 448 449 // All currently available parameter sets. These are updated when 450 // any parameter set NAL unit is read/written with this context. 451 AVBufferRef *sps_ref[H264_MAX_SPS_COUNT]; 452 AVBufferRef *pps_ref[H264_MAX_PPS_COUNT]; 453 H264RawSPS *sps[H264_MAX_SPS_COUNT]; 454 H264RawPPS *pps[H264_MAX_PPS_COUNT]; 455 456 // The currently active parameter sets. These are updated when any 457 // NAL unit refers to the relevant parameter set. These pointers 458 // must also be present in the arrays above. 459 const H264RawSPS *active_sps; 460 const H264RawPPS *active_pps; 461 462 // The NAL unit type of the most recent normal slice. This is required 463 // to be able to read/write auxiliary slices, because IdrPicFlag is 464 // otherwise unknown. 465 uint8_t last_slice_nal_unit_type; 466 } CodedBitstreamH264Context; 467 468 469 /** 470 * Add an SEI message to an access unit. 471 * 472 * On success, the payload will be owned by a unit in access_unit; 473 * on failure, the content of the payload will be freed. 474 */ 475 int ff_cbs_h264_add_sei_message(CodedBitstreamContext *ctx, 476 CodedBitstreamFragment *access_unit, 477 H264RawSEIPayload *payload); 478 479 /** 480 * Delete an SEI message from an access unit. 481 * 482 * Deletes from nal_unit, which must be an SEI NAL unit. If this is the 483 * last message in nal_unit, also deletes it from access_unit. 484 * 485 * Requires nal_unit to be a unit in access_unit and position to be >= 0 486 * and < the payload count of the SEI nal_unit. 487 */ 488 void ff_cbs_h264_delete_sei_message(CodedBitstreamContext *ctx, 489 CodedBitstreamFragment *access_unit, 490 CodedBitstreamUnit *nal_unit, 491 int position); 492 493 #endif /* AVCODEC_CBS_H264_H */ 494