| 
									
										
										
										
											2020-07-14 12:25:41 -07:00
										 |  |  | /* This Source Code Form is subject to the terms of the Mozilla Public
 | 
					
						
							|  |  |  |  * License, v. 2.0. If a copy of the MPL was not distributed with this | 
					
						
							|  |  |  |  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <memory>
 | 
					
						
							|  |  |  | #include <set>
 | 
					
						
							|  |  |  | #include "api/video/video_frame.h"
 | 
					
						
							|  |  |  | #include "media/base/videosinkinterface.h"
 | 
					
						
							|  |  |  | #include "modules/video_capture/video_capture.h"
 | 
					
						
							|  |  |  | #include "rtc_base/criticalsection.h"
 | 
					
						
							| 
									
										
										
										
											2021-05-06 19:11:42 -07:00
										 |  |  | #include "video_engine/desktop_capture_impl.h"
 | 
					
						
							| 
									
										
										
										
											2020-07-14 12:25:41 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | class nsIWidget; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace mozilla { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace widget { | 
					
						
							|  |  |  | class HeadlessWidget; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-06 19:11:42 -07:00
										 |  |  | class HeadlessWindowCapturer : public webrtc::VideoCaptureModuleEx { | 
					
						
							| 
									
										
										
										
											2020-07-14 12:25:41 -07:00
										 |  |  |  public: | 
					
						
							| 
									
										
										
										
											2021-05-06 19:11:42 -07:00
										 |  |  |   static rtc::scoped_refptr<webrtc::VideoCaptureModuleEx> Create(mozilla::widget::HeadlessWidget*); | 
					
						
							| 
									
										
										
										
											2020-07-14 12:25:41 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   void RegisterCaptureDataCallback( | 
					
						
							|  |  |  |       rtc::VideoSinkInterface<webrtc::VideoFrame>* dataCallback) override; | 
					
						
							|  |  |  |   void DeRegisterCaptureDataCallback( | 
					
						
							|  |  |  |       rtc::VideoSinkInterface<webrtc::VideoFrame>* dataCallback) override; | 
					
						
							|  |  |  |   int32_t StopCaptureIfAllClientsClose() override; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-06 19:11:42 -07:00
										 |  |  |   void RegisterRawFrameCallback(webrtc::RawFrameCallback* rawFrameCallback) override; | 
					
						
							|  |  |  |   void DeRegisterRawFrameCallback(webrtc::RawFrameCallback* rawFrameCallback) override; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-14 12:25:41 -07:00
										 |  |  |   int32_t SetCaptureRotation(webrtc::VideoRotation) override { return -1; } | 
					
						
							|  |  |  |   bool SetApplyRotation(bool) override { return false; } | 
					
						
							|  |  |  |   bool GetApplyRotation() override { return true; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const char* CurrentDeviceName() const override { return "Headless window"; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Platform dependent
 | 
					
						
							|  |  |  |   int32_t StartCapture(const webrtc::VideoCaptureCapability& capability) override; | 
					
						
							|  |  |  |   bool FocusOnSelectedSource() override { return false; } | 
					
						
							|  |  |  |   int32_t StopCapture() override; | 
					
						
							|  |  |  |   bool CaptureStarted() override; | 
					
						
							|  |  |  |   int32_t CaptureSettings(webrtc::VideoCaptureCapability& settings) override { | 
					
						
							|  |  |  |     return -1; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  protected: | 
					
						
							|  |  |  |   HeadlessWindowCapturer(mozilla::widget::HeadlessWidget*); | 
					
						
							|  |  |  |   ~HeadlessWindowCapturer() override; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  private: | 
					
						
							|  |  |  |   void NotifyFrameCaptured(const webrtc::VideoFrame& frame); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   mozilla::widget::HeadlessWidget* mWindow = nullptr; | 
					
						
							|  |  |  |   rtc::CriticalSection _callBackCs; | 
					
						
							|  |  |  |   std::set<rtc::VideoSinkInterface<webrtc::VideoFrame>*> _dataCallBacks; | 
					
						
							| 
									
										
										
										
											2021-05-06 19:11:42 -07:00
										 |  |  |   std::set<webrtc::RawFrameCallback*> _rawFrameCallbacks; | 
					
						
							| 
									
										
										
										
											2020-07-14 12:25:41 -07:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }  // namespace mozilla
 |