1 /*
2  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3  *
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 
18 #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
19 #include "webrtc/common_video/rotation.h"
20 #include "webrtc/modules/video_capture/video_capture.h"
21 #include "webrtc/modules/video_capture/video_capture_config.h"
22 #include "webrtc/system_wrappers/include/tick_util.h"
23 #include "webrtc/video_frame.h"
24 
25 namespace webrtc
26 {
27 class CriticalSectionWrapper;
28 
29 namespace videocapturemodule {
30 // Class definitions
31 class VideoCaptureImpl: public VideoCaptureModule, public VideoCaptureExternal
32 {
33 public:
34 
35     /*
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      */
41     static VideoCaptureModule* Create(const int32_t id,
42                                       const char* deviceUniqueIdUTF8);
43 
44     /*
45      *   Create a video capture module object used for external capture.
46      *
47      *   id              - unique identifier of this video capture module object
48      *   externalCapture - [out] interface to call when a new frame is captured.
49      */
50     static VideoCaptureModule* Create(const int32_t id,
51                                       VideoCaptureExternal*& externalCapture);
52 
53     static DeviceInfo* CreateDeviceInfo(const int32_t id);
54 
55     // Helpers for converting between (integral) degrees and
56     // VideoRotation values.  Return 0 on success.
57     static int32_t RotationFromDegrees(int degrees, VideoRotation* rotation);
58     static int32_t RotationInDegrees(VideoRotation rotation, int* degrees);
59 
60     //Call backs
61     virtual void RegisterCaptureDataCallback(
62         VideoCaptureDataCallback& dataCallback);
63     virtual void DeRegisterCaptureDataCallback();
64     virtual void RegisterCaptureCallback(VideoCaptureFeedBack& callBack);
65     virtual void DeRegisterCaptureCallback();
66 
67     virtual void SetCaptureDelay(int32_t delayMS);
68     virtual int32_t CaptureDelay();
69     virtual int32_t SetCaptureRotation(VideoRotation rotation);
70     virtual bool SetApplyRotation(bool enable);
GetApplyRotation()71     virtual bool GetApplyRotation() {
72       return apply_rotation_;
73     }
74 
75     virtual void EnableFrameRateCallback(const bool enable);
76     virtual void EnableNoPictureAlarm(const bool enable);
77 
78     virtual const char* CurrentDeviceName() const;
79 
80     // Module handling
81     virtual int64_t TimeUntilNextProcess();
82     virtual int32_t Process();
83 
84     // Implement VideoCaptureExternal
85     // |capture_time| must be specified in NTP time format in milliseconds.
86     virtual int32_t IncomingFrame(uint8_t* videoFrame,
87                                   size_t videoFrameLength,
88                                   const VideoCaptureCapability& frameInfo,
89                                   int64_t captureTime = 0);
90 
91     // Platform dependent
StartCapture(const VideoCaptureCapability & capability)92     virtual int32_t StartCapture(const VideoCaptureCapability& capability)
93     {
94         _requestedCapability = capability;
95         return -1;
96     }
StopCapture()97     virtual int32_t StopCapture()   { return -1; }
CaptureStarted()98     virtual bool CaptureStarted() {return false; }
CaptureSettings(VideoCaptureCapability &)99     virtual int32_t CaptureSettings(VideoCaptureCapability& /*settings*/)
100     { return -1; }
GetEncodeInterface(const VideoCodec &)101     VideoCaptureEncodeInterface* GetEncodeInterface(const VideoCodec& /*codec*/)
102     { return NULL; }
103 
104 protected:
105     VideoCaptureImpl(const int32_t id);
106     virtual ~VideoCaptureImpl();
107     int32_t DeliverCapturedFrame(VideoFrame& captureFrame);
108 
109     int32_t _id; // Module ID
110     char* _deviceUniqueId; // current Device unique name;
111     CriticalSectionWrapper& _apiCs;
112     int32_t _captureDelay; // Current capture delay. May be changed of platform dependent parts.
113     VideoCaptureCapability _requestedCapability; // Should be set by platform dependent code in StartCapture.
114 private:
115     void UpdateFrameCount();
116     uint32_t CalculateFrameRate(const TickTime& now);
117 
118     CriticalSectionWrapper& _callBackCs;
119 
120     TickTime _lastProcessTime; // last time the module process function was called.
121     TickTime _lastFrameRateCallbackTime; // last time the frame rate callback function was called.
122     bool _frameRateCallBack; // true if EnableFrameRateCallback
123     bool _noPictureAlarmCallBack; //true if EnableNoPictureAlarm
124     VideoCaptureAlarm _captureAlarm; // current value of the noPictureAlarm
125 
126     int32_t _setCaptureDelay; // The currently used capture delay
127     VideoCaptureDataCallback* _dataCallBack;
128     VideoCaptureFeedBack* _captureCallBack;
129 
130     TickTime _lastProcessFrameCount;
131     TickTime _incomingFrameTimes[kFrameRateCountHistorySize];// timestamp for local captured frames
132     VideoRotation _rotateFrame;  // Set if the frame should be rotated by the
133                                  // capture module.
134 
135     VideoFrame _captureFrame;
136 
137     // Indicate whether rotation should be applied before delivered externally.
138     bool apply_rotation_;
139 };
140 }  // namespace videocapturemodule
141 }  // namespace webrtc
142 #endif  // WEBRTC_MODULES_VIDEO_CAPTURE_MAIN_SOURCE_VIDEO_CAPTURE_IMPL_H_
143