/* * 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_