Index: webrtc/common_video/h264/pps_parser.cc |
diff --git a/webrtc/common_video/h264/pps_parser.cc b/webrtc/common_video/h264/pps_parser.cc |
index dd5d63d24619339a37d0402f1c3bdc1ea4c42c80..01a6c76d911ed4670016cf439ae1d8dd01cae52f 100644 |
--- a/webrtc/common_video/h264/pps_parser.cc |
+++ b/webrtc/common_video/h264/pps_parser.cc |
@@ -10,6 +10,8 @@ |
#include "webrtc/common_video/h264/pps_parser.h" |
+#include <memory> |
+ |
#include "webrtc/common_video/h264/h264_common.h" |
#include "webrtc/base/bitbuffer.h" |
#include "webrtc/base/buffer.h" |
@@ -36,6 +38,25 @@ rtc::Optional<PpsParser::PpsState> PpsParser::ParsePps(const uint8_t* data, |
return ParseInternal(&bit_buffer); |
} |
+rtc::Optional<uint32_t> PpsParser::ParsePpsIdFromSlice(const uint8_t* data, |
+ size_t length) { |
+ std::unique_ptr<rtc::Buffer> slice_rbsp(H264::ParseRbsp(data, length)); |
+ rtc::BitBuffer slice_reader(slice_rbsp->data(), slice_rbsp->size()); |
+ |
+ uint32_t golomb_tmp; |
+ // first_mb_in_slice: ue(v) |
+ if (!slice_reader.ReadExponentialGolomb(&golomb_tmp)) |
+ return rtc::Optional<uint32_t>(); |
+ // slice_type: ue(v) |
+ if (!slice_reader.ReadExponentialGolomb(&golomb_tmp)) |
+ return rtc::Optional<uint32_t>(); |
+ // pic_parameter_set_id: ue(v) |
+ uint32_t slice_pps_id; |
+ if (!slice_reader.ReadExponentialGolomb(&slice_pps_id)) |
+ return rtc::Optional<uint32_t>(); |
+ return rtc::Optional<uint32_t>(slice_pps_id); |
+} |
+ |
rtc::Optional<PpsParser::PpsState> PpsParser::ParseInternal( |
rtc::BitBuffer* bit_buffer) { |
PpsState pps; |
@@ -43,9 +64,9 @@ rtc::Optional<PpsParser::PpsState> PpsParser::ParseInternal( |
uint32_t bits_tmp; |
uint32_t golomb_ignored; |
// pic_parameter_set_id: ue(v) |
- RETURN_EMPTY_ON_FAIL(bit_buffer->ReadExponentialGolomb(&golomb_ignored)); |
+ RETURN_EMPTY_ON_FAIL(bit_buffer->ReadExponentialGolomb(&pps.id)); |
// seq_parameter_set_id: ue(v) |
- RETURN_EMPTY_ON_FAIL(bit_buffer->ReadExponentialGolomb(&golomb_ignored)); |
+ RETURN_EMPTY_ON_FAIL(bit_buffer->ReadExponentialGolomb(&pps.sps_id)); |
// entropy_coding_mode_flag: u(1) |
uint32_t entropy_coding_mode_flag; |
RETURN_EMPTY_ON_FAIL(bit_buffer->ReadBits(&entropy_coding_mode_flag, 1)); |