1b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine/*
2b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * Copyright (C) 2011 The Android Open Source Project
3b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine *
4b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * Licensed under the Apache License, Version 2.0 (the "License");
5b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * you may not use this file except in compliance with the License.
6b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * You may obtain a copy of the License at
7b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine *
8b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine *      http://www.apache.org/licenses/LICENSE-2.0
9b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine *
10b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * Unless required by applicable law or agreed to in writing, software
11b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * distributed under the License is distributed on an "AS IS" BASIS,
12b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * See the License for the specific language governing permissions and
14b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * limitations under the License.
15b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine */
16b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine
17b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine/*
18b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine * Contains implemenation of framebuffer conversion routines.
19b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine */
20b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine
21b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine#define LOG_NDEBUG 0
22b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine#define LOG_TAG "EmulatedCamera_Converter"
23b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine#include <cutils/log.h>
245467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine#include "Converters.h"
25b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine
26b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkinenamespace android {
27b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine
282a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkinestatic void _YUV420SToRGB565(const uint8_t* Y,
292a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine                             const uint8_t* U,
302a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine                             const uint8_t* V,
312a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine                             int dUV,
322a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine                             uint16_t* rgb,
332a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine                             int width,
342a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine                             int height)
35b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine{
362a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine    const uint8_t* U_pos = U;
372a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine    const uint8_t* V_pos = V;
3833bda475286a625337ed184e7053fc29e403d57bVladimir Chtchetkine
3933bda475286a625337ed184e7053fc29e403d57bVladimir Chtchetkine    for (int y = 0; y < height; y++) {
402a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine        for (int x = 0; x < width; x += 2, U += dUV, V += dUV) {
412a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine            const uint8_t nU = *U;
422a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine            const uint8_t nV = *V;
432a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine            *rgb = YUVToRGB565(*Y, nU, nV);
442a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine            Y++; rgb++;
452a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine            *rgb = YUVToRGB565(*Y, nU, nV);
462a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine            Y++; rgb++;
4733bda475286a625337ed184e7053fc29e403d57bVladimir Chtchetkine        }
4833bda475286a625337ed184e7053fc29e403d57bVladimir Chtchetkine        if (y & 0x1) {
495467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine            U_pos = U;
505467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine            V_pos = V;
5133bda475286a625337ed184e7053fc29e403d57bVladimir Chtchetkine        } else {
525467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine            U = U_pos;
535467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine            V = V_pos;
5433bda475286a625337ed184e7053fc29e403d57bVladimir Chtchetkine        }
5533bda475286a625337ed184e7053fc29e403d57bVladimir Chtchetkine    }
5633bda475286a625337ed184e7053fc29e403d57bVladimir Chtchetkine}
5733bda475286a625337ed184e7053fc29e403d57bVladimir Chtchetkine
582a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkinestatic void _YUV420SToRGB32(const uint8_t* Y,
592a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine                            const uint8_t* U,
602a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine                            const uint8_t* V,
612a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine                            int dUV,
622a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine                            uint32_t* rgb,
632a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine                            int width,
642a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine                            int height)
6533bda475286a625337ed184e7053fc29e403d57bVladimir Chtchetkine{
662a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine    const uint8_t* U_pos = U;
672a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine    const uint8_t* V_pos = V;
6833bda475286a625337ed184e7053fc29e403d57bVladimir Chtchetkine
69b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine    for (int y = 0; y < height; y++) {
702a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine        for (int x = 0; x < width; x += 2, U += dUV, V += dUV) {
712a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine            const uint8_t nU = *U;
722a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine            const uint8_t nV = *V;
732a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine            *rgb = YUVToRGB32(*Y, nU, nV);
742a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine            Y++; rgb++;
752a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine            *rgb = YUVToRGB32(*Y, nU, nV);
762a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine            Y++; rgb++;
77b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine        }
78b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine        if (y & 0x1) {
795467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine            U_pos = U;
805467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine            V_pos = V;
81b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine        } else {
825467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine            U = U_pos;
835467be2eefc007ebf09baf109dafe058abc1ffc5Vladimir Chtchetkine            V = V_pos;
84b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine        }
85b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine    }
86b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine}
87b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine
882a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkinevoid YV12ToRGB565(const void* yv12, void* rgb, int width, int height)
892a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine{
902a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine    const int pix_total = width * height;
912a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine    const uint8_t* Y = reinterpret_cast<const uint8_t*>(yv12);
922a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine    const uint8_t* U = Y + pix_total;
932a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine    const uint8_t* V = U + pix_total / 4;
942a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine    _YUV420SToRGB565(Y, U, V, 1, reinterpret_cast<uint16_t*>(rgb), width, height);
952a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine}
962a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine
972a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkinevoid YV12ToRGB32(const void* yv12, void* rgb, int width, int height)
982a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine{
992a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine    const int pix_total = width * height;
1002a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine    const uint8_t* Y = reinterpret_cast<const uint8_t*>(yv12);
10168ec4ac828762745155be9662285d2174a7eff1eVladimir Chtchetkine    const uint8_t* V = Y + pix_total;
10268ec4ac828762745155be9662285d2174a7eff1eVladimir Chtchetkine    const uint8_t* U = V + pix_total / 4;
10368ec4ac828762745155be9662285d2174a7eff1eVladimir Chtchetkine    _YUV420SToRGB32(Y, U, V, 1, reinterpret_cast<uint32_t*>(rgb), width, height);
10468ec4ac828762745155be9662285d2174a7eff1eVladimir Chtchetkine}
10568ec4ac828762745155be9662285d2174a7eff1eVladimir Chtchetkine
10668ec4ac828762745155be9662285d2174a7eff1eVladimir Chtchetkinevoid YU12ToRGB32(const void* yu12, void* rgb, int width, int height)
10768ec4ac828762745155be9662285d2174a7eff1eVladimir Chtchetkine{
10868ec4ac828762745155be9662285d2174a7eff1eVladimir Chtchetkine    const int pix_total = width * height;
10968ec4ac828762745155be9662285d2174a7eff1eVladimir Chtchetkine    const uint8_t* Y = reinterpret_cast<const uint8_t*>(yu12);
1102a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine    const uint8_t* U = Y + pix_total;
1112a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine    const uint8_t* V = U + pix_total / 4;
1122a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine    _YUV420SToRGB32(Y, U, V, 1, reinterpret_cast<uint32_t*>(rgb), width, height);
1132a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine}
1142a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine
1152a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine/* Common converter for YUV 4:2:0 interleaved to RGB565.
1162a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine * y, u, and v point to Y,U, and V panes, where U and V values are interleaved.
1172a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine */
1182a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkinestatic void _NVXXToRGB565(const uint8_t* Y,
1192a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine                          const uint8_t* U,
1202a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine                          const uint8_t* V,
1212a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine                          uint16_t* rgb,
1222a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine                          int width,
1232a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine                          int height)
1242a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine{
1252a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine    _YUV420SToRGB565(Y, U, V, 2, rgb, width, height);
1262a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine}
1272a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine
1282a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine/* Common converter for YUV 4:2:0 interleaved to RGB32.
1292a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine * y, u, and v point to Y,U, and V panes, where U and V values are interleaved.
1302a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine */
1312a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkinestatic void _NVXXToRGB32(const uint8_t* Y,
1322a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine                         const uint8_t* U,
1332a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine                         const uint8_t* V,
1342a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine                         uint32_t* rgb,
1352a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine                         int width,
1362a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine                         int height)
1372a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine{
1382a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine    _YUV420SToRGB32(Y, U, V, 2, rgb, width, height);
1392a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine}
1402a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine
1412a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkinevoid NV12ToRGB565(const void* nv12, void* rgb, int width, int height)
1422a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine{
1432a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine    const int pix_total = width * height;
1442a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine    const uint8_t* y = reinterpret_cast<const uint8_t*>(nv12);
1452a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine    _NVXXToRGB565(y, y + pix_total, y + pix_total + 1,
1462a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine                  reinterpret_cast<uint16_t*>(rgb), width, height);
1472a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine}
1482a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine
1492a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkinevoid NV12ToRGB32(const void* nv12, void* rgb, int width, int height)
1502a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine{
1512a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine    const int pix_total = width * height;
1522a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine    const uint8_t* y = reinterpret_cast<const uint8_t*>(nv12);
1532a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine    _NVXXToRGB32(y, y + pix_total, y + pix_total + 1,
1542a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine                 reinterpret_cast<uint32_t*>(rgb), width, height);
1552a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine}
1562a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine
1572a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkinevoid NV21ToRGB565(const void* nv21, void* rgb, int width, int height)
1582a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine{
1592a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine    const int pix_total = width * height;
1602a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine    const uint8_t* y = reinterpret_cast<const uint8_t*>(nv21);
1612a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine    _NVXXToRGB565(y, y + pix_total + 1, y + pix_total,
1622a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine                  reinterpret_cast<uint16_t*>(rgb), width, height);
1632a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine}
1642a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine
1652a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkinevoid NV21ToRGB32(const void* nv21, void* rgb, int width, int height)
1662a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine{
1672a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine    const int pix_total = width * height;
1682a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine    const uint8_t* y = reinterpret_cast<const uint8_t*>(nv21);
1692a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine    _NVXXToRGB32(y, y + pix_total + 1, y + pix_total,
1702a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine                 reinterpret_cast<uint32_t*>(rgb), width, height);
1712a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine}
1722a532ee388828120a5a11fba0087a1ed2539a159Vladimir Chtchetkine
173b97c2f0b5919b716ba5433e6153a29d7e1e357feVladimir Chtchetkine}; /* namespace android */
174