// Copyright 2013 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.

#ifndef MEDIA_CAST_CAST_ENVIRONMENT_H_
#define MEDIA_CAST_CAST_ENVIRONMENT_H_

#include "base/basictypes.h"
#include "base/memory/ref_counted.h"
#include "base/task_runner.h"
#include "base/time/tick_clock.h"
#include "base/time/time.h"

namespace media {
namespace cast {

class CastEnvironment : public base::RefCountedThreadSafe<CastEnvironment> {
 public:
  // An enumeration of the cast threads.
  enum ThreadId {
    // The main thread is where the cast system is configured and where timers
    // and network IO is performed.
    MAIN,
    // The audio encoder thread is where all send side audio processing is done,
    // primarily encoding but also re-sampling.
    AUDIO_ENCODER,
    // The audio decoder thread is where all receive side audio processing is
    // done, primarily decoding but also error concealment and re-sampling.
    AUDIO_DECODER,
    // The video encoder thread is where the video encode processing is done.
    VIDEO_ENCODER,
    // The video decoder thread is where the video decode processing is done.
    VIDEO_DECODER,
  };

  CastEnvironment(base::TickClock* clock,
                  scoped_refptr<base::TaskRunner> main_thread_proxy,
                  scoped_refptr<base::TaskRunner> audio_encode_thread_proxy,
                  scoped_refptr<base::TaskRunner> audio_decode_thread_proxy,
                  scoped_refptr<base::TaskRunner> video_encode_thread_proxy,
                  scoped_refptr<base::TaskRunner> video_decode_thread_proxy);

  // These are the same methods in message_loop.h, but are guaranteed to either
  // get posted to the MessageLoop if it's still alive, or be deleted otherwise.
  // They return true iff the thread existed and the task was posted.  Note that
  // even if the task is posted, there's no guarantee that it will run, since
  // the target thread may already have a Quit message in its queue.
  bool PostTask(ThreadId identifier,
                const tracked_objects::Location& from_here,
                const base::Closure& task);

  bool PostDelayedTask(ThreadId identifier,
                       const tracked_objects::Location& from_here,
                       const base::Closure& task,
                       base::TimeDelta delay);

  bool CurrentlyOn(ThreadId identifier);

 base::TickClock* Clock();

 protected:
  virtual ~CastEnvironment();

 private:
  friend class base::RefCountedThreadSafe<CastEnvironment>;

  scoped_refptr<base::TaskRunner> GetMessageTaskRunnerForThread(
      ThreadId identifier);

  base::TickClock* const clock_;  // Not owned by this class.
  scoped_refptr<base::TaskRunner> main_thread_proxy_;
  scoped_refptr<base::TaskRunner> audio_encode_thread_proxy_;
  scoped_refptr<base::TaskRunner> audio_decode_thread_proxy_;
  scoped_refptr<base::TaskRunner> video_encode_thread_proxy_;
  scoped_refptr<base::TaskRunner> video_decode_thread_proxy_;

  DISALLOW_COPY_AND_ASSIGN(CastEnvironment);
};

}  // namespace cast
}  // namespace media

#endif  // MEDIA_CAST_CAST_ENVIRONMENT_H_
