// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "components/mirroring/service/fake_video_capture_host.h"

#include "base/memory/read_only_shared_memory_region.h"
#include "media/base/video_frame.h"
#include "media/capture/mojom/video_capture_types.mojom.h"
#include "mojo/public/cpp/base/shared_memory_utils.h"

namespace mirroring {

FakeVideoCaptureHost::FakeVideoCaptureHost(
    media::mojom::VideoCaptureHostRequest request)
    : binding_(this, std::move(request)) {}
FakeVideoCaptureHost::~FakeVideoCaptureHost() {}

void FakeVideoCaptureHost::Start(
    int32_t device_id,
    int32_t session_id,
    const media::VideoCaptureParams& params,
    media::mojom::VideoCaptureObserverPtr observer) {
  ASSERT_TRUE(observer);
  observer_ = std::move(observer);
  observer_->OnStateChanged(media::mojom::VideoCaptureState::STARTED);
}

void FakeVideoCaptureHost::Stop(int32_t device_id) {
  if (!observer_)
    return;

  observer_->OnStateChanged(media::mojom::VideoCaptureState::ENDED);
  observer_.reset();
  OnStopped();
}

void FakeVideoCaptureHost::SendOneFrame(const gfx::Size& size,
                                        base::TimeTicks capture_time) {
  if (!observer_)
    return;

  auto shmem = mojo::CreateReadOnlySharedMemoryRegion(5000);
  memset(shmem.mapping.memory(), 125, 5000);
  observer_->OnNewBuffer(
      0, media::mojom::VideoBufferHandle::NewReadOnlyShmemRegion(
             std::move(shmem.region)));
  media::VideoFrameMetadata metadata;
  metadata.SetDouble(media::VideoFrameMetadata::FRAME_RATE, 30);
  metadata.SetTimeTicks(media::VideoFrameMetadata::REFERENCE_TIME,
                        capture_time);
  observer_->OnBufferReady(
      0, media::mojom::VideoFrameInfo::New(
             base::TimeDelta(), metadata.GetInternalValues().Clone(),
             media::PIXEL_FORMAT_I420, size, gfx::Rect(size),
             gfx::ColorSpace::CreateREC709(), nullptr));
}

}  // namespace mirroring
