Add H264 packetizer fuzzer
BUG=webrtc:15755 Change-Id: I384fbdfa3a2aea8faaf53eb161cecc2c8639401d Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/332600 Reviewed-by: Danil Chapovalov <danilchap@webrtc.org> Reviewed-by: Harald Alvestrand <hta@webrtc.org> Commit-Queue: Philipp Hancke <phancke@microsoft.com> Cr-Commit-Position: refs/heads/main@{#41487}
This commit is contained in:
parent
956879d86f
commit
5d091cec5d
@ -102,7 +102,8 @@ To build the fuzzers residing in the [test/fuzzers][fuzzers] directory, use
|
|||||||
```
|
```
|
||||||
$ gn gen out/fuzzers --args='use_libfuzzer=true optimize_for_fuzzing=true'
|
$ gn gen out/fuzzers --args='use_libfuzzer=true optimize_for_fuzzing=true'
|
||||||
```
|
```
|
||||||
Depending on the fuzzer additional arguments like `is_asan`, `is_msan` or `is_ubsan_security` might be required.
|
Depending on the fuzzer additional arguments like `is_asan`, `is_msan` or `is_ubsan_security`
|
||||||
|
might be required.
|
||||||
|
|
||||||
See the [GN][gn-doc] documentation for all available options. There are also more
|
See the [GN][gn-doc] documentation for all available options. There are also more
|
||||||
platform specific tips on the [Android][webrtc-android-development] and
|
platform specific tips on the [Android][webrtc-android-development] and
|
||||||
@ -129,6 +130,11 @@ $ autoninja all -C out/Default
|
|||||||
|
|
||||||
See [Ninja build rules][ninja-build-rules] to read more about difference between `ninja` and `ninja all`.
|
See [Ninja build rules][ninja-build-rules] to read more about difference between `ninja` and `ninja all`.
|
||||||
|
|
||||||
|
To build a particular target (like a fuzzer which is not included in the main target) use
|
||||||
|
|
||||||
|
```
|
||||||
|
autoninja -C out/Default h264_depacketizer_fuzzer
|
||||||
|
```
|
||||||
|
|
||||||
## Using Another Build System
|
## Using Another Build System
|
||||||
|
|
||||||
|
|||||||
@ -19,6 +19,7 @@
|
|||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#include "absl/algorithm/container.h"
|
||||||
#include "absl/types/optional.h"
|
#include "absl/types/optional.h"
|
||||||
#include "absl/types/variant.h"
|
#include "absl/types/variant.h"
|
||||||
#include "common_video/h264/h264_common.h"
|
#include "common_video/h264/h264_common.h"
|
||||||
@ -52,11 +53,14 @@ RtpPacketizerH264::RtpPacketizerH264(rtc::ArrayView<const uint8_t> payload,
|
|||||||
input_fragments_.push_back(
|
input_fragments_.push_back(
|
||||||
payload.subview(nalu.payload_start_offset, nalu.payload_size));
|
payload.subview(nalu.payload_start_offset, nalu.payload_size));
|
||||||
}
|
}
|
||||||
|
bool has_empty_fragments = absl::c_any_of(
|
||||||
if (!GeneratePackets(packetization_mode)) {
|
input_fragments_, [](const rtc::ArrayView<const uint8_t> fragment) {
|
||||||
// If failed to generate all the packets, discard already generated
|
return fragment.empty();
|
||||||
// packets in case the caller would ignore return value and still try to
|
});
|
||||||
// call NextPacket().
|
if (has_empty_fragments || !GeneratePackets(packetization_mode)) {
|
||||||
|
// If empty fragments were found or we failed to generate all the packets,
|
||||||
|
// discard already generated packets in case the caller would ignore the
|
||||||
|
// return value and still try to call NextPacket().
|
||||||
num_packets_left_ = 0;
|
num_packets_left_ = 0;
|
||||||
while (!packets_.empty()) {
|
while (!packets_.empty()) {
|
||||||
packets_.pop();
|
packets_.pop();
|
||||||
@ -73,6 +77,7 @@ size_t RtpPacketizerH264::NumPackets() const {
|
|||||||
bool RtpPacketizerH264::GeneratePackets(
|
bool RtpPacketizerH264::GeneratePackets(
|
||||||
H264PacketizationMode packetization_mode) {
|
H264PacketizationMode packetization_mode) {
|
||||||
for (size_t i = 0; i < input_fragments_.size();) {
|
for (size_t i = 0; i < input_fragments_.size();) {
|
||||||
|
RTC_DCHECK(!input_fragments_[i].empty());
|
||||||
switch (packetization_mode) {
|
switch (packetization_mode) {
|
||||||
case H264PacketizationMode::SingleNalUnit:
|
case H264PacketizationMode::SingleNalUnit:
|
||||||
if (!PacketizeSingleNalu(i))
|
if (!PacketizeSingleNalu(i))
|
||||||
@ -173,11 +178,11 @@ size_t RtpPacketizerH264::PacketizeStapA(size_t fragment_index) {
|
|||||||
return fragment_size;
|
return fragment_size;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
while (payload_size_left >= payload_size_needed()) {
|
while (payload_size_left >= payload_size_needed()) {
|
||||||
RTC_CHECK_GT(fragment.size(), 0);
|
RTC_CHECK_GT(fragment.size(), 0);
|
||||||
packets_.push(PacketUnit(fragment, aggregated_fragments == 0, false, true,
|
|
||||||
fragment[0]));
|
packets_.push(PacketUnit(fragment, /*first=*/aggregated_fragments == 0,
|
||||||
|
/*last=*/false, /*aggregated=*/true, fragment[0]));
|
||||||
payload_size_left -= fragment.size();
|
payload_size_left -= fragment.size();
|
||||||
payload_size_left -= fragment_headers_length;
|
payload_size_left -= fragment_headers_length;
|
||||||
|
|
||||||
@ -218,9 +223,9 @@ bool RtpPacketizerH264::PacketizeSingleNalu(size_t fragment_index) {
|
|||||||
<< limits_.max_payload_len;
|
<< limits_.max_payload_len;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
RTC_CHECK_GT(fragment.size(), 0u);
|
RTC_CHECK(!fragment.empty());
|
||||||
packets_.push(PacketUnit(fragment, true /* first */, true /* last */,
|
packets_.push(PacketUnit(fragment, /*first=*/true, /*last=*/true,
|
||||||
false /* aggregated */, fragment[0]));
|
/*aggregated=*/false, fragment[0]));
|
||||||
++num_packets_left_;
|
++num_packets_left_;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -116,6 +116,7 @@ std::vector<RtpPacketToSend> FetchAllPackets(RtpPacketizerH264* packetizer) {
|
|||||||
RtpPacketToSend packet(kNoExtensions);
|
RtpPacketToSend packet(kNoExtensions);
|
||||||
while (packetizer->NextPacket(&packet)) {
|
while (packetizer->NextPacket(&packet)) {
|
||||||
result.push_back(packet);
|
result.push_back(packet);
|
||||||
|
packet.Clear();
|
||||||
}
|
}
|
||||||
EXPECT_THAT(result, SizeIs(num_packets));
|
EXPECT_THAT(result, SizeIs(num_packets));
|
||||||
return result;
|
return result;
|
||||||
@ -527,5 +528,190 @@ TEST(RtpPacketizerH264Test, RejectsOverlongDataInPacketizationMode0) {
|
|||||||
|
|
||||||
EXPECT_THAT(packets, IsEmpty());
|
EXPECT_THAT(packets, IsEmpty());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(RtpPacketizerH264Test, DoesNotPacketizeWithEmptyNalUnit) {
|
||||||
|
RtpPacketizer::PayloadSizeLimits limits;
|
||||||
|
limits.max_payload_len = kMaxPayloadSize;
|
||||||
|
|
||||||
|
uint8_t empty_nal_input[] = {0x00, 0x00, 0x01, /* empty NAL unit data */
|
||||||
|
0x00, 0x00, 0x01, 0x01};
|
||||||
|
RtpPacketizerH264 packetizer(empty_nal_input, limits,
|
||||||
|
H264PacketizationMode::NonInterleaved);
|
||||||
|
EXPECT_EQ(packetizer.NumPackets(), 0u);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(RtpPacketizerH264Test, MultipleStapA) {
|
||||||
|
RtpPacketizer::PayloadSizeLimits limits;
|
||||||
|
limits.max_payload_len = kMaxPayloadSize;
|
||||||
|
limits.first_packet_reduction_len = 0;
|
||||||
|
limits.last_packet_reduction_len = 0;
|
||||||
|
limits.single_packet_reduction_len = 0;
|
||||||
|
// A lot of small NAL units that will result in two STAP-A being generated.
|
||||||
|
// Input data must exceed the size of a single RTP packet.
|
||||||
|
uint8_t long_input[] = {
|
||||||
|
0x19, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01,
|
||||||
|
0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x04,
|
||||||
|
0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x01,
|
||||||
|
0x00, 0x00, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00,
|
||||||
|
0x00, 0x01, 0x00, 0xaf, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x01,
|
||||||
|
0x00, 0x00, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00,
|
||||||
|
0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x8e, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x00, 0xaf, 0x01,
|
||||||
|
0x04, 0x00, 0x19, 0x00, 0x00, 0x01, 0xf9, 0x01, 0x00, 0x00, 0x00, 0x01,
|
||||||
|
0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xf7, 0x01,
|
||||||
|
0x04, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x8e, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x01, 0x04, 0x00,
|
||||||
|
0x19, 0x00, 0x01, 0x00, 0x00, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x01, 0x04, 0x00, 0x00, 0x01, 0x00, 0xaf, 0x01, 0x04, 0x00, 0x19, 0x00,
|
||||||
|
0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x01, 0x00, 0xaf, 0x01, 0x04, 0x00, 0x19, 0x00, 0x00,
|
||||||
|
0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x19, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01,
|
||||||
|
0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x04,
|
||||||
|
0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x19,
|
||||||
|
0x7a, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01,
|
||||||
|
0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x04,
|
||||||
|
0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x01, 0x00,
|
||||||
|
0xaf, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01,
|
||||||
|
0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x04,
|
||||||
|
0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x01, 0x00, 0xaf, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x01, 0x00,
|
||||||
|
0x00, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00,
|
||||||
|
0x01, 0x04, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x8e, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x11, 0xd4, 0x00, 0x19, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00,
|
||||||
|
0x01, 0x01, 0x00, 0x00, 0x01, 0x8e, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01,
|
||||||
|
0x04, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x8e, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x00, 0xaf, 0x00, 0x00, 0x01,
|
||||||
|
0x04, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x8e, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x01,
|
||||||
|
0x00, 0x00, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00,
|
||||||
|
0x00, 0x01, 0x00, 0xaf, 0x01, 0x04, 0x00, 0x19, 0x00, 0x01, 0x00, 0xaf,
|
||||||
|
0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x8e,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x04, 0x00,
|
||||||
|
0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x8e, 0x00, 0x00, 0x10, 0x00, 0x00,
|
||||||
|
0x01, 0x04, 0x00, 0x00, 0x01, 0x00, 0xaf, 0x01, 0x04, 0x00, 0x19, 0x00,
|
||||||
|
0x00, 0x01, 0xf9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00,
|
||||||
|
0x00, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
|
||||||
|
0x08, 0xfe, 0xfb, 0xff, 0xff, 0xf4, 0x01, 0x00, 0x00, 0x01, 0x8e, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00,
|
||||||
|
0x00, 0x01, 0x00, 0xaf, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x01,
|
||||||
|
0x00, 0x00, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00,
|
||||||
|
0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x8e, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x01, 0x00, 0xaf, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00,
|
||||||
|
0x01, 0x01, 0x00, 0x00, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
|
||||||
|
0x01, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x11, 0xd4, 0x00, 0x19, 0x00, 0x00,
|
||||||
|
0x01, 0x04, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x8e, 0x00, 0x01,
|
||||||
|
0x04, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01,
|
||||||
|
0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x00,
|
||||||
|
0xaf, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x04,
|
||||||
|
0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x8e,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x11, 0xd4, 0x00, 0x19, 0x00, 0x00, 0x01, 0x04,
|
||||||
|
0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x8e, 0x00, 0x01, 0x04, 0x00,
|
||||||
|
0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x8e, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x00, 0xaf, 0x00,
|
||||||
|
0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x8e, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00,
|
||||||
|
0x01, 0x01, 0x00, 0x00, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
|
||||||
|
0x04, 0x00, 0x00, 0x01, 0x00, 0xaf, 0x01, 0x04, 0x00, 0x19, 0x00, 0x00,
|
||||||
|
0x01, 0xf9, 0x01, 0x00, 0x00, 0x00, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x01, 0x00, 0xf7, 0x01, 0x04, 0x00, 0x00, 0x01, 0x01,
|
||||||
|
0x00, 0x00, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00,
|
||||||
|
0x00, 0x01, 0x00, 0xaf, 0x01, 0x04, 0x00, 0x19, 0x00, 0x00, 0x01, 0x01,
|
||||||
|
0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x01, 0x00, 0xaf, 0x01, 0x04, 0x00, 0x19, 0x00, 0x00, 0x01, 0x01, 0x02,
|
||||||
|
0x00, 0x00, 0x00, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x01, 0x00, 0xf7, 0x01, 0x04, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01,
|
||||||
|
0x00, 0xf7, 0x01, 0x04, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x8e,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x26, 0x00, 0x00, 0x01, 0x00,
|
||||||
|
0xaf, 0x01, 0x04, 0x00, 0x19, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00,
|
||||||
|
0x01, 0x00, 0xaf, 0x01, 0x04, 0x00, 0x19, 0x00, 0x00, 0x01, 0x00, 0x01,
|
||||||
|
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x00,
|
||||||
|
0xaf, 0x01, 0x04, 0x00, 0x19, 0x00, 0x00, 0x01, 0xf9, 0x01, 0x00, 0x00,
|
||||||
|
0x00, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
|
||||||
|
0xf7, 0x01, 0x04, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x8e, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x2c,
|
||||||
|
0x01, 0x04, 0x00, 0x19, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x01, 0x04, 0x00, 0x00, 0x01, 0x00, 0xaf, 0x01, 0x04, 0x00, 0x19, 0x00,
|
||||||
|
0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x01, 0x00, 0xaf, 0x01, 0x04, 0x00, 0x19, 0x00, 0x00,
|
||||||
|
0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x19, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01,
|
||||||
|
0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x04,
|
||||||
|
0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x01, 0x00, 0x00, 0x19, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01,
|
||||||
|
0x01, 0x00, 0x00, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04,
|
||||||
|
0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x8e,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x00, 0xaf,
|
||||||
|
0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x8e,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x04, 0x00,
|
||||||
|
0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x8e, 0x00, 0x00, 0x10, 0x00, 0x00,
|
||||||
|
0x01, 0x04, 0x00, 0x00, 0x01, 0x00, 0xaf, 0x01, 0x04, 0x00, 0x19, 0x00,
|
||||||
|
0x00, 0x01, 0xf9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00,
|
||||||
|
0x00, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
|
||||||
|
0x08, 0xfe, 0xfb, 0xff, 0xff, 0xf4, 0x01, 0x00, 0x00, 0x01, 0x8e, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00,
|
||||||
|
0x00, 0x01, 0x00, 0xaf, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x01,
|
||||||
|
0x00, 0x00, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00,
|
||||||
|
0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x8e, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x01, 0x00, 0xaf, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00,
|
||||||
|
0x01, 0x01, 0x00, 0x00, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
|
||||||
|
0x04, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01,
|
||||||
|
0x8e, 0x00, 0x04, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x01, 0x00,
|
||||||
|
0xaf, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x11, 0xd4, 0x00,
|
||||||
|
0x19, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01,
|
||||||
|
0x8e, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x01,
|
||||||
|
0x00, 0x00, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00,
|
||||||
|
0x00, 0x01, 0x00, 0xaf, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x01,
|
||||||
|
0x00, 0x00, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00,
|
||||||
|
0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x8e, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x00, 0xaf, 0x01,
|
||||||
|
0x04, 0x00, 0x19, 0x00, 0x00, 0x01, 0xf9, 0x01, 0x00, 0x00, 0x00, 0x01,
|
||||||
|
0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xf7, 0x01,
|
||||||
|
0x04, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x8e, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x00, 0xaf, 0x01, 0x04, 0x00,
|
||||||
|
0x19, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xaf, 0x01, 0x04, 0x00, 0x19,
|
||||||
|
0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x8e, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xf7, 0x01, 0x04, 0x00, 0x00,
|
||||||
|
0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0xf7, 0x01, 0x04, 0x00, 0x00, 0x01,
|
||||||
|
0x01, 0x00, 0x00, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04,
|
||||||
|
0x26, 0x00, 0x00, 0x01, 0x00, 0xaf, 0x01, 0x04, 0x00, 0x19, 0x00, 0x00,
|
||||||
|
0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x00, 0xaf, 0x01, 0x04, 0x00, 0x19,
|
||||||
|
0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
|
||||||
|
0x04, 0x00, 0x00, 0xaf, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x01,
|
||||||
|
0x00, 0x00, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00,
|
||||||
|
0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x8e, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x11, 0xd4, 0x00, 0x19, 0x00, 0x00, 0x01, 0x04, 0x00,
|
||||||
|
0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x8e, 0x00, 0x01, 0x04, 0x00, 0x00,
|
||||||
|
0x01, 0x04, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x8e, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x00, 0xaf, 0x00, 0x00,
|
||||||
|
0x01, 0x04, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x8e, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01,
|
||||||
|
0x01, 0x00, 0x00, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01,
|
||||||
|
0x00, 0xaf, 0x01, 0x04, 0x00, 0x19, 0x00, 0x00, 0x01, 0xf9, 0x01, 0x00,
|
||||||
|
0x00, 0x00, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
|
||||||
|
0x00, 0xf7, 0x01, 0x04, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x8e,
|
||||||
|
0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x8e,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x04, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01};
|
||||||
|
RtpPacketizerH264 packetizer(long_input, limits,
|
||||||
|
H264PacketizationMode::NonInterleaved);
|
||||||
|
EXPECT_EQ(packetizer.NumPackets(), 2u);
|
||||||
|
EXPECT_THAT(FetchAllPackets(&packetizer), SizeIs(2));
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
} // namespace webrtc
|
} // namespace webrtc
|
||||||
|
|||||||
@ -238,6 +238,16 @@ webrtc_fuzzer_test("rtp_packetizer_av1_fuzzer") {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
webrtc_fuzzer_test("rtp_format_h264_fuzzer") {
|
||||||
|
sources = [ "rtp_format_h264_fuzzer.cc" ]
|
||||||
|
deps = [
|
||||||
|
"../../api/video:video_frame_type",
|
||||||
|
"../../modules/rtp_rtcp:rtp_rtcp",
|
||||||
|
"../../modules/rtp_rtcp:rtp_rtcp_format",
|
||||||
|
"../../rtc_base:checks",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
webrtc_fuzzer_test("receive_side_congestion_controller_fuzzer") {
|
webrtc_fuzzer_test("receive_side_congestion_controller_fuzzer") {
|
||||||
sources = [ "receive_side_congestion_controller_fuzzer.cc" ]
|
sources = [ "receive_side_congestion_controller_fuzzer.cc" ]
|
||||||
deps = [
|
deps = [
|
||||||
|
|||||||
75
test/fuzzers/rtp_format_h264_fuzzer.cc
Normal file
75
test/fuzzers/rtp_format_h264_fuzzer.cc
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2024 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 <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "api/video/video_frame_type.h"
|
||||||
|
#include "modules/rtp_rtcp/source/rtp_format.h"
|
||||||
|
#include "modules/rtp_rtcp/source/rtp_format_h264.h"
|
||||||
|
#include "modules/rtp_rtcp/source/rtp_packet_to_send.h"
|
||||||
|
#include "rtc_base/checks.h"
|
||||||
|
#include "test/fuzzers/fuzz_data_helper.h"
|
||||||
|
|
||||||
|
namespace webrtc {
|
||||||
|
void FuzzOneInput(const uint8_t* data, size_t size) {
|
||||||
|
test::FuzzDataHelper fuzz_input(rtc::MakeArrayView(data, size));
|
||||||
|
|
||||||
|
RtpPacketizer::PayloadSizeLimits limits;
|
||||||
|
limits.max_payload_len = 1200;
|
||||||
|
// Read uint8_t to be sure reduction_lens are much smaller than
|
||||||
|
// max_payload_len and thus limits structure is valid.
|
||||||
|
limits.first_packet_reduction_len = fuzz_input.ReadOrDefaultValue<uint8_t>(0);
|
||||||
|
limits.last_packet_reduction_len = fuzz_input.ReadOrDefaultValue<uint8_t>(0);
|
||||||
|
limits.single_packet_reduction_len =
|
||||||
|
fuzz_input.ReadOrDefaultValue<uint8_t>(0);
|
||||||
|
const H264PacketizationMode kPacketizationModes[] = {
|
||||||
|
H264PacketizationMode::NonInterleaved,
|
||||||
|
H264PacketizationMode::SingleNalUnit};
|
||||||
|
|
||||||
|
H264PacketizationMode packetization_mode =
|
||||||
|
fuzz_input.SelectOneOf(kPacketizationModes);
|
||||||
|
|
||||||
|
// Main function under test: RtpPacketizerH264's constructor.
|
||||||
|
RtpPacketizerH264 packetizer(fuzz_input.ReadByteArray(fuzz_input.BytesLeft()),
|
||||||
|
limits, packetization_mode);
|
||||||
|
|
||||||
|
size_t num_packets = packetizer.NumPackets();
|
||||||
|
if (num_packets == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// When packetization was successful, validate NextPacket function too.
|
||||||
|
// While at it, check that packets respect the payload size limits.
|
||||||
|
RtpPacketToSend rtp_packet(nullptr);
|
||||||
|
// Single packet.
|
||||||
|
if (num_packets == 1) {
|
||||||
|
RTC_CHECK(packetizer.NextPacket(&rtp_packet));
|
||||||
|
RTC_CHECK_LE(rtp_packet.payload_size(),
|
||||||
|
limits.max_payload_len - limits.single_packet_reduction_len);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// First packet.
|
||||||
|
RTC_CHECK(packetizer.NextPacket(&rtp_packet));
|
||||||
|
RTC_CHECK_LE(rtp_packet.payload_size(),
|
||||||
|
limits.max_payload_len - limits.first_packet_reduction_len);
|
||||||
|
// Middle packets.
|
||||||
|
for (size_t i = 1; i < num_packets - 1; ++i) {
|
||||||
|
rtp_packet.Clear();
|
||||||
|
RTC_CHECK(packetizer.NextPacket(&rtp_packet))
|
||||||
|
<< "Failed to get packet#" << i;
|
||||||
|
RTC_CHECK_LE(rtp_packet.payload_size(), limits.max_payload_len)
|
||||||
|
<< "Packet #" << i << " exceeds it's limit";
|
||||||
|
}
|
||||||
|
// Last packet.
|
||||||
|
rtp_packet.Clear();
|
||||||
|
RTC_CHECK(packetizer.NextPacket(&rtp_packet));
|
||||||
|
RTC_CHECK_LE(rtp_packet.payload_size(),
|
||||||
|
limits.max_payload_len - limits.last_packet_reduction_len);
|
||||||
|
}
|
||||||
|
} // namespace webrtc
|
||||||
@ -2,6 +2,6 @@ You can modify this file to create no-op changelists.
|
|||||||
Try to write something funny. And please don't add trailing whitespace.
|
Try to write something funny. And please don't add trailing whitespace.
|
||||||
|
|
||||||
|
|
||||||
Once upon a time there was an elephant in Stockholm.
|
Once upon a time there was a white elephant in Stockholm.
|
||||||
Why did the elephant get kicked out of the Swedish Parliament?
|
Why did the elephant get kicked out of the Swedish Parliament?
|
||||||
Because it kept making trunk calls!
|
Because it kept making trunk calls!
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user