blob: cd2785d099599da9c6ddeec8814eb8d4f2be7f04 [file] [log] [blame]
/*
* Copyright (c) 2011 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_RENDER_MAIN_SOURCE_INCOMING_VIDEO_STREAM_H_
#define WEBRTC_MODULES_VIDEO_RENDER_MAIN_SOURCE_INCOMING_VIDEO_STREAM_H_
#include "video_render.h"
#include "map_wrapper.h"
namespace webrtc {
class CriticalSectionWrapper;
class EventWrapper;
class ThreadWrapper;
class VideoRenderCallback;
class VideoRenderFrames;
struct VideoMirroring
{
bool mirrorXAxis;
bool mirrorYAxis;
VideoMirroring() :
mirrorXAxis(false), mirrorYAxis(false)
{
}
};
// Class definitions
class IncomingVideoStream: public VideoRenderCallback
{
public:
/*
* VideoRenderer constructor/destructor
*/
IncomingVideoStream(const WebRtc_Word32 moduleId,
const WebRtc_UWord32 streamId);
~IncomingVideoStream();
WebRtc_Word32 ChangeModuleId(const WebRtc_Word32 id);
// Get callbck to deliver frames to the module
VideoRenderCallback* ModuleCallback();
virtual WebRtc_Word32 RenderFrame(const WebRtc_UWord32 streamId,
VideoFrame& videoFrame);
// Set callback to the platform dependant code
WebRtc_Word32 SetRenderCallback(VideoRenderCallback* renderCallback);
// Callback for file recording, snapshot, ...
WebRtc_Word32 SetExternalCallback(VideoRenderCallback* renderObject);
/*
* Start/Stop
*/
WebRtc_Word32 Start();
WebRtc_Word32 Stop();
// Clear all buffers
WebRtc_Word32 Reset();
/*
* Properties
*/
WebRtc_UWord32 StreamId() const;
WebRtc_UWord32 IncomingRate() const;
/*
*
*/
WebRtc_Word32 GetLastRenderedFrame(VideoFrame& videoFrame) const;
WebRtc_Word32 SetStartImage(const VideoFrame& videoFrame);
WebRtc_Word32 SetTimeoutImage(const VideoFrame& videoFrame,
const WebRtc_UWord32 timeout);
WebRtc_Word32 EnableMirroring(const bool enable,
const bool mirrorXAxis,
const bool mirrorYAxis);
protected:
static bool IncomingVideoStreamThreadFun(void* obj);
bool IncomingVideoStreamProcess();
private:
// Enums
enum
{
KEventStartupTimeMS = 10
};
enum
{
KEventMaxWaitTimeMs = 100
};
enum
{
KFrameRatePeriodMs = 1000
};
WebRtc_Word32 _moduleId;
WebRtc_UWord32 _streamId;
CriticalSectionWrapper& _streamCritsect; // Critsects in allowed to enter order
CriticalSectionWrapper& _threadCritsect;
CriticalSectionWrapper& _bufferCritsect;
ThreadWrapper* _ptrIncomingRenderThread;
EventWrapper& _deliverBufferEvent;
bool _running;
VideoRenderCallback* _ptrExternalCallback;
VideoRenderCallback* _ptrRenderCallback;
VideoRenderFrames& _renderBuffers;
RawVideoType _callbackVideoType;
WebRtc_UWord32 _callbackWidth;
WebRtc_UWord32 _callbackHeight;
WebRtc_UWord32 _incomingRate;
WebRtc_Word64 _lastRateCalculationTimeMs;
WebRtc_UWord16 _numFramesSinceLastCalculation;
VideoFrame _lastRenderedFrame;
VideoFrame _tempFrame;
VideoFrame _startImage;
VideoFrame _timeoutImage;
WebRtc_UWord32 _timeoutTime;
bool _mirrorFramesEnabled;
VideoMirroring _mirroring;
VideoFrame _transformedVideoFrame;
};
} //namespace webrtc
#endif // WEBRTC_MODULES_VIDEO_RENDER_MAIN_SOURCE_INCOMING_VIDEO_STREAM_H_