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