Separate Call API/build files from video_engine/.

BUG=2535
R=andrew@webrtc.org, mflodman@webrtc.org, niklas.enbom@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/2659004

git-svn-id: http://webrtc.googlecode.com/svn/trunk/webrtc@5042 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/test/vcm_capturer.cc b/test/vcm_capturer.cc
new file mode 100644
index 0000000..cbf7b1f
--- /dev/null
+++ b/test/vcm_capturer.cc
@@ -0,0 +1,104 @@
+/*
+ *  Copyright (c) 2013 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.
+ */
+
+#include "webrtc/test/vcm_capturer.h"
+
+#include "webrtc/modules/video_capture/include/video_capture_factory.h"
+#include "webrtc/video_send_stream.h"
+
+namespace webrtc {
+namespace test {
+
+VcmCapturer::VcmCapturer(webrtc::VideoSendStreamInput* input)
+    : VideoCapturer(input), started_(false), vcm_(NULL), last_timestamp_(0) {}
+
+bool VcmCapturer::Init(size_t width, size_t height, size_t target_fps) {
+  VideoCaptureModule::DeviceInfo* device_info =
+      VideoCaptureFactory::CreateDeviceInfo(42);  // Any ID (42) will do.
+
+  char device_name[256];
+  char unique_name[256];
+  if (device_info->GetDeviceName(0, device_name, sizeof(device_name),
+                                 unique_name, sizeof(unique_name)) !=
+      0) {
+    Destroy();
+    return false;
+  }
+
+  vcm_ = webrtc::VideoCaptureFactory::Create(0, unique_name);
+  vcm_->RegisterCaptureDataCallback(*this);
+
+  device_info->GetCapability(vcm_->CurrentDeviceName(), 0, capability_);
+  delete device_info;
+
+  capability_.width = static_cast<int32_t>(width);
+  capability_.height = static_cast<int32_t>(height);
+  capability_.maxFPS = static_cast<int32_t>(target_fps);
+  capability_.rawType = kVideoI420;
+
+  if (vcm_->StartCapture(capability_) != 0) {
+    Destroy();
+    return false;
+  }
+
+  assert(vcm_->CaptureStarted());
+
+  return true;
+}
+
+VcmCapturer* VcmCapturer::Create(VideoSendStreamInput* input,
+                                 size_t width, size_t height,
+                                 size_t target_fps) {
+  VcmCapturer* vcm__capturer = new VcmCapturer(input);
+  if (!vcm__capturer->Init(width, height, target_fps)) {
+    // TODO(pbos): Log a warning that this failed.
+    delete vcm__capturer;
+    return NULL;
+  }
+  return vcm__capturer;
+}
+
+
+void VcmCapturer::Start() { started_ = true; }
+
+void VcmCapturer::Stop() { started_ = false; }
+
+void VcmCapturer::Destroy() {
+  if (vcm_ == NULL) {
+    return;
+  }
+
+  vcm_->StopCapture();
+  vcm_->DeRegisterCaptureDataCallback();
+  vcm_->Release();
+
+  // TODO(pbos): How do I destroy the VideoCaptureModule? This still leaves
+  //             non-freed memory.
+  vcm_ = NULL;
+}
+
+VcmCapturer::~VcmCapturer() { Destroy(); }
+
+void VcmCapturer::OnIncomingCapturedFrame(const int32_t id,
+                                          I420VideoFrame& frame) {
+  if (last_timestamp_ == 0 || frame.timestamp() < last_timestamp_) {
+    last_timestamp_ = frame.timestamp();
+  }
+
+  if (started_) {
+    input_->PutFrame(frame, frame.timestamp() - last_timestamp_);
+  }
+  last_timestamp_ = frame.timestamp();
+}
+
+void VcmCapturer::OnCaptureDelayChanged(const int32_t id, const int32_t delay) {
+}
+}  // test
+}  // webrtc