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)25void 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)40AnalyzingVideoSinksHelper::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)49void 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)54test::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)62void 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()75void 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