1*e1eccf28SAndroid Build Coastguard Worker /*
2*e1eccf28SAndroid Build Coastguard Worker * Copyright (C) 2013 The Android Open Source Project
3*e1eccf28SAndroid Build Coastguard Worker *
4*e1eccf28SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*e1eccf28SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*e1eccf28SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*e1eccf28SAndroid Build Coastguard Worker *
8*e1eccf28SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*e1eccf28SAndroid Build Coastguard Worker *
10*e1eccf28SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*e1eccf28SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*e1eccf28SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e1eccf28SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*e1eccf28SAndroid Build Coastguard Worker * limitations under the License.
15*e1eccf28SAndroid Build Coastguard Worker */
16*e1eccf28SAndroid Build Coastguard Worker
17*e1eccf28SAndroid Build Coastguard Worker #include <cstdint>
18*e1eccf28SAndroid Build Coastguard Worker
19*e1eccf28SAndroid Build Coastguard Worker #include "RenderScriptToolkit.h"
20*e1eccf28SAndroid Build Coastguard Worker #include "TaskProcessor.h"
21*e1eccf28SAndroid Build Coastguard Worker #include "Utils.h"
22*e1eccf28SAndroid Build Coastguard Worker
23*e1eccf28SAndroid Build Coastguard Worker #define LOG_TAG "renderscript.toolkit.YuvToRgb"
24*e1eccf28SAndroid Build Coastguard Worker
25*e1eccf28SAndroid Build Coastguard Worker namespace android {
26*e1eccf28SAndroid Build Coastguard Worker namespace renderscript {
27*e1eccf28SAndroid Build Coastguard Worker
roundUpTo16(size_t val)28*e1eccf28SAndroid Build Coastguard Worker inline size_t roundUpTo16(size_t val) {
29*e1eccf28SAndroid Build Coastguard Worker return (val + 15) & ~15;
30*e1eccf28SAndroid Build Coastguard Worker }
31*e1eccf28SAndroid Build Coastguard Worker
32*e1eccf28SAndroid Build Coastguard Worker class YuvToRgbTask : public Task {
33*e1eccf28SAndroid Build Coastguard Worker uchar4* mOut;
34*e1eccf28SAndroid Build Coastguard Worker size_t mCstep;
35*e1eccf28SAndroid Build Coastguard Worker size_t mStrideY;
36*e1eccf28SAndroid Build Coastguard Worker size_t mStrideU;
37*e1eccf28SAndroid Build Coastguard Worker size_t mStrideV;
38*e1eccf28SAndroid Build Coastguard Worker const uchar* mInY;
39*e1eccf28SAndroid Build Coastguard Worker const uchar* mInU;
40*e1eccf28SAndroid Build Coastguard Worker const uchar* mInV;
41*e1eccf28SAndroid Build Coastguard Worker
42*e1eccf28SAndroid Build Coastguard Worker void kernel(uchar4* out, uint32_t xstart, uint32_t xend, uint32_t currentY);
43*e1eccf28SAndroid Build Coastguard Worker // Process a 2D tile of the overall work. threadIndex identifies which thread does the work.
44*e1eccf28SAndroid Build Coastguard Worker virtual void processData(int threadIndex, size_t startX, size_t startY, size_t endX,
45*e1eccf28SAndroid Build Coastguard Worker size_t endY) override;
46*e1eccf28SAndroid Build Coastguard Worker
47*e1eccf28SAndroid Build Coastguard Worker public:
YuvToRgbTask(const uint8_t * input,uint8_t * output,size_t sizeX,size_t sizeY,RenderScriptToolkit::YuvFormat format)48*e1eccf28SAndroid Build Coastguard Worker YuvToRgbTask(const uint8_t* input, uint8_t* output, size_t sizeX, size_t sizeY,
49*e1eccf28SAndroid Build Coastguard Worker RenderScriptToolkit::YuvFormat format)
50*e1eccf28SAndroid Build Coastguard Worker : Task{sizeX, sizeY, 4, false, nullptr}, mOut{reinterpret_cast<uchar4*>(output)} {
51*e1eccf28SAndroid Build Coastguard Worker switch (format) {
52*e1eccf28SAndroid Build Coastguard Worker case RenderScriptToolkit::YuvFormat::NV21:
53*e1eccf28SAndroid Build Coastguard Worker mCstep = 2;
54*e1eccf28SAndroid Build Coastguard Worker mStrideY = sizeX;
55*e1eccf28SAndroid Build Coastguard Worker mStrideU = mStrideY;
56*e1eccf28SAndroid Build Coastguard Worker mStrideV = mStrideY;
57*e1eccf28SAndroid Build Coastguard Worker mInY = reinterpret_cast<const uchar*>(input);
58*e1eccf28SAndroid Build Coastguard Worker mInV = reinterpret_cast<const uchar*>(input + mStrideY * sizeY);
59*e1eccf28SAndroid Build Coastguard Worker mInU = mInV + 1;
60*e1eccf28SAndroid Build Coastguard Worker break;
61*e1eccf28SAndroid Build Coastguard Worker case RenderScriptToolkit::YuvFormat::YV12:
62*e1eccf28SAndroid Build Coastguard Worker mCstep = 1;
63*e1eccf28SAndroid Build Coastguard Worker mStrideY = roundUpTo16(sizeX);
64*e1eccf28SAndroid Build Coastguard Worker mStrideU = roundUpTo16(mStrideY >> 1);
65*e1eccf28SAndroid Build Coastguard Worker mStrideV = mStrideU;
66*e1eccf28SAndroid Build Coastguard Worker mInY = reinterpret_cast<const uchar*>(input);
67*e1eccf28SAndroid Build Coastguard Worker mInU = reinterpret_cast<const uchar*>(input + mStrideY * sizeY);
68*e1eccf28SAndroid Build Coastguard Worker mInV = mInU + mStrideV * sizeY / 2;
69*e1eccf28SAndroid Build Coastguard Worker break;
70*e1eccf28SAndroid Build Coastguard Worker }
71*e1eccf28SAndroid Build Coastguard Worker }
72*e1eccf28SAndroid Build Coastguard Worker };
73*e1eccf28SAndroid Build Coastguard Worker
processData(int,size_t startX,size_t startY,size_t endX,size_t endY)74*e1eccf28SAndroid Build Coastguard Worker void YuvToRgbTask::processData(int /* threadIndex */, size_t startX, size_t startY, size_t endX,
75*e1eccf28SAndroid Build Coastguard Worker size_t endY) {
76*e1eccf28SAndroid Build Coastguard Worker for (size_t y = startY; y < endY; y++) {
77*e1eccf28SAndroid Build Coastguard Worker size_t offset = mSizeX * y + startX;
78*e1eccf28SAndroid Build Coastguard Worker uchar4* out = mOut + offset;
79*e1eccf28SAndroid Build Coastguard Worker kernel(out, startX, endX, y);
80*e1eccf28SAndroid Build Coastguard Worker }
81*e1eccf28SAndroid Build Coastguard Worker }
82*e1eccf28SAndroid Build Coastguard Worker
rsYuvToRGBA_uchar4(uchar y,uchar u,uchar v)83*e1eccf28SAndroid Build Coastguard Worker static uchar4 rsYuvToRGBA_uchar4(uchar y, uchar u, uchar v) {
84*e1eccf28SAndroid Build Coastguard Worker int16_t Y = ((int16_t)y) - 16;
85*e1eccf28SAndroid Build Coastguard Worker int16_t U = ((int16_t)u) - 128;
86*e1eccf28SAndroid Build Coastguard Worker int16_t V = ((int16_t)v) - 128;
87*e1eccf28SAndroid Build Coastguard Worker
88*e1eccf28SAndroid Build Coastguard Worker short4 p;
89*e1eccf28SAndroid Build Coastguard Worker p.x = (Y * 298 + V * 409 + 128) >> 8;
90*e1eccf28SAndroid Build Coastguard Worker p.y = (Y * 298 - U * 100 - V * 208 + 128) >> 8;
91*e1eccf28SAndroid Build Coastguard Worker p.z = (Y * 298 + U * 516 + 128) >> 8;
92*e1eccf28SAndroid Build Coastguard Worker p.w = 255;
93*e1eccf28SAndroid Build Coastguard Worker if(p.x < 0) {
94*e1eccf28SAndroid Build Coastguard Worker p.x = 0;
95*e1eccf28SAndroid Build Coastguard Worker }
96*e1eccf28SAndroid Build Coastguard Worker if(p.x > 255) {
97*e1eccf28SAndroid Build Coastguard Worker p.x = 255;
98*e1eccf28SAndroid Build Coastguard Worker }
99*e1eccf28SAndroid Build Coastguard Worker if(p.y < 0) {
100*e1eccf28SAndroid Build Coastguard Worker p.y = 0;
101*e1eccf28SAndroid Build Coastguard Worker }
102*e1eccf28SAndroid Build Coastguard Worker if(p.y > 255) {
103*e1eccf28SAndroid Build Coastguard Worker p.y = 255;
104*e1eccf28SAndroid Build Coastguard Worker }
105*e1eccf28SAndroid Build Coastguard Worker if(p.z < 0) {
106*e1eccf28SAndroid Build Coastguard Worker p.z = 0;
107*e1eccf28SAndroid Build Coastguard Worker }
108*e1eccf28SAndroid Build Coastguard Worker if(p.z > 255) {
109*e1eccf28SAndroid Build Coastguard Worker p.z = 255;
110*e1eccf28SAndroid Build Coastguard Worker }
111*e1eccf28SAndroid Build Coastguard Worker
112*e1eccf28SAndroid Build Coastguard Worker return (uchar4){static_cast<uchar>(p.x), static_cast<uchar>(p.y),
113*e1eccf28SAndroid Build Coastguard Worker static_cast<uchar>(p.z), static_cast<uchar>(p.w)};
114*e1eccf28SAndroid Build Coastguard Worker }
115*e1eccf28SAndroid Build Coastguard Worker
116*e1eccf28SAndroid Build Coastguard Worker extern "C" void rsdIntrinsicYuv_K(void *dst, const uchar *Y, const uchar *uv, uint32_t xstart,
117*e1eccf28SAndroid Build Coastguard Worker size_t xend);
118*e1eccf28SAndroid Build Coastguard Worker extern "C" void rsdIntrinsicYuvR_K(void *dst, const uchar *Y, const uchar *uv, uint32_t xstart,
119*e1eccf28SAndroid Build Coastguard Worker size_t xend);
120*e1eccf28SAndroid Build Coastguard Worker extern "C" void rsdIntrinsicYuv2_K(void *dst, const uchar *Y, const uchar *u, const uchar *v,
121*e1eccf28SAndroid Build Coastguard Worker size_t xstart, size_t xend);
122*e1eccf28SAndroid Build Coastguard Worker
kernel(uchar4 * out,uint32_t xstart,uint32_t xend,uint32_t currentY)123*e1eccf28SAndroid Build Coastguard Worker void YuvToRgbTask::kernel(uchar4 *out, uint32_t xstart, uint32_t xend, uint32_t currentY) {
124*e1eccf28SAndroid Build Coastguard Worker //ALOGI("kernel out %p, xstart=%u, xend=%u, currentY=%u", out, xstart, xend, currentY);
125*e1eccf28SAndroid Build Coastguard Worker
126*e1eccf28SAndroid Build Coastguard Worker const uchar *y = mInY + (currentY * mStrideY);
127*e1eccf28SAndroid Build Coastguard Worker const uchar *v = mInV + ((currentY >> 1) * mStrideV);
128*e1eccf28SAndroid Build Coastguard Worker const uchar *u = mInU + ((currentY >> 1) * mStrideU);
129*e1eccf28SAndroid Build Coastguard Worker
130*e1eccf28SAndroid Build Coastguard Worker //ALOGI("pinY %p, pinV %p, pinU %p", pinY, pinV, pinU);
131*e1eccf28SAndroid Build Coastguard Worker
132*e1eccf28SAndroid Build Coastguard Worker uint32_t x1 = xstart;
133*e1eccf28SAndroid Build Coastguard Worker uint32_t x2 = xend;
134*e1eccf28SAndroid Build Coastguard Worker
135*e1eccf28SAndroid Build Coastguard Worker /*
136*e1eccf28SAndroid Build Coastguard Worker ALOGE("pinY, %p, Y, %p, currentY, %d, strideY, %zu", pinY, y, currentY, mStrideY);
137*e1eccf28SAndroid Build Coastguard Worker ALOGE("pinU, %p, U, %p, currentY, %d, strideU, %zu", pinU, u, currentY, mStrideU);
138*e1eccf28SAndroid Build Coastguard Worker ALOGE("pinV, %p, V, %p, currentY, %d, strideV, %zu", pinV, v, currentY, mStrideV);
139*e1eccf28SAndroid Build Coastguard Worker ALOGE("dimX, %d, dimY, %d", cp->alloc->mHal.drvState.lod[0].dimX,
140*e1eccf28SAndroid Build Coastguard Worker cp->alloc->mHal.drvState.lod[0].dimY);
141*e1eccf28SAndroid Build Coastguard Worker ALOGE("info->dim.x, %d, info->dim.y, %d", info->dim.x, info->dim.y);
142*e1eccf28SAndroid Build Coastguard Worker uchar* pinY = (uchar*)mInY;
143*e1eccf28SAndroid Build Coastguard Worker uchar* pinU = (uchar*)mInU;
144*e1eccf28SAndroid Build Coastguard Worker uchar* pinV = (uchar*)mInV;
145*e1eccf28SAndroid Build Coastguard Worker ALOGE("Y %p %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx "
146*e1eccf28SAndroid Build Coastguard Worker "%02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx",
147*e1eccf28SAndroid Build Coastguard Worker pinY, pinY[0], pinY[1], pinY[2], pinY[3], pinY[4], pinY[5], pinY[6], pinY[7], pinY[8],
148*e1eccf28SAndroid Build Coastguard Worker pinY[9], pinY[10], pinY[11], pinY[12], pinY[13], pinY[14], pinY[15]);
149*e1eccf28SAndroid Build Coastguard Worker ALOGE("Y %p %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx "
150*e1eccf28SAndroid Build Coastguard Worker "%02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx",
151*e1eccf28SAndroid Build Coastguard Worker pinY, pinY[16], pinY[17], pinY[18], pinY[19], pinY[20], pinY[21], pinY[22], pinY[23],
152*e1eccf28SAndroid Build Coastguard Worker pinY[24], pinY[25], pinY[26], pinY[27], pinY[28], pinY[29], pinY[30], pinY[31]);
153*e1eccf28SAndroid Build Coastguard Worker ALOGE("Y %p %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx "
154*e1eccf28SAndroid Build Coastguard Worker "%02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx",
155*e1eccf28SAndroid Build Coastguard Worker pinY, pinY[32], pinY[33], pinY[34], pinY[35], pinY[36], pinY[37], pinY[38], pinY[39],
156*e1eccf28SAndroid Build Coastguard Worker pinY[40], pinY[41], pinY[42], pinY[43], pinY[44], pinY[45], pinY[46], pinY[47]);
157*e1eccf28SAndroid Build Coastguard Worker
158*e1eccf28SAndroid Build Coastguard Worker ALOGE("U %p %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx "
159*e1eccf28SAndroid Build Coastguard Worker "%02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx",
160*e1eccf28SAndroid Build Coastguard Worker pinU, pinU[0], pinU[1], pinU[2], pinU[3], pinU[4], pinU[5], pinU[6], pinU[7], pinU[8],
161*e1eccf28SAndroid Build Coastguard Worker pinU[9], pinU[10], pinU[11], pinU[12], pinU[13], pinU[14], pinU[15]);
162*e1eccf28SAndroid Build Coastguard Worker ALOGE("U %p %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx "
163*e1eccf28SAndroid Build Coastguard Worker "%02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx",
164*e1eccf28SAndroid Build Coastguard Worker pinU, pinU[16], pinU[17], pinU[18], pinU[19], pinU[20], pinU[21], pinU[22], pinU[23],
165*e1eccf28SAndroid Build Coastguard Worker pinU[24], pinU[25], pinU[26], pinU[27], pinU[28], pinU[29], pinU[30], pinU[31]);
166*e1eccf28SAndroid Build Coastguard Worker ALOGE("U %p %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx "
167*e1eccf28SAndroid Build Coastguard Worker "%02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx",
168*e1eccf28SAndroid Build Coastguard Worker pinU, pinU[32], pinU[33], pinU[34], pinU[35], pinU[36], pinU[37], pinU[38], pinU[39],
169*e1eccf28SAndroid Build Coastguard Worker pinU[40], pinU[41], pinU[42], pinU[43], pinU[44], pinU[45], pinU[46], pinU[47]);
170*e1eccf28SAndroid Build Coastguard Worker
171*e1eccf28SAndroid Build Coastguard Worker ALOGE("V %p %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx "
172*e1eccf28SAndroid Build Coastguard Worker "%02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx",
173*e1eccf28SAndroid Build Coastguard Worker pinV, pinV[0], pinV[1], pinV[2], pinV[3], pinV[4], pinV[5], pinV[6], pinV[7], pinV[8],
174*e1eccf28SAndroid Build Coastguard Worker pinV[9], pinV[10], pinV[11], pinV[12], pinV[13], pinV[14], pinV[15]);
175*e1eccf28SAndroid Build Coastguard Worker ALOGE("V %p %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx "
176*e1eccf28SAndroid Build Coastguard Worker "%02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx",
177*e1eccf28SAndroid Build Coastguard Worker pinV, pinV[16], pinV[17], pinV[18], pinV[19], pinV[20], pinV[21], pinV[22], pinV[23],
178*e1eccf28SAndroid Build Coastguard Worker pinV[24], pinV[25], pinV[26], pinV[27], pinV[28], pinV[29], pinV[30], pinV[31]);
179*e1eccf28SAndroid Build Coastguard Worker ALOGE("V %p %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx "
180*e1eccf28SAndroid Build Coastguard Worker "%02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx",
181*e1eccf28SAndroid Build Coastguard Worker pinV, pinV[32], pinV[33], pinV[34], pinV[35], pinV[36], pinV[37], pinV[38], pinV[39],
182*e1eccf28SAndroid Build Coastguard Worker pinV[40], pinV[41], pinV[42], pinV[43], pinV[44], pinV[45], pinV[46], pinV[47]);
183*e1eccf28SAndroid Build Coastguard Worker */
184*e1eccf28SAndroid Build Coastguard Worker
185*e1eccf28SAndroid Build Coastguard Worker /* If we start on an odd pixel then deal with it here and bump things along
186*e1eccf28SAndroid Build Coastguard Worker * so that subsequent code can carry on with even-odd pairing assumptions.
187*e1eccf28SAndroid Build Coastguard Worker */
188*e1eccf28SAndroid Build Coastguard Worker if((x1 & 1) && (x2 > x1)) {
189*e1eccf28SAndroid Build Coastguard Worker int cx = (x1 >> 1) * mCstep;
190*e1eccf28SAndroid Build Coastguard Worker *out = rsYuvToRGBA_uchar4(y[x1], u[cx], v[cx]);
191*e1eccf28SAndroid Build Coastguard Worker out++;
192*e1eccf28SAndroid Build Coastguard Worker x1++;
193*e1eccf28SAndroid Build Coastguard Worker }
194*e1eccf28SAndroid Build Coastguard Worker
195*e1eccf28SAndroid Build Coastguard Worker #if defined(ARCH_ARM_USE_INTRINSICS)
196*e1eccf28SAndroid Build Coastguard Worker if((x2 > x1) && mUsesSimd) {
197*e1eccf28SAndroid Build Coastguard Worker int32_t len = x2 - x1;
198*e1eccf28SAndroid Build Coastguard Worker if (mCstep == 1) {
199*e1eccf28SAndroid Build Coastguard Worker rsdIntrinsicYuv2_K(out, y, u, v, x1, x2);
200*e1eccf28SAndroid Build Coastguard Worker x1 += len;
201*e1eccf28SAndroid Build Coastguard Worker out += len;
202*e1eccf28SAndroid Build Coastguard Worker } else if (mCstep == 2) {
203*e1eccf28SAndroid Build Coastguard Worker // Check for proper interleave
204*e1eccf28SAndroid Build Coastguard Worker intptr_t ipu = (intptr_t)u;
205*e1eccf28SAndroid Build Coastguard Worker intptr_t ipv = (intptr_t)v;
206*e1eccf28SAndroid Build Coastguard Worker
207*e1eccf28SAndroid Build Coastguard Worker if (ipu == (ipv + 1)) {
208*e1eccf28SAndroid Build Coastguard Worker rsdIntrinsicYuv_K(out, y, v, x1, x2);
209*e1eccf28SAndroid Build Coastguard Worker x1 += len;
210*e1eccf28SAndroid Build Coastguard Worker out += len;
211*e1eccf28SAndroid Build Coastguard Worker } else if (ipu == (ipv - 1)) {
212*e1eccf28SAndroid Build Coastguard Worker rsdIntrinsicYuvR_K(out, y, u, x1, x2);
213*e1eccf28SAndroid Build Coastguard Worker x1 += len;
214*e1eccf28SAndroid Build Coastguard Worker out += len;
215*e1eccf28SAndroid Build Coastguard Worker }
216*e1eccf28SAndroid Build Coastguard Worker }
217*e1eccf28SAndroid Build Coastguard Worker }
218*e1eccf28SAndroid Build Coastguard Worker #endif
219*e1eccf28SAndroid Build Coastguard Worker
220*e1eccf28SAndroid Build Coastguard Worker if(x2 > x1) {
221*e1eccf28SAndroid Build Coastguard Worker // ALOGE("y %i %i %i", currentY, x1, x2);
222*e1eccf28SAndroid Build Coastguard Worker while(x1 < x2) {
223*e1eccf28SAndroid Build Coastguard Worker int cx = (x1 >> 1) * mCstep;
224*e1eccf28SAndroid Build Coastguard Worker *out = rsYuvToRGBA_uchar4(y[x1], u[cx], v[cx]);
225*e1eccf28SAndroid Build Coastguard Worker out++;
226*e1eccf28SAndroid Build Coastguard Worker x1++;
227*e1eccf28SAndroid Build Coastguard Worker *out = rsYuvToRGBA_uchar4(y[x1], u[cx], v[cx]);
228*e1eccf28SAndroid Build Coastguard Worker out++;
229*e1eccf28SAndroid Build Coastguard Worker x1++;
230*e1eccf28SAndroid Build Coastguard Worker }
231*e1eccf28SAndroid Build Coastguard Worker }
232*e1eccf28SAndroid Build Coastguard Worker }
233*e1eccf28SAndroid Build Coastguard Worker
yuvToRgb(const uint8_t * input,uint8_t * output,size_t sizeX,size_t sizeY,YuvFormat format)234*e1eccf28SAndroid Build Coastguard Worker void RenderScriptToolkit::yuvToRgb(const uint8_t* input, uint8_t* output, size_t sizeX,
235*e1eccf28SAndroid Build Coastguard Worker size_t sizeY, YuvFormat format) {
236*e1eccf28SAndroid Build Coastguard Worker YuvToRgbTask task(input, output, sizeX, sizeY, format);
237*e1eccf28SAndroid Build Coastguard Worker processor->doTask(&task);
238*e1eccf28SAndroid Build Coastguard Worker }
239*e1eccf28SAndroid Build Coastguard Worker
240*e1eccf28SAndroid Build Coastguard Worker } // namespace renderscript
241*e1eccf28SAndroid Build Coastguard Worker } // namespace android
242