Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / third_party / webrtc / modules / video_capture / video_capture_impl.h
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/interface/i420_video_frame.h"
19 #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
20 #include "webrtc/modules/video_capture/include/video_capture.h"
21 #include "webrtc/modules/video_capture/video_capture_config.h"
22 #include "webrtc/system_wrappers/interface/tick_util.h"
23
24 namespace webrtc
25 {
26 class CriticalSectionWrapper;
27
28 namespace videocapturemodule {
29 // Class definitions
30 class VideoCaptureImpl: public VideoCaptureModule, public VideoCaptureExternal
31 {
32 public:
33
34     /*
35      *   Create a video capture module object
36      *
37      *   id              - unique identifier of this video capture module object
38      *   deviceUniqueIdUTF8 -  name of the device. Available names can be found by using GetDeviceName
39      */
40     static VideoCaptureModule* Create(const int32_t id,
41                                       const char* deviceUniqueIdUTF8);
42
43     /*
44      *   Create a video capture module object used for external capture.
45      *
46      *   id              - unique identifier of this video capture module object
47      *   externalCapture - [out] interface to call when a new frame is captured.
48      */
49     static VideoCaptureModule* Create(const int32_t id,
50                                       VideoCaptureExternal*& externalCapture);
51
52     static DeviceInfo* CreateDeviceInfo(const int32_t id);
53
54     // Helpers for converting between (integral) degrees and
55     // VideoCaptureRotation values.  Return 0 on success.
56     static int32_t RotationFromDegrees(int degrees,
57                                        VideoCaptureRotation* rotation);
58     static int32_t RotationInDegrees(VideoCaptureRotation rotation,
59                                      int* degrees);
60
61     // Implements Module declared functions.
62     virtual int32_t ChangeUniqueId(const int32_t id);
63
64     //Call backs
65     virtual void RegisterCaptureDataCallback(
66         VideoCaptureDataCallback& dataCallback);
67     virtual void DeRegisterCaptureDataCallback();
68     virtual void RegisterCaptureCallback(VideoCaptureFeedBack& callBack);
69     virtual void DeRegisterCaptureCallback();
70
71     virtual void SetCaptureDelay(int32_t delayMS);
72     virtual int32_t CaptureDelay();
73     virtual int32_t SetCaptureRotation(VideoCaptureRotation rotation);
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 int32_t TimeUntilNextProcess();
82     virtual int32_t Process();
83
84     // Implement VideoCaptureExternal
85     // |capture_time| must be specified in the NTP time format in milliseconds.
86     virtual int32_t IncomingFrame(uint8_t* videoFrame,
87                                   int32_t videoFrameLength,
88                                   const VideoCaptureCapability& frameInfo,
89                                   int64_t captureTime = 0);
90
91     virtual int32_t IncomingI420VideoFrame(I420VideoFrame* video_frame,
92                                            int64_t captureTime = 0);
93
94     // Platform dependent
95     virtual int32_t StartCapture(const VideoCaptureCapability& capability)
96     {
97         _requestedCapability = capability;
98         return -1;
99     }
100     virtual int32_t StopCapture()   { return -1; }
101     virtual bool CaptureStarted() {return false; }
102     virtual int32_t CaptureSettings(VideoCaptureCapability& /*settings*/)
103     { return -1; }
104     VideoCaptureEncodeInterface* GetEncodeInterface(const VideoCodec& /*codec*/)
105     { return NULL; }
106
107 protected:
108     VideoCaptureImpl(const int32_t id);
109     virtual ~VideoCaptureImpl();
110     int32_t DeliverCapturedFrame(I420VideoFrame& captureFrame,
111                                  int64_t capture_time);
112
113     int32_t _id; // Module ID
114     char* _deviceUniqueId; // current Device unique name;
115     CriticalSectionWrapper& _apiCs;
116     int32_t _captureDelay; // Current capture delay. May be changed of platform dependent parts.
117     VideoCaptureCapability _requestedCapability; // Should be set by platform dependent code in StartCapture.
118 private:
119     void UpdateFrameCount();
120     uint32_t CalculateFrameRate(const TickTime& now);
121
122     CriticalSectionWrapper& _callBackCs;
123
124     TickTime _lastProcessTime; // last time the module process function was called.
125     TickTime _lastFrameRateCallbackTime; // last time the frame rate callback function was called.
126     bool _frameRateCallBack; // true if EnableFrameRateCallback
127     bool _noPictureAlarmCallBack; //true if EnableNoPictureAlarm
128     VideoCaptureAlarm _captureAlarm; // current value of the noPictureAlarm
129
130     int32_t _setCaptureDelay; // The currently used capture delay
131     VideoCaptureDataCallback* _dataCallBack;
132     VideoCaptureFeedBack* _captureCallBack;
133
134     TickTime _lastProcessFrameCount;
135     TickTime _incomingFrameTimes[kFrameRateCountHistorySize];// timestamp for local captured frames
136     VideoRotationMode _rotateFrame; //Set if the frame should be rotated by the capture module.
137
138     I420VideoFrame _captureFrame;
139     VideoFrame _capture_encoded_frame;
140
141     // Used to make sure incoming timestamp is increasing for every frame.
142     int64_t last_capture_time_;
143
144     // Delta used for translating between NTP and internal timestamps.
145     const int64_t delta_ntp_internal_ms_;
146 };
147 }  // namespace videocapturemodule
148 }  // namespace webrtc
149 #endif  // WEBRTC_MODULES_VIDEO_CAPTURE_MAIN_SOURCE_VIDEO_CAPTURE_IMPL_H_