Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1472)

Side by Side Diff: webrtc/test/fuzzers/transport_feedback_packet_loss_tracker_fuzzer.cc

Issue 2629883003: First-order-FEC recoverability calculation (Closed)
Patch Set: . Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #include <algorithm> 11 #include <algorithm>
12 #include <array>
minyue-webrtc 2017/01/30 09:30:23 no need if you take my suggestion
12 13
13 #include "webrtc/base/array_view.h" 14 #include "webrtc/base/array_view.h"
14 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" 15 #include "webrtc/modules/rtp_rtcp/source/byte_io.h"
15 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h" 16 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
16 #include "webrtc/voice_engine/transport_feedback_packet_loss_tracker.h" 17 #include "webrtc/voice_engine/transport_feedback_packet_loss_tracker.h"
17 18
18 namespace webrtc { 19 namespace webrtc {
19 20
20 namespace { 21 namespace {
21 22
23 template <typename T>
24 T FuzzInput(const uint8_t** data, size_t* size) {
25 RTC_CHECK(*size >= sizeof(T));
26 T rc = ByteReader<T>::ReadBigEndian(*data);
27 *data += sizeof(T);
28 *size -= sizeof(T);
29 return rc;
30 }
31
22 class TransportFeedbackGenerator { 32 class TransportFeedbackGenerator {
23 public: 33 public:
24 explicit TransportFeedbackGenerator(rtc::ArrayView<const uint8_t> data) 34 explicit TransportFeedbackGenerator(rtc::ArrayView<const uint8_t> data)
25 : data_(data), ended_(false), data_idx_(0) {} 35 : data_(data), ended_(false), data_idx_(0) {}
26 36
27 void GetNextTransportFeedback(rtcp::TransportFeedback* feedback) { 37 void GetNextTransportFeedback(rtcp::TransportFeedback* feedback) {
28 uint16_t base_seq_num = 0; 38 uint16_t base_seq_num = 0;
29 if (!ReadData<uint16_t>(&base_seq_num)) { 39 if (!ReadData<uint16_t>(&base_seq_num)) {
30 return; 40 return;
31 } 41 }
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 } 84 }
75 85
76 const rtc::ArrayView<const uint8_t> data_; 86 const rtc::ArrayView<const uint8_t> data_;
77 bool ended_; 87 bool ended_;
78 size_t data_idx_; 88 size_t data_idx_;
79 }; 89 };
80 90
81 } // namespace 91 } // namespace
82 92
83 void FuzzOneInput(const uint8_t* data, size_t size) { 93 void FuzzOneInput(const uint8_t* data, size_t size) {
84 if (size < sizeof(uint32_t)) { 94 if (size < 3 * sizeof(uint16_t)) {
85 return; 95 return;
86 } 96 }
87 constexpr size_t kSeqNumHalf = 0x8000u; 97 constexpr size_t kSeqNumHalf = 0x8000u;
88 const size_t window_size_1 = std::min<size_t>( 98
99 // Produce:
100 // 0x8000 >= max_window_size >= plr_min_num_packets > rplr_min_num_pairs >= 1
101 // (The distribution isn't uniform, but it's enough; more would be overkill.)
minyue-webrtc 2017/01/30 09:30:23 looks a bit cumbersome. You sort the values, but s
elad.alon_webrtc.org 2017/01/30 11:14:12 nit: I think you meant 0x7fff, not 0x7999. All of
102
103 std::array<size_t, 3> sizes;
104 for (size_t i = 0; i < 3; i++) {
105 constexpr uint16_t mask = (kSeqNumHalf - 1); // 0x7fff
106 uint16_t t = FuzzInput<uint16_t>(&data, &size);
107 sizes[i] = 1 + (mask & t); // 1 : 0x8000
108 }
109 std::sort(sizes.begin(), sizes.end(), std::greater<size_t>());
110
111 // Range = [2 : 0x8000]
112 const size_t max_window_size = std::min<size_t>(
89 kSeqNumHalf, 113 kSeqNumHalf,
90 std::max<uint16_t>(1, ByteReader<uint16_t>::ReadBigEndian(data))); 114 std::max<size_t>(2, sizes[0]));
91 data += sizeof(uint16_t); 115
92 const size_t window_size_2 = std::min<size_t>( 116 // Range = [2 : max_window_size]
93 kSeqNumHalf, 117 const size_t plr_min_num_packets = std::min<size_t>(
94 std::max<uint16_t>(1, ByteReader<uint16_t>::ReadBigEndian(data))); 118 max_window_size,
95 data += sizeof(uint16_t); 119 std::max<size_t>(2, sizes[1]));
96 size -= 2 * sizeof(uint16_t); 120
121 // Range = [1 : plr_min_num_packets - 1]
122 const size_t rplr_min_num_pairs = std::min<size_t>(
123 plr_min_num_packets - 1,
124 sizes[2]);
97 125
98 TransportFeedbackPacketLossTracker tracker( 126 TransportFeedbackPacketLossTracker tracker(
99 std::min(window_size_1, window_size_2), 127 max_window_size, plr_min_num_packets, rplr_min_num_pairs);
100 std::max(window_size_1, window_size_2)); 128
101 TransportFeedbackGenerator feedback_generator( 129 TransportFeedbackGenerator feedback_generator(
102 rtc::ArrayView<const uint8_t>(data, size)); 130 rtc::ArrayView<const uint8_t>(data, size));
131
103 while (!feedback_generator.ended()) { 132 while (!feedback_generator.ended()) {
104 rtcp::TransportFeedback feedback; 133 rtcp::TransportFeedback feedback;
105 feedback_generator.GetNextTransportFeedback(&feedback); 134 feedback_generator.GetNextTransportFeedback(&feedback);
106 tracker.OnReceivedTransportFeedback(feedback); 135 tracker.OnReceivedTransportFeedback(feedback);
107 tracker.Validate(); 136 tracker.Validate();
108 } 137 }
109 } 138 }
110 139
111 } // namespace webrtc 140 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698