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
This commit is contained in:
phoglund@webrtc.org 2012-12-14 09:57:37 +00:00
parent 52d981f60c
commit 7659d914bb
5 changed files with 40 additions and 56 deletions

View File

@ -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,

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;