Files
platform-external-webrtc/webrtc/test/vcm_capturer.cc
perkj@webrtc.org af612d5e07 Reland "Make the entry point for VideoFrames to webrtc const ref I420VideoFrame.""
Original cl description:
This removes the none const pointer entry and SwapFrame.
Since frames delivered using VideoSendStream no longer use the external capture module, VideoSendStream will not get an incoming framerate callback. VideoSendStream now uses a rtc::RateTracker.
Also, the video engine must ensure that time stamps are always increasing.

With this, time stamps (ntp, render_time and rtp timestamps ) are checked and set in ViECapturer::OnIncomingCapturedFrame

This cl was previously reverted in https://webrtc-codereview.appspot.com/46549004/.

Patchset 1 contains the original patch after rebase.
Patshet 2 fix webrtc_perf_tests reported in chromium:465306

Note that chromium:465287 is being fixed in https://webrtc-codereview.appspot.com/43829004/

BUG=1128
R=magjed@webrtc.org, mflodman@webrtc.org

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

Cr-Commit-Position: refs/heads/master@{#8776}
git-svn-id: http://webrtc.googlecode.com/svn/trunk@8776 4adac7df-926f-26a2-2b94-8c16560cd09d
2015-03-18 09:51:44 +00:00

99 lines
2.8 KiB
C++

/*
* 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) {}
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,
const I420VideoFrame& frame) {
if (started_)
input_->IncomingCapturedFrame(frame);
}
void VcmCapturer::OnCaptureDelayChanged(const int32_t id, const int32_t delay) {
}
} // test
} // webrtc