/*
 *  Copyright (c) 2011 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 "video_engine/vie_defines.h"
#include "video_engine/vie_performance_monitor.h"

namespace webrtc {

class ProcessThread;
class ViEChannelManager;
class ViEInputManager;
class ViERenderManager;

class ViESharedData {
 public:
  ViESharedData();
  ~ViESharedData();

  bool Initialized() const;
  int SetInitialized();
  int SetUnInitialized();
  void SetLastError(const int error) const;
  int LastErrorInternal() const;

  int NumberOfCores() const;

  int instance_id() { return instance_id_;}
  ViEPerformanceMonitor* vie_performance_monitor() {
    return &vie_performance_monitor_; }
  ViEChannelManager* channel_manager() { return &channel_manager_; }
  ViEInputManager* input_manager() { return &input_manager_; }
  ViERenderManager* render_manager() { return &render_manager_; }

 private:
  static int instance_counter_;
  const int instance_id_;
  bool initialized_;
  const int number_cores_;

  ViEPerformanceMonitor vie_performance_monitor_;
  ViEChannelManager& channel_manager_;
  ViEInputManager& input_manager_;
  ViERenderManager& render_manager_;
  ProcessThread* module_process_thread_;
  mutable int last_error_;
};

}  // namespace webrtc

#endif  // WEBRTC_VIDEO_ENGINE_VIE_SHARED_DATA_H_
