Change Av1 depacketizer to implement VideoRtpDepacketizer interface
Bug: webrtc:11152
Change-Id: I322115263f60439bee36277157a0acef9bd28e3e
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/165343
Reviewed-by: Sam Zackrisson <saza@webrtc.org>
Reviewed-by: Philip Eliasson <philipel@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#30260}
diff --git a/modules/rtp_rtcp/BUILD.gn b/modules/rtp_rtcp/BUILD.gn
index 055a361..30769e2 100644
--- a/modules/rtp_rtcp/BUILD.gn
+++ b/modules/rtp_rtcp/BUILD.gn
@@ -167,8 +167,6 @@
"source/rtcp_receiver.h",
"source/rtcp_sender.cc",
"source/rtcp_sender.h",
- "source/rtp_depacketizer_av1.cc",
- "source/rtp_depacketizer_av1.h",
"source/rtp_format.cc",
"source/rtp_format.h",
"source/rtp_format_h264.cc",
@@ -213,6 +211,8 @@
"source/ulpfec_receiver_impl.cc",
"source/ulpfec_receiver_impl.h",
"source/video_rtp_depacketizer.h",
+ "source/video_rtp_depacketizer_av1.cc",
+ "source/video_rtp_depacketizer_av1.h",
"source/video_rtp_depacketizer_generic.cc",
"source/video_rtp_depacketizer_generic.h",
"source/video_rtp_depacketizer_h264.cc",
@@ -461,7 +461,6 @@
"source/rtcp_sender_unittest.cc",
"source/rtcp_transceiver_impl_unittest.cc",
"source/rtcp_transceiver_unittest.cc",
- "source/rtp_depacketizer_av1_unittest.cc",
"source/rtp_fec_unittest.cc",
"source/rtp_format_h264_unittest.cc",
"source/rtp_format_unittest.cc",
@@ -487,6 +486,7 @@
"source/ulpfec_generator_unittest.cc",
"source/ulpfec_header_reader_writer_unittest.cc",
"source/ulpfec_receiver_unittest.cc",
+ "source/video_rtp_depacketizer_av1_unittest.cc",
"source/video_rtp_depacketizer_generic_unittest.cc",
"source/video_rtp_depacketizer_h264_unittest.cc",
"source/video_rtp_depacketizer_raw_unittest.cc",
diff --git a/modules/rtp_rtcp/source/create_video_rtp_depacketizer.cc b/modules/rtp_rtcp/source/create_video_rtp_depacketizer.cc
index af1b50f..d96741b 100644
--- a/modules/rtp_rtcp/source/create_video_rtp_depacketizer.cc
+++ b/modules/rtp_rtcp/source/create_video_rtp_depacketizer.cc
@@ -14,8 +14,8 @@
#include "absl/memory/memory.h"
#include "absl/types/optional.h"
-#include "modules/rtp_rtcp/source/rtp_depacketizer_av1.h"
#include "modules/rtp_rtcp/source/video_rtp_depacketizer.h"
+#include "modules/rtp_rtcp/source/video_rtp_depacketizer_av1.h"
#include "modules/rtp_rtcp/source/video_rtp_depacketizer_generic.h"
#include "modules/rtp_rtcp/source/video_rtp_depacketizer_h264.h"
#include "modules/rtp_rtcp/source/video_rtp_depacketizer_vp8.h"
@@ -60,7 +60,7 @@
case kVideoCodecVP9:
return std::make_unique<VideoRtpDepacketizerVp9>();
case kVideoCodecAV1:
- return std::make_unique<Legacy<RtpDepacketizerAv1>>();
+ return std::make_unique<VideoRtpDepacketizerAv1>();
case kVideoCodecGeneric:
case kVideoCodecMultiplex:
return std::make_unique<VideoRtpDepacketizerGeneric>();
diff --git a/modules/rtp_rtcp/source/rtp_depacketizer_av1.h b/modules/rtp_rtcp/source/rtp_depacketizer_av1.h
deleted file mode 100644
index f9ed7bf..0000000
--- a/modules/rtp_rtcp/source/rtp_depacketizer_av1.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (c) 2019 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.
- */
-
-#ifndef MODULES_RTP_RTCP_SOURCE_RTP_DEPACKETIZER_AV1_H_
-#define MODULES_RTP_RTCP_SOURCE_RTP_DEPACKETIZER_AV1_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "api/array_view.h"
-#include "api/scoped_refptr.h"
-#include "api/video/encoded_image.h"
-#include "modules/rtp_rtcp/source/rtp_format.h"
-
-namespace webrtc {
-
-class RtpDepacketizerAv1 : public RtpDepacketizer {
- public:
- RtpDepacketizerAv1() = default;
- RtpDepacketizerAv1(const RtpDepacketizerAv1&) = delete;
- RtpDepacketizerAv1& operator=(const RtpDepacketizerAv1&) = delete;
- ~RtpDepacketizerAv1() override = default;
-
- static rtc::scoped_refptr<EncodedImageBuffer> AssembleFrame(
- rtc::ArrayView<const rtc::ArrayView<const uint8_t>> rtp_payloads);
-
- bool Parse(ParsedPayload* parsed_payload,
- const uint8_t* payload_data,
- size_t payload_data_length) override;
-};
-
-} // namespace webrtc
-#endif // MODULES_RTP_RTCP_SOURCE_RTP_DEPACKETIZER_AV1_H_
diff --git a/modules/rtp_rtcp/source/rtp_packetizer_av1_unittest.cc b/modules/rtp_rtcp/source/rtp_packetizer_av1_unittest.cc
index 9e6ab18..5930f4c 100644
--- a/modules/rtp_rtcp/source/rtp_packetizer_av1_unittest.cc
+++ b/modules/rtp_rtcp/source/rtp_packetizer_av1_unittest.cc
@@ -20,8 +20,8 @@
#include "api/array_view.h"
#include "api/scoped_refptr.h"
#include "api/video/encoded_image.h"
-#include "modules/rtp_rtcp/source/rtp_depacketizer_av1.h"
#include "modules/rtp_rtcp/source/rtp_packet_to_send.h"
+#include "modules/rtp_rtcp/source/video_rtp_depacketizer_av1.h"
#include "test/gmock.h"
#include "test/gtest.h"
@@ -104,7 +104,7 @@
for (size_t i = 0; i < rtp_payloads.size(); ++i) {
payloads[i] = rtp_payloads[i];
}
- return Av1Frame(RtpDepacketizerAv1::AssembleFrame(payloads));
+ return Av1Frame(VideoRtpDepacketizerAv1::AssembleFrame(payloads));
}
class Obu {
diff --git a/modules/rtp_rtcp/source/rtp_depacketizer_av1.cc b/modules/rtp_rtcp/source/video_rtp_depacketizer_av1.cc
similarity index 94%
rename from modules/rtp_rtcp/source/rtp_depacketizer_av1.cc
rename to modules/rtp_rtcp/source/video_rtp_depacketizer_av1.cc
index 71890e9..af2ed0c 100644
--- a/modules/rtp_rtcp/source/rtp_depacketizer_av1.cc
+++ b/modules/rtp_rtcp/source/video_rtp_depacketizer_av1.cc
@@ -8,11 +8,13 @@
* be found in the AUTHORS file in the root of the source tree.
*/
-#include "modules/rtp_rtcp/source/rtp_depacketizer_av1.h"
+#include "modules/rtp_rtcp/source/video_rtp_depacketizer_av1.h"
#include <stddef.h>
#include <stdint.h>
+#include <utility>
+
#include "modules/rtp_rtcp/source/rtp_video_header.h"
#include "rtc_base/byte_buffer.h"
#include "rtc_base/checks.h"
@@ -333,7 +335,7 @@
} // namespace
-rtc::scoped_refptr<EncodedImageBuffer> RtpDepacketizerAv1::AssembleFrame(
+rtc::scoped_refptr<EncodedImageBuffer> VideoRtpDepacketizerAv1::AssembleFrame(
rtc::ArrayView<const rtc::ArrayView<const uint8_t>> rtp_payloads) {
VectorObuInfo obu_infos = ParseObus(rtp_payloads);
if (obu_infos.empty()) {
@@ -363,42 +365,40 @@
return bitstream;
}
-bool RtpDepacketizerAv1::Parse(ParsedPayload* parsed_payload,
- const uint8_t* payload_data,
- size_t payload_data_length) {
- RTC_DCHECK(parsed_payload);
- if (payload_data_length == 0) {
+absl::optional<VideoRtpDepacketizer::ParsedRtpPayload>
+VideoRtpDepacketizerAv1::Parse(rtc::CopyOnWriteBuffer rtp_payload) {
+ if (rtp_payload.size() == 0) {
RTC_DLOG(LS_ERROR) << "Empty rtp payload.";
- return false;
+ return absl::nullopt;
}
- uint8_t aggregation_header = payload_data[0];
+ uint8_t aggregation_header = rtp_payload.cdata()[0];
if (RtpStartsNewCodedVideoSequence(aggregation_header) &&
RtpStartsWithFragment(aggregation_header)) {
// new coded video sequence can't start from an OBU fragment.
- return false;
+ return absl::nullopt;
}
+ absl::optional<ParsedRtpPayload> parsed(absl::in_place);
// To assemble frame, all of the rtp payload is required, including
// aggregation header.
- parsed_payload->payload = payload_data;
- parsed_payload->payload_length = payload_data_length;
+ parsed->video_payload = std::move(rtp_payload);
- parsed_payload->video.codec = VideoCodecType::kVideoCodecAV1;
+ parsed->video_header.codec = VideoCodecType::kVideoCodecAV1;
// These are not accurate since frame may consist of several packet aligned
// chunks of obus, but should be good enough for most cases. It might produce
// frame that do not map to any real frame, but av1 decoder should be able to
// handle it since it promise to handle individual obus rather than full
// frames.
- parsed_payload->video.is_first_packet_in_frame =
+ parsed->video_header.is_first_packet_in_frame =
!RtpStartsWithFragment(aggregation_header);
- parsed_payload->video.is_last_packet_in_frame =
+ parsed->video_header.is_last_packet_in_frame =
!RtpEndsWithFragment(aggregation_header);
- parsed_payload->video.frame_type =
+ parsed->video_header.frame_type =
RtpStartsNewCodedVideoSequence(aggregation_header)
? VideoFrameType::kVideoFrameKey
: VideoFrameType::kVideoFrameDelta;
- return true;
+ return parsed;
}
} // namespace webrtc
diff --git a/modules/rtp_rtcp/source/video_rtp_depacketizer_av1.h b/modules/rtp_rtcp/source/video_rtp_depacketizer_av1.h
new file mode 100644
index 0000000..9758d84
--- /dev/null
+++ b/modules/rtp_rtcp/source/video_rtp_depacketizer_av1.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2019 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.
+ */
+
+#ifndef MODULES_RTP_RTCP_SOURCE_VIDEO_RTP_DEPACKETIZER_AV1_H_
+#define MODULES_RTP_RTCP_SOURCE_VIDEO_RTP_DEPACKETIZER_AV1_H_
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include "absl/types/optional.h"
+#include "api/array_view.h"
+#include "api/scoped_refptr.h"
+#include "api/video/encoded_image.h"
+#include "modules/rtp_rtcp/source/video_rtp_depacketizer.h"
+#include "rtc_base/copy_on_write_buffer.h"
+
+namespace webrtc {
+
+class VideoRtpDepacketizerAv1 : public VideoRtpDepacketizer {
+ public:
+ VideoRtpDepacketizerAv1() = default;
+ VideoRtpDepacketizerAv1(const VideoRtpDepacketizerAv1&) = delete;
+ VideoRtpDepacketizerAv1& operator=(const VideoRtpDepacketizerAv1&) = delete;
+ ~VideoRtpDepacketizerAv1() override = default;
+
+ static rtc::scoped_refptr<EncodedImageBuffer> AssembleFrame(
+ rtc::ArrayView<const rtc::ArrayView<const uint8_t>> rtp_payloads);
+
+ absl::optional<ParsedRtpPayload> Parse(
+ rtc::CopyOnWriteBuffer rtp_payload) override;
+};
+
+} // namespace webrtc
+#endif // MODULES_RTP_RTCP_SOURCE_VIDEO_RTP_DEPACKETIZER_AV1_H_
diff --git a/modules/rtp_rtcp/source/rtp_depacketizer_av1_unittest.cc b/modules/rtp_rtcp/source/video_rtp_depacketizer_av1_unittest.cc
similarity index 74%
rename from modules/rtp_rtcp/source/rtp_depacketizer_av1_unittest.cc
rename to modules/rtp_rtcp/source/video_rtp_depacketizer_av1_unittest.cc
index d0d0670..9a3e1f7 100644
--- a/modules/rtp_rtcp/source/rtp_depacketizer_av1_unittest.cc
+++ b/modules/rtp_rtcp/source/video_rtp_depacketizer_av1_unittest.cc
@@ -8,7 +8,7 @@
* be found in the AUTHORS file in the root of the source tree.
*/
-#include "modules/rtp_rtcp/source/rtp_depacketizer_av1.h"
+#include "modules/rtp_rtcp/source/video_rtp_depacketizer_av1.h"
#include "test/gmock.h"
#include "test/gtest.h"
@@ -26,94 +26,106 @@
constexpr uint8_t kObuHeaderHasSize = 0b0'0000'010;
-TEST(RtpDepacketizerAv1Test, ParsePassFullRtpPayloadAsCodecPayload) {
+TEST(VideoRtpDepacketizerAv1Test, ParsePassFullRtpPayloadAsCodecPayload) {
const uint8_t packet[] = {(uint8_t{1} << 7) | kObuCountOne, 1, 2, 3, 4};
- RtpDepacketizerAv1 depacketizer;
- RtpDepacketizer::ParsedPayload parsed;
- ASSERT_TRUE(depacketizer.Parse(&parsed, packet, sizeof(packet)));
- EXPECT_EQ(parsed.payload_length, sizeof(packet));
- EXPECT_TRUE(parsed.payload == packet);
+ rtc::CopyOnWriteBuffer rtp_payload(packet);
+ VideoRtpDepacketizerAv1 depacketizer;
+ absl::optional<VideoRtpDepacketizer::ParsedRtpPayload> parsed =
+ depacketizer.Parse(rtp_payload);
+ ASSERT_TRUE(parsed);
+ EXPECT_EQ(parsed->video_payload.size(), sizeof(packet));
+ EXPECT_TRUE(parsed->video_payload.cdata() == rtp_payload.cdata());
}
-TEST(RtpDepacketizerAv1Test, ParseTreatsContinuationFlagAsNotBeginningOfFrame) {
+TEST(VideoRtpDepacketizerAv1Test,
+ ParseTreatsContinuationFlagAsNotBeginningOfFrame) {
const uint8_t packet[] = {
(uint8_t{1} << 7) | kObuCountOne,
kObuHeaderFrame}; // Value doesn't matter since it is a
// continuation of the OBU from previous packet.
- RtpDepacketizerAv1 depacketizer;
- RtpDepacketizer::ParsedPayload parsed;
- ASSERT_TRUE(depacketizer.Parse(&parsed, packet, sizeof(packet)));
- EXPECT_FALSE(parsed.video.is_first_packet_in_frame);
+ VideoRtpDepacketizerAv1 depacketizer;
+ absl::optional<VideoRtpDepacketizer::ParsedRtpPayload> parsed =
+ depacketizer.Parse(rtc::CopyOnWriteBuffer(packet));
+ ASSERT_TRUE(parsed);
+ EXPECT_FALSE(parsed->video_header.is_first_packet_in_frame);
}
-TEST(RtpDepacketizerAv1Test, ParseTreatsNoContinuationFlagAsBeginningOfFrame) {
+TEST(VideoRtpDepacketizerAv1Test,
+ ParseTreatsNoContinuationFlagAsBeginningOfFrame) {
const uint8_t packet[] = {(uint8_t{0} << 7) | kObuCountOne, kObuHeaderFrame};
- RtpDepacketizerAv1 depacketizer;
- RtpDepacketizer::ParsedPayload parsed;
- ASSERT_TRUE(depacketizer.Parse(&parsed, packet, sizeof(packet)));
- EXPECT_TRUE(parsed.video.is_first_packet_in_frame);
+ VideoRtpDepacketizerAv1 depacketizer;
+ absl::optional<VideoRtpDepacketizer::ParsedRtpPayload> parsed =
+ depacketizer.Parse(rtc::CopyOnWriteBuffer(packet));
+ ASSERT_TRUE(parsed);
+ EXPECT_TRUE(parsed->video_header.is_first_packet_in_frame);
}
-TEST(RtpDepacketizerAv1Test, ParseTreatsWillContinueFlagAsNotEndOfFrame) {
+TEST(VideoRtpDepacketizerAv1Test, ParseTreatsWillContinueFlagAsNotEndOfFrame) {
const uint8_t packet[] = {(uint8_t{1} << 6) | kObuCountOne, kObuHeaderFrame};
- RtpDepacketizerAv1 depacketizer;
- RtpDepacketizer::ParsedPayload parsed;
- ASSERT_TRUE(depacketizer.Parse(&parsed, packet, sizeof(packet)));
- EXPECT_FALSE(parsed.video.is_last_packet_in_frame);
+ rtc::CopyOnWriteBuffer rtp_payload(packet);
+ VideoRtpDepacketizerAv1 depacketizer;
+ absl::optional<VideoRtpDepacketizer::ParsedRtpPayload> parsed =
+ depacketizer.Parse(rtp_payload);
+ ASSERT_TRUE(parsed);
+ EXPECT_FALSE(parsed->video_header.is_last_packet_in_frame);
}
-TEST(RtpDepacketizerAv1Test, ParseTreatsNoWillContinueFlagAsEndOfFrame) {
+TEST(VideoRtpDepacketizerAv1Test, ParseTreatsNoWillContinueFlagAsEndOfFrame) {
const uint8_t packet[] = {(uint8_t{0} << 6) | kObuCountOne, kObuHeaderFrame};
- RtpDepacketizerAv1 depacketizer;
- RtpDepacketizer::ParsedPayload parsed;
- ASSERT_TRUE(depacketizer.Parse(&parsed, packet, sizeof(packet)));
- EXPECT_TRUE(parsed.video.is_last_packet_in_frame);
+ VideoRtpDepacketizerAv1 depacketizer;
+ absl::optional<VideoRtpDepacketizer::ParsedRtpPayload> parsed =
+ depacketizer.Parse(rtc::CopyOnWriteBuffer(packet));
+ ASSERT_TRUE(parsed);
+ EXPECT_TRUE(parsed->video_header.is_last_packet_in_frame);
}
-TEST(RtpDepacketizerAv1Test,
+TEST(VideoRtpDepacketizerAv1Test,
ParseUsesNewCodedVideoSequenceBitAsKeyFrameIndidcator) {
const uint8_t packet[] = {(uint8_t{1} << 3) | kObuCountOne,
kObuHeaderSequenceHeader};
- RtpDepacketizerAv1 depacketizer;
- RtpDepacketizer::ParsedPayload parsed;
- ASSERT_TRUE(depacketizer.Parse(&parsed, packet, sizeof(packet)));
- EXPECT_TRUE(parsed.video.is_first_packet_in_frame);
- EXPECT_TRUE(parsed.video.frame_type == VideoFrameType::kVideoFrameKey);
+ VideoRtpDepacketizerAv1 depacketizer;
+ absl::optional<VideoRtpDepacketizer::ParsedRtpPayload> parsed =
+ depacketizer.Parse(rtc::CopyOnWriteBuffer(packet));
+ ASSERT_TRUE(parsed);
+ EXPECT_TRUE(parsed->video_header.is_first_packet_in_frame);
+ EXPECT_TRUE(parsed->video_header.frame_type ==
+ VideoFrameType::kVideoFrameKey);
}
-TEST(RtpDepacketizerAv1Test,
+TEST(VideoRtpDepacketizerAv1Test,
ParseUsesUnsetNewCodedVideoSequenceBitAsDeltaFrameIndidcator) {
const uint8_t packet[] = {(uint8_t{0} << 3) | kObuCountOne,
kObuHeaderSequenceHeader};
- RtpDepacketizerAv1 depacketizer;
- RtpDepacketizer::ParsedPayload parsed;
- ASSERT_TRUE(depacketizer.Parse(&parsed, packet, sizeof(packet)));
- EXPECT_TRUE(parsed.video.is_first_packet_in_frame);
- EXPECT_TRUE(parsed.video.frame_type == VideoFrameType::kVideoFrameDelta);
+ VideoRtpDepacketizerAv1 depacketizer;
+ absl::optional<VideoRtpDepacketizer::ParsedRtpPayload> parsed =
+ depacketizer.Parse(rtc::CopyOnWriteBuffer(packet));
+ ASSERT_TRUE(parsed);
+ EXPECT_TRUE(parsed->video_header.is_first_packet_in_frame);
+ EXPECT_TRUE(parsed->video_header.frame_type ==
+ VideoFrameType::kVideoFrameDelta);
}
-TEST(RtpDepacketizerAv1Test,
+TEST(VideoRtpDepacketizerAv1Test,
ParseRejectsPacketWithNewCVSAndContinuationFlagsBothSet) {
const uint8_t packet[] = {0b10'00'1000 | kObuCountOne,
kObuHeaderSequenceHeader};
- RtpDepacketizerAv1 depacketizer;
- RtpDepacketizer::ParsedPayload parsed;
- EXPECT_FALSE(depacketizer.Parse(&parsed, packet, sizeof(packet)));
+ VideoRtpDepacketizerAv1 depacketizer;
+ ASSERT_FALSE(depacketizer.Parse(rtc::CopyOnWriteBuffer(packet)));
}
-TEST(RtpDepacketizerAv1Test, AssembleFrameSetsOBUPayloadSizeWhenAbsent) {
+TEST(VideoRtpDepacketizerAv1Test, AssembleFrameSetsOBUPayloadSizeWhenAbsent) {
const uint8_t payload1[] = {0b00'01'0000, // aggregation header
0b0'0110'000, // / Frame
20, 30, 40}; // \ OBU
rtc::ArrayView<const uint8_t> payloads[] = {payload1};
- auto frame = RtpDepacketizerAv1::AssembleFrame(payloads);
+ auto frame = VideoRtpDepacketizerAv1::AssembleFrame(payloads);
ASSERT_TRUE(frame);
rtc::ArrayView<const uint8_t> frame_view(*frame);
EXPECT_TRUE(frame_view[0] & kObuHeaderHasSize);
EXPECT_EQ(frame_view[1], 3);
}
-TEST(RtpDepacketizerAv1Test, AssembleFrameSetsOBUPayloadSizeWhenPresent) {
+TEST(VideoRtpDepacketizerAv1Test, AssembleFrameSetsOBUPayloadSizeWhenPresent) {
const uint8_t payload1[] = {0b00'01'0000, // aggregation header
0b0'0110'010, // / Frame OBU header
3, // obu_size
@@ -121,28 +133,28 @@
30,
40}; // \ obu_payload
rtc::ArrayView<const uint8_t> payloads[] = {payload1};
- auto frame = RtpDepacketizerAv1::AssembleFrame(payloads);
+ auto frame = VideoRtpDepacketizerAv1::AssembleFrame(payloads);
ASSERT_TRUE(frame);
rtc::ArrayView<const uint8_t> frame_view(*frame);
EXPECT_TRUE(frame_view[0] & kObuHeaderHasSize);
EXPECT_EQ(frame_view[1], 3);
}
-TEST(RtpDepacketizerAv1Test,
+TEST(VideoRtpDepacketizerAv1Test,
AssembleFrameSetsOBUPayloadSizeAfterExtensionWhenAbsent) {
const uint8_t payload1[] = {0b00'01'0000, // aggregation header
0b0'0110'100, // / Frame
0b010'01'000, // | extension_header
20, 30, 40}; // \ OBU
rtc::ArrayView<const uint8_t> payloads[] = {payload1};
- auto frame = RtpDepacketizerAv1::AssembleFrame(payloads);
+ auto frame = VideoRtpDepacketizerAv1::AssembleFrame(payloads);
ASSERT_TRUE(frame);
rtc::ArrayView<const uint8_t> frame_view(*frame);
EXPECT_TRUE(frame_view[0] & kObuHeaderHasSize);
EXPECT_EQ(frame_view[2], 3);
}
-TEST(RtpDepacketizerAv1Test,
+TEST(VideoRtpDepacketizerAv1Test,
AssembleFrameSetsOBUPayloadSizeAfterExtensionWhenPresent) {
const uint8_t payload1[] = {0b00'01'0000, // aggregation header
0b0'0110'110, // / Frame OBU header
@@ -152,25 +164,25 @@
30,
40}; // \ obu_payload
rtc::ArrayView<const uint8_t> payloads[] = {payload1};
- auto frame = RtpDepacketizerAv1::AssembleFrame(payloads);
+ auto frame = VideoRtpDepacketizerAv1::AssembleFrame(payloads);
ASSERT_TRUE(frame);
rtc::ArrayView<const uint8_t> frame_view(*frame);
EXPECT_TRUE(frame_view[0] & kObuHeaderHasSize);
EXPECT_EQ(frame_view[2], 3);
}
-TEST(RtpDepacketizerAv1Test, AssembleFrameFromOnePacketWithOneObu) {
+TEST(VideoRtpDepacketizerAv1Test, AssembleFrameFromOnePacketWithOneObu) {
const uint8_t payload1[] = {0b00'01'0000, // aggregation header
0b0'0110'000, // / Frame
20}; // \ OBU
rtc::ArrayView<const uint8_t> payloads[] = {payload1};
- auto frame = RtpDepacketizerAv1::AssembleFrame(payloads);
+ auto frame = VideoRtpDepacketizerAv1::AssembleFrame(payloads);
ASSERT_TRUE(frame);
EXPECT_THAT(rtc::ArrayView<const uint8_t>(*frame),
ElementsAre(0b0'0110'010, 1, 20));
}
-TEST(RtpDepacketizerAv1Test, AssembleFrameFromOnePacketWithTwoObus) {
+TEST(VideoRtpDepacketizerAv1Test, AssembleFrameFromOnePacketWithTwoObus) {
const uint8_t payload1[] = {0b00'10'0000, // aggregation header
2, // / Sequence
0b0'0001'000, // | Header
@@ -178,26 +190,26 @@
0b0'0110'000, // / Frame
20}; // \ OBU
rtc::ArrayView<const uint8_t> payloads[] = {payload1};
- auto frame = RtpDepacketizerAv1::AssembleFrame(payloads);
+ auto frame = VideoRtpDepacketizerAv1::AssembleFrame(payloads);
ASSERT_TRUE(frame);
EXPECT_THAT(rtc::ArrayView<const uint8_t>(*frame),
ElementsAre(0b0'0001'010, 1, 10, // Sequence Header OBU
0b0'0110'010, 1, 20)); // Frame OBU
}
-TEST(RtpDepacketizerAv1Test, AssembleFrameFromTwoPacketsWithOneObu) {
+TEST(VideoRtpDepacketizerAv1Test, AssembleFrameFromTwoPacketsWithOneObu) {
const uint8_t payload1[] = {0b01'01'0000, // aggregation header
0b0'0110'000, 20, 30};
const uint8_t payload2[] = {0b10'01'0000, // aggregation header
40};
rtc::ArrayView<const uint8_t> payloads[] = {payload1, payload2};
- auto frame = RtpDepacketizerAv1::AssembleFrame(payloads);
+ auto frame = VideoRtpDepacketizerAv1::AssembleFrame(payloads);
ASSERT_TRUE(frame);
EXPECT_THAT(rtc::ArrayView<const uint8_t>(*frame),
ElementsAre(0b0'0110'010, 3, 20, 30, 40));
}
-TEST(RtpDepacketizerAv1Test, AssembleFrameFromTwoPacketsWithTwoObu) {
+TEST(VideoRtpDepacketizerAv1Test, AssembleFrameFromTwoPacketsWithTwoObu) {
const uint8_t payload1[] = {0b01'10'0000, // aggregation header
2, // / Sequence
0b0'0001'000, // | Header
@@ -208,14 +220,14 @@
const uint8_t payload2[] = {0b10'01'0000, // aggregation header
40}; //
rtc::ArrayView<const uint8_t> payloads[] = {payload1, payload2};
- auto frame = RtpDepacketizerAv1::AssembleFrame(payloads);
+ auto frame = VideoRtpDepacketizerAv1::AssembleFrame(payloads);
ASSERT_TRUE(frame);
EXPECT_THAT(rtc::ArrayView<const uint8_t>(*frame),
ElementsAre(0b0'0001'010, 1, 10, // SH
0b0'0110'010, 3, 20, 30, 40)); // Frame
}
-TEST(RtpDepacketizerAv1Test,
+TEST(VideoRtpDepacketizerAv1Test,
AssembleFrameFromTwoPacketsWithManyObusSomeWithExtensions) {
const uint8_t payload1[] = {0b01'00'0000, // aggregation header
2, // /
@@ -239,7 +251,7 @@
70, 80, 90}; // \ tail of the frame OBU
rtc::ArrayView<const uint8_t> payloads[] = {payload1, payload2};
- auto frame = RtpDepacketizerAv1::AssembleFrame(payloads);
+ auto frame = VideoRtpDepacketizerAv1::AssembleFrame(payloads);
ASSERT_TRUE(frame);
EXPECT_THAT(rtc::ArrayView<const uint8_t>(*frame),
ElementsAre( // Sequence header OBU
@@ -252,7 +264,7 @@
0b0'0110'110, 0b001'10'000, 6, 40, 50, 60, 70, 80, 90));
}
-TEST(RtpDepacketizerAv1Test, AssembleFrameWithOneObuFromManyPackets) {
+TEST(VideoRtpDepacketizerAv1Test, AssembleFrameWithOneObuFromManyPackets) {
const uint8_t payload1[] = {0b01'01'0000, // aggregation header
0b0'0110'000, 11, 12};
const uint8_t payload2[] = {0b11'01'0000, // aggregation header
@@ -264,13 +276,13 @@
rtc::ArrayView<const uint8_t> payloads[] = {payload1, payload2, payload3,
payload4};
- auto frame = RtpDepacketizerAv1::AssembleFrame(payloads);
+ auto frame = VideoRtpDepacketizerAv1::AssembleFrame(payloads);
ASSERT_TRUE(frame);
EXPECT_THAT(rtc::ArrayView<const uint8_t>(*frame),
ElementsAre(0b0'0110'010, 8, 11, 12, 13, 14, 15, 16, 17, 18));
}
-TEST(RtpDepacketizerAv1Test,
+TEST(VideoRtpDepacketizerAv1Test,
AssembleFrameFromManyPacketsWithSomeObuBorderAligned) {
const uint8_t payload1[] = {0b01'10'0000, // aggregation header
3, // size of the 1st fragment
@@ -296,7 +308,7 @@
33, 34, 35, 36};
rtc::ArrayView<const uint8_t> payloads[] = {payload1, payload2, payload3,
payload4};
- auto frame = RtpDepacketizerAv1::AssembleFrame(payloads);
+ auto frame = VideoRtpDepacketizerAv1::AssembleFrame(payloads);
ASSERT_TRUE(frame);
EXPECT_THAT(rtc::ArrayView<const uint8_t>(*frame),
ElementsAre(0b0'0011'010, 2, 11, 12, // Frame header
@@ -305,7 +317,7 @@
0b0'0100'010, 6, 31, 32, 33, 34, 35, 36));
}
-TEST(RtpDepacketizerAv1Test,
+TEST(VideoRtpDepacketizerAv1Test,
AssembleFrameFromOnePacketsOneObuPayloadSize127Bytes) {
uint8_t payload1[4 + 127];
memset(payload1, 0, sizeof(payload1));
@@ -315,7 +327,7 @@
payload1[3] = 0b0'0110'000; // obu_header with size and extension bits unset.
payload1[4 + 42] = 0x42;
rtc::ArrayView<const uint8_t> payloads[] = {payload1};
- auto frame = RtpDepacketizerAv1::AssembleFrame(payloads);
+ auto frame = VideoRtpDepacketizerAv1::AssembleFrame(payloads);
ASSERT_TRUE(frame);
EXPECT_EQ(frame->size(), 2 + 127u);
rtc::ArrayView<const uint8_t> frame_view(*frame);
@@ -325,7 +337,7 @@
EXPECT_EQ(frame_view[2 + 42], 0x42);
}
-TEST(RtpDepacketizerAv1Test,
+TEST(VideoRtpDepacketizerAv1Test,
AssembleFrameFromTwoPacketsOneObuPayloadSize128Bytes) {
uint8_t payload1[3 + 32];
memset(payload1, 0, sizeof(payload1));
@@ -340,7 +352,7 @@
payload2[2 + 20] = 0x20;
rtc::ArrayView<const uint8_t> payloads[] = {payload1, payload2};
- auto frame = RtpDepacketizerAv1::AssembleFrame(payloads);
+ auto frame = VideoRtpDepacketizerAv1::AssembleFrame(payloads);
ASSERT_TRUE(frame);
EXPECT_EQ(frame->size(), 3 + 128u);
rtc::ArrayView<const uint8_t> frame_view(*frame);
@@ -352,23 +364,25 @@
EXPECT_EQ(frame_view[3 + 32 + 20], 0x20);
}
-TEST(RtpDepacketizerAv1Test, AssembleFrameFromAlmostEmptyPacketStartingAnOBU) {
+TEST(VideoRtpDepacketizerAv1Test,
+ AssembleFrameFromAlmostEmptyPacketStartingAnOBU) {
const uint8_t payload1[] = {0b01'01'0000};
const uint8_t payload2[] = {0b10'01'0000, 0b0'0110'000, 10, 20, 30};
rtc::ArrayView<const uint8_t> payloads[] = {payload1, payload2};
- auto frame = RtpDepacketizerAv1::AssembleFrame(payloads);
+ auto frame = VideoRtpDepacketizerAv1::AssembleFrame(payloads);
ASSERT_TRUE(frame);
EXPECT_THAT(rtc::ArrayView<const uint8_t>(*frame),
ElementsAre(0b0'0110'010, 3, 10, 20, 30));
}
-TEST(RtpDepacketizerAv1Test, AssembleFrameFromAlmostEmptyPacketFinishingAnOBU) {
+TEST(VideoRtpDepacketizerAv1Test,
+ AssembleFrameFromAlmostEmptyPacketFinishingAnOBU) {
const uint8_t payload1[] = {0b01'01'0000, 0b0'0110'000, 10, 20, 30};
const uint8_t payload2[] = {0b10'01'0000};
rtc::ArrayView<const uint8_t> payloads[] = {payload1, payload2};
- auto frame = RtpDepacketizerAv1::AssembleFrame(payloads);
+ auto frame = VideoRtpDepacketizerAv1::AssembleFrame(payloads);
ASSERT_TRUE(frame);
EXPECT_THAT(rtc::ArrayView<const uint8_t>(*frame),
ElementsAre(0b0'0110'010, 3, 10, 20, 30));
diff --git a/modules/video_coding/packet_buffer.cc b/modules/video_coding/packet_buffer.cc
index 0fbd042..675002c 100644
--- a/modules/video_coding/packet_buffer.cc
+++ b/modules/video_coding/packet_buffer.cc
@@ -24,10 +24,10 @@
#include "api/video/encoded_frame.h"
#include "api/video/video_frame_type.h"
#include "common_video/h264/h264_common.h"
-#include "modules/rtp_rtcp/source/rtp_depacketizer_av1.h"
#include "modules/rtp_rtcp/source/rtp_header_extensions.h"
#include "modules/rtp_rtcp/source/rtp_packet_received.h"
#include "modules/rtp_rtcp/source/rtp_video_header.h"
+#include "modules/rtp_rtcp/source/video_rtp_depacketizer_av1.h"
#include "modules/video_coding/codecs/h264/include/h264_globals.h"
#include "modules/video_coding/frame_object.h"
#include "rtc_base/checks.h"
@@ -441,7 +441,7 @@
rtc::scoped_refptr<EncodedImageBuffer> bitstream;
// TODO(danilchap): Hide codec-specific code paths behind an interface.
if (first_packet.codec() == VideoCodecType::kVideoCodecAV1) {
- bitstream = RtpDepacketizerAv1::AssembleFrame(payloads);
+ bitstream = VideoRtpDepacketizerAv1::AssembleFrame(payloads);
if (!bitstream) {
// Failed to assemble a frame. Discard and continue.
return nullptr;
diff --git a/test/fuzzers/BUILD.gn b/test/fuzzers/BUILD.gn
index f07750f..c0ef5b5 100644
--- a/test/fuzzers/BUILD.gn
+++ b/test/fuzzers/BUILD.gn
@@ -562,15 +562,6 @@
]
}
-webrtc_fuzzer_test("rtp_depacketizer_av1_parse_fuzzer") {
- sources = [
- "rtp_depacketizer_av1_parse_fuzzer.cc",
- ]
- deps = [
- "../../modules/rtp_rtcp",
- ]
-}
-
webrtc_fuzzer_test("rtp_depacketizer_av1_assemble_frame_fuzzer") {
sources = [
"rtp_depacketizer_av1_assemble_frame_fuzzer.cc",
diff --git a/test/fuzzers/rtp_depacketizer_av1_assemble_frame_fuzzer.cc b/test/fuzzers/rtp_depacketizer_av1_assemble_frame_fuzzer.cc
index c6ff926..6c6b1d3 100644
--- a/test/fuzzers/rtp_depacketizer_av1_assemble_frame_fuzzer.cc
+++ b/test/fuzzers/rtp_depacketizer_av1_assemble_frame_fuzzer.cc
@@ -7,7 +7,7 @@
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
-#include "modules/rtp_rtcp/source/rtp_depacketizer_av1.h"
+#include "modules/rtp_rtcp/source/video_rtp_depacketizer_av1.h"
#include <stddef.h>
#include <stdint.h>
@@ -34,6 +34,6 @@
rtp_payloads.push_back(fuzz_input.ReadByteArray(next_size));
}
// Run code under test.
- RtpDepacketizerAv1::AssembleFrame(rtp_payloads);
+ VideoRtpDepacketizerAv1::AssembleFrame(rtp_payloads);
}
} // namespace webrtc
diff --git a/test/fuzzers/rtp_depacketizer_av1_parse_fuzzer.cc b/test/fuzzers/rtp_depacketizer_av1_parse_fuzzer.cc
deleted file mode 100644
index d46860a..0000000
--- a/test/fuzzers/rtp_depacketizer_av1_parse_fuzzer.cc
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Copyright (c) 2019 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 "modules/rtp_rtcp/source/rtp_depacketizer_av1.h"
-
-namespace webrtc {
-void FuzzOneInput(const uint8_t* data, size_t size) {
- RtpDepacketizerAv1 depacketizer;
- RtpDepacketizer::ParsedPayload parsed_payload;
- depacketizer.Parse(&parsed_payload, data, size);
-}
-} // namespace webrtc