frame_dependencies_calculator.cc (2812B)
1 /* 2 * Copyright (c) 2020 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 #include "modules/video_coding/frame_dependencies_calculator.h" 11 12 #include <cstddef> 13 #include <cstdint> 14 #include <iterator> 15 #include <optional> 16 #include <set> 17 18 #include "absl/algorithm/container.h" 19 #include "absl/container/inlined_vector.h" 20 #include "api/array_view.h" 21 #include "common_video/generic_frame_descriptor/generic_frame_info.h" 22 #include "rtc_base/checks.h" 23 #include "rtc_base/logging.h" 24 25 namespace webrtc { 26 27 absl::InlinedVector<int64_t, 5> FrameDependenciesCalculator::FromBuffersUsage( 28 int64_t frame_id, 29 ArrayView<const CodecBufferUsage> buffers_usage) { 30 absl::InlinedVector<int64_t, 5> dependencies; 31 RTC_DCHECK_GT(buffers_usage.size(), 0); 32 for (const CodecBufferUsage& buffer_usage : buffers_usage) { 33 RTC_CHECK_GE(buffer_usage.id, 0); 34 if (buffers_.size() <= static_cast<size_t>(buffer_usage.id)) { 35 buffers_.resize(buffer_usage.id + 1); 36 } 37 } 38 std::set<int64_t> direct_depenendencies; 39 std::set<int64_t> indirect_depenendencies; 40 41 for (const CodecBufferUsage& buffer_usage : buffers_usage) { 42 if (!buffer_usage.referenced) { 43 continue; 44 } 45 const BufferUsage& buffer = buffers_[buffer_usage.id]; 46 if (buffer.frame_id == std::nullopt) { 47 RTC_LOG(LS_ERROR) << "Odd configuration: frame " << frame_id 48 << " references buffer #" << buffer_usage.id 49 << " that was never updated."; 50 continue; 51 } 52 direct_depenendencies.insert(*buffer.frame_id); 53 indirect_depenendencies.insert(buffer.dependencies.begin(), 54 buffer.dependencies.end()); 55 } 56 // Reduce references: if frame #3 depends on frame #2 and #1, and frame #2 57 // depends on frame #1, then frame #3 needs to depend just on frame #2. 58 // Though this set diff removes only 1 level of indirection, it seems 59 // enough for all currently used structures. 60 absl::c_set_difference(direct_depenendencies, indirect_depenendencies, 61 std::back_inserter(dependencies)); 62 63 // Update buffers. 64 for (const CodecBufferUsage& buffer_usage : buffers_usage) { 65 if (!buffer_usage.updated) { 66 continue; 67 } 68 BufferUsage& buffer = buffers_[buffer_usage.id]; 69 buffer.frame_id = frame_id; 70 buffer.dependencies.assign(direct_depenendencies.begin(), 71 direct_depenendencies.end()); 72 } 73 74 return dependencies; 75 } 76 77 } // namespace webrtc