Update talk to 58127566 together with
https://webrtc-codereview.appspot.com/5309005/.
R=mallinath@webrtc.org, niklas.enbom@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/5719004
git-svn-id: http://webrtc.googlecode.com/svn/trunk/webrtc@5277 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/common_types.h b/common_types.h
index 55ba552..82f45d8 100644
--- a/common_types.h
+++ b/common_types.h
@@ -677,6 +677,22 @@
double initial_threshold;
};
+// This structure will have the information about when packet is actually
+// received by socket.
+struct PacketTime {
+ PacketTime() : timestamp(-1), max_error_us(-1) {}
+ PacketTime(int64_t timestamp, int64_t max_error_us)
+ : timestamp(timestamp), max_error_us(max_error_us) {
+ }
+
+ int64_t timestamp; // Receive time after socket delivers the data.
+ int64_t max_error_us; // Earliest possible time the data could have arrived,
+ // indicating the potential error in the |timestamp|
+ // value,in case the system is busy.
+ // For example, the time of the last select() call.
+ // If unknown, this value will be set to zero.
+};
+
} // namespace webrtc
#endif // WEBRTC_COMMON_TYPES_H_
diff --git a/test/channel_transport/channel_transport.cc b/test/channel_transport/channel_transport.cc
index 9500c90..2bf02e9 100644
--- a/test/channel_transport/channel_transport.cc
+++ b/test/channel_transport/channel_transport.cc
@@ -105,7 +105,8 @@
const int32_t packet_length,
const char* /*from_ip*/,
const uint16_t /*from_port*/) {
- vie_network_->ReceivedRTPPacket(channel_, incoming_rtp_packet, packet_length);
+ vie_network_->ReceivedRTPPacket(
+ channel_, incoming_rtp_packet, packet_length, PacketTime());
}
void VideoChannelTransport::IncomingRTCPPacket(
diff --git a/video/video_receive_stream.cc b/video/video_receive_stream.cc
index b6aac0b..151ce83 100644
--- a/video/video_receive_stream.cc
+++ b/video/video_receive_stream.cc
@@ -161,7 +161,8 @@
bool VideoReceiveStream::DeliverRtp(const uint8_t* packet, size_t length) {
return network_->ReceivedRTPPacket(
- channel_, packet, static_cast<int>(length)) == 0;
+ channel_, packet, static_cast<int>(length),
+ PacketTime()) == 0;
}
int32_t VideoReceiveStream::RenderFrame(const uint32_t stream_id,
diff --git a/video_engine/include/vie_network.h b/video_engine/include/vie_network.h
index e1c6bb2..4a9e6ce 100644
--- a/video_engine/include/vie_network.h
+++ b/video_engine/include/vie_network.h
@@ -65,7 +65,8 @@
// the RTP header and payload.
virtual int ReceivedRTPPacket(const int video_channel,
const void* data,
- const int length) = 0;
+ const int length,
+ const PacketTime& packet_time) = 0;
// When using external transport for a channel, received RTCP packets should
// be passed to VideoEngine using this function.
diff --git a/video_engine/test/libvietest/testbed/tb_external_transport.cc b/video_engine/test/libvietest/testbed/tb_external_transport.cc
index f26c1e1..566a01a 100644
--- a/video_engine/test/libvietest/testbed/tb_external_transport.cc
+++ b/video_engine/test/libvietest/testbed/tb_external_transport.cc
@@ -458,7 +458,8 @@
}
_vieNetwork.ReceivedRTPPacket(destination_channel,
packet->packetBuffer,
- packet->length);
+ packet->length,
+ webrtc::PacketTime());
delete packet;
packet = NULL;
}
diff --git a/video_engine/vie_channel.cc b/video_engine/vie_channel.cc
index b6d9be1..810f66b 100644
--- a/video_engine/vie_channel.cc
+++ b/video_engine/vie_channel.cc
@@ -1612,14 +1612,16 @@
}
int32_t ViEChannel::ReceivedRTPPacket(
- const void* rtp_packet, const int32_t rtp_packet_length) {
+ const void* rtp_packet, const int32_t rtp_packet_length,
+ const PacketTime& packet_time) {
{
CriticalSectionScoped cs(callback_cs_.get());
if (!external_transport_) {
return -1;
}
}
- return vie_receiver_.ReceivedRTPPacket(rtp_packet, rtp_packet_length);
+ return vie_receiver_.ReceivedRTPPacket(
+ rtp_packet, rtp_packet_length, packet_time);
}
int32_t ViEChannel::ReceivedRTCPPacket(
diff --git a/video_engine/vie_channel.h b/video_engine/vie_channel.h
index 0ee677e..29b1464 100644
--- a/video_engine/vie_channel.h
+++ b/video_engine/vie_channel.h
@@ -262,7 +262,8 @@
// Incoming packet from external transport.
int32_t ReceivedRTPPacket(const void* rtp_packet,
- const int32_t rtp_packet_length);
+ const int32_t rtp_packet_length,
+ const PacketTime& packet_time);
// Incoming packet from external transport.
int32_t ReceivedRTCPPacket(const void* rtcp_packet,
diff --git a/video_engine/vie_network_impl.cc b/video_engine/vie_network_impl.cc
index 0afd2fe..9965f9e 100644
--- a/video_engine/vie_network_impl.cc
+++ b/video_engine/vie_network_impl.cc
@@ -141,7 +141,8 @@
}
int ViENetworkImpl::ReceivedRTPPacket(const int video_channel, const void* data,
- const int length) {
+ const int length,
+ const PacketTime& packet_time) {
WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
ViEId(shared_data_->instance_id(), video_channel),
"%s(channel: %d, data: -, length: %d)", __FUNCTION__,
@@ -156,7 +157,7 @@
shared_data_->SetLastError(kViENetworkInvalidChannelId);
return -1;
}
- return vie_channel->ReceivedRTPPacket(data, length);
+ return vie_channel->ReceivedRTPPacket(data, length, packet_time);
}
int ViENetworkImpl::ReceivedRTCPPacket(const int video_channel,
diff --git a/video_engine/vie_network_impl.h b/video_engine/vie_network_impl.h
index d49c2fe..4aa3998 100644
--- a/video_engine/vie_network_impl.h
+++ b/video_engine/vie_network_impl.h
@@ -32,7 +32,8 @@
virtual int DeregisterSendTransport(const int video_channel);
virtual int ReceivedRTPPacket(const int video_channel,
const void* data,
- const int length);
+ const int length,
+ const PacketTime& packet_time);
virtual int ReceivedRTCPPacket(const int video_channel,
const void* data,
const int length);
diff --git a/video_engine/vie_receiver.cc b/video_engine/vie_receiver.cc
index 0f13aaf..2946c4a 100644
--- a/video_engine/vie_receiver.cc
+++ b/video_engine/vie_receiver.cc
@@ -177,9 +177,10 @@
}
int ViEReceiver::ReceivedRTPPacket(const void* rtp_packet,
- int rtp_packet_length) {
+ int rtp_packet_length,
+ const PacketTime& packet_time) {
return InsertRTPPacket(static_cast<const int8_t*>(rtp_packet),
- rtp_packet_length);
+ rtp_packet_length, packet_time);
}
int ViEReceiver::ReceivedRTCPPacket(const void* rtcp_packet,
@@ -211,7 +212,8 @@
}
int ViEReceiver::InsertRTPPacket(const int8_t* rtp_packet,
- int rtp_packet_length) {
+ int rtp_packet_length,
+ const PacketTime& packet_time) {
// TODO(mflodman) Change decrypt to get rid of this cast.
int8_t* tmp_ptr = const_cast<int8_t*>(rtp_packet);
unsigned char* received_packet = reinterpret_cast<unsigned char*>(tmp_ptr);
@@ -256,7 +258,13 @@
return -1;
}
int payload_length = received_packet_length - header.headerLength;
- remote_bitrate_estimator_->IncomingPacket(TickTime::MillisecondTimestamp(),
+ int64_t arrival_time_ms;
+ if (packet_time.timestamp != -1)
+ arrival_time_ms = (packet_time.timestamp + 500) / 1000;
+ else
+ arrival_time_ms = TickTime::MillisecondTimestamp();
+
+ remote_bitrate_estimator_->IncomingPacket(arrival_time_ms,
payload_length, header);
header.payload_type_frequency = kVideoPayloadTypeFrequency;
diff --git a/video_engine/vie_receiver.h b/video_engine/vie_receiver.h
index c71467b..6f480cb 100644
--- a/video_engine/vie_receiver.h
+++ b/video_engine/vie_receiver.h
@@ -18,6 +18,7 @@
#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h"
#include "webrtc/system_wrappers/interface/scoped_ptr.h"
#include "webrtc/typedefs.h"
+#include "webrtc/video_engine/include/vie_network.h"
#include "webrtc/video_engine/vie_defines.h"
namespace webrtc {
@@ -70,7 +71,8 @@
int StopRTPDump();
// Receives packets from external transport.
- int ReceivedRTPPacket(const void* rtp_packet, int rtp_packet_length);
+ int ReceivedRTPPacket(const void* rtp_packet, int rtp_packet_length,
+ const PacketTime& packet_time);
int ReceivedRTCPPacket(const void* rtcp_packet, int rtcp_packet_length);
virtual bool OnRecoveredPacket(const uint8_t* packet,
int packet_length) OVERRIDE;
@@ -86,7 +88,8 @@
ReceiveStatistics* GetReceiveStatistics() const;
private:
- int InsertRTPPacket(const int8_t* rtp_packet, int rtp_packet_length);
+ int InsertRTPPacket(const int8_t* rtp_packet, int rtp_packet_length,
+ const PacketTime& packet_time);
bool ReceivePacket(const uint8_t* packet, int packet_length,
const RTPHeader& header, bool in_order);
// Parses and handles for instance RTX and RED headers.