Extract RTP-header SSRC inline in Call.

Prevents unknown-RTP-header-extension warnings to be flooding from the
RTP-header parsing as there's no way to register RTP extensions for the
parser in Call as they're allowed to differ between RTP streams.

RTP-header parsing should instead be done separately in every
VideoReceiveStream.

BUG=
R=stefan@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/16829004

git-svn-id: http://webrtc.googlecode.com/svn/trunk/webrtc@6619 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/video/call.cc b/video/call.cc
index 2ae0ae5..e45b549 100644
--- a/video/call.cc
+++ b/video/call.cc
@@ -89,9 +89,7 @@
 
  private:
   DeliveryStatus DeliverRtcp(const uint8_t* packet, size_t length);
-  DeliveryStatus DeliverRtp(const RTPHeader& header,
-                            const uint8_t* packet,
-                            size_t length);
+  DeliveryStatus DeliverRtp(const uint8_t* packet, size_t length);
 
   Call::Config config_;
 
@@ -288,7 +286,7 @@
   return 0;
 }
 
-Call::PacketReceiver::DeliveryStatus Call::DeliverRtcp(const uint8_t* packet,
+PacketReceiver::DeliveryStatus Call::DeliverRtcp(const uint8_t* packet,
                                                        size_t length) {
   // TODO(pbos): Figure out what channel needs it actually.
   //             Do NOT broadcast! Also make sure it's a valid packet.
@@ -319,32 +317,32 @@
   return rtcp_delivered ? DELIVERY_OK : DELIVERY_PACKET_ERROR;
 }
 
-Call::PacketReceiver::DeliveryStatus Call::DeliverRtp(const RTPHeader& header,
-                                                      const uint8_t* packet,
-                                                      size_t length) {
+PacketReceiver::DeliveryStatus Call::DeliverRtp(const uint8_t* packet,
+                                                size_t length) {
+  // Minimum RTP header size.
+  if (length < 12)
+    return DELIVERY_PACKET_ERROR;
+
+  const uint8_t* ptr = &packet[8];
+  uint32_t ssrc = ptr[0] << 24 | ptr[1] << 16 | ptr[2] << 8 | ptr[3] ;
+
   ReadLockScoped read_lock(*receive_lock_);
   std::map<uint32_t, VideoReceiveStream*>::iterator it =
-      receive_ssrcs_.find(header.ssrc);
+      receive_ssrcs_.find(ssrc);
 
   if (it == receive_ssrcs_.end())
     return DELIVERY_UNKNOWN_SSRC;
 
-  return it->second->DeliverRtp(static_cast<const uint8_t*>(packet), length)
-             ? DELIVERY_OK
-             : DELIVERY_PACKET_ERROR;
+  return it->second->DeliverRtp(packet, length) ? DELIVERY_OK
+                                                : DELIVERY_PACKET_ERROR;
 }
 
-Call::PacketReceiver::DeliveryStatus Call::DeliverPacket(const uint8_t* packet,
-                                                         size_t length) {
-  // TODO(pbos): ExtensionMap if there are extensions.
+PacketReceiver::DeliveryStatus Call::DeliverPacket(const uint8_t* packet,
+                                                   size_t length) {
   if (RtpHeaderParser::IsRtcp(packet, static_cast<int>(length)))
     return DeliverRtcp(packet, length);
 
-  RTPHeader rtp_header;
-  if (!rtp_header_parser_->Parse(packet, static_cast<int>(length), &rtp_header))
-    return DELIVERY_PACKET_ERROR;
-
-  return DeliverRtp(rtp_header, packet, length);
+  return DeliverRtp(packet, length);
 }
 
 }  // namespace internal