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