summaryrefslogtreecommitdiffstats
path: root/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0107-V4L2VDA-Add-function-IsMultiQueue-for-S_FMT-and-G_FM.patch
diff options
context:
space:
mode:
Diffstat (limited to 'dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0107-V4L2VDA-Add-function-IsMultiQueue-for-S_FMT-and-G_FM.patch')
-rw-r--r--dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0107-V4L2VDA-Add-function-IsMultiQueue-for-S_FMT-and-G_FM.patch183
1 files changed, 183 insertions, 0 deletions
diff --git a/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0107-V4L2VDA-Add-function-IsMultiQueue-for-S_FMT-and-G_FM.patch b/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0107-V4L2VDA-Add-function-IsMultiQueue-for-S_FMT-and-G_FM.patch
new file mode 100644
index 00000000..2e9b4431
--- /dev/null
+++ b/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0107-V4L2VDA-Add-function-IsMultiQueue-for-S_FMT-and-G_FM.patch
@@ -0,0 +1,183 @@
1From 3c9a3ef7f2c45386486a86bdbfa6c355f4c8da05 Mon Sep 17 00:00:00 2001
2From: Hou Qi <qi.hou@nxp.com>
3Date: Sun, 4 Sep 2022 15:48:00 +0800
4Subject: [PATCH 07/17] V4L2VDA: Add function IsMultiQueue for S_FMT and G_FMT
5
6Function IsMultiQueue() is used to set correct fotmat type for
78M and 8Q.
8
9Upstream-Status: Inappropriate [NXP specific]
10---
11 media/gpu/v4l2/v4l2_device.cc | 36 +++++++++++---
12 media/gpu/v4l2/v4l2_device.h | 1 +
13 .../gpu/v4l2/v4l2_video_decode_accelerator.cc | 49 +++++++++++++++----
14 3 files changed, 68 insertions(+), 18 deletions(-)
15
16diff --git a/media/gpu/v4l2/v4l2_device.cc b/media/gpu/v4l2/v4l2_device.cc
17index a9462c9a2fb2d..200b0fccb1232 100644
18--- a/media/gpu/v4l2/v4l2_device.cc
19+++ b/media/gpu/v4l2/v4l2_device.cc
20@@ -58,11 +58,18 @@ struct v4l2_format BuildV4L2Format(const enum v4l2_buf_type type,
21 struct v4l2_format format;
22 memset(&format, 0, sizeof(format));
23 format.type = type;
24- format.fmt.pix_mp.pixelformat = fourcc;
25- format.fmt.pix_mp.width = size.width();
26- format.fmt.pix_mp.height = size.height();
27- format.fmt.pix_mp.num_planes = V4L2Device::GetNumPlanesOfV4L2PixFmt(fourcc);
28- format.fmt.pix_mp.plane_fmt[0].sizeimage = buffer_size;
29+ if (V4L2_TYPE_IS_MULTIPLANAR(type)) {
30+ format.fmt.pix_mp.pixelformat = fourcc;
31+ format.fmt.pix_mp.width = size.width();
32+ format.fmt.pix_mp.height = size.height();
33+ format.fmt.pix_mp.num_planes = V4L2Device::GetNumPlanesOfV4L2PixFmt(fourcc);
34+ format.fmt.pix_mp.plane_fmt[0].sizeimage = buffer_size;
35+ } else {
36+ format.fmt.pix.pixelformat = fourcc;
37+ format.fmt.pix.width = size.width();
38+ format.fmt.pix.height = size.height();
39+ format.fmt.pix.sizeimage = buffer_size;
40+ }
41
42 return format;
43 }
44@@ -476,9 +483,13 @@ V4L2BufferRefBase::V4L2BufferRefBase(const struct v4l2_buffer& v4l2_buffer,
45 DCHECK(return_to_);
46
47 memcpy(&v4l2_buffer_, &v4l2_buffer, sizeof(v4l2_buffer_));
48- memcpy(v4l2_planes_, v4l2_buffer.m.planes,
49- sizeof(struct v4l2_plane) * v4l2_buffer.length);
50- v4l2_buffer_.m.planes = v4l2_planes_;
51+ if (V4L2_TYPE_IS_MULTIPLANAR(v4l2_buffer.type)) {
52+ memcpy(v4l2_planes_, v4l2_buffer.m.planes,
53+ sizeof(struct v4l2_plane) * v4l2_buffer.length);
54+ v4l2_buffer_.m.planes = v4l2_planes_;
55+ } else {
56+ memcpy(&v4l2_planes_[0].m, &v4l2_buffer.m, sizeof(v4l2_buffer.m));
57+ }
58 }
59
60 V4L2BufferRefBase::~V4L2BufferRefBase() {
61@@ -1434,6 +1445,15 @@ bool V4L2Queue::Streamoff() {
62 return true;
63 }
64
65+bool V4L2Queue::IsMultiQueue() {
66+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
67+
68+ if (type_ == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE || type_ == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
69+ return true;
70+ else
71+ return false;
72+}
73+
74 size_t V4L2Queue::AllocatedBuffersCount() const {
75 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
76
77diff --git a/media/gpu/v4l2/v4l2_device.h b/media/gpu/v4l2/v4l2_device.h
78index 70f47ae91b648..86ef80fd09579 100644
79--- a/media/gpu/v4l2/v4l2_device.h
80+++ b/media/gpu/v4l2/v4l2_device.h
81@@ -424,6 +424,7 @@ class MEDIA_GPU_EXPORT V4L2Queue
82 // still be using them.
83 bool Streamoff();
84
85+ bool IsMultiQueue();
86 // Returns the number of buffers currently allocated for this queue.
87 size_t AllocatedBuffersCount() const;
88 // Returns the number of currently free buffers on this queue.
89diff --git a/media/gpu/v4l2/v4l2_video_decode_accelerator.cc b/media/gpu/v4l2/v4l2_video_decode_accelerator.cc
90index 631e68e0f9314..54c72c6148d94 100644
91--- a/media/gpu/v4l2/v4l2_video_decode_accelerator.cc
92+++ b/media/gpu/v4l2/v4l2_video_decode_accelerator.cc
93@@ -2153,12 +2153,30 @@ bool V4L2VideoDecodeAccelerator::GetFormatInfo(struct v4l2_format* format,
94 }
95
96 // Make sure we are still getting the format we set on initialization.
97- if (format->fmt.pix_mp.pixelformat != output_format_fourcc_->ToV4L2PixFmt()) {
98+ unsigned int pixelformat = V4L2_TYPE_IS_MULTIPLANAR(format->type) ?
99+ format->fmt.pix_mp.pixelformat : format->fmt.pix.pixelformat;
100+ if (pixelformat != output_format_fourcc_->ToV4L2PixFmt()) {
101 VLOGF(1) << "Unexpected format from G_FMT on output";
102 return false;
103 }
104
105- gfx::Size coded_size(format->fmt.pix_mp.width, format->fmt.pix_mp.height);
106+ int width, height;
107+ if (V4L2_TYPE_IS_MULTIPLANAR(format->type)) {
108+ width = format->fmt.pix_mp.width;
109+ height = format->fmt.pix_mp.height;
110+ if ((format->fmt.pix_mp.width == 0) && (format->fmt.pix_mp.height == 0))
111+ {
112+ *again = true;
113+ VLOG(1)<<"As got width=height=0 again";
114+ } else {
115+ VLOG(1)<<"format wxh" << format->fmt.pix_mp.width << "x" << format->fmt.pix_mp.height;
116+ }
117+ } else {
118+ width = format->fmt.pix.width;
119+ height = format->fmt.pix.height;
120+ }
121+
122+ gfx::Size coded_size(width, height);
123 if (visible_size != nullptr)
124 *visible_size = GetVisibleSize(coded_size);
125
126@@ -2263,7 +2281,7 @@ bool V4L2VideoDecodeAccelerator::SetupFormats() {
127
128 struct v4l2_fmtdesc fmtdesc;
129 memset(&fmtdesc, 0, sizeof(fmtdesc));
130- fmtdesc.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
131+ fmtdesc.type = input_queue_->IsMultiQueue() ? V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE : V4L2_BUF_TYPE_VIDEO_OUTPUT;
132 bool is_format_supported = false;
133 while (device_->Ioctl(VIDIOC_ENUM_FMT, &fmtdesc) == 0) {
134 if (fmtdesc.pixelformat == input_format_fourcc_) {
135@@ -2281,10 +2299,16 @@ bool V4L2VideoDecodeAccelerator::SetupFormats() {
136
137 struct v4l2_format format;
138 memset(&format, 0, sizeof(format));
139- format.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
140- format.fmt.pix_mp.pixelformat = input_format_fourcc_;
141- format.fmt.pix_mp.plane_fmt[0].sizeimage = input_size;
142- format.fmt.pix_mp.num_planes = 1;
143+ if (input_queue_->IsMultiQueue()) {
144+ format.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
145+ format.fmt.pix_mp.pixelformat = input_format_fourcc_;
146+ format.fmt.pix_mp.plane_fmt[0].sizeimage = input_size;
147+ format.fmt.pix_mp.num_planes = 1;
148+ } else {
149+ format.type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
150+ format.fmt.pix.pixelformat = input_format_fourcc_;
151+ format.fmt.pix.sizeimage = input_size;
152+ }
153 IOCTL_OR_ERROR_RETURN_FALSE(VIDIOC_S_FMT, &format);
154 DCHECK_EQ(format.fmt.pix_mp.pixelformat, input_format_fourcc_);
155
156@@ -2292,7 +2316,7 @@ bool V4L2VideoDecodeAccelerator::SetupFormats() {
157 // changing it once we start streaming; whether it can support our chosen
158 // output format or not may depend on the input format.
159 memset(&fmtdesc, 0, sizeof(fmtdesc));
160- fmtdesc.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
161+ fmtdesc.type = output_queue_->IsMultiQueue() ? V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE : V4L2_BUF_TYPE_VIDEO_CAPTURE;
162 while (device_->Ioctl(VIDIOC_ENUM_FMT, &fmtdesc) == 0) {
163 auto fourcc = Fourcc::FromV4L2PixFmt(fmtdesc.pixelformat);
164 if (fourcc && device_->CanCreateEGLImageFrom(*fourcc)) {
165@@ -2334,8 +2358,13 @@ bool V4L2VideoDecodeAccelerator::SetupFormats() {
166 // Just set the fourcc for output; resolution, etc., will come from the
167 // driver once it extracts it from the stream.
168 memset(&format, 0, sizeof(format));
169- format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
170- format.fmt.pix_mp.pixelformat = output_format_fourcc_->ToV4L2PixFmt();
171+ if (output_queue_->IsMultiQueue()) {
172+ format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
173+ format.fmt.pix_mp.pixelformat = output_format_fourcc_->ToV4L2PixFmt();
174+ } else {
175+ format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
176+ format.fmt.pix.pixelformat = output_format_fourcc_->ToV4L2PixFmt();
177+ }
178 IOCTL_OR_ERROR_RETURN_FALSE(VIDIOC_S_FMT, &format);
179 DCHECK_EQ(format.fmt.pix_mp.pixelformat,
180 output_format_fourcc_->ToV4L2PixFmt());
181--
1822.17.1
183