Update talk to 50918584.
Together with Stefan's http://review.webrtc.org/1960004/. R=mallinath@webrtc.org Review URL: https://webrtc-codereview.appspot.com/2048004 git-svn-id: http://webrtc.googlecode.com/svn/trunk@4556 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
@ -121,8 +121,8 @@ class VCMSendStatisticsCallback {
|
||||
// Callback class used for informing the user of the incoming bit rate and frame rate.
|
||||
class VCMReceiveStatisticsCallback {
|
||||
public:
|
||||
virtual int32_t ReceiveStatistics(const uint32_t bitRate,
|
||||
const uint32_t frameRate) = 0;
|
||||
virtual int32_t OnReceiveStatisticsUpdate(const uint32_t bitRate,
|
||||
const uint32_t frameRate) = 0;
|
||||
|
||||
protected:
|
||||
virtual ~VCMReceiveStatisticsCallback() {
|
||||
|
@ -36,7 +36,7 @@ TEST(TestDecodingState, FrameContinuity) {
|
||||
packet->timestamp = 1;
|
||||
packet->seqNum = 0xffff;
|
||||
packet->frameType = kVideoFrameDelta;
|
||||
packet->codecSpecificHeader.codec = kRTPVideoVP8;
|
||||
packet->codecSpecificHeader.codec = kRtpVideoVp8;
|
||||
packet->codecSpecificHeader.codecHeader.VP8.pictureId = 0x007F;
|
||||
FrameData frame_data;
|
||||
frame_data.rtt_ms = 0;
|
||||
@ -213,7 +213,7 @@ TEST(TestDecodingState, MultiLayerBehavior) {
|
||||
VCMFrameBuffer frame;
|
||||
VCMPacket* packet = new VCMPacket();
|
||||
packet->frameType = kVideoFrameDelta;
|
||||
packet->codecSpecificHeader.codec = kRTPVideoVP8;
|
||||
packet->codecSpecificHeader.codec = kRtpVideoVp8;
|
||||
packet->timestamp = 0;
|
||||
packet->seqNum = 0;
|
||||
packet->codecSpecificHeader.codecHeader.VP8.tl0PicIdx = 0;
|
||||
@ -369,7 +369,7 @@ TEST(TestDecodingState, DiscontinuousPicIdContinuousSeqNum) {
|
||||
VCMPacket packet;
|
||||
frame.Reset();
|
||||
packet.frameType = kVideoFrameKey;
|
||||
packet.codecSpecificHeader.codec = kRTPVideoVP8;
|
||||
packet.codecSpecificHeader.codec = kRtpVideoVp8;
|
||||
packet.timestamp = 0;
|
||||
packet.seqNum = 0;
|
||||
packet.codecSpecificHeader.codecHeader.VP8.tl0PicIdx = 0;
|
||||
|
@ -104,7 +104,7 @@ void VCMEncodedFrame::CopyCodecSpecific(const RTPVideoHeader* header)
|
||||
{
|
||||
switch (header->codec)
|
||||
{
|
||||
case kRTPVideoVP8:
|
||||
case kRtpVideoVp8:
|
||||
{
|
||||
if (_codecSpecificInfo.codecType != kVideoCodecVP8)
|
||||
{
|
||||
|
@ -94,7 +94,7 @@ void VCMPacket::CopyCodecSpecifics(const RTPVideoHeader& videoHeader)
|
||||
{
|
||||
switch(videoHeader.codec)
|
||||
{
|
||||
case kRTPVideoVP8:
|
||||
case kRtpVideoVp8:
|
||||
{
|
||||
// Handle all packets within a frame as depending on the previous packet
|
||||
// TODO(holmer): This should be changed to make fragments independent
|
||||
@ -111,7 +111,7 @@ void VCMPacket::CopyCodecSpecifics(const RTPVideoHeader& videoHeader)
|
||||
codec = kVideoCodecVP8;
|
||||
break;
|
||||
}
|
||||
case kRTPVideoI420:
|
||||
case kRtpVideoI420:
|
||||
{
|
||||
codec = kVideoCodecI420;
|
||||
break;
|
||||
|
@ -58,35 +58,35 @@ int VCMSessionInfo::HighSequenceNumber() const {
|
||||
|
||||
int VCMSessionInfo::PictureId() const {
|
||||
if (packets_.empty() ||
|
||||
packets_.front().codecSpecificHeader.codec != kRTPVideoVP8)
|
||||
packets_.front().codecSpecificHeader.codec != kRtpVideoVp8)
|
||||
return kNoPictureId;
|
||||
return packets_.front().codecSpecificHeader.codecHeader.VP8.pictureId;
|
||||
}
|
||||
|
||||
int VCMSessionInfo::TemporalId() const {
|
||||
if (packets_.empty() ||
|
||||
packets_.front().codecSpecificHeader.codec != kRTPVideoVP8)
|
||||
packets_.front().codecSpecificHeader.codec != kRtpVideoVp8)
|
||||
return kNoTemporalIdx;
|
||||
return packets_.front().codecSpecificHeader.codecHeader.VP8.temporalIdx;
|
||||
}
|
||||
|
||||
bool VCMSessionInfo::LayerSync() const {
|
||||
if (packets_.empty() ||
|
||||
packets_.front().codecSpecificHeader.codec != kRTPVideoVP8)
|
||||
packets_.front().codecSpecificHeader.codec != kRtpVideoVp8)
|
||||
return false;
|
||||
return packets_.front().codecSpecificHeader.codecHeader.VP8.layerSync;
|
||||
}
|
||||
|
||||
int VCMSessionInfo::Tl0PicId() const {
|
||||
if (packets_.empty() ||
|
||||
packets_.front().codecSpecificHeader.codec != kRTPVideoVP8)
|
||||
packets_.front().codecSpecificHeader.codec != kRtpVideoVp8)
|
||||
return kNoTl0PicIdx;
|
||||
return packets_.front().codecSpecificHeader.codecHeader.VP8.tl0PicIdx;
|
||||
}
|
||||
|
||||
bool VCMSessionInfo::NonReference() const {
|
||||
if (packets_.empty() ||
|
||||
packets_.front().codecSpecificHeader.codec != kRTPVideoVP8)
|
||||
packets_.front().codecSpecificHeader.codec != kRtpVideoVp8)
|
||||
return false;
|
||||
return packets_.front().codecSpecificHeader.codecHeader.VP8.nonReference;
|
||||
}
|
||||
|
@ -69,7 +69,7 @@ class TestVP8Partitions : public TestSessionInfo {
|
||||
TestSessionInfo::SetUp();
|
||||
vp8_header_ = &packet_header_.type.Video.codecHeader.VP8;
|
||||
packet_header_.frameType = kVideoFrameDelta;
|
||||
packet_header_.type.Video.codec = kRTPVideoVP8;
|
||||
packet_header_.type.Video.codec = kRtpVideoVp8;
|
||||
vp8_header_->InitRTPVideoHeaderVP8();
|
||||
fragmentation_.VerifyAndAllocateFragmentationHeader(kMaxVP8Partitions);
|
||||
}
|
||||
|
@ -143,7 +143,8 @@ VideoCodingModuleImpl::Process() {
|
||||
uint32_t bitRate;
|
||||
uint32_t frameRate;
|
||||
_receiver.ReceiveStatistics(&bitRate, &frameRate);
|
||||
_receiveStatsCallback->ReceiveStatistics(bitRate, frameRate);
|
||||
_receiveStatsCallback->OnReceiveStatisticsUpdate(bitRate,
|
||||
frameRate);
|
||||
}
|
||||
|
||||
// Size of render buffer.
|
||||
|
@ -192,7 +192,7 @@ TEST_F(TestVideoCodingModule, PaddingOnlyFrames) {
|
||||
header.header.payloadType = kUnusedPayloadType;
|
||||
header.header.ssrc = 1;
|
||||
header.header.headerLength = 12;
|
||||
header.type.Video.codec = kRTPVideoVP8;
|
||||
header.type.Video.codec = kRtpVideoVp8;
|
||||
for (int i = 0; i < 10; ++i) {
|
||||
EXPECT_CALL(packet_request_callback_, ResendPackets(_, _))
|
||||
.Times(0);
|
||||
@ -216,7 +216,7 @@ TEST_F(TestVideoCodingModule, PaddingOnlyFramesWithLosses) {
|
||||
header.header.payloadType = kUnusedPayloadType;
|
||||
header.header.ssrc = 1;
|
||||
header.header.headerLength = 12;
|
||||
header.type.Video.codec = kRTPVideoVP8;
|
||||
header.type.Video.codec = kRtpVideoVp8;
|
||||
// Insert one video frame to get one frame decoded.
|
||||
header.frameType = kVideoFrameKey;
|
||||
header.type.Video.isFirstPacket = true;
|
||||
@ -270,7 +270,7 @@ TEST_F(TestVideoCodingModule, PaddingOnlyAndVideo) {
|
||||
header.header.payloadType = kUnusedPayloadType;
|
||||
header.header.ssrc = 1;
|
||||
header.header.headerLength = 12;
|
||||
header.type.Video.codec = kRTPVideoVP8;
|
||||
header.type.Video.codec = kRtpVideoVp8;
|
||||
header.type.Video.codecHeader.VP8.pictureId = -1;
|
||||
header.type.Video.codecHeader.VP8.tl0PicIdx = -1;
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
|
@ -67,7 +67,7 @@ class VCMRobustnessTest : public ::testing::Test {
|
||||
rtp_info.header.sequenceNumber = seq_no;
|
||||
rtp_info.header.markerBit = marker_bit;
|
||||
rtp_info.header.payloadType = video_codec_.plType;
|
||||
rtp_info.type.Video.codec = kRTPVideoVP8;
|
||||
rtp_info.type.Video.codec = kRtpVideoVp8;
|
||||
rtp_info.type.Video.codecHeader.VP8.InitRTPVideoHeaderVP8();
|
||||
rtp_info.type.Video.isFirstPacket = first;
|
||||
|
||||
|
@ -151,7 +151,7 @@ CodecDataBaseTest::Perform(CmdArgs& args)
|
||||
// Testing with VP8.
|
||||
VideoCodingModule::Codec(kVideoCodecVP8, &sendCodec);
|
||||
_vcm->RegisterSendCodec(&sendCodec, 1, 1440);
|
||||
_encodeCompleteCallback->SetCodecType(kRTPVideoVP8);
|
||||
_encodeCompleteCallback->SetCodecType(kRtpVideoVp8);
|
||||
_vcm->InitializeReceiver();
|
||||
TEST (_vcm->AddVideoFrame(sourceFrame) == VCM_OK );
|
||||
_vcm->InitializeSender();
|
||||
@ -196,7 +196,7 @@ CodecDataBaseTest::Perform(CmdArgs& args)
|
||||
VideoCodingModule::Codec(kVideoCodecVP8, &vp8EncSettings);
|
||||
_vcm->RegisterTransportCallback(_encodeCallback); // encode returns error if callback uninitialized
|
||||
_encodeCallback->RegisterReceiverVCM(_vcm);
|
||||
_encodeCallback->SetCodecType(kRTPVideoVP8);
|
||||
_encodeCallback->SetCodecType(kRtpVideoVp8);
|
||||
TEST(_vcm->RegisterExternalEncoder(encoder, vp8EncSettings.plType) == VCM_OK);
|
||||
TEST(_vcm->RegisterSendCodec(&vp8EncSettings, 4, 1440) == VCM_OK);
|
||||
TEST(_vcm->AddVideoFrame(sourceFrame) == VCM_OK);
|
||||
@ -232,7 +232,7 @@ CodecDataBaseTest::Perform(CmdArgs& args)
|
||||
TEST(_vcm->RegisterReceiveCodec(&receiveCodec, 1, true) == VCM_OK); // Require key frame
|
||||
_vcm->RegisterTransportCallback(_encodeCallback); // encode returns error if callback uninitialized
|
||||
_encodeCallback->RegisterReceiverVCM(_vcm);
|
||||
_encodeCallback->SetCodecType(kRTPVideoVP8);
|
||||
_encodeCallback->SetCodecType(kRtpVideoVp8);
|
||||
TEST(_vcm->AddVideoFrame(sourceFrame) == VCM_OK);
|
||||
TEST(_vcm->Decode() == VCM_OK);
|
||||
TEST(_vcm->ResetDecoder() == VCM_OK);
|
||||
|
@ -549,7 +549,7 @@ VCMEncComplete_KeyReqTest::SendData(
|
||||
WebRtcRTPHeader rtpInfo;
|
||||
rtpInfo.header.markerBit = true; // end of frame
|
||||
rtpInfo.type.Video.codecHeader.VP8.InitRTPVideoHeaderVP8();
|
||||
rtpInfo.type.Video.codec = kRTPVideoVP8;
|
||||
rtpInfo.type.Video.codec = kRtpVideoVp8;
|
||||
rtpInfo.header.payloadType = payloadType;
|
||||
rtpInfo.header.sequenceNumber = _seqNo;
|
||||
_seqNo += 2;
|
||||
|
@ -18,6 +18,7 @@
|
||||
#include <time.h>
|
||||
#include <vector>
|
||||
|
||||
#include "webrtc/modules/rtp_rtcp/interface/rtp_receiver.h"
|
||||
#include "webrtc/modules/video_coding/main/interface/video_coding.h"
|
||||
#include "webrtc/modules/video_coding/main/test/test_macros.h"
|
||||
#include "webrtc/modules/video_coding/main/test/test_util.h"
|
||||
@ -202,7 +203,6 @@ MediaOptTest::GeneralSetup()
|
||||
RtpRtcp::Configuration configuration;
|
||||
configuration.id = 1;
|
||||
configuration.audio = false;
|
||||
configuration.incoming_data = _dataCallback;
|
||||
configuration.outgoing_transport = _outgoingTransport;
|
||||
_rtp = RtpRtcp::CreateRtpRtcp(configuration);
|
||||
|
||||
@ -211,21 +211,33 @@ MediaOptTest::GeneralSetup()
|
||||
// Registering codecs for the RTP module
|
||||
|
||||
// Register receive and send payload
|
||||
VideoCodec videoCodec;
|
||||
strncpy(videoCodec.plName, "VP8", 32);
|
||||
videoCodec.plType = VCM_VP8_PAYLOAD_TYPE;
|
||||
_rtp->RegisterReceivePayload(videoCodec);
|
||||
_rtp->RegisterSendPayload(videoCodec);
|
||||
VideoCodec video_codec;
|
||||
strncpy(video_codec.plName, "VP8", 32);
|
||||
video_codec.plType = VCM_VP8_PAYLOAD_TYPE;
|
||||
rtp_receiver_->RegisterReceivePayload(video_codec.plName,
|
||||
video_codec.plType,
|
||||
90000,
|
||||
0,
|
||||
video_codec.maxBitrate);
|
||||
_rtp->RegisterSendPayload(video_codec);
|
||||
|
||||
strncpy(videoCodec.plName, "ULPFEC", 32);
|
||||
videoCodec.plType = VCM_ULPFEC_PAYLOAD_TYPE;
|
||||
_rtp->RegisterReceivePayload(videoCodec);
|
||||
_rtp->RegisterSendPayload(videoCodec);
|
||||
strncpy(video_codec.plName, "ULPFEC", 32);
|
||||
video_codec.plType = VCM_ULPFEC_PAYLOAD_TYPE;
|
||||
rtp_receiver_->RegisterReceivePayload(video_codec.plName,
|
||||
video_codec.plType,
|
||||
90000,
|
||||
0,
|
||||
video_codec.maxBitrate);
|
||||
_rtp->RegisterSendPayload(video_codec);
|
||||
|
||||
strncpy(videoCodec.plName, "RED", 32);
|
||||
videoCodec.plType = VCM_RED_PAYLOAD_TYPE;
|
||||
_rtp->RegisterReceivePayload(videoCodec);
|
||||
_rtp->RegisterSendPayload(videoCodec);
|
||||
strncpy(video_codec.plName, "RED", 32);
|
||||
video_codec.plType = VCM_RED_PAYLOAD_TYPE;
|
||||
rtp_receiver_->RegisterReceivePayload(video_codec.plName,
|
||||
video_codec.plType,
|
||||
90000,
|
||||
0,
|
||||
video_codec.maxBitrate);
|
||||
_rtp->RegisterSendPayload(video_codec);
|
||||
|
||||
if (_nackFecEnabled == 1)
|
||||
_rtp->SetGenericFECStatus(_nackFecEnabled, VCM_RED_PAYLOAD_TYPE,
|
||||
|
@ -53,6 +53,7 @@ public:
|
||||
private:
|
||||
|
||||
webrtc::VideoCodingModule* _vcm;
|
||||
webrtc::RtpReceiver* rtp_receiver_;
|
||||
webrtc::RtpRtcp* _rtp;
|
||||
webrtc::RTPSendCompleteCallback* _outgoingTransport;
|
||||
RtpDataCallback* _dataCallback;
|
||||
|
@ -16,6 +16,8 @@
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "webrtc/modules/rtp_rtcp/interface/rtp_payload_registry.h"
|
||||
#include "webrtc/modules/rtp_rtcp/interface/rtp_receiver.h"
|
||||
#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp.h"
|
||||
#include "webrtc/modules/video_coding/main/interface/video_coding.h"
|
||||
#include "webrtc/modules/video_coding/main/test/media_opt_test.h"
|
||||
@ -152,29 +154,46 @@ int MTRxTxTest(CmdArgs& args)
|
||||
RtpRtcp::Configuration configuration;
|
||||
configuration.id = 1;
|
||||
configuration.audio = false;
|
||||
configuration.incoming_data = &dataCallback;
|
||||
configuration.outgoing_transport = outgoingTransport;
|
||||
RtpRtcp* rtp = RtpRtcp::CreateRtpRtcp(configuration);
|
||||
scoped_ptr<RTPPayloadRegistry> registry(new RTPPayloadRegistry(
|
||||
-1, RTPPayloadStrategy::CreateStrategy(false)));
|
||||
scoped_ptr<RtpReceiver> rtp_receiver(
|
||||
RtpReceiver::CreateVideoReceiver(-1, Clock::GetRealTimeClock(),
|
||||
&dataCallback, NULL, registry.get()));
|
||||
|
||||
// registering codecs for the RTP module
|
||||
VideoCodec videoCodec;
|
||||
strncpy(videoCodec.plName, "ULPFEC", 32);
|
||||
videoCodec.plType = VCM_ULPFEC_PAYLOAD_TYPE;
|
||||
TEST(rtp->RegisterReceivePayload(videoCodec) == 0);
|
||||
VideoCodec video_codec;
|
||||
strncpy(video_codec.plName, "ULPFEC", 32);
|
||||
video_codec.plType = VCM_ULPFEC_PAYLOAD_TYPE;
|
||||
TEST(rtp_receiver->RegisterReceivePayload(video_codec.plName,
|
||||
video_codec.plType,
|
||||
90000,
|
||||
0,
|
||||
video_codec.maxBitrate) == 0);
|
||||
|
||||
strncpy(videoCodec.plName, "RED", 32);
|
||||
videoCodec.plType = VCM_RED_PAYLOAD_TYPE;
|
||||
TEST(rtp->RegisterReceivePayload(videoCodec) == 0);
|
||||
strncpy(video_codec.plName, "RED", 32);
|
||||
video_codec.plType = VCM_RED_PAYLOAD_TYPE;
|
||||
TEST(rtp_receiver->RegisterReceivePayload(video_codec.plName,
|
||||
video_codec.plType,
|
||||
90000,
|
||||
0,
|
||||
video_codec.maxBitrate) == 0);
|
||||
|
||||
strncpy(videoCodec.plName, args.codecName.c_str(), 32);
|
||||
videoCodec.plType = VCM_VP8_PAYLOAD_TYPE;
|
||||
videoCodec.maxBitrate = 10000;
|
||||
videoCodec.codecType = args.codecType;
|
||||
TEST(rtp->RegisterReceivePayload(videoCodec) == 0);
|
||||
TEST(rtp->RegisterSendPayload(videoCodec) == 0);
|
||||
strncpy(video_codec.plName, args.codecName.c_str(), 32);
|
||||
video_codec.plType = VCM_VP8_PAYLOAD_TYPE;
|
||||
video_codec.maxBitrate = 10000;
|
||||
video_codec.codecType = args.codecType;
|
||||
TEST(rtp_receiver->RegisterReceivePayload(video_codec.plName,
|
||||
video_codec.plType,
|
||||
90000,
|
||||
0,
|
||||
video_codec.maxBitrate) == 0);
|
||||
TEST(rtp->RegisterSendPayload(video_codec) == 0);
|
||||
|
||||
// inform RTP Module of error resilience features
|
||||
TEST(rtp->SetGenericFECStatus(fecEnabled, VCM_RED_PAYLOAD_TYPE, VCM_ULPFEC_PAYLOAD_TYPE) == 0);
|
||||
TEST(rtp->SetGenericFECStatus(fecEnabled, VCM_RED_PAYLOAD_TYPE,
|
||||
VCM_ULPFEC_PAYLOAD_TYPE) == 0);
|
||||
|
||||
//VCM
|
||||
if (vcm->InitializeReceiver() < 0)
|
||||
@ -238,7 +257,8 @@ int MTRxTxTest(CmdArgs& args)
|
||||
FecProtectionParams delta_params = protectionCallback.DeltaFecParameters();
|
||||
FecProtectionParams key_params = protectionCallback.KeyFecParameters();
|
||||
rtp->SetFecParameters(&delta_params, &key_params);
|
||||
rtp->SetNACKStatus(nackEnabled ? kNackRtcp : kNackOff, kMaxPacketAgeToNack);
|
||||
rtp_receiver->SetNACKStatus(nackEnabled ? kNackRtcp : kNackOff,
|
||||
kMaxPacketAgeToNack);
|
||||
|
||||
vcm->SetChannelParameters(static_cast<uint32_t>(1000 * bitRate),
|
||||
(uint8_t) lossRate, rttMS);
|
||||
|
@ -13,6 +13,8 @@
|
||||
#include <math.h>
|
||||
|
||||
#include "webrtc/modules/rtp_rtcp/interface/rtp_header_parser.h"
|
||||
#include "webrtc/modules/rtp_rtcp/interface/rtp_payload_registry.h"
|
||||
#include "webrtc/modules/rtp_rtcp/interface/rtp_receiver.h"
|
||||
#include "webrtc/modules/utility/interface/rtp_dump.h"
|
||||
#include "webrtc/system_wrappers/interface/clock.h"
|
||||
|
||||
@ -95,7 +97,14 @@ TransportCallback::TransportPackets()
|
||||
delete packet;
|
||||
return -1;
|
||||
}
|
||||
if (_rtp->IncomingRtpPacket(packet->data, packet->length, header) < 0)
|
||||
PayloadUnion payload_specific;
|
||||
if (!rtp_payload_registry_->GetPayloadSpecifics(
|
||||
header.payloadType, &payload_specific)) {
|
||||
return -1;
|
||||
}
|
||||
if (!rtp_receiver_->IncomingRtpPacket(&header, packet->data,
|
||||
packet->length, payload_specific,
|
||||
true))
|
||||
{
|
||||
delete packet;
|
||||
return -1;
|
||||
|
@ -95,7 +95,7 @@ VCMNTEncodeCompleteCallback::SendData(
|
||||
switch (_test.VideoType())
|
||||
{
|
||||
case kVideoCodecVP8:
|
||||
rtpInfo.type.Video.codec = kRTPVideoVP8;
|
||||
rtpInfo.type.Video.codec = kRtpVideoVp8;
|
||||
rtpInfo.type.Video.codecHeader.VP8.InitRTPVideoHeaderVP8();
|
||||
rtpInfo.type.Video.codecHeader.VP8.nonReference =
|
||||
videoHdr->codecHeader.VP8.nonReference;
|
||||
@ -103,7 +103,7 @@ VCMNTEncodeCompleteCallback::SendData(
|
||||
videoHdr->codecHeader.VP8.pictureId;
|
||||
break;
|
||||
case kVideoCodecI420:
|
||||
rtpInfo.type.Video.codec = kRTPVideoI420;
|
||||
rtpInfo.type.Video.codec = kRtpVideoI420;
|
||||
break;
|
||||
default:
|
||||
assert(false);
|
||||
|
@ -22,7 +22,7 @@
|
||||
#include <stdio.h>
|
||||
#include <string>
|
||||
|
||||
class RtpDataCallback : public webrtc::RtpData {
|
||||
class RtpDataCallback : public webrtc::NullRtpData {
|
||||
public:
|
||||
RtpDataCallback(webrtc::VideoCodingModule* vcm) : vcm_(vcm) {}
|
||||
virtual ~RtpDataCallback() {}
|
||||
|
@ -15,6 +15,8 @@
|
||||
#include <map>
|
||||
|
||||
#include "webrtc/modules/rtp_rtcp/interface/rtp_header_parser.h"
|
||||
#include "webrtc/modules/rtp_rtcp/interface/rtp_payload_registry.h"
|
||||
#include "webrtc/modules/rtp_rtcp/interface/rtp_receiver.h"
|
||||
#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp.h"
|
||||
#include "webrtc/modules/video_coding/main/source/internal_defines.h"
|
||||
#include "webrtc/modules/video_coding/main/test/pcap_file_reader.h"
|
||||
@ -217,8 +219,9 @@ class SsrcHandlers {
|
||||
RtpRtcp::Configuration configuration;
|
||||
configuration.id = 1;
|
||||
configuration.audio = false;
|
||||
configuration.incoming_data = handler->payload_sink_.get();
|
||||
handler->rtp_module_.reset(RtpRtcp::CreateRtpRtcp(configuration));
|
||||
handler->rtp_module_.reset(RtpReceiver::CreateVideoReceiver(
|
||||
configuration.id, configuration.clock, handler->payload_sink_.get(),
|
||||
NULL, handler->rtp_payload_registry_.get()));
|
||||
if (handler->rtp_module_.get() == NULL) {
|
||||
return -1;
|
||||
}
|
||||
@ -227,9 +230,6 @@ class SsrcHandlers {
|
||||
kMaxPacketAgeToNack) < 0) {
|
||||
return -1;
|
||||
}
|
||||
handler->rtp_module_->SetRTCPStatus(kRtcpNonCompound);
|
||||
handler->rtp_module_->SetREMBStatus(true);
|
||||
handler->rtp_module_->SetSSRCFilter(true, ssrc);
|
||||
handler->rtp_header_parser_->RegisterRtpHeaderExtension(
|
||||
kRtpExtensionTransmissionTimeOffset,
|
||||
kDefaultTransmissionTimeOffsetExtensionId);
|
||||
@ -241,7 +241,11 @@ class SsrcHandlers {
|
||||
strncpy(codec.plName, it->name().c_str(), sizeof(codec.plName)-1);
|
||||
codec.plType = it->payload_type();
|
||||
codec.codecType = it->codec_type();
|
||||
if (handler->rtp_module_->RegisterReceivePayload(codec) < 0) {
|
||||
if (handler->rtp_module_->RegisterReceivePayload(codec.plName,
|
||||
codec.plType,
|
||||
90000,
|
||||
0,
|
||||
codec.maxBitrate) < 0) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
@ -250,20 +254,18 @@ class SsrcHandlers {
|
||||
return 0;
|
||||
}
|
||||
|
||||
void Process() {
|
||||
for (HandlerMapIt it = handlers_.begin(); it != handlers_.end(); ++it) {
|
||||
it->second->rtp_module_->Process();
|
||||
}
|
||||
}
|
||||
|
||||
void IncomingPacket(const uint8_t* data, uint32_t length) {
|
||||
for (HandlerMapIt it = handlers_.begin(); it != handlers_.end(); ++it) {
|
||||
if (it->second->rtp_header_parser_->IsRtcp(data, length)) {
|
||||
it->second->rtp_module_->IncomingRtcpPacket(data, length);
|
||||
} else {
|
||||
if (!it->second->rtp_header_parser_->IsRtcp(data, length)) {
|
||||
RTPHeader header;
|
||||
it->second->rtp_header_parser_->Parse(data, length, &header);
|
||||
it->second->rtp_module_->IncomingRtpPacket(data, length, header);
|
||||
PayloadUnion payload_specific;
|
||||
it->second->rtp_payload_registry_->GetPayloadSpecifics(
|
||||
header.payloadType, &payload_specific);
|
||||
bool in_order =
|
||||
it->second->rtp_module_->InOrderPacket(header.sequenceNumber);
|
||||
it->second->rtp_module_->IncomingRtpPacket(&header, data, length,
|
||||
payload_specific, in_order);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -274,6 +276,8 @@ class SsrcHandlers {
|
||||
Handler(uint32_t ssrc, const PayloadTypes& payload_types,
|
||||
LostPackets* lost_packets)
|
||||
: rtp_header_parser_(RtpHeaderParser::Create()),
|
||||
rtp_payload_registry_(new RTPPayloadRegistry(
|
||||
0, RTPPayloadStrategy::CreateStrategy(false))),
|
||||
rtp_module_(),
|
||||
payload_sink_(),
|
||||
ssrc_(ssrc),
|
||||
@ -297,7 +301,8 @@ class SsrcHandlers {
|
||||
}
|
||||
|
||||
scoped_ptr<RtpHeaderParser> rtp_header_parser_;
|
||||
scoped_ptr<RtpRtcp> rtp_module_;
|
||||
scoped_ptr<RTPPayloadRegistry> rtp_payload_registry_;
|
||||
scoped_ptr<RtpReceiver> rtp_module_;
|
||||
scoped_ptr<PayloadSinkInterface> payload_sink_;
|
||||
|
||||
private:
|
||||
@ -367,8 +372,6 @@ class RtpPlayerImpl : public RtpPlayerInterface {
|
||||
|
||||
// Send any packets from packet source.
|
||||
if (!end_of_file_ && (TimeUntilNextPacket() == 0 || first_packet_)) {
|
||||
ssrc_handlers_.Process();
|
||||
|
||||
if (first_packet_) {
|
||||
next_packet_length_ = sizeof(next_packet_);
|
||||
if (packet_source_->NextPacket(next_packet_, &next_packet_length_,
|
||||
|
@ -14,6 +14,8 @@
|
||||
|
||||
#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
|
||||
#include "webrtc/modules/rtp_rtcp/interface/rtp_header_parser.h"
|
||||
#include "webrtc/modules/rtp_rtcp/interface/rtp_payload_registry.h"
|
||||
#include "webrtc/modules/rtp_rtcp/interface/rtp_receiver.h"
|
||||
#include "webrtc/modules/utility/interface/rtp_dump.h"
|
||||
#include "webrtc/modules/video_coding/main/test/test_macros.h"
|
||||
#include "webrtc/system_wrappers/interface/clock.h"
|
||||
@ -34,7 +36,7 @@ VCMEncodeCompleteCallback::VCMEncodeCompleteCallback(FILE* encodedFile):
|
||||
_encodeComplete(false),
|
||||
_width(0),
|
||||
_height(0),
|
||||
_codecType(kRTPVideoNoVideo)
|
||||
_codecType(kRtpVideoNone)
|
||||
{
|
||||
//
|
||||
}
|
||||
@ -73,14 +75,14 @@ VCMEncodeCompleteCallback::SendData(
|
||||
rtpInfo.type.Video.width = (uint16_t)_width;
|
||||
switch (_codecType)
|
||||
{
|
||||
case webrtc::kRTPVideoVP8:
|
||||
case webrtc::kRtpVideoVp8:
|
||||
rtpInfo.type.Video.codecHeader.VP8.InitRTPVideoHeaderVP8();
|
||||
rtpInfo.type.Video.codecHeader.VP8.nonReference =
|
||||
videoHdr->codecHeader.VP8.nonReference;
|
||||
rtpInfo.type.Video.codecHeader.VP8.pictureId =
|
||||
videoHdr->codecHeader.VP8.pictureId;
|
||||
break;
|
||||
case webrtc::kRTPVideoI420:
|
||||
case webrtc::kRtpVideoI420:
|
||||
break;
|
||||
default:
|
||||
assert(false);
|
||||
@ -209,6 +211,8 @@ RTPSendCompleteCallback::RTPSendCompleteCallback(Clock* clock,
|
||||
const char* filename):
|
||||
_clock(clock),
|
||||
_sendCount(0),
|
||||
rtp_payload_registry_(NULL),
|
||||
rtp_receiver_(NULL),
|
||||
_rtp(NULL),
|
||||
_lossPct(0),
|
||||
_burstLength(0),
|
||||
@ -299,7 +303,14 @@ RTPSendCompleteCallback::SendPacket(int channel, const void *data, int len)
|
||||
delete packet;
|
||||
return -1;
|
||||
}
|
||||
if (_rtp->IncomingRtpPacket(packet->data, packet->length, header) < 0)
|
||||
PayloadUnion payload_specific;
|
||||
if (!rtp_payload_registry_->GetPayloadSpecifics(
|
||||
header.payloadType, &payload_specific)) {
|
||||
return -1;
|
||||
}
|
||||
if (!rtp_receiver_->IncomingRtpPacket(&header, packet->data,
|
||||
packet->length, payload_specific,
|
||||
true))
|
||||
{
|
||||
delete packet;
|
||||
return -1;
|
||||
|
@ -30,6 +30,7 @@
|
||||
|
||||
namespace webrtc
|
||||
{
|
||||
class RTPPayloadRegistry;
|
||||
class RtpDump;
|
||||
|
||||
// Send Side - Packetization callback - send an encoded frame to the VCMReceiver
|
||||
@ -60,7 +61,7 @@ public:
|
||||
// Return encode complete (true/false)
|
||||
bool EncodeComplete();
|
||||
// Inform callback of codec used
|
||||
void SetCodecType(RTPVideoCodecTypes codecType)
|
||||
void SetCodecType(RtpVideoCodecTypes codecType)
|
||||
{_codecType = codecType;}
|
||||
// Inform callback of frame dimensions
|
||||
void SetFrameDimensions(int32_t width, int32_t height)
|
||||
@ -83,7 +84,7 @@ private:
|
||||
bool _encodeComplete;
|
||||
int32_t _width;
|
||||
int32_t _height;
|
||||
RTPVideoCodecTypes _codecType;
|
||||
RtpVideoCodecTypes _codecType;
|
||||
|
||||
}; // end of VCMEncodeCompleteCallback
|
||||
|
||||
@ -114,7 +115,7 @@ public:
|
||||
// Return encode complete (true/false)
|
||||
bool EncodeComplete();
|
||||
// Inform callback of codec used
|
||||
void SetCodecType(RTPVideoCodecTypes codecType)
|
||||
void SetCodecType(RtpVideoCodecTypes codecType)
|
||||
{_codecType = codecType;}
|
||||
|
||||
// Inform callback of frame dimensions
|
||||
@ -131,7 +132,7 @@ private:
|
||||
RtpRtcp* _RTPModule;
|
||||
int16_t _width;
|
||||
int16_t _height;
|
||||
RTPVideoCodecTypes _codecType;
|
||||
RtpVideoCodecTypes _codecType;
|
||||
}; // end of VCMEncodeCompleteCallback
|
||||
|
||||
// Decode Complete callback
|
||||
@ -189,6 +190,8 @@ protected:
|
||||
|
||||
Clock* _clock;
|
||||
uint32_t _sendCount;
|
||||
RTPPayloadRegistry* rtp_payload_registry_;
|
||||
RtpReceiver* rtp_receiver_;
|
||||
RtpRtcp* _rtp;
|
||||
double _lossPct;
|
||||
double _burstLength;
|
||||
|
@ -147,12 +147,12 @@ int32_t FileOutputFrameReceiver::FrameToRender(
|
||||
return 0;
|
||||
}
|
||||
|
||||
webrtc::RTPVideoCodecTypes ConvertCodecType(const char* plname) {
|
||||
webrtc::RtpVideoCodecTypes ConvertCodecType(const char* plname) {
|
||||
if (strncmp(plname,"VP8" , 3) == 0) {
|
||||
return webrtc::kRTPVideoVP8;
|
||||
return webrtc::kRtpVideoVp8;
|
||||
} else if (strncmp(plname,"I420" , 5) == 0) {
|
||||
return webrtc::kRTPVideoI420;
|
||||
return webrtc::kRtpVideoI420;
|
||||
} else {
|
||||
return webrtc::kRTPVideoNoVideo; // Default value
|
||||
return webrtc::kRtpVideoNone; // Default value
|
||||
}
|
||||
}
|
||||
|
@ -102,6 +102,6 @@ class FileOutputFrameReceiver : public webrtc::VCMReceiveCallback {
|
||||
};
|
||||
|
||||
// Codec type conversion
|
||||
webrtc::RTPVideoCodecTypes ConvertCodecType(const char* plname);
|
||||
webrtc::RtpVideoCodecTypes ConvertCodecType(const char* plname);
|
||||
|
||||
#endif
|
||||
|
@ -68,6 +68,12 @@ class VcmPayloadSinkFactory::VcmPayloadSink
|
||||
return vcm_->IncomingPacket(payload_data, payload_size, *rtp_header);
|
||||
}
|
||||
|
||||
virtual bool OnRecoveredPacket(const uint8_t* packet,
|
||||
int packet_length) {
|
||||
// We currently don't handle FEC.
|
||||
return true;
|
||||
}
|
||||
|
||||
// VCMPacketRequestCallback
|
||||
virtual int32_t ResendPackets(const uint16_t* sequence_numbers,
|
||||
uint16_t length) {
|
||||
|
Reference in New Issue
Block a user