/*
 *  Copyright 2016 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.
 */

#ifndef PC_TEST_FAKE_VIDEO_TRACK_SOURCE_H_
#define PC_TEST_FAKE_VIDEO_TRACK_SOURCE_H_

#include "api/make_ref_counted.h"
#include "api/media_stream_interface.h"
#include "api/scoped_refptr.h"
#include "api/video/video_broadcaster.h"
#include "api/video/video_frame.h"
#include "api/video/video_source_interface.h"
#include "pc/video_track_source.h"

namespace webrtc {

// A minimal implementation of VideoTrackSource. Includes a VideoBroadcaster for
// injection of frames.
class FakeVideoTrackSource : public VideoTrackSource {
 public:
  static scoped_refptr<FakeVideoTrackSource> Create(bool is_screencast) {
    return make_ref_counted<FakeVideoTrackSource>(is_screencast);
  }

  static scoped_refptr<FakeVideoTrackSource> Create() { return Create(false); }

  bool is_screencast() const override { return is_screencast_; }
  bool GetStats(VideoTrackSourceInterface::Stats* stats) override {
    if (!stats)
      return false;
    stats->input_width = width_;
    stats->input_height = height_;
    return true;
  }

  void SetSize(int width, int height) {
    width_ = width;
    height_ = height;
  }

  void InjectFrame(const VideoFrame& frame) {
    video_broadcaster_.OnFrame(frame);
  }

 protected:
  explicit FakeVideoTrackSource(bool is_screencast)
      : VideoTrackSource(false /* remote */), is_screencast_(is_screencast) {}
  ~FakeVideoTrackSource() override = default;

  VideoSourceInterface<VideoFrame>* source() override {
    return &video_broadcaster_;
  }

 private:
  const bool is_screencast_;
  int width_ = 0;
  int height_ = 0;
  VideoBroadcaster video_broadcaster_;
};

}  // namespace webrtc

#endif  // PC_TEST_FAKE_VIDEO_TRACK_SOURCE_H_
