/*
 *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

// ViESharedData contains data and instances common to all interface
// implementations.

#ifndef WEBRTC_VIDEO_ENGINE_VIE_SHARED_DATA_H_
#define WEBRTC_VIDEO_ENGINE_VIE_SHARED_DATA_H_

#include <map>

#include "webrtc/system_wrappers/interface/scoped_ptr.h"

namespace webrtc {

class Config;
class CpuOveruseObserver;
class ProcessThread;
class ViEChannelManager;
class ViEInputManager;
class ViERenderManager;

class ViESharedData {
 public:
  explicit ViESharedData(const Config& config);
  ~ViESharedData();

  void SetLastError(const int error) const;
  int LastErrorInternal() const;
  int NumberOfCores() const;

  // TODO(mflodman) Remove all calls to 'instance_id()'.
  int instance_id() { return 0;}
  ViEChannelManager* channel_manager() { return channel_manager_.get(); }
  ViEInputManager* input_manager() { return input_manager_.get(); }
  ViERenderManager* render_manager() { return render_manager_.get(); }

  std::map<int, CpuOveruseObserver*>* overuse_observers() {
    return &overuse_observers_; }

 private:
  const int number_cores_;

  scoped_ptr<ViEChannelManager> channel_manager_;
  scoped_ptr<ViEInputManager> input_manager_;
  scoped_ptr<ViERenderManager> render_manager_;
  ProcessThread* module_process_thread_;
  mutable int last_error_;

  std::map<int, CpuOveruseObserver*> overuse_observers_;
};

}  // namespace webrtc

#endif  // WEBRTC_VIDEO_ENGINE_VIE_SHARED_DATA_H_
