blob: 54d17131b3a1ea07210b9f09deb24844b821178c [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"
12
philipel1e9cf7f2018-05-17 13:34:53 +020013#include "modules/video_coding/timing.h"
14#include "system_wrappers/include/clock.h"
15
16namespace webrtc {
17
18namespace {
19
20// When DataReader runs out of data provided in the constructor it will
21// just set/return 0 instead.
22struct DataReader {
23 DataReader(const uint8_t* data, size_t size) : data_(data), size_(size) {}
24
25 void CopyTo(void* destination, size_t dest_size) {
26 memset(destination, 0, dest_size);
27
28 size_t bytes_to_copy = std::min(size_ - offset_, dest_size);
29 memcpy(destination, data_ + offset_, bytes_to_copy);
30 offset_ += bytes_to_copy;
31 }
32
33 template <typename T>
34 T GetNum() {
35 T res;
36 if (offset_ + sizeof(res) < size_) {
37 memcpy(&res, data_ + offset_, sizeof(res));
38 offset_ += sizeof(res);
39 return res;
40 }
41
42 offset_ = size_;
43 return T(0);
44 }
45
46 bool MoreToRead() { return offset_ < size_; }
47
48 const uint8_t* const data_;
49 size_t size_;
50 size_t offset_ = 0;
51};
52
53class FuzzyFrameObject : public video_coding::EncodedFrame {
54 public:
55 FuzzyFrameObject() {}
56 ~FuzzyFrameObject() {}
57
philipel1e9cf7f2018-05-17 13:34:53 +020058 int64_t ReceivedTime() const override { return 0; }
59 int64_t RenderTime() const override { return _renderTimeMs; }
60};
61} // namespace
62
63void FuzzOneInput(const uint8_t* data, size_t size) {
Sam Zackrisson26204702018-10-25 13:46:26 +020064 if (size > 10000) {
65 return;
66 }
philipel1e9cf7f2018-05-17 13:34:53 +020067 DataReader reader(data, size);
68 Clock* clock = Clock::GetRealTimeClock();
philipel1e9cf7f2018-05-17 13:34:53 +020069 VCMTiming timing(clock);
Niels Möllerd9c2d942019-04-30 09:16:36 +020070 video_coding::FrameBuffer frame_buffer(clock, &timing, nullptr);
philipel1e9cf7f2018-05-17 13:34:53 +020071
72 while (reader.MoreToRead()) {
73 if (reader.GetNum<uint8_t>() & 1) {
74 std::unique_ptr<FuzzyFrameObject> frame(new FuzzyFrameObject());
75 frame->id.picture_id = reader.GetNum<int64_t>();
76 frame->id.spatial_layer = reader.GetNum<uint8_t>();
Niels Möller23775882018-08-16 10:24:12 +020077 frame->SetTimestamp(reader.GetNum<uint32_t>());
philipel1e9cf7f2018-05-17 13:34:53 +020078 frame->num_references = reader.GetNum<uint8_t>() %
79 video_coding::EncodedFrame::kMaxFrameReferences;
80
81 for (size_t r = 0; r < frame->num_references; ++r)
82 frame->references[r] = reader.GetNum<int64_t>();
83
84 frame_buffer.InsertFrame(std::move(frame));
85 } else {
86 // Since we are not trying to trigger race conditions it does not make
87 // sense to have a wait time > 0.
88 const int kWaitTimeMs = 0;
89
90 std::unique_ptr<video_coding::EncodedFrame> frame(new FuzzyFrameObject());
91 bool keyframe_required = reader.GetNum<uint8_t>() % 2;
92 frame_buffer.NextFrame(kWaitTimeMs, &frame, keyframe_required);
93 }
94 }
95}
96
97} // namespace webrtc