1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_VIDEO_ENGINE_VIE_CAPTURER_H_
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_VIDEO_ENGINE_VIE_CAPTURER_H_
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <vector>
15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
16281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/common_types.h"
17281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/engine_configurations.h"
185e8ee6f8a182dd36d0c9f273f180d015a056cef4andrew@webrtc.org#include "webrtc/modules/video_capture/include/video_capture.h"
19281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/modules/video_coding/codecs/interface/video_codec_interface.h"
20281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/modules/video_coding/main/interface/video_coding.h"
21281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/modules/video_processing/main/interface/video_processing.h"
22281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/system_wrappers/interface/scoped_ptr.h"
237dc751458e1d5a3576065763737480e5f3f5a15bmallinath@webrtc.org#include "webrtc/system_wrappers/interface/thread_annotations.h"
24281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/typedefs.h"
259da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org#include "webrtc/video_engine/include/vie_base.h"
26281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/include/vie_capture.h"
27281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/vie_defines.h"
28281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/vie_frame_provider_base.h"
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc {
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
32ac6d919eec548c708588f29923f617a17283c7e2andresp@webrtc.orgclass Config;
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass CriticalSectionWrapper;
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass EventWrapper;
35bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.orgclass CpuOveruseObserver;
36bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.orgclass OveruseFrameDetector;
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass ProcessThread;
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass ThreadWrapper;
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass ViEEffectFilter;
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass ViEEncoder;
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstruct ViEPicture;
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass ViECapturer
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    : public ViEFrameProviderBase,
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      public ViEExternalCapture,
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      protected VideoCaptureDataCallback,
47a18c6e5b2811221b60e3d7e72516aa20927e13ddmflodman@webrtc.org      protected VideoCaptureFeedBack {
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public:
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  static ViECapturer* CreateViECapture(int capture_id,
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                       int engine_id,
51ac6d919eec548c708588f29923f617a17283c7e2andresp@webrtc.org                                       const Config& config,
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                       VideoCaptureModule* capture_module,
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                       ProcessThread& module_process_thread);
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  static ViECapturer* CreateViECapture(
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      int capture_id,
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      int engine_id,
58ac6d919eec548c708588f29923f617a17283c7e2andresp@webrtc.org      const Config& config,
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      const char* device_unique_idUTF8,
6067879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org      uint32_t device_unique_idUTF8Length,
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      ProcessThread& module_process_thread);
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ~ViECapturer();
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Implements ViEFrameProviderBase.
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int FrameCallbackChanged();
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int DeregisterFrameCallback(const ViEFrameCallback* callbackObject);
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool IsFrameCallbackRegistered(const ViEFrameCallback* callbackObject);
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Implements ExternalCapture.
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int IncomingFrame(unsigned char* video_frame,
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            unsigned int video_frame_length,
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            uint16_t width,
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            uint16_t height,
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            RawVideoType video_type,
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            unsigned long long capture_time = 0);  // NOLINT
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int IncomingFrameI420(const ViEVideoFrameI420& video_frame,
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                unsigned long long capture_time = 0);  // NOLINT
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
81c33d37ce205e22c0e090b0b285ed963686bf24dcpbos@webrtc.org  virtual void SwapFrame(I420VideoFrame* frame) OVERRIDE;
82c33d37ce205e22c0e090b0b285ed963686bf24dcpbos@webrtc.org
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Start/Stop.
8467879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t Start(
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      const CaptureCapability& capture_capability = CaptureCapability());
8667879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t Stop();
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool Started();
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Overrides the capture delay.
9067879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t SetCaptureDelay(int32_t delay_ms);
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Sets rotation of the incoming captured frame.
9367879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t SetRotateCapturedFrames(const RotateCapturedFrame rotation);
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Effect filter.
9667879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t RegisterEffectFilter(ViEEffectFilter* effect_filter);
9767879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t EnableDenoising(bool enable);
9867879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t EnableDeflickering(bool enable);
9967879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t EnableBrightnessAlarm(bool enable);
100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Statistics observer.
10267879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t RegisterObserver(ViECaptureObserver* observer);
10367879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t DeRegisterObserver();
104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool IsObserverRegistered();
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Information.
107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const char* CurrentDeviceName() const;
108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
109bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.org  void RegisterCpuOveruseObserver(CpuOveruseObserver* observer);
1109da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org  void SetCpuOveruseOptions(const CpuOveruseOptions& options);
1114e95436d6302be2854cd5b3e7baa3c4f563e4901asapersson@webrtc.org  void GetCpuOveruseMetrics(CpuOveruseMetrics* metrics) const;
1124747585bba09508c7475bf1e5f70a0b981175d9fasapersson@webrtc.org
113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org protected:
114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViECapturer(int capture_id,
115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org              int engine_id,
116ac6d919eec548c708588f29923f617a17283c7e2andresp@webrtc.org              const Config& config,
117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org              ProcessThread& module_process_thread);
118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11967879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t Init(VideoCaptureModule* capture_module);
12067879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t Init(const char* device_unique_idUTF8,
121a18c6e5b2811221b60e3d7e72516aa20927e13ddmflodman@webrtc.org               uint32_t device_unique_idUTF8Length);
122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Implements VideoCaptureDataCallback.
12467879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  virtual void OnIncomingCapturedFrame(const int32_t id,
12543b21821dccec02f463a0912a4726a31ee62ac96mikhal@webrtc.org                                       I420VideoFrame& video_frame);
12667879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  virtual void OnCaptureDelayChanged(const int32_t id,
12767879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                                     const int32_t delay);
128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Returns true if the capture capability has been set in |StartCapture|
130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // function and may not be changed.
131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool CaptureCapabilityFixed();
132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Help function used for keeping track of VideoImageProcesingModule.
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Creates the module if it is needed, returns 0 on success and guarantees
135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // that the image proc module exist.
13667879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t IncImageProcRefCount();
13767879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t DecImageProcRefCount();
138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Implements VideoCaptureFeedBack
14067879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  virtual void OnCaptureFrameRate(const int32_t id,
14167879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org                                  const uint32_t frame_rate);
14267879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  virtual void OnNoPictureAlarm(const int32_t id,
143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                const VideoCaptureAlarm alarm);
144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Thread functions for deliver captured frames to receivers.
146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  static bool ViECaptureThreadFunction(void* obj);
147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool ViECaptureProcess();
148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1493bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org  void DeliverI420Frame(I420VideoFrame* video_frame);
150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void DeliverCodedFrame(VideoFrame* video_frame);
151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org private:
153324a0168c19708db5746616b6f8533fdb6ad5745mflodman@webrtc.org  bool SwapCapturedAndDeliverFrameIfAvailable();
154a594db2bf300734ca90d480974362ad055bc5903mflodman@webrtc.org
155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Never take capture_cs_ before deliver_cs_!
156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  scoped_ptr<CriticalSectionWrapper> capture_cs_;
157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  scoped_ptr<CriticalSectionWrapper> deliver_cs_;
158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  VideoCaptureModule* capture_module_;
159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  VideoCaptureExternal* external_capture_module_;
160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ProcessThread& module_process_thread_;
161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const int capture_id_;
162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1635a669d5b339d7c699662b52d90236dfd5412e024pbos@webrtc.org  // Frame used in IncomingFrameI420.
1645a669d5b339d7c699662b52d90236dfd5412e024pbos@webrtc.org  scoped_ptr<CriticalSectionWrapper> incoming_frame_cs_;
1655a669d5b339d7c699662b52d90236dfd5412e024pbos@webrtc.org  I420VideoFrame incoming_frame_;
1665a669d5b339d7c699662b52d90236dfd5412e024pbos@webrtc.org
167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Capture thread.
168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ThreadWrapper& capture_thread_;
169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EventWrapper& capture_event_;
170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EventWrapper& deliver_event_;
171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1721bdf186e6ae8d2f1a7d055237a75c0d7fd189624wuchengli@chromium.org  scoped_ptr<I420VideoFrame> captured_frame_;
1731bdf186e6ae8d2f1a7d055237a75c0d7fd189624wuchengli@chromium.org  scoped_ptr<I420VideoFrame> deliver_frame_;
174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Image processing.
176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEEffectFilter* effect_filter_;
177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  VideoProcessingModule* image_proc_module_;
178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int image_proc_module_ref_counter_;
179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  VideoProcessingModule::FrameStats* deflicker_frame_stats_;
180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  VideoProcessingModule::FrameStats* brightness_frame_stats_;
181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  Brightness current_brightness_level_;
182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  Brightness reported_brightness_level_;
183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool denoising_enabled_;
184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Statistics observer.
186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  scoped_ptr<CriticalSectionWrapper> observer_cs_;
1877dc751458e1d5a3576065763737480e5f3f5a15bmallinath@webrtc.org  ViECaptureObserver* observer_ GUARDED_BY(observer_cs_.get());
188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  CaptureCapability requested_capability_;
190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
191bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.org  scoped_ptr<OveruseFrameDetector> overuse_detector_;
192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}  // namespace webrtc
195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif  // WEBRTC_VIDEO_ENGINE_VIE_CAPTURER_H_
197