blob: e68f9fe9b8cd55f756a74732c7b1bbf552e188c1 [file] [log] [blame]
philipel1e9cf7f2018-05-17 13:34:53 +02001/*
2 * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
3 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include "modules/video_coding/frame_buffer2.h"
philipel1e9cf7f2018-05-17 13:34:53 +020012#include "modules/video_coding/timing.h"
13#include "system_wrappers/include/clock.h"
14
15namespace webrtc {
16
17namespace {
18
19// When DataReader runs out of data provided in the constructor it will
20// just set/return 0 instead.
21struct DataReader {
22 DataReader(const uint8_t* data, size_t size) : data_(data), size_(size) {}
23
24 void CopyTo(void* destination, size_t dest_size) {
25 memset(destination, 0, dest_size);
26
27 size_t bytes_to_copy = std::min(size_ - offset_, dest_size);
28 memcpy(destination, data_ + offset_, bytes_to_copy);
29 offset_ += bytes_to_copy;
30 }
31
32 template <typename T>
33 T GetNum() {
34 T res;
35 if (offset_ + sizeof(res) < size_) {
36 memcpy(&res, data_ + offset_, sizeof(res));
37 offset_ += sizeof(res);
38 return res;
39 }
40
41 offset_ = size_;
42 return T(0);
43 }
44
45 bool MoreToRead() { return offset_ < size_; }
46
47 const uint8_t* const data_;
48 size_t size_;
49 size_t offset_ = 0;
50};
51
52class FuzzyFrameObject : public video_coding::EncodedFrame {
53 public:
54 FuzzyFrameObject() {}
55 ~FuzzyFrameObject() {}
56
philipel1e9cf7f2018-05-17 13:34:53 +020057 int64_t ReceivedTime() const override { return 0; }
58 int64_t RenderTime() const override { return _renderTimeMs; }
59};
60} // namespace
61
62void FuzzOneInput(const uint8_t* data, size_t size) {
Sam Zackrisson26204702018-10-25 13:46:26 +020063 if (size > 10000) {
64 return;
65 }
philipel1e9cf7f2018-05-17 13:34:53 +020066 DataReader reader(data, size);
67 Clock* clock = Clock::GetRealTimeClock();
philipel1e9cf7f2018-05-17 13:34:53 +020068 VCMTiming timing(clock);
Niels Möllerd9c2d942019-04-30 09:16:36 +020069 video_coding::FrameBuffer frame_buffer(clock, &timing, nullptr);
philipel1e9cf7f2018-05-17 13:34:53 +020070
71 while (reader.MoreToRead()) {
72 if (reader.GetNum<uint8_t>() & 1) {
73 std::unique_ptr<FuzzyFrameObject> frame(new FuzzyFrameObject());
74 frame->id.picture_id = reader.GetNum<int64_t>();
75 frame->id.spatial_layer = reader.GetNum<uint8_t>();
Niels Möller23775882018-08-16 10:24:12 +020076 frame->SetTimestamp(reader.GetNum<uint32_t>());
philipel1e9cf7f2018-05-17 13:34:53 +020077 frame->num_references = reader.GetNum<uint8_t>() %
78 video_coding::EncodedFrame::kMaxFrameReferences;
79
80 for (size_t r = 0; r < frame->num_references; ++r)
81 frame->references[r] = reader.GetNum<int64_t>();
82
83 frame_buffer.InsertFrame(std::move(frame));
84 } else {
85 // Since we are not trying to trigger race conditions it does not make
86 // sense to have a wait time > 0.
87 const int kWaitTimeMs = 0;
88
89 std::unique_ptr<video_coding::EncodedFrame> frame(new FuzzyFrameObject());
90 bool keyframe_required = reader.GetNum<uint8_t>() % 2;
91 frame_buffer.NextFrame(kWaitTimeMs, &frame, keyframe_required);
92 }
93 }
94}
95
96} // namespace webrtc