blob: 7d785c3a908cdb9213a1e76204e39fac145ab13f [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
leozwang@webrtc.org1745e932012-03-01 16:30:40 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
4 * 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.
9 */
10
11#ifndef WEBRTC_MODULES_VIDEO_CAPTURE_MAIN_SOURCE_VIDEO_CAPTURE_IMPL_H_
12#define WEBRTC_MODULES_VIDEO_CAPTURE_MAIN_SOURCE_VIDEO_CAPTURE_IMPL_H_
13
14/*
15 * video_capture_impl.h
16 */
17
Peter Boström1d194412016-03-21 16:44:31 +010018#include "webrtc/base/scoped_ref_ptr.h"
pbos@webrtc.orga9b74ad2013-07-12 10:03:52 +000019#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
guoweis@webrtc.org59140d62015-03-09 17:07:31 +000020#include "webrtc/common_video/rotation.h"
Henrik Kjellander5dda80a2015-11-12 12:46:09 +010021#include "webrtc/modules/video_capture/video_capture.h"
pbos@webrtc.orga9b74ad2013-07-12 10:03:52 +000022#include "webrtc/modules/video_capture/video_capture_config.h"
Thiago Farina9bfe3da2015-04-10 12:52:13 +020023#include "webrtc/video_frame.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000024
25namespace webrtc
26{
27class CriticalSectionWrapper;
28
perkj@webrtc.org0cc68dc2011-09-12 08:53:36 +000029namespace videocapturemodule {
niklase@google.com470e71d2011-07-07 08:21:25 +000030// Class definitions
31class VideoCaptureImpl: public VideoCaptureModule, public VideoCaptureExternal
32{
33public:
34
perkj@webrtc.org0cc68dc2011-09-12 08:53:36 +000035 /*
36 * Create a video capture module object
37 *
38 * id - unique identifier of this video capture module object
39 * deviceUniqueIdUTF8 - name of the device. Available names can be found by using GetDeviceName
40 */
Peter Boström1d194412016-03-21 16:44:31 +010041 static rtc::scoped_refptr<VideoCaptureModule> Create(
42 const int32_t id,
43 const char* deviceUniqueIdUTF8);
niklase@google.com470e71d2011-07-07 08:21:25 +000044
perkj@webrtc.org0cc68dc2011-09-12 08:53:36 +000045 /*
46 * Create a video capture module object used for external capture.
47 *
48 * id - unique identifier of this video capture module object
49 * externalCapture - [out] interface to call when a new frame is captured.
50 */
Peter Boström1d194412016-03-21 16:44:31 +010051 static rtc::scoped_refptr<VideoCaptureModule> Create(
52 const int32_t id,
53 VideoCaptureExternal*& externalCapture);
niklase@google.com470e71d2011-07-07 08:21:25 +000054
pbos@webrtc.orgdfc5bb92013-04-10 08:23:13 +000055 static DeviceInfo* CreateDeviceInfo(const int32_t id);
perkj@webrtc.org0cc68dc2011-09-12 08:53:36 +000056
fischman@webrtc.org4e65e072013-10-03 18:23:13 +000057 // Helpers for converting between (integral) degrees and
guoweis@webrtc.org5a7dc392015-02-13 14:31:26 +000058 // VideoRotation values. Return 0 on success.
59 static int32_t RotationFromDegrees(int degrees, VideoRotation* rotation);
60 static int32_t RotationInDegrees(VideoRotation rotation, int* degrees);
fischman@webrtc.org4e65e072013-10-03 18:23:13 +000061
niklase@google.com470e71d2011-07-07 08:21:25 +000062 //Call backs
mallinath@webrtc.org7433a082014-01-29 00:56:02 +000063 virtual void RegisterCaptureDataCallback(
64 VideoCaptureDataCallback& dataCallback);
65 virtual void DeRegisterCaptureDataCallback();
66 virtual void RegisterCaptureCallback(VideoCaptureFeedBack& callBack);
67 virtual void DeRegisterCaptureCallback();
niklase@google.com470e71d2011-07-07 08:21:25 +000068
mallinath@webrtc.org7433a082014-01-29 00:56:02 +000069 virtual void SetCaptureDelay(int32_t delayMS);
pbos@webrtc.orgdfc5bb92013-04-10 08:23:13 +000070 virtual int32_t CaptureDelay();
guoweis@webrtc.org5a7dc392015-02-13 14:31:26 +000071 virtual int32_t SetCaptureRotation(VideoRotation rotation);
guoweis@webrtc.org1226e922015-02-11 18:37:54 +000072 virtual bool SetApplyRotation(bool enable);
73 virtual bool GetApplyRotation() {
74 return apply_rotation_;
75 }
niklase@google.com470e71d2011-07-07 08:21:25 +000076
mallinath@webrtc.org7433a082014-01-29 00:56:02 +000077 virtual void EnableFrameRateCallback(const bool enable);
78 virtual void EnableNoPictureAlarm(const bool enable);
niklase@google.com470e71d2011-07-07 08:21:25 +000079
leozwang@webrtc.org1745e932012-03-01 16:30:40 +000080 virtual const char* CurrentDeviceName() const;
niklase@google.com470e71d2011-07-07 08:21:25 +000081
82 // Module handling
pkasting@chromium.org0b1534c2014-12-15 22:09:40 +000083 virtual int64_t TimeUntilNextProcess();
pbosa26ac922016-02-25 04:50:01 -080084 virtual void Process();
niklase@google.com470e71d2011-07-07 08:21:25 +000085
86 // Implement VideoCaptureExternal
perkj@webrtc.orgaf612d52015-03-18 09:51:05 +000087 // |capture_time| must be specified in NTP time format in milliseconds.
pbos@webrtc.orgdfc5bb92013-04-10 08:23:13 +000088 virtual int32_t IncomingFrame(uint8_t* videoFrame,
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000089 size_t videoFrameLength,
pbos@webrtc.orgdfc5bb92013-04-10 08:23:13 +000090 const VideoCaptureCapability& frameInfo,
91 int64_t captureTime = 0);
pbos@webrtc.org2ffb1492013-11-22 13:10:13 +000092
niklase@google.com470e71d2011-07-07 08:21:25 +000093 // Platform dependent
pbos@webrtc.orgdfc5bb92013-04-10 08:23:13 +000094 virtual int32_t StartCapture(const VideoCaptureCapability& capability)
niklase@google.com470e71d2011-07-07 08:21:25 +000095 {
96 _requestedCapability = capability;
97 return -1;
98 }
pbos@webrtc.orgdfc5bb92013-04-10 08:23:13 +000099 virtual int32_t StopCapture() { return -1; }
niklase@google.com470e71d2011-07-07 08:21:25 +0000100 virtual bool CaptureStarted() {return false; }
pbos@webrtc.orgdfc5bb92013-04-10 08:23:13 +0000101 virtual int32_t CaptureSettings(VideoCaptureCapability& /*settings*/)
niklase@google.com470e71d2011-07-07 08:21:25 +0000102 { return -1; }
103 VideoCaptureEncodeInterface* GetEncodeInterface(const VideoCodec& /*codec*/)
104 { return NULL; }
105
106protected:
pbos@webrtc.orgdfc5bb92013-04-10 08:23:13 +0000107 VideoCaptureImpl(const int32_t id);
perkj@webrtc.org0cc68dc2011-09-12 08:53:36 +0000108 virtual ~VideoCaptureImpl();
Miguel Casas-Sanchez47650702015-05-29 17:21:40 -0700109 int32_t DeliverCapturedFrame(VideoFrame& captureFrame);
perkj@webrtc.org0cc68dc2011-09-12 08:53:36 +0000110
pbos@webrtc.orgdfc5bb92013-04-10 08:23:13 +0000111 int32_t _id; // Module ID
leozwang@webrtc.org1745e932012-03-01 16:30:40 +0000112 char* _deviceUniqueId; // current Device unique name;
niklase@google.com470e71d2011-07-07 08:21:25 +0000113 CriticalSectionWrapper& _apiCs;
pbos@webrtc.orgdfc5bb92013-04-10 08:23:13 +0000114 int32_t _captureDelay; // Current capture delay. May be changed of platform dependent parts.
niklase@google.com470e71d2011-07-07 08:21:25 +0000115 VideoCaptureCapability _requestedCapability; // Should be set by platform dependent code in StartCapture.
116private:
117 void UpdateFrameCount();
Niels Möllerd28db7f2016-05-10 16:31:47 +0200118 uint32_t CalculateFrameRate(int64_t now_ns);
niklase@google.com470e71d2011-07-07 08:21:25 +0000119
120 CriticalSectionWrapper& _callBackCs;
121
Niels Möllerd28db7f2016-05-10 16:31:47 +0200122 // last time the module process function was called.
123 int64_t _lastProcessTimeNanos;
124 // last time the frame rate callback function was called.
125 int64_t _lastFrameRateCallbackTimeNanos;
niklase@google.com470e71d2011-07-07 08:21:25 +0000126 bool _frameRateCallBack; // true if EnableFrameRateCallback
127 bool _noPictureAlarmCallBack; //true if EnableNoPictureAlarm
128 VideoCaptureAlarm _captureAlarm; // current value of the noPictureAlarm
129
pbos@webrtc.orgdfc5bb92013-04-10 08:23:13 +0000130 int32_t _setCaptureDelay; // The currently used capture delay
niklase@google.com470e71d2011-07-07 08:21:25 +0000131 VideoCaptureDataCallback* _dataCallBack;
132 VideoCaptureFeedBack* _captureCallBack;
133
Niels Möllerd28db7f2016-05-10 16:31:47 +0200134 int64_t _lastProcessFrameTimeNanos;
135 // timestamp for local captured frames
136 int64_t _incomingFrameTimesNanos[kFrameRateCountHistorySize];
guoweis@webrtc.org59140d62015-03-09 17:07:31 +0000137 VideoRotation _rotateFrame; // Set if the frame should be rotated by the
138 // capture module.
niklase@google.com470e71d2011-07-07 08:21:25 +0000139
Miguel Casas-Sanchez47650702015-05-29 17:21:40 -0700140 VideoFrame _captureFrame;
mflodman@webrtc.org29d75b32011-11-01 17:10:49 +0000141
guoweis@webrtc.org1226e922015-02-11 18:37:54 +0000142 // Indicate whether rotation should be applied before delivered externally.
143 bool apply_rotation_;
niklase@google.com470e71d2011-07-07 08:21:25 +0000144};
pbos@webrtc.orgd900e8b2013-07-03 15:12:26 +0000145} // namespace videocapturemodule
146} // namespace webrtc
niklase@google.com470e71d2011-07-07 08:21:25 +0000147#endif // WEBRTC_MODULES_VIDEO_CAPTURE_MAIN_SOURCE_VIDEO_CAPTURE_IMPL_H_