From 7659d914bb201d65d1829ed0f0344adeac2fac49 Mon Sep 17 00:00:00 2001 From: "phoglund@webrtc.org" Date: Fri, 14 Dec 2012 09:57:37 +0000 Subject: [PATCH] Decoupled video rtp receiver from rtp receiver. BUG= Review URL: https://webrtc-codereview.appspot.com/995005 git-svn-id: http://webrtc.googlecode.com/svn/trunk@3292 4adac7df-926f-26a2-2b94-8c16560cd09d --- .../source/mock/mock_rtp_receiver_video.h | 2 +- .../modules/rtp_rtcp/source/rtp_receiver.cc | 25 ++++++--------- webrtc/modules/rtp_rtcp/source/rtp_receiver.h | 11 ++++--- .../rtp_rtcp/source/rtp_receiver_video.cc | 32 +++++++++++-------- .../rtp_rtcp/source/rtp_receiver_video.h | 26 +++------------ 5 files changed, 40 insertions(+), 56 deletions(-) diff --git a/webrtc/modules/rtp_rtcp/source/mock/mock_rtp_receiver_video.h b/webrtc/modules/rtp_rtcp/source/mock/mock_rtp_receiver_video.h index 3e3fce9f5b..498c864901 100644 --- a/webrtc/modules/rtp_rtcp/source/mock/mock_rtp_receiver_video.h +++ b/webrtc/modules/rtp_rtcp/source/mock/mock_rtp_receiver_video.h @@ -17,7 +17,7 @@ namespace webrtc { class MockRTPReceiverVideo : public RTPReceiverVideo { public: - MockRTPReceiverVideo() : RTPReceiverVideo(0, NULL) {} + MockRTPReceiverVideo() : RTPReceiverVideo(0, NULL, NULL) {} MOCK_METHOD1(ChangeUniqueId, void(const WebRtc_Word32 id)); MOCK_METHOD3(ReceiveRecoveredPacketCallback, diff --git a/webrtc/modules/rtp_rtcp/source/rtp_receiver.cc b/webrtc/modules/rtp_rtcp/source/rtp_receiver.cc index d490d140fe..43cbdcf675 100644 --- a/webrtc/modules/rtp_rtcp/source/rtp_receiver.cc +++ b/webrtc/modules/rtp_rtcp/source/rtp_receiver.cc @@ -34,7 +34,6 @@ RTPReceiver::RTPReceiver(const WebRtc_Word32 id, RtpRtcpClock* clock, ModuleRtpRtcpImpl* owner, RtpAudioFeedback* incomingMessagesCallback) : - RTPReceiverVideo(id, owner), Bitrate(clock), _id(id), _audio(audio), @@ -97,6 +96,7 @@ RTPReceiver::RTPReceiver(const WebRtc_Word32 id, _RTX(false), _ssrcRTX(0) { _rtpReceiverAudio = new RTPReceiverAudio(id, this, incomingMessagesCallback); + _rtpReceiverVideo = new RTPReceiverVideo(id, this, owner); memset(_currentRemoteCSRC, 0, sizeof(_currentRemoteCSRC)); memset(_currentRemoteEnergy, 0, sizeof(_currentRemoteEnergy)); @@ -123,6 +123,7 @@ RTPReceiver::~RTPReceiver() { delete it->second; _payloadTypeMap.erase(it); } + delete _rtpReceiverVideo; delete _rtpReceiverAudio; WEBRTC_TRACE(kTraceMemory, kTraceRtpRtcp, _id, "%s deleted", __FUNCTION__); } @@ -398,7 +399,8 @@ WebRtc_Word32 RTPReceiver::RegisterReceivePayload( payload = _rtpReceiverAudio->RegisterReceiveAudioPayload( payloadName, payloadType, frequency, channels, rate); } else { - payload = RegisterReceiveVideoPayload(payloadName, payloadType, rate); + payload = _rtpReceiverVideo->RegisterReceiveVideoPayload( + payloadName, payloadType, rate); } } if (payload == NULL) { @@ -755,20 +757,13 @@ WebRtc_Word32 RTPReceiver::IncomingRTPPacket( WebRtc_Word32 retVal = 0; if(_audio) { - retVal = _rtpReceiverAudio->ParseAudioCodecSpecific(rtp_header, - payload_data, - payload_data_length, - audio_specific, - is_red); + retVal = _rtpReceiverAudio->ParseAudioCodecSpecific( + rtp_header, payload_data, payload_data_length, audio_specific, is_red); } else { - retVal = ParseVideoCodecSpecific(rtp_header, - payload_data, - payload_data_length, - video_specific.videoCodecType, - is_red, - packet, - packet_length, - _clock.GetTimeInMS()); + retVal = _rtpReceiverVideo->ParseVideoCodecSpecific( + rtp_header, payload_data, payload_data_length, + video_specific.videoCodecType, is_red, packet, packet_length, + _clock.GetTimeInMS()); } if(retVal < 0) { return retVal; diff --git a/webrtc/modules/rtp_rtcp/source/rtp_receiver.h b/webrtc/modules/rtp_rtcp/source/rtp_receiver.h index 4ff56d3c98..21c9612cbc 100644 --- a/webrtc/modules/rtp_rtcp/source/rtp_receiver.h +++ b/webrtc/modules/rtp_rtcp/source/rtp_receiver.h @@ -29,7 +29,7 @@ class RtpRtcpFeedback; class ModuleRtpRtcpImpl; class Trace; -class RTPReceiver : public RTPReceiverVideo, public Bitrate +class RTPReceiver : public Bitrate { public: RTPReceiver(const WebRtc_Word32 id, @@ -161,6 +161,10 @@ public: const WebRtc_UWord8* payloadData, const WebRtc_UWord16 payloadSize, const WebRtcRTPHeader* rtpHeader); + + virtual WebRtc_Word8 REDPayloadType() const; + + bool HaveNotReceivedPackets() const; protected: virtual bool RetransmitOfOldPacket(const WebRtc_UWord16 sequenceNumber, @@ -171,10 +175,6 @@ protected: const WebRtc_UWord16 bytes, const bool oldPacket); - virtual WebRtc_Word8 REDPayloadType() const; - - bool HaveNotReceivedPackets() const; - private: // Is RED configured with payload type payloadType bool REDPayloadType(const WebRtc_Word8 payloadType) const; @@ -194,6 +194,7 @@ private: private: RTPReceiverAudio* _rtpReceiverAudio; + RTPReceiverVideo* _rtpReceiverVideo; WebRtc_Word32 _id; const bool _audio; diff --git a/webrtc/modules/rtp_rtcp/source/rtp_receiver_video.cc b/webrtc/modules/rtp_rtcp/source/rtp_receiver_video.cc index ebaef9c940..e5a742535e 100644 --- a/webrtc/modules/rtp_rtcp/source/rtp_receiver_video.cc +++ b/webrtc/modules/rtp_rtcp/source/rtp_receiver_video.cc @@ -16,6 +16,7 @@ #include "critical_section_wrapper.h" #include "receiver_fec.h" +#include "rtp_receiver.h" #include "rtp_rtcp_impl.h" #include "rtp_utility.h" #include "trace.h" @@ -27,8 +28,10 @@ WebRtc_UWord32 BitRateBPS(WebRtc_UWord16 x ) } RTPReceiverVideo::RTPReceiverVideo(const WebRtc_Word32 id, + RTPReceiver* parent, ModuleRtpRtcpImpl* owner) : _id(id), + _parent(parent), _criticalSectionReceiverVideo( CriticalSectionWrapper::CreateCriticalSection()), _currentFecFrameDecoded(false), @@ -114,8 +117,8 @@ WebRtc_Word32 RTPReceiverVideo::ParseVideoCodecSpecific( } // Pass the length of FEC packets so that they can be accounted for in // the bandwidth estimator. - retVal = CallbackOfReceivedPayloadData(NULL, payloadDataLength, - rtpHeader); + retVal = _parent->CallbackOfReceivedPayloadData(NULL, payloadDataLength, + rtpHeader); } } else { // will leave the _criticalSectionReceiverVideo critsect @@ -173,7 +176,8 @@ WebRtc_Word32 RTPReceiverVideo::ReceiveRecoveredPacketCallback( _currentFecFrameDecoded = true; ModuleRTPUtility::Payload* payload = NULL; - if (PayloadTypeToPayload(rtpHeader->header.payloadType, payload) != 0) { + if (_parent->PayloadTypeToPayload( + rtpHeader->header.payloadType, payload) != 0) { _criticalSectionReceiverVideo->Leave(); return -1; } @@ -186,8 +190,8 @@ WebRtc_Word32 RTPReceiverVideo::ReceiveRecoveredPacketCallback( const WebRtc_UWord8 REDForFECHeaderLength = 1; // replace pltype - recoveredPacket[1] &= 0x80; // reset - recoveredPacket[1] += REDPayloadType(); // replace with RED payload type + recoveredPacket[1] &= 0x80; // Reset. + recoveredPacket[1] += _parent->REDPayloadType(); // add RED header recoveredPacket[rtpHeaderLength] = rtpHeader->header.payloadType; @@ -273,7 +277,7 @@ WebRtc_Word32 RTPReceiverVideo::ReceiveVp8Codec( // we have an "empty" VP8 packet, it's ok, could be one way video // Inform the jitter buffer about this packet. rtpHeader->frameType = kFrameEmpty; - if (CallbackOfReceivedPayloadData(NULL, 0, rtpHeader) != 0) { + if (_parent->CallbackOfReceivedPayloadData(NULL, 0, rtpHeader) != 0) { return -1; } return 0; @@ -306,9 +310,9 @@ WebRtc_Word32 RTPReceiverVideo::ReceiveVp8Codec( toHeader->partitionId = fromHeader->partitionID; toHeader->beginningOfPartition = fromHeader->beginningOfPartition; - if(CallbackOfReceivedPayloadData(parsedPacket.info.VP8.data, - parsedPacket.info.VP8.dataLength, - rtpHeader) != 0) { + if(_parent->CallbackOfReceivedPayloadData(parsedPacket.info.VP8.data, + parsedPacket.info.VP8.dataLength, + rtpHeader) != 0) { return -1; } return 0; @@ -322,16 +326,16 @@ WebRtc_Word32 RTPReceiverVideo::ReceiveGenericCodec( rtpHeader->frameType = kVideoFrameKey; bool isFirstPacketInFrame = - (SequenceNumber() + 1) == rtpHeader->header.sequenceNumber && - TimeStamp() != rtpHeader->header.timestamp; + (_parent->SequenceNumber() + 1) == rtpHeader->header.sequenceNumber && + (_parent->TimeStamp() != rtpHeader->header.timestamp); - if (isFirstPacketInFrame || HaveNotReceivedPackets()) { + if (isFirstPacketInFrame || _parent->HaveNotReceivedPackets()) { rtpHeader->type.Video.isFirstPacket = true; } _criticalSectionReceiverVideo->Leave(); - if (CallbackOfReceivedPayloadData(payloadData, payloadDataLength, - rtpHeader) != 0) { + if (_parent->CallbackOfReceivedPayloadData(payloadData, payloadDataLength, + rtpHeader) != 0) { return -1; } return 0; diff --git a/webrtc/modules/rtp_rtcp/source/rtp_receiver_video.h b/webrtc/modules/rtp_rtcp/source/rtp_receiver_video.h index 454ba810ac..3e65d87fca 100644 --- a/webrtc/modules/rtp_rtcp/source/rtp_receiver_video.h +++ b/webrtc/modules/rtp_rtcp/source/rtp_receiver_video.h @@ -20,13 +20,15 @@ #include "scoped_ptr.h" namespace webrtc { -class ReceiverFEC; -class ModuleRtpRtcpImpl; class CriticalSectionWrapper; +class ModuleRtpRtcpImpl; +class ReceiverFEC; +class RTPReceiver; class RTPReceiverVideo { public: RTPReceiverVideo(const WebRtc_Word32 id, + RTPReceiver* parent, ModuleRtpRtcpImpl* owner); virtual ~RTPReceiverVideo(); @@ -54,25 +56,6 @@ class RTPReceiverVideo { void SetPacketOverHead(WebRtc_UWord16 packetOverHead); protected: - virtual WebRtc_Word32 CallbackOfReceivedPayloadData( - const WebRtc_UWord8* payloadData, - const WebRtc_UWord16 payloadSize, - const WebRtcRTPHeader* rtpHeader) = 0; - - virtual WebRtc_UWord32 TimeStamp() const = 0; - virtual WebRtc_UWord16 SequenceNumber() const = 0; - - virtual WebRtc_UWord32 PayloadTypeToPayload( - const WebRtc_UWord8 payloadType, - ModuleRTPUtility::Payload*& payload) const = 0; - - virtual bool RetransmitOfOldPacket( - const WebRtc_UWord16 sequenceNumber, - const WebRtc_UWord32 rtpTimeStamp) const = 0; - - virtual WebRtc_Word8 REDPayloadType() const = 0; - virtual bool HaveNotReceivedPackets() const = 0; - WebRtc_Word32 SetCodecType(const RtpVideoCodecTypes videoType, WebRtcRTPHeader* rtpHeader) const; @@ -95,6 +78,7 @@ class RTPReceiverVideo { private: WebRtc_Word32 _id; + RTPReceiver* _parent; CriticalSectionWrapper* _criticalSectionReceiverVideo;