/* * Copyright (c) 2017 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/video_coding/frame_buffer2.h" #include "modules/video_coding/jitter_estimator.h" #include "modules/video_coding/timing.h" #include "system_wrappers/include/clock.h" namespace webrtc { namespace { // When DataReader runs out of data provided in the constructor it will // just set/return 0 instead. struct DataReader { DataReader(const uint8_t* data, size_t size) : data_(data), size_(size) {} void CopyTo(void* destination, size_t dest_size) { memset(destination, 0, dest_size); size_t bytes_to_copy = std::min(size_ - offset_, dest_size); memcpy(destination, data_ + offset_, bytes_to_copy); offset_ += bytes_to_copy; } template T GetNum() { T res; if (offset_ + sizeof(res) < size_) { memcpy(&res, data_ + offset_, sizeof(res)); offset_ += sizeof(res); return res; } offset_ = size_; return T(0); } bool MoreToRead() { return offset_ < size_; } const uint8_t* const data_; size_t size_; size_t offset_ = 0; }; class FuzzyFrameObject : public video_coding::EncodedFrame { public: FuzzyFrameObject() {} ~FuzzyFrameObject() {} bool GetBitstream(uint8_t* destination) const override { return false; } int64_t ReceivedTime() const override { return 0; } int64_t RenderTime() const override { return _renderTimeMs; } }; } // namespace void FuzzOneInput(const uint8_t* data, size_t size) { DataReader reader(data, size); Clock* clock = Clock::GetRealTimeClock(); VCMJitterEstimator jitter_estimator(clock, 0, 0); VCMTiming timing(clock); video_coding::FrameBuffer frame_buffer(clock, &jitter_estimator, &timing, nullptr); while (reader.MoreToRead()) { if (reader.GetNum() & 1) { std::unique_ptr frame(new FuzzyFrameObject()); frame->id.picture_id = reader.GetNum(); frame->id.spatial_layer = reader.GetNum(); frame->SetTimestamp(reader.GetNum()); frame->num_references = reader.GetNum() % video_coding::EncodedFrame::kMaxFrameReferences; for (size_t r = 0; r < frame->num_references; ++r) frame->references[r] = reader.GetNum(); frame_buffer.InsertFrame(std::move(frame)); } else { // Since we are not trying to trigger race conditions it does not make // sense to have a wait time > 0. const int kWaitTimeMs = 0; std::unique_ptr frame(new FuzzyFrameObject()); bool keyframe_required = reader.GetNum() % 2; frame_buffer.NextFrame(kWaitTimeMs, &frame, keyframe_required); } } } } // namespace webrtc