// Copyright 2015 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_MEDIA_SANDBOX_MEDIA_SANDBOX_H_
#define COBALT_MEDIA_SANDBOX_MEDIA_SANDBOX_H_

#include "base/callback.h"
#include "base/compiler_specific.h"
#include "base/file_path.h"
#include "base/memory/ref_counted.h"
#include "base/time.h"
#include "cobalt/loader/fetcher_factory.h"
#include "cobalt/media/media_module.h"
#include "cobalt/render_tree/image.h"

namespace cobalt {
namespace media {
namespace sandbox {

class MediaSandbox {
 public:
  typedef render_tree::Image Image;
  typedef base::Callback<scoped_refptr<Image>(const base::TimeDelta&)> FrameCB;

  MediaSandbox(int argc, char** argv, const FilePath& trace_log_path);
  ~MediaSandbox();

  // This function registers a callback so the MediaSandbox instance can pull
  // the current frame to render.  Call this function will a null callback will
  // reset the frame callback.
  void RegisterFrameCB(const FrameCB& frame_cb);
  MediaModule* GetMediaModule();
  loader::FetcherFactory* GetFetcherFactory();

 private:
  class Impl;

  Impl* impl_;

  DISALLOW_IMPLICIT_CONSTRUCTORS(MediaSandbox);
};

}  // namespace sandbox
}  // namespace media
}  // namespace cobalt

#endif  // COBALT_MEDIA_SANDBOX_MEDIA_SANDBOX_H_
