Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(43)

Unified Diff: webrtc/video/video_capture_input.cc

Issue 2248713003: Revert of Add task queue to Call. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@move_getpadding
Patch Set: Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webrtc/video/video_capture_input.h ('k') | webrtc/video/video_capture_input_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webrtc/video/video_capture_input.cc
diff --git a/webrtc/video/video_capture_input.cc b/webrtc/video/video_capture_input.cc
new file mode 100644
index 0000000000000000000000000000000000000000..8f574e21154d7abddca59dcf46b28d476866d5dc
--- /dev/null
+++ b/webrtc/video/video_capture_input.cc
@@ -0,0 +1,109 @@
+/*
+ * 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.
+ */
+
+#include "webrtc/video/video_capture_input.h"
+
+#include "webrtc/base/checks.h"
+#include "webrtc/base/logging.h"
+#include "webrtc/base/trace_event.h"
+#include "webrtc/modules/include/module_common_types.h"
+#include "webrtc/modules/video_capture/video_capture_factory.h"
+#include "webrtc/modules/video_processing/include/video_processing.h"
+#include "webrtc/video/overuse_frame_detector.h"
+#include "webrtc/video/send_statistics_proxy.h"
+#include "webrtc/video/vie_encoder.h"
+
+namespace webrtc {
+
+namespace internal {
+VideoCaptureInput::VideoCaptureInput(
+ rtc::Event* capture_event,
+ rtc::VideoSinkInterface<VideoFrame>* local_renderer,
+ SendStatisticsProxy* stats_proxy,
+ OveruseFrameDetector* overuse_detector)
+ : local_renderer_(local_renderer),
+ stats_proxy_(stats_proxy),
+ capture_event_(capture_event),
+ // TODO(danilchap): Pass clock from outside to ensure it is same clock
+ // rtcp module use to calculate offset since last frame captured
+ // to estimate rtp timestamp for SenderReport.
+ clock_(Clock::GetRealTimeClock()),
+ last_captured_timestamp_(0),
+ delta_ntp_internal_ms_(clock_->CurrentNtpInMilliseconds() -
+ clock_->TimeInMilliseconds()),
+ overuse_detector_(overuse_detector) {}
+
+VideoCaptureInput::~VideoCaptureInput() {
+}
+
+void VideoCaptureInput::IncomingCapturedFrame(const VideoFrame& video_frame) {
+ // TODO(pbos): Remove local rendering, it should be handled by the client code
+ // if required.
+ if (local_renderer_)
+ local_renderer_->OnFrame(video_frame);
+
+ stats_proxy_->OnIncomingFrame(video_frame.width(), video_frame.height());
+
+ VideoFrame incoming_frame = video_frame;
+
+ // Local time in webrtc time base.
+ int64_t current_time = clock_->TimeInMilliseconds();
+ incoming_frame.set_render_time_ms(current_time);
+
+ // Capture time may come from clock with an offset and drift from clock_.
+ int64_t capture_ntp_time_ms;
+ if (video_frame.ntp_time_ms() != 0) {
+ capture_ntp_time_ms = video_frame.ntp_time_ms();
+ } else if (video_frame.render_time_ms() != 0) {
+ capture_ntp_time_ms = video_frame.render_time_ms() + delta_ntp_internal_ms_;
+ } else {
+ capture_ntp_time_ms = current_time + delta_ntp_internal_ms_;
+ }
+ incoming_frame.set_ntp_time_ms(capture_ntp_time_ms);
+
+ // Convert NTP time, in ms, to RTP timestamp.
+ const int kMsToRtpTimestamp = 90;
+ incoming_frame.set_timestamp(
+ kMsToRtpTimestamp * static_cast<uint32_t>(incoming_frame.ntp_time_ms()));
+
+ rtc::CritScope lock(&crit_);
+ if (incoming_frame.ntp_time_ms() <= last_captured_timestamp_) {
+ // We don't allow the same capture time for two frames, drop this one.
+ LOG(LS_WARNING) << "Same/old NTP timestamp ("
+ << incoming_frame.ntp_time_ms()
+ << " <= " << last_captured_timestamp_
+ << ") for incoming frame. Dropping.";
+ return;
+ }
+
+ captured_frame_.reset(new VideoFrame);
+ captured_frame_->ShallowCopy(incoming_frame);
+ last_captured_timestamp_ = incoming_frame.ntp_time_ms();
+
+ overuse_detector_->FrameCaptured(*captured_frame_);
+
+ TRACE_EVENT_ASYNC_BEGIN1("webrtc", "Video", video_frame.render_time_ms(),
+ "render_time", video_frame.render_time_ms());
+
+ capture_event_->Set();
+}
+
+bool VideoCaptureInput::GetVideoFrame(VideoFrame* video_frame) {
+ rtc::CritScope lock(&crit_);
+ if (!captured_frame_)
+ return false;
+
+ *video_frame = *captured_frame_;
+ captured_frame_.reset();
+ return true;
+}
+
+} // namespace internal
+} // namespace webrtc
« no previous file with comments | « webrtc/video/video_capture_input.h ('k') | webrtc/video/video_capture_input_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698