1 /* 2 * Copyright (c) 2012 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 #ifndef WEBRTC_VIDEO_VIDEO_CAPTURE_INPUT_H_ 12 #define WEBRTC_VIDEO_VIDEO_CAPTURE_INPUT_H_ 13 14 #include <vector> 15 16 #include "webrtc/base/criticalsection.h" 17 #include "webrtc/base/event.h" 18 #include "webrtc/base/platform_thread.h" 19 #include "webrtc/base/scoped_ptr.h" 20 #include "webrtc/base/thread_annotations.h" 21 #include "webrtc/common_types.h" 22 #include "webrtc/engine_configurations.h" 23 #include "webrtc/modules/video_capture/video_capture.h" 24 #include "webrtc/modules/video_coding/include/video_codec_interface.h" 25 #include "webrtc/modules/video_coding/include/video_coding.h" 26 #include "webrtc/modules/video_processing/include/video_processing.h" 27 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" 28 #include "webrtc/typedefs.h" 29 #include "webrtc/video_send_stream.h" 30 31 namespace webrtc { 32 33 class Config; 34 class CpuOveruseMetricsObserver; 35 class CpuOveruseObserver; 36 class CriticalSectionWrapper; 37 class OveruseFrameDetector; 38 class ProcessThread; 39 class RegistrableCpuOveruseMetricsObserver; 40 class SendStatisticsProxy; 41 class VideoRenderer; 42 43 class VideoCaptureCallback { 44 public: ~VideoCaptureCallback()45 virtual ~VideoCaptureCallback() {} 46 47 virtual void DeliverFrame(VideoFrame video_frame) = 0; 48 }; 49 50 namespace internal { 51 class VideoCaptureInput : public webrtc::VideoCaptureInput { 52 public: 53 VideoCaptureInput(ProcessThread* module_process_thread, 54 VideoCaptureCallback* frame_callback, 55 VideoRenderer* local_renderer, 56 SendStatisticsProxy* send_stats_proxy, 57 CpuOveruseObserver* overuse_observer, 58 EncodingTimeObserver* encoding_time_observer); 59 ~VideoCaptureInput(); 60 61 void IncomingCapturedFrame(const VideoFrame& video_frame) override; 62 63 private: 64 // Thread functions for deliver captured frames to receivers. 65 static bool EncoderThreadFunction(void* obj); 66 bool EncoderProcess(); 67 68 rtc::scoped_ptr<CriticalSectionWrapper> capture_cs_; 69 ProcessThread* const module_process_thread_; 70 71 VideoCaptureCallback* const frame_callback_; 72 VideoRenderer* const local_renderer_; 73 SendStatisticsProxy* const stats_proxy_; 74 75 // Frame used in IncomingFrameI420. 76 rtc::scoped_ptr<CriticalSectionWrapper> incoming_frame_cs_; 77 VideoFrame incoming_frame_; 78 79 rtc::PlatformThread encoder_thread_; 80 rtc::Event capture_event_; 81 82 volatile int stop_; 83 84 VideoFrame captured_frame_ GUARDED_BY(capture_cs_.get()); 85 // Used to make sure incoming time stamp is increasing for every frame. 86 int64_t last_captured_timestamp_; 87 // Delta used for translating between NTP and internal timestamps. 88 const int64_t delta_ntp_internal_ms_; 89 90 rtc::scoped_ptr<OveruseFrameDetector> overuse_detector_; 91 EncodingTimeObserver* const encoding_time_observer_; 92 }; 93 94 } // namespace internal 95 } // namespace webrtc 96 97 #endif // WEBRTC_VIDEO_VIDEO_CAPTURE_INPUT_H_ 98