1470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/* 21745e932cc560e50d764f6f0fbdc4d5b8bf20e4aleozwang@webrtc.org * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * 4470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Use of this source code is governed by a BSD-style license 5470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * that can be found in the LICENSE file in the root of the source 6470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * tree. An additional intellectual property rights grant can be found 7470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * in the file PATENTS. All contributing project authors may 8470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * be found in the AUTHORS file in the root of the source tree. 9470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */ 10470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 114b91bd08979fcfb191cdae27ad24936beefce735Peter Boström#ifndef WEBRTC_VIDEO_VIDEO_CAPTURE_INPUT_H_ 124b91bd08979fcfb191cdae27ad24936beefce735Peter Boström#define WEBRTC_VIDEO_VIDEO_CAPTURE_INPUT_H_ 13470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 14c5300436841092d6d2b01eae1179a2c1eb373f1bstefan@webrtc.org#include <vector> 15c5300436841092d6d2b01eae1179a2c1eb373f1bstefan@webrtc.org 163e6e271ec3253e78ae0eb72156e5236d43f8731dpbos@webrtc.org#include "webrtc/base/criticalsection.h" 175811a39f14fd77ebc0793ee93d03ee15a669bd8fPeter Boström#include "webrtc/base/event.h" 1812411ef40e08c5e28ccde54ab3418c96676ffcbcpbos#include "webrtc/base/platform_thread.h" 1900b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org#include "webrtc/base/scoped_ptr.h" 2038344ed2806c8fed60d67d280ca44c32e36707c0pbos@webrtc.org#include "webrtc/base/thread_annotations.h" 21f5d4cb19589f0b0a3736e4f653dc5a75b9df1cebpbos@webrtc.org#include "webrtc/common_types.h" 22f5d4cb19589f0b0a3736e4f653dc5a75b9df1cebpbos@webrtc.org#include "webrtc/engine_configurations.h" 235dda80abea311731144b1d544aff61c408412f12Henrik Kjellander#include "webrtc/modules/video_capture/video_capture.h" 242557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander#include "webrtc/modules/video_coding/include/video_codec_interface.h" 252557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander#include "webrtc/modules/video_coding/include/video_coding.h" 260f59a88b32d95430bf12bd8c4d9b2963e018ead2Henrik Kjellander#include "webrtc/modules/video_processing/include/video_processing.h" 2798f53510b222f71fdd8b799b2f33737ceeb28c61Henrik Kjellander#include "webrtc/system_wrappers/include/critical_section_wrapper.h" 28f5d4cb19589f0b0a3736e4f653dc5a75b9df1cebpbos@webrtc.org#include "webrtc/typedefs.h" 294b91bd08979fcfb191cdae27ad24936beefce735Peter Boström#include "webrtc/video_send_stream.h" 30470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 31470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comnamespace webrtc { 32e6f64835a0a6cb75da8cca60e4d09ff25076ba0amflodman@webrtc.org 337707d060bb2fcceae1ed4118ebac29de577e209bandresp@webrtc.orgclass Config; 34300eeb68f55c5091c7045e377578586733cddf16Peter Boströmclass CpuOveruseMetricsObserver; 35300eeb68f55c5091c7045e377578586733cddf16Peter Boströmclass CpuOveruseObserver; 36470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass CriticalSectionWrapper; 376879c8adad604d51db200de56f9afe08282973a6mflodman@webrtc.orgclass OveruseFrameDetector; 38e6f64835a0a6cb75da8cca60e4d09ff25076ba0amflodman@webrtc.orgclass ProcessThread; 393e6e271ec3253e78ae0eb72156e5236d43f8731dpbos@webrtc.orgclass RegistrableCpuOveruseMetricsObserver; 404b91bd08979fcfb191cdae27ad24936beefce735Peter Boströmclass SendStatisticsProxy; 414b91bd08979fcfb191cdae27ad24936beefce735Peter Boströmclass VideoRenderer; 4236a1438a66b74628c1f9f3c4d3ea322156958169Peter Boström 434b91bd08979fcfb191cdae27ad24936beefce735Peter Boströmclass VideoCaptureCallback { 4436a1438a66b74628c1f9f3c4d3ea322156958169Peter Boström public: 454b91bd08979fcfb191cdae27ad24936beefce735Peter Boström virtual ~VideoCaptureCallback() {} 4636a1438a66b74628c1f9f3c4d3ea322156958169Peter Boström 474765070b8d6f024509c717c04d9b708750666927Miguel Casas-Sanchez virtual void DeliverFrame(VideoFrame video_frame) = 0; 4836a1438a66b74628c1f9f3c4d3ea322156958169Peter Boström}; 49470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 504b91bd08979fcfb191cdae27ad24936beefce735Peter Boströmnamespace internal { 514b91bd08979fcfb191cdae27ad24936beefce735Peter Boströmclass VideoCaptureInput : public webrtc::VideoCaptureInput { 52e6f64835a0a6cb75da8cca60e4d09ff25076ba0amflodman@webrtc.org public: 534b91bd08979fcfb191cdae27ad24936beefce735Peter Boström VideoCaptureInput(ProcessThread* module_process_thread, 544b91bd08979fcfb191cdae27ad24936beefce735Peter Boström VideoCaptureCallback* frame_callback, 554b91bd08979fcfb191cdae27ad24936beefce735Peter Boström VideoRenderer* local_renderer, 564b91bd08979fcfb191cdae27ad24936beefce735Peter Boström SendStatisticsProxy* send_stats_proxy, 578d15bd6dabae829d27443e17f2f02cfbe6fa6525ivica CpuOveruseObserver* overuse_observer, 588d15bd6dabae829d27443e17f2f02cfbe6fa6525ivica EncodingTimeObserver* encoding_time_observer); 594b91bd08979fcfb191cdae27ad24936beefce735Peter Boström ~VideoCaptureInput(); 60e6f64835a0a6cb75da8cca60e4d09ff25076ba0amflodman@webrtc.org 614b91bd08979fcfb191cdae27ad24936beefce735Peter Boström void IncomingCapturedFrame(const VideoFrame& video_frame) override; 62e6f64835a0a6cb75da8cca60e4d09ff25076ba0amflodman@webrtc.org 634b91bd08979fcfb191cdae27ad24936beefce735Peter Boström private: 64e6f64835a0a6cb75da8cca60e4d09ff25076ba0amflodman@webrtc.org // Thread functions for deliver captured frames to receivers. 657317248ea7a052c19393bbfa2bec22c78a639c94Peter Boström static bool EncoderThreadFunction(void* obj); 667317248ea7a052c19393bbfa2bec22c78a639c94Peter Boström bool EncoderProcess(); 67e6f64835a0a6cb75da8cca60e4d09ff25076ba0amflodman@webrtc.org 6800b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org rtc::scoped_ptr<CriticalSectionWrapper> capture_cs_; 69f16fcbec734e1e3303828525c9fd7e13e0803aabPeter Boström ProcessThread* const module_process_thread_; 70300eeb68f55c5091c7045e377578586733cddf16Peter Boström 714b91bd08979fcfb191cdae27ad24936beefce735Peter Boström VideoCaptureCallback* const frame_callback_; 724b91bd08979fcfb191cdae27ad24936beefce735Peter Boström VideoRenderer* const local_renderer_; 734b91bd08979fcfb191cdae27ad24936beefce735Peter Boström SendStatisticsProxy* const stats_proxy_; 74e6f64835a0a6cb75da8cca60e4d09ff25076ba0amflodman@webrtc.org 751f7c8d8b6a832b553e34eb4a224e24d4943ce021pbos@webrtc.org // Frame used in IncomingFrameI420. 7600b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org rtc::scoped_ptr<CriticalSectionWrapper> incoming_frame_cs_; 774765070b8d6f024509c717c04d9b708750666927Miguel Casas-Sanchez VideoFrame incoming_frame_; 781f7c8d8b6a832b553e34eb4a224e24d4943ce021pbos@webrtc.org 798c38e8b9b96d72317d6ce94c1442113b4e385dcbPeter Boström rtc::PlatformThread encoder_thread_; 805811a39f14fd77ebc0793ee93d03ee15a669bd8fPeter Boström rtc::Event capture_event_; 81e6f64835a0a6cb75da8cca60e4d09ff25076ba0amflodman@webrtc.org 8246ad5426b025eddac8e9232014d347e73d27180epbos volatile int stop_; 83875c97ed9dc25a8eac8075a42742863aa1b45d3etommi@webrtc.org 844765070b8d6f024509c717c04d9b708750666927Miguel Casas-Sanchez VideoFrame captured_frame_ GUARDED_BY(capture_cs_.get()); 85af612d5e0769571544952cbe55e675748afa9bddperkj@webrtc.org // Used to make sure incoming time stamp is increasing for every frame. 86af612d5e0769571544952cbe55e675748afa9bddperkj@webrtc.org int64_t last_captured_timestamp_; 87af612d5e0769571544952cbe55e675748afa9bddperkj@webrtc.org // Delta used for translating between NTP and internal timestamps. 88af612d5e0769571544952cbe55e675748afa9bddperkj@webrtc.org const int64_t delta_ntp_internal_ms_; 89e6f64835a0a6cb75da8cca60e4d09ff25076ba0amflodman@webrtc.org 9000b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org rtc::scoped_ptr<OveruseFrameDetector> overuse_detector_; 918d15bd6dabae829d27443e17f2f02cfbe6fa6525ivica EncodingTimeObserver* const encoding_time_observer_; 92470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}; 93e6f64835a0a6cb75da8cca60e4d09ff25076ba0amflodman@webrtc.org 944b91bd08979fcfb191cdae27ad24936beefce735Peter Boström} // namespace internal 95e6f64835a0a6cb75da8cca60e4d09ff25076ba0amflodman@webrtc.org} // namespace webrtc 96e6f64835a0a6cb75da8cca60e4d09ff25076ba0amflodman@webrtc.org 974b91bd08979fcfb191cdae27ad24936beefce735Peter Boström#endif // WEBRTC_VIDEO_VIDEO_CAPTURE_INPUT_H_ 98