// Copyright 2015 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 "media/cast/sender/fake_video_encode_accelerator_factory.h"

#include <utility>

#include "base/callback_helpers.h"

namespace cobalt {
namespace media {
namespace cast {

FakeVideoEncodeAcceleratorFactory::FakeVideoEncodeAcceleratorFactory(
    const scoped_refptr<base::SingleThreadTaskRunner>& task_runner)
    : task_runner_(task_runner),
      will_init_succeed_(true),
      auto_respond_(false),
      vea_response_count_(0),
      shm_response_count_(0),
      last_response_vea_(nullptr),
      last_response_shm_(nullptr) {}

FakeVideoEncodeAcceleratorFactory::~FakeVideoEncodeAcceleratorFactory() {}

void FakeVideoEncodeAcceleratorFactory::SetInitializationWillSucceed(
    bool will_init_succeed) {
  will_init_succeed_ = will_init_succeed;
}

void FakeVideoEncodeAcceleratorFactory::SetAutoRespond(bool auto_respond) {
  auto_respond_ = auto_respond;
  if (auto_respond_) {
    if (!vea_response_callback_.is_null()) RespondWithVideoEncodeAccelerator();
    if (!shm_response_callback_.is_null()) RespondWithSharedMemory();
  }
}

void FakeVideoEncodeAcceleratorFactory::CreateVideoEncodeAccelerator(
    const ReceiveVideoEncodeAcceleratorCallback& callback) {
  DCHECK(!callback.is_null());
  DCHECK(!next_response_vea_);

  FakeVideoEncodeAccelerator* const vea =
      new FakeVideoEncodeAccelerator(task_runner_);
  vea->SetWillInitializationSucceed(will_init_succeed_);
  next_response_vea_.reset(vea);
  vea_response_callback_ = callback;
  if (auto_respond_) RespondWithVideoEncodeAccelerator();
}

void FakeVideoEncodeAcceleratorFactory::CreateSharedMemory(
    size_t size, const ReceiveVideoEncodeMemoryCallback& callback) {
  DCHECK(!callback.is_null());
  DCHECK(!next_response_shm_);

  next_response_shm_.reset(new base::SharedMemory());
  CHECK(next_response_shm_->CreateAndMapAnonymous(size));
  shm_response_callback_ = callback;
  if (auto_respond_) RespondWithSharedMemory();
}

void FakeVideoEncodeAcceleratorFactory::RespondWithVideoEncodeAccelerator() {
  DCHECK(next_response_vea_.get());
  last_response_vea_ = next_response_vea_.get();
  ++vea_response_count_;
  base::ResetAndReturn(&vea_response_callback_)
      .Run(task_runner_, std::move(next_response_vea_));
}

void FakeVideoEncodeAcceleratorFactory::RespondWithSharedMemory() {
  DCHECK(next_response_shm_.get());
  last_response_shm_ = next_response_shm_.get();
  ++shm_response_count_;
  base::ResetAndReturn(&shm_response_callback_)
      .Run(std::move(next_response_shm_));
}

}  // namespace cast
}  // namespace media
}  // namespace cobalt
