new/yocto/meta-rockchip/dynamic-layers/recipes-browser/chromium/chromium_100.0.4896/0015-media-gpu-v4l2-Non-blocking-initialize.patch
2025-05-10 21:58:58 +08:00

127 lines
4.6 KiB
Diff

From 2ddb7454bbda83d960524db23c586bd1505d62c6 Mon Sep 17 00:00:00 2001
From: Jeffy Chen <jeffy.chen@rock-chips.com>
Date: Mon, 21 Mar 2022 18:30:22 +0800
Subject: [PATCH 15/15] media/gpu/v4l2: Non-blocking initialize
See:
https://bugs.chromium.org/p/chromium/issues/detail?id=1308345
Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
---
.../gpu/v4l2/v4l2_video_encode_accelerator.cc | 35 +++++++++----------
.../gpu/v4l2/v4l2_video_encode_accelerator.h | 4 +--
2 files changed, 17 insertions(+), 22 deletions(-)
diff --git a/media/gpu/v4l2/v4l2_video_encode_accelerator.cc b/media/gpu/v4l2/v4l2_video_encode_accelerator.cc
index 46ac323cf..75c4eebba 100644
--- a/media/gpu/v4l2/v4l2_video_encode_accelerator.cc
+++ b/media/gpu/v4l2/v4l2_video_encode_accelerator.cc
@@ -261,25 +261,15 @@ bool V4L2VideoEncodeAccelerator::Initialize(const Config& config,
return false;
}
- bool result = false;
- base::WaitableEvent done;
encoder_task_runner_->PostTask(
FROM_HERE, base::BindOnce(&V4L2VideoEncodeAccelerator::InitializeTask,
- weak_this_, config, &result, &done));
- done.Wait();
- return result;
+ weak_this_, config));
+ return true;
}
-void V4L2VideoEncodeAccelerator::InitializeTask(const Config& config,
- bool* result,
- base::WaitableEvent* done) {
+void V4L2VideoEncodeAccelerator::InitializeTask(const Config& config) {
DCHECK_CALLED_ON_VALID_SEQUENCE(encoder_sequence_checker_);
- // Signal the event when leaving the method.
- base::ScopedClosureRunner signal_event(
- base::BindOnce(&base::WaitableEvent::Signal, base::Unretained(done)));
- *result = false;
-
native_input_mode_ =
config.storage_type.value_or(Config::StorageType::kShmem) ==
Config::StorageType::kGpuMemoryBuffer;
@@ -294,6 +284,7 @@ void V4L2VideoEncodeAccelerator::InitializeTask(const Config& config,
if (!SetFormats(config.input_format, config.output_profile)) {
VLOGF(1) << "Failed setting up formats";
+ NOTIFY_ERROR(kPlatformFailureError);
return;
}
@@ -307,6 +298,7 @@ void V4L2VideoEncodeAccelerator::InitializeTask(const Config& config,
VideoFrame::NumPlanes(config.input_format)));
if (!input_layout) {
VLOGF(1) << "Invalid image processor input layout";
+ NOTIFY_ERROR(kPlatformFailureError);
return;
}
@@ -316,6 +308,7 @@ void V4L2VideoEncodeAccelerator::InitializeTask(const Config& config,
encoder_input_visible_rect_,
encoder_input_visible_rect_)) {
VLOGF(1) << "Failed to create image processor";
+ NOTIFY_ERROR(kPlatformFailureError);
return;
}
@@ -327,16 +320,23 @@ void V4L2VideoEncodeAccelerator::InitializeTask(const Config& config,
VLOGF(1) << "Failed to reconfigure v4l2 encoder driver with the "
<< "ImageProcessor output buffer: "
<< ip_output_buffer_size.ToString();
+ NOTIFY_ERROR(kPlatformFailureError);
return;
}
}
- if (!InitInputMemoryType(config))
+ if (!InitInputMemoryType(config)) {
+ NOTIFY_ERROR(kPlatformFailureError);
return;
- if (!InitControls(config))
+ }
+ if (!InitControls(config)) {
+ NOTIFY_ERROR(kPlatformFailureError);
return;
- if (!CreateOutputBuffers())
+ }
+ if (!CreateOutputBuffers()) {
+ NOTIFY_ERROR(kPlatformFailureError);
return;
+ }
encoder_state_ = kInitialized;
RequestEncodingParametersChangeTask(
@@ -369,9 +369,6 @@ void V4L2VideoEncodeAccelerator::InitializeTask(const Config& config,
child_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(&Client::NotifyEncoderInfoChange, client_, encoder_info));
-
- // Finish initialization.
- *result = true;
}
bool V4L2VideoEncodeAccelerator::CreateImageProcessor(
diff --git a/media/gpu/v4l2/v4l2_video_encode_accelerator.h b/media/gpu/v4l2/v4l2_video_encode_accelerator.h
index a8f0693c7..acb6ff418 100644
--- a/media/gpu/v4l2/v4l2_video_encode_accelerator.h
+++ b/media/gpu/v4l2/v4l2_video_encode_accelerator.h
@@ -198,9 +198,7 @@ class MEDIA_GPU_EXPORT V4L2VideoEncodeAccelerator
uint32_t framerate);
// Do several initializations (e.g. set up format) on |encoder_task_runner_|.
- void InitializeTask(const Config& config,
- bool* result,
- base::WaitableEvent* done);
+ void InitializeTask(const Config& config);
// Set up formats and initialize the device for them.
bool SetFormats(VideoPixelFormat input_format,
--
2.20.1