Cleanup unused SCContentFilters in NativeScreenCaptureMac
The SCContentFilters needs to be retained for some time in case the
device is restarted, e.g., when ApplyConstraints is called on a
MediaStreamTrack, so the cleanup is performed after a 60 seconds
delay.
Bug: 5797167
Change-Id: Ia9e63f784dac8add9f44e82297db8cf148a73bdb
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5799872
Commit-Queue: Tove Petersson <tovep@chromium.org>
Reviewed-by: Avi Drissman <avi@chromium.org>
Reviewed-by: Johannes Kron <kron@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1345277}
This commit is contained in:

committed by
Chromium LUCI CQ

parent
191c647a4d
commit
ca7288d56d
@@ -7,6 +7,7 @@
|
|||||||
#import <ScreenCaptureKit/ScreenCaptureKit.h>
|
#import <ScreenCaptureKit/ScreenCaptureKit.h>
|
||||||
|
|
||||||
#include "base/features.h"
|
#include "base/features.h"
|
||||||
|
#include "base/timer/timer.h"
|
||||||
#include "content/browser/media/capture/screen_capture_kit_device_mac.h"
|
#include "content/browser/media/capture/screen_capture_kit_device_mac.h"
|
||||||
#include "content/public/browser/desktop_media_id.h"
|
#include "content/public/browser/desktop_media_id.h"
|
||||||
#include "media/capture/video/video_capture_device.h"
|
#include "media/capture/video/video_capture_device.h"
|
||||||
@@ -100,11 +101,16 @@ class API_AVAILABLE(macos(14.0)) NativeScreenCapturePickerMac
|
|||||||
base::WeakPtr<NativeScreenCapturePicker> GetWeakPtr() override;
|
base::WeakPtr<NativeScreenCapturePicker> GetWeakPtr() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void ScheduleCleanup(DesktopMediaID::Id id);
|
||||||
|
void CleanupContentFilter(DesktopMediaID::Id id);
|
||||||
|
|
||||||
NSMutableDictionary<NSNumber*, PickerObserver*>* __strong picker_observers_;
|
NSMutableDictionary<NSNumber*, PickerObserver*>* __strong picker_observers_;
|
||||||
// Cached content filters are needed so that a stream can be restarted without
|
// Cached content filters are needed so that a stream can be restarted without
|
||||||
// having to show the native picker again.
|
// having to show the native picker again.
|
||||||
NSMutableDictionary<NSNumber*, SCContentFilter*>* __strong
|
NSMutableDictionary<NSNumber*, SCContentFilter*>* __strong
|
||||||
cached_content_filters_;
|
cached_content_filters_;
|
||||||
|
std::unordered_map<DesktopMediaID::Id, base::OneShotTimer>
|
||||||
|
cached_content_filters_cleanup_timers_;
|
||||||
DesktopMediaID::Id next_id_ = 0;
|
DesktopMediaID::Id next_id_ = 0;
|
||||||
SEQUENCE_CHECKER(sequence_checker_);
|
SEQUENCE_CHECKER(sequence_checker_);
|
||||||
base::WeakPtrFactory<NativeScreenCapturePickerMac> weak_ptr_factory_{this};
|
base::WeakPtrFactory<NativeScreenCapturePickerMac> weak_ptr_factory_{this};
|
||||||
@@ -165,6 +171,7 @@ void NativeScreenCapturePickerMac::Open(
|
|||||||
void NativeScreenCapturePickerMac::Close(DesktopMediaID device_id) {
|
void NativeScreenCapturePickerMac::Close(DesktopMediaID device_id) {
|
||||||
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
|
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
|
||||||
if (@available(macOS 14.0, *)) {
|
if (@available(macOS 14.0, *)) {
|
||||||
|
ScheduleCleanup(device_id.id);
|
||||||
NSNumber* source_id = @(device_id.id);
|
NSNumber* source_id = @(device_id.id);
|
||||||
PickerObserver* picker_observer = picker_observers_[source_id];
|
PickerObserver* picker_observer = picker_observers_[source_id];
|
||||||
if (!picker_observer) {
|
if (!picker_observer) {
|
||||||
@@ -187,13 +194,12 @@ std::unique_ptr<media::VideoCaptureDevice>
|
|||||||
NativeScreenCapturePickerMac::CreateDevice(const DesktopMediaID& source) {
|
NativeScreenCapturePickerMac::CreateDevice(const DesktopMediaID& source) {
|
||||||
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
|
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
|
||||||
|
|
||||||
|
cached_content_filters_cleanup_timers_.erase(source.id);
|
||||||
NSNumber* source_id = @(source.id);
|
NSNumber* source_id = @(source.id);
|
||||||
SCContentFilter* filter = cached_content_filters_[source_id];
|
SCContentFilter* filter = cached_content_filters_[source_id];
|
||||||
if (!filter) {
|
if (!filter) {
|
||||||
PickerObserver* picker_observer = picker_observers_[source_id];
|
PickerObserver* picker_observer = picker_observers_[source_id];
|
||||||
filter = [picker_observer contentFilter];
|
filter = [picker_observer contentFilter];
|
||||||
// TODO(https://crbug.com/360781940): Remove cached entries on close if the
|
|
||||||
// stream is not reopened within 1-2 minutes.
|
|
||||||
cached_content_filters_[source_id] = filter;
|
cached_content_filters_[source_id] = filter;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -202,6 +208,24 @@ NativeScreenCapturePickerMac::CreateDevice(const DesktopMediaID& source) {
|
|||||||
return device;
|
return device;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NativeScreenCapturePickerMac::ScheduleCleanup(DesktopMediaID::Id id) {
|
||||||
|
// We need to retain the content filter for some time in case the device is
|
||||||
|
// restarted, e.g., when ApplyConstraints is called on a MediaStreamTrack.
|
||||||
|
cached_content_filters_cleanup_timers_[id].Start(
|
||||||
|
FROM_HERE, base::Seconds(60),
|
||||||
|
base::BindOnce(
|
||||||
|
&NativeScreenCapturePickerMac::CleanupContentFilter,
|
||||||
|
// Passing `this` is safe since
|
||||||
|
// `cached_content_filters_cleanup_timers_` is owned by `this`.
|
||||||
|
base::Unretained(this), id));
|
||||||
|
}
|
||||||
|
|
||||||
|
void NativeScreenCapturePickerMac::CleanupContentFilter(DesktopMediaID::Id id) {
|
||||||
|
NSNumber* source_id = @(id);
|
||||||
|
[cached_content_filters_ removeObjectForKey:source_id];
|
||||||
|
cached_content_filters_cleanup_timers_.erase(id);
|
||||||
|
}
|
||||||
|
|
||||||
base::WeakPtr<NativeScreenCapturePicker>
|
base::WeakPtr<NativeScreenCapturePicker>
|
||||||
NativeScreenCapturePickerMac::GetWeakPtr() {
|
NativeScreenCapturePickerMac::GetWeakPtr() {
|
||||||
return weak_ptr_factory_.GetWeakPtr();
|
return weak_ptr_factory_.GetWeakPtr();
|
||||||
|
Reference in New Issue
Block a user