blob: 08af7c9b7d714fbc88920c1f08221677380f7ec5 [file] [log] [blame]
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00001/*
kjellander1afca732016-02-07 20:46:45 -08002 * Copyright (c) 2004 The WebRTC project authors. All Rights Reserved.
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00003 *
kjellander1afca732016-02-07 20:46:45 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
jlmiller@webrtc.org5f93d0a2015-01-20 21:36:13 +00009 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +000010
kjellander@webrtc.org5ad12972016-02-12 06:39:40 +010011#ifndef WEBRTC_MEDIA_ENGINE_WEBRTCVIDEOCAPTURER_H_
12#define WEBRTC_MEDIA_ENGINE_WEBRTCVIDEOCAPTURER_H_
henrike@webrtc.org28e20752013-07-10 00:45:36 +000013
kwiberg686a8ef2016-02-26 03:00:35 -080014#include <memory>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000015#include <string>
16#include <vector>
17
Henrik Boströmcbe408a2015-05-27 10:11:34 +020018#include "webrtc/base/asyncinvoker.h"
buildbot@webrtc.orga09a9992014-08-13 17:26:08 +000019#include "webrtc/base/messagehandler.h"
Peter Boström09c3a1e2016-03-22 17:17:39 +010020#include "webrtc/base/scoped_ref_ptr.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000021#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
solenberg8ad582d2016-03-16 09:34:56 -070022#include "webrtc/media/base/device.h"
kjellandera96e2d72016-02-04 23:52:28 -080023#include "webrtc/media/base/videocapturer.h"
Henrik Kjellander5dda80a2015-11-12 12:46:09 +010024#include "webrtc/modules/video_capture/video_capture.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000025
26namespace cricket {
27
28// Factory to allow injection of a VCM impl into WebRtcVideoCapturer.
29// DeviceInfos do not have a Release() and therefore need an explicit Destroy().
30class WebRtcVcmFactoryInterface {
31 public:
32 virtual ~WebRtcVcmFactoryInterface() {}
Peter Boström09c3a1e2016-03-22 17:17:39 +010033 virtual rtc::scoped_refptr<webrtc::VideoCaptureModule> Create(
34 int id,
35 const char* device) = 0;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000036 virtual webrtc::VideoCaptureModule::DeviceInfo* CreateDeviceInfo(int id) = 0;
37 virtual void DestroyDeviceInfo(
38 webrtc::VideoCaptureModule::DeviceInfo* info) = 0;
39};
40
41// WebRTC-based implementation of VideoCapturer.
42class WebRtcVideoCapturer : public VideoCapturer,
43 public webrtc::VideoCaptureDataCallback {
44 public:
45 WebRtcVideoCapturer();
46 explicit WebRtcVideoCapturer(WebRtcVcmFactoryInterface* factory);
47 virtual ~WebRtcVideoCapturer();
48
49 bool Init(const Device& device);
Peter Boström09c3a1e2016-03-22 17:17:39 +010050 bool Init(const rtc::scoped_refptr<webrtc::VideoCaptureModule>& module);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000051
52 // Override virtual methods of the parent class VideoCapturer.
Pera5092412016-02-12 13:30:57 +010053 bool GetBestCaptureFormat(const VideoFormat& desired,
54 VideoFormat* best_format) override;
55 CaptureState Start(const VideoFormat& capture_format) override;
56 void Stop() override;
57 bool IsRunning() override;
58 bool IsScreencast() const override { return false; }
henrike@webrtc.org28e20752013-07-10 00:45:36 +000059
60 protected:
Pera5092412016-02-12 13:30:57 +010061 void OnSinkWantsChanged(const rtc::VideoSinkWants& wants) override;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000062 // Override virtual methods of the parent class VideoCapturer.
nisseef8b61e2016-04-29 06:09:15 -070063 bool GetPreferredFourccs(std::vector<uint32_t>* fourccs) override;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000064
65 private:
66 // Callback when a frame is captured by camera.
nisseef8b61e2016-04-29 06:09:15 -070067 void OnIncomingCapturedFrame(const int32_t id,
68 const webrtc::VideoFrame& frame) override;
69 void OnCaptureDelayChanged(const int32_t id,
70 const int32_t delay) override;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000071
tommi@webrtc.orge07710c2015-02-19 17:43:25 +000072 // Used to signal captured frames on the same thread as invoked Start().
73 // With WebRTC's current VideoCapturer implementations, this will mean a
74 // thread hop, but in other implementations (e.g. Chrome) it will be called
75 // directly from OnIncomingCapturedFrame.
76 // TODO(tommi): Remove this workaround when we've updated the WebRTC capturers
77 // to follow the same contract.
noahric5d9b92b2015-10-24 11:14:46 -070078 void SignalFrameCapturedOnStartThread(const webrtc::VideoFrame& frame);
tommi@webrtc.orge07710c2015-02-19 17:43:25 +000079
kwiberg686a8ef2016-02-26 03:00:35 -080080 std::unique_ptr<WebRtcVcmFactoryInterface> factory_;
Peter Boström09c3a1e2016-03-22 17:17:39 +010081 rtc::scoped_refptr<webrtc::VideoCaptureModule> module_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000082 int captured_frames_;
wu@webrtc.org16d62542013-11-05 23:45:14 +000083 std::vector<uint8_t> capture_buffer_;
tommi@webrtc.orge07710c2015-02-19 17:43:25 +000084 rtc::Thread* start_thread_; // Set in Start(), unset in Stop();
wu@webrtc.orgf6d6ed02014-01-03 22:08:47 +000085
kwiberg686a8ef2016-02-26 03:00:35 -080086 std::unique_ptr<rtc::AsyncInvoker> async_invoker_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000087};
88
henrike@webrtc.org28e20752013-07-10 00:45:36 +000089} // namespace cricket
90
Pera5092412016-02-12 13:30:57 +010091#endif // WEBRTC_MEDIA_WEBRTC_WEBRTCVIDEOCAPTURER_H_