12827560ce2c0462487ff3b9193ea5abc4a1077c4Niko Catania/* 22827560ce2c0462487ff3b9193ea5abc4a1077c4Niko Catania** 32827560ce2c0462487ff3b9193ea5abc4a1077c4Niko Catania** Copyright 2008, The Android Open Source Project 42827560ce2c0462487ff3b9193ea5abc4a1077c4Niko Catania** 52827560ce2c0462487ff3b9193ea5abc4a1077c4Niko Catania** Licensed under the Apache License, Version 2.0 (the "License"); 62827560ce2c0462487ff3b9193ea5abc4a1077c4Niko Catania** you may not use this file except in compliance with the License. 72827560ce2c0462487ff3b9193ea5abc4a1077c4Niko Catania** You may obtain a copy of the License at 82827560ce2c0462487ff3b9193ea5abc4a1077c4Niko Catania** 92827560ce2c0462487ff3b9193ea5abc4a1077c4Niko Catania** http://www.apache.org/licenses/LICENSE-2.0 102827560ce2c0462487ff3b9193ea5abc4a1077c4Niko Catania** 112827560ce2c0462487ff3b9193ea5abc4a1077c4Niko Catania** Unless required by applicable law or agreed to in writing, software 122827560ce2c0462487ff3b9193ea5abc4a1077c4Niko Catania** distributed under the License is distributed on an "AS IS" BASIS, 132827560ce2c0462487ff3b9193ea5abc4a1077c4Niko Catania** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 142827560ce2c0462487ff3b9193ea5abc4a1077c4Niko Catania** See the License for the specific language governing permissions and 152827560ce2c0462487ff3b9193ea5abc4a1077c4Niko Catania** limitations under the License. 162827560ce2c0462487ff3b9193ea5abc4a1077c4Niko Catania*/ 172827560ce2c0462487ff3b9193ea5abc4a1077c4Niko Catania 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "FakeCamera" 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h> 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <string.h> 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdlib.h> 232827560ce2c0462487ff3b9193ea5abc4a1077c4Niko Catania#include <utils/String8.h> 242827560ce2c0462487ff3b9193ea5abc4a1077c4Niko Catania 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "FakeCamera.h" 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 272827560ce2c0462487ff3b9193ea5abc4a1077c4Niko Catania 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 302827560ce2c0462487ff3b9193ea5abc4a1077c4Niko Catania// TODO: All this rgb to yuv should probably be in a util class. 312827560ce2c0462487ff3b9193ea5abc4a1077c4Niko Catania 322827560ce2c0462487ff3b9193ea5abc4a1077c4Niko Catania// TODO: I think something is wrong in this class because the shadow is kBlue 332827560ce2c0462487ff3b9193ea5abc4a1077c4Niko Catania// and the square color should alternate between kRed and kGreen. However on the 342827560ce2c0462487ff3b9193ea5abc4a1077c4Niko Catania// emulator screen these are all shades of gray. Y seems ok but the U and V are 352827560ce2c0462487ff3b9193ea5abc4a1077c4Niko Catania// probably not. 362827560ce2c0462487ff3b9193ea5abc4a1077c4Niko Catania 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int tables_initialized = 0; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectuint8_t *gYTable, *gCbTable, *gCrTable; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclamp(int x) 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (x > 255) return 255; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (x < 0) return 0; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return x; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* the equation used by the video code to translate YUV to RGB looks like this 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Y = (Y0 - 16)*k0 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Cb = Cb0 - 128 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Cr = Cr0 - 128 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * G = ( Y - k1*Cr - k2*Cb ) 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * R = ( Y + k3*Cr ) 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * B = ( Y + k4*Cb ) 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const double k0 = 1.164; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const double k1 = 0.813; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const double k2 = 0.391; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const double k3 = 1.596; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const double k4 = 2.018; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* let's try to extract the value of Y 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * G + k1/k3*R + k2/k4*B = Y*( 1 + k1/k3 + k2/k4 ) 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Y = ( G + k1/k3*R + k2/k4*B ) / (1 + k1/k3 + k2/k4) 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Y0 = ( G0 + k1/k3*R0 + k2/k4*B0 ) / ((1 + k1/k3 + k2/k4)*k0) + 16 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * let define: 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * kYr = k1/k3 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * kYb = k2/k4 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * kYy = k0 * ( 1 + kYr + kYb ) 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * we have: 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Y = ( G + kYr*R + kYb*B ) 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Y0 = clamp[ Y/kYy + 16 ] 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const double kYr = k1/k3; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const double kYb = k2/k4; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const double kYy = k0*( 1. + kYr + kYb ); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectinitYtab( void ) 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const int imax = (int)( (kYr + kYb)*(31 << 2) + (61 << 3) + 0.1 ); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gYTable = (uint8_t *)malloc(imax); 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for(i=0; i<imax; i++) { 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int x = (int)(i/kYy + 16.5); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (x < 16) x = 16; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (x > 235) x = 235; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gYTable[i] = (uint8_t) x; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the source is RGB565, so adjust for 8-bit range of input values: 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * G = (pixels >> 3) & 0xFC; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * R = (pixels >> 8) & 0xF8; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * B = (pixels & 0x1f) << 3; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * R2 = (pixels >> 11) R = R2*8 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * B2 = (pixels & 0x1f) B = B2*8 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * kYr*R = kYr2*R2 => kYr2 = kYr*8 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * kYb*B = kYb2*B2 => kYb2 = kYb*8 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * we want to use integer multiplications: 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * SHIFT1 = 9 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (ALPHA*R2) >> SHIFT1 == R*kYr => ALPHA = kYr*8*(1 << SHIFT1) 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ALPHA = kYr*(1 << (SHIFT1+3)) 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * BETA = kYb*(1 << (SHIFT1+3)) 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const int SHIFT1 = 9; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const int ALPHA = (int)( kYr*(1 << (SHIFT1+3)) + 0.5 ); 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const int BETA = (int)( kYb*(1 << (SHIFT1+3)) + 0.5 ); 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * now let's try to get the values of Cb and Cr 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * R-B = (k3*Cr - k4*Cb) 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * k3*Cr = k4*Cb + (R-B) 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * k4*Cb = k3*Cr - (R-B) 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * R-G = (k1+k3)*Cr + k2*Cb 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * = (k1+k3)*Cr + k2/k4*(k3*Cr - (R-B)/k0) 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * = (k1 + k3 + k2*k3/k4)*Cr - k2/k4*(R-B) 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * kRr*Cr = (R-G) + kYb*(R-B) 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Cr = ((R-G) + kYb*(R-B))/kRr 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Cr0 = clamp(Cr + 128) 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const double kRr = (k1 + k3 + k2*k3/k4); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectinitCrtab( void ) 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t *pTable; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i; 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gCrTable = (uint8_t *)malloc(768*2); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pTable = gCrTable + 384; 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for(i=-384; i<384; i++) 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pTable[i] = (uint8_t) clamp( i/kRr + 128.5 ); 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * B-G = (k2 + k4)*Cb + k1*Cr 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * = (k2 + k4)*Cb + k1/k3*(k4*Cb + (R-B)) 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * = (k2 + k4 + k1*k4/k3)*Cb + k1/k3*(R-B) 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * kBb*Cb = (B-G) - kYr*(R-B) 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Cb = ((B-G) - kYr*(R-B))/kBb 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Cb0 = clamp(Cb + 128) 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const double kBb = (k2 + k4 + k1*k4/k3); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectinitCbtab( void ) 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t *pTable; 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i; 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gCbTable = (uint8_t *)malloc(768*2); 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pTable = gCbTable + 384; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for(i=-384; i<384; i++) 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pTable[i] = (uint8_t) clamp( i/kBb + 128.5 ); 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * SHIFT2 = 16 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * DELTA = kYb*(1 << SHIFT2) 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * GAMMA = kYr*(1 << SHIFT2) 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const int SHIFT2 = 16; 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const int DELTA = kYb*(1 << SHIFT2); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const int GAMMA = kYr*(1 << SHIFT2); 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 201e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Changint32_t ccrgb16toyuv_wo_colorkey(uint8_t *rgb16, uint8_t *yuv420, 202e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang uint32_t *param, uint8_t *table[]) 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint16_t *inputRGB = (uint16_t*)rgb16; 205e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang uint8_t *outYUV = yuv420; 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t width_dst = param[0]; 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t height_dst = param[1]; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t pitch_dst = param[2]; 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t mheight_dst = param[3]; 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t pitch_src = param[4]; 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t *y_tab = table[0]; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t *cb_tab = table[1]; 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t *cr_tab = table[2]; 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t size16 = pitch_dst*mheight_dst; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t i,j,count; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t ilimit,jlimit; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t *tempY,*tempU,*tempV; 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint16_t pixels; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int tmp; 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectuint32_t temp; 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tempY = outYUV; 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tempU = outYUV + (height_dst * pitch_dst); 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tempV = tempU + 1; 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jlimit = height_dst; 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ilimit = width_dst; 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for(j=0; j<jlimit; j+=1) 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<ilimit; i+=2) 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t G_ds = 0, B_ds = 0, R_ds = 0; 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t y0, y1, u, v; 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pixels = inputRGB[i]; 238d7381a199bb4641cdcaf28ae6cadbf2513b14faeChih-Chung Chang temp = (BETA*(pixels & 0x001F) + ALPHA*(pixels>>11) ); 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project y0 = y_tab[(temp>>SHIFT1) + ((pixels>>3) & 0x00FC)]; 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project G_ds += (pixels>>1) & 0x03E0; 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project B_ds += (pixels<<5) & 0x03E0; 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project R_ds += (pixels>>6) & 0x03E0; 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pixels = inputRGB[i+1]; 246d7381a199bb4641cdcaf28ae6cadbf2513b14faeChih-Chung Chang temp = (BETA*(pixels & 0x001F) + ALPHA*(pixels>>11) ); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project y1 = y_tab[(temp>>SHIFT1) + ((pixels>>3) & 0x00FC)]; 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project G_ds += (pixels>>1) & 0x03E0; 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project B_ds += (pixels<<5) & 0x03E0; 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project R_ds += (pixels>>6) & 0x03E0; 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project R_ds >>= 1; 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project B_ds >>= 1; 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project G_ds >>= 1; 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tmp = R_ds - B_ds; 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259d7381a199bb4641cdcaf28ae6cadbf2513b14faeChih-Chung Chang u = cb_tab[(((B_ds-G_ds)<<SHIFT2) - GAMMA*tmp)>>(SHIFT2+2)]; 260d7381a199bb4641cdcaf28ae6cadbf2513b14faeChih-Chung Chang v = cr_tab[(((R_ds-G_ds)<<SHIFT2) + DELTA*tmp)>>(SHIFT2+2)]; 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tempY[0] = y0; 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tempY[1] = y1; 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tempY += 2; 265e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang 266e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang if ((j&1) == 0) { 267e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang tempU[0] = u; 268e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang tempV[0] = v; 269e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang tempU += 2; 270e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang tempV += 2; 271e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang } 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inputRGB += pitch_src; 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define min(a,b) ((a)<(b)?(a):(b)) 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define max(a,b) ((a)>(b)?(a):(b)) 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 283e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Changstatic void convert_rgb16_to_yuv420(uint8_t *rgb, uint8_t *yuv, int width, int height) 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!tables_initialized) { 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initYtab(); 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initCrtab(); 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initCbtab(); 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tables_initialized = 1; 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t param[6]; 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project param[0] = (uint32_t) width; 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project param[1] = (uint32_t) height; 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project param[2] = (uint32_t) width; 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project param[3] = (uint32_t) height; 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project param[4] = (uint32_t) width; 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project param[5] = (uint32_t) 0; 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t *table[3]; 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project table[0] = gYTable; 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project table[1] = gCbTable + 384; 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project table[2] = gCrTable + 384; 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ccrgb16toyuv_wo_colorkey(rgb, yuv, param, table); 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst int FakeCamera::kRed; 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst int FakeCamera::kGreen; 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst int FakeCamera::kBlue; 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectFakeCamera::FakeCamera(int width, int height) 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : mTmpRgb16Buffer(0) 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setSize(width, height); 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectFakeCamera::~FakeCamera() 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete[] mTmpRgb16Buffer; 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid FakeCamera::setSize(int width, int height) 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWidth = width; 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeight = height; 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCounter = 0; 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCheckX = 0; 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCheckY = 0; 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This will cause it to be reallocated on the next call 332e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang // to getNextFrameAsYuv420(). 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete[] mTmpRgb16Buffer; 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTmpRgb16Buffer = 0; 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid FakeCamera::getNextFrameAsRgb565(uint16_t *buffer) 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int size = mWidth / 10; 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawCheckerboard(buffer, size); 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int x = ((mCounter*3)&255); 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(x>128) x = 255 - x; 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int y = ((mCounter*5)&255); 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(y>128) y = 255 - y; 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawSquare(buffer, x*size/32, y*size/32, (size*5)>>1, (mCounter&0x100)?kRed:kGreen, kBlue); 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCounter++; 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 353e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Changvoid FakeCamera::getNextFrameAsYuv420(uint8_t *buffer) 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTmpRgb16Buffer == 0) 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTmpRgb16Buffer = new uint16_t[mWidth * mHeight]; 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getNextFrameAsRgb565(mTmpRgb16Buffer); 359e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang convert_rgb16_to_yuv420((uint8_t*)mTmpRgb16Buffer, buffer, mWidth, mHeight); 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid FakeCamera::drawSquare(uint16_t *dst, int x, int y, int size, int color, int shadow) 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int square_xstop, square_ystop, shadow_xstop, shadow_ystop; 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project square_xstop = min(mWidth, x+size); 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project square_ystop = min(mHeight, y+size); 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project shadow_xstop = min(mWidth, x+size+(size/4)); 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project shadow_ystop = min(mHeight, y+size+(size/4)); 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Do the shadow. 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint16_t *sh = &dst[(y+(size/4))*mWidth]; 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j = y + (size/4); j < shadow_ystop; j++) { 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = x + (size/4); i < shadow_xstop; i++) { 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sh[i] &= shadow; 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sh += mWidth; 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Draw the square. 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint16_t *sq = &dst[y*mWidth]; 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j = y; j < square_ystop; j++) { 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = x; i < square_xstop; i++) { 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sq[i] = color; 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sq += mWidth; 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid FakeCamera::drawCheckerboard(uint16_t *dst, int size) 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool black = true; 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if((mCheckX/size)&1) 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project black = false; 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if((mCheckY/size)&1) 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project black = !black; 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int county = mCheckY%size; 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int checkxremainder = mCheckX%size; 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for(int y=0;y<mHeight;y++) { 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int countx = checkxremainder; 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool current = black; 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for(int x=0;x<mWidth;x++) { 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dst[y*mWidth+x] = current?0:0xffff; 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(countx++ >= size) { 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project countx=0; 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project current = !current; 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(county++ >= size) { 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project county=0; 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project black = !black; 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCheckX += 3; 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCheckY++; 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4222827560ce2c0462487ff3b9193ea5abc4a1077c4Niko Cataniavoid FakeCamera::dump(int fd) const 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t SIZE = 256; 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char buffer[SIZE]; 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 result; 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project snprintf(buffer, 255, " width x height (%d x %d), counter (%d), check x-y coordinate(%d, %d)\n", mWidth, mHeight, mCounter, mCheckX, mCheckY); 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result.append(buffer); 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ::write(fd, result.string(), result.size()); 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 434