Use CodecBufferUsage to determine dependencies.
In this CL: - Assign frame IDs so that simulcast streams share one frame ID space. - Added a CodecBufferUsage class that represent how a particular buffer was used (updated, referenced or both). - Calculate frame dependencies based on the CodecBufferUsage information. Bug: webrtc:10342 Change-Id: I4ed5ad703f9376a7d995c04bb757c7d214865ddb Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/131287 Reviewed-by: Niels Moller <nisse@webrtc.org> Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org> Reviewed-by: Danil Chapovalov <danilchap@webrtc.org> Commit-Queue: Philip Eliasson <philipel@webrtc.org> Cr-Commit-Position: refs/heads/master@{#27784}
This commit is contained in:
@ -505,11 +505,17 @@ void DefaultTemporalLayers::OnEncodeDone(size_t stream_index,
|
||||
RTC_DCHECK_EQ(vp8_info.referencedBuffersCount, 0u);
|
||||
RTC_DCHECK_EQ(vp8_info.updatedBuffersCount, 0u);
|
||||
|
||||
GenericFrameInfo& generic_frame_info = info->generic_frame_info.emplace();
|
||||
|
||||
for (int i = 0; i < static_cast<int>(Vp8FrameConfig::Buffer::kCount); ++i) {
|
||||
bool references = false;
|
||||
bool updates = is_keyframe;
|
||||
|
||||
if (!is_keyframe &&
|
||||
frame_config.References(static_cast<Vp8FrameConfig::Buffer>(i))) {
|
||||
RTC_DCHECK_LT(vp8_info.referencedBuffersCount,
|
||||
arraysize(CodecSpecificInfoVP8::referencedBuffers));
|
||||
references = true;
|
||||
vp8_info.referencedBuffers[vp8_info.referencedBuffersCount++] = i;
|
||||
}
|
||||
|
||||
@ -517,8 +523,12 @@ void DefaultTemporalLayers::OnEncodeDone(size_t stream_index,
|
||||
frame_config.Updates(static_cast<Vp8FrameConfig::Buffer>(i))) {
|
||||
RTC_DCHECK_LT(vp8_info.updatedBuffersCount,
|
||||
arraysize(CodecSpecificInfoVP8::updatedBuffers));
|
||||
updates = true;
|
||||
vp8_info.updatedBuffers[vp8_info.updatedBuffersCount++] = i;
|
||||
}
|
||||
|
||||
if (references || updates)
|
||||
generic_frame_info.encoder_buffers.emplace_back(i, references, updates);
|
||||
}
|
||||
|
||||
// The templates are always present on keyframes, and then refered to by
|
||||
@ -526,10 +536,9 @@ void DefaultTemporalLayers::OnEncodeDone(size_t stream_index,
|
||||
if (is_keyframe) {
|
||||
info->template_structure = GetTemplateStructure(num_layers_);
|
||||
}
|
||||
|
||||
GenericFrameInfo& generic_frame_info = info->generic_frame_info.emplace();
|
||||
generic_frame_info.decode_target_indications =
|
||||
frame.dependency_info.decode_target_indications;
|
||||
generic_frame_info.temporal_id = frame_config.packetizer_temporal_idx;
|
||||
|
||||
if (!frame.expired) {
|
||||
for (Vp8BufferReference buffer : kAllBuffers) {
|
||||
|
||||
@ -305,6 +305,8 @@ void ScreenshareLayers::OnEncodeDone(size_t stream_index,
|
||||
vp8_info.layerSync = false;
|
||||
generic_frame_info.decode_target_indications =
|
||||
GenericFrameInfo::DecodeTargetInfo("S");
|
||||
generic_frame_info.encoder_buffers.emplace_back(
|
||||
0, /*referenced=*/!is_keyframe, /*updated=*/true);
|
||||
} else {
|
||||
int64_t unwrapped_timestamp = time_wrap_handler_.Unwrap(rtp_timestamp);
|
||||
if (dependency_info) {
|
||||
@ -340,10 +342,13 @@ void ScreenshareLayers::OnEncodeDone(size_t stream_index,
|
||||
// Note that |frame_config| is not derefernced if |is_keyframe|,
|
||||
// meaning it's never dereferenced if the optional may be unset.
|
||||
for (int i = 0; i < static_cast<int>(Vp8FrameConfig::Buffer::kCount); ++i) {
|
||||
bool references = false;
|
||||
bool updates = is_keyframe;
|
||||
if (!is_keyframe && dependency_info->frame_config.References(
|
||||
static_cast<Vp8FrameConfig::Buffer>(i))) {
|
||||
RTC_DCHECK_LT(vp8_info.referencedBuffersCount,
|
||||
arraysize(CodecSpecificInfoVP8::referencedBuffers));
|
||||
references = true;
|
||||
vp8_info.referencedBuffers[vp8_info.referencedBuffersCount++] = i;
|
||||
}
|
||||
|
||||
@ -351,8 +356,12 @@ void ScreenshareLayers::OnEncodeDone(size_t stream_index,
|
||||
static_cast<Vp8FrameConfig::Buffer>(i))) {
|
||||
RTC_DCHECK_LT(vp8_info.updatedBuffersCount,
|
||||
arraysize(CodecSpecificInfoVP8::updatedBuffers));
|
||||
updates = true;
|
||||
vp8_info.updatedBuffers[vp8_info.updatedBuffersCount++] = i;
|
||||
}
|
||||
|
||||
if (references || updates)
|
||||
generic_frame_info.encoder_buffers.emplace_back(i, references, updates);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user