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.