Refactor DefaultEncodedImageDataInjector to let EncodedImage own the data.

Bug: webrtc:9378
Change-Id: I930935b6d4759dfbdb03a4ca2728a8b637997045
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/128577
Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org>
Reviewed-by: Artem Titov <titovartem@webrtc.org>
Commit-Queue: Niels Moller <nisse@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#27181}
diff --git a/test/pc/e2e/analyzer/video/default_encoded_image_data_injector.cc b/test/pc/e2e/analyzer/video/default_encoded_image_data_injector.cc
index 68200cc..a7ae253 100644
--- a/test/pc/e2e/analyzer/video/default_encoded_image_data_injector.cc
+++ b/test/pc/e2e/analyzer/video/default_encoded_image_data_injector.cc
@@ -25,11 +25,6 @@
 // This is 2 bytes for uint16_t frame id itself and 4 bytes for original length
 // of the buffer.
 constexpr int kEncodedImageBufferExpansion = 6;
-constexpr size_t kInitialBufferSize = 2 * 1024;
-// Count of coding entities for which buffers pools will be added on
-// construction.
-constexpr int kPreInitCodingEntitiesCount = 2;
-constexpr size_t kBuffersPoolPerCodingEntity = 256;
 
 struct ExtractionInfo {
   size_t length;
@@ -38,29 +33,16 @@
 
 }  // namespace
 
-DefaultEncodedImageDataInjector::DefaultEncodedImageDataInjector() {
-  for (size_t i = 0;
-       i < kPreInitCodingEntitiesCount * kBuffersPoolPerCodingEntity; ++i) {
-    bufs_pool_.push_back(
-        absl::make_unique<std::vector<uint8_t>>(kInitialBufferSize));
-  }
-}
+DefaultEncodedImageDataInjector::DefaultEncodedImageDataInjector() = default;
 DefaultEncodedImageDataInjector::~DefaultEncodedImageDataInjector() = default;
 
 EncodedImage DefaultEncodedImageDataInjector::InjectData(
     uint16_t id,
     bool discard,
     const EncodedImage& source,
-    int coding_entity_id) {
-  ExtendIfRequired(coding_entity_id);
-
+    int /*coding_entity_id*/) {
   EncodedImage out = source;
-  out.Retain();
-  std::vector<uint8_t>* buffer = NextBuffer();
-  if (buffer->size() < source.size() + kEncodedImageBufferExpansion) {
-    buffer->resize(source.size() + kEncodedImageBufferExpansion);
-  }
-  out.set_buffer(buffer->data(), buffer->size());
+  out.Allocate(source.size() + kEncodedImageBufferExpansion);
   out.set_size(source.size() + kEncodedImageBufferExpansion);
   memcpy(out.data(), source.data(), source.size());
   size_t insertion_pos = source.size();
@@ -80,15 +62,9 @@
 
 EncodedImageExtractionResult DefaultEncodedImageDataInjector::ExtractData(
     const EncodedImage& source,
-    int coding_entity_id) {
-  ExtendIfRequired(coding_entity_id);
-
+    int /*coding_entity_id*/) {
   EncodedImage out = source;
-  std::vector<uint8_t>* buffer = NextBuffer();
-  if (buffer->size() < source.capacity() - kEncodedImageBufferExpansion) {
-    buffer->resize(source.capacity() - kEncodedImageBufferExpansion);
-  }
-  out.set_buffer(buffer->data(), buffer->size());
+  out.Allocate(source.size());
 
   size_t source_pos = source.size() - 1;
   absl::optional<uint16_t> id = absl::nullopt;
@@ -150,36 +126,5 @@
   return EncodedImageExtractionResult{id.value(), out, discard};
 }
 
-void DefaultEncodedImageDataInjector::ExtendIfRequired(int coding_entity_id) {
-  rtc::CritScope crit(&lock_);
-  if (coding_entities_.find(coding_entity_id) != coding_entities_.end()) {
-    // This entity is already known for this injector, so buffers are allocated.
-    return;
-  }
-
-  // New coding entity. We need allocate extra buffers for this encoder/decoder
-  // We will put them into front of the queue to use them first.
-  coding_entities_.insert(coding_entity_id);
-  if (coding_entities_.size() <= kPreInitCodingEntitiesCount) {
-    // Buffers for the first kPreInitCodingEntitiesCount coding entities were
-    // allocated during construction.
-    return;
-  }
-  for (size_t i = 0; i < kBuffersPoolPerCodingEntity; ++i) {
-    bufs_pool_.push_front(
-        absl::make_unique<std::vector<uint8_t>>(kInitialBufferSize));
-  }
-}
-
-std::vector<uint8_t>* DefaultEncodedImageDataInjector::NextBuffer() {
-  rtc::CritScope crit(&lock_);
-  // Get buffer from the front of the queue, return it to the caller and
-  // put in the back
-  std::vector<uint8_t>* out = bufs_pool_.front().get();
-  bufs_pool_.push_back(std::move(bufs_pool_.front()));
-  bufs_pool_.pop_front();
-  return out;
-}
-
 }  // namespace test
 }  // namespace webrtc
diff --git a/test/pc/e2e/analyzer/video/default_encoded_image_data_injector.h b/test/pc/e2e/analyzer/video/default_encoded_image_data_injector.h
index 0758653..2b6846d 100644
--- a/test/pc/e2e/analyzer/video/default_encoded_image_data_injector.h
+++ b/test/pc/e2e/analyzer/video/default_encoded_image_data_injector.h
@@ -54,21 +54,6 @@
 //   3. Make a pass from begin to end copying data to the output basing on
 //      previously extracted length
 // Also it will check, that all extracted ids are equals.
-//
-// Because EncodedImage doesn't take ownership of its buffer, injector will keep
-// ownership of the buffers that will be used for EncodedImages with injected
-// data. This is needed because there is no way to inform the injector that
-// a buffer can be disposed. To address this issue injector will use a pool
-// of buffers in round robin manner and will assume, that when it overlaps
-// the buffer can be disposed.
-//
-// Because single injector can be used for different coding entities (encoders
-// or decoders), it will store a |coding_entity_id| in the set for each
-// coding entity seen and if the new one arrives, it will extend its buffers
-// pool, adding 256 more buffers. During initialization injector will
-// preallocate buffers for 2 coding entities, so 512 buffers with initial size
-// 2KB. If in some point of time bigger buffer will be required, it will be also
-// extended.
 class DefaultEncodedImageDataInjector : public EncodedImageDataInjector,
                                         public EncodedImageDataExtractor {
  public:
@@ -79,25 +64,9 @@
   EncodedImage InjectData(uint16_t id,
                           bool discard,
                           const EncodedImage& source,
-                          int coding_entity_id) override;
+                          int /*coding_entity_id*/) override;
   EncodedImageExtractionResult ExtractData(const EncodedImage& source,
                                            int coding_entity_id) override;
-
- private:
-  void ExtendIfRequired(int coding_entity_id) RTC_LOCKS_EXCLUDED(lock_);
-  std::vector<uint8_t>* NextBuffer() RTC_LOCKS_EXCLUDED(lock_);
-
-  // Because single injector will be used for all encoder and decoders in one
-  // peer and in case of the single process for all encoders and decoders in
-  // another peer, it can be called from different threads. So we need to ensure
-  // that buffers are given consecutively from pools and pool extension won't
-  // be interrupted by getting buffer in other thread.
-  rtc::CriticalSection lock_;
-
-  // Store coding entities for which buffers pool have been already extended.
-  std::set<int> coding_entities_ RTC_GUARDED_BY(lock_);
-  std::deque<std::unique_ptr<std::vector<uint8_t>>> bufs_pool_
-      RTC_GUARDED_BY(lock_);
 };
 
 }  // namespace test