This fixes a variety of MSVC warnings about value truncations when implicitly storing the 64-bit values we get back from e.g. TimeTicks in 32-bit objects, and removes the need for a number of explicit casts. This also moves a number of constants so they're declared right where they're used, which is easier to read and maintain, and makes some of them of integral type rather than using the "enum hack". BUG=chromium:81439 TEST=none R=tommi@webrtc.org Review URL: https://webrtc-codereview.appspot.com/33649004 git-svn-id: http://webrtc.googlecode.com/svn/trunk@7905 4adac7df-926f-26a2-2b94-8c16560cd09d
150 lines
5.8 KiB
C++
150 lines
5.8 KiB
C++
/*
|
|
* 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/interface/i420_video_frame.h"
|
|
#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
|
|
#include "webrtc/modules/video_capture/include/video_capture.h"
|
|
#include "webrtc/modules/video_capture/video_capture_config.h"
|
|
#include "webrtc/system_wrappers/interface/tick_util.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
|
|
// VideoCaptureRotation values. Return 0 on success.
|
|
static int32_t RotationFromDegrees(int degrees,
|
|
VideoCaptureRotation* rotation);
|
|
static int32_t RotationInDegrees(VideoCaptureRotation rotation,
|
|
int* degrees);
|
|
|
|
// Implements Module declared functions.
|
|
virtual int32_t ChangeUniqueId(const int32_t id);
|
|
|
|
//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(VideoCaptureRotation 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 the NTP time format in milliseconds.
|
|
virtual int32_t IncomingFrame(uint8_t* videoFrame,
|
|
size_t videoFrameLength,
|
|
const VideoCaptureCapability& frameInfo,
|
|
int64_t captureTime = 0);
|
|
|
|
virtual int32_t IncomingI420VideoFrame(I420VideoFrame* video_frame,
|
|
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(I420VideoFrame& captureFrame,
|
|
int64_t capture_time);
|
|
|
|
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
|
|
VideoRotationMode _rotateFrame; //Set if the frame should be rotated by the capture module.
|
|
|
|
I420VideoFrame _captureFrame;
|
|
VideoFrame _capture_encoded_frame;
|
|
|
|
// Used to make sure incoming timestamp is increasing for every frame.
|
|
int64_t last_capture_time_;
|
|
|
|
// Delta used for translating between NTP and internal timestamps.
|
|
const int64_t delta_ntp_internal_ms_;
|
|
};
|
|
} // namespace videocapturemodule
|
|
} // namespace webrtc
|
|
#endif // WEBRTC_MODULES_VIDEO_CAPTURE_MAIN_SOURCE_VIDEO_CAPTURE_IMPL_H_
|