blob: 1efa4ad66fe5f14b267954f6a40f463e02925f89 [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"
kjellander@webrtc.org5ad12972016-02-12 06:39:40 +010024#include "webrtc/media/engine/webrtcvideoframe.h"
Henrik Kjellander5dda80a2015-11-12 12:46:09 +010025#include "webrtc/modules/video_capture/video_capture.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000026
27namespace cricket {
28
29// Factory to allow injection of a VCM impl into WebRtcVideoCapturer.
30// DeviceInfos do not have a Release() and therefore need an explicit Destroy().
31class WebRtcVcmFactoryInterface {
32 public:
33 virtual ~WebRtcVcmFactoryInterface() {}
Peter Boström09c3a1e2016-03-22 17:17:39 +010034 virtual rtc::scoped_refptr<webrtc::VideoCaptureModule> Create(
35 int id,
36 const char* device) = 0;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000037 virtual webrtc::VideoCaptureModule::DeviceInfo* CreateDeviceInfo(int id) = 0;
38 virtual void DestroyDeviceInfo(
39 webrtc::VideoCaptureModule::DeviceInfo* info) = 0;
40};
41
42// WebRTC-based implementation of VideoCapturer.
43class WebRtcVideoCapturer : public VideoCapturer,
44 public webrtc::VideoCaptureDataCallback {
45 public:
46 WebRtcVideoCapturer();
47 explicit WebRtcVideoCapturer(WebRtcVcmFactoryInterface* factory);
48 virtual ~WebRtcVideoCapturer();
49
50 bool Init(const Device& device);
Peter Boström09c3a1e2016-03-22 17:17:39 +010051 bool Init(const rtc::scoped_refptr<webrtc::VideoCaptureModule>& module);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000052
53 // Override virtual methods of the parent class VideoCapturer.
Pera5092412016-02-12 13:30:57 +010054 bool GetBestCaptureFormat(const VideoFormat& desired,
55 VideoFormat* best_format) override;
56 CaptureState Start(const VideoFormat& capture_format) override;
57 void Stop() override;
58 bool IsRunning() override;
59 bool IsScreencast() const override { return false; }
henrike@webrtc.org28e20752013-07-10 00:45:36 +000060
61 protected:
Pera5092412016-02-12 13:30:57 +010062 void OnSinkWantsChanged(const rtc::VideoSinkWants& wants) override;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000063 // Override virtual methods of the parent class VideoCapturer.
nisseef8b61e2016-04-29 06:09:15 -070064 bool GetPreferredFourccs(std::vector<uint32_t>* fourccs) override;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000065
66 private:
67 // Callback when a frame is captured by camera.
nisseef8b61e2016-04-29 06:09:15 -070068 void OnIncomingCapturedFrame(const int32_t id,
69 const webrtc::VideoFrame& frame) override;
70 void OnCaptureDelayChanged(const int32_t id,
71 const int32_t delay) override;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000072
tommi@webrtc.orge07710c2015-02-19 17:43:25 +000073 // Used to signal captured frames on the same thread as invoked Start().
74 // With WebRTC's current VideoCapturer implementations, this will mean a
75 // thread hop, but in other implementations (e.g. Chrome) it will be called
76 // directly from OnIncomingCapturedFrame.
77 // TODO(tommi): Remove this workaround when we've updated the WebRTC capturers
78 // to follow the same contract.
noahric5d9b92b2015-10-24 11:14:46 -070079 void SignalFrameCapturedOnStartThread(const webrtc::VideoFrame& frame);
tommi@webrtc.orge07710c2015-02-19 17:43:25 +000080
kwiberg686a8ef2016-02-26 03:00:35 -080081 std::unique_ptr<WebRtcVcmFactoryInterface> factory_;
Peter Boström09c3a1e2016-03-22 17:17:39 +010082 rtc::scoped_refptr<webrtc::VideoCaptureModule> module_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000083 int captured_frames_;
wu@webrtc.org16d62542013-11-05 23:45:14 +000084 std::vector<uint8_t> capture_buffer_;
tommi@webrtc.orge07710c2015-02-19 17:43:25 +000085 rtc::Thread* start_thread_; // Set in Start(), unset in Stop();
wu@webrtc.orgf6d6ed02014-01-03 22:08:47 +000086
kwiberg686a8ef2016-02-26 03:00:35 -080087 std::unique_ptr<rtc::AsyncInvoker> async_invoker_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000088};
89
90struct WebRtcCapturedFrame : public CapturedFrame {
91 public:
Miguel Casas-Sanchez47650702015-05-29 17:21:40 -070092 WebRtcCapturedFrame(const webrtc::VideoFrame& frame,
93 void* buffer,
94 size_t length);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000095};
96
97} // namespace cricket
98
Pera5092412016-02-12 13:30:57 +010099#endif // WEBRTC_MEDIA_WEBRTC_WEBRTCVIDEOCAPTURER_H_