Handle per-layer frame drops.
Build superframe out of the nearest non-dropped base layer and current layer. Bug: none Change-Id: I26720ea6de44f27046208b220d03942cd2a3d6c7 Reviewed-on: https://webrtc-review.googlesource.com/64921 Reviewed-by: Rasmus Brandt <brandtr@webrtc.org> Commit-Queue: Sergey Silkin <ssilkin@webrtc.org> Cr-Commit-Position: refs/heads/master@{#22631}
This commit is contained in:
committed by
Commit Bot
parent
88614b0b06
commit
122ba6c050
@ -336,7 +336,7 @@ void VideoProcessor::FrameEncoded(
|
||||
if (!first_encoded_frame_[simulcast_svc_idx] &&
|
||||
config_.NumberOfSpatialLayers() > 1) {
|
||||
for (size_t i = 0; i < simulcast_svc_idx; ++i) {
|
||||
RTC_CHECK_EQ(last_encoded_frame_num_[i], frame_number);
|
||||
RTC_CHECK_LE(last_encoded_frame_num_[i], frame_number);
|
||||
}
|
||||
for (size_t i = simulcast_svc_idx + 1; i < num_simulcast_or_spatial_layers_;
|
||||
++i) {
|
||||
@ -371,8 +371,8 @@ void VideoProcessor::FrameEncoded(
|
||||
frame_stat->max_nalu_size_bytes = GetMaxNaluSizeBytes(encoded_image, config_);
|
||||
frame_stat->qp = encoded_image.qp_;
|
||||
|
||||
const webrtc::EncodedImage* encoded_image_for_decode = &encoded_image;
|
||||
if (config_.decode) {
|
||||
const webrtc::EncodedImage* encoded_image_for_decode = &encoded_image;
|
||||
if (config_.NumberOfSpatialLayers() > 1) {
|
||||
encoded_image_for_decode = MergeAndStoreEncodedImageForSvcDecoding(
|
||||
encoded_image, codec_type, frame_number, simulcast_svc_idx);
|
||||
@ -386,9 +386,9 @@ void VideoProcessor::FrameEncoded(
|
||||
}
|
||||
|
||||
if (encoded_frame_writers_) {
|
||||
RTC_CHECK(
|
||||
encoded_frame_writers_->at(simulcast_svc_idx)
|
||||
->WriteFrame(encoded_image, config_.codec_settings.codecType));
|
||||
RTC_CHECK(encoded_frame_writers_->at(simulcast_svc_idx)
|
||||
->WriteFrame(*encoded_image_for_decode,
|
||||
config_.codec_settings.codecType));
|
||||
}
|
||||
}
|
||||
|
||||
@ -466,11 +466,17 @@ VideoProcessor::MergeAndStoreEncodedImageForSvcDecoding(
|
||||
EncodedImage base_image;
|
||||
RTC_CHECK_EQ(base_image._length, 0);
|
||||
|
||||
// Each SVC layer is decoded with dedicated decoder. Add data of base layers
|
||||
// to current coded frame buffer.
|
||||
// Each SVC layer is decoded with dedicated decoder. Find the nearest
|
||||
// non-dropped base frame and merge it and current frame into superframe.
|
||||
if (simulcast_svc_idx > 0) {
|
||||
base_image = merged_encoded_frames_.at(simulcast_svc_idx - 1);
|
||||
RTC_CHECK_EQ(base_image._timeStamp, encoded_image._timeStamp);
|
||||
for (int base_idx = static_cast<int>(simulcast_svc_idx) - 1; base_idx >= 0;
|
||||
--base_idx) {
|
||||
EncodedImage lower_layer = merged_encoded_frames_.at(base_idx);
|
||||
if (lower_layer._timeStamp == encoded_image._timeStamp) {
|
||||
base_image = lower_layer;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
const size_t payload_size_bytes = base_image._length + encoded_image._length;
|
||||
const size_t buffer_size_bytes =
|
||||
|
||||
Reference in New Issue
Block a user