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/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;
}