Clear the FrameBuffer in case of a backward jump in the picture id.

Even though this is against the spec we allow a stream to continue if
a backwards jump in the picture id occurs on a keyframe.

BUG=webrtc:7001, webrtc:5514

Review-Url: https://codereview.webrtc.org/2640793003
Cr-Commit-Position: refs/heads/master@{#16146}
This commit is contained in:
philipel
2017-01-18 05:35:20 -08:00
committed by Commit bot
parent 44303ea0ff
commit fcc600651d
3 changed files with 50 additions and 8 deletions

View File

@ -135,6 +135,7 @@ FrameBuffer::ReturnReason FrameBuffer::NextFrame(
PropagateDecodability(next_frame_it->second);
AdvanceLastDecodedFrame(next_frame_it);
last_decoded_frame_timestamp_ = frame->timestamp;
*frame_out = std::move(frame);
return kFrameFound;
} else {
@ -189,14 +190,27 @@ int FrameBuffer::InsertFrame(std::unique_ptr<FrameObject> frame) {
if (last_decoded_frame_it_ != frames_.end() &&
key < last_decoded_frame_it_->first) {
LOG(LS_WARNING) << "Frame with (picture_id:spatial_id) (" << key.picture_id
<< ":" << static_cast<int>(key.spatial_layer)
<< ") inserted after frame ("
<< last_decoded_frame_it_->first.picture_id << ":"
<< static_cast<int>(
last_decoded_frame_it_->first.spatial_layer)
<< ") was handed off for decoding, dropping frame.";
return last_continuous_picture_id;
if (AheadOf(frame->timestamp, last_decoded_frame_timestamp_) &&
frame->num_references == 0) {
// If this frame has a newer timestamp but an earlier picture id then we
// assume there has been a jump in the picture id due to some encoder
// reconfiguration or some other reason. Even though this is not according
// to spec we can still continue to decode from this frame if it is a
// keyframe.
LOG(LS_WARNING) << "A jump in picture id was detected, clearing buffer.";
ClearFramesAndHistory();
last_continuous_picture_id = -1;
} else {
LOG(LS_WARNING) << "Frame with (picture_id:spatial_id) ("
<< key.picture_id << ":"
<< static_cast<int>(key.spatial_layer)
<< ") inserted after frame ("
<< last_decoded_frame_it_->first.picture_id << ":"
<< static_cast<int>(
last_decoded_frame_it_->first.spatial_layer)
<< ") was handed off for decoding, dropping frame.";
return last_continuous_picture_id;
}
}
auto info = frames_.insert(std::make_pair(key, FrameInfo())).first;
@ -390,5 +404,13 @@ void FrameBuffer::UpdateHistograms() const {
}
}
void FrameBuffer::ClearFramesAndHistory() {
frames_.clear();
last_decoded_frame_it_ = frames_.end();
last_continuous_frame_it_ = frames_.end();
num_frames_history_ = 0;
num_frames_buffered_ = 0;
}
} // namespace video_coding
} // namespace webrtc