blob: 16b967dad4f0370a3b072594b92a9d6c99ecb71e [file] [log] [blame]
/*
* Copyright (c) 2023 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#include "common_video/h265/h265_vps_parser.h"
#include "common_video/h265/h265_common.h"
#include "rtc_base/bit_buffer.h"
#include "rtc_base/bitstream_reader.h"
#include "rtc_base/logging.h"
namespace webrtc {
H265VpsParser::VpsState::VpsState() = default;
// General note: this is based off the 08/2021 version of the H.265 standard.
// You can find it on this page:
// http://www.itu.int/rec/T-REC-H.265
// Unpack RBSP and parse VPS state from the supplied buffer.
absl::optional<H265VpsParser::VpsState> H265VpsParser::ParseVps(
const uint8_t* data,
size_t length) {
RTC_DCHECK(data);
return ParseInternal(H265::ParseRbsp(data, length));
}
absl::optional<H265VpsParser::VpsState> H265VpsParser::ParseInternal(
rtc::ArrayView<const uint8_t> buffer) {
BitstreamReader reader(buffer);
// Now, we need to use a bit buffer to parse through the actual H265 VPS
// format. See Section 7.3.2.1 ("Video parameter set RBSP syntax") of the
// H.265 standard for a complete description.
VpsState vps;
// vps_video_parameter_set_id: u(4)
vps.id = reader.ReadBits(4);
if (!reader.Ok()) {
return absl::nullopt;
}
return vps;
}
} // namespace webrtc