/* * 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_CODING_RECEIVER_H_ #define WEBRTC_MODULES_VIDEO_CODING_RECEIVER_H_ #include "critical_section_wrapper.h" #include "jitter_buffer.h" #include "timing.h" #include "packet.h" namespace webrtc { class VCMEncodedFrame; enum VCMNackStatus { kNackOk, kNackNeedMoreMemory, kNackKeyFrameRequest }; enum VCMNackMode { kNackInfinite, kNoNack }; enum VCMReceiverState { kReceiving, kPassive, kWaitForPrimaryDecode }; class VCMReceiver { public: VCMReceiver(VCMTiming& timing, WebRtc_Word32 vcmId = -1, WebRtc_Word32 receiverId = -1, bool master = true); ~VCMReceiver(); WebRtc_Word32 Initialize(); void UpdateRtt(WebRtc_UWord32 rtt); WebRtc_Word32 InsertPacket(const VCMPacket& packet, WebRtc_UWord16 frameWidth, WebRtc_UWord16 frameHeight); VCMEncodedFrame* FrameForDecoding(WebRtc_UWord16 maxWaitTimeMs, WebRtc_Word64& nextRenderTimeMs, bool renderTiming = true, VCMReceiver* dualReceiver = NULL); void ReleaseFrame(VCMEncodedFrame* frame); WebRtc_Word32 ReceiveStatistics(WebRtc_UWord32& bitRate, WebRtc_UWord32& frameRate); WebRtc_Word32 ReceivedFrameCount(VCMFrameCount& frameCount) const; // NACK void SetNackMode(VCMNackMode nackMode); VCMNackMode NackMode() const; VCMNackStatus NackList(WebRtc_UWord16* nackList, WebRtc_UWord16& size); // Dual decoder bool DualDecoderCaughtUp(VCMEncodedFrame* dualFrame, VCMReceiver& dualReceiver) const; VCMReceiverState State() const; private: VCMEncodedFrame* FrameForDecoding(WebRtc_UWord16 maxWaitTimeMs, WebRtc_Word64 nextrenderTimeMs, VCMReceiver* dualReceiver); VCMEncodedFrame* FrameForRendering(WebRtc_UWord16 maxWaitTimeMs, WebRtc_Word64 nextrenderTimeMs, VCMReceiver* dualReceiver); void CopyJitterBufferStateFromReceiver(const VCMReceiver& receiver); void UpdateState(VCMReceiverState newState); void UpdateState(VCMEncodedFrame& frame); static WebRtc_Word32 GenerateReceiverId(); CriticalSectionWrapper& _critSect; WebRtc_Word32 _vcmId; WebRtc_Word32 _receiverId; bool _master; VCMJitterBuffer _jitterBuffer; VCMTiming& _timing; VCMEvent& _renderWaitEvent; VCMNackMode _nackMode; VCMReceiverState _state; static WebRtc_Word32 _receiverIdCounter; }; } // namespace webrtc #endif // WEBRTC_MODULES_VIDEO_CODING_RECEIVER_H_