Prepare to replace VideoLayerFrameId with int64_t.
Bug: webrtc:12206
Change-Id: I10bfdefbc95a79e0595956c1a0e688051da6d2b9
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/207180
Reviewed-by: Sam Zackrisson <saza@webrtc.org>
Reviewed-by: Niels Moller <nisse@webrtc.org>
Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org>
Commit-Queue: Philip Eliasson <philipel@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#33265}
diff --git a/modules/video_coding/frame_buffer2.cc b/modules/video_coding/frame_buffer2.cc
index effa7aa..903b9fb 100644
--- a/modules/video_coding/frame_buffer2.cc
+++ b/modules/video_coding/frame_buffer2.cc
@@ -179,8 +179,7 @@
for (size_t i = 0; i < EncodedFrame::kMaxFrameReferences &&
i < next_frame_it->second.frame->num_references;
++i) {
- if (next_frame_it->second.frame->references[i] >=
- frame_it->first.picture_id) {
+ if (next_frame_it->second.frame->references[i] >= frame_it->first) {
has_inter_layer_dependency = true;
break;
}
@@ -262,11 +261,11 @@
// Remove decoded frame and all undecoded frames before it.
if (stats_callback_) {
- unsigned int dropped_frames = std::count_if(
- frames_.begin(), frame_it,
- [](const std::pair<const VideoLayerFrameId, FrameInfo>& frame) {
- return frame.second.frame != nullptr;
- });
+ unsigned int dropped_frames =
+ std::count_if(frames_.begin(), frame_it,
+ [](const std::pair<const int64_t, FrameInfo>& frame) {
+ return frame.second.frame != nullptr;
+ });
if (dropped_frames > 0) {
stats_callback_->OnDroppedFrames(dropped_frames);
}
@@ -371,7 +370,7 @@
bool FrameBuffer::ValidReferences(const EncodedFrame& frame) const {
for (size_t i = 0; i < frame.num_references; ++i) {
- if (frame.references[i] >= frame.id.picture_id)
+ if (frame.references[i] >= frame.Id())
return false;
for (size_t j = i + 1; j < frame.num_references; ++j) {
@@ -397,73 +396,69 @@
MutexLock lock(&mutex_);
- const VideoLayerFrameId& id = frame->id;
- int64_t last_continuous_picture_id =
- !last_continuous_frame_ ? -1 : last_continuous_frame_->picture_id;
+ int64_t last_continuous_frame_id = last_continuous_frame_.value_or(-1);
if (!ValidReferences(*frame)) {
- RTC_LOG(LS_WARNING) << "Frame " << id.picture_id
+ RTC_LOG(LS_WARNING) << "Frame " << frame->Id()
<< " has invalid frame references, dropping frame.";
- return last_continuous_picture_id;
+ return last_continuous_frame_id;
}
if (frames_.size() >= kMaxFramesBuffered) {
if (frame->is_keyframe()) {
- RTC_LOG(LS_WARNING) << "Inserting keyframe " << id.picture_id
+ RTC_LOG(LS_WARNING) << "Inserting keyframe " << frame->Id()
<< " but buffer is full, clearing"
" buffer and inserting the frame.";
ClearFramesAndHistory();
} else {
- RTC_LOG(LS_WARNING) << "Frame " << id.picture_id
+ RTC_LOG(LS_WARNING) << "Frame " << frame->Id()
<< " could not be inserted due to the frame "
"buffer being full, dropping frame.";
- return last_continuous_picture_id;
+ return last_continuous_frame_id;
}
}
auto last_decoded_frame = decoded_frames_history_.GetLastDecodedFrameId();
auto last_decoded_frame_timestamp =
decoded_frames_history_.GetLastDecodedFrameTimestamp();
- if (last_decoded_frame && id <= *last_decoded_frame) {
+ if (last_decoded_frame && frame->Id() <= *last_decoded_frame) {
if (AheadOf(frame->Timestamp(), *last_decoded_frame_timestamp) &&
frame->is_keyframe()) {
- // 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
+ // If this frame has a newer timestamp but an earlier frame id then we
+ // assume there has been a jump in the frame 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.
RTC_LOG(LS_WARNING)
- << "A jump in picture id was detected, clearing buffer.";
+ << "A jump in frame id was detected, clearing buffer.";
ClearFramesAndHistory();
- last_continuous_picture_id = -1;
+ last_continuous_frame_id = -1;
} else {
- RTC_LOG(LS_WARNING) << "Frame " << id.picture_id
- << " inserted after frame "
- << last_decoded_frame->picture_id
+ RTC_LOG(LS_WARNING) << "Frame " << frame->Id() << " inserted after frame "
+ << *last_decoded_frame
<< " was handed off for decoding, dropping frame.";
- return last_continuous_picture_id;
+ return last_continuous_frame_id;
}
}
// Test if inserting this frame would cause the order of the frames to become
// ambiguous (covering more than half the interval of 2^16). This can happen
- // when the picture id make large jumps mid stream.
- if (!frames_.empty() && id < frames_.begin()->first &&
- frames_.rbegin()->first < id) {
- RTC_LOG(LS_WARNING)
- << "A jump in picture id was detected, clearing buffer.";
+ // when the frame id make large jumps mid stream.
+ if (!frames_.empty() && frame->Id() < frames_.begin()->first &&
+ frames_.rbegin()->first < frame->Id()) {
+ RTC_LOG(LS_WARNING) << "A jump in frame id was detected, clearing buffer.";
ClearFramesAndHistory();
- last_continuous_picture_id = -1;
+ last_continuous_frame_id = -1;
}
- auto info = frames_.emplace(id, FrameInfo()).first;
+ auto info = frames_.emplace(frame->Id(), FrameInfo()).first;
if (info->second.frame) {
- return last_continuous_picture_id;
+ return last_continuous_frame_id;
}
if (!UpdateFrameInfoWithIncomingFrame(*frame, info))
- return last_continuous_picture_id;
+ return last_continuous_frame_id;
if (!frame->delayed_by_retransmission())
timing_->IncomingTimestamp(frame->Timestamp(), frame->ReceivedTime());
@@ -480,7 +475,7 @@
if (info->second.num_missing_continuous == 0) {
info->second.continuous = true;
PropagateContinuity(info);
- last_continuous_picture_id = last_continuous_frame_->picture_id;
+ last_continuous_frame_id = *last_continuous_frame_;
// Since we now have new continuous frames there might be a better frame
// to return from NextFrame.
@@ -496,7 +491,7 @@
}
}
- return last_continuous_picture_id;
+ return last_continuous_frame_id;
}
void FrameBuffer::PropagateContinuity(FrameMap::iterator start) {
@@ -549,8 +544,6 @@
bool FrameBuffer::UpdateFrameInfoWithIncomingFrame(const EncodedFrame& frame,
FrameMap::iterator info) {
TRACE_EVENT0("webrtc", "FrameBuffer::UpdateFrameInfoWithIncomingFrame");
- const VideoLayerFrameId& id = frame.id;
-
auto last_decoded_frame = decoded_frames_history_.GetLastDecodedFrameId();
RTC_DCHECK(!last_decoded_frame || *last_decoded_frame < info->first);
@@ -563,23 +556,22 @@
// so that |num_missing_continuous| and |num_missing_decodable| can be
// decremented as frames become continuous/are decoded.
struct Dependency {
- VideoLayerFrameId id;
+ int64_t frame_id;
bool continuous;
};
std::vector<Dependency> not_yet_fulfilled_dependencies;
// Find all dependencies that have not yet been fulfilled.
for (size_t i = 0; i < frame.num_references; ++i) {
- VideoLayerFrameId ref_key(frame.references[i]);
// Does |frame| depend on a frame earlier than the last decoded one?
- if (last_decoded_frame && ref_key <= *last_decoded_frame) {
+ if (last_decoded_frame && frame.references[i] <= *last_decoded_frame) {
// Was that frame decoded? If not, this |frame| will never become
// decodable.
- if (!decoded_frames_history_.WasDecoded(ref_key)) {
+ if (!decoded_frames_history_.WasDecoded(frame.references[i])) {
int64_t now_ms = clock_->TimeInMilliseconds();
if (last_log_non_decoded_ms_ + kLogNonDecodedIntervalMs < now_ms) {
RTC_LOG(LS_WARNING)
- << "Frame " << id.picture_id
+ << "Frame " << frame.Id()
<< " depends on a non-decoded frame more previous than the last "
"decoded frame, dropping frame.";
last_log_non_decoded_ms_ = now_ms;
@@ -587,10 +579,11 @@
return false;
}
} else {
- auto ref_info = frames_.find(ref_key);
+ auto ref_info = frames_.find(frame.references[i]);
bool ref_continuous =
ref_info != frames_.end() && ref_info->second.continuous;
- not_yet_fulfilled_dependencies.push_back({ref_key, ref_continuous});
+ not_yet_fulfilled_dependencies.push_back(
+ {frame.references[i], ref_continuous});
}
}
@@ -601,7 +594,7 @@
if (dep.continuous)
--info->second.num_missing_continuous;
- frames_[dep.id].dependent_frames.push_back(id);
+ frames_[dep.frame_id].dependent_frames.push_back(frame.Id());
}
return true;
@@ -637,11 +630,11 @@
void FrameBuffer::ClearFramesAndHistory() {
TRACE_EVENT0("webrtc", "FrameBuffer::ClearFramesAndHistory");
if (stats_callback_) {
- unsigned int dropped_frames = std::count_if(
- frames_.begin(), frames_.end(),
- [](const std::pair<const VideoLayerFrameId, FrameInfo>& frame) {
- return frame.second.frame != nullptr;
- });
+ unsigned int dropped_frames =
+ std::count_if(frames_.begin(), frames_.end(),
+ [](const std::pair<const int64_t, FrameInfo>& frame) {
+ return frame.second.frame != nullptr;
+ });
if (dropped_frames > 0) {
stats_callback_->OnDroppedFrames(dropped_frames);
}