1*0ec5a0ecSAndroid Build Coastguard Worker // Copyright 2015 The Chromium Authors. All rights reserved.
2*0ec5a0ecSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*0ec5a0ecSAndroid Build Coastguard Worker // found in the LICENSE file.
4*0ec5a0ecSAndroid Build Coastguard Worker // Note: ported from Chromium commit head: 3b7ce92816e2
5*0ec5a0ecSAndroid Build Coastguard Worker // Note: only necessary functions are ported from video_types.cc
6*0ec5a0ecSAndroid Build Coastguard Worker
7*0ec5a0ecSAndroid Build Coastguard Worker #include <v4l2_codec2/common/VideoPixelFormat.h>
8*0ec5a0ecSAndroid Build Coastguard Worker
9*0ec5a0ecSAndroid Build Coastguard Worker #include <base/bits.h>
10*0ec5a0ecSAndroid Build Coastguard Worker #include <utils/Log.h>
11*0ec5a0ecSAndroid Build Coastguard Worker
12*0ec5a0ecSAndroid Build Coastguard Worker namespace android {
13*0ec5a0ecSAndroid Build Coastguard Worker
14*0ec5a0ecSAndroid Build Coastguard Worker namespace {
15*0ec5a0ecSAndroid Build Coastguard Worker
16*0ec5a0ecSAndroid Build Coastguard Worker enum {
17*0ec5a0ecSAndroid Build Coastguard Worker kMaxPlanes = 4,
18*0ec5a0ecSAndroid Build Coastguard Worker kYPlane = 0,
19*0ec5a0ecSAndroid Build Coastguard Worker kARGBPlane = kYPlane,
20*0ec5a0ecSAndroid Build Coastguard Worker kUPlane = 1,
21*0ec5a0ecSAndroid Build Coastguard Worker kUVPlane = kUPlane,
22*0ec5a0ecSAndroid Build Coastguard Worker kVPlane = 2,
23*0ec5a0ecSAndroid Build Coastguard Worker kAPlane = 3,
24*0ec5a0ecSAndroid Build Coastguard Worker };
25*0ec5a0ecSAndroid Build Coastguard Worker }
26*0ec5a0ecSAndroid Build Coastguard Worker
videoPixelFormatToString(VideoPixelFormat format)27*0ec5a0ecSAndroid Build Coastguard Worker std::string videoPixelFormatToString(VideoPixelFormat format) {
28*0ec5a0ecSAndroid Build Coastguard Worker switch (format) {
29*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::I420:
30*0ec5a0ecSAndroid Build Coastguard Worker return "I420";
31*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YV12:
32*0ec5a0ecSAndroid Build Coastguard Worker return "YV12";
33*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::I422:
34*0ec5a0ecSAndroid Build Coastguard Worker return "I422";
35*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::I420A:
36*0ec5a0ecSAndroid Build Coastguard Worker return "I420A";
37*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::I444:
38*0ec5a0ecSAndroid Build Coastguard Worker return "I444";
39*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::NV12:
40*0ec5a0ecSAndroid Build Coastguard Worker return "NV12";
41*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::NV21:
42*0ec5a0ecSAndroid Build Coastguard Worker return "NV21";
43*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUY2:
44*0ec5a0ecSAndroid Build Coastguard Worker return "YUY2";
45*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::ARGB:
46*0ec5a0ecSAndroid Build Coastguard Worker return "ARGB";
47*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::XRGB:
48*0ec5a0ecSAndroid Build Coastguard Worker return "XRGB";
49*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::RGB24:
50*0ec5a0ecSAndroid Build Coastguard Worker return "RGB24";
51*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::MJPEG:
52*0ec5a0ecSAndroid Build Coastguard Worker return "MJPEG";
53*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV420P9:
54*0ec5a0ecSAndroid Build Coastguard Worker return "YUV420P9";
55*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV420P10:
56*0ec5a0ecSAndroid Build Coastguard Worker return "YUV420P10";
57*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV422P9:
58*0ec5a0ecSAndroid Build Coastguard Worker return "YUV422P9";
59*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV422P10:
60*0ec5a0ecSAndroid Build Coastguard Worker return "YUV422P10";
61*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV444P9:
62*0ec5a0ecSAndroid Build Coastguard Worker return "YUV444P9";
63*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV444P10:
64*0ec5a0ecSAndroid Build Coastguard Worker return "YUV444P10";
65*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV420P12:
66*0ec5a0ecSAndroid Build Coastguard Worker return "YUV420P12";
67*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV422P12:
68*0ec5a0ecSAndroid Build Coastguard Worker return "YUV422P12";
69*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV444P12:
70*0ec5a0ecSAndroid Build Coastguard Worker return "YUV444P12";
71*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::Y16:
72*0ec5a0ecSAndroid Build Coastguard Worker return "Y16";
73*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::ABGR:
74*0ec5a0ecSAndroid Build Coastguard Worker return "ABGR";
75*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::XBGR:
76*0ec5a0ecSAndroid Build Coastguard Worker return "XBGR";
77*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::P016LE:
78*0ec5a0ecSAndroid Build Coastguard Worker return "P016LE";
79*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::XR30:
80*0ec5a0ecSAndroid Build Coastguard Worker return "XR30";
81*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::XB30:
82*0ec5a0ecSAndroid Build Coastguard Worker return "XB30";
83*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::BGRA:
84*0ec5a0ecSAndroid Build Coastguard Worker return "BGRA";
85*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::RGBA:
86*0ec5a0ecSAndroid Build Coastguard Worker return "BGRA";
87*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::UNKNOWN:
88*0ec5a0ecSAndroid Build Coastguard Worker return "UNKNOWN";
89*0ec5a0ecSAndroid Build Coastguard Worker }
90*0ec5a0ecSAndroid Build Coastguard Worker }
91*0ec5a0ecSAndroid Build Coastguard Worker
fourccToString(uint32_t fourcc)92*0ec5a0ecSAndroid Build Coastguard Worker std::string fourccToString(uint32_t fourcc) {
93*0ec5a0ecSAndroid Build Coastguard Worker std::string result = "0000";
94*0ec5a0ecSAndroid Build Coastguard Worker for (size_t i = 0; i < 4; ++i, fourcc >>= 8) {
95*0ec5a0ecSAndroid Build Coastguard Worker const char c = static_cast<char>(fourcc & 0xFF);
96*0ec5a0ecSAndroid Build Coastguard Worker if (c <= 0x1f || c >= 0x7f) {
97*0ec5a0ecSAndroid Build Coastguard Worker return (std::stringstream("0x") << std::hex << fourcc).str();
98*0ec5a0ecSAndroid Build Coastguard Worker }
99*0ec5a0ecSAndroid Build Coastguard Worker result[i] = c;
100*0ec5a0ecSAndroid Build Coastguard Worker }
101*0ec5a0ecSAndroid Build Coastguard Worker return result;
102*0ec5a0ecSAndroid Build Coastguard Worker }
103*0ec5a0ecSAndroid Build Coastguard Worker
bitDepth(VideoPixelFormat format)104*0ec5a0ecSAndroid Build Coastguard Worker size_t bitDepth(VideoPixelFormat format) {
105*0ec5a0ecSAndroid Build Coastguard Worker switch (format) {
106*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::I420:
107*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YV12:
108*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::I422:
109*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::I420A:
110*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::I444:
111*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::NV12:
112*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::NV21:
113*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUY2:
114*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::ARGB:
115*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::XRGB:
116*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::RGB24:
117*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::MJPEG:
118*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::ABGR:
119*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::XBGR:
120*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::BGRA:
121*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::RGBA:
122*0ec5a0ecSAndroid Build Coastguard Worker return 8;
123*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV420P9:
124*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV422P9:
125*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV444P9:
126*0ec5a0ecSAndroid Build Coastguard Worker return 9;
127*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV420P10:
128*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV422P10:
129*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV444P10:
130*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::XR30:
131*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::XB30:
132*0ec5a0ecSAndroid Build Coastguard Worker return 10;
133*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV420P12:
134*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV422P12:
135*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV444P12:
136*0ec5a0ecSAndroid Build Coastguard Worker return 12;
137*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::Y16:
138*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::P016LE:
139*0ec5a0ecSAndroid Build Coastguard Worker return 16;
140*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::UNKNOWN:
141*0ec5a0ecSAndroid Build Coastguard Worker ALOGE("Invalid pixel format");
142*0ec5a0ecSAndroid Build Coastguard Worker return 0;
143*0ec5a0ecSAndroid Build Coastguard Worker }
144*0ec5a0ecSAndroid Build Coastguard Worker }
145*0ec5a0ecSAndroid Build Coastguard Worker
146*0ec5a0ecSAndroid Build Coastguard Worker // If it is required to allocate aligned to multiple-of-two size overall for the
147*0ec5a0ecSAndroid Build Coastguard Worker // frame of pixel |format|.
RequiresEvenSizeAllocation(VideoPixelFormat format)148*0ec5a0ecSAndroid Build Coastguard Worker static bool RequiresEvenSizeAllocation(VideoPixelFormat format) {
149*0ec5a0ecSAndroid Build Coastguard Worker switch (format) {
150*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::ARGB:
151*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::XRGB:
152*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::RGB24:
153*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::Y16:
154*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::ABGR:
155*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::XBGR:
156*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::XR30:
157*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::XB30:
158*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::BGRA:
159*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::RGBA:
160*0ec5a0ecSAndroid Build Coastguard Worker return false;
161*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::NV12:
162*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::NV21:
163*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::I420:
164*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::MJPEG:
165*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUY2:
166*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YV12:
167*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::I422:
168*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::I444:
169*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV420P9:
170*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV422P9:
171*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV444P9:
172*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV420P10:
173*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV422P10:
174*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV444P10:
175*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV420P12:
176*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV422P12:
177*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV444P12:
178*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::I420A:
179*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::P016LE:
180*0ec5a0ecSAndroid Build Coastguard Worker return true;
181*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::UNKNOWN:
182*0ec5a0ecSAndroid Build Coastguard Worker ALOGE("Invalid pixel format");
183*0ec5a0ecSAndroid Build Coastguard Worker return false;
184*0ec5a0ecSAndroid Build Coastguard Worker }
185*0ec5a0ecSAndroid Build Coastguard Worker }
186*0ec5a0ecSAndroid Build Coastguard Worker
numPlanes(VideoPixelFormat format)187*0ec5a0ecSAndroid Build Coastguard Worker size_t numPlanes(VideoPixelFormat format) {
188*0ec5a0ecSAndroid Build Coastguard Worker switch (format) {
189*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUY2:
190*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::ARGB:
191*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::BGRA:
192*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::RGBA:
193*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::XRGB:
194*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::RGB24:
195*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::MJPEG:
196*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::Y16:
197*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::ABGR:
198*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::XBGR:
199*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::XR30:
200*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::XB30:
201*0ec5a0ecSAndroid Build Coastguard Worker return 1;
202*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::NV12:
203*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::NV21:
204*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::P016LE:
205*0ec5a0ecSAndroid Build Coastguard Worker return 2;
206*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::I420:
207*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YV12:
208*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::I422:
209*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::I444:
210*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV420P9:
211*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV422P9:
212*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV444P9:
213*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV420P10:
214*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV422P10:
215*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV444P10:
216*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV420P12:
217*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV422P12:
218*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV444P12:
219*0ec5a0ecSAndroid Build Coastguard Worker return 3;
220*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::I420A:
221*0ec5a0ecSAndroid Build Coastguard Worker return 4;
222*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::UNKNOWN:
223*0ec5a0ecSAndroid Build Coastguard Worker // Note: VideoPixelFormat::UNKNOWN is used for end-of-stream frame.
224*0ec5a0ecSAndroid Build Coastguard Worker return 0;
225*0ec5a0ecSAndroid Build Coastguard Worker }
226*0ec5a0ecSAndroid Build Coastguard Worker }
227*0ec5a0ecSAndroid Build Coastguard Worker
allocationSize(VideoPixelFormat format,const android::ui::Size & coded_size)228*0ec5a0ecSAndroid Build Coastguard Worker size_t allocationSize(VideoPixelFormat format, const android::ui::Size& coded_size) {
229*0ec5a0ecSAndroid Build Coastguard Worker size_t total = 0;
230*0ec5a0ecSAndroid Build Coastguard Worker for (size_t i = 0; i < numPlanes(format); ++i) {
231*0ec5a0ecSAndroid Build Coastguard Worker android::ui::Size plane_size = planeSize(format, i, coded_size);
232*0ec5a0ecSAndroid Build Coastguard Worker total += (plane_size.width * plane_size.height);
233*0ec5a0ecSAndroid Build Coastguard Worker }
234*0ec5a0ecSAndroid Build Coastguard Worker
235*0ec5a0ecSAndroid Build Coastguard Worker return total;
236*0ec5a0ecSAndroid Build Coastguard Worker }
237*0ec5a0ecSAndroid Build Coastguard Worker
planeSize(VideoPixelFormat format,size_t plane,const android::ui::Size & coded_size)238*0ec5a0ecSAndroid Build Coastguard Worker android::ui::Size planeSize(VideoPixelFormat format, size_t plane,
239*0ec5a0ecSAndroid Build Coastguard Worker const android::ui::Size& coded_size) {
240*0ec5a0ecSAndroid Build Coastguard Worker ALOG_ASSERT(isValidPlane(plane, format));
241*0ec5a0ecSAndroid Build Coastguard Worker
242*0ec5a0ecSAndroid Build Coastguard Worker int width = coded_size.width;
243*0ec5a0ecSAndroid Build Coastguard Worker int height = coded_size.height;
244*0ec5a0ecSAndroid Build Coastguard Worker if (RequiresEvenSizeAllocation(format)) {
245*0ec5a0ecSAndroid Build Coastguard Worker // Align to multiple-of-two size overall. This ensures that non-subsampled
246*0ec5a0ecSAndroid Build Coastguard Worker // planes can be addressed by pixel with the same scaling as the subsampled
247*0ec5a0ecSAndroid Build Coastguard Worker // planes.
248*0ec5a0ecSAndroid Build Coastguard Worker width = base::bits::Align(width, 2);
249*0ec5a0ecSAndroid Build Coastguard Worker height = base::bits::Align(height, 2);
250*0ec5a0ecSAndroid Build Coastguard Worker }
251*0ec5a0ecSAndroid Build Coastguard Worker
252*0ec5a0ecSAndroid Build Coastguard Worker const android::ui::Size subsample = SampleSize(format, plane);
253*0ec5a0ecSAndroid Build Coastguard Worker ALOG_ASSERT(width % subsample.width == 0);
254*0ec5a0ecSAndroid Build Coastguard Worker ALOG_ASSERT(height % subsample.height == 0);
255*0ec5a0ecSAndroid Build Coastguard Worker return android::ui::Size(bytesPerElement(format, plane) * width / subsample.width,
256*0ec5a0ecSAndroid Build Coastguard Worker height / subsample.height);
257*0ec5a0ecSAndroid Build Coastguard Worker }
258*0ec5a0ecSAndroid Build Coastguard Worker
planeHorizontalBitsPerPixel(VideoPixelFormat format,size_t plane)259*0ec5a0ecSAndroid Build Coastguard Worker int planeHorizontalBitsPerPixel(VideoPixelFormat format, size_t plane) {
260*0ec5a0ecSAndroid Build Coastguard Worker ALOG_ASSERT(isValidPlane(plane, format));
261*0ec5a0ecSAndroid Build Coastguard Worker const int bitsPerElement = 8 * bytesPerElement(format, plane);
262*0ec5a0ecSAndroid Build Coastguard Worker const int horizPixelsPerElement = SampleSize(format, plane).width;
263*0ec5a0ecSAndroid Build Coastguard Worker ALOG_ASSERT(bitsPerElement % horizPixelsPerElement == 0);
264*0ec5a0ecSAndroid Build Coastguard Worker return bitsPerElement / horizPixelsPerElement;
265*0ec5a0ecSAndroid Build Coastguard Worker }
266*0ec5a0ecSAndroid Build Coastguard Worker
planeBitsPerPixel(VideoPixelFormat format,size_t plane)267*0ec5a0ecSAndroid Build Coastguard Worker int planeBitsPerPixel(VideoPixelFormat format, size_t plane) {
268*0ec5a0ecSAndroid Build Coastguard Worker ALOG_ASSERT(isValidPlane(plane, format));
269*0ec5a0ecSAndroid Build Coastguard Worker return planeHorizontalBitsPerPixel(format, plane) / SampleSize(format, plane).height;
270*0ec5a0ecSAndroid Build Coastguard Worker }
271*0ec5a0ecSAndroid Build Coastguard Worker
bytesPerElement(VideoPixelFormat format,size_t plane)272*0ec5a0ecSAndroid Build Coastguard Worker int bytesPerElement(VideoPixelFormat format, size_t plane) {
273*0ec5a0ecSAndroid Build Coastguard Worker ALOG_ASSERT(isValidPlane(format, plane));
274*0ec5a0ecSAndroid Build Coastguard Worker switch (format) {
275*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::ARGB:
276*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::BGRA:
277*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::RGBA:
278*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::XRGB:
279*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::ABGR:
280*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::XBGR:
281*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::XR30:
282*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::XB30:
283*0ec5a0ecSAndroid Build Coastguard Worker return 4;
284*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::RGB24:
285*0ec5a0ecSAndroid Build Coastguard Worker return 3;
286*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::Y16:
287*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUY2:
288*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV420P9:
289*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV422P9:
290*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV444P9:
291*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV420P10:
292*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV422P10:
293*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV444P10:
294*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV420P12:
295*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV422P12:
296*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV444P12:
297*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::P016LE:
298*0ec5a0ecSAndroid Build Coastguard Worker return 2;
299*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::NV12:
300*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::NV21: {
301*0ec5a0ecSAndroid Build Coastguard Worker static const int bytes_per_element[] = {1, 2};
302*0ec5a0ecSAndroid Build Coastguard Worker ALOG_ASSERT(plane < base::size(bytes_per_element));
303*0ec5a0ecSAndroid Build Coastguard Worker return bytes_per_element[plane];
304*0ec5a0ecSAndroid Build Coastguard Worker }
305*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YV12:
306*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::I420:
307*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::I422:
308*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::I420A:
309*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::I444:
310*0ec5a0ecSAndroid Build Coastguard Worker return 1;
311*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::MJPEG:
312*0ec5a0ecSAndroid Build Coastguard Worker return 0;
313*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::UNKNOWN:
314*0ec5a0ecSAndroid Build Coastguard Worker ALOGE("Invalid pixel format");
315*0ec5a0ecSAndroid Build Coastguard Worker return 0;
316*0ec5a0ecSAndroid Build Coastguard Worker }
317*0ec5a0ecSAndroid Build Coastguard Worker }
318*0ec5a0ecSAndroid Build Coastguard Worker
isValidPlane(VideoPixelFormat format,size_t plane)319*0ec5a0ecSAndroid Build Coastguard Worker bool isValidPlane(VideoPixelFormat format, size_t plane) {
320*0ec5a0ecSAndroid Build Coastguard Worker ALOG_ASSERT(numPlanes(format) <= static_cast<size_t>(kMaxPlanes));
321*0ec5a0ecSAndroid Build Coastguard Worker return plane < numPlanes(format);
322*0ec5a0ecSAndroid Build Coastguard Worker }
323*0ec5a0ecSAndroid Build Coastguard Worker
SampleSize(VideoPixelFormat format,size_t plane)324*0ec5a0ecSAndroid Build Coastguard Worker android::ui::Size SampleSize(VideoPixelFormat format, size_t plane) {
325*0ec5a0ecSAndroid Build Coastguard Worker ALOG_ASSERT(isValidPlane(format, plane));
326*0ec5a0ecSAndroid Build Coastguard Worker
327*0ec5a0ecSAndroid Build Coastguard Worker switch (plane) {
328*0ec5a0ecSAndroid Build Coastguard Worker case kYPlane: // and kARGBPlane:
329*0ec5a0ecSAndroid Build Coastguard Worker case kAPlane:
330*0ec5a0ecSAndroid Build Coastguard Worker return android::ui::Size(1, 1);
331*0ec5a0ecSAndroid Build Coastguard Worker
332*0ec5a0ecSAndroid Build Coastguard Worker case kUPlane: // and kUVPlane:
333*0ec5a0ecSAndroid Build Coastguard Worker case kVPlane:
334*0ec5a0ecSAndroid Build Coastguard Worker switch (format) {
335*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::I444:
336*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV444P9:
337*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV444P10:
338*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV444P12:
339*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::Y16:
340*0ec5a0ecSAndroid Build Coastguard Worker return android::ui::Size(1, 1);
341*0ec5a0ecSAndroid Build Coastguard Worker
342*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::I422:
343*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV422P9:
344*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV422P10:
345*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV422P12:
346*0ec5a0ecSAndroid Build Coastguard Worker return android::ui::Size(2, 1);
347*0ec5a0ecSAndroid Build Coastguard Worker
348*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YV12:
349*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::I420:
350*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::I420A:
351*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::NV12:
352*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::NV21:
353*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV420P9:
354*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV420P10:
355*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUV420P12:
356*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::P016LE:
357*0ec5a0ecSAndroid Build Coastguard Worker return android::ui::Size(2, 2);
358*0ec5a0ecSAndroid Build Coastguard Worker
359*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::UNKNOWN:
360*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::YUY2:
361*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::ARGB:
362*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::XRGB:
363*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::RGB24:
364*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::MJPEG:
365*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::ABGR:
366*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::XBGR:
367*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::XR30:
368*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::XB30:
369*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::BGRA:
370*0ec5a0ecSAndroid Build Coastguard Worker case VideoPixelFormat::RGBA:
371*0ec5a0ecSAndroid Build Coastguard Worker ALOGE("Invalid pixel format");
372*0ec5a0ecSAndroid Build Coastguard Worker }
373*0ec5a0ecSAndroid Build Coastguard Worker }
374*0ec5a0ecSAndroid Build Coastguard Worker
375*0ec5a0ecSAndroid Build Coastguard Worker return android::ui::Size();
376*0ec5a0ecSAndroid Build Coastguard Worker }
377*0ec5a0ecSAndroid Build Coastguard Worker
378*0ec5a0ecSAndroid Build Coastguard Worker } // namespace android
379