aboutsummaryrefslogtreecommitdiff
path: root/webrtc/modules/video_capture/video_capture_impl.h
diff options
context:
space:
mode:
Diffstat (limited to 'webrtc/modules/video_capture/video_capture_impl.h')
-rw-r--r--webrtc/modules/video_capture/video_capture_impl.h142
1 files changed, 142 insertions, 0 deletions
diff --git a/webrtc/modules/video_capture/video_capture_impl.h b/webrtc/modules/video_capture/video_capture_impl.h
new file mode 100644
index 0000000000..deb989c251
--- /dev/null
+++ b/webrtc/modules/video_capture/video_capture_impl.h
@@ -0,0 +1,142 @@
+/*
+ * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+#ifndef WEBRTC_MODULES_VIDEO_CAPTURE_MAIN_SOURCE_VIDEO_CAPTURE_IMPL_H_
+#define WEBRTC_MODULES_VIDEO_CAPTURE_MAIN_SOURCE_VIDEO_CAPTURE_IMPL_H_
+
+/*
+ * video_capture_impl.h
+ */
+
+#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
+#include "webrtc/common_video/rotation.h"
+#include "webrtc/modules/video_capture/include/video_capture.h"
+#include "webrtc/modules/video_capture/video_capture_config.h"
+#include "webrtc/system_wrappers/include/tick_util.h"
+#include "webrtc/video_frame.h"
+
+namespace webrtc
+{
+class CriticalSectionWrapper;
+
+namespace videocapturemodule {
+// Class definitions
+class VideoCaptureImpl: public VideoCaptureModule, public VideoCaptureExternal
+{
+public:
+
+ /*
+ * Create a video capture module object
+ *
+ * id - unique identifier of this video capture module object
+ * deviceUniqueIdUTF8 - name of the device. Available names can be found by using GetDeviceName
+ */
+ static VideoCaptureModule* Create(const int32_t id,
+ const char* deviceUniqueIdUTF8);
+
+ /*
+ * Create a video capture module object used for external capture.
+ *
+ * id - unique identifier of this video capture module object
+ * externalCapture - [out] interface to call when a new frame is captured.
+ */
+ static VideoCaptureModule* Create(const int32_t id,
+ VideoCaptureExternal*& externalCapture);
+
+ static DeviceInfo* CreateDeviceInfo(const int32_t id);
+
+ // Helpers for converting between (integral) degrees and
+ // VideoRotation values. Return 0 on success.
+ static int32_t RotationFromDegrees(int degrees, VideoRotation* rotation);
+ static int32_t RotationInDegrees(VideoRotation rotation, int* degrees);
+
+ //Call backs
+ virtual void RegisterCaptureDataCallback(
+ VideoCaptureDataCallback& dataCallback);
+ virtual void DeRegisterCaptureDataCallback();
+ virtual void RegisterCaptureCallback(VideoCaptureFeedBack& callBack);
+ virtual void DeRegisterCaptureCallback();
+
+ virtual void SetCaptureDelay(int32_t delayMS);
+ virtual int32_t CaptureDelay();
+ virtual int32_t SetCaptureRotation(VideoRotation rotation);
+ virtual bool SetApplyRotation(bool enable);
+ virtual bool GetApplyRotation() {
+ return apply_rotation_;
+ }
+
+ virtual void EnableFrameRateCallback(const bool enable);
+ virtual void EnableNoPictureAlarm(const bool enable);
+
+ virtual const char* CurrentDeviceName() const;
+
+ // Module handling
+ virtual int64_t TimeUntilNextProcess();
+ virtual int32_t Process();
+
+ // Implement VideoCaptureExternal
+ // |capture_time| must be specified in NTP time format in milliseconds.
+ virtual int32_t IncomingFrame(uint8_t* videoFrame,
+ size_t videoFrameLength,
+ const VideoCaptureCapability& frameInfo,
+ int64_t captureTime = 0);
+
+ // Platform dependent
+ virtual int32_t StartCapture(const VideoCaptureCapability& capability)
+ {
+ _requestedCapability = capability;
+ return -1;
+ }
+ virtual int32_t StopCapture() { return -1; }
+ virtual bool CaptureStarted() {return false; }
+ virtual int32_t CaptureSettings(VideoCaptureCapability& /*settings*/)
+ { return -1; }
+ VideoCaptureEncodeInterface* GetEncodeInterface(const VideoCodec& /*codec*/)
+ { return NULL; }
+
+protected:
+ VideoCaptureImpl(const int32_t id);
+ virtual ~VideoCaptureImpl();
+ int32_t DeliverCapturedFrame(VideoFrame& captureFrame);
+
+ int32_t _id; // Module ID
+ char* _deviceUniqueId; // current Device unique name;
+ CriticalSectionWrapper& _apiCs;
+ int32_t _captureDelay; // Current capture delay. May be changed of platform dependent parts.
+ VideoCaptureCapability _requestedCapability; // Should be set by platform dependent code in StartCapture.
+private:
+ void UpdateFrameCount();
+ uint32_t CalculateFrameRate(const TickTime& now);
+
+ CriticalSectionWrapper& _callBackCs;
+
+ TickTime _lastProcessTime; // last time the module process function was called.
+ TickTime _lastFrameRateCallbackTime; // last time the frame rate callback function was called.
+ bool _frameRateCallBack; // true if EnableFrameRateCallback
+ bool _noPictureAlarmCallBack; //true if EnableNoPictureAlarm
+ VideoCaptureAlarm _captureAlarm; // current value of the noPictureAlarm
+
+ int32_t _setCaptureDelay; // The currently used capture delay
+ VideoCaptureDataCallback* _dataCallBack;
+ VideoCaptureFeedBack* _captureCallBack;
+
+ TickTime _lastProcessFrameCount;
+ TickTime _incomingFrameTimes[kFrameRateCountHistorySize];// timestamp for local captured frames
+ VideoRotation _rotateFrame; // Set if the frame should be rotated by the
+ // capture module.
+
+ VideoFrame _captureFrame;
+
+ // Indicate whether rotation should be applied before delivered externally.
+ bool apply_rotation_;
+};
+} // namespace videocapturemodule
+} // namespace webrtc
+#endif // WEBRTC_MODULES_VIDEO_CAPTURE_MAIN_SOURCE_VIDEO_CAPTURE_IMPL_H_