Index: webrtc/modules/video_coding/main/source/jitter_buffer.cc |
diff --git a/webrtc/modules/video_coding/main/source/jitter_buffer.cc b/webrtc/modules/video_coding/main/source/jitter_buffer.cc |
index 9156cc1a61dba45624bda8c73da4886fce71b242..49c2325d80a852971edb1dff629b9c5a997e27e7 100644 |
--- a/webrtc/modules/video_coding/main/source/jitter_buffer.cc |
+++ b/webrtc/modules/video_coding/main/source/jitter_buffer.cc |
@@ -125,6 +125,8 @@ VCMJitterBuffer::VCMJitterBuffer(Clock* clock, |
incomplete_frames_(), |
last_decoded_state_(), |
first_packet_since_reset_(true), |
+ last_gof_timestamp_(0), |
+ last_gof_valid_(false), |
stats_callback_(NULL), |
incoming_frame_rate_(0), |
incoming_frame_count_(0), |
@@ -220,6 +222,7 @@ void VCMJitterBuffer::Start() { |
first_packet_since_reset_ = true; |
rtt_ms_ = kDefaultRtt; |
last_decoded_state_.Reset(); |
+ last_gof_valid_ = false; |
} |
void VCMJitterBuffer::Stop() { |
@@ -227,6 +230,8 @@ void VCMJitterBuffer::Stop() { |
UpdateHistograms(); |
running_ = false; |
last_decoded_state_.Reset(); |
+ last_gof_valid_ = false; |
+ |
// Make sure all frames are free and reset. |
for (FrameList::iterator it = decodable_frames_.begin(); |
it != decodable_frames_.end(); ++it) { |
@@ -257,6 +262,7 @@ void VCMJitterBuffer::Flush() { |
decodable_frames_.Reset(&free_frames_); |
incomplete_frames_.Reset(&free_frames_); |
last_decoded_state_.Reset(); // TODO(mikhal): sync reset. |
+ last_gof_valid_ = false; |
num_consecutive_old_packets_ = 0; |
// Also reset the jitter and delay estimates |
jitter_estimate_.Reset(); |
@@ -586,6 +592,38 @@ VCMFrameBufferEnum VCMJitterBuffer::InsertPacket(const VCMPacket& packet, |
return kOldPacket; |
} |
+ if (packet.codec == kVideoCodecVP9) { |
+ // TODO(asapersson): Move this code to appropriate place. |
+ // TODO(asapersson): Handle out of order GOF. |
+ if (packet.codecSpecificHeader.codecHeader.VP9.flexible_mode) { |
+ // TODO(asapersson): Add support for flexible mode. |
+ return kGeneralError; |
+ } |
+ if (packet.codecSpecificHeader.codecHeader.VP9.ss_data_available) { |
+ if (!last_gof_valid_ || |
+ IsNewerTimestamp(packet.timestamp, last_gof_timestamp_)) { |
+ last_gof_.CopyGofInfoVP9( |
+ packet.codecSpecificHeader.codecHeader.VP9.gof); |
+ last_gof_timestamp_ = packet.timestamp; |
+ last_gof_valid_ = true; |
+ } |
+ } |
+ if (last_gof_valid_ && |
+ !packet.codecSpecificHeader.codecHeader.VP9.flexible_mode) { |
+ uint8_t gof_idx = packet.codecSpecificHeader.codecHeader.VP9.gof_idx; |
+ if (gof_idx != kNoGofIdx) { |
+ if (gof_idx >= last_gof_.num_frames_in_gof) { |
+ LOG(LS_WARNING) << "Incorrect gof_idx: " << gof_idx; |
+ return kGeneralError; |
+ } |
+ RTPVideoTypeHeader* hdr = const_cast<RTPVideoTypeHeader*>( |
+ &packet.codecSpecificHeader.codecHeader); |
+ hdr->VP9.temporal_idx = last_gof_.temporal_idx[gof_idx]; |
+ hdr->VP9.temporal_up_switch = last_gof_.temporal_up_switch[gof_idx]; |
+ } |
+ } |
+ } |
+ |
num_consecutive_old_packets_ = 0; |
VCMFrameBuffer* frame; |