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