1*4882a593SmuzhiyunFrom be3074eaa6255f8579e6830f22d78a405207e4c2 Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Maksim Sisov <msisov@igalia.com> 3*4882a593SmuzhiyunDate: Wed, 31 Jul 2019 09:56:24 +0300 4*4882a593SmuzhiyunSubject: [PATCH 04/14] Add support for V4L2VDA on Linux 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunThis patch enables hardware assisted video decoding via the 7*4882a593SmuzhiyunChromium V4L2VDA. Including changes when Linux is used. In 8*4882a593Smuzhiyunorder to use this, use_linux_v4l2_only flag should be set 9*4882a593Smuzhiyunto true. 10*4882a593Smuzhiyun 11*4882a593SmuzhiyunSigned-off-by: Ryo Kodama <ryo.kodama.vz@renesas.com> 12*4882a593Smuzhiyun 13*4882a593Smuzhiyunfixup! avoid building not declared formats 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun"FRAME", "_SLICE", "V4L2_PIX_FMT_VP9" are not defined in mainline 16*4882a593Smuzhiyun Linux headers. This patch avoids building these formats. 17*4882a593Smuzhiyun 18*4882a593SmuzhiyunSigned-off-by: Ryo Kodama <ryo.kodama.vz@renesas.com> 19*4882a593Smuzhiyun 20*4882a593Smuzhiyunfixup! add V4L2_PIX_FMT_VP9 support back again as it is now 21*4882a593Smuzhiyunincluded in mainline Linux kernel. This allows VP9 codec 22*4882a593Smuzhiyunto work with upstream kernel and v4l2 vda. Tested on db820c 23*4882a593Smuzhiyunwith Venus v4l2 driver. 24*4882a593Smuzhiyun 25*4882a593SmuzhiyunSigned-off-by: Peter Griffin <peter.griffin@linaro.org> 26*4882a593SmuzhiyunSigned-off-by: Stanimir Varbanov <stanimir.varbanov@linaro.org> 27*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> 28*4882a593Smuzhiyun--- 29*4882a593Smuzhiyun .../gpu_mjpeg_decode_accelerator_factory.cc | 3 +- 30*4882a593Smuzhiyun chromium/media/gpu/BUILD.gn | 1 + 31*4882a593Smuzhiyun chromium/media/gpu/args.gni | 4 ++ 32*4882a593Smuzhiyun .../gpu_video_decode_accelerator_factory.cc | 8 +++ 33*4882a593Smuzhiyun .../gpu_video_decode_accelerator_factory.h | 2 + 34*4882a593Smuzhiyun chromium/media/gpu/v4l2/BUILD.gn | 39 +++++----- 35*4882a593Smuzhiyun .../media/gpu/v4l2/generic_v4l2_device.cc | 4 ++ 36*4882a593Smuzhiyun chromium/media/gpu/v4l2/v4l2_device.cc | 72 +++++++++++++++++++ 37*4882a593Smuzhiyun chromium/media/gpu/v4l2/v4l2_video_decoder.cc | 7 ++ 38*4882a593Smuzhiyun 9 files changed, 122 insertions(+), 18 deletions(-) 39*4882a593Smuzhiyun 40*4882a593Smuzhiyundiff --git a/chromium/components/chromeos_camera/gpu_mjpeg_decode_accelerator_factory.cc b/chromium/components/chromeos_camera/gpu_mjpeg_decode_accelerator_factory.cc 41*4882a593Smuzhiyunindex 6f319e889..4f8f0b7d0 100644 42*4882a593Smuzhiyun--- a/chromium/components/chromeos_camera/gpu_mjpeg_decode_accelerator_factory.cc 43*4882a593Smuzhiyun+++ b/chromium/components/chromeos_camera/gpu_mjpeg_decode_accelerator_factory.cc 44*4882a593Smuzhiyun@@ -13,7 +13,8 @@ 45*4882a593Smuzhiyun #include "media/base/media_switches.h" 46*4882a593Smuzhiyun #include "media/gpu/buildflags.h" 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun-#if BUILDFLAG(USE_V4L2_CODEC) && defined(ARCH_CPU_ARM_FAMILY) 49*4882a593Smuzhiyun+#if BUILDFLAG(USE_V4L2_CODEC) && defined(ARCH_CPU_ARM_FAMILY) && \ 50*4882a593Smuzhiyun+ !BUILDFLAG(USE_LINUX_V4L2) 51*4882a593Smuzhiyun #define USE_V4L2_MJPEG_DECODE_ACCELERATOR 52*4882a593Smuzhiyun #endif 53*4882a593Smuzhiyun 54*4882a593Smuzhiyundiff --git a/chromium/media/gpu/BUILD.gn b/chromium/media/gpu/BUILD.gn 55*4882a593Smuzhiyunindex b1a84b1ad..1edccb7ab 100644 56*4882a593Smuzhiyun--- a/chromium/media/gpu/BUILD.gn 57*4882a593Smuzhiyun+++ b/chromium/media/gpu/BUILD.gn 58*4882a593Smuzhiyun@@ -18,6 +18,7 @@ buildflag_header("buildflags") { 59*4882a593Smuzhiyun "USE_VAAPI=$use_vaapi", 60*4882a593Smuzhiyun "USE_V4L2_CODEC=$use_v4l2_codec", 61*4882a593Smuzhiyun "USE_LIBV4L2=$use_v4lplugin", 62*4882a593Smuzhiyun+ "USE_LINUX_V4L2=$use_linux_v4l2_only", 63*4882a593Smuzhiyun ] 64*4882a593Smuzhiyun } 65*4882a593Smuzhiyun 66*4882a593Smuzhiyundiff --git a/chromium/media/gpu/args.gni b/chromium/media/gpu/args.gni 67*4882a593Smuzhiyunindex 2a87b9980..7e905aebb 100644 68*4882a593Smuzhiyun--- a/chromium/media/gpu/args.gni 69*4882a593Smuzhiyun+++ b/chromium/media/gpu/args.gni 70*4882a593Smuzhiyun@@ -10,6 +10,10 @@ declare_args() { 71*4882a593Smuzhiyun # platforms which have v4l2 hardware encoder / decoder. 72*4882a593Smuzhiyun use_v4l2_codec = false 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun+ # Indicates that only definitions available in the mainline linux kernel 75*4882a593Smuzhiyun+ # will be used. 76*4882a593Smuzhiyun+ use_linux_v4l2_only = false 77*4882a593Smuzhiyun+ 78*4882a593Smuzhiyun # Indicates if Video4Linux2 AML encoder is used. This is used for AML 79*4882a593Smuzhiyun # platforms which have v4l2 hardware encoder 80*4882a593Smuzhiyun use_v4l2_codec_aml = false 81*4882a593Smuzhiyundiff --git a/chromium/media/gpu/gpu_video_decode_accelerator_factory.cc b/chromium/media/gpu/gpu_video_decode_accelerator_factory.cc 82*4882a593Smuzhiyunindex a24ee0fe3..b085ebbbe 100644 83*4882a593Smuzhiyun--- a/chromium/media/gpu/gpu_video_decode_accelerator_factory.cc 84*4882a593Smuzhiyun+++ b/chromium/media/gpu/gpu_video_decode_accelerator_factory.cc 85*4882a593Smuzhiyun@@ -26,7 +26,9 @@ 86*4882a593Smuzhiyun #endif 87*4882a593Smuzhiyun #if BUILDFLAG(USE_V4L2_CODEC) 88*4882a593Smuzhiyun #include "media/gpu/v4l2/v4l2_device.h" 89*4882a593Smuzhiyun+#if !BUILDFLAG(USE_LINUX_V4L2) 90*4882a593Smuzhiyun #include "media/gpu/v4l2/v4l2_slice_video_decode_accelerator.h" 91*4882a593Smuzhiyun+#endif 92*4882a593Smuzhiyun #include "media/gpu/v4l2/v4l2_video_decode_accelerator.h" 93*4882a593Smuzhiyun #include "ui/gl/gl_surface_egl.h" 94*4882a593Smuzhiyun #endif 95*4882a593Smuzhiyun@@ -63,10 +65,12 @@ gpu::VideoDecodeAcceleratorCapabilities GetDecoderCapabilitiesInternal( 96*4882a593Smuzhiyun vda_profiles = V4L2VideoDecodeAccelerator::GetSupportedProfiles(); 97*4882a593Smuzhiyun GpuVideoAcceleratorUtil::InsertUniqueDecodeProfiles( 98*4882a593Smuzhiyun vda_profiles, &capabilities.supported_profiles); 99*4882a593Smuzhiyun+#if !BUILDFLAG(USE_LINUX_V4L2) 100*4882a593Smuzhiyun vda_profiles = V4L2SliceVideoDecodeAccelerator::GetSupportedProfiles(); 101*4882a593Smuzhiyun GpuVideoAcceleratorUtil::InsertUniqueDecodeProfiles( 102*4882a593Smuzhiyun vda_profiles, &capabilities.supported_profiles); 103*4882a593Smuzhiyun #endif 104*4882a593Smuzhiyun+#endif 105*4882a593Smuzhiyun #if BUILDFLAG(USE_VAAPI) 106*4882a593Smuzhiyun vda_profiles = VaapiVideoDecodeAccelerator::GetSupportedProfiles(workarounds); 107*4882a593Smuzhiyun GpuVideoAcceleratorUtil::InsertUniqueDecodeProfiles( 108*4882a593Smuzhiyun@@ -147,8 +151,10 @@ GpuVideoDecodeAcceleratorFactory::CreateVDA( 109*4882a593Smuzhiyun #endif 110*4882a593Smuzhiyun #if BUILDFLAG(USE_V4L2_CODEC) 111*4882a593Smuzhiyun &GpuVideoDecodeAcceleratorFactory::CreateV4L2VDA, 112*4882a593Smuzhiyun+#if !BUILDFLAG(USE_LINUX_V4L2) 113*4882a593Smuzhiyun &GpuVideoDecodeAcceleratorFactory::CreateV4L2SVDA, 114*4882a593Smuzhiyun #endif 115*4882a593Smuzhiyun+#endif 116*4882a593Smuzhiyun #if defined(OS_MAC) 117*4882a593Smuzhiyun &GpuVideoDecodeAcceleratorFactory::CreateVTVDA, 118*4882a593Smuzhiyun #endif 119*4882a593Smuzhiyun@@ -196,6 +202,7 @@ GpuVideoDecodeAcceleratorFactory::CreateV4L2VDA( 120*4882a593Smuzhiyun return decoder; 121*4882a593Smuzhiyun } 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun+#if !BUILDFLAG(USE_LINUX_V4L2) 124*4882a593Smuzhiyun std::unique_ptr<VideoDecodeAccelerator> 125*4882a593Smuzhiyun GpuVideoDecodeAcceleratorFactory::CreateV4L2SVDA( 126*4882a593Smuzhiyun const gpu::GpuDriverBugWorkarounds& workarounds, 127*4882a593Smuzhiyun@@ -211,6 +218,7 @@ GpuVideoDecodeAcceleratorFactory::CreateV4L2SVDA( 128*4882a593Smuzhiyun return decoder; 129*4882a593Smuzhiyun } 130*4882a593Smuzhiyun #endif 131*4882a593Smuzhiyun+#endif 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun #if BUILDFLAG(USE_VAAPI) 134*4882a593Smuzhiyun std::unique_ptr<VideoDecodeAccelerator> 135*4882a593Smuzhiyundiff --git a/chromium/media/gpu/gpu_video_decode_accelerator_factory.h b/chromium/media/gpu/gpu_video_decode_accelerator_factory.h 136*4882a593Smuzhiyunindex b2721b7d1..613906486 100644 137*4882a593Smuzhiyun--- a/chromium/media/gpu/gpu_video_decode_accelerator_factory.h 138*4882a593Smuzhiyun+++ b/chromium/media/gpu/gpu_video_decode_accelerator_factory.h 139*4882a593Smuzhiyun@@ -92,11 +92,13 @@ class MEDIA_GPU_EXPORT GpuVideoDecodeAcceleratorFactory { 140*4882a593Smuzhiyun const gpu::GpuDriverBugWorkarounds& workarounds, 141*4882a593Smuzhiyun const gpu::GpuPreferences& gpu_preferences, 142*4882a593Smuzhiyun MediaLog* media_log) const; 143*4882a593Smuzhiyun+#if !BUILDFLAG(USE_LINUX_V4L2) 144*4882a593Smuzhiyun std::unique_ptr<VideoDecodeAccelerator> CreateV4L2SVDA( 145*4882a593Smuzhiyun const gpu::GpuDriverBugWorkarounds& workarounds, 146*4882a593Smuzhiyun const gpu::GpuPreferences& gpu_preferences, 147*4882a593Smuzhiyun MediaLog* media_log) const; 148*4882a593Smuzhiyun #endif 149*4882a593Smuzhiyun+#endif 150*4882a593Smuzhiyun #if BUILDFLAG(USE_VAAPI) 151*4882a593Smuzhiyun std::unique_ptr<VideoDecodeAccelerator> CreateVaapiVDA( 152*4882a593Smuzhiyun const gpu::GpuDriverBugWorkarounds& workarounds, 153*4882a593Smuzhiyundiff --git a/chromium/media/gpu/v4l2/BUILD.gn b/chromium/media/gpu/v4l2/BUILD.gn 154*4882a593Smuzhiyunindex 9a999e43a..9cf40f5c5 100644 155*4882a593Smuzhiyun--- a/chromium/media/gpu/v4l2/BUILD.gn 156*4882a593Smuzhiyun+++ b/chromium/media/gpu/v4l2/BUILD.gn 157*4882a593Smuzhiyun@@ -27,21 +27,12 @@ source_set("v4l2") { 158*4882a593Smuzhiyun "buffer_affinity_tracker.h", 159*4882a593Smuzhiyun "generic_v4l2_device.cc", 160*4882a593Smuzhiyun "generic_v4l2_device.h", 161*4882a593Smuzhiyun- "v4l2_decode_surface.cc", 162*4882a593Smuzhiyun- "v4l2_decode_surface.h", 163*4882a593Smuzhiyun- "v4l2_decode_surface_handler.h", 164*4882a593Smuzhiyun "v4l2_device.cc", 165*4882a593Smuzhiyun "v4l2_device.h", 166*4882a593Smuzhiyun "v4l2_device_poller.cc", 167*4882a593Smuzhiyun "v4l2_device_poller.h", 168*4882a593Smuzhiyun- "v4l2_h264_accelerator.cc", 169*4882a593Smuzhiyun- "v4l2_h264_accelerator.h", 170*4882a593Smuzhiyun- "v4l2_h264_accelerator_legacy.cc", 171*4882a593Smuzhiyun- "v4l2_h264_accelerator_legacy.h", 172*4882a593Smuzhiyun "v4l2_image_processor_backend.cc", 173*4882a593Smuzhiyun "v4l2_image_processor_backend.h", 174*4882a593Smuzhiyun- "v4l2_slice_video_decode_accelerator.cc", 175*4882a593Smuzhiyun- "v4l2_slice_video_decode_accelerator.h", 176*4882a593Smuzhiyun "v4l2_stateful_workaround.cc", 177*4882a593Smuzhiyun "v4l2_stateful_workaround.h", 178*4882a593Smuzhiyun "v4l2_vda_helpers.cc", 179*4882a593Smuzhiyun@@ -54,18 +45,32 @@ source_set("v4l2") { 180*4882a593Smuzhiyun "v4l2_video_decoder_backend.h", 181*4882a593Smuzhiyun "v4l2_video_decoder_backend_stateful.cc", 182*4882a593Smuzhiyun "v4l2_video_decoder_backend_stateful.h", 183*4882a593Smuzhiyun- "v4l2_video_decoder_backend_stateless.cc", 184*4882a593Smuzhiyun- "v4l2_video_decoder_backend_stateless.h", 185*4882a593Smuzhiyun "v4l2_video_encode_accelerator.cc", 186*4882a593Smuzhiyun "v4l2_video_encode_accelerator.h", 187*4882a593Smuzhiyun- "v4l2_vp8_accelerator.cc", 188*4882a593Smuzhiyun- "v4l2_vp8_accelerator.h", 189*4882a593Smuzhiyun- "v4l2_vp8_accelerator_legacy.cc", 190*4882a593Smuzhiyun- "v4l2_vp8_accelerator_legacy.h", 191*4882a593Smuzhiyun- "v4l2_vp9_accelerator_legacy.cc", 192*4882a593Smuzhiyun- "v4l2_vp9_accelerator_legacy.h", 193*4882a593Smuzhiyun ] 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun+ if (!use_linux_v4l2_only) { 196*4882a593Smuzhiyun+ sources += [ 197*4882a593Smuzhiyun+ "v4l2_decode_surface.cc", 198*4882a593Smuzhiyun+ "v4l2_decode_surface.h", 199*4882a593Smuzhiyun+ "v4l2_decode_surface_handler.h", 200*4882a593Smuzhiyun+ "v4l2_h264_accelerator.cc", 201*4882a593Smuzhiyun+ "v4l2_h264_accelerator.h", 202*4882a593Smuzhiyun+ "v4l2_h264_accelerator_legacy.cc", 203*4882a593Smuzhiyun+ "v4l2_h264_accelerator_legacy.h", 204*4882a593Smuzhiyun+ "v4l2_slice_video_decode_accelerator.cc", 205*4882a593Smuzhiyun+ "v4l2_slice_video_decode_accelerator.h", 206*4882a593Smuzhiyun+ "v4l2_video_decoder_backend_stateless.cc", 207*4882a593Smuzhiyun+ "v4l2_video_decoder_backend_stateless.h", 208*4882a593Smuzhiyun+ "v4l2_vp8_accelerator.cc", 209*4882a593Smuzhiyun+ "v4l2_vp8_accelerator.h", 210*4882a593Smuzhiyun+ "v4l2_vp8_accelerator_legacy.cc", 211*4882a593Smuzhiyun+ "v4l2_vp8_accelerator_legacy.h", 212*4882a593Smuzhiyun+ "v4l2_vp9_accelerator_legacy.cc", 213*4882a593Smuzhiyun+ "v4l2_vp9_accelerator_legacy.h", 214*4882a593Smuzhiyun+ ] 215*4882a593Smuzhiyun+ } 216*4882a593Smuzhiyun+ 217*4882a593Smuzhiyun libs = [ 218*4882a593Smuzhiyun "EGL", 219*4882a593Smuzhiyun "GLESv2", 220*4882a593Smuzhiyundiff --git a/chromium/media/gpu/v4l2/generic_v4l2_device.cc b/chromium/media/gpu/v4l2/generic_v4l2_device.cc 221*4882a593Smuzhiyunindex 6742dc14c..f0f103458 100644 222*4882a593Smuzhiyun--- a/chromium/media/gpu/v4l2/generic_v4l2_device.cc 223*4882a593Smuzhiyun+++ b/chromium/media/gpu/v4l2/generic_v4l2_device.cc 224*4882a593Smuzhiyun@@ -415,7 +415,11 @@ bool GenericV4L2Device::OpenDevicePath(const std::string& path, Type type) { 225*4882a593Smuzhiyun return false; 226*4882a593Smuzhiyun 227*4882a593Smuzhiyun #if BUILDFLAG(USE_LIBV4L2) 228*4882a593Smuzhiyun+#if BUILDFLAG(USE_LINUX_V4L2) 229*4882a593Smuzhiyun+ if ( 230*4882a593Smuzhiyun+#else 231*4882a593Smuzhiyun if (type == Type::kEncoder && 232*4882a593Smuzhiyun+#endif 233*4882a593Smuzhiyun HANDLE_EINTR(v4l2_fd_open(device_fd_.get(), V4L2_DISABLE_CONVERSION)) != 234*4882a593Smuzhiyun -1) { 235*4882a593Smuzhiyun DVLOGF(3) << "Using libv4l2 for " << path; 236*4882a593Smuzhiyundiff --git a/chromium/media/gpu/v4l2/v4l2_device.cc b/chromium/media/gpu/v4l2/v4l2_device.cc 237*4882a593Smuzhiyunindex 9dd1c87aa..f9cc4fbb4 100644 238*4882a593Smuzhiyun--- a/chromium/media/gpu/v4l2/v4l2_device.cc 239*4882a593Smuzhiyun+++ b/chromium/media/gpu/v4l2/v4l2_device.cc 240*4882a593Smuzhiyun@@ -784,7 +784,9 @@ void V4L2WritableBufferRef::SetConfigStore(uint32_t config_store) { 241*4882a593Smuzhiyun DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); 242*4882a593Smuzhiyun DCHECK(buffer_data_); 243*4882a593Smuzhiyun 244*4882a593Smuzhiyun+#if !BUILDFLAG(USE_LINUX_V4L2) 245*4882a593Smuzhiyun buffer_data_->v4l2_buffer_.config_store = config_store; 246*4882a593Smuzhiyun+#endif 247*4882a593Smuzhiyun } 248*4882a593Smuzhiyun 249*4882a593Smuzhiyun V4L2ReadableBuffer::V4L2ReadableBuffer(const struct v4l2_buffer& v4l2_buffer, 250*4882a593Smuzhiyun@@ -927,10 +929,12 @@ V4L2Queue::V4L2Queue(scoped_refptr<V4L2Device> dev, 251*4882a593Smuzhiyun return; 252*4882a593Smuzhiyun } 253*4882a593Smuzhiyun 254*4882a593Smuzhiyun+#if !BUILDFLAG(USE_LINUX_V4L2) 255*4882a593Smuzhiyun if (reqbufs.capabilities & V4L2_BUF_CAP_SUPPORTS_REQUESTS) { 256*4882a593Smuzhiyun supports_requests_ = true; 257*4882a593Smuzhiyun DVLOGF(4) << "Queue supports request API."; 258*4882a593Smuzhiyun } 259*4882a593Smuzhiyun+#endif 260*4882a593Smuzhiyun } 261*4882a593Smuzhiyun 262*4882a593Smuzhiyun V4L2Queue::~V4L2Queue() { 263*4882a593Smuzhiyun@@ -1465,6 +1469,23 @@ scoped_refptr<V4L2Device> V4L2Device::Create() { 264*4882a593Smuzhiyun // static 265*4882a593Smuzhiyun uint32_t V4L2Device::VideoCodecProfileToV4L2PixFmt(VideoCodecProfile profile, 266*4882a593Smuzhiyun bool slice_based) { 267*4882a593Smuzhiyun+#if BUILDFLAG(USE_LINUX_V4L2) 268*4882a593Smuzhiyun+ if (slice_based) { 269*4882a593Smuzhiyun+ LOG(ERROR) << "Slice not supported"; 270*4882a593Smuzhiyun+ return 0; 271*4882a593Smuzhiyun+ } 272*4882a593Smuzhiyun+ 273*4882a593Smuzhiyun+ if (profile >= H264PROFILE_MIN && profile <= H264PROFILE_MAX) { 274*4882a593Smuzhiyun+ return V4L2_PIX_FMT_H264; 275*4882a593Smuzhiyun+ } else if (profile >= VP8PROFILE_MIN && profile <= VP8PROFILE_MAX) { 276*4882a593Smuzhiyun+ return V4L2_PIX_FMT_VP8; 277*4882a593Smuzhiyun+ } else if (profile >= VP9PROFILE_MIN && profile <= VP9PROFILE_MAX) { 278*4882a593Smuzhiyun+ return V4L2_PIX_FMT_VP9; 279*4882a593Smuzhiyun+ } else { 280*4882a593Smuzhiyun+ LOG(ERROR) << "Unknown profile: " << GetProfileName(profile); 281*4882a593Smuzhiyun+ return 0; 282*4882a593Smuzhiyun+ } 283*4882a593Smuzhiyun+#else 284*4882a593Smuzhiyun if (profile >= H264PROFILE_MIN && profile <= H264PROFILE_MAX) { 285*4882a593Smuzhiyun if (slice_based) 286*4882a593Smuzhiyun return V4L2_PIX_FMT_H264_SLICE; 287*4882a593Smuzhiyun@@ -1484,8 +1505,10 @@ uint32_t V4L2Device::VideoCodecProfileToV4L2PixFmt(VideoCodecProfile profile, 288*4882a593Smuzhiyun LOG(ERROR) << "Unknown profile: " << GetProfileName(profile); 289*4882a593Smuzhiyun return 0; 290*4882a593Smuzhiyun } 291*4882a593Smuzhiyun+#endif 292*4882a593Smuzhiyun } 293*4882a593Smuzhiyun 294*4882a593Smuzhiyun+#if !BUILDFLAG(USE_LINUX_V4L2) 295*4882a593Smuzhiyun // static 296*4882a593Smuzhiyun VideoCodecProfile V4L2Device::V4L2ProfileToVideoCodecProfile(VideoCodec codec, 297*4882a593Smuzhiyun uint32_t profile) { 298*4882a593Smuzhiyun@@ -1534,10 +1557,12 @@ VideoCodecProfile V4L2Device::V4L2ProfileToVideoCodecProfile(VideoCodec codec, 299*4882a593Smuzhiyun VLOGF(2) << "Unknown profile: " << profile; 300*4882a593Smuzhiyun return VIDEO_CODEC_PROFILE_UNKNOWN; 301*4882a593Smuzhiyun } 302*4882a593Smuzhiyun+#endif 303*4882a593Smuzhiyun 304*4882a593Smuzhiyun std::vector<VideoCodecProfile> V4L2Device::V4L2PixFmtToVideoCodecProfiles( 305*4882a593Smuzhiyun uint32_t pix_fmt, 306*4882a593Smuzhiyun bool is_encoder) { 307*4882a593Smuzhiyun+#if !BUILDFLAG(USE_LINUX_V4L2) 308*4882a593Smuzhiyun auto get_supported_profiles = [this]( 309*4882a593Smuzhiyun VideoCodec codec, 310*4882a593Smuzhiyun std::vector<VideoCodecProfile>* profiles) { 311*4882a593Smuzhiyun@@ -1608,6 +1633,27 @@ std::vector<VideoCodecProfile> V4L2Device::V4L2PixFmtToVideoCodecProfiles( 312*4882a593Smuzhiyun VLOGF(1) << "Unhandled pixelformat " << FourccToString(pix_fmt); 313*4882a593Smuzhiyun return {}; 314*4882a593Smuzhiyun } 315*4882a593Smuzhiyun+#else 316*4882a593Smuzhiyun+ std::vector<VideoCodecProfile> profiles; 317*4882a593Smuzhiyun+ switch (pix_fmt) { 318*4882a593Smuzhiyun+ case V4L2_PIX_FMT_H264: 319*4882a593Smuzhiyun+ profiles = { 320*4882a593Smuzhiyun+ H264PROFILE_BASELINE, 321*4882a593Smuzhiyun+ H264PROFILE_MAIN, 322*4882a593Smuzhiyun+ H264PROFILE_HIGH, 323*4882a593Smuzhiyun+ }; 324*4882a593Smuzhiyun+ break; 325*4882a593Smuzhiyun+ case V4L2_PIX_FMT_VP8: 326*4882a593Smuzhiyun+ profiles = {VP8PROFILE_ANY}; 327*4882a593Smuzhiyun+ break; 328*4882a593Smuzhiyun+ case V4L2_PIX_FMT_VP9: 329*4882a593Smuzhiyun+ profiles = {VP9PROFILE_PROFILE0}; 330*4882a593Smuzhiyun+ break; 331*4882a593Smuzhiyun+ default: 332*4882a593Smuzhiyun+ VLOGF(1) << "Unhandled pixelformat " << FourccToString(pix_fmt); 333*4882a593Smuzhiyun+ return {}; 334*4882a593Smuzhiyun+ } 335*4882a593Smuzhiyun+#endif 336*4882a593Smuzhiyun 337*4882a593Smuzhiyun // Erase duplicated profiles. 338*4882a593Smuzhiyun std::sort(profiles.begin(), profiles.end()); 339*4882a593Smuzhiyun@@ -1632,6 +1678,12 @@ uint32_t V4L2Device::V4L2PixFmtToDrmFormat(uint32_t format) { 340*4882a593Smuzhiyun case V4L2_PIX_FMT_RGB32: 341*4882a593Smuzhiyun return DRM_FORMAT_ARGB8888; 342*4882a593Smuzhiyun 343*4882a593Smuzhiyun+#if !BUILDFLAG(USE_LINUX_V4L2) 344*4882a593Smuzhiyun+ case V4L2_PIX_FMT_MT21C: 345*4882a593Smuzhiyun+ case V4L2_PIX_FMT_MT21: 346*4882a593Smuzhiyun+ return DRM_FORMAT_MT21; 347*4882a593Smuzhiyun+#endif 348*4882a593Smuzhiyun+ 349*4882a593Smuzhiyun default: 350*4882a593Smuzhiyun DVLOGF(1) << "Unrecognized format " << FourccToString(format); 351*4882a593Smuzhiyun return 0; 352*4882a593Smuzhiyun@@ -2311,10 +2363,14 @@ bool V4L2Request::ApplyCtrls(struct v4l2_ext_controls* ctrls) { 353*4882a593Smuzhiyun return false; 354*4882a593Smuzhiyun } 355*4882a593Smuzhiyun 356*4882a593Smuzhiyun+#if !BUILDFLAG(USE_LINUX_V4L2) 357*4882a593Smuzhiyun ctrls->which = V4L2_CTRL_WHICH_REQUEST_VAL; 358*4882a593Smuzhiyun ctrls->request_fd = request_fd_.get(); 359*4882a593Smuzhiyun 360*4882a593Smuzhiyun return true; 361*4882a593Smuzhiyun+#else 362*4882a593Smuzhiyun+ return false; 363*4882a593Smuzhiyun+#endif 364*4882a593Smuzhiyun } 365*4882a593Smuzhiyun 366*4882a593Smuzhiyun bool V4L2Request::ApplyQueueBuffer(struct v4l2_buffer* buffer) { 367*4882a593Smuzhiyun@@ -2326,10 +2382,14 @@ bool V4L2Request::ApplyQueueBuffer(struct v4l2_buffer* buffer) { 368*4882a593Smuzhiyun return false; 369*4882a593Smuzhiyun } 370*4882a593Smuzhiyun 371*4882a593Smuzhiyun+#if !BUILDFLAG(USE_LINUX_V4L2) 372*4882a593Smuzhiyun buffer->flags |= V4L2_BUF_FLAG_REQUEST_FD; 373*4882a593Smuzhiyun buffer->request_fd = request_fd_.get(); 374*4882a593Smuzhiyun 375*4882a593Smuzhiyun return true; 376*4882a593Smuzhiyun+#else 377*4882a593Smuzhiyun+ return false; 378*4882a593Smuzhiyun+#endif 379*4882a593Smuzhiyun } 380*4882a593Smuzhiyun 381*4882a593Smuzhiyun bool V4L2Request::Submit() { 382*4882a593Smuzhiyun@@ -2340,7 +2400,11 @@ bool V4L2Request::Submit() { 383*4882a593Smuzhiyun return false; 384*4882a593Smuzhiyun } 385*4882a593Smuzhiyun 386*4882a593Smuzhiyun+#if !BUILDFLAG(USE_LINUX_V4L2) 387*4882a593Smuzhiyun return HANDLE_EINTR(ioctl(request_fd_.get(), MEDIA_REQUEST_IOC_QUEUE)) == 0; 388*4882a593Smuzhiyun+#else 389*4882a593Smuzhiyun+ return false; 390*4882a593Smuzhiyun+#endif 391*4882a593Smuzhiyun } 392*4882a593Smuzhiyun 393*4882a593Smuzhiyun bool V4L2Request::IsCompleted() { 394*4882a593Smuzhiyun@@ -2383,6 +2447,7 @@ bool V4L2Request::Reset() { 395*4882a593Smuzhiyun return false; 396*4882a593Smuzhiyun } 397*4882a593Smuzhiyun 398*4882a593Smuzhiyun+#if !BUILDFLAG(USE_LINUX_V4L2) 399*4882a593Smuzhiyun // Reinit the request to make sure we can use it for a new submission. 400*4882a593Smuzhiyun if (HANDLE_EINTR(ioctl(request_fd_.get(), MEDIA_REQUEST_IOC_REINIT)) < 0) { 401*4882a593Smuzhiyun VPLOGF(1) << "Failed to reinit request."; 402*4882a593Smuzhiyun@@ -2390,6 +2455,9 @@ bool V4L2Request::Reset() { 403*4882a593Smuzhiyun } 404*4882a593Smuzhiyun 405*4882a593Smuzhiyun return true; 406*4882a593Smuzhiyun+#else 407*4882a593Smuzhiyun+ return false; 408*4882a593Smuzhiyun+#endif 409*4882a593Smuzhiyun } 410*4882a593Smuzhiyun 411*4882a593Smuzhiyun V4L2RequestRefBase::V4L2RequestRefBase(V4L2RequestRefBase&& req_base) { 412*4882a593Smuzhiyun@@ -2464,6 +2532,7 @@ V4L2RequestsQueue::~V4L2RequestsQueue() { 413*4882a593Smuzhiyun base::Optional<base::ScopedFD> V4L2RequestsQueue::CreateRequestFD() { 414*4882a593Smuzhiyun DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); 415*4882a593Smuzhiyun 416*4882a593Smuzhiyun+#if !BUILDFLAG(USE_LINUX_V4L2) 417*4882a593Smuzhiyun int request_fd; 418*4882a593Smuzhiyun int ret = HANDLE_EINTR( 419*4882a593Smuzhiyun ioctl(media_fd_.get(), MEDIA_IOC_REQUEST_ALLOC, &request_fd)); 420*4882a593Smuzhiyun@@ -2473,6 +2542,9 @@ base::Optional<base::ScopedFD> V4L2RequestsQueue::CreateRequestFD() { 421*4882a593Smuzhiyun } 422*4882a593Smuzhiyun 423*4882a593Smuzhiyun return base::ScopedFD(request_fd); 424*4882a593Smuzhiyun+#else 425*4882a593Smuzhiyun+ return base::nullopt; 426*4882a593Smuzhiyun+#endif 427*4882a593Smuzhiyun } 428*4882a593Smuzhiyun 429*4882a593Smuzhiyun base::Optional<V4L2RequestRef> V4L2RequestsQueue::GetFreeRequest() { 430*4882a593Smuzhiyundiff --git a/chromium/media/gpu/v4l2/v4l2_video_decoder.cc b/chromium/media/gpu/v4l2/v4l2_video_decoder.cc 431*4882a593Smuzhiyunindex c0963ed40..5b3dd3af2 100644 432*4882a593Smuzhiyun--- a/chromium/media/gpu/v4l2/v4l2_video_decoder.cc 433*4882a593Smuzhiyun+++ b/chromium/media/gpu/v4l2/v4l2_video_decoder.cc 434*4882a593Smuzhiyun@@ -19,7 +19,10 @@ 435*4882a593Smuzhiyun #include "media/gpu/gpu_video_decode_accelerator_helpers.h" 436*4882a593Smuzhiyun #include "media/gpu/macros.h" 437*4882a593Smuzhiyun #include "media/gpu/v4l2/v4l2_video_decoder_backend_stateful.h" 438*4882a593Smuzhiyun+ 439*4882a593Smuzhiyun+#if !BUILDFLAG(USE_LINUX_V4L2) 440*4882a593Smuzhiyun #include "media/gpu/v4l2/v4l2_video_decoder_backend_stateless.h" 441*4882a593Smuzhiyun+#endif 442*4882a593Smuzhiyun 443*4882a593Smuzhiyun namespace media { 444*4882a593Smuzhiyun 445*4882a593Smuzhiyun@@ -35,7 +38,9 @@ constexpr size_t kNumInputBuffers = 16; 446*4882a593Smuzhiyun 447*4882a593Smuzhiyun // Input format V4L2 fourccs this class supports. 448*4882a593Smuzhiyun constexpr uint32_t kSupportedInputFourccs[] = { 449*4882a593Smuzhiyun+#if !BUILDFLAG(USE_LINUX_V4L2) 450*4882a593Smuzhiyun V4L2_PIX_FMT_H264_SLICE, V4L2_PIX_FMT_VP8_FRAME, V4L2_PIX_FMT_VP9_FRAME, 451*4882a593Smuzhiyun+#endif 452*4882a593Smuzhiyun V4L2_PIX_FMT_H264, V4L2_PIX_FMT_VP8, V4L2_PIX_FMT_VP9, 453*4882a593Smuzhiyun }; 454*4882a593Smuzhiyun 455*4882a593Smuzhiyun@@ -204,10 +209,12 @@ void V4L2VideoDecoder::Initialize(const VideoDecoderConfig& config, 456*4882a593Smuzhiyun backend_ = std::make_unique<V4L2StatefulVideoDecoderBackend>( 457*4882a593Smuzhiyun this, device_, profile, decoder_task_runner_); 458*4882a593Smuzhiyun input_format_fourcc = input_format_fourcc_stateful; 459*4882a593Smuzhiyun+#if !BUILDFLAG(USE_LINUX_V4L2) 460*4882a593Smuzhiyun } else if (input_format_fourcc_stateless) { 461*4882a593Smuzhiyun backend_ = std::make_unique<V4L2StatelessVideoDecoderBackend>( 462*4882a593Smuzhiyun this, device_, profile, decoder_task_runner_); 463*4882a593Smuzhiyun input_format_fourcc = input_format_fourcc_stateless; 464*4882a593Smuzhiyun+#endif 465*4882a593Smuzhiyun } else { 466*4882a593Smuzhiyun VLOGF(1) << "No backend capable of taking this profile."; 467*4882a593Smuzhiyun std::move(init_cb).Run(StatusCode::kV4l2FailedResourceAllocation); 468*4882a593Smuzhiyun-- 469*4882a593Smuzhiyun2.20.1 470*4882a593Smuzhiyun 471