Consolidate GetFrame and InsertPacket and move NACK list processing to after a packet has been successfully inserted.

TEST=trybots
BUG=1799
R=mikhal@webrtc.org

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

git-svn-id: http://webrtc.googlecode.com/svn/trunk@4080 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/webrtc/modules/video_coding/main/source/frame_buffer.cc b/webrtc/modules/video_coding/main/source/frame_buffer.cc
index 69ef0a2..5226ecb 100644
--- a/webrtc/modules/video_coding/main/source/frame_buffer.cc
+++ b/webrtc/modules/video_coding/main/source/frame_buffer.cc
@@ -104,7 +104,7 @@
     // Sanity to check if the frame has been freed. (Too old for example)
     if (_state == kStateFree)
     {
-        return kStateError;
+        return kGeneralError;
     }
 
     // is this packet part of this frame
@@ -164,6 +164,11 @@
         _sessionInfo.UpdateDataPointers(prevBuffer, _buffer);
     }
 
+    if (packet.width > 0 && packet.height > 0) {
+      _encodedWidth = packet.width;
+      _encodedHeight = packet.height;
+    }
+
     CopyCodecSpecific(&packet.codecSpecificHeader);
 
     int retVal = _sessionInfo.InsertPacket(packet, _buffer,
diff --git a/webrtc/modules/video_coding/main/source/jitter_buffer.cc b/webrtc/modules/video_coding/main/source/jitter_buffer.cc
index bef7bb5..a27dfc9 100644
--- a/webrtc/modules/video_coding/main/source/jitter_buffer.cc
+++ b/webrtc/modules/video_coding/main/source/jitter_buffer.cc
@@ -90,7 +90,7 @@
       frame_buffers_(),
       frame_list_(),
       last_decoded_state_(),
-      first_packet_(true),
+      first_packet_since_reset_(true),
       num_not_decodable_packets_(0),
       receive_statistics_(),
       incoming_frame_rate_(0),
@@ -154,7 +154,7 @@
     inter_frame_delay_ = rhs.inter_frame_delay_;
     waiting_for_completion_ = rhs.waiting_for_completion_;
     rtt_ms_ = rhs.rtt_ms_;
-    first_packet_ = rhs.first_packet_;
+    first_packet_since_reset_ = rhs.first_packet_since_reset_;
     last_decoded_state_ =  rhs.last_decoded_state_;
     num_not_decodable_packets_ = rhs.num_not_decodable_packets_;
     decode_with_errors_ = rhs.decode_with_errors_;
@@ -207,7 +207,7 @@
   waiting_for_completion_.frame_size = 0;
   waiting_for_completion_.timestamp = 0;
   waiting_for_completion_.latest_packet_time = -1;
-  first_packet_ = true;
+  first_packet_since_reset_ = true;
   rtt_ms_ = kDefaultRtt;
   num_not_decodable_packets_ = 0;
   last_decoded_state_.Reset();
@@ -264,7 +264,7 @@
   waiting_for_completion_.frame_size = 0;
   waiting_for_completion_.timestamp = 0;
   waiting_for_completion_.latest_packet_time = -1;
-  first_packet_ = true;
+  first_packet_since_reset_ = true;
   missing_sequence_numbers_.clear();
   WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceVideoCoding,
                VCMId(vcm_id_, receiver_id_), "JB(0x%x): Jitter buffer: flush",
@@ -558,13 +558,8 @@
 }
 
 // Gets frame to use for this timestamp. If no match, get empty frame.
-int VCMJitterBuffer::GetFrame(const VCMPacket& packet,
-                              VCMEncodedFrame*& frame) {
-  if (!running_) {  // Don't accept incoming packets until we are started.
-    return VCM_UNINITIALIZED;
-  }
-
-  crit_sect_->Enter();
+VCMFrameBufferEnum VCMJitterBuffer::GetFrame(const VCMPacket& packet,
+                                             VCMFrameBuffer** frame) {
   // Does this packet belong to an old frame?
   if (last_decoded_state_.IsOldPacket(&packet)) {
     // Account only for media packets.
@@ -584,11 +579,9 @@
 
     if (num_consecutive_old_packets_ > kMaxConsecutiveOldPackets) {
       Flush();
-      crit_sect_->Leave();
-      return VCM_FLUSH_INDICATOR;
+      return kFlushIndicator;
     }
-    crit_sect_->Leave();
-    return VCM_OLD_PACKET_ERROR;
+    return kOldPacket;
   }
   num_consecutive_old_packets_ = 0;
 
@@ -598,79 +591,54 @@
                              FrameEqualTimestamp(packet.timestamp));
 
   if (it != frame_list_.end()) {
-    frame = *it;
-    crit_sect_->Leave();
-    return VCM_OK;
+    *frame = *it;
+    return kNoError;
   }
 
-  crit_sect_->Leave();
-
   // No match, return empty frame.
-  frame = GetEmptyFrame();
-  if (frame != NULL) {
-    return VCM_OK;
+  *frame = GetEmptyFrame();
+  if (*frame != NULL) {
+    return kNoError;
   }
   // No free frame! Try to reclaim some...
-  crit_sect_->Enter();
   RecycleFramesUntilKeyFrame();
-  crit_sect_->Leave();
 
-  frame = GetEmptyFrame();
-  if (frame != NULL) {
-    return VCM_OK;
+  *frame = GetEmptyFrame();
+  if (*frame != NULL) {
+    return kNoError;
   }
-  return VCM_JITTER_BUFFER_ERROR;
+  return kGeneralError;
 }
 
-// Deprecated! Kept for testing purposes.
-VCMEncodedFrame* VCMJitterBuffer::GetFrame(const VCMPacket& packet) {
-  VCMEncodedFrame* frame = NULL;
-  if (GetFrame(packet, frame) < 0) {
-    return NULL;
-  }
-  return frame;
-}
-
-int64_t VCMJitterBuffer::LastPacketTime(VCMEncodedFrame* frame,
+int64_t VCMJitterBuffer::LastPacketTime(const VCMEncodedFrame* frame,
                                         bool* retransmitted) const {
   assert(retransmitted);
   CriticalSectionScoped cs(crit_sect_);
-  *retransmitted = (static_cast<VCMFrameBuffer*>(frame)->GetNackCount() > 0);
-  return static_cast<VCMFrameBuffer*>(frame)->LatestPacketTimeMs();
+  const VCMFrameBuffer* frame_buffer =
+      static_cast<const VCMFrameBuffer*>(frame);
+  *retransmitted = (frame_buffer->GetNackCount() > 0);
+  return frame_buffer->LatestPacketTimeMs();
 }
 
-VCMFrameBufferEnum VCMJitterBuffer::InsertPacket(VCMEncodedFrame* encoded_frame,
-                                                 const VCMPacket& packet) {
-  assert(encoded_frame);
-  bool request_key_frame = false;
+VCMFrameBufferEnum VCMJitterBuffer::InsertPacket(const VCMPacket& packet,
+                                                 bool* retransmitted) {
   CriticalSectionScoped cs(crit_sect_);
   int64_t now_ms = clock_->TimeInMilliseconds();
   VCMFrameBufferEnum buffer_return = kSizeError;
   VCMFrameBufferEnum ret = kSizeError;
-  VCMFrameBuffer* frame = static_cast<VCMFrameBuffer*>(encoded_frame);
 
-  // If this packet belongs to an old, already decoded frame, we want to update
-  // the last decoded sequence number.
-  last_decoded_state_.UpdateOldPacket(&packet);
+  VCMFrameBuffer* frame = NULL;
+  const VCMFrameBufferEnum error = GetFrame(packet, &frame);
+  if (error != kNoError) {
+    return error;
+  }
 
   // We are keeping track of the first seq num, the latest seq num and
   // the number of wraps to be able to calculate how many packets we expect.
-  if (first_packet_) {
+  if (first_packet_since_reset_) {
     // Now it's time to start estimating jitter
     // reset the delay estimate.
     inter_frame_delay_.Reset(clock_->TimeInMilliseconds());
-    first_packet_ = false;
-    latest_received_sequence_number_ = packet.seqNum;
-  } else {
-    if (IsPacketRetransmitted(packet)) {
-      frame->IncrementNackCount();
-    }
-    if (!UpdateNackList(packet.seqNum)) {
-      LOG_F(LS_INFO) << "Requesting key frame due to flushed NACK list.";
-      request_key_frame = true;
-    }
-    latest_received_sequence_number_ = LatestSequenceNumber(
-        latest_received_sequence_number_, packet.seqNum);
   }
 
   // Empty packets may bias the jitter estimate (lacking size component),
@@ -692,10 +660,9 @@
   }
 
   VCMFrameBufferStateEnum state = frame->GetState();
-  // Insert packet
-  // Check for first packet
-  // High sequence number will be -1 if neither an empty packet nor
-  // a media packet has been inserted.
+  // Insert packet.
+  // Check for first packet. High sequence number will be -1 if neither an empty
+  // packet nor a media packet has been inserted.
   bool first = (frame->GetHighSeqNum() == -1);
   // When in Hybrid mode, we allow for a decodable state
   // Note: Under current version, a decodable frame will never be
@@ -718,9 +685,23 @@
           FrameSmallerTimestamp(frame->TimeStamp()));
       frame_list_.insert(rit.base(), frame);
     }
+    if (first_packet_since_reset_) {
+      latest_received_sequence_number_ = packet.seqNum;
+      first_packet_since_reset_ = false;
+    } else {
+      if (IsPacketRetransmitted(packet)) {
+        frame->IncrementNackCount();
+      }
+      if (!UpdateNackList(packet.seqNum)) {
+        LOG_F(LS_INFO) << "Requesting key frame due to flushed NACK list.";
+        buffer_return = kFlushIndicator;
+      }
+      latest_received_sequence_number_ = LatestSequenceNumber(
+          latest_received_sequence_number_, packet.seqNum);
+    }
   }
   switch (buffer_return) {
-    case kStateError:
+    case kGeneralError:
     case kTimeStampError:
     case kSizeError: {
       if (frame != NULL) {
@@ -736,6 +717,7 @@
       // Only update return value for a JB flush indicator.
       if (UpdateFrameState(frame) == kFlushIndicator)
         ret = kFlushIndicator;
+      *retransmitted = (frame->GetNackCount() > 0);
       // Signal that we have a received packet.
       packet_event_->Set();
       break;
@@ -750,13 +732,13 @@
     case kDuplicatePacket: {
       break;
     }
+    case kFlushIndicator:
+      ret = kFlushIndicator;
+      break;
     default: {
       assert(false && "JitterBuffer::InsertPacket: Undefined value");
     }
   }
-  if (request_key_frame) {
-    ret = kFlushIndicator;
-  }
   return ret;
 }
 
@@ -1080,17 +1062,10 @@
 }
 
 VCMFrameBuffer* VCMJitterBuffer::GetEmptyFrame() {
-  if (!running_) {
-    return NULL;
-  }
-
-  crit_sect_->Enter();
-
   for (int i = 0; i < max_number_of_frames_; ++i) {
     if (kStateFree == frame_buffers_[i]->GetState()) {
       // found a free buffer
       frame_buffers_[i]->SetState(kStateEmpty);
-      crit_sect_->Leave();
       return frame_buffers_[i];
     }
   }
@@ -1102,7 +1077,6 @@
     frame_buffers_[max_number_of_frames_] = ptr_new_buffer;
     max_number_of_frames_++;
 
-    crit_sect_->Leave();
     WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceVideoCoding,
                  VCMId(vcm_id_, receiver_id_),
                  "JB(0x%x) FB(0x%x): Jitter buffer  increased to:%d frames",
@@ -1110,7 +1084,6 @@
     TRACE_COUNTER1("webrtc", "JBMaxFrames", max_number_of_frames_);
     return ptr_new_buffer;
   }
-  crit_sect_->Leave();
 
   // We have reached max size, cannot increase JB size
   return NULL;
diff --git a/webrtc/modules/video_coding/main/source/jitter_buffer.h b/webrtc/modules/video_coding/main/source/jitter_buffer.h
index 8cd1616..05f2939 100644
--- a/webrtc/modules/video_coding/main/source/jitter_buffer.h
+++ b/webrtc/modules/video_coding/main/source/jitter_buffer.h
@@ -113,18 +113,15 @@
   // done with decoding.
   void ReleaseFrame(VCMEncodedFrame* frame);
 
-  // Returns the frame assigned to this timestamp.
-  int GetFrame(const VCMPacket& packet, VCMEncodedFrame*&);
-  VCMEncodedFrame* GetFrame(const VCMPacket& packet);  // Deprecated.
-
   // Returns the time in ms when the latest packet was inserted into the frame.
   // Retransmitted is set to true if any of the packets belonging to the frame
   // has been retransmitted.
-  int64_t LastPacketTime(VCMEncodedFrame* frame, bool* retransmitted) const;
+  int64_t LastPacketTime(const VCMEncodedFrame* frame,
+                         bool* retransmitted) const;
 
   // Inserts a packet into a frame returned from GetFrame().
-  VCMFrameBufferEnum InsertPacket(VCMEncodedFrame* frame,
-                                  const VCMPacket& packet);
+  VCMFrameBufferEnum InsertPacket(const VCMPacket& packet,
+                                  bool* retransmitted);
 
   // Enable a max filter on the jitter estimate by setting an initial
   // non-zero delay.
@@ -174,6 +171,10 @@
   };
   typedef std::set<uint16_t, SequenceNumberLessThan> SequenceNumberSet;
 
+  // Gets the frame assigned to the timestamp of the packet. May recycle
+  // existing frames if no free frames are available. Returns an error code if
+  // failing, or kNoError on success.
+  VCMFrameBufferEnum GetFrame(const VCMPacket& packet, VCMFrameBuffer** frame);
   // Returns true if the NACK list was updated to cover sequence numbers up to
   // |sequence_number|. If false a key frame is needed to get into a state where
   // we can continue decoding.
@@ -264,7 +265,7 @@
   VCMFrameBuffer* frame_buffers_[kMaxNumberOfFrames];
   FrameList frame_list_;
   VCMDecodingState last_decoded_state_;
-  bool first_packet_;
+  bool first_packet_since_reset_;
 
   // Statistics.
   int num_not_decodable_packets_;
diff --git a/webrtc/modules/video_coding/main/source/jitter_buffer_common.h b/webrtc/modules/video_coding/main/source/jitter_buffer_common.h
index e935c32..9ecd927 100644
--- a/webrtc/modules/video_coding/main/source/jitter_buffer_common.h
+++ b/webrtc/modules/video_coding/main/source/jitter_buffer_common.h
@@ -28,7 +28,9 @@
 };
 
 enum VCMFrameBufferEnum {
-  kStateError           = -4,
+  kNotInitialized       = -6,
+  kOldPacket            = -5,
+  kGeneralError         = -4,
   kFlushIndicator       = -3,   // Indicator that a flush has occurred.
   kTimeStampError       = -2,
   kSizeError            = -1,
diff --git a/webrtc/modules/video_coding/main/source/jitter_buffer_unittest.cc b/webrtc/modules/video_coding/main/source/jitter_buffer_unittest.cc
index e1fa12f..5521093 100644
--- a/webrtc/modules/video_coding/main/source/jitter_buffer_unittest.cc
+++ b/webrtc/modules/video_coding/main/source/jitter_buffer_unittest.cc
@@ -143,28 +143,24 @@
 
   VCMFrameBufferEnum InsertPacketAndPop(int index) {
     VCMPacket packet;
-    VCMEncodedFrame* frame;
-
     packet.dataPtr = data_buffer_;
     bool packet_available = stream_generator_->PopPacket(&packet, index);
     EXPECT_TRUE(packet_available);
     if (!packet_available)
-      return kStateError;  // Return here to avoid crashes below.
-    EXPECT_EQ(VCM_OK, jitter_buffer_->GetFrame(packet, frame));
-    return jitter_buffer_->InsertPacket(frame, packet);
+      return kGeneralError;  // Return here to avoid crashes below.
+    bool retransmitted = false;
+    return jitter_buffer_->InsertPacket(packet, &retransmitted);
   }
 
   VCMFrameBufferEnum InsertPacket(int index) {
     VCMPacket packet;
-    VCMEncodedFrame* frame;
-
     packet.dataPtr = data_buffer_;
     bool packet_available = stream_generator_->GetPacket(&packet, index);
     EXPECT_TRUE(packet_available);
     if (!packet_available)
-      return kStateError;  // Return here to avoid crashes below.
-    EXPECT_EQ(VCM_OK, jitter_buffer_->GetFrame(packet, frame));
-    return jitter_buffer_->InsertPacket(frame, packet);
+      return kGeneralError;  // Return here to avoid crashes below.
+    bool retransmitted = false;
+    return jitter_buffer_->InsertPacket(packet, &retransmitted);
   }
 
   VCMFrameBufferEnum InsertFrame(FrameType frame_type) {
@@ -242,15 +238,12 @@
 
 TEST_F(TestBasicJitterBuffer, StopRunning) {
   jitter_buffer_->Stop();
-  EXPECT_EQ(0, jitter_buffer_->GetFrame(*packet_));
   EXPECT_TRUE(NULL == DecodeCompleteFrame());
   EXPECT_TRUE(NULL == DecodeIncompleteFrame());
   jitter_buffer_->Start();
   // Allow decoding with errors.
   jitter_buffer_->DecodeWithErrors(true);
 
-  VCMEncodedFrame* frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_TRUE(frame_in != NULL);
   // No packets inserted.
   EXPECT_TRUE(NULL == DecodeCompleteFrame());
   EXPECT_TRUE(NULL == DecodeIncompleteFrame());
@@ -264,8 +257,9 @@
   packet_->timestamp += 123*90;
 
   // Insert the packet to the jitter buffer and get a frame.
-  VCMEncodedFrame* frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  bool retransmitted = false;
+  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
+                                                           &retransmitted));
   VCMEncodedFrame* frame_out =  DecodeCompleteFrame();
   EXPECT_EQ(0, CheckOutFrame(frame_out, size_, false));
   EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
@@ -276,9 +270,9 @@
   packet_->isFirstPacket = true;
   packet_->markerBit = false;
 
-  VCMEncodedFrame* frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_TRUE(frame_in != NULL);
-  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  bool retransmitted = false;
+  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(*packet_,
+                                                       &retransmitted));
   VCMEncodedFrame* frame_out = DecodeCompleteFrame();
   // Should not be complete.
   EXPECT_TRUE(frame_out == NULL);
@@ -288,10 +282,8 @@
   packet_->markerBit = true;
   packet_->seqNum = seq_num_;
 
-  frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_FALSE(frame_in == NULL);
-
-  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
+                                                           &retransmitted));
 
   frame_out = DecodeCompleteFrame();
   EXPECT_EQ(0, CheckOutFrame(frame_out, 2 * size_, false));
@@ -303,10 +295,10 @@
   packet_->frameType = kVideoFrameKey;
   packet_->isFirstPacket = true;
   packet_->markerBit = false;
-  VCMEncodedFrame* frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_TRUE(frame_in != NULL);
 
-  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  bool retransmitted = false;
+  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(*packet_,
+                                                       &retransmitted));
 
   VCMEncodedFrame* frame_out = DecodeCompleteFrame();
 
@@ -320,10 +312,9 @@
     packet_->isFirstPacket = false;
     packet_->markerBit = false;
     packet_->seqNum = seq_num_;
-    frame_in = jitter_buffer_->GetFrame(*packet_);
-    EXPECT_FALSE(frame_in == NULL);
 
-    EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(frame_in, *packet_));
+    EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
+                                                        &retransmitted));
     loop++;
   } while (loop < 98);
 
@@ -333,10 +324,8 @@
   packet_->markerBit = true;
   packet_->seqNum = seq_num_;
 
-  frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_FALSE(frame_in == NULL);
-
-  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
+                                                           &retransmitted));
 
   frame_out = DecodeCompleteFrame();
 
@@ -350,8 +339,9 @@
   packet_->isFirstPacket = true;
   packet_->markerBit = true;
 
-  VCMEncodedFrame* frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  bool retransmitted = false;
+  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
+                                                           &retransmitted));
   VCMEncodedFrame* frame_out = DecodeCompleteFrame();
   EXPECT_FALSE(frame_out == NULL);
 
@@ -361,10 +351,8 @@
   packet_->frameType = kVideoFrameDelta;
   packet_->timestamp += 33 * 90;
 
-  frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_FALSE(frame_in == NULL);
-
-  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(*packet_,
+                                                       &retransmitted));
 
   frame_out = DecodeCompleteFrame();
 
@@ -377,10 +365,10 @@
   do {
     ++seq_num_;
     packet_->seqNum = seq_num_;
-    frame_in = jitter_buffer_->GetFrame(*packet_);
-    EXPECT_FALSE(frame_in == NULL);
+
     // Insert a packet into a frame.
-    EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(frame_in, *packet_));
+    EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
+                                                        &retransmitted));
     loop++;
   } while (loop < 98);
 
@@ -390,10 +378,8 @@
   packet_->markerBit = true;
   packet_->seqNum = seq_num_;
 
-  frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_FALSE(frame_in == NULL);
-
-  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
+                                                           &retransmitted));
 
   frame_out = DecodeCompleteFrame();
 
@@ -410,10 +396,9 @@
   packet_->seqNum = seq_num_;
   packet_->timestamp = timestamp_;
 
-  VCMEncodedFrame* frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_TRUE(frame_in != NULL);
-
-  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  bool retransmitted = false;
+  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(*packet_,
+                                                       &retransmitted));
 
   VCMEncodedFrame* frame_out = DecodeCompleteFrame();
 
@@ -427,10 +412,8 @@
     packet_->markerBit = false;
     packet_->seqNum = seq_num_;
 
-    frame_in = jitter_buffer_->GetFrame(*packet_);
-    EXPECT_TRUE(frame_in != NULL);
-
-    EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(frame_in, *packet_));
+    EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
+                                                        &retransmitted));
     loop++;
   } while (loop < 98);
 
@@ -440,10 +423,8 @@
   packet_->markerBit = false;
   packet_->seqNum = seq_num_;
 
-  frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_TRUE(frame_in != NULL);
-
-  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
+                                                           &retransmitted));
 
   frame_out = DecodeCompleteFrame();;
 
@@ -457,10 +438,9 @@
   packet_->isFirstPacket = true;
   packet_->markerBit = false;
 
-  VCMEncodedFrame* frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_TRUE(frame_in != NULL);
-
-  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  bool retransmitted = false;
+  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(*packet_,
+                                                       &retransmitted));
 
   VCMEncodedFrame* frame_out = DecodeCompleteFrame();
 
@@ -471,10 +451,8 @@
   packet_->markerBit = true;
   packet_->seqNum = seq_num_;
 
-  frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_TRUE(frame_in != NULL);
-
-  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
+                                                           &retransmitted));
 
   // check that we fail to get frame since seqnum is not continuous
   frame_out = DecodeCompleteFrame();
@@ -488,10 +466,8 @@
   packet_->seqNum = seq_num_;
   packet_->timestamp = timestamp_;
 
-  frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_TRUE(frame_in != NULL);
-
-  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(*packet_,
+                                                       &retransmitted));
 
   frame_out = DecodeCompleteFrame();
 
@@ -503,10 +479,8 @@
   packet_->markerBit = true;
   packet_->seqNum = seq_num_;
 
-  frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_TRUE(frame_in != NULL);
-
-  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
+                                                           &retransmitted));
 
   frame_out = DecodeCompleteFrame();
 
@@ -530,10 +504,9 @@
   packet_->seqNum = seq_num_;
   packet_->timestamp = timestamp_;
 
-  VCMEncodedFrame* frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_TRUE(frame_in != NULL);
-
-  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  bool retransmitted = false;
+  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(*packet_,
+                                                       &retransmitted));
 
   VCMEncodedFrame* frame_out = DecodeCompleteFrame();
 
@@ -542,16 +515,15 @@
   packet_->isFirstPacket = false;
   packet_->markerBit = true;
 
-  frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_TRUE(frame_in != NULL);
-
   // Insert a packet into a frame.
-  EXPECT_EQ(kDuplicatePacket, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  EXPECT_EQ(kDuplicatePacket, jitter_buffer_->InsertPacket(*packet_,
+                                                           &retransmitted));
 
   seq_num_++;
   packet_->seqNum = seq_num_;
 
-  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
+                                                           &retransmitted));
 
   frame_out = DecodeCompleteFrame();
 
@@ -568,10 +540,9 @@
   packet_->timestamp = timestamp_;
   packet_->insertStartCode = true;
 
-  VCMEncodedFrame* frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_TRUE(frame_in != NULL);
-
-  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  bool retransmitted = false;
+  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(*packet_,
+                                                       &retransmitted));
 
   VCMEncodedFrame* frame_out = DecodeCompleteFrame();
 
@@ -583,10 +554,8 @@
   packet_->markerBit = true;
   packet_->seqNum = seq_num_;
 
-  frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_TRUE(frame_in != NULL);
-
-  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
+                                                           &retransmitted));
 
   frame_out = DecodeCompleteFrame();
 
@@ -612,9 +581,10 @@
   packet_->seqNum = seq_num_;
   packet_->timestamp = timestamp_;
   packet_->completeNALU = kNaluStart;
-  VCMEncodedFrame* frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_TRUE(frame_in != NULL);
-  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(frame_in, *packet_));
+
+  bool retransmitted = false;
+  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(*packet_,
+                                                       &retransmitted));
 
   for (int i = 0; i < 11; ++i) {
     webrtc::FrameType frametype = kVideoFrameDelta;
@@ -627,10 +597,8 @@
     packet_->timestamp = timestamp_;
     packet_->completeNALU = kNaluStart;
 
-    frame_in = jitter_buffer_->GetFrame(*packet_);
-    EXPECT_TRUE(frame_in != NULL);
-
-    EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(frame_in, *packet_));
+    EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(*packet_,
+                                                         &retransmitted));
 
     VCMEncodedFrame* frame_out = DecodeCompleteFrame();
 
@@ -643,10 +611,8 @@
     packet_->seqNum = seq_num_;
     packet_->completeNALU = kNaluEnd;
 
-    frame_in = jitter_buffer_->GetFrame(*packet_);
-    EXPECT_TRUE(frame_in != NULL);
-
-    EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(frame_in, *packet_));
+    EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
+                                                        &retransmitted));
 
 
     // Insert an empty (non-media) packet.
@@ -657,10 +623,8 @@
     packet_->completeNALU = kNaluEnd;
     packet_->frameType = kFrameEmpty;
 
-    frame_in = jitter_buffer_->GetFrame(*packet_);
-    EXPECT_TRUE(frame_in != NULL);
-
-    EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(frame_in, *packet_));
+    EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
+                                                        &retransmitted));
 
     frame_out = DecodeIncompleteFrame();
 
@@ -687,16 +651,19 @@
   // Match value to actual latest timestamp decoded.
   timestamp_ -= 33 * 90;
   packet_->timestamp = timestamp_ - 1000;
-  frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_TRUE(frame_in == NULL);
+
+  EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_,
+                                                     &retransmitted));
 
   packet_->timestamp = timestamp_ - 500;
-  frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_TRUE(frame_in == NULL);
+
+  EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_,
+                                                     &retransmitted));
 
   packet_->timestamp = timestamp_ - 100;
-  frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_TRUE(frame_in == NULL);
+
+  EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_,
+                                                     &retransmitted));
 
   EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
 
@@ -714,10 +681,9 @@
   packet_->seqNum = seq_num_;
   packet_->timestamp = timestamp_;
 
-  VCMEncodedFrame* frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_TRUE(frame_in != NULL);
-
-  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  bool retransmitted = false;
+  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(*packet_,
+                                                       &retransmitted));
 
   VCMEncodedFrame* frame_out = DecodeCompleteFrame();
 
@@ -730,10 +696,8 @@
     packet_->markerBit = false;
     packet_->seqNum = seq_num_;
 
-    frame_in = jitter_buffer_->GetFrame(*packet_);
-    EXPECT_TRUE(frame_in != NULL);
-
-    EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(frame_in, *packet_));
+    EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
+                                                        &retransmitted));
 
     frame_out = DecodeCompleteFrame();
 
@@ -747,10 +711,8 @@
   packet_->markerBit = true;
   packet_->seqNum = seq_num_;
 
-  frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_TRUE(frame_in != NULL);
-
-  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
+                                                           &retransmitted));
 
   frame_out = DecodeCompleteFrame();
 
@@ -767,10 +729,9 @@
   packet_->markerBit = true;
   packet_->seqNum = seq_num_;
 
-  VCMEncodedFrame* frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_TRUE(frame_in != NULL);
-
-  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  bool retransmitted = false;
+  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(*packet_,
+                                                       &retransmitted));
   VCMEncodedFrame* frame_out = DecodeCompleteFrame();
 
   // Should not be complete.
@@ -784,10 +745,8 @@
     packet_->markerBit = false;
     packet_->seqNum = seq_num_;
 
-    frame_in = jitter_buffer_->GetFrame(*packet_);
-    EXPECT_TRUE(frame_in != NULL);
-
-    EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(frame_in, *packet_));
+    EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
+                                                        &retransmitted));
 
     frame_out = DecodeCompleteFrame();
 
@@ -802,10 +761,8 @@
   packet_->markerBit = false;
   packet_->seqNum = seq_num_;
 
-  frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_TRUE(frame_in != NULL);
-
-  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
+                                                           &retransmitted));
 
   frame_out = DecodeCompleteFrame();
   EXPECT_EQ(0, CheckOutFrame(frame_out, 100 * size_, false));
@@ -825,10 +782,9 @@
   packet_->timestamp = timestamp_;
   packet_->seqNum = seq_num_;
 
-  VCMEncodedFrame* frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_TRUE(frame_in != NULL);
-
-  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  bool retransmitted = false;
+  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
+                                                           &retransmitted));
 
   VCMEncodedFrame* frame_out = DecodeCompleteFrame();
   EXPECT_EQ(3000u, frame_out->TimeStamp());
@@ -847,10 +803,8 @@
   packet_->seqNum = seq_num_;
   packet_->timestamp = timestamp_;
 
-  frame_in = jitter_buffer_->GetFrame(*packet_);
-  // Changed behavior, never insert packets into frames older than the
-  // last decoded frame.
-  EXPECT_TRUE(frame_in == NULL);
+  EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_,
+                                                     &retransmitted));
 }
 
 TEST_F(TestBasicJitterBuffer, TestInsertOldFrameWithSeqNumWrap) {
@@ -867,10 +821,9 @@
   packet_->seqNum = seq_num_;
   packet_->timestamp = timestamp_;
 
-  VCMEncodedFrame* frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_TRUE(frame_in != NULL);
-
-  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  bool retransmitted = false;
+  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
+                                                           &retransmitted));
 
   VCMEncodedFrame* frame_out = DecodeCompleteFrame();
   EXPECT_EQ(timestamp_, frame_out->TimeStamp());
@@ -889,9 +842,10 @@
   packet_->seqNum = seq_num_;
   packet_->timestamp = timestamp_;
 
-  frame_in = jitter_buffer_->GetFrame(*packet_);
+
   // This timestamp is old.
-  EXPECT_TRUE(frame_in == NULL);
+  EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_,
+                                                     &retransmitted));
 }
 
 TEST_F(TestBasicJitterBuffer, TimestampWrap) {
@@ -907,10 +861,9 @@
   packet_->seqNum = seq_num_;
   packet_->timestamp = timestamp_;
 
-  VCMEncodedFrame* frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_TRUE(frame_in != NULL);
-
-  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  bool retransmitted = false;
+  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(*packet_,
+                                                       &retransmitted));
 
   VCMEncodedFrame* frame_out = DecodeCompleteFrame();
 
@@ -921,10 +874,8 @@
   packet_->markerBit = true;
   packet_->seqNum = seq_num_;
 
-  frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_TRUE(frame_in != NULL);
-
-  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
+                                                           &retransmitted));
 
   frame_out = DecodeCompleteFrame();
 
@@ -940,10 +891,8 @@
   packet_->seqNum = seq_num_;
   packet_->timestamp = timestamp_;
 
-  frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_TRUE(frame_in != NULL);
-
-  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(*packet_,
+                                                       &retransmitted));
 
   frame_out = DecodeCompleteFrame();
 
@@ -954,10 +903,8 @@
   packet_->markerBit = true;
   packet_->seqNum = seq_num_;
 
-  frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_TRUE(frame_in != NULL);
-
-  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
+                                                           &retransmitted));
 
   frame_out = DecodeCompleteFrame();
 
@@ -978,11 +925,10 @@
   packet_->markerBit = true;
   packet_->timestamp = timestamp_;
 
-  VCMEncodedFrame* frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_TRUE(frame_in != NULL);
-
+  bool retransmitted = false;
   // Insert first frame (session will be complete).
-  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
+                                                           &retransmitted));
 
   // Insert next frame.
   seq_num_++;
@@ -993,10 +939,8 @@
   packet_->seqNum = seq_num_;
   packet_->timestamp = timestamp_;
 
-  frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_TRUE(frame_in != NULL);
-
-  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
+                                                           &retransmitted));
 
   VCMEncodedFrame* frame_out = DecodeCompleteFrame();
   EXPECT_EQ(0xffffff00, frame_out->TimeStamp());
@@ -1027,10 +971,9 @@
   packet_->seqNum = seq_num_;
   packet_->timestamp = timestamp_;
 
-  VCMEncodedFrame* frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_TRUE(frame_in != NULL);
-
-  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  bool retransmitted = false;
+  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
+                                                           &retransmitted));
 
   // Insert second frame
   seq_num_--;
@@ -1041,10 +984,8 @@
   packet_->seqNum = seq_num_;
   packet_->timestamp = timestamp_;
 
-  frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_TRUE(frame_in != NULL);
-
-  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
+                                                           &retransmitted));
 
   VCMEncodedFrame* frame_out = DecodeCompleteFrame();
   EXPECT_EQ(0xffffff00, frame_out->TimeStamp());
@@ -1064,7 +1005,7 @@
 TEST_F(TestBasicJitterBuffer, DeltaFrameWithMoreThanMaxNumberOfPackets) {
   int loop = 0;
   bool firstPacket = true;
-  VCMEncodedFrame* frame_in;
+  bool retransmitted = false;
   // Insert kMaxPacketsInJitterBuffer into frame.
   do {
     seq_num_++;
@@ -1072,14 +1013,13 @@
     packet_->markerBit = false;
     packet_->seqNum = seq_num_;
 
-    frame_in = jitter_buffer_->GetFrame(*packet_);
-    EXPECT_TRUE(frame_in != NULL);
-
     if (firstPacket) {
-      EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(frame_in, *packet_));
+      EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(*packet_,
+                                                           &retransmitted));
       firstPacket = false;
     } else {
-      EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(frame_in, *packet_));
+      EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
+                                                          &retransmitted));
     }
 
     loop++;
@@ -1092,10 +1032,9 @@
   packet_->markerBit = true;
   packet_->seqNum = seq_num_;
 
-  frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_TRUE(frame_in != NULL);
   // Insert the packet -> frame recycled.
-  EXPECT_EQ(kSizeError, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  EXPECT_EQ(kSizeError, jitter_buffer_->InsertPacket(*packet_,
+                                                     &retransmitted));
   EXPECT_TRUE(NULL == DecodeCompleteFrame());
 
 }
@@ -1111,9 +1050,8 @@
 
   int loop = 0;
   seq_num_ = 65485;
-  VCMEncodedFrame* ptrLastDeltaFrame = NULL;
-  VCMEncodedFrame* ptrFirstKeyFrame = NULL;
-  VCMEncodedFrame* frame_in;
+  uint32_t first_key_frame_timestamp = 0;
+  bool retransmitted = false;
   // Insert MAX_NUMBER_OF_FRAMES frames.
   do {
     timestamp_ += 33*90;
@@ -1123,20 +1061,14 @@
     packet_->seqNum = seq_num_;
     packet_->timestamp = timestamp_;
 
-    frame_in = jitter_buffer_->GetFrame(*packet_);
-    EXPECT_TRUE(frame_in != NULL);
-
-    if (loop == 49) {  // last delta
-      ptrLastDeltaFrame = frame_in;
-    }
-    if (loop == 50) {  // first key
-      ptrFirstKeyFrame = frame_in;
+    if (loop == 50) {
+      first_key_frame_timestamp = packet_->timestamp;
       packet_->frameType = kVideoFrameKey;
     }
 
     // Insert frame.
-    EXPECT_EQ(kCompleteSession,
-        jitter_buffer_->InsertPacket(frame_in, *packet_));
+    EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
+                                                             &retransmitted));
 
     loop++;
   } while (loop < kMaxNumberOfFrames);
@@ -1152,14 +1084,11 @@
   packet_->timestamp = timestamp_;
 
   // Now, no free frame - frames will be recycled until first key frame.
-  frame_in = jitter_buffer_->GetFrame(*packet_);
-  // Pointer to last inserted delta frame should be returned.
-  EXPECT_TRUE(frame_in != NULL && frame_in && ptrLastDeltaFrame);
+  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
+                                                           &retransmitted));
 
-  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(frame_in, *packet_));
-
-  VCMEncodedFrame* frame_out = DecodeCompleteFrame();;
-  EXPECT_EQ(ptrFirstKeyFrame, frame_out);
+  VCMEncodedFrame* frame_out = DecodeCompleteFrame();
+  EXPECT_EQ(first_key_frame_timestamp, frame_out->TimeStamp());
 
   EXPECT_EQ(0, CheckOutFrame(frame_out, size_, false));
 
@@ -1172,6 +1101,7 @@
   // Insert one empty packet per frame, should never return the last timestamp
   // inserted. Only return empty frames in the presence of subsequent frames.
   int maxSize = 1000;
+  bool retransmitted = false;
   for (int i = 0; i < maxSize + 10; i++) {
     timestamp_ += 33 * 90;
     seq_num_++;
@@ -1180,8 +1110,9 @@
     packet_->seqNum = seq_num_;
     packet_->timestamp = timestamp_;
     packet_->frameType = kFrameEmpty;
-    VCMEncodedFrame* frame_in = jitter_buffer_->GetFrame(*packet_);
-    EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(frame_in, *packet_));
+
+    EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(*packet_,
+                                                         &retransmitted));
     VCMEncodedFrame* testFrame = DecodeIncompleteFrame();
     // Timestamp should never be the last TS inserted.
     if (testFrame != NULL) {
@@ -1202,10 +1133,10 @@
   packet_->isFirstPacket = true;
   packet_->completeNALU = kNaluStart;
   packet_->markerBit = false;
+  bool retransmitted = false;
 
-  VCMEncodedFrame* frame_in = jitter_buffer_->GetFrame(*packet_);
-
-  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(*packet_,
+                                                       &retransmitted));
 
   seq_num_ += 2; // Skip one packet
   packet_->seqNum = seq_num_;
@@ -1214,7 +1145,8 @@
   packet_->completeNALU = kNaluIncomplete;
   packet_->markerBit = false;
 
-  EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
+                                                      &retransmitted));
 
   seq_num_++;
   packet_->seqNum = seq_num_;
@@ -1223,13 +1155,15 @@
   packet_->completeNALU = kNaluEnd;
   packet_->markerBit = false;
 
-  EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
+                                                      &retransmitted));
 
   seq_num_++;
   packet_->seqNum = seq_num_;
   packet_->completeNALU = kNaluComplete;
   packet_->markerBit = true; // Last packet
-  EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
+                                                      &retransmitted));
   // The JB will only output (incomplete) frames if a packet belonging to a
   // subsequent frame was already inserted. Insert one packet of a subsequent
   // frame. place high timestamp so the JB would always have a next frame
@@ -1241,8 +1175,9 @@
   packet_->isFirstPacket = false;
   packet_->completeNALU = kNaluStart;
   packet_->markerBit = false;
-  frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(frame_in, *packet_));
+
+  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(*packet_,
+                                                       &retransmitted));
 
   VCMEncodedFrame* frame_out = DecodeIncompleteFrame();
 
@@ -1264,8 +1199,9 @@
   packet_->completeNALU = kNaluEnd;
   packet_->markerBit = false;
 
-  frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(frame_in, *packet_));
+
+  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(*packet_,
+                                                       &retransmitted));
   insertedLength += packet_->sizeBytes; // This packet should be decoded.
 
   seq_num_--;
@@ -1275,7 +1211,8 @@
   packet_->isFirstPacket = true;
   packet_->completeNALU = kNaluStart;
   packet_->markerBit = false;
-  EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
+                                                      &retransmitted));
   insertedLength += packet_->sizeBytes;  // This packet should be decoded.
 
   seq_num_ += 3;  // One packet drop
@@ -1285,7 +1222,8 @@
   packet_->isFirstPacket = false;
   packet_->completeNALU = kNaluComplete;
   packet_->markerBit = false;
-  EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
+                                                      &retransmitted));
   insertedLength += packet_->sizeBytes;  // This packet should be decoded.
 
   seq_num_ += 1;
@@ -1295,7 +1233,8 @@
   packet_->isFirstPacket = false;
   packet_->completeNALU = kNaluStart;
   packet_->markerBit = false;
-  EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
+                                                      &retransmitted));
   // This packet should be decoded since it's the beginning of a NAL.
   insertedLength += packet_->sizeBytes;
 
@@ -1306,7 +1245,8 @@
   packet_->isFirstPacket = false;
   packet_->completeNALU = kNaluEnd;
   packet_->markerBit = true;
-  EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_,
+                                                      &retransmitted));
   // This packet should not be decoded because it is an incomplete NAL if it
   // is the last.
   frame_out = DecodeIncompleteFrame();
@@ -1325,9 +1265,8 @@
   emptypacket.isFirstPacket = true;
   emptypacket.completeNALU = kNaluComplete;
   emptypacket.markerBit = true;
-  frame_in = jitter_buffer_->GetFrame(emptypacket);
-  EXPECT_EQ(kCompleteSession,
-      jitter_buffer_->InsertPacket(frame_in, emptypacket));
+  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(emptypacket,
+                                                           &retransmitted));
   // This packet should not be decoded because it is an incomplete NAL if it
   // is the last.
   insertedLength += 0;
@@ -1347,8 +1286,9 @@
   packet_->isFirstPacket = true;
   packet_->completeNALU = kNaluComplete;
   packet_->markerBit = false;
-  frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(frame_in, *packet_));
+
+  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(*packet_,
+                                                       &retransmitted));
 
   seq_num_ += 1;
   emptypacket.seqNum = seq_num_;
@@ -1357,8 +1297,8 @@
   emptypacket.isFirstPacket = true;
   emptypacket.completeNALU = kNaluComplete;
   emptypacket.markerBit = true;
-  EXPECT_EQ(kCompleteSession,
-      jitter_buffer_->InsertPacket(frame_in, emptypacket));
+  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(emptypacket,
+                                                           &retransmitted));
 
   frame_out = DecodeCompleteFrame();
   // Only last NALU is complete
@@ -1374,8 +1314,10 @@
   packet_->frameType = kVideoFrameKey;
   packet_->isFirstPacket = true;
   packet_->markerBit = true;
-  VCMEncodedFrame* frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(frame_in, *packet_));
+  bool retransmitted = false;
+
+  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_,
+                                                           &retransmitted));
   VCMEncodedFrame* frame_out = DecodeCompleteFrame();
   EXPECT_TRUE(frame_out != NULL);
 
@@ -1385,8 +1327,9 @@
   packet_->isFirstPacket = false;
   packet_->markerBit = false;
 
-  frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(frame_in, *packet_));
+
+  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(*packet_,
+                                                       &retransmitted));
 
   frame_out = DecodeIncompleteFrame();
   EXPECT_TRUE(frame_out == NULL);
@@ -1395,8 +1338,9 @@
   packet_->timestamp += 33 * 90;
   packet_->isFirstPacket = true;
 
-  frame_in = jitter_buffer_->GetFrame(*packet_);
-  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(frame_in, *packet_));
+
+  EXPECT_EQ(kFirstPacket, jitter_buffer_->InsertPacket(*packet_,
+                                                       &retransmitted));
 
   frame_out = DecodeIncompleteFrame();
 
@@ -1563,12 +1507,17 @@
   bool request_key_frame = false;
   uint16_t* nack_list = jitter_buffer_->GetNackList(&nack_list_length,
                                                     &request_key_frame);
-  // Verify that the jitter buffer requests a key frame.
-  EXPECT_TRUE(request_key_frame);
+  // No key frame will be requested since the jitter buffer is empty.
+  EXPECT_FALSE(request_key_frame);
   EXPECT_TRUE(nack_list == NULL);
   EXPECT_EQ(0, nack_list_length);
 
   EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
+  // Verify that the jitter buffer requests a key frame since we need one to
+  // start decoding.
+  EXPECT_FALSE(request_key_frame);
+  EXPECT_TRUE(nack_list == NULL);
+  EXPECT_EQ(0, nack_list_length);
   // Waiting for a key frame.
   EXPECT_FALSE(DecodeCompleteFrame());
   EXPECT_FALSE(DecodeIncompleteFrame());
@@ -1614,10 +1563,17 @@
   uint16_t nack_list_length = max_nack_list_size_;
   bool request_key_frame = false;
   jitter_buffer_->GetNackList(&nack_list_length, &request_key_frame);
-  // Verify that the jitter buffer requests a key frame.
-  EXPECT_TRUE(request_key_frame);
+  // The jitter buffer is empty, so we won't request key frames until we get a
+  // packet.
+  EXPECT_FALSE(request_key_frame);
 
   EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
+  // Now we have a packet in the jitter buffer, a key frame will be requested
+  // since it's not a key frame.
+  jitter_buffer_->GetNackList(&nack_list_length, &request_key_frame);
+  // The jitter buffer is empty, so we won't request key frames until we get a
+  // packet.
+  EXPECT_TRUE(request_key_frame);
   // The next complete continuous frame isn't a key frame, but we're waiting
   // for one.
   EXPECT_FALSE(DecodeCompleteFrame());
diff --git a/webrtc/modules/video_coding/main/source/packet.cc b/webrtc/modules/video_coding/main/source/packet.cc
index 10eba70..4604572 100644
--- a/webrtc/modules/video_coding/main/source/packet.cc
+++ b/webrtc/modules/video_coding/main/source/packet.cc
@@ -28,12 +28,14 @@
     isFirstPacket(false),
     completeNALU(kNaluUnset),
     insertStartCode(false),
+    width(0),
+    height(0),
     codecSpecificHeader() {
 }
 
 VCMPacket::VCMPacket(const uint8_t* ptr,
-                               const uint32_t size,
-                               const WebRtcRTPHeader& rtpHeader) :
+                     const uint32_t size,
+                     const WebRtcRTPHeader& rtpHeader) :
     payloadType(rtpHeader.header.payloadType),
     timestamp(rtpHeader.header.timestamp),
     seqNum(rtpHeader.header.sequenceNumber),
@@ -46,6 +48,8 @@
     isFirstPacket(rtpHeader.type.Video.isFirstPacket),
     completeNALU(kNaluComplete),
     insertStartCode(false),
+    width(rtpHeader.type.Video.width),
+    height(rtpHeader.type.Video.height),
     codecSpecificHeader(rtpHeader.type.Video)
 {
     CopyCodecSpecifics(rtpHeader.type.Video);
@@ -64,6 +68,8 @@
     isFirstPacket(false),
     completeNALU(kNaluComplete),
     insertStartCode(false),
+    width(0),
+    height(0),
     codecSpecificHeader()
 {}
 
@@ -79,6 +85,8 @@
   isFirstPacket = false;
   completeNALU = kNaluUnset;
   insertStartCode = false;
+  width = 0;
+  height = 0;
   memset(&codecSpecificHeader, 0, sizeof(RTPVideoHeader));
 }
 
diff --git a/webrtc/modules/video_coding/main/source/packet.h b/webrtc/modules/video_coding/main/source/packet.h
index 91c4465..54cd00f 100644
--- a/webrtc/modules/video_coding/main/source/packet.h
+++ b/webrtc/modules/video_coding/main/source/packet.h
@@ -45,6 +45,8 @@
     VCMNaluCompleteness completeNALU;   // Default is kNaluIncomplete.
     bool insertStartCode;               // True if a start code should be inserted before this
                                         // packet.
+    int width;
+    int height;
     RTPVideoHeader codecSpecificHeader;
 
 protected:
diff --git a/webrtc/modules/video_coding/main/source/receiver.cc b/webrtc/modules/video_coding/main/source/receiver.cc
index 41ccf5f..89383ea 100644
--- a/webrtc/modules/video_coding/main/source/receiver.cc
+++ b/webrtc/modules/video_coding/main/source/receiver.cc
@@ -77,66 +77,36 @@
 int32_t VCMReceiver::InsertPacket(const VCMPacket& packet,
                                   uint16_t frame_width,
                                   uint16_t frame_height) {
-  // Find an empty frame.
-  VCMEncodedFrame* buffer = NULL;
-  const int32_t error = jitter_buffer_.GetFrame(packet, buffer);
-  if (error == VCM_OLD_PACKET_ERROR) {
+  // Insert the packet into the jitter buffer. The packet can either be empty or
+  // contain media at this point.
+  bool retransmitted = false;
+  const VCMFrameBufferEnum ret = jitter_buffer_.InsertPacket(packet,
+                                                             &retransmitted);
+  if (ret == kOldPacket) {
     return VCM_OK;
-  } else if (error != VCM_OK) {
-    return error;
+  } else if (ret == kFlushIndicator) {
+    return VCM_FLUSH_INDICATOR;
+  } else if (ret < 0) {
+    WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCoding,
+                 VCMId(vcm_id_, receiver_id_),
+                 "Error inserting packet seqnum=%u, timestamp=%u",
+                 packet.seqNum, packet.timestamp);
+    return VCM_JITTER_BUFFER_ERROR;
   }
-  assert(buffer);
-  {
-    CriticalSectionScoped cs(crit_sect_);
-
-    if (frame_width && frame_height) {
-      buffer->SetEncodedSize(static_cast<uint32_t>(frame_width),
-                             static_cast<uint32_t>(frame_height));
-    }
-
-    if (master_) {
-      // Only trace the primary receiver to make it possible to parse and plot
-      // the trace file.
-      WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceVideoCoding,
-                   VCMId(vcm_id_, receiver_id_),
-                   "Packet seq_no %u of frame %u at %u",
-                   packet.seqNum, packet.timestamp,
-                   MaskWord64ToUWord32(clock_->TimeInMilliseconds()));
-    }
-    // First packet received belonging to this frame.
-    if (buffer->Length() == 0 && master_) {
-      const int64_t now_ms = clock_->TimeInMilliseconds();
-      // Only trace the primary receiver to make it possible to parse and plot
-      // the trace file.
-      WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceVideoCoding,
-          VCMId(vcm_id_, receiver_id_),
-          "First packet of frame %u at %u", packet.timestamp,
-          MaskWord64ToUWord32(now_ms));
-    }
-
-    // Insert packet into the jitter buffer both media and empty packets.
-    const VCMFrameBufferEnum
-    ret = jitter_buffer_.InsertPacket(buffer, packet);
-    if (ret == kCompleteSession) {
-      bool retransmitted = false;
-      const int64_t last_packet_time_ms =
-         jitter_buffer_.LastPacketTime(buffer, &retransmitted);
-      if (last_packet_time_ms >= 0 && !retransmitted) {
-        // We don't want to include timestamps which have suffered from
-        // retransmission here, since we compensate with extra retransmission
-        // delay within the jitter estimate.
-        timing_->IncomingTimestamp(packet.timestamp, last_packet_time_ms);
-      }
-    }
-    if (ret == kFlushIndicator) {
-      return VCM_FLUSH_INDICATOR;
-    } else if (ret < 0) {
-      WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCoding,
-                   VCMId(vcm_id_, receiver_id_),
-                   "Error inserting packet seq_no=%u, time_stamp=%u",
-                   packet.seqNum, packet.timestamp);
-      return VCM_JITTER_BUFFER_ERROR;
-    }
+  if (ret == kCompleteSession && !retransmitted) {
+    // We don't want to include timestamps which have suffered from
+    // retransmission here, since we compensate with extra retransmission
+    // delay within the jitter estimate.
+    timing_->IncomingTimestamp(packet.timestamp, clock_->TimeInMilliseconds());
+  }
+  if (master_) {
+    // Only trace the primary receiver to make it possible to parse and plot
+    // the trace file.
+    WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceVideoCoding,
+                 VCMId(vcm_id_, receiver_id_),
+                 "Packet seqnum=%u timestamp=%u inserted at %u",
+                 packet.seqNum, packet.timestamp,
+                 MaskWord64ToUWord32(clock_->TimeInMilliseconds()));
   }
   return VCM_OK;
 }
diff --git a/webrtc/modules/video_coding/main/source/receiver_unittest.cc b/webrtc/modules/video_coding/main/source/receiver_unittest.cc
index 62b7a99..fee1f8e 100644
--- a/webrtc/modules/video_coding/main/source/receiver_unittest.cc
+++ b/webrtc/modules/video_coding/main/source/receiver_unittest.cc
@@ -47,7 +47,7 @@
     bool packet_available = stream_generator_->GetPacket(&packet, index);
     EXPECT_TRUE(packet_available);
     if (!packet_available)
-      return kStateError;  // Return here to avoid crashes below.
+      return kGeneralError;  // Return here to avoid crashes below.
     // Arbitrary width and height.
     return receiver_.InsertPacket(packet, 640, 480);
   }
@@ -58,7 +58,7 @@
     bool packet_available = stream_generator_->PopPacket(&packet, index);
     EXPECT_TRUE(packet_available);
     if (!packet_available)
-      return kStateError;  // Return here to avoid crashes below.
+      return kGeneralError;  // Return here to avoid crashes below.
     return receiver_.InsertPacket(packet, kWidth, kHeight);
   }