// Copyright 2014 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/ozone/media_ozone_platform.h"

#include "base/logging.h"
#include "base/trace_event/trace_event.h"
#include "ui/ozone/platform_object.h"
#include "ui/ozone/platform_selection.h"

namespace media {

namespace {

class MediaOzonePlatformStub : public MediaOzonePlatform {
 public:
  MediaOzonePlatformStub() {}

  ~MediaOzonePlatformStub() override {}

 private:
  DISALLOW_COPY_AND_ASSIGN(MediaOzonePlatformStub);
};

}  // namespace

// The following statics are just convenient stubs, declared by the
// generate_constructor_list.py script. They should be removed once the
// internal Ozone platforms decide to actually implement their media specifics.
MediaOzonePlatform* CreateMediaOzonePlatformCaca() {
  return new MediaOzonePlatformStub;
}

MediaOzonePlatform* CreateMediaOzonePlatformCast() {
  return new MediaOzonePlatformStub;
}

MediaOzonePlatform* CreateMediaOzonePlatformDri() {
  return new MediaOzonePlatformStub;
}

MediaOzonePlatform* CreateMediaOzonePlatformDrm() {
  return new MediaOzonePlatformStub;
}

MediaOzonePlatform* CreateMediaOzonePlatformEgltest() {
  return new MediaOzonePlatformStub;
}

MediaOzonePlatform* CreateMediaOzonePlatformGbm() {
  return new MediaOzonePlatformStub;
}

MediaOzonePlatform* CreateMediaOzonePlatformTest() {
  return new MediaOzonePlatformStub;
}

MediaOzonePlatform::MediaOzonePlatform() {
  CHECK(!instance_) << "There should only be a single MediaOzonePlatform.";
  instance_ = this;
}

MediaOzonePlatform::~MediaOzonePlatform() {
  CHECK_EQ(instance_, this);
  instance_ = NULL;
}

// static
MediaOzonePlatform* MediaOzonePlatform::GetInstance() {
  if (!instance_)
    CreateInstance();
  return instance_;
}

VideoDecodeAccelerator* MediaOzonePlatform::CreateVideoDecodeAccelerator(
    const base::Callback<bool(void)>& make_context_current) {
  NOTIMPLEMENTED();
  return NULL;
}

// static
void MediaOzonePlatform::CreateInstance() {
  if (instance_)
    return;

  TRACE_EVENT1("ozone",
               "MediaOzonePlatform::Initialize",
               "platform",
               ui::GetOzonePlatformName());
  scoped_ptr<MediaOzonePlatform> platform =
      ui::PlatformObject<MediaOzonePlatform>::Create();

  // TODO(spang): Currently need to leak this object.
  CHECK_EQ(instance_, platform.release());
}

// static
MediaOzonePlatform* MediaOzonePlatform::instance_;

}  // namespace media
