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