In FrameBuffer call stats callback's OnCompleteFrame once per superframe

Bug: webrtc:10461
Change-Id: Ib3b6aeb38cd68e73281f526f8d1a7d8a0b5b1cc6
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/128866
Reviewed-by: Philip Eliasson <philipel@webrtc.org>
Commit-Queue: Ilya Nikolaevskiy <ilnik@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#27295}
This commit is contained in:
Ilya Nikolaevskiy
2019-03-25 11:40:34 +01:00
committed by Commit Bot
parent 225f4f6cbe
commit 48193b065a
2 changed files with 51 additions and 4 deletions

View File

@ -344,16 +344,59 @@ bool FrameBuffer::ValidReferences(const EncodedFrame& frame) const {
return true;
}
bool FrameBuffer::IsCompleteSuperFrame(const EncodedFrame& frame) {
if (frame.inter_layer_predicted) {
// Check that all previous spatial layers are already inserted.
VideoLayerFrameId id = frame.id;
RTC_DCHECK_GT(id.spatial_layer, 0);
--id.spatial_layer;
FrameMap::iterator prev_frame = frames_.find(id);
if (prev_frame == frames_.end())
return false;
while (prev_frame->second.frame->inter_layer_predicted) {
--prev_frame;
--id.spatial_layer;
if (prev_frame == frames_.end() ||
prev_frame->first.picture_id != id.picture_id ||
prev_frame->first.spatial_layer != id.spatial_layer) {
return false;
}
}
}
if (!frame.is_last_spatial_layer) {
// Check that all following spatial layers are already inserted.
VideoLayerFrameId id = frame.id;
++id.spatial_layer;
FrameMap::iterator next_frame = frames_.find(id);
if (next_frame == frames_.end())
return false;
while (!next_frame->second.frame->is_last_spatial_layer) {
++next_frame;
++id.spatial_layer;
if (next_frame == frames_.end() ||
next_frame->first.picture_id != id.picture_id ||
next_frame->first.spatial_layer != id.spatial_layer) {
return false;
}
}
}
return true;
}
int64_t FrameBuffer::InsertFrame(std::unique_ptr<EncodedFrame> frame) {
TRACE_EVENT0("webrtc", "FrameBuffer::InsertFrame");
RTC_DCHECK(frame);
if (stats_callback_)
stats_callback_->OnCompleteFrame(frame->is_keyframe(), frame->size(),
frame->contentType());
const VideoLayerFrameId& id = frame->id;
rtc::CritScope lock(&crit_);
if (stats_callback_ && IsCompleteSuperFrame(*frame)) {
stats_callback_->OnCompleteFrame(frame->is_keyframe(), frame->size(),
frame->contentType());
}
const VideoLayerFrameId& id = frame->id;
int64_t last_continuous_picture_id =
!last_continuous_frame_ ? -1 : last_continuous_frame_->picture_id;