|
@@ -0,0 +1,184 @@
|
|
|
+From a51e7ebb7663b40ed070e91669f69c64fb9179d9 Mon Sep 17 00:00:00 2001
|
|
|
+From: Guido Urdaneta <[email protected]>
|
|
|
+Date: Wed, 18 Dec 2024 15:21:59 -0800
|
|
|
+Subject: [PATCH] [M126-LTS][VideoCaptureManager] Replace raw pointers with scoped_refptr
|
|
|
+
|
|
|
+VCM used VideoCaptureController raw pointers in a number of places,
|
|
|
+including as a field in VCM::CaptureDeviceStartRequest.
|
|
|
+
|
|
|
+This CL replaces the field and some other usages with a scoped_refptr
|
|
|
+to prevent dangling pointers.
|
|
|
+
|
|
|
+(cherry picked from commit 3524ce528548d1d743a6aa6e339ecb5a186c22bc)
|
|
|
+
|
|
|
+Bug: 382135228
|
|
|
+Change-Id: I1bd5f95bdf57631227034beb8bb076f258606378
|
|
|
+Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6088073
|
|
|
+Commit-Queue: Guido Urdaneta <[email protected]>
|
|
|
+Reviewed-by: Dale Curtis <[email protected]>
|
|
|
+Cr-Original-Commit-Position: refs/heads/main@{#1396301}
|
|
|
+Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6099792
|
|
|
+Reviewed-by: Guido Urdaneta <[email protected]>
|
|
|
+Commit-Queue: Gyuyoung Kim (xWF) <[email protected]>
|
|
|
+Cr-Commit-Position: refs/branch-heads/6478@{#2009}
|
|
|
+Cr-Branched-From: e6143acc03189c5e52959545b110d6d17ecd5286-refs/heads/main@{#1300313}
|
|
|
+---
|
|
|
+
|
|
|
+diff --git a/content/browser/renderer_host/media/video_capture_manager.cc b/content/browser/renderer_host/media/video_capture_manager.cc
|
|
|
+index 3db89a04..11b6caf 100644
|
|
|
+--- a/content/browser/renderer_host/media/video_capture_manager.cc
|
|
|
++++ b/content/browser/renderer_host/media/video_capture_manager.cc
|
|
|
+@@ -15,6 +15,7 @@
|
|
|
+ #include "base/location.h"
|
|
|
+ #include "base/logging.h"
|
|
|
+ #include "base/memory/raw_ptr.h"
|
|
|
++#include "base/memory/scoped_refptr.h"
|
|
|
+ #include "base/metrics/histogram_functions.h"
|
|
|
+ #include "base/observer_list.h"
|
|
|
+ #include "base/ranges/algorithm.h"
|
|
|
+@@ -61,12 +62,14 @@
|
|
|
+ class VideoCaptureManager::CaptureDeviceStartRequest {
|
|
|
+ public:
|
|
|
+ CaptureDeviceStartRequest(
|
|
|
+- VideoCaptureController* controller,
|
|
|
++ scoped_refptr<VideoCaptureController> controller,
|
|
|
+ const media::VideoCaptureSessionId& session_id,
|
|
|
+ const media::VideoCaptureParams& params,
|
|
|
+ mojo::PendingRemote<video_effects::mojom::VideoEffectsProcessor>
|
|
|
+ video_effects_processor);
|
|
|
+- VideoCaptureController* controller() const { return controller_; }
|
|
|
++ scoped_refptr<VideoCaptureController> controller() const {
|
|
|
++ return controller_;
|
|
|
++ }
|
|
|
+ const base::UnguessableToken& session_id() const { return session_id_; }
|
|
|
+ media::VideoCaptureParams params() const { return params_; }
|
|
|
+
|
|
|
+@@ -76,7 +79,7 @@
|
|
|
+ }
|
|
|
+
|
|
|
+ private:
|
|
|
+- const raw_ptr<VideoCaptureController> controller_;
|
|
|
++ const scoped_refptr<VideoCaptureController> controller_;
|
|
|
+ const base::UnguessableToken session_id_;
|
|
|
+ const media::VideoCaptureParams params_;
|
|
|
+ mojo::PendingRemote<video_effects::mojom::VideoEffectsProcessor>
|
|
|
+@@ -84,12 +87,12 @@
|
|
|
+ };
|
|
|
+
|
|
|
+ VideoCaptureManager::CaptureDeviceStartRequest::CaptureDeviceStartRequest(
|
|
|
+- VideoCaptureController* controller,
|
|
|
++ scoped_refptr<VideoCaptureController> controller,
|
|
|
+ const media::VideoCaptureSessionId& session_id,
|
|
|
+ const media::VideoCaptureParams& params,
|
|
|
+ mojo::PendingRemote<video_effects::mojom::VideoEffectsProcessor>
|
|
|
+ video_effects_processor)
|
|
|
+- : controller_(controller),
|
|
|
++ : controller_(std::move(controller)),
|
|
|
+ session_id_(session_id),
|
|
|
+ params_(params),
|
|
|
+ video_effects_processor_(std::move(video_effects_processor)) {}
|
|
|
+@@ -258,14 +261,15 @@
|
|
|
+
|
|
|
+ void VideoCaptureManager::QueueStartDevice(
|
|
|
+ const media::VideoCaptureSessionId& session_id,
|
|
|
+- VideoCaptureController* controller,
|
|
|
++ scoped_refptr<VideoCaptureController> controller,
|
|
|
+ const media::VideoCaptureParams& params,
|
|
|
+ mojo::PendingRemote<video_effects::mojom::VideoEffectsProcessor>
|
|
|
+ video_effects_processor) {
|
|
|
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
|
|
+ DCHECK(lock_time_.is_null());
|
|
|
+- device_start_request_queue_.push_back(CaptureDeviceStartRequest(
|
|
|
+- controller, session_id, params, std::move(video_effects_processor)));
|
|
|
++ device_start_request_queue_.push_back(
|
|
|
++ CaptureDeviceStartRequest(std::move(controller), session_id, params,
|
|
|
++ std::move(video_effects_processor)));
|
|
|
+ if (device_start_request_queue_.size() == 1)
|
|
|
+ ProcessDeviceStartRequestQueue();
|
|
|
+ }
|
|
|
+@@ -311,7 +315,8 @@
|
|
|
+ if (request == device_start_request_queue_.end())
|
|
|
+ return;
|
|
|
+
|
|
|
+- VideoCaptureController* const controller = request->controller();
|
|
|
++ scoped_refptr<VideoCaptureController> const controller =
|
|
|
++ request->controller();
|
|
|
+
|
|
|
+ EmitLogMessage("VideoCaptureManager::ProcessDeviceStartRequestQueue", 3);
|
|
|
+ // The unit test VideoCaptureManagerTest.OpenNotExisting requires us to fail
|
|
|
+@@ -329,7 +334,7 @@
|
|
|
+ GetDeviceInfoById(controller->device_id());
|
|
|
+ if (!device_info) {
|
|
|
+ OnDeviceLaunchFailed(
|
|
|
+- controller,
|
|
|
++ controller.get(),
|
|
|
+ media::VideoCaptureError::
|
|
|
+ kVideoCaptureManagerProcessDeviceStartQueueDeviceInfoNotFound);
|
|
|
+ return;
|
|
|
+@@ -350,7 +355,7 @@
|
|
|
+ base::BindOnce([](scoped_refptr<VideoCaptureManager>,
|
|
|
+ scoped_refptr<VideoCaptureController>) {},
|
|
|
+ scoped_refptr<VideoCaptureManager>(this),
|
|
|
+- GetControllerSharedRef(controller)),
|
|
|
++ std::move(controller)),
|
|
|
+ request->TakeVideoEffectsProcessor());
|
|
|
+ }
|
|
|
+
|
|
|
+@@ -434,7 +439,7 @@
|
|
|
+ EmitLogMessage(string_stream.str(), 1);
|
|
|
+ }
|
|
|
+
|
|
|
+- VideoCaptureController* controller =
|
|
|
++ scoped_refptr<VideoCaptureController> controller =
|
|
|
+ GetOrCreateController(session_id, params);
|
|
|
+ if (!controller) {
|
|
|
+ std::move(done_cb).Run(nullptr);
|
|
|
+@@ -908,7 +913,8 @@
|
|
|
+ return nullptr;
|
|
|
+ }
|
|
|
+
|
|
|
+-VideoCaptureController* VideoCaptureManager::GetOrCreateController(
|
|
|
++scoped_refptr<VideoCaptureController>
|
|
|
++VideoCaptureManager::GetOrCreateController(
|
|
|
+ const media::VideoCaptureSessionId& capture_session_id,
|
|
|
+ const media::VideoCaptureParams& params) {
|
|
|
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
|
|
+@@ -930,10 +936,12 @@
|
|
|
+ return existing_device;
|
|
|
+ }
|
|
|
+
|
|
|
+- VideoCaptureController* new_controller = new VideoCaptureController(
|
|
|
+- device_info.id, device_info.type, params,
|
|
|
+- video_capture_provider_->CreateDeviceLauncher(), emit_log_message_cb_);
|
|
|
+- controllers_.emplace_back(new_controller);
|
|
|
++ scoped_refptr<VideoCaptureController> new_controller =
|
|
|
++ base::MakeRefCounted<VideoCaptureController>(
|
|
|
++ device_info.id, device_info.type, params,
|
|
|
++ video_capture_provider_->CreateDeviceLauncher(),
|
|
|
++ emit_log_message_cb_);
|
|
|
++ controllers_.push_back(new_controller);
|
|
|
+ return new_controller;
|
|
|
+ }
|
|
|
+
|
|
|
+diff --git a/content/browser/renderer_host/media/video_capture_manager.h b/content/browser/renderer_host/media/video_capture_manager.h
|
|
|
+index a93c6bb..b88052a4 100644
|
|
|
+--- a/content/browser/renderer_host/media/video_capture_manager.h
|
|
|
++++ b/content/browser/renderer_host/media/video_capture_manager.h
|
|
|
+@@ -297,7 +297,7 @@
|
|
|
+ // Finds a VideoCaptureController for the indicated |capture_session_id|,
|
|
|
+ // creating a fresh one if necessary. Returns nullptr if said
|
|
|
+ // |capture_session_id| is invalid.
|
|
|
+- VideoCaptureController* GetOrCreateController(
|
|
|
++ scoped_refptr<VideoCaptureController> GetOrCreateController(
|
|
|
+ const media::VideoCaptureSessionId& capture_session_id,
|
|
|
+ const media::VideoCaptureParams& params);
|
|
|
+
|
|
|
+@@ -309,7 +309,7 @@
|
|
|
+ // another request pending start.
|
|
|
+ void QueueStartDevice(
|
|
|
+ const media::VideoCaptureSessionId& session_id,
|
|
|
+- VideoCaptureController* controller,
|
|
|
++ scoped_refptr<VideoCaptureController> controller,
|
|
|
+ const media::VideoCaptureParams& params,
|
|
|
+ mojo::PendingRemote<video_effects::mojom::VideoEffectsProcessor>
|
|
|
+ video_effects_processor);
|