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