xref: /aosp_15_r20/external/webrtc/test/pc/e2e/analyzer/video/analyzing_video_sinks_helper.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 /*
2  *  Copyright (c) 2022 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 "test/pc/e2e/analyzer/video/analyzing_video_sinks_helper.h"
11 
12 #include <memory>
13 #include <set>
14 #include <string>
15 #include <utility>
16 
17 #include "absl/strings/string_view.h"
18 #include "api/test/pclf/media_configuration.h"
19 #include "api/test/video/video_frame_writer.h"
20 #include "rtc_base/synchronization/mutex.h"
21 
22 namespace webrtc {
23 namespace webrtc_pc_e2e {
24 
AddConfig(absl::string_view sender_peer_name,VideoConfig config)25 void AnalyzingVideoSinksHelper::AddConfig(absl::string_view sender_peer_name,
26                                           VideoConfig config) {
27   MutexLock lock(&mutex_);
28   auto it = video_configs_.find(*config.stream_label);
29   if (it == video_configs_.end()) {
30     std::string stream_label = *config.stream_label;
31     video_configs_.emplace(
32         std::move(stream_label),
33         std::pair{std::string(sender_peer_name), std::move(config)});
34   } else {
35     it->second = std::pair{std::string(sender_peer_name), std::move(config)};
36   }
37 }
38 
39 absl::optional<std::pair<std::string, VideoConfig>>
GetPeerAndConfig(absl::string_view stream_label)40 AnalyzingVideoSinksHelper::GetPeerAndConfig(absl::string_view stream_label) {
41   MutexLock lock(&mutex_);
42   auto it = video_configs_.find(std::string(stream_label));
43   if (it == video_configs_.end()) {
44     return absl::nullopt;
45   }
46   return it->second;
47 }
48 
RemoveConfig(absl::string_view stream_label)49 void AnalyzingVideoSinksHelper::RemoveConfig(absl::string_view stream_label) {
50   MutexLock lock(&mutex_);
51   video_configs_.erase(std::string(stream_label));
52 }
53 
AddVideoWriter(std::unique_ptr<test::VideoFrameWriter> video_writer)54 test::VideoFrameWriter* AnalyzingVideoSinksHelper::AddVideoWriter(
55     std::unique_ptr<test::VideoFrameWriter> video_writer) {
56   MutexLock lock(&mutex_);
57   test::VideoFrameWriter* out = video_writer.get();
58   video_writers_.push_back(std::move(video_writer));
59   return out;
60 }
61 
CloseAndRemoveVideoWriters(std::set<test::VideoFrameWriter * > writers_to_close)62 void AnalyzingVideoSinksHelper::CloseAndRemoveVideoWriters(
63     std::set<test::VideoFrameWriter*> writers_to_close) {
64   MutexLock lock(&mutex_);
65   for (auto it = video_writers_.cbegin(); it != video_writers_.cend();) {
66     if (writers_to_close.find(it->get()) != writers_to_close.end()) {
67       (*it)->Close();
68       it = video_writers_.erase(it);
69     } else {
70       ++it;
71     }
72   }
73 }
74 
Clear()75 void AnalyzingVideoSinksHelper::Clear() {
76   MutexLock lock(&mutex_);
77   video_configs_.clear();
78   for (const auto& video_writer : video_writers_) {
79     video_writer->Close();
80   }
81   video_writers_.clear();
82 }
83 
84 }  // namespace webrtc_pc_e2e
85 }  // namespace webrtc
86