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);
}
diff --git a/modules/video_coding/frame_buffer2.h b/modules/video_coding/frame_buffer2.h
index 56e2c3c..721668a 100644
--- a/modules/video_coding/frame_buffer2.h
+++ b/modules/video_coding/frame_buffer2.h
@@ -58,7 +58,6 @@
// Insert a frame into the frame buffer. Returns the picture id
// of the last continuous frame or -1 if there is no continuous frame.
- // TODO(philipel): Return a VideoLayerFrameId and not only the picture id.
int64_t InsertFrame(std::unique_ptr<EncodedFrame> frame);
// Get the next frame for decoding. Will return at latest after
@@ -95,7 +94,7 @@
// Which other frames that have direct unfulfilled dependencies
// on this frame.
- absl::InlinedVector<VideoLayerFrameId, 8> dependent_frames;
+ absl::InlinedVector<int64_t, 8> dependent_frames;
// A frame is continiuous if it has all its referenced/indirectly
// referenced frames.
@@ -115,7 +114,7 @@
std::unique_ptr<EncodedFrame> frame;
};
- using FrameMap = std::map<VideoLayerFrameId, FrameInfo>;
+ using FrameMap = std::map<int64_t, FrameInfo>;
// Check that the references of |frame| are valid.
bool ValidReferences(const EncodedFrame& frame) const;
@@ -178,8 +177,7 @@
VCMJitterEstimator jitter_estimator_ RTC_GUARDED_BY(mutex_);
VCMTiming* const timing_ RTC_GUARDED_BY(mutex_);
VCMInterFrameDelay inter_frame_delay_ RTC_GUARDED_BY(mutex_);
- absl::optional<VideoLayerFrameId> last_continuous_frame_
- RTC_GUARDED_BY(mutex_);
+ absl::optional<int64_t> last_continuous_frame_ RTC_GUARDED_BY(mutex_);
std::vector<FrameMap::iterator> frames_to_decode_ RTC_GUARDED_BY(mutex_);
bool stopped_ RTC_GUARDED_BY(mutex_);
VCMVideoProtection protection_mode_ RTC_GUARDED_BY(mutex_);
diff --git a/modules/video_coding/frame_buffer2_unittest.cc b/modules/video_coding/frame_buffer2_unittest.cc
index 7ec7895..e179dad 100644
--- a/modules/video_coding/frame_buffer2_unittest.cc
+++ b/modules/video_coding/frame_buffer2_unittest.cc
@@ -164,7 +164,7 @@
{rtc::checked_cast<uint16_t>(refs)...}};
auto frame = std::make_unique<FrameObjectFake>();
- frame->id.picture_id = picture_id;
+ frame->SetId(picture_id);
frame->SetSpatialIndex(spatial_layer);
frame->SetTimestamp(ts_ms * 90);
frame->num_references = references.size();
@@ -214,7 +214,7 @@
void CheckFrame(size_t index, int picture_id, int spatial_layer) {
ASSERT_LT(index, frames_.size());
ASSERT_TRUE(frames_[index]);
- ASSERT_EQ(picture_id, frames_[index]->id.picture_id);
+ ASSERT_EQ(picture_id, frames_[index]->Id());
ASSERT_EQ(spatial_layer, frames_[index]->SpatialIndex().value_or(0));
}
@@ -278,7 +278,7 @@
new FrameBuffer(time_controller_.GetClock(), &timing, &stats_callback_));
const VideoPlayoutDelay kPlayoutDelayMs = {0, 0};
std::unique_ptr<FrameObjectFake> test_frame(new FrameObjectFake());
- test_frame->id.picture_id = 0;
+ test_frame->SetId(0);
test_frame->SetPlayoutDelay(kPlayoutDelayMs);
buffer_->InsertFrame(std::move(test_frame));
ExtractFrame(0, false);
@@ -544,7 +544,7 @@
{
std::unique_ptr<FrameObjectFake> frame(new FrameObjectFake());
frame->SetEncodedData(EncodedImageBuffer::Create(kFrameSize));
- frame->id.picture_id = pid;
+ frame->SetId(pid);
frame->SetTimestamp(ts);
frame->num_references = 0;
diff --git a/modules/video_coding/rtp_frame_id_only_ref_finder.cc b/modules/video_coding/rtp_frame_id_only_ref_finder.cc
index 97a9c00..d52b276 100644
--- a/modules/video_coding/rtp_frame_id_only_ref_finder.cc
+++ b/modules/video_coding/rtp_frame_id_only_ref_finder.cc
@@ -21,10 +21,10 @@
std::unique_ptr<RtpFrameObject> frame,
int frame_id) {
frame->SetSpatialIndex(0);
- frame->id.picture_id = unwrapper_.Unwrap(frame_id & (kFrameIdLength - 1));
+ frame->SetId(unwrapper_.Unwrap(frame_id & (kFrameIdLength - 1)));
frame->num_references =
frame->frame_type() == VideoFrameType::kVideoFrameKey ? 0 : 1;
- frame->references[0] = frame->id.picture_id - 1;
+ frame->references[0] = frame->Id() - 1;
RtpFrameReferenceFinder::ReturnVector res;
res.push_back(std::move(frame));
diff --git a/modules/video_coding/rtp_frame_reference_finder.cc b/modules/video_coding/rtp_frame_reference_finder.cc
index 3084b5b..1a99fc2 100644
--- a/modules/video_coding/rtp_frame_reference_finder.cc
+++ b/modules/video_coding/rtp_frame_reference_finder.cc
@@ -177,7 +177,7 @@
void RtpFrameReferenceFinder::HandOffFrames(ReturnVector frames) {
for (auto& frame : frames) {
- frame->id.picture_id += picture_id_offset_;
+ frame->SetId(frame->Id() + picture_id_offset_);
for (size_t i = 0; i < frame->num_references; ++i) {
frame->references[i] += picture_id_offset_;
}
diff --git a/modules/video_coding/rtp_frame_reference_finder_unittest.cc b/modules/video_coding/rtp_frame_reference_finder_unittest.cc
index 958668a..5cdad10 100644
--- a/modules/video_coding/rtp_frame_reference_finder_unittest.cc
+++ b/modules/video_coding/rtp_frame_reference_finder_unittest.cc
@@ -72,7 +72,7 @@
uint16_t Rand() { return rand_.Rand<uint16_t>(); }
void OnCompleteFrame(std::unique_ptr<EncodedFrame> frame) override {
- int64_t pid = frame->id.picture_id;
+ int64_t pid = frame->Id();
uint16_t sidx = *frame->SpatialIndex();
auto frame_it = frames_from_callback_.find(std::make_pair(pid, sidx));
if (frame_it != frames_from_callback_.end()) {
diff --git a/modules/video_coding/rtp_generic_ref_finder.cc b/modules/video_coding/rtp_generic_ref_finder.cc
index f5603e3..7a6d750 100644
--- a/modules/video_coding/rtp_generic_ref_finder.cc
+++ b/modules/video_coding/rtp_generic_ref_finder.cc
@@ -22,7 +22,7 @@
const RTPVideoHeader::GenericDescriptorInfo& descriptor) {
// Frame IDs are unwrapped in the RtpVideoStreamReceiver, no need to unwrap
// them here.
- frame->id.picture_id = descriptor.frame_id;
+ frame->SetId(descriptor.frame_id);
frame->SetSpatialIndex(descriptor.spatial_index);
RtpFrameReferenceFinder::ReturnVector res;
diff --git a/modules/video_coding/rtp_seq_num_only_ref_finder.cc b/modules/video_coding/rtp_seq_num_only_ref_finder.cc
index ad1f775..9b1d07f 100644
--- a/modules/video_coding/rtp_seq_num_only_ref_finder.cc
+++ b/modules/video_coding/rtp_seq_num_only_ref_finder.cc
@@ -86,18 +86,18 @@
// Since keyframes can cause reordering we can't simply assign the
// picture id according to some incrementing counter.
- frame->id.picture_id = frame->last_seq_num();
+ frame->SetId(frame->last_seq_num());
frame->num_references =
frame->frame_type() == VideoFrameType::kVideoFrameDelta;
frame->references[0] = rtp_seq_num_unwrapper_.Unwrap(last_picture_id_gop);
- if (AheadOf<uint16_t>(frame->id.picture_id, last_picture_id_gop)) {
- seq_num_it->second.first = frame->id.picture_id;
- seq_num_it->second.second = frame->id.picture_id;
+ if (AheadOf<uint16_t>(frame->Id(), last_picture_id_gop)) {
+ seq_num_it->second.first = frame->Id();
+ seq_num_it->second.second = frame->Id();
}
- UpdateLastPictureIdWithPadding(frame->id.picture_id);
+ UpdateLastPictureIdWithPadding(frame->Id());
frame->SetSpatialIndex(0);
- frame->id.picture_id = rtp_seq_num_unwrapper_.Unwrap(frame->id.picture_id);
+ frame->SetId(rtp_seq_num_unwrapper_.Unwrap(frame->Id()));
return kHandOff;
}
diff --git a/modules/video_coding/rtp_vp8_ref_finder.cc b/modules/video_coding/rtp_vp8_ref_finder.cc
index 98c21a9..af0e13a 100644
--- a/modules/video_coding/rtp_vp8_ref_finder.cc
+++ b/modules/video_coding/rtp_vp8_ref_finder.cc
@@ -50,14 +50,14 @@
return kDrop;
frame->SetSpatialIndex(0);
- frame->id.picture_id = codec_header.pictureId & 0x7FFF;
+ frame->SetId(codec_header.pictureId & 0x7FFF);
if (last_picture_id_ == -1)
- last_picture_id_ = frame->id.picture_id;
+ last_picture_id_ = frame->Id();
// Clean up info about not yet received frames that are too old.
uint16_t old_picture_id =
- Subtract<kFrameIdLength>(frame->id.picture_id, kMaxNotYetReceivedFrames);
+ Subtract<kFrameIdLength>(frame->Id(), kMaxNotYetReceivedFrames);
auto clean_frames_to = not_yet_received_frames_.lower_bound(old_picture_id);
not_yet_received_frames_.erase(not_yet_received_frames_.begin(),
clean_frames_to);
@@ -67,12 +67,11 @@
}
// Find if there has been a gap in fully received frames and save the picture
// id of those frames in |not_yet_received_frames_|.
- if (AheadOf<uint16_t, kFrameIdLength>(frame->id.picture_id,
- last_picture_id_)) {
+ if (AheadOf<uint16_t, kFrameIdLength>(frame->Id(), last_picture_id_)) {
do {
last_picture_id_ = Add<kFrameIdLength>(last_picture_id_, 1);
not_yet_received_frames_.insert(last_picture_id_);
- } while (last_picture_id_ != frame->id.picture_id);
+ } while (last_picture_id_ != frame->Id());
}
int64_t unwrapped_tl0 = tl0_unwrapper_.Unwrap(codec_header.tl0PicIdx & 0xFF);
@@ -110,8 +109,7 @@
// Is this an old frame that has already been used to update the state? If
// so, drop it.
- if (AheadOrAt<uint16_t, kFrameIdLength>(last_pid_on_layer,
- frame->id.picture_id)) {
+ if (AheadOrAt<uint16_t, kFrameIdLength>(last_pid_on_layer, frame->Id())) {
return kDrop;
}
@@ -128,8 +126,7 @@
// Is this an old frame that has already been used to update the state? If
// so, drop it.
if (last_pid_on_layer != -1 &&
- AheadOrAt<uint16_t, kFrameIdLength>(last_pid_on_layer,
- frame->id.picture_id)) {
+ AheadOrAt<uint16_t, kFrameIdLength>(last_pid_on_layer, frame->Id())) {
return kDrop;
}
@@ -150,7 +147,7 @@
// a layer sync frame has been received after this frame for the same
// base layer frame, drop this frame.
if (AheadOf<uint16_t, kFrameIdLength>(layer_info_it->second[layer],
- frame->id.picture_id)) {
+ frame->Id())) {
return kDrop;
}
@@ -159,14 +156,14 @@
auto not_received_frame_it =
not_yet_received_frames_.upper_bound(layer_info_it->second[layer]);
if (not_received_frame_it != not_yet_received_frames_.end() &&
- AheadOf<uint16_t, kFrameIdLength>(frame->id.picture_id,
+ AheadOf<uint16_t, kFrameIdLength>(frame->Id(),
*not_received_frame_it)) {
return kStash;
}
- if (!(AheadOf<uint16_t, kFrameIdLength>(frame->id.picture_id,
+ if (!(AheadOf<uint16_t, kFrameIdLength>(frame->Id(),
layer_info_it->second[layer]))) {
- RTC_LOG(LS_WARNING) << "Frame with picture id " << frame->id.picture_id
+ RTC_LOG(LS_WARNING) << "Frame with picture id " << frame->Id()
<< " and packet range [" << frame->first_seq_num()
<< ", " << frame->last_seq_num()
<< "] already received, "
@@ -191,17 +188,17 @@
while (layer_info_it != layer_info_.end()) {
if (layer_info_it->second[temporal_idx] != -1 &&
AheadOf<uint16_t, kFrameIdLength>(layer_info_it->second[temporal_idx],
- frame->id.picture_id)) {
+ frame->Id())) {
// The frame was not newer, then no subsequent layer info have to be
// update.
break;
}
- layer_info_it->second[temporal_idx] = frame->id.picture_id;
+ layer_info_it->second[temporal_idx] = frame->Id();
++unwrapped_tl0;
layer_info_it = layer_info_.find(unwrapped_tl0);
}
- not_yet_received_frames_.erase(frame->id.picture_id);
+ not_yet_received_frames_.erase(frame->Id());
UnwrapPictureIds(frame);
}
@@ -233,7 +230,7 @@
void RtpVp8RefFinder::UnwrapPictureIds(RtpFrameObject* frame) {
for (size_t i = 0; i < frame->num_references; ++i)
frame->references[i] = unwrapper_.Unwrap(frame->references[i]);
- frame->id.picture_id = unwrapper_.Unwrap(frame->id.picture_id);
+ frame->SetId(unwrapper_.Unwrap(frame->Id()));
}
void RtpVp8RefFinder::ClearTo(uint16_t seq_num) {
diff --git a/modules/video_coding/rtp_vp9_ref_finder.cc b/modules/video_coding/rtp_vp9_ref_finder.cc
index e1dba9c..89b463a 100644
--- a/modules/video_coding/rtp_vp9_ref_finder.cc
+++ b/modules/video_coding/rtp_vp9_ref_finder.cc
@@ -52,10 +52,10 @@
return kDrop;
frame->SetSpatialIndex(codec_header.spatial_idx);
- frame->id.picture_id = codec_header.picture_id & (kFrameIdLength - 1);
+ frame->SetId(codec_header.picture_id & (kFrameIdLength - 1));
if (last_picture_id_ == -1)
- last_picture_id_ = frame->id.picture_id;
+ last_picture_id_ = frame->Id();
if (codec_header.flexible_mode) {
if (codec_header.num_ref_pics > EncodedFrame::kMaxFrameReferences) {
@@ -63,8 +63,8 @@
}
frame->num_references = codec_header.num_ref_pics;
for (size_t i = 0; i < frame->num_references; ++i) {
- frame->references[i] = Subtract<kFrameIdLength>(frame->id.picture_id,
- codec_header.pid_diff[i]);
+ frame->references[i] =
+ Subtract<kFrameIdLength>(frame->Id(), codec_header.pid_diff[i]);
}
FlattenFrameIdAndRefs(frame, codec_header.inter_layer_predicted);
@@ -104,10 +104,10 @@
current_ss_idx_ = Add<kMaxGofSaved>(current_ss_idx_, 1);
scalability_structures_[current_ss_idx_] = gof;
- scalability_structures_[current_ss_idx_].pid_start = frame->id.picture_id;
- gof_info_.emplace(unwrapped_tl0,
- GofInfo(&scalability_structures_[current_ss_idx_],
- frame->id.picture_id));
+ scalability_structures_[current_ss_idx_].pid_start = frame->Id();
+ gof_info_.emplace(
+ unwrapped_tl0,
+ GofInfo(&scalability_structures_[current_ss_idx_], frame->Id()));
}
const auto gof_info_it = gof_info_.find(unwrapped_tl0);
@@ -118,7 +118,7 @@
if (frame->frame_type() == VideoFrameType::kVideoFrameKey) {
frame->num_references = 0;
- FrameReceivedVp9(frame->id.picture_id, info);
+ FrameReceivedVp9(frame->Id(), info);
FlattenFrameIdAndRefs(frame, codec_header.inter_layer_predicted);
return kHandOff;
}
@@ -134,7 +134,7 @@
info = &gof_info_it->second;
frame->num_references = 0;
- FrameReceivedVp9(frame->id.picture_id, info);
+ FrameReceivedVp9(frame->Id(), info);
FlattenFrameIdAndRefs(frame, codec_header.inter_layer_predicted);
return kHandOff;
} else {
@@ -147,8 +147,8 @@
if (codec_header.temporal_idx == 0) {
gof_info_it = gof_info_
- .emplace(unwrapped_tl0, GofInfo(gof_info_it->second.gof,
- frame->id.picture_id))
+ .emplace(unwrapped_tl0,
+ GofInfo(gof_info_it->second.gof, frame->Id()))
.first;
}
@@ -160,23 +160,23 @@
auto clean_gof_info_to = gof_info_.lower_bound(old_tl0_pic_idx);
gof_info_.erase(gof_info_.begin(), clean_gof_info_to);
- FrameReceivedVp9(frame->id.picture_id, info);
+ FrameReceivedVp9(frame->Id(), info);
// Make sure we don't miss any frame that could potentially have the
// up switch flag set.
- if (MissingRequiredFrameVp9(frame->id.picture_id, *info))
+ if (MissingRequiredFrameVp9(frame->Id(), *info))
return kStash;
if (codec_header.temporal_up_switch)
- up_switch_.emplace(frame->id.picture_id, codec_header.temporal_idx);
+ up_switch_.emplace(frame->Id(), codec_header.temporal_idx);
// Clean out old info about up switch frames.
- uint16_t old_picture_id = Subtract<kFrameIdLength>(frame->id.picture_id, 50);
+ uint16_t old_picture_id = Subtract<kFrameIdLength>(frame->Id(), 50);
auto up_switch_erase_to = up_switch_.lower_bound(old_picture_id);
up_switch_.erase(up_switch_.begin(), up_switch_erase_to);
- size_t diff = ForwardDiff<uint16_t, kFrameIdLength>(info->gof->pid_start,
- frame->id.picture_id);
+ size_t diff =
+ ForwardDiff<uint16_t, kFrameIdLength>(info->gof->pid_start, frame->Id());
size_t gof_idx = diff % info->gof->num_frames_in_gof;
if (info->gof->num_ref_pics[gof_idx] > EncodedFrame::kMaxFrameReferences) {
@@ -185,12 +185,12 @@
// Populate references according to the scalability structure.
frame->num_references = info->gof->num_ref_pics[gof_idx];
for (size_t i = 0; i < frame->num_references; ++i) {
- frame->references[i] = Subtract<kFrameIdLength>(
- frame->id.picture_id, info->gof->pid_diff[gof_idx][i]);
+ frame->references[i] =
+ Subtract<kFrameIdLength>(frame->Id(), info->gof->pid_diff[gof_idx][i]);
// If this is a reference to a frame earlier than the last up switch point,
// then ignore this reference.
- if (UpSwitchInIntervalVp9(frame->id.picture_id, codec_header.temporal_idx,
+ if (UpSwitchInIntervalVp9(frame->Id(), codec_header.temporal_idx,
frame->references[i])) {
--frame->num_references;
}
@@ -330,13 +330,12 @@
unwrapper_.Unwrap(frame->references[i]) * kMaxSpatialLayers +
*frame->SpatialIndex();
}
- frame->id.picture_id =
- unwrapper_.Unwrap(frame->id.picture_id) * kMaxSpatialLayers +
- *frame->SpatialIndex();
+ frame->SetId(unwrapper_.Unwrap(frame->Id()) * kMaxSpatialLayers +
+ *frame->SpatialIndex());
if (inter_layer_predicted &&
frame->num_references + 1 <= EncodedFrame::kMaxFrameReferences) {
- frame->references[frame->num_references] = frame->id.picture_id - 1;
+ frame->references[frame->num_references] = frame->Id() - 1;
++frame->num_references;
}
}
diff --git a/modules/video_coding/rtp_vp9_ref_finder_unittest.cc b/modules/video_coding/rtp_vp9_ref_finder_unittest.cc
index aa883c8..22da1e3 100644
--- a/modules/video_coding/rtp_vp9_ref_finder_unittest.cc
+++ b/modules/video_coding/rtp_vp9_ref_finder_unittest.cc
@@ -163,7 +163,7 @@
MatchResultListener* result_listener) const override {
auto it = std::find_if(frames.begin(), frames.end(),
[this](const std::unique_ptr<EncodedFrame>& f) {
- return f->id.picture_id == frame_id_;
+ return f->Id() == frame_id_;
});
if (it == frames.end()) {
if (result_listener->IsInterested()) {
@@ -635,7 +635,7 @@
ASSERT_EQ(1UL, frames_.size());
const EncodedFrame& frame = *frames_[0];
- ASSERT_EQ(frame.id.picture_id - frame.references[0], 5);
+ ASSERT_EQ(frame.Id() - frame.references[0], 5);
}
TEST_F(RtpVp9RefFinderTest, GofPidJump) {
diff --git a/modules/video_coding/utility/decoded_frames_history.cc b/modules/video_coding/utility/decoded_frames_history.cc
index c72bd05..005bb26 100644
--- a/modules/video_coding/utility/decoded_frames_history.cc
+++ b/modules/video_coding/utility/decoded_frames_history.cc
@@ -23,18 +23,17 @@
DecodedFramesHistory::~DecodedFramesHistory() = default;
-void DecodedFramesHistory::InsertDecoded(const VideoLayerFrameId& frameid,
- uint32_t timestamp) {
- last_decoded_frame_ = frameid;
+void DecodedFramesHistory::InsertDecoded(int64_t frame_id, uint32_t timestamp) {
+ last_decoded_frame_ = frame_id;
last_decoded_frame_timestamp_ = timestamp;
- int new_index = PictureIdToIndex(frameid.picture_id);
+ int new_index = FrameIdToIndex(frame_id);
- RTC_DCHECK(last_picture_id_ < frameid.picture_id);
+ RTC_DCHECK(last_frame_id_ < frame_id);
// Clears expired values from the cyclic buffer_.
- if (last_picture_id_) {
- int64_t id_jump = frameid.picture_id - *last_picture_id_;
- int last_index = PictureIdToIndex(*last_picture_id_);
+ if (last_frame_id_) {
+ int64_t id_jump = frame_id - *last_frame_id_;
+ int last_index = FrameIdToIndex(*last_frame_id_);
if (id_jump >= static_cast<int64_t>(buffer_.size())) {
std::fill(buffer_.begin(), buffer_.end(), false);
@@ -48,36 +47,34 @@
}
buffer_[new_index] = true;
- last_picture_id_ = frameid.picture_id;
+ last_frame_id_ = frame_id;
}
-bool DecodedFramesHistory::WasDecoded(const VideoLayerFrameId& frameid) {
- if (!last_picture_id_)
+bool DecodedFramesHistory::WasDecoded(int64_t frame_id) {
+ if (!last_frame_id_)
return false;
// Reference to the picture_id out of the stored should happen.
- if (frameid.picture_id <=
- *last_picture_id_ - static_cast<int64_t>(buffer_.size())) {
+ if (frame_id <= *last_frame_id_ - static_cast<int64_t>(buffer_.size())) {
RTC_LOG(LS_WARNING) << "Referencing a frame out of the window. "
"Assuming it was undecoded to avoid artifacts.";
return false;
}
- if (frameid.picture_id > last_picture_id_)
+ if (frame_id > last_frame_id_)
return false;
- return buffer_[PictureIdToIndex(frameid.picture_id)];
+ return buffer_[FrameIdToIndex(frame_id)];
}
void DecodedFramesHistory::Clear() {
last_decoded_frame_timestamp_.reset();
last_decoded_frame_.reset();
std::fill(buffer_.begin(), buffer_.end(), false);
- last_picture_id_.reset();
+ last_frame_id_.reset();
}
-absl::optional<VideoLayerFrameId>
-DecodedFramesHistory::GetLastDecodedFrameId() {
+absl::optional<int64_t> DecodedFramesHistory::GetLastDecodedFrameId() {
return last_decoded_frame_;
}
@@ -85,7 +82,7 @@
return last_decoded_frame_timestamp_;
}
-int DecodedFramesHistory::PictureIdToIndex(int64_t frame_id) const {
+int DecodedFramesHistory::FrameIdToIndex(int64_t frame_id) const {
int m = frame_id % buffer_.size();
return m >= 0 ? m : m + buffer_.size();
}
diff --git a/modules/video_coding/utility/decoded_frames_history.h b/modules/video_coding/utility/decoded_frames_history.h
index 23cdfe8..06008dc 100644
--- a/modules/video_coding/utility/decoded_frames_history.h
+++ b/modules/video_coding/utility/decoded_frames_history.h
@@ -27,23 +27,23 @@
// window_size - how much frames back to the past are actually remembered.
explicit DecodedFramesHistory(size_t window_size);
~DecodedFramesHistory();
- // Called for each decoded frame. Assumes picture id's are non-decreasing.
- void InsertDecoded(const VideoLayerFrameId& frameid, uint32_t timestamp);
- // Query if the following (picture_id, spatial_id) pair was inserted before.
- // Should be at most less by window_size-1 than the last inserted picture id.
- bool WasDecoded(const VideoLayerFrameId& frameid);
+ // Called for each decoded frame. Assumes frame id's are non-decreasing.
+ void InsertDecoded(int64_t frame_id, uint32_t timestamp);
+ // Query if the following (frame_id, spatial_id) pair was inserted before.
+ // Should be at most less by window_size-1 than the last inserted frame id.
+ bool WasDecoded(int64_t frame_id);
void Clear();
- absl::optional<VideoLayerFrameId> GetLastDecodedFrameId();
+ absl::optional<int64_t> GetLastDecodedFrameId();
absl::optional<uint32_t> GetLastDecodedFrameTimestamp();
private:
- int PictureIdToIndex(int64_t frame_id) const;
+ int FrameIdToIndex(int64_t frame_id) const;
std::vector<bool> buffer_;
- absl::optional<int64_t> last_picture_id_;
- absl::optional<VideoLayerFrameId> last_decoded_frame_;
+ absl::optional<int64_t> last_frame_id_;
+ absl::optional<int64_t> last_decoded_frame_;
absl::optional<uint32_t> last_decoded_frame_timestamp_;
};
diff --git a/modules/video_coding/utility/decoded_frames_history_unittest.cc b/modules/video_coding/utility/decoded_frames_history_unittest.cc
index 0a62567b..ac09a42 100644
--- a/modules/video_coding/utility/decoded_frames_history_unittest.cc
+++ b/modules/video_coding/utility/decoded_frames_history_unittest.cc
@@ -20,93 +20,93 @@
TEST(DecodedFramesHistory, RequestOnEmptyHistory) {
DecodedFramesHistory history(kHistorySize);
- EXPECT_EQ(history.WasDecoded(VideoLayerFrameId{1234}), false);
+ EXPECT_EQ(history.WasDecoded(1234), false);
}
TEST(DecodedFramesHistory, FindsLastDecodedFrame) {
DecodedFramesHistory history(kHistorySize);
- history.InsertDecoded(VideoLayerFrameId{1234}, 0);
- EXPECT_EQ(history.WasDecoded(VideoLayerFrameId{1234}), true);
+ history.InsertDecoded(1234, 0);
+ EXPECT_EQ(history.WasDecoded(1234), true);
}
TEST(DecodedFramesHistory, FindsPreviousFrame) {
DecodedFramesHistory history(kHistorySize);
- history.InsertDecoded(VideoLayerFrameId{1234}, 0);
- history.InsertDecoded(VideoLayerFrameId{1235}, 0);
- EXPECT_EQ(history.WasDecoded(VideoLayerFrameId{1234}), true);
+ history.InsertDecoded(1234, 0);
+ history.InsertDecoded(1235, 0);
+ EXPECT_EQ(history.WasDecoded(1234), true);
}
TEST(DecodedFramesHistory, ReportsMissingFrame) {
DecodedFramesHistory history(kHistorySize);
- history.InsertDecoded(VideoLayerFrameId{1234}, 0);
- history.InsertDecoded(VideoLayerFrameId{1236}, 0);
- EXPECT_EQ(history.WasDecoded(VideoLayerFrameId{1235}), false);
+ history.InsertDecoded(1234, 0);
+ history.InsertDecoded(1236, 0);
+ EXPECT_EQ(history.WasDecoded(1235), false);
}
TEST(DecodedFramesHistory, ClearsHistory) {
DecodedFramesHistory history(kHistorySize);
- history.InsertDecoded(VideoLayerFrameId{1234}, 0);
+ history.InsertDecoded(1234, 0);
history.Clear();
- EXPECT_EQ(history.WasDecoded(VideoLayerFrameId{1234}), false);
+ EXPECT_EQ(history.WasDecoded(1234), false);
EXPECT_EQ(history.GetLastDecodedFrameId(), absl::nullopt);
EXPECT_EQ(history.GetLastDecodedFrameTimestamp(), absl::nullopt);
}
TEST(DecodedFramesHistory, HandlesBigJumpInPictureId) {
DecodedFramesHistory history(kHistorySize);
- history.InsertDecoded(VideoLayerFrameId{1234}, 0);
- history.InsertDecoded(VideoLayerFrameId{1235}, 0);
- history.InsertDecoded(VideoLayerFrameId{1236}, 0);
- history.InsertDecoded(VideoLayerFrameId{1236 + kHistorySize / 2}, 0);
- EXPECT_EQ(history.WasDecoded(VideoLayerFrameId{1234}), true);
- EXPECT_EQ(history.WasDecoded(VideoLayerFrameId{1237}), false);
+ history.InsertDecoded(1234, 0);
+ history.InsertDecoded(1235, 0);
+ history.InsertDecoded(1236, 0);
+ history.InsertDecoded(1236 + kHistorySize / 2, 0);
+ EXPECT_EQ(history.WasDecoded(1234), true);
+ EXPECT_EQ(history.WasDecoded(1237), false);
}
TEST(DecodedFramesHistory, ForgetsTooOldHistory) {
DecodedFramesHistory history(kHistorySize);
- history.InsertDecoded(VideoLayerFrameId{1234}, 0);
- history.InsertDecoded(VideoLayerFrameId{1235}, 0);
- history.InsertDecoded(VideoLayerFrameId{1236}, 0);
- history.InsertDecoded(VideoLayerFrameId{1236 + kHistorySize * 2}, 0);
- EXPECT_EQ(history.WasDecoded(VideoLayerFrameId{1234}), false);
- EXPECT_EQ(history.WasDecoded(VideoLayerFrameId{1237}), false);
+ history.InsertDecoded(1234, 0);
+ history.InsertDecoded(1235, 0);
+ history.InsertDecoded(1236, 0);
+ history.InsertDecoded(1236 + kHistorySize * 2, 0);
+ EXPECT_EQ(history.WasDecoded(1234), false);
+ EXPECT_EQ(history.WasDecoded(1237), false);
}
TEST(DecodedFramesHistory, ReturnsLastDecodedFrameId) {
DecodedFramesHistory history(kHistorySize);
EXPECT_EQ(history.GetLastDecodedFrameId(), absl::nullopt);
- history.InsertDecoded(VideoLayerFrameId{1234}, 0);
- EXPECT_EQ(history.GetLastDecodedFrameId(), VideoLayerFrameId(1234));
- history.InsertDecoded(VideoLayerFrameId{1235}, 0);
- EXPECT_EQ(history.GetLastDecodedFrameId(), VideoLayerFrameId(1235));
+ history.InsertDecoded(1234, 0);
+ EXPECT_EQ(history.GetLastDecodedFrameId(), 1234);
+ history.InsertDecoded(1235, 0);
+ EXPECT_EQ(history.GetLastDecodedFrameId(), 1235);
}
TEST(DecodedFramesHistory, ReturnsLastDecodedFrameTimestamp) {
DecodedFramesHistory history(kHistorySize);
EXPECT_EQ(history.GetLastDecodedFrameTimestamp(), absl::nullopt);
- history.InsertDecoded(VideoLayerFrameId{1234}, 12345);
+ history.InsertDecoded(1234, 12345);
EXPECT_EQ(history.GetLastDecodedFrameTimestamp(), 12345u);
- history.InsertDecoded(VideoLayerFrameId{1235}, 12366);
+ history.InsertDecoded(1235, 12366);
EXPECT_EQ(history.GetLastDecodedFrameTimestamp(), 12366u);
}
TEST(DecodedFramesHistory, NegativePictureIds) {
DecodedFramesHistory history(kHistorySize);
- history.InsertDecoded(VideoLayerFrameId{-1234}, 12345);
- history.InsertDecoded(VideoLayerFrameId{-1233}, 12366);
- EXPECT_EQ(history.GetLastDecodedFrameId()->picture_id, -1233);
+ history.InsertDecoded(-1234, 12345);
+ history.InsertDecoded(-1233, 12366);
+ EXPECT_EQ(*history.GetLastDecodedFrameId(), -1233);
- history.InsertDecoded(VideoLayerFrameId{-1}, 12377);
- history.InsertDecoded(VideoLayerFrameId{0}, 12388);
- EXPECT_EQ(history.GetLastDecodedFrameId()->picture_id, 0);
+ history.InsertDecoded(-1, 12377);
+ history.InsertDecoded(0, 12388);
+ EXPECT_EQ(*history.GetLastDecodedFrameId(), 0);
- history.InsertDecoded(VideoLayerFrameId{1}, 12399);
- EXPECT_EQ(history.GetLastDecodedFrameId()->picture_id, 1);
+ history.InsertDecoded(1, 12399);
+ EXPECT_EQ(*history.GetLastDecodedFrameId(), 1);
- EXPECT_EQ(history.WasDecoded(VideoLayerFrameId{-1234}), true);
- EXPECT_EQ(history.WasDecoded(VideoLayerFrameId{-1}), true);
- EXPECT_EQ(history.WasDecoded(VideoLayerFrameId{0}), true);
- EXPECT_EQ(history.WasDecoded(VideoLayerFrameId{1}), true);
+ EXPECT_EQ(history.WasDecoded(-1234), true);
+ EXPECT_EQ(history.WasDecoded(-1), true);
+ EXPECT_EQ(history.WasDecoded(0), true);
+ EXPECT_EQ(history.WasDecoded(1), true);
}
} // namespace