From cdcfc4c44b2eefc25c00e047a10a7e752087cbc2 Mon Sep 17 00:00:00 2001 From: Jacob Trimble Date: Mon, 22 Feb 2016 15:32:22 -0800 Subject: [PATCH] Added H.265 parser. This adds a preliminary H.265 parser. The parser only support reading the slice header. This also attaches the H.265 parser to the VideoSliceHeaderReader so H.265 frames can have unencrypted headers. Issue #46 Closes #40 Change-Id: I8b98e1f8bb04e359d9bf896fd5b2939c326b196b --- .../bear-640x360-hevc-v-cenc-golden.mp4 | Bin 92793 -> 92793 bytes packager/media/filters/filters.gyp | 3 + packager/media/filters/h265_parser.cc | 843 ++++++++++++++++++ packager/media/filters/h265_parser.h | 320 +++++++ .../media/filters/h265_parser_unittest.cc | 130 +++ packager/media/filters/h26x_bit_reader.cc | 12 + packager/media/filters/h26x_bit_reader.h | 17 +- .../media/filters/h26x_bit_reader_unittest.cc | 40 + .../formats/mp4/encrypting_fragmenter.cc | 6 +- .../formats/mp4/video_slice_header_parser.cc | 49 +- .../formats/mp4/video_slice_header_parser.h | 18 +- 11 files changed, 1433 insertions(+), 5 deletions(-) create mode 100644 packager/media/filters/h265_parser.cc create mode 100644 packager/media/filters/h265_parser.h create mode 100644 packager/media/filters/h265_parser_unittest.cc diff --git a/packager/app/test/testdata/bear-640x360-hevc-v-cenc-golden.mp4 b/packager/app/test/testdata/bear-640x360-hevc-v-cenc-golden.mp4 index 2ebeb9d96ac80769c307cee08af1577ff6fdf0da..b7be288788eeecf0118906cc8eb0acad0cd1af9d 100644 GIT binary patch delta 62214 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

h(_v0gd1#R@bSZxkn%U8A0a~E@%)hM~ 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 Z=CaIWy$SopcWS>&#>>R?u7>}Llda?X2s!`& diff --git a/packager/media/filters/filters.gyp b/packager/media/filters/filters.gyp index 0066e5ad90..8410654f7e 100644 --- a/packager/media/filters/filters.gyp +++ b/packager/media/filters/filters.gyp @@ -23,6 +23,8 @@ 'h264_byte_to_unit_stream_converter.h', 'h264_parser.cc', 'h264_parser.h', + 'h265_parser.cc', + 'h265_parser.h', 'h26x_bit_reader.cc', 'h26x_bit_reader.h', 'hevc_decoder_configuration.cc', @@ -51,6 +53,7 @@ 'ec3_audio_util_unittest.cc', 'h264_byte_to_unit_stream_converter_unittest.cc', 'h264_parser_unittest.cc', + 'h265_parser_unittest.cc', 'h26x_bit_reader_unittest.cc', 'hevc_decoder_configuration_unittest.cc', 'nal_unit_to_byte_stream_converter_unittest.cc', diff --git a/packager/media/filters/h265_parser.cc b/packager/media/filters/h265_parser.cc new file mode 100644 index 0000000000..1f32c72716 --- /dev/null +++ b/packager/media/filters/h265_parser.cc @@ -0,0 +1,843 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file or at +// https://developers.google.com/open-source/licenses/bsd + +#include "packager/media/filters/h265_parser.h" + +#include +#include + +#include "packager/base/logging.h" +#include "packager/media/filters/nalu_reader.h" + +#define TRUE_OR_RETURN(a) \ + do { \ + if (!(a)) { \ + DVLOG(1) << "Failure while processing " << #a; \ + return kInvalidStream; \ + } \ + } while (0) + +#define OK_OR_RETURN(a) \ + do { \ + Result status = (a); \ + if (status != kOk) \ + return status; \ + } while (false) + +namespace edash_packager { +namespace media { + +namespace { +int GetNumPicTotalCurr(const H265SliceHeader& slice_header, + const H265Sps& sps) { + int num_pic_total_curr = 0; + const H265ReferencePictureSet& ref_pic_set = + slice_header.short_term_ref_pic_set_sps_flag + ? sps.st_ref_pic_sets[slice_header.short_term_ref_pic_set_idx] + : slice_header.st_ref_pic_set; + + for (int i = 0; i < ref_pic_set.num_negative_pics; i++) { + if (ref_pic_set.used_by_curr_pic_s0[i]) + num_pic_total_curr++; + } + for (int i = 0; i < ref_pic_set.num_positive_pics; i++) { + if (ref_pic_set.used_by_curr_pic_s1[i]) + num_pic_total_curr++; + } + + return num_pic_total_curr + slice_header.used_by_curr_pic_lt; +} +} // namespace + +H265Pps::H265Pps() {} +H265Pps::~H265Pps() {} + +H265Sps::H265Sps() {} +H265Sps::~H265Sps() {} + +int H265Sps::GetPicSizeInCtbsY() const { + int min_cb_log2_size_y = log2_min_luma_coding_block_size_minus3 + 3; + int ctb_log2_size_y = + min_cb_log2_size_y + log2_diff_max_min_luma_coding_block_size; + int ctb_size_y = 1 << ctb_log2_size_y; + + // Round-up division. + int pic_width_in_ctbs_y = (pic_width_in_luma_samples - 1) / ctb_size_y + 1; + int pic_height_in_ctbs_y = (pic_height_in_luma_samples - 1) / ctb_size_y + 1; + return pic_width_in_ctbs_y * pic_height_in_ctbs_y; +} + +int H265Sps::GetChromaArrayType() const { + if (!separate_colour_plane_flag) + return chroma_format_idc; + else + return 0; +} + +H265ReferencePictureListModifications::H265ReferencePictureListModifications() { +} +H265ReferencePictureListModifications:: + ~H265ReferencePictureListModifications() {} + +H265SliceHeader::H265SliceHeader() {} +H265SliceHeader::~H265SliceHeader() {} + +H265Parser::H265Parser() {} +H265Parser::~H265Parser() {} + +H265Parser::Result H265Parser::ParseSliceHeader(const Nalu& nalu, + H265SliceHeader* slice_header) { + DCHECK(nalu.is_video_slice()); + *slice_header = H265SliceHeader(); + + // Parses whole element. + H26xBitReader reader; + reader.Initialize(nalu.data() + nalu.header_size(), nalu.payload_size()); + H26xBitReader* br = &reader; + + TRUE_OR_RETURN(br->ReadBool(&slice_header->first_slice_segment_in_pic_flag)); + if (nalu.type() >= Nalu::H265_BLA_W_LP && + nalu.type() <= Nalu::H265_RSV_IRAP_VCL23) { + TRUE_OR_RETURN(br->ReadBool(&slice_header->no_output_of_prior_pics_flag)); + } + + TRUE_OR_RETURN(br->ReadUE(&slice_header->pic_parameter_set_id)); + const H265Pps* pps = GetPps(slice_header->pic_parameter_set_id); + TRUE_OR_RETURN(pps); + + const H265Sps* sps = GetSps(pps->seq_parameter_set_id); + TRUE_OR_RETURN(sps); + + if (!slice_header->first_slice_segment_in_pic_flag) { + if (pps->dependent_slice_segments_enabled_flag) { + TRUE_OR_RETURN(br->ReadBool(&slice_header->dependent_slice_segment_flag)); + } + const int bit_length = ceil(log2(sps->GetPicSizeInCtbsY())); + TRUE_OR_RETURN(br->ReadBits(bit_length, &slice_header->segment_address)); + } + + if (!slice_header->dependent_slice_segment_flag) { + TRUE_OR_RETURN(br->SkipBits(pps->num_extra_slice_header_bits)); + TRUE_OR_RETURN(br->ReadUE(&slice_header->slice_type)); + if (pps->output_flag_present_flag) { + TRUE_OR_RETURN(br->ReadBool(&slice_header->pic_output_flag)); + } + if (sps->separate_colour_plane_flag) { + TRUE_OR_RETURN(br->ReadBits(2, &slice_header->colour_plane_id)); + } + + if (nalu.type() != Nalu::H265_IDR_W_RADL && + nalu.type() != Nalu::H265_IDR_N_LP) { + TRUE_OR_RETURN(br->ReadBits(sps->log2_max_pic_order_cnt_lsb_minus4 + 4, + &slice_header->slice_pic_order_cnt_lsb)); + + TRUE_OR_RETURN( + br->ReadBool(&slice_header->short_term_ref_pic_set_sps_flag)); + if (!slice_header->short_term_ref_pic_set_sps_flag) { + OK_OR_RETURN(ParseReferencePictureSet( + sps->num_short_term_ref_pic_sets, sps->num_short_term_ref_pic_sets, + sps->st_ref_pic_sets, br, &slice_header->st_ref_pic_set)); + } else if (sps->num_short_term_ref_pic_sets > 1) { + TRUE_OR_RETURN( + br->ReadBits(ceil(log2(sps->num_short_term_ref_pic_sets)), + &slice_header->short_term_ref_pic_set_idx)); + } + + if (sps->long_term_ref_pic_present_flag) { + if (sps->num_long_term_ref_pics > 0) { + TRUE_OR_RETURN(br->ReadUE(&slice_header->num_long_term_sps)); + } + TRUE_OR_RETURN(br->ReadUE(&slice_header->num_long_term_pics)); + + const int pic_count = + slice_header->num_long_term_sps + slice_header->num_long_term_pics; + slice_header->long_term_pics_info.resize(pic_count); + for (int i = 0; i < pic_count; i++) { + if (i < slice_header->num_long_term_sps) { + int lt_idx_sps = 0; + if (sps->num_long_term_ref_pics > 1) { + TRUE_OR_RETURN(br->ReadBits( + ceil(log2(sps->num_long_term_ref_pics)), <_idx_sps)); + } + if (sps->used_by_curr_pic_lt_flag[lt_idx_sps]) + slice_header->used_by_curr_pic_lt++; + } else { + TRUE_OR_RETURN(br->SkipBits(sps->log2_max_pic_order_cnt_lsb_minus4 + + 4)); // poc_lsb_lt + bool used_by_curr_pic_lt_flag; + TRUE_OR_RETURN(br->ReadBool(&used_by_curr_pic_lt_flag)); + if (used_by_curr_pic_lt_flag) + slice_header->used_by_curr_pic_lt++; + } + TRUE_OR_RETURN(br->ReadBool(&slice_header->long_term_pics_info[i] + .delta_poc_msb_present_flag)); + if (slice_header->long_term_pics_info[i].delta_poc_msb_present_flag) { + TRUE_OR_RETURN(br->ReadUE( + &slice_header->long_term_pics_info[i].delta_poc_msb_cycle_lt)); + } + } + } + + if (sps->temporal_mvp_enabled_flag) { + TRUE_OR_RETURN( + br->ReadBool(&slice_header->slice_temporal_mvp_enabled_flag)); + } + } + + if (nalu.nuh_layer_id() != 0) { + NOTIMPLEMENTED() << "Multi-layer streams are not supported."; + return kUnsupportedStream; + } + + if (sps->sample_adaptive_offset_enabled_flag) { + TRUE_OR_RETURN(br->ReadBool(&slice_header->slice_sao_luma_flag)); + if (sps->GetChromaArrayType() != 0) { + TRUE_OR_RETURN(br->ReadBool(&slice_header->slice_sao_chroma_flag)); + } + } + + slice_header->num_ref_idx_l0_active_minus1 = + pps->num_ref_idx_l0_default_active_minus1; + slice_header->num_ref_idx_l1_active_minus1 = + pps->num_ref_idx_l1_default_active_minus1; + if (slice_header->slice_type == kPSlice || + slice_header->slice_type == kBSlice) { + TRUE_OR_RETURN( + br->ReadBool(&slice_header->num_ref_idx_active_override_flag)); + if (slice_header->num_ref_idx_active_override_flag) { + TRUE_OR_RETURN(br->ReadUE(&slice_header->num_ref_idx_l0_active_minus1)); + if (slice_header->slice_type == kBSlice) { + TRUE_OR_RETURN( + br->ReadUE(&slice_header->num_ref_idx_l1_active_minus1)); + } + } + + const int num_pic_total_curr = GetNumPicTotalCurr(*slice_header, *sps); + if (pps->lists_modification_present_flag && num_pic_total_curr > 1) { + OK_OR_RETURN(SkipReferencePictureListModification( + *slice_header, *pps, num_pic_total_curr, br)); + } + + if (slice_header->slice_type == kBSlice) { + TRUE_OR_RETURN(br->ReadBool(&slice_header->mvd_l1_zero_flag)); + } + if (pps->cabac_init_present_flag) { + TRUE_OR_RETURN(br->ReadBool(&slice_header->cabac_init_flag)); + } + if (slice_header->slice_temporal_mvp_enabled_flag) { + if (slice_header->slice_type == kBSlice) { + TRUE_OR_RETURN(br->ReadBool(&slice_header->collocated_from_l0)); + } + bool l0_greater_than_0 = slice_header->num_ref_idx_l0_active_minus1 > 0; + bool l1_greater_than_0 = slice_header->num_ref_idx_l1_active_minus1 > 0; + if (slice_header->collocated_from_l0 ? l0_greater_than_0 + : l1_greater_than_0) { + TRUE_OR_RETURN(br->ReadUE(&slice_header->collocated_ref_idx)); + } + } + + if ((pps->weighted_pred_flag && slice_header->slice_type == kPSlice) || + (pps->weighted_bipred_flag && slice_header->slice_type == kBSlice)) { + OK_OR_RETURN(SkipPredictionWeightTable( + slice_header->slice_type == kBSlice, *sps, *slice_header, br)); + } + TRUE_OR_RETURN(br->ReadUE(&slice_header->five_minus_max_num_merge_cand)); + } + + TRUE_OR_RETURN(br->ReadSE(&slice_header->slice_qp_delta)); + if (pps->slice_chroma_qp_offsets_present_flag) { + TRUE_OR_RETURN(br->ReadSE(&slice_header->slice_cb_qp_offset)); + TRUE_OR_RETURN(br->ReadSE(&slice_header->slice_cr_qp_offset)); + } + + if (pps->chroma_qp_offset_list_enabled_flag) { + TRUE_OR_RETURN( + br->ReadBool(&slice_header->cu_chroma_qp_offset_enabled_flag)); + } + if (pps->deblocking_filter_override_enabled_flag) { + TRUE_OR_RETURN( + br->ReadBool(&slice_header->deblocking_filter_override_flag)); + } + if (slice_header->deblocking_filter_override_flag) { + TRUE_OR_RETURN( + br->ReadBool(&slice_header->slice_deblocking_filter_disabled_flag)); + if (!slice_header->slice_deblocking_filter_disabled_flag) { + TRUE_OR_RETURN(br->ReadSE(&slice_header->slice_beta_offset_div2)); + TRUE_OR_RETURN(br->ReadSE(&slice_header->slice_tc_offset_div2)); + } + } + if (pps->loop_filter_across_slices_enabled_flag && + (slice_header->slice_sao_luma_flag || + slice_header->slice_sao_chroma_flag || + !slice_header->slice_deblocking_filter_disabled_flag)) { + TRUE_OR_RETURN(br->ReadBool( + &slice_header->slice_loop_filter_across_slices_enabled_flag)); + } + } + + if (pps->tiles_enabled_flag || pps->entropy_coding_sync_enabled_flag) { + TRUE_OR_RETURN(br->ReadUE(&slice_header->num_entry_point_offsets)); + if (slice_header->num_entry_point_offsets > 0) { + TRUE_OR_RETURN(br->ReadUE(&slice_header->offset_len_minus1)); + slice_header->entry_point_offset_minus1.resize( + slice_header->num_entry_point_offsets); + for (int i = 0; i < slice_header->num_entry_point_offsets; i++) { + TRUE_OR_RETURN( + br->ReadBits(slice_header->offset_len_minus1 + 1, + &slice_header->entry_point_offset_minus1[i])); + } + } + } + + if (pps->slice_segment_header_extension_present_flag) { + int extension_length; + TRUE_OR_RETURN(br->ReadUE(&extension_length)); + TRUE_OR_RETURN(br->SkipBits(extension_length * 8)); + } + + size_t epb = br->NumEmulationPreventionBytesRead(); + slice_header->header_bit_size = + (nalu.payload_size() - epb) * 8 - br->NumBitsLeft(); + + return kOk; +} + +H265Parser::Result H265Parser::ParsePps(const Nalu& nalu, int* pps_id) { + DCHECK_EQ(Nalu::H265_PPS, nalu.type()); + + // Reads most of the element, not reading the extension data. + H26xBitReader reader; + reader.Initialize(nalu.data() + nalu.header_size(), nalu.payload_size()); + H26xBitReader* br = &reader; + + *pps_id = -1; + scoped_ptr pps(new H265Pps); + + TRUE_OR_RETURN(br->ReadUE(&pps->pic_parameter_set_id)); + TRUE_OR_RETURN(br->ReadUE(&pps->seq_parameter_set_id)); + + TRUE_OR_RETURN(br->ReadBool(&pps->dependent_slice_segments_enabled_flag)); + TRUE_OR_RETURN(br->ReadBool(&pps->output_flag_present_flag)); + TRUE_OR_RETURN(br->ReadBits(3, &pps->num_extra_slice_header_bits)); + TRUE_OR_RETURN(br->ReadBool(&pps->sign_data_hiding_enabled_flag)); + TRUE_OR_RETURN(br->ReadBool(&pps->cabac_init_present_flag)); + + TRUE_OR_RETURN(br->ReadUE(&pps->num_ref_idx_l0_default_active_minus1)); + TRUE_OR_RETURN(br->ReadUE(&pps->num_ref_idx_l1_default_active_minus1)); + TRUE_OR_RETURN(br->ReadSE(&pps->init_qp_minus26)); + TRUE_OR_RETURN(br->ReadBool(&pps->constrained_intra_pred_flag)); + TRUE_OR_RETURN(br->ReadBool(&pps->transform_skip_enabled_flag)); + + TRUE_OR_RETURN(br->ReadBool(&pps->cu_qp_delta_enabled_flag)); + if (pps->cu_qp_delta_enabled_flag) + TRUE_OR_RETURN(br->ReadUE(&pps->diff_cu_qp_delta_depth)); + TRUE_OR_RETURN(br->ReadSE(&pps->cb_qp_offset)); + TRUE_OR_RETURN(br->ReadSE(&pps->cr_qp_offset)); + + TRUE_OR_RETURN(br->ReadBool(&pps->slice_chroma_qp_offsets_present_flag)); + TRUE_OR_RETURN(br->ReadBool(&pps->weighted_pred_flag)); + TRUE_OR_RETURN(br->ReadBool(&pps->weighted_bipred_flag)); + TRUE_OR_RETURN(br->ReadBool(&pps->transquant_bypass_enabled_flag)); + TRUE_OR_RETURN(br->ReadBool(&pps->tiles_enabled_flag)); + TRUE_OR_RETURN(br->ReadBool(&pps->entropy_coding_sync_enabled_flag)); + + if (pps->tiles_enabled_flag) { + TRUE_OR_RETURN(br->ReadUE(&pps->num_tile_columns_minus1)); + TRUE_OR_RETURN(br->ReadUE(&pps->num_tile_rows_minus1)); + TRUE_OR_RETURN(br->ReadBool(&pps->uniform_spacing_flag)); + if (!pps->uniform_spacing_flag) { + pps->column_width_minus1.resize(pps->num_tile_columns_minus1); + for (int i = 0; i < pps->num_tile_columns_minus1; i++) { + TRUE_OR_RETURN(br->ReadUE(&pps->column_width_minus1[i])); + } + pps->row_height_minus1.resize(pps->num_tile_rows_minus1); + for (int i = 0; i < pps->num_tile_rows_minus1; i++) { + TRUE_OR_RETURN(br->ReadUE(&pps->row_height_minus1[i])); + } + } + TRUE_OR_RETURN(br->ReadBool(&pps->loop_filter_across_tiles_enabled_flag)); + } + + TRUE_OR_RETURN(br->ReadBool(&pps->loop_filter_across_slices_enabled_flag)); + TRUE_OR_RETURN(br->ReadBool(&pps->deblocking_filter_control_present_flag)); + if (pps->deblocking_filter_control_present_flag) { + TRUE_OR_RETURN(br->ReadBool(&pps->deblocking_filter_override_enabled_flag)); + TRUE_OR_RETURN(br->ReadBool(&pps->deblocking_filter_disabled_flag)); + if (!pps->deblocking_filter_disabled_flag) { + TRUE_OR_RETURN(br->ReadSE(&pps->beta_offset_div2)); + TRUE_OR_RETURN(br->ReadSE(&pps->tc_offset_div2)); + } + } + + TRUE_OR_RETURN(br->ReadBool(&pps->scaling_list_data_present_flag)); + if (pps->scaling_list_data_present_flag) { + OK_OR_RETURN(SkipScalingListData(br)); + } + + TRUE_OR_RETURN(br->ReadBool(&pps->lists_modification_present_flag)); + TRUE_OR_RETURN(br->ReadUE(&pps->log2_parallel_merge_level_minus2)); + + TRUE_OR_RETURN( + br->ReadBool(&pps->slice_segment_header_extension_present_flag)); + + bool pps_extension_present_flag; + bool pps_range_extension_flag = false; + TRUE_OR_RETURN(br->ReadBool(&pps_extension_present_flag)); + if (pps_extension_present_flag) { + TRUE_OR_RETURN(br->ReadBool(&pps_range_extension_flag)); + // pps_multilayer_extension_flag, pps_3d_extension_flag, pps_extension_5bits + TRUE_OR_RETURN(br->SkipBits(1 + 1 + 5)); + } + + if (pps_range_extension_flag) { + if (pps->transform_skip_enabled_flag) { + // log2_max_transform_skip_block_size_minus2 + int ignored; + TRUE_OR_RETURN(br->ReadUE(&ignored)); + } + + TRUE_OR_RETURN(br->SkipBits(1)); // cross_component_prediction_enabled_flag + TRUE_OR_RETURN(br->ReadBool(&pps->chroma_qp_offset_list_enabled_flag)); + // Incomplete + } + + // Ignore remaining extension data. + + // This will replace any existing PPS instance. The scoped_ptr will delete + // the memory when it is overwritten. + *pps_id = pps->pic_parameter_set_id; + active_ppses_[*pps_id] = pps.Pass(); + + return kOk; +} + +H265Parser::Result H265Parser::ParseSps(const Nalu& nalu, int* sps_id) { + DCHECK_EQ(Nalu::H265_SPS, nalu.type()); + + // Reads most of the element, not reading the extension data. + H26xBitReader reader; + reader.Initialize(nalu.data() + nalu.header_size(), nalu.payload_size()); + H26xBitReader* br = &reader; + + *sps_id = -1; + + scoped_ptr sps(new H265Sps); + + TRUE_OR_RETURN(br->ReadBits(4, &sps->video_parameter_set_id)); + TRUE_OR_RETURN(br->ReadBits(3, &sps->max_sub_layers_minus1)); + TRUE_OR_RETURN(br->ReadBool(&sps->temporal_id_nesting_flag)); + + OK_OR_RETURN(SkipProfileTierLevel(true, sps->max_sub_layers_minus1, br)); + + TRUE_OR_RETURN(br->ReadUE(&sps->seq_parameter_set_id)); + TRUE_OR_RETURN(br->ReadUE(&sps->chroma_format_idc)); + if (sps->chroma_format_idc == 3) { + TRUE_OR_RETURN(br->ReadBool(&sps->separate_colour_plane_flag)); + } + TRUE_OR_RETURN(br->ReadUE(&sps->pic_width_in_luma_samples)); + TRUE_OR_RETURN(br->ReadUE(&sps->pic_height_in_luma_samples)); + + TRUE_OR_RETURN(br->ReadBool(&sps->conformance_window_flag)); + if (sps->conformance_window_flag) { + TRUE_OR_RETURN(br->ReadUE(&sps->conf_win_left_offset)); + TRUE_OR_RETURN(br->ReadUE(&sps->conf_win_right_offset)); + TRUE_OR_RETURN(br->ReadUE(&sps->conf_win_top_offset)); + TRUE_OR_RETURN(br->ReadUE(&sps->conf_win_bottom_offset)); + } + + TRUE_OR_RETURN(br->ReadUE(&sps->bit_depth_luma_minus8)); + TRUE_OR_RETURN(br->ReadUE(&sps->bit_depth_chroma_minus8)); + TRUE_OR_RETURN(br->ReadUE(&sps->log2_max_pic_order_cnt_lsb_minus4)); + + TRUE_OR_RETURN(br->ReadBool(&sps->sub_layer_ordering_info_present_flag)); + int start = sps->sub_layer_ordering_info_present_flag + ? 0 + : sps->max_sub_layers_minus1; + for (int i = start; i <= sps->max_sub_layers_minus1; i++) { + TRUE_OR_RETURN(br->ReadUE(&sps->max_dec_pic_buffering_minus1[i])); + TRUE_OR_RETURN(br->ReadUE(&sps->max_num_reorder_pics[i])); + TRUE_OR_RETURN(br->ReadUE(&sps->max_latency_increase_plus1[i])); + } + + TRUE_OR_RETURN(br->ReadUE(&sps->log2_min_luma_coding_block_size_minus3)); + TRUE_OR_RETURN(br->ReadUE(&sps->log2_diff_max_min_luma_coding_block_size)); + TRUE_OR_RETURN(br->ReadUE(&sps->log2_min_luma_transform_block_size_minus2)); + TRUE_OR_RETURN(br->ReadUE(&sps->log2_diff_max_min_luma_transform_block_size)); + TRUE_OR_RETURN(br->ReadUE(&sps->max_transform_hierarchy_depth_inter)); + TRUE_OR_RETURN(br->ReadUE(&sps->max_transform_hierarchy_depth_intra)); + + TRUE_OR_RETURN(br->ReadBool(&sps->scaling_list_enabled_flag)); + if (sps->scaling_list_enabled_flag) { + TRUE_OR_RETURN(br->ReadBool(&sps->scaling_list_data_present_flag)); + if (sps->scaling_list_data_present_flag) { + OK_OR_RETURN(SkipScalingListData(br)); + } + } + + TRUE_OR_RETURN(br->ReadBool(&sps->amp_enabled_flag)); + TRUE_OR_RETURN(br->ReadBool(&sps->sample_adaptive_offset_enabled_flag)); + TRUE_OR_RETURN(br->ReadBool(&sps->pcm_enabled_flag)); + if (sps->pcm_enabled_flag) { + TRUE_OR_RETURN(br->ReadBits(4, &sps->pcm_sample_bit_depth_luma_minus1)); + TRUE_OR_RETURN(br->ReadBits(4, &sps->pcm_sample_bit_depth_chroma_minus1)); + TRUE_OR_RETURN( + br->ReadUE(&sps->log2_min_pcm_luma_coding_block_size_minus3)); + TRUE_OR_RETURN( + br->ReadUE(&sps->log2_diff_max_min_pcm_luma_coding_block_size)); + TRUE_OR_RETURN(br->ReadBool(&sps->pcm_loop_filter_disabled_flag)); + } + + TRUE_OR_RETURN(br->ReadUE(&sps->num_short_term_ref_pic_sets)); + sps->st_ref_pic_sets.resize(sps->num_short_term_ref_pic_sets); + for (int i = 0; i < sps->num_short_term_ref_pic_sets; i++) { + OK_OR_RETURN(ParseReferencePictureSet(sps->num_short_term_ref_pic_sets, i, + sps->st_ref_pic_sets, br, + &sps->st_ref_pic_sets[i])); + } + + TRUE_OR_RETURN(br->ReadBool(&sps->long_term_ref_pic_present_flag)); + if (sps->long_term_ref_pic_present_flag) { + TRUE_OR_RETURN(br->ReadUE(&sps->num_long_term_ref_pics)); + sps->lt_ref_pic_poc_lsb.resize(sps->num_long_term_ref_pics); + sps->used_by_curr_pic_lt_flag.resize(sps->num_long_term_ref_pics); + for (int i = 0; i < sps->num_long_term_ref_pics; i++) { + TRUE_OR_RETURN(br->ReadBits(sps->log2_max_pic_order_cnt_lsb_minus4 + 4, + &sps->lt_ref_pic_poc_lsb[i])); + bool temp; + TRUE_OR_RETURN(br->ReadBool(&temp)); + sps->used_by_curr_pic_lt_flag[i] = temp; + } + } + + TRUE_OR_RETURN(br->ReadBool(&sps->temporal_mvp_enabled_flag)); + TRUE_OR_RETURN(br->ReadBool(&sps->strong_intra_smoothing_enabled_flag)); + + // Ignore remaining extension data. + + // This will replace any existing SPS instance. The scoped_ptr will delete + // the memory when it is overwritten. + *sps_id = sps->seq_parameter_set_id; + active_spses_[*sps_id] = sps.Pass(); + + return kOk; +} + +const H265Pps* H265Parser::GetPps(int pps_id) { + return active_ppses_[pps_id].get(); +} + +const H265Sps* H265Parser::GetSps(int sps_id) { + return active_spses_[sps_id].get(); +} + +H265Parser::Result H265Parser::ParseReferencePictureSet( + int num_short_term_ref_pic_sets, + int st_rps_idx, + const std::vector& ref_pic_sets, + H26xBitReader* br, + H265ReferencePictureSet* out_ref_pic_set) { + // Parses and processess a short-term reference picture set. This needs to + // be done since the size of this element may be dependent on previous + // reference picture sets. + + bool inter_ref_pic_set_prediction = false; + if (st_rps_idx != 0) { + TRUE_OR_RETURN(br->ReadBool(&inter_ref_pic_set_prediction)); + } + + if (inter_ref_pic_set_prediction) { + int delta_idx = 1; + if (st_rps_idx == num_short_term_ref_pic_sets) { + TRUE_OR_RETURN(br->ReadUE(&delta_idx)); + delta_idx++; + TRUE_OR_RETURN(delta_idx <= st_rps_idx); + } + + int ref_rps_idx = st_rps_idx - delta_idx; + DCHECK_LE(0, ref_rps_idx); + DCHECK_LT(ref_rps_idx, st_rps_idx); + + bool delta_rps_sign; + int abs_delta_rps_minus1; + TRUE_OR_RETURN(br->ReadBool(&delta_rps_sign)); + TRUE_OR_RETURN(br->ReadUE(&abs_delta_rps_minus1)); + int delta_rps = + delta_rps_sign ? -(abs_delta_rps_minus1 + 1) : abs_delta_rps_minus1 + 1; + + int ref_num_delta_pocs = ref_pic_sets[ref_rps_idx].num_delta_pocs; + std::vector used_by_curr_pic(ref_num_delta_pocs + 1); + std::vector use_delta(ref_num_delta_pocs + 1); + for (int j = 0; j <= ref_num_delta_pocs; j++) { + bool temp; + TRUE_OR_RETURN(br->ReadBool(&temp)); + used_by_curr_pic[j] = temp; + + if (!used_by_curr_pic[j]) { + TRUE_OR_RETURN(br->ReadBool(&temp)); + use_delta[j] = temp; + } else { + use_delta[j] = true; + } + } + + int ref_num_positive_pics = ref_pic_sets[ref_rps_idx].num_positive_pics; + int ref_num_negative_pics = ref_pic_sets[ref_rps_idx].num_negative_pics; + int i; + + // Update list 0. + { + i = 0; + for (int j = ref_num_positive_pics - 1; j >= 0; j--) { + int d_poc = ref_pic_sets[ref_rps_idx].delta_poc_s1[j] + delta_rps; + if (d_poc < 0 && use_delta[ref_num_negative_pics + j]) { + out_ref_pic_set->delta_poc_s0[i] = d_poc; + out_ref_pic_set->used_by_curr_pic_s0[i] = + used_by_curr_pic[ref_num_negative_pics + j]; + i++; + } + } + if (delta_rps < 0 && use_delta[ref_num_delta_pocs]) { + out_ref_pic_set->delta_poc_s0[i] = delta_rps; + out_ref_pic_set->used_by_curr_pic_s0[i] = + used_by_curr_pic[ref_num_delta_pocs]; + i++; + } + for (int j = 0; j < ref_num_negative_pics; j++) { + int d_poc = ref_pic_sets[ref_rps_idx].delta_poc_s0[j] + delta_rps; + if (d_poc < 0 && use_delta[j]) { + out_ref_pic_set->delta_poc_s0[i] = d_poc; + out_ref_pic_set->used_by_curr_pic_s0[i] = used_by_curr_pic[j]; + i++; + } + } + out_ref_pic_set->num_negative_pics = i; + } + + // Update list 1. + { + i = 0; + for (int j = ref_num_negative_pics - 1; j >= 0; j--) { + int d_poc = ref_pic_sets[ref_rps_idx].delta_poc_s0[j] + delta_rps; + if (d_poc > 0 && use_delta[j]) { + out_ref_pic_set->delta_poc_s1[i] = d_poc; + out_ref_pic_set->used_by_curr_pic_s1[i] = used_by_curr_pic[j]; + i++; + } + } + if (delta_rps > 0 && use_delta[ref_num_delta_pocs]) { + out_ref_pic_set->delta_poc_s1[i] = delta_rps; + out_ref_pic_set->used_by_curr_pic_s1[i] = + used_by_curr_pic[ref_num_delta_pocs]; + i++; + } + for (int j = 0; j < ref_num_positive_pics; j++) { + int d_poc = ref_pic_sets[ref_rps_idx].delta_poc_s1[j] + delta_rps; + if (d_poc > 0 && use_delta[ref_num_negative_pics + j]) { + out_ref_pic_set->delta_poc_s1[i] = d_poc; + out_ref_pic_set->used_by_curr_pic_s1[i] = + used_by_curr_pic[ref_num_negative_pics + j]; + i++; + } + } + out_ref_pic_set->num_positive_pics = i; + } + } else { + TRUE_OR_RETURN(br->ReadUE(&out_ref_pic_set->num_negative_pics)); + TRUE_OR_RETURN(br->ReadUE(&out_ref_pic_set->num_positive_pics)); + + int prev_poc = 0; + for (int i = 0; i < out_ref_pic_set->num_negative_pics; i++) { + int delta_poc_s0_minus1; + TRUE_OR_RETURN(br->ReadUE(&delta_poc_s0_minus1)); + out_ref_pic_set->delta_poc_s0[i] = prev_poc - (delta_poc_s0_minus1 + 1); + prev_poc = out_ref_pic_set->delta_poc_s0[i]; + + TRUE_OR_RETURN(br->ReadBool(&out_ref_pic_set->used_by_curr_pic_s0[i])); + } + + prev_poc = 0; + for (int i = 0; i < out_ref_pic_set->num_positive_pics; i++) { + int delta_poc_s1_minus1; + TRUE_OR_RETURN(br->ReadUE(&delta_poc_s1_minus1)); + out_ref_pic_set->delta_poc_s1[i] = prev_poc + delta_poc_s1_minus1 + 1; + prev_poc = out_ref_pic_set->delta_poc_s1[i]; + + TRUE_OR_RETURN(br->ReadBool(&out_ref_pic_set->used_by_curr_pic_s1[i])); + } + } + + out_ref_pic_set->num_delta_pocs = + out_ref_pic_set->num_positive_pics + out_ref_pic_set->num_negative_pics; + return kOk; +} + +H265Parser::Result H265Parser::SkipReferencePictureListModification( + const H265SliceHeader& slice_header, + const H265Pps& pps, + int num_pic_total_curr, + H26xBitReader* br) { + // Reads whole element but ignores it all. + + bool ref_pic_list_modification_flag_l0; + TRUE_OR_RETURN(br->ReadBool(&ref_pic_list_modification_flag_l0)); + if (ref_pic_list_modification_flag_l0) { + for (int i = 0; i <= pps.num_ref_idx_l0_default_active_minus1; i++) { + TRUE_OR_RETURN(br->SkipBits(ceil(log2(num_pic_total_curr)))); + } + } + + if (slice_header.slice_type == kBSlice) { + bool ref_pic_list_modification_flag_l1; + TRUE_OR_RETURN(br->ReadBool(&ref_pic_list_modification_flag_l1)); + if (ref_pic_list_modification_flag_l1) { + for (int i = 0; i <= pps.num_ref_idx_l1_default_active_minus1; i++) { + TRUE_OR_RETURN(br->SkipBits(ceil(log2(num_pic_total_curr)))); + } + } + } + + return kOk; +} + +H265Parser::Result H265Parser::SkipPredictionWeightTablePart( + int num_ref_idx_minus1, + int chroma_array_type, + H26xBitReader* br) { + // Reads whole element, ignores it. + int ignored; + std::vector luma_weight_flag(num_ref_idx_minus1 + 1); + std::vector chroma_weight_flag(num_ref_idx_minus1 + 1); + + for (int i = 0; i <= num_ref_idx_minus1; i++) { + bool temp; + TRUE_OR_RETURN(br->ReadBool(&temp)); + luma_weight_flag[i] = temp; + } + if (chroma_array_type != 0) { + for (int i = 0; i <= num_ref_idx_minus1; i++) { + bool temp; + TRUE_OR_RETURN(br->ReadBool(&temp)); + chroma_weight_flag[i] = temp; + } + } + for (int i = 0; i <= num_ref_idx_minus1; i++) { + if (luma_weight_flag[i]) { + TRUE_OR_RETURN(br->ReadSE(&ignored)); // delta_luma_weight_l# + TRUE_OR_RETURN(br->ReadSE(&ignored)); // luma_offset_l# + } + if (chroma_weight_flag[i]) { + for (int j = 0; j < 2; j++) { + TRUE_OR_RETURN(br->ReadSE(&ignored)); // delta_chroma_weight_l# + TRUE_OR_RETURN(br->ReadSE(&ignored)); // delta_chroma_offset_l# + } + } + } + + return kOk; +} + +H265Parser::Result H265Parser::SkipPredictionWeightTable( + bool is_b_slice, + const H265Sps& sps, + const H265SliceHeader& slice_header, + H26xBitReader* br) { + // Reads whole element, ignores it. + int ignored; + int chroma_array_type = sps.GetChromaArrayType(); + + TRUE_OR_RETURN(br->ReadUE(&ignored)); // luma_log2_weight_denom + if (chroma_array_type != 0) { + TRUE_OR_RETURN(br->ReadSE(&ignored)); // delta_chroma_log2_weight_denom + } + OK_OR_RETURN(SkipPredictionWeightTablePart( + slice_header.num_ref_idx_l0_active_minus1, chroma_array_type, br)); + if (is_b_slice) { + OK_OR_RETURN(SkipPredictionWeightTablePart( + slice_header.num_ref_idx_l1_active_minus1, chroma_array_type, br)); + } + + return kOk; +} + +H265Parser::Result H265Parser::SkipProfileTierLevel( + bool profile_present, + int max_num_sub_layers_minus1, + H26xBitReader* br) { + // Reads whole element, ignores it. + + if (profile_present) { + // general_profile_space, general_tier_flag, general_profile_idc + // general_profile_compativility_flag + // general_progressive_source_flag + // general_interlaced_source_flag + // general_non_packed_constraint_flag + // general_frame_only_constraint_flag + // 44-bits of other flags + TRUE_OR_RETURN(br->SkipBits(2 + 1 + 5 + 32 + 4 + 44)); + } + + TRUE_OR_RETURN(br->SkipBits(8)); // general_level_idc + + std::vector sub_layer_profile_present(max_num_sub_layers_minus1); + std::vector sub_layer_level_present(max_num_sub_layers_minus1); + for (int i = 0; i < max_num_sub_layers_minus1; i++) { + bool profile, level; + TRUE_OR_RETURN(br->ReadBool(&profile)); + TRUE_OR_RETURN(br->ReadBool(&level)); + sub_layer_profile_present[i] = profile; + sub_layer_level_present[i] = level; + } + + if (max_num_sub_layers_minus1 > 0) { + for (int i = max_num_sub_layers_minus1; i < 8; i++) + TRUE_OR_RETURN(br->SkipBits(2)); // reserved_zero_2bits + } + + for (int i = 0; i < max_num_sub_layers_minus1; i++) { + if (sub_layer_profile_present[i]) { + // sub_layer_profile_space, sub_layer_tier_flag, sub_layer_profile_idc + // sub_layer_profile_compatibility + // sub_layer_reserved_zero_43bits + // sub_layer_reserved_zero_bit + TRUE_OR_RETURN(br->SkipBits(2 + 1 + 5 + 32 + 4 + 43 + 1)); + } + if (sub_layer_level_present[i]) { + TRUE_OR_RETURN(br->SkipBits(8)); + } + } + + return kOk; +} + +H265Parser::Result H265Parser::SkipScalingListData(H26xBitReader* br) { + // Reads whole element, ignores it. + int ignored; + for (int size_id = 0; size_id < 4; size_id++) { + for (int matrix_id = 0; matrix_id < 6; + matrix_id += ((size_id == 3) ? 3 : 1)) { + bool scaling_list_pred_mode; + TRUE_OR_RETURN(br->ReadBool(&scaling_list_pred_mode)); + if (!scaling_list_pred_mode) { + // scaling_list_pred_matrix_id_delta + TRUE_OR_RETURN(br->ReadUE(&ignored)); + } else { + int coefNum = std::min(64, (1 << (4 + (size_id << 1)))); + if (size_id > 1) { + TRUE_OR_RETURN(br->ReadSE(&ignored)); // scaling_list_dc_coef_minus8 + } + + for (int i = 0; i < coefNum; i++) { + TRUE_OR_RETURN(br->ReadSE(&ignored)); // scaling_list_delta_coef + } + } + } + } + + return kOk; +} + +} // namespace media +} // namespace edash_packager diff --git a/packager/media/filters/h265_parser.h b/packager/media/filters/h265_parser.h new file mode 100644 index 0000000000..e70cf1fdb0 --- /dev/null +++ b/packager/media/filters/h265_parser.h @@ -0,0 +1,320 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file or at +// https://developers.google.com/open-source/licenses/bsd + +#ifndef MEDIA_FILTERS_H265_PARSER_H_ +#define MEDIA_FILTERS_H265_PARSER_H_ + +#include +#include + +#include "packager/base/memory/scoped_ptr.h" +#include "packager/media/filters/h26x_bit_reader.h" + +namespace edash_packager { +namespace media { + +class Nalu; + +enum H265SliceType { kBSlice = 0, kPSlice = 1, kISlice = 2 }; + +const int kMaxRefPicSetCount = 16; + +struct H265ReferencePictureSet { + int delta_poc_s0[kMaxRefPicSetCount]; + int delta_poc_s1[kMaxRefPicSetCount]; + bool used_by_curr_pic_s0[kMaxRefPicSetCount]; + bool used_by_curr_pic_s1[kMaxRefPicSetCount]; + + int num_negative_pics; + int num_positive_pics; + int num_delta_pocs; +}; + +struct H265Pps { + H265Pps(); + ~H265Pps(); + + // Many of the fields here are required when parsing so the default here may + // not be valid. + + int pic_parameter_set_id = 0; + int seq_parameter_set_id = 0; + + bool dependent_slice_segments_enabled_flag = false; + bool output_flag_present_flag = false; + int num_extra_slice_header_bits = 0; + bool sign_data_hiding_enabled_flag = false; + bool cabac_init_present_flag = false; + + int num_ref_idx_l0_default_active_minus1 = 0; + int num_ref_idx_l1_default_active_minus1 = 0; + int init_qp_minus26 = 0; + bool constrained_intra_pred_flag = false; + bool transform_skip_enabled_flag = false; + + bool cu_qp_delta_enabled_flag = 0; + int diff_cu_qp_delta_depth = 0; + int cb_qp_offset = 0; + int cr_qp_offset = 0; + + bool slice_chroma_qp_offsets_present_flag = false; + bool weighted_pred_flag = false; + bool weighted_bipred_flag = false; + bool transquant_bypass_enabled_flag = false; + bool tiles_enabled_flag = false; + bool entropy_coding_sync_enabled_flag = false; + + int num_tile_columns_minus1 = 0; + int num_tile_rows_minus1 = 0; + bool uniform_spacing_flag = true; + std::vector column_width_minus1; + std::vector row_height_minus1; + bool loop_filter_across_tiles_enabled_flag = true; + + bool loop_filter_across_slices_enabled_flag = false; + bool deblocking_filter_control_present_flag = false; + bool deblocking_filter_override_enabled_flag = false; + bool deblocking_filter_disabled_flag = false; + int beta_offset_div2 = 0; + int tc_offset_div2 = 0; + + bool scaling_list_data_present_flag = false; + // Ignored: scaling_list_data( ) + + bool lists_modification_present_flag = false; + int log2_parallel_merge_level_minus2 = 0; + bool slice_segment_header_extension_present_flag = false; + + // Incomplete: pps_range_extension: + bool chroma_qp_offset_list_enabled_flag = false; + + // Ignored: extensions... +}; + +struct H265Sps { + H265Sps(); + ~H265Sps(); + + int GetPicSizeInCtbsY() const; + int GetChromaArrayType() const; + + // Many of the fields here are required when parsing so the default here may + // not be valid. + + int video_parameter_set_id = 0; + int max_sub_layers_minus1 = 0; + bool temporal_id_nesting_flag = false; + // Ignored: profile_tier_level(...) + + int seq_parameter_set_id = 0; + + int chroma_format_idc = 0; + bool separate_colour_plane_flag = false; + int pic_width_in_luma_samples = 0; + int pic_height_in_luma_samples = 0; + + bool conformance_window_flag = false; + int conf_win_left_offset = 0; + int conf_win_right_offset = 0; + int conf_win_top_offset = 0; + int conf_win_bottom_offset = 0; + + int bit_depth_luma_minus8 = 0; + int bit_depth_chroma_minus8 = 0; + int log2_max_pic_order_cnt_lsb_minus4 = 0; + + bool sub_layer_ordering_info_present_flag = false; + int max_dec_pic_buffering_minus1[8]; + int max_num_reorder_pics[8]; + int max_latency_increase_plus1[8]; + + int log2_min_luma_coding_block_size_minus3 = 0; + int log2_diff_max_min_luma_coding_block_size = 0; + int log2_min_luma_transform_block_size_minus2 = 0; + int log2_diff_max_min_luma_transform_block_size = 0; + int max_transform_hierarchy_depth_inter = 0; + int max_transform_hierarchy_depth_intra = 0; + + bool scaling_list_enabled_flag = false; + bool scaling_list_data_present_flag = false; + // Ignored: scaling_list_data() + + bool amp_enabled_flag = false; + bool sample_adaptive_offset_enabled_flag = false; + bool pcm_enabled_flag = false; + int pcm_sample_bit_depth_luma_minus1 = 0; + int pcm_sample_bit_depth_chroma_minus1 = 0; + int log2_min_pcm_luma_coding_block_size_minus3 = 0; + int log2_diff_max_min_pcm_luma_coding_block_size = 0; + bool pcm_loop_filter_disabled_flag = false; + + int num_short_term_ref_pic_sets = 0; + std::vector st_ref_pic_sets; + + bool long_term_ref_pic_present_flag = false; + int num_long_term_ref_pics = 0; + std::vector lt_ref_pic_poc_lsb; + std::vector used_by_curr_pic_lt_flag; + + bool temporal_mvp_enabled_flag = false; + bool strong_intra_smoothing_enabled_flag = false; + + // Ignored: extensions... +}; + +struct H265ReferencePictureListModifications { + H265ReferencePictureListModifications(); + ~H265ReferencePictureListModifications(); + + bool ref_pic_list_modification_flag_l0 = false; + std::vector list_entry_l0; + + bool ref_pic_list_modification_flag_l1 = false; + std::vector list_entry_l1; +}; + +struct H265SliceHeader { + H265SliceHeader(); + ~H265SliceHeader(); + + struct LongTermPicsInfo { + bool delta_poc_msb_present_flag; + int delta_poc_msb_cycle_lt; + }; + // This is the value UsedByCurrPicLt for the current slice segment. This + // value is calulated from the LongTermPicsInfo during parsing. + int used_by_curr_pic_lt = 0; + + // Many of the fields here are required when parsing so the default here may + // not be valid. + + int header_bit_size = 0; + + bool first_slice_segment_in_pic_flag = false; + bool no_output_of_prior_pics_flag = false; + int pic_parameter_set_id = 0; + + bool dependent_slice_segment_flag = false; + int segment_address = 0; + int slice_type = 0; + bool pic_output_flag = true; + int colour_plane_id = 0; + int slice_pic_order_cnt_lsb = 0; + + bool short_term_ref_pic_set_sps_flag = false; + H265ReferencePictureSet st_ref_pic_set; + int short_term_ref_pic_set_idx = 0; + + int num_long_term_sps = 0; + int num_long_term_pics = 0; + std::vector long_term_pics_info; + + bool slice_temporal_mvp_enabled_flag = false; + bool slice_sao_luma_flag = false; + bool slice_sao_chroma_flag = false; + + bool num_ref_idx_active_override_flag = false; + int num_ref_idx_l0_active_minus1 = 0; + int num_ref_idx_l1_active_minus1 = 0; + + H265ReferencePictureListModifications ref_pic_lists_modification; + + bool mvd_l1_zero_flag = false; + bool cabac_init_flag = false; + bool collocated_from_l0 = true; + int collocated_ref_idx = 0; + + int five_minus_max_num_merge_cand = 0; + int slice_qp_delta = 0; + int slice_cb_qp_offset = 0; + int slice_cr_qp_offset = 0; + + bool cu_chroma_qp_offset_enabled_flag = false; + bool deblocking_filter_override_flag = false; + bool slice_deblocking_filter_disabled_flag = false; + int slice_beta_offset_div2 = 0; + int slice_tc_offset_div2 = 0; + bool slice_loop_filter_across_slices_enabled_flag = false; + + int num_entry_point_offsets = 0; + int offset_len_minus1 = 0; + std::vector entry_point_offset_minus1; +}; + +/// A class to parse H.265 streams. This is incomplete and skips many pieces. +/// This will mostly parse PPS and SPS elements as well as fully parse a +/// slice header. +class H265Parser { + public: + enum Result { + kOk, + kInvalidStream, // error in stream + kUnsupportedStream, // stream not supported by the parser + kEOStream, // end of stream + }; + + H265Parser(); + ~H265Parser(); + + /// Parses a video slice header. If this returns kOk, then |*slice_header| + /// will contain the parsed header; if it returns something else, the + /// contents of |*slice_header| are undefined. + Result ParseSliceHeader(const Nalu& nalu, H265SliceHeader* slice_header); + + /// Parses a PPS element. This object is owned and managed by this class. + /// The unique ID of the parsed PPS is stored in |*pps_id| if kOk is returned. + Result ParsePps(const Nalu& nalu, int* pps_id); + /// Parses a SPS element. This object is owned and managed by this class. + /// The unique ID of the parsed SPS is stored in |*sps_id| if kOk is returned. + Result ParseSps(const Nalu& nalu, int* sps_id); + + /// @return a pointer to the PPS with the given ID, or NULL if none exists. + const H265Pps* GetPps(int pps_id); + /// @return a pointer to the SPS with the given ID, or NULL if none exists. + const H265Sps* GetSps(int sps_id); + + private: + Result ParseReferencePictureSet( + int num_short_term_ref_pic_sets, + int st_rpx_idx, + const std::vector& ref_pic_sets, + H26xBitReader* br, + H265ReferencePictureSet* st_ref_pic_set); + + Result SkipReferencePictureListModification( + const H265SliceHeader& slice_header, + const H265Pps& pps, + int num_pic_total_curr, + H26xBitReader* br); + + Result SkipPredictionWeightTablePart(int num_ref_idx_minus1, + int chroma_array_type, + H26xBitReader* br); + + Result SkipPredictionWeightTable(bool is_b_slice, + const H265Sps& sps, + const H265SliceHeader& slice_header, + H26xBitReader* br); + + Result SkipProfileTierLevel(bool profile_present, + int max_num_sub_layers_minus1, + H26xBitReader* br); + + Result SkipScalingListData(H26xBitReader* br); + + typedef std::map> SpsById; + typedef std::map> PpsById; + + SpsById active_spses_; + PpsById active_ppses_; + + DISALLOW_COPY_AND_ASSIGN(H265Parser); +}; + +} // namespace media +} // namespace edash_packager + +#endif // MEDIA_FILTERS_H265_PARSER_H_ diff --git a/packager/media/filters/h265_parser_unittest.cc b/packager/media/filters/h265_parser_unittest.cc new file mode 100644 index 0000000000..b7c7302bca --- /dev/null +++ b/packager/media/filters/h265_parser_unittest.cc @@ -0,0 +1,130 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file or at +// https://developers.google.com/open-source/licenses/bsd + +#include + +#include "packager/media/filters/h265_parser.h" +#include "packager/media/filters/nalu_reader.h" + +namespace edash_packager { +namespace media { +namespace H265 { + +namespace { + +// Data taken from bear-640x360-hevc.mp4 +const uint8_t kSpsData[] = { + 0x42, 0x01, 0x01, 0x01, 0x60, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3f, 0xa0, 0x05, 0x02, 0x01, 0x69, 0x65, 0x95, 0xe4, 0x93, + 0x2b, 0xc0, 0x40, 0x40, 0x00, 0x00, 0xfa, 0x40, 0x00, 0x1d, 0x4c, 0x02}; +const uint8_t kPpsData[] = {0x44, 0x01, 0xc1, 0x73, 0xd1, 0x89}; +const uint8_t kSliceData[] = { + // Incomplete segment data. + 0x26, 0x01, 0xaf, 0x08, 0x4c, 0x2e, 0xa6, 0x56, 0xd9, 0xaf, 0x50, 0xeb, + 0x94, 0x9a, 0xae, 0x89, 0x29, 0x0e, 0x42, 0x9f, 0xb9, 0x5e, 0x85, 0xd5}; +const uint8_t kSliceData2[] = {0x02, 0x01, 0xd0, 0x29, 0xc9, 0xfd, 0x63, 0x22, + 0x52, 0x04, 0x06, 0x13, 0x3d, 0xc6, 0xf0, 0xb9, + 0x55, 0x98, 0xa0, 0x16, 0x57, 0xf6, 0xb8, 0x25}; + +} // namespace + +TEST(H265ParserTest, ParseSliceHeader) { + // Parse the SPS and PPS first so the data is available. + int id; + Nalu nalu; + H265Parser parser; + ASSERT_TRUE(nalu.InitializeFromH265(kSpsData, arraysize(kSpsData))); + ASSERT_EQ(H265Parser::kOk, parser.ParseSps(nalu, &id)); + ASSERT_TRUE(nalu.InitializeFromH265(kPpsData, arraysize(kPpsData))); + ASSERT_EQ(H265Parser::kOk, parser.ParsePps(nalu, &id)); + + // Parse the slice header. + ASSERT_TRUE(nalu.InitializeFromH265(kSliceData, arraysize(kSliceData))); + ASSERT_EQ(Nalu::H265_IDR_W_RADL, nalu.type()); + + H265SliceHeader header; + ASSERT_EQ(H265Parser::kOk, parser.ParseSliceHeader(nalu, &header)); + + EXPECT_TRUE(header.first_slice_segment_in_pic_flag); + EXPECT_EQ(0, header.pic_parameter_set_id); + EXPECT_FALSE(header.dependent_slice_segment_flag); + EXPECT_EQ(2, header.slice_type); + EXPECT_EQ(8, header.slice_qp_delta); + EXPECT_FALSE(header.cu_chroma_qp_offset_enabled_flag); + EXPECT_EQ(5, header.num_entry_point_offsets); + EXPECT_EQ(85, header.header_bit_size); +} + +TEST(H265ParserTest, ParseSliceHeader_NonIDR) { + // Parse the SPS and PPS first so the data is available. + int id; + Nalu nalu; + H265Parser parser; + ASSERT_TRUE(nalu.InitializeFromH265(kSpsData, arraysize(kSpsData))); + ASSERT_EQ(H265Parser::kOk, parser.ParseSps(nalu, &id)); + ASSERT_TRUE(nalu.InitializeFromH265(kPpsData, arraysize(kPpsData))); + ASSERT_EQ(H265Parser::kOk, parser.ParsePps(nalu, &id)); + + // Parse the slice header. + ASSERT_TRUE(nalu.InitializeFromH265(kSliceData2, arraysize(kSliceData2))); + ASSERT_EQ(1 /* TRAIL_R */, nalu.type()); + + H265SliceHeader header; + ASSERT_EQ(H265Parser::kOk, parser.ParseSliceHeader(nalu, &header)); + + EXPECT_TRUE(header.first_slice_segment_in_pic_flag); + EXPECT_EQ(0, header.pic_parameter_set_id); + EXPECT_FALSE(header.dependent_slice_segment_flag); + EXPECT_EQ(1, header.slice_type); + EXPECT_EQ(5, header.num_entry_point_offsets); + EXPECT_EQ(124, header.header_bit_size); +} + +TEST(H265ParserTest, ParseSps) { + Nalu nalu; + ASSERT_TRUE(nalu.InitializeFromH265(kSpsData, arraysize(kSpsData))); + ASSERT_EQ(Nalu::H265_SPS, nalu.type()); + + int id = 12; + H265Parser parser; + ASSERT_EQ(H265Parser::kOk, parser.ParseSps(nalu, &id)); + ASSERT_EQ(0, id); + + const H265Sps* sps = parser.GetSps(id); + ASSERT_TRUE(sps); + + EXPECT_EQ(0, sps->video_parameter_set_id); + EXPECT_EQ(0, sps->max_sub_layers_minus1); + EXPECT_EQ(0, sps->seq_parameter_set_id); + EXPECT_EQ(1, sps->chroma_format_idc); + EXPECT_EQ(360, sps->pic_height_in_luma_samples); + EXPECT_EQ(4, sps->log2_max_pic_order_cnt_lsb_minus4); + EXPECT_EQ(3, sps->log2_diff_max_min_luma_transform_block_size); + EXPECT_EQ(0, sps->max_transform_hierarchy_depth_intra); +} + +TEST(H265ParserTest, ParsePps) { + Nalu nalu; + ASSERT_TRUE(nalu.InitializeFromH265(kPpsData, arraysize(kPpsData))); + ASSERT_EQ(Nalu::H265_PPS, nalu.type()); + + int id = 12; + H265Parser parser; + ASSERT_EQ(H265Parser::kOk, parser.ParsePps(nalu, &id)); + ASSERT_EQ(0, id); + + const H265Pps* pps = parser.GetPps(id); + ASSERT_TRUE(pps); + + EXPECT_EQ(0, pps->num_extra_slice_header_bits); + EXPECT_TRUE(pps->weighted_pred_flag); + EXPECT_FALSE(pps->scaling_list_data_present_flag); + EXPECT_EQ(0, pps->log2_parallel_merge_level_minus2); +} + +} // namespace H265 +} // namespace media +} // namespace edash_packager diff --git a/packager/media/filters/h26x_bit_reader.cc b/packager/media/filters/h26x_bit_reader.cc index 68eb100123..2a8cbd75e0 100644 --- a/packager/media/filters/h26x_bit_reader.cc +++ b/packager/media/filters/h26x_bit_reader.cc @@ -86,6 +86,18 @@ bool H26xBitReader::ReadBits(int num_bits, int* out) { return true; } +bool H26xBitReader::SkipBits(int num_bits) { + int bits_left = num_bits; + while (num_remaining_bits_in_curr_byte_ < bits_left) { + bits_left -= num_remaining_bits_in_curr_byte_; + if (!UpdateCurrByte()) + return false; + } + + num_remaining_bits_in_curr_byte_ -= bits_left; + return true; +} + bool H26xBitReader::ReadUE(int* val) { int num_bits = -1; int bit; diff --git a/packager/media/filters/h26x_bit_reader.h b/packager/media/filters/h26x_bit_reader.h index 4ecebd1317..65cb8e8ad9 100644 --- a/packager/media/filters/h26x_bit_reader.h +++ b/packager/media/filters/h26x_bit_reader.h @@ -15,7 +15,7 @@ namespace edash_packager { namespace media { -// A class to provide bit-granularity reading of H.264 streams. +// A class to provide bit-granularity reading of H.264/H.265 streams. // This is not a generic bit reader class, as it takes into account // H.264 stream-specific constraints, such as skipping emulation-prevention // bytes and stop bits. See spec for more details. @@ -36,6 +36,21 @@ class H26xBitReader { // bits in the stream), true otherwise. bool ReadBits(int num_bits, int* out); + // Read a single bit and return in |*out|. + // Return false if the bit cannot be read (not enough bits in the stream), + // true otherwise. + bool ReadBool(bool* out) { + int value; + if (!ReadBits(1, &value)) + return false; + *out = (value != 0); + return true; + } + + // Skips the given number of bits (does not have to be less than 32 bits). + // Return false if there aren't enough bits in the stream, true otherwise. + bool SkipBits(int num_bits); + // Exp-Golomb code parsing as specified in chapter 9.1 of the spec. // Read one unsigned exp-Golomb code from the stream and return in |*val|. bool ReadUE(int* val); diff --git a/packager/media/filters/h26x_bit_reader_unittest.cc b/packager/media/filters/h26x_bit_reader_unittest.cc index 6ec6bdaf72..200fd68551 100644 --- a/packager/media/filters/h26x_bit_reader_unittest.cc +++ b/packager/media/filters/h26x_bit_reader_unittest.cc @@ -57,6 +57,46 @@ TEST(H26xBitReaderTest, SingleByteStream) { EXPECT_FALSE(reader.HasMoreRBSPData()); } +TEST(H26xBitReaderTest, ReadBool) { + H26xBitReader reader; + const unsigned char rbsp[] = {0xc5}; + bool dummy = false; + + EXPECT_TRUE(reader.Initialize(rbsp, sizeof(rbsp))); + EXPECT_EQ(reader.NumBitsLeft(), 8); + + EXPECT_TRUE(reader.ReadBool(&dummy)); + EXPECT_TRUE(dummy); + EXPECT_TRUE(reader.ReadBool(&dummy)); + EXPECT_TRUE(dummy); + EXPECT_TRUE(reader.ReadBool(&dummy)); + EXPECT_FALSE(dummy); + EXPECT_TRUE(reader.ReadBool(&dummy)); + EXPECT_FALSE(dummy); + + EXPECT_EQ(reader.NumBitsLeft(), 4); +} + +TEST(H26xBitReaderTest, SkipBits) { + H26xBitReader reader; + const unsigned char rbsp[] = {0xc5, 0x41, 0x51}; + int dummy; + + EXPECT_TRUE(reader.Initialize(rbsp, sizeof(rbsp))); + EXPECT_EQ(reader.NumBitsLeft(), 24); + + EXPECT_TRUE(reader.SkipBits(3)); + EXPECT_EQ(21, reader.NumBitsLeft()); + EXPECT_TRUE(reader.ReadBits(4, &dummy)); + EXPECT_EQ(0x2, dummy); + EXPECT_TRUE(reader.SkipBits(8)); + EXPECT_EQ(9, reader.NumBitsLeft()); + EXPECT_TRUE(reader.ReadBits(5, &dummy)); + EXPECT_EQ(0x15, dummy); + EXPECT_EQ(4, reader.NumBitsLeft()); + EXPECT_FALSE(reader.SkipBits(5)); +} + TEST(H26xBitReaderTest, StopBitOccupyFullByte) { H26xBitReader reader; const unsigned char rbsp[] = {0xab, 0x80}; diff --git a/packager/media/formats/mp4/encrypting_fragmenter.cc b/packager/media/formats/mp4/encrypting_fragmenter.cc index efc522cd76..d6c17f507e 100644 --- a/packager/media/formats/mp4/encrypting_fragmenter.cc +++ b/packager/media/formats/mp4/encrypting_fragmenter.cc @@ -80,8 +80,12 @@ EncryptingFragmenter::EncryptingFragmenter( vpx_parser_.reset(new VP9Parser); } else if (video_codec_ == kCodecH264) { header_parser_.reset(new H264VideoSliceHeaderParser); + } else if (video_codec_ == kCodecHVC1 || video_codec_ == kCodecHEV1) { + header_parser_.reset(new H265VideoSliceHeaderParser); + } else if (nalu_length_size_ > 0) { + LOG(WARNING) << "Unknown video codec '" << video_codec_ + << "', whole subsamples will be encrypted."; } - // TODO(modmaker): Support H.265. } EncryptingFragmenter::~EncryptingFragmenter() {} diff --git a/packager/media/formats/mp4/video_slice_header_parser.cc b/packager/media/formats/mp4/video_slice_header_parser.cc index ba914cf721..df03b2b6ac 100644 --- a/packager/media/formats/mp4/video_slice_header_parser.cc +++ b/packager/media/formats/mp4/video_slice_header_parser.cc @@ -7,12 +7,23 @@ #include "packager/media/formats/mp4/video_slice_header_parser.h" #include "packager/media/filters/avc_decoder_configuration.h" +#include "packager/media/filters/hevc_decoder_configuration.h" #include "packager/media/formats/mp4/rcheck.h" namespace edash_packager { namespace media { namespace mp4 { +namespace { + +int NumBitsToNumBytes(int size_in_bits) { + // Round-up division. + DCHECK_GE(size_in_bits, 0); + return (size_in_bits - 1) / 8 + 1; +} + +} // namespace + H264VideoSliceHeaderParser::H264VideoSliceHeaderParser() {} H264VideoSliceHeaderParser::~H264VideoSliceHeaderParser() {} @@ -41,8 +52,42 @@ int64_t H264VideoSliceHeaderParser::GetHeaderSize(const Nalu& nalu) { if (parser_.ParseSliceHeader(nalu, &slice_header) != H264Parser::kOk) return -1; - // Round-up to bytes. - return (slice_header.header_bit_size - 1) / 8 + 1; + return NumBitsToNumBytes(slice_header.header_bit_size); +} + +H265VideoSliceHeaderParser::H265VideoSliceHeaderParser() {} +H265VideoSliceHeaderParser::~H265VideoSliceHeaderParser() {} + +bool H265VideoSliceHeaderParser::Initialize( + const std::vector& decoder_configuration) { + int id; + HEVCDecoderConfiguration hevc_config; + RCHECK(hevc_config.Parse(decoder_configuration)); + + for (size_t i = 0; i < hevc_config.nalu_count(); i++) { + const Nalu& nalu = hevc_config.nalu(i); + if (nalu.type() == Nalu::H265_SPS) { + RCHECK(parser_.ParseSps(nalu, &id) == H265Parser::kOk); + } else if (nalu.type() == Nalu::H265_PPS) { + RCHECK(parser_.ParsePps(nalu, &id) == H265Parser::kOk); + } else if (nalu.type() == Nalu::H265_VPS) { + // Ignore since it does not affect video slice header parsing. + } else { + VLOG(1) << "Ignoring decoder configuration Nalu of unknown type " + << nalu.type(); + } + } + + return true; +} + +int64_t H265VideoSliceHeaderParser::GetHeaderSize(const Nalu& nalu) { + DCHECK(nalu.is_video_slice()); + H265SliceHeader slice_header; + if (parser_.ParseSliceHeader(nalu, &slice_header) != H265Parser::kOk) + return -1; + + return NumBitsToNumBytes(slice_header.header_bit_size); } } // namespace mp4 diff --git a/packager/media/formats/mp4/video_slice_header_parser.h b/packager/media/formats/mp4/video_slice_header_parser.h index c78e35b809..01a0db06fc 100644 --- a/packager/media/formats/mp4/video_slice_header_parser.h +++ b/packager/media/formats/mp4/video_slice_header_parser.h @@ -11,6 +11,7 @@ #include "packager/media/base/macros.h" #include "packager/media/filters/h264_parser.h" +#include "packager/media/filters/h265_parser.h" namespace edash_packager { namespace media { @@ -50,7 +51,22 @@ class H264VideoSliceHeaderParser : public VideoSliceHeaderParser { DISALLOW_COPY_AND_ASSIGN(H264VideoSliceHeaderParser); }; -// TODO(modmaker): Add H.265 parser. +class H265VideoSliceHeaderParser : public VideoSliceHeaderParser { + public: + H265VideoSliceHeaderParser(); + ~H265VideoSliceHeaderParser() override; + + /// @name VideoSliceHeaderParser implementation overrides. + /// @{ + bool Initialize(const std::vector& decoder_configuration) override; + int64_t GetHeaderSize(const Nalu& nalu) override; + /// @} + + private: + H265Parser parser_; + + DISALLOW_COPY_AND_ASSIGN(H265VideoSliceHeaderParser); +}; } // namespace mp4 } // namespace media