1*4882a593SmuzhiyunFrom ede4260fcee7a7b022604ef303285c128c078609 Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Jeffy Chen <jeffy.chen@rock-chips.com>
3*4882a593SmuzhiyunDate: Mon, 21 Mar 2022 18:30:22 +0800
4*4882a593SmuzhiyunSubject: [PATCH 15/15] media/gpu/v4l2: Non-blocking initialize
5*4882a593Smuzhiyun
6*4882a593SmuzhiyunSee:
7*4882a593Smuzhiyunhttps://bugs.chromium.org/p/chromium/issues/detail?id=1308345
8*4882a593Smuzhiyun
9*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
10*4882a593Smuzhiyun---
11*4882a593Smuzhiyun .../gpu/v4l2/v4l2_video_encode_accelerator.cc | 35 +++++++++----------
12*4882a593Smuzhiyun .../gpu/v4l2/v4l2_video_encode_accelerator.h  |  4 +--
13*4882a593Smuzhiyun 2 files changed, 17 insertions(+), 22 deletions(-)
14*4882a593Smuzhiyun
15*4882a593Smuzhiyundiff --git a/media/gpu/v4l2/v4l2_video_encode_accelerator.cc b/media/gpu/v4l2/v4l2_video_encode_accelerator.cc
16*4882a593Smuzhiyunindex 0edf56412..488e05828 100644
17*4882a593Smuzhiyun--- a/media/gpu/v4l2/v4l2_video_encode_accelerator.cc
18*4882a593Smuzhiyun+++ b/media/gpu/v4l2/v4l2_video_encode_accelerator.cc
19*4882a593Smuzhiyun@@ -272,25 +272,15 @@ bool V4L2VideoEncodeAccelerator::Initialize(
20*4882a593Smuzhiyun     return false;
21*4882a593Smuzhiyun   }
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun-  bool result = false;
24*4882a593Smuzhiyun-  base::WaitableEvent done;
25*4882a593Smuzhiyun   encoder_task_runner_->PostTask(
26*4882a593Smuzhiyun       FROM_HERE, base::BindOnce(&V4L2VideoEncodeAccelerator::InitializeTask,
27*4882a593Smuzhiyun-                                weak_this_, config, &result, &done));
28*4882a593Smuzhiyun-  done.Wait();
29*4882a593Smuzhiyun-  return result;
30*4882a593Smuzhiyun+                                weak_this_, config));
31*4882a593Smuzhiyun+  return true;
32*4882a593Smuzhiyun }
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun-void V4L2VideoEncodeAccelerator::InitializeTask(const Config& config,
35*4882a593Smuzhiyun-                                                bool* result,
36*4882a593Smuzhiyun-                                                base::WaitableEvent* done) {
37*4882a593Smuzhiyun+void V4L2VideoEncodeAccelerator::InitializeTask(const Config& config) {
38*4882a593Smuzhiyun   DCHECK_CALLED_ON_VALID_SEQUENCE(encoder_sequence_checker_);
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun-  // Signal the event when leaving the method.
41*4882a593Smuzhiyun-  base::ScopedClosureRunner signal_event(
42*4882a593Smuzhiyun-      base::BindOnce(&base::WaitableEvent::Signal, base::Unretained(done)));
43*4882a593Smuzhiyun-  *result = false;
44*4882a593Smuzhiyun-
45*4882a593Smuzhiyun   native_input_mode_ =
46*4882a593Smuzhiyun       config.storage_type.value_or(Config::StorageType::kShmem) ==
47*4882a593Smuzhiyun       Config::StorageType::kGpuMemoryBuffer;
48*4882a593Smuzhiyun@@ -305,6 +295,7 @@ void V4L2VideoEncodeAccelerator::InitializeTask(const Config& config,
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun   if (!SetFormats(config.input_format, config.output_profile)) {
51*4882a593Smuzhiyun     VLOGF(1) << "Failed setting up formats";
52*4882a593Smuzhiyun+    NOTIFY_ERROR(kPlatformFailureError);
53*4882a593Smuzhiyun     return;
54*4882a593Smuzhiyun   }
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun@@ -318,6 +309,7 @@ void V4L2VideoEncodeAccelerator::InitializeTask(const Config& config,
57*4882a593Smuzhiyun             VideoFrame::NumPlanes(config.input_format)));
58*4882a593Smuzhiyun     if (!input_layout) {
59*4882a593Smuzhiyun       VLOGF(1) << "Invalid image processor input layout";
60*4882a593Smuzhiyun+      NOTIFY_ERROR(kPlatformFailureError);
61*4882a593Smuzhiyun       return;
62*4882a593Smuzhiyun     }
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun@@ -327,6 +319,7 @@ void V4L2VideoEncodeAccelerator::InitializeTask(const Config& config,
65*4882a593Smuzhiyun                               encoder_input_visible_rect_,
66*4882a593Smuzhiyun                               encoder_input_visible_rect_)) {
67*4882a593Smuzhiyun       VLOGF(1) << "Failed to create image processor";
68*4882a593Smuzhiyun+      NOTIFY_ERROR(kPlatformFailureError);
69*4882a593Smuzhiyun       return;
70*4882a593Smuzhiyun     }
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun@@ -338,16 +331,23 @@ void V4L2VideoEncodeAccelerator::InitializeTask(const Config& config,
73*4882a593Smuzhiyun       VLOGF(1) << "Failed to reconfigure v4l2 encoder driver with the "
74*4882a593Smuzhiyun                << "ImageProcessor output buffer: "
75*4882a593Smuzhiyun                << ip_output_buffer_size.ToString();
76*4882a593Smuzhiyun+      NOTIFY_ERROR(kPlatformFailureError);
77*4882a593Smuzhiyun       return;
78*4882a593Smuzhiyun     }
79*4882a593Smuzhiyun   }
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun-  if (!InitInputMemoryType(config))
82*4882a593Smuzhiyun+  if (!InitInputMemoryType(config)) {
83*4882a593Smuzhiyun+    NOTIFY_ERROR(kPlatformFailureError);
84*4882a593Smuzhiyun     return;
85*4882a593Smuzhiyun-  if (!InitControls(config))
86*4882a593Smuzhiyun+  }
87*4882a593Smuzhiyun+  if (!InitControls(config)) {
88*4882a593Smuzhiyun+    NOTIFY_ERROR(kPlatformFailureError);
89*4882a593Smuzhiyun     return;
90*4882a593Smuzhiyun-  if (!CreateOutputBuffers())
91*4882a593Smuzhiyun+  }
92*4882a593Smuzhiyun+  if (!CreateOutputBuffers()) {
93*4882a593Smuzhiyun+    NOTIFY_ERROR(kPlatformFailureError);
94*4882a593Smuzhiyun     return;
95*4882a593Smuzhiyun+  }
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun   encoder_state_ = kInitialized;
98*4882a593Smuzhiyun   RequestEncodingParametersChangeTask(
99*4882a593Smuzhiyun@@ -380,9 +380,6 @@ void V4L2VideoEncodeAccelerator::InitializeTask(const Config& config,
100*4882a593Smuzhiyun   child_task_runner_->PostTask(
101*4882a593Smuzhiyun       FROM_HERE,
102*4882a593Smuzhiyun       base::BindOnce(&Client::NotifyEncoderInfoChange, client_, encoder_info));
103*4882a593Smuzhiyun-
104*4882a593Smuzhiyun-  // Finish initialization.
105*4882a593Smuzhiyun-  *result = true;
106*4882a593Smuzhiyun }
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun bool V4L2VideoEncodeAccelerator::CreateImageProcessor(
109*4882a593Smuzhiyundiff --git a/media/gpu/v4l2/v4l2_video_encode_accelerator.h b/media/gpu/v4l2/v4l2_video_encode_accelerator.h
110*4882a593Smuzhiyunindex d414a327d..ce6cad5ab 100644
111*4882a593Smuzhiyun--- a/media/gpu/v4l2/v4l2_video_encode_accelerator.h
112*4882a593Smuzhiyun+++ b/media/gpu/v4l2/v4l2_video_encode_accelerator.h
113*4882a593Smuzhiyun@@ -200,9 +200,7 @@ class MEDIA_GPU_EXPORT V4L2VideoEncodeAccelerator
114*4882a593Smuzhiyun                                            uint32_t framerate);
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun   // Do several initializations (e.g. set up format) on |encoder_task_runner_|.
117*4882a593Smuzhiyun-  void InitializeTask(const Config& config,
118*4882a593Smuzhiyun-                      bool* result,
119*4882a593Smuzhiyun-                      base::WaitableEvent* done);
120*4882a593Smuzhiyun+  void InitializeTask(const Config& config);
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun   // Set up formats and initialize the device for them.
123*4882a593Smuzhiyun   bool SetFormats(VideoPixelFormat input_format,
124*4882a593Smuzhiyun--
125*4882a593Smuzhiyun2.20.1
126*4882a593Smuzhiyun
127