// Copyright (c) 2012 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.

// VideoCaptureImplManager manages video capture devices in renderer process.
// The video capture clients use AddDevice() to get a pointer to
// video capture device. VideoCaputreImplManager supports multiple clients
// accessing same device.

#ifndef CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_MANAGER_H_
#define CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_MANAGER_H_

#include <list>
#include <map>

#include "base/message_loop/message_loop_proxy.h"
#include "base/threading/thread.h"
#include "base/synchronization/lock.h"
#include "content/common/content_export.h"
#include "media/video/capture/video_capture.h"

namespace content {

class VideoCaptureImpl;
class VideoCaptureMessageFilter;

class CONTENT_EXPORT VideoCaptureImplManager
    : public base::RefCountedThreadSafe<VideoCaptureImplManager> {
 public:
  VideoCaptureImplManager();

  // Called by video capture client |handler| to add device referenced
  // by |id| to VideoCaptureImplManager's list of opened device list.
  // A pointer to VideoCapture is returned to client so that client can
  // operate on that pointer, such as StartCaptrue, StopCapture.
  virtual media::VideoCapture* AddDevice(
      media::VideoCaptureSessionId id,
      media::VideoCapture::EventHandler* handler);

  // Called by video capture client |handler| to remove device referenced
  // by |id| from VideoCaptureImplManager's list of opened device list.
  virtual void RemoveDevice(media::VideoCaptureSessionId id,
                            media::VideoCapture::EventHandler* handler);

  // Make all existing VideoCaptureImpl instances stop/resume delivering
  // video frames to their clients, depends on flag |suspend|.
  virtual void SuspendDevices(bool suspend);

  VideoCaptureMessageFilter* video_capture_message_filter() const {
    return filter_.get();
  }

 protected:
  virtual ~VideoCaptureImplManager();

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

  struct Device {
    Device(VideoCaptureImpl* device,
           media::VideoCapture::EventHandler* handler);
    ~Device();

    VideoCaptureImpl* vc;
    std::list<media::VideoCapture::EventHandler*> clients;
  };

  void FreeDevice(VideoCaptureImpl* vc);

  typedef std::map<media::VideoCaptureSessionId, Device*> Devices;
  Devices devices_;
  base::Lock lock_;
  scoped_refptr<VideoCaptureMessageFilter> filter_;
  base::Thread thread_;
  scoped_refptr<base::MessageLoopProxy> message_loop_proxy_;

  DISALLOW_COPY_AND_ASSIGN(VideoCaptureImplManager);
};

}  // namespace content

#endif  // CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_MANAGER_H_
