1/* 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11#include "webrtc/test/vcm_capturer.h" 12 13#include "webrtc/modules/video_capture/include/video_capture_factory.h" 14#include "webrtc/video_send_stream.h" 15 16namespace webrtc { 17namespace test { 18 19VcmCapturer::VcmCapturer(webrtc::VideoSendStreamInput* input) 20 : VideoCapturer(input), started_(false), vcm_(NULL) {} 21 22bool VcmCapturer::Init(size_t width, size_t height, size_t target_fps) { 23 VideoCaptureModule::DeviceInfo* device_info = 24 VideoCaptureFactory::CreateDeviceInfo(42); // Any ID (42) will do. 25 26 char device_name[256]; 27 char unique_name[256]; 28 if (device_info->GetDeviceName(0, device_name, sizeof(device_name), 29 unique_name, sizeof(unique_name)) != 30 0) { 31 Destroy(); 32 return false; 33 } 34 35 vcm_ = webrtc::VideoCaptureFactory::Create(0, unique_name); 36 vcm_->RegisterCaptureDataCallback(*this); 37 38 device_info->GetCapability(vcm_->CurrentDeviceName(), 0, capability_); 39 delete device_info; 40 41 capability_.width = static_cast<int32_t>(width); 42 capability_.height = static_cast<int32_t>(height); 43 capability_.maxFPS = static_cast<int32_t>(target_fps); 44 capability_.rawType = kVideoI420; 45 46 if (vcm_->StartCapture(capability_) != 0) { 47 Destroy(); 48 return false; 49 } 50 51 assert(vcm_->CaptureStarted()); 52 53 return true; 54} 55 56VcmCapturer* VcmCapturer::Create(VideoSendStreamInput* input, 57 size_t width, size_t height, 58 size_t target_fps) { 59 VcmCapturer* vcm__capturer = new VcmCapturer(input); 60 if (!vcm__capturer->Init(width, height, target_fps)) { 61 // TODO(pbos): Log a warning that this failed. 62 delete vcm__capturer; 63 return NULL; 64 } 65 return vcm__capturer; 66} 67 68 69void VcmCapturer::Start() { started_ = true; } 70 71void VcmCapturer::Stop() { started_ = false; } 72 73void VcmCapturer::Destroy() { 74 if (vcm_ == NULL) { 75 return; 76 } 77 78 vcm_->StopCapture(); 79 vcm_->DeRegisterCaptureDataCallback(); 80 vcm_->Release(); 81 82 // TODO(pbos): How do I destroy the VideoCaptureModule? This still leaves 83 // non-freed memory. 84 vcm_ = NULL; 85} 86 87VcmCapturer::~VcmCapturer() { Destroy(); } 88 89void VcmCapturer::OnIncomingCapturedFrame(const int32_t id, 90 I420VideoFrame& frame) { 91 if (started_) 92 input_->SwapFrame(&frame); 93} 94 95void VcmCapturer::OnCaptureDelayChanged(const int32_t id, const int32_t delay) { 96} 97} // test 98} // webrtc 99