Skip to content
This repository was archived by the owner on Oct 25, 2024. It is now read-only.

Commit 9f7e0a6

Browse files
authored
Add back prefix parser. (#171)
1 parent 30d364e commit 9f7e0a6

File tree

3 files changed

+23
-27
lines changed

3 files changed

+23
-27
lines changed

common_video/BUILD.gn

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ rtc_library("common_video") {
2323
"h264/h264_common.h",
2424
"h264/pps_parser.cc",
2525
"h264/pps_parser.h",
26+
"h264/prefix_parser.cc",
27+
"h264/prefix_parser.h",
2628
"h264/sps_parser.cc",
2729
"h264/sps_parser.h",
2830
"h264/sps_vui_rewriter.cc",

common_video/h264/prefix_parser.cc

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
#include <vector>
1515

1616
#include "common_video/h264/h264_common.h"
17-
#include "rtc_base/bit_buffer.h"
17+
#include "rtc_base/bitstream_reader.h"
1818

1919
namespace {
2020
typedef absl::optional<webrtc::PrefixParser::PrefixState> OptionalPrefix;
@@ -38,46 +38,42 @@ PrefixParser::PrefixState::~PrefixState() = default;
3838
// Unpack RBSP and parse SVC extension state from the supplied buffer.
3939
absl::optional<PrefixParser::PrefixState> PrefixParser::ParsePrefix(
4040
const uint8_t* data,
41-
size_t length) {
41+
size_t length) {
4242
std::vector<uint8_t> unpacked_buffer = H264::ParseRbsp(data, length);
43-
rtc::BitBuffer bit_buffer(unpacked_buffer.data(), unpacked_buffer.size());
44-
return ParsePrefixUpToSvcExtension(&bit_buffer);
43+
BitstreamReader reader(unpacked_buffer);
44+
return ParsePrefixUpToSvcExtension(reader);
4545
}
4646

47-
absl::optional<PrefixParser::PrefixState> PrefixParser::ParsePrefixUpToSvcExtension(
48-
rtc::BitBuffer* buffer) {
47+
absl::optional<PrefixParser::PrefixState>
48+
PrefixParser::ParsePrefixUpToSvcExtension(BitstreamReader& reader) {
4949
// Now, we need to use a bit buffer to parse through the actual SVC extension
5050
// format. See Section 7.3.1 ("NAL unit syntax") and 7.3.1.1 ("NAL unit header
5151
// SVC extension syntax") of the H.264 standard for a complete description.
52-
5352
PrefixState svc_extension;
5453

55-
uint32_t svc_extension_flag = 0;
5654
// Make sure the svc_extension_flag is on.
57-
RETURN_EMPTY_ON_FAIL(buffer->ReadBits(&svc_extension_flag, 1));
55+
bool svc_extension_flag = reader.ReadBit();
5856
if (!svc_extension_flag)
5957
return OptionalPrefix();
6058

6159
// idr_flag: u(1)
62-
RETURN_EMPTY_ON_FAIL(buffer->ReadBits(&svc_extension.idr_flag, 1));
60+
svc_extension.idr_flag = reader.Read<bool>();
6361
// priority_id: u(6)
64-
RETURN_EMPTY_ON_FAIL(buffer->ReadBits(&svc_extension.priority_id, 6));
62+
svc_extension.priority_id = reader.ReadBits(6);
6563
// no_inter_layer_pred_flag: u(1)
66-
RETURN_EMPTY_ON_FAIL(
67-
buffer->ReadBits(&svc_extension.no_inter_layer_pred_flag, 1));
64+
svc_extension.no_inter_layer_pred_flag = reader.Read<bool>();
6865
// dependency_id: u(3)
69-
RETURN_EMPTY_ON_FAIL(buffer->ReadBits(&svc_extension.dependency_id, 3));
66+
svc_extension.dependency_id = reader.ReadBits(3);
7067
// quality_id: u(4)
71-
RETURN_EMPTY_ON_FAIL(buffer->ReadBits(&svc_extension.quality_id, 4));
68+
svc_extension.quality_id = reader.ReadBits(4);
7269
// temporal_id: u(3)
73-
RETURN_EMPTY_ON_FAIL(buffer->ReadBits(&svc_extension.temporal_id, 3));
70+
svc_extension.temporal_id = reader.ReadBits(3);
7471
// use_ref_base_pic_flag: u(1)
75-
RETURN_EMPTY_ON_FAIL(
76-
buffer->ReadBits(&svc_extension.use_ref_base_pic_flag, 1));
72+
svc_extension.use_ref_base_pic_flag = reader.Read<bool>();
7773
// discardable_flag: u(1)
78-
RETURN_EMPTY_ON_FAIL(buffer->ReadBits(&svc_extension.discardable_flag, 1));
74+
svc_extension.discardable_flag = reader.Read<bool>();
7975
// output_flag: u(1)
80-
RETURN_EMPTY_ON_FAIL(buffer->ReadBits(&svc_extension.output_flag, 1));
76+
svc_extension.output_flag = reader.Read<bool>();
8177

8278
return OptionalPrefix(svc_extension);
8379
}

common_video/h264/prefix_parser.h

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,7 @@
1212
#define COMMON_VIDEO_H264_PREFIX_PARSER_H_
1313

1414
#include "absl/types/optional.h"
15-
16-
namespace rtc {
17-
class BitBuffer;
18-
}
15+
#include "rtc_base/bitstream_reader.h"
1916

2017
namespace webrtc {
2118

@@ -44,9 +41,10 @@ class PrefixParser {
4441
static absl::optional<PrefixState> ParsePrefix(const uint8_t* data, size_t length);
4542

4643
protected:
47-
// Parse the prefix NAL, up till the SVC extension part, for a bit buffer where RBSP
48-
// decoding has already been performed.
49-
static absl::optional<PrefixState> ParsePrefixUpToSvcExtension(rtc::BitBuffer* buffer);
44+
// Parse the prefix NAL, up till the SVC extension part, for a bit buffer
45+
// where RBSP decoding has already been performed.
46+
static absl::optional<PrefixState> ParsePrefixUpToSvcExtension(
47+
BitstreamReader& reader);
5048
};
5149

5250
} // namespace webrtc

0 commit comments

Comments
 (0)