Expose WebRTC H.264 SPS parser APIs.

Blink RTC video encoder will need this simplified parser to replace
current full H.264 SPS parser, to reduce parsing cost for extracting
frame size from compressed H.264 bitstream.

Bug: b:309132190
Change-Id: I6863f10bd139766d47fe4bff89143c1a91a09287
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/332468
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: Jianlin Qiu <jianlin.qiu@intel.com>
Cr-Commit-Position: refs/heads/main@{#41466}
This commit is contained in:
Qiu Jianlin 2024-01-02 14:22:55 +08:00 committed by WebRTC LUCI CQ
parent 67f0de8614
commit 7121680f38
3 changed files with 10 additions and 7 deletions

View file

@ -17,6 +17,7 @@
#include <vector>
#include "rtc_base/buffer.h"
#include "rtc_base/system/rtc_export.h"
namespace webrtc {
@ -59,11 +60,11 @@ struct NaluIndex {
};
// Returns a vector of the NALU indices in the given buffer.
std::vector<NaluIndex> FindNaluIndices(const uint8_t* buffer,
size_t buffer_size);
RTC_EXPORT std::vector<NaluIndex> FindNaluIndices(const uint8_t* buffer,
size_t buffer_size);
// Get the NAL type from the header byte immediately following start sequence.
NaluType ParseNaluType(uint8_t data);
RTC_EXPORT NaluType ParseNaluType(uint8_t data);
// Methods for parsing and writing RBSP. See section 7.4.1 of the H264 spec.
//

View file

@ -13,15 +13,16 @@
#include "absl/types/optional.h"
#include "rtc_base/bitstream_reader.h"
#include "rtc_base/system/rtc_export.h"
namespace webrtc {
// A class for parsing out sequence parameter set (SPS) data from an H264 NALU.
class SpsParser {
class RTC_EXPORT SpsParser {
public:
// The parsed state of the SPS. Only some select values are stored.
// Add more as they are actually needed.
struct SpsState {
struct RTC_EXPORT SpsState {
SpsState();
SpsState(const SpsState&);
~SpsState();

View file

@ -124,11 +124,12 @@ class BitstreamReader {
};
inline BitstreamReader::BitstreamReader(rtc::ArrayView<const uint8_t> bytes)
: bytes_(bytes.data()), remaining_bits_(bytes.size() * 8) {}
: bytes_(bytes.data()),
remaining_bits_(rtc::checked_cast<int>(bytes.size() * 8)) {}
inline BitstreamReader::BitstreamReader(absl::string_view bytes)
: bytes_(reinterpret_cast<const uint8_t*>(bytes.data())),
remaining_bits_(bytes.size() * 8) {}
remaining_bits_(rtc::checked_cast<int>(bytes.size() * 8)) {}
inline BitstreamReader::~BitstreamReader() {
RTC_DCHECK(last_read_is_verified_) << "Latest calls to Read or ConsumeBit "