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