video_capture_input.h revision 12411ef40e08c5e28ccde54ab3418c96676ffcbc
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"
1712411ef40e08c5e28ccde54ab3418c96676ffcbcpbos#include "webrtc/base/platform_thread.h"
1800b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org#include "webrtc/base/scoped_ptr.h"
1938344ed2806c8fed60d67d280ca44c32e36707c0pbos@webrtc.org#include "webrtc/base/thread_annotations.h"
20f5d4cb19589f0b0a3736e4f653dc5a75b9df1cebpbos@webrtc.org#include "webrtc/common_types.h"
21f5d4cb19589f0b0a3736e4f653dc5a75b9df1cebpbos@webrtc.org#include "webrtc/engine_configurations.h"
225dda80abea311731144b1d544aff61c408412f12Henrik Kjellander#include "webrtc/modules/video_capture/video_capture.h"
232557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander#include "webrtc/modules/video_coding/include/video_codec_interface.h"
242557b86e7648ffebc5781df9f093ca5a84efc219Henrik Kjellander#include "webrtc/modules/video_coding/include/video_coding.h"
250f59a88b32d95430bf12bd8c4d9b2963e018ead2Henrik Kjellander#include "webrtc/modules/video_processing/include/video_processing.h"
2698f53510b222f71fdd8b799b2f33737ceeb28c61Henrik Kjellander#include "webrtc/system_wrappers/include/critical_section_wrapper.h"
27f5d4cb19589f0b0a3736e4f653dc5a75b9df1cebpbos@webrtc.org#include "webrtc/typedefs.h"
284b91bd08979fcfb191cdae27ad24936beefce735Peter Boström#include "webrtc/video_send_stream.h"
29470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
30470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comnamespace webrtc {
31e6f64835a0a6cb75da8cca60e4d09ff25076ba0amflodman@webrtc.org
327707d060bb2fcceae1ed4118ebac29de577e209bandresp@webrtc.orgclass Config;
33300eeb68f55c5091c7045e377578586733cddf16Peter Boströmclass CpuOveruseMetricsObserver;
34300eeb68f55c5091c7045e377578586733cddf16Peter Boströmclass CpuOveruseObserver;
35470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass CriticalSectionWrapper;
36470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass EventWrapper;
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
684765070b8d6f024509c717c04d9b708750666927Miguel Casas-Sanchez  void DeliverI420Frame(VideoFrame* video_frame);
69dfbf52baac1a270dd18ae18c9f9bd729a780659bmflodman@webrtc.org
7000b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org  rtc::scoped_ptr<CriticalSectionWrapper> capture_cs_;
71f16fcbec734e1e3303828525c9fd7e13e0803aabPeter Boström  ProcessThread* const module_process_thread_;
72300eeb68f55c5091c7045e377578586733cddf16Peter Boström
734b91bd08979fcfb191cdae27ad24936beefce735Peter Boström  VideoCaptureCallback* const frame_callback_;
744b91bd08979fcfb191cdae27ad24936beefce735Peter Boström  VideoRenderer* const local_renderer_;
754b91bd08979fcfb191cdae27ad24936beefce735Peter Boström  SendStatisticsProxy* const stats_proxy_;
76e6f64835a0a6cb75da8cca60e4d09ff25076ba0amflodman@webrtc.org
771f7c8d8b6a832b553e34eb4a224e24d4943ce021pbos@webrtc.org  // Frame used in IncomingFrameI420.
7800b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org  rtc::scoped_ptr<CriticalSectionWrapper> incoming_frame_cs_;
794765070b8d6f024509c717c04d9b708750666927Miguel Casas-Sanchez  VideoFrame incoming_frame_;
801f7c8d8b6a832b553e34eb4a224e24d4943ce021pbos@webrtc.org
8112411ef40e08c5e28ccde54ab3418c96676ffcbcpbos  rtc::scoped_ptr<PlatformThread> encoder_thread_;
827317248ea7a052c19393bbfa2bec22c78a639c94Peter Boström  rtc::scoped_ptr<EventWrapper> capture_event_;
83e6f64835a0a6cb75da8cca60e4d09ff25076ba0amflodman@webrtc.org
843c12f4dadb969afb97468aeb1548777bf860085apbos  volatile int stop_;
85875c97ed9dc25a8eac8075a42742863aa1b45d3etommi@webrtc.org
864765070b8d6f024509c717c04d9b708750666927Miguel Casas-Sanchez  VideoFrame captured_frame_ GUARDED_BY(capture_cs_.get());
87af612d5e0769571544952cbe55e675748afa9bddperkj@webrtc.org  // Used to make sure incoming time stamp is increasing for every frame.
88af612d5e0769571544952cbe55e675748afa9bddperkj@webrtc.org  int64_t last_captured_timestamp_;
89af612d5e0769571544952cbe55e675748afa9bddperkj@webrtc.org  // Delta used for translating between NTP and internal timestamps.
90af612d5e0769571544952cbe55e675748afa9bddperkj@webrtc.org  const int64_t delta_ntp_internal_ms_;
91e6f64835a0a6cb75da8cca60e4d09ff25076ba0amflodman@webrtc.org
9200b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org  rtc::scoped_ptr<OveruseFrameDetector> overuse_detector_;
938d15bd6dabae829d27443e17f2f02cfbe6fa6525ivica  EncodingTimeObserver* const encoding_time_observer_;
94470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com};
95e6f64835a0a6cb75da8cca60e4d09ff25076ba0amflodman@webrtc.org
964b91bd08979fcfb191cdae27ad24936beefce735Peter Boström}  // namespace internal
97e6f64835a0a6cb75da8cca60e4d09ff25076ba0amflodman@webrtc.org}  // namespace webrtc
98e6f64835a0a6cb75da8cca60e4d09ff25076ba0amflodman@webrtc.org
994b91bd08979fcfb191cdae27ad24936beefce735Peter Boström#endif  // WEBRTC_VIDEO_VIDEO_CAPTURE_INPUT_H_
100