diff options
author | Otavio Salvador <otavio@ossystems.com.br> | 2023-01-10 08:59:03 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-01-10 08:59:03 -0300 |
commit | 1c7f17f6063d0b747d94a17059b176f3ebdb3e3e (patch) | |
tree | 5da96ff55339ea98501a9e1f7544a243b20e9983 /dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0107-V4L2VDA-Add-function-IsMultiQueue-for-S_FMT-and-G_FM.patch | |
parent | bd8ff87bf68f52b3933c5d1e9f83c610f18a963d (diff) | |
parent | 481b7f0468b3f5928f8f0fc6aa21e4836fb3f3c5 (diff) | |
download | meta-freescale-1c7f17f6063d0b747d94a17059b176f3ebdb3e3e.tar.gz |
Merge pull request #1380 from Freescale/backport-1375-to-kirkstone
[Backport kirkstone] chromium-ozone-wayland: add bbappend and patches as per NXP 5.15.71_2…
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.patch | 183 |
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 @@ | |||
1 | From 3c9a3ef7f2c45386486a86bdbfa6c355f4c8da05 Mon Sep 17 00:00:00 2001 | ||
2 | From: Hou Qi <qi.hou@nxp.com> | ||
3 | Date: Sun, 4 Sep 2022 15:48:00 +0800 | ||
4 | Subject: [PATCH 07/17] V4L2VDA: Add function IsMultiQueue for S_FMT and G_FMT | ||
5 | |||
6 | Function IsMultiQueue() is used to set correct fotmat type for | ||
7 | 8M and 8Q. | ||
8 | |||
9 | Upstream-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 | |||
16 | diff --git a/media/gpu/v4l2/v4l2_device.cc b/media/gpu/v4l2/v4l2_device.cc | ||
17 | index 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 | |||
77 | diff --git a/media/gpu/v4l2/v4l2_device.h b/media/gpu/v4l2/v4l2_device.h | ||
78 | index 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. | ||
89 | diff --git a/media/gpu/v4l2/v4l2_video_decode_accelerator.cc b/media/gpu/v4l2/v4l2_video_decode_accelerator.cc | ||
90 | index 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 | -- | ||
182 | 2.17.1 | ||
183 | |||