165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian/* 265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** 365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** Copyright 2008, The Android Open Source Project 465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** 565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** Licensed under the Apache License, Version 2.0 (the "License"); 665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** you may not use this file except in compliance with the License. 765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** You may obtain a copy of the License at 865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** 965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** http://www.apache.org/licenses/LICENSE-2.0 1065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** 1165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** Unless required by applicable law or agreed to in writing, software 1265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** distributed under the License is distributed on an "AS IS" BASIS, 1365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** See the License for the specific language governing permissions and 1565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** limitations under the License. 1665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian*/ 1765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 1865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define LOG_TAG "FakeCamera" 1965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <utils/Log.h> 2065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 2165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <string.h> 2265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <stdlib.h> 2365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <utils/String8.h> 2465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 2565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include "FakeCamera.h" 2665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 2765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 2865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopiannamespace android { 2965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 3065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// TODO: All this rgb to yuv should probably be in a util class. 3165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 3265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// TODO: I think something is wrong in this class because the shadow is kBlue 3365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// and the square color should alternate between kRed and kGreen. However on the 3465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// emulator screen these are all shades of gray. Y seems ok but the U and V are 3565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// probably not. 3665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 3765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic int tables_initialized = 0; 3865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianuint8_t *gYTable, *gCbTable, *gCrTable; 3965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 4065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic int 4165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclamp(int x) 4265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{ 4365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian if (x > 255) return 255; 4465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian if (x < 0) return 0; 4565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian return x; 4665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 4765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 4865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian/* the equation used by the video code to translate YUV to RGB looks like this 4965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * 5065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * Y = (Y0 - 16)*k0 5165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * Cb = Cb0 - 128 5265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * Cr = Cr0 - 128 5365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * 5465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * G = ( Y - k1*Cr - k2*Cb ) 5565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * R = ( Y + k3*Cr ) 5665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * B = ( Y + k4*Cb ) 5765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * 5865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian */ 5965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 6065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic const double k0 = 1.164; 6165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic const double k1 = 0.813; 6265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic const double k2 = 0.391; 6365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic const double k3 = 1.596; 6465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic const double k4 = 2.018; 6565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 6665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian/* let's try to extract the value of Y 6765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * 6865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * G + k1/k3*R + k2/k4*B = Y*( 1 + k1/k3 + k2/k4 ) 6965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * 7065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * Y = ( G + k1/k3*R + k2/k4*B ) / (1 + k1/k3 + k2/k4) 7165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * Y0 = ( G0 + k1/k3*R0 + k2/k4*B0 ) / ((1 + k1/k3 + k2/k4)*k0) + 16 7265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * 7365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * let define: 7465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * kYr = k1/k3 7565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * kYb = k2/k4 7665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * kYy = k0 * ( 1 + kYr + kYb ) 7765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * 7865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * we have: 7965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * Y = ( G + kYr*R + kYb*B ) 8065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * Y0 = clamp[ Y/kYy + 16 ] 8165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian */ 8265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 8365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic const double kYr = k1/k3; 8465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic const double kYb = k2/k4; 8565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic const double kYy = k0*( 1. + kYr + kYb ); 8665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 8765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic void 8865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias AgopianinitYtab( void ) 8965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{ 9065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian const int imax = (int)( (kYr + kYb)*(31 << 2) + (61 << 3) + 0.1 ); 9165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int i; 9265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 9365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian gYTable = (uint8_t *)malloc(imax); 9465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 9565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian for(i=0; i<imax; i++) { 9665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int x = (int)(i/kYy + 16.5); 9765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian if (x < 16) x = 16; 9865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian else if (x > 235) x = 235; 9965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian gYTable[i] = (uint8_t) x; 10065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 10165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 10265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 10365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian/* 10465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * the source is RGB565, so adjust for 8-bit range of input values: 10565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * 10665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * G = (pixels >> 3) & 0xFC; 10765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * R = (pixels >> 8) & 0xF8; 10865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * B = (pixels & 0x1f) << 3; 10965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * 11065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * R2 = (pixels >> 11) R = R2*8 11165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * B2 = (pixels & 0x1f) B = B2*8 11265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * 11365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * kYr*R = kYr2*R2 => kYr2 = kYr*8 11465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * kYb*B = kYb2*B2 => kYb2 = kYb*8 11565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * 11665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * we want to use integer multiplications: 11765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * 11865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * SHIFT1 = 9 11965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * 12065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * (ALPHA*R2) >> SHIFT1 == R*kYr => ALPHA = kYr*8*(1 << SHIFT1) 12165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * 12265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * ALPHA = kYr*(1 << (SHIFT1+3)) 12365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * BETA = kYb*(1 << (SHIFT1+3)) 12465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian */ 12565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 12665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic const int SHIFT1 = 9; 12765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic const int ALPHA = (int)( kYr*(1 << (SHIFT1+3)) + 0.5 ); 12865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic const int BETA = (int)( kYb*(1 << (SHIFT1+3)) + 0.5 ); 12965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 13065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian/* 13165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * now let's try to get the values of Cb and Cr 13265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * 13365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * R-B = (k3*Cr - k4*Cb) 13465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * 13565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * k3*Cr = k4*Cb + (R-B) 13665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * k4*Cb = k3*Cr - (R-B) 13765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * 13865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * R-G = (k1+k3)*Cr + k2*Cb 13965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * = (k1+k3)*Cr + k2/k4*(k3*Cr - (R-B)/k0) 14065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * = (k1 + k3 + k2*k3/k4)*Cr - k2/k4*(R-B) 14165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * 14265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * kRr*Cr = (R-G) + kYb*(R-B) 14365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * 14465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * Cr = ((R-G) + kYb*(R-B))/kRr 14565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * Cr0 = clamp(Cr + 128) 14665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian */ 14765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 14865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic const double kRr = (k1 + k3 + k2*k3/k4); 14965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 15065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic void 15165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias AgopianinitCrtab( void ) 15265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{ 15365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint8_t *pTable; 15465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int i; 15565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 15665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian gCrTable = (uint8_t *)malloc(768*2); 15765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 15865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian pTable = gCrTable + 384; 15965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian for(i=-384; i<384; i++) 16065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian pTable[i] = (uint8_t) clamp( i/kRr + 128.5 ); 16165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 16265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 16365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian/* 16465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * B-G = (k2 + k4)*Cb + k1*Cr 16565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * = (k2 + k4)*Cb + k1/k3*(k4*Cb + (R-B)) 16665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * = (k2 + k4 + k1*k4/k3)*Cb + k1/k3*(R-B) 16765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * 16865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * kBb*Cb = (B-G) - kYr*(R-B) 16965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * 17065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * Cb = ((B-G) - kYr*(R-B))/kBb 17165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * Cb0 = clamp(Cb + 128) 17265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * 17365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian */ 17465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 17565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic const double kBb = (k2 + k4 + k1*k4/k3); 17665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 17765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic void 17865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias AgopianinitCbtab( void ) 17965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{ 18065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint8_t *pTable; 18165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int i; 18265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 18365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian gCbTable = (uint8_t *)malloc(768*2); 18465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 18565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian pTable = gCbTable + 384; 18665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian for(i=-384; i<384; i++) 18765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian pTable[i] = (uint8_t) clamp( i/kBb + 128.5 ); 18865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 18965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 19065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian/* 19165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * SHIFT2 = 16 19265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * 19365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * DELTA = kYb*(1 << SHIFT2) 19465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * GAMMA = kYr*(1 << SHIFT2) 19565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian */ 19665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 19765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic const int SHIFT2 = 16; 19865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic const int DELTA = kYb*(1 << SHIFT2); 19965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic const int GAMMA = kYr*(1 << SHIFT2); 20065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 20165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianint32_t ccrgb16toyuv_wo_colorkey(uint8_t *rgb16, uint8_t *yuv420, 20265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint32_t *param, uint8_t *table[]) 20365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{ 20465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint16_t *inputRGB = (uint16_t*)rgb16; 20565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint8_t *outYUV = yuv420; 20665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int32_t width_dst = param[0]; 20765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int32_t height_dst = param[1]; 20865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int32_t pitch_dst = param[2]; 20965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int32_t mheight_dst = param[3]; 21065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int32_t pitch_src = param[4]; 21165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint8_t *y_tab = table[0]; 21265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint8_t *cb_tab = table[1]; 21365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint8_t *cr_tab = table[2]; 21465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 21565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int32_t size16 = pitch_dst*mheight_dst; 21665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int32_t i,j,count; 21765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int32_t ilimit,jlimit; 21865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint8_t *tempY,*tempU,*tempV; 21965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint16_t pixels; 22065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int tmp; 22165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianuint32_t temp; 22265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 22365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian tempY = outYUV; 22465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian tempU = outYUV + (height_dst * pitch_dst); 22565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian tempV = tempU + 1; 22665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 22765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian jlimit = height_dst; 22865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ilimit = width_dst; 22965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 23065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian for(j=0; j<jlimit; j+=1) 23165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian { 23265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian for (i=0; i<ilimit; i+=2) 23365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian { 23465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int32_t G_ds = 0, B_ds = 0, R_ds = 0; 23565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint8_t y0, y1, u, v; 23665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 23765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian pixels = inputRGB[i]; 23865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian temp = (BETA*(pixels & 0x001F) + ALPHA*(pixels>>11) ); 23965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian y0 = y_tab[(temp>>SHIFT1) + ((pixels>>3) & 0x00FC)]; 24065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 24165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian G_ds += (pixels>>1) & 0x03E0; 24265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian B_ds += (pixels<<5) & 0x03E0; 24365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian R_ds += (pixels>>6) & 0x03E0; 24465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 24565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian pixels = inputRGB[i+1]; 24665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian temp = (BETA*(pixels & 0x001F) + ALPHA*(pixels>>11) ); 24765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian y1 = y_tab[(temp>>SHIFT1) + ((pixels>>3) & 0x00FC)]; 24865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 24965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian G_ds += (pixels>>1) & 0x03E0; 25065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian B_ds += (pixels<<5) & 0x03E0; 25165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian R_ds += (pixels>>6) & 0x03E0; 25265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 25365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian R_ds >>= 1; 25465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian B_ds >>= 1; 25565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian G_ds >>= 1; 25665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 25765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian tmp = R_ds - B_ds; 25865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 25965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian u = cb_tab[(((B_ds-G_ds)<<SHIFT2) - GAMMA*tmp)>>(SHIFT2+2)]; 26065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian v = cr_tab[(((R_ds-G_ds)<<SHIFT2) + DELTA*tmp)>>(SHIFT2+2)]; 26165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 26265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian tempY[0] = y0; 26365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian tempY[1] = y1; 26465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian tempY += 2; 26565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 26665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian if ((j&1) == 0) { 26765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian tempU[0] = u; 26865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian tempV[0] = v; 26965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian tempU += 2; 27065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian tempV += 2; 27165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 27265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 27365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 27465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian inputRGB += pitch_src; 27565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 27665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 27765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian return 1; 27865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 27965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 28065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define min(a,b) ((a)<(b)?(a):(b)) 28165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define max(a,b) ((a)>(b)?(a):(b)) 28265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 28365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic void convert_rgb16_to_yuv420(uint8_t *rgb, uint8_t *yuv, int width, int height) 28465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{ 28565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian if (!tables_initialized) { 28665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian initYtab(); 28765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian initCrtab(); 28865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian initCbtab(); 28965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian tables_initialized = 1; 29065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 29165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 29265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint32_t param[6]; 29365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian param[0] = (uint32_t) width; 29465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian param[1] = (uint32_t) height; 29565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian param[2] = (uint32_t) width; 29665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian param[3] = (uint32_t) height; 29765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian param[4] = (uint32_t) width; 29865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian param[5] = (uint32_t) 0; 29965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 30065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint8_t *table[3]; 30165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian table[0] = gYTable; 30265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian table[1] = gCbTable + 384; 30365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian table[2] = gCrTable + 384; 30465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 30565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ccrgb16toyuv_wo_colorkey(rgb, yuv, param, table); 30665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 30765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 30865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianconst int FakeCamera::kRed; 30965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianconst int FakeCamera::kGreen; 31065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianconst int FakeCamera::kBlue; 31165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 31265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias AgopianFakeCamera::FakeCamera(int width, int height) 31365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian : mTmpRgb16Buffer(0) 31465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{ 31565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian setSize(width, height); 31665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 31765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 31865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias AgopianFakeCamera::~FakeCamera() 31965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{ 32065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian delete[] mTmpRgb16Buffer; 32165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 32265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 32365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid FakeCamera::setSize(int width, int height) 32465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{ 32565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mWidth = width; 32665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mHeight = height; 32765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mCounter = 0; 32865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mCheckX = 0; 32965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mCheckY = 0; 33065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 33165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // This will cause it to be reallocated on the next call 33265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // to getNextFrameAsYuv420(). 33365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian delete[] mTmpRgb16Buffer; 33465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mTmpRgb16Buffer = 0; 33565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 33665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 33765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid FakeCamera::getNextFrameAsRgb565(uint16_t *buffer) 33865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{ 33965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int size = mWidth / 10; 34065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 34165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian drawCheckerboard(buffer, size); 34265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 34365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int x = ((mCounter*3)&255); 34465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian if(x>128) x = 255 - x; 34565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int y = ((mCounter*5)&255); 34665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian if(y>128) y = 255 - y; 34765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 34865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian drawSquare(buffer, x*size/32, y*size/32, (size*5)>>1, (mCounter&0x100)?kRed:kGreen, kBlue); 34965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 35065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mCounter++; 35165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 35265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 35365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid FakeCamera::getNextFrameAsYuv420(uint8_t *buffer) 35465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{ 35565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian if (mTmpRgb16Buffer == 0) 35665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mTmpRgb16Buffer = new uint16_t[mWidth * mHeight]; 35765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 35865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian getNextFrameAsRgb565(mTmpRgb16Buffer); 35965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian convert_rgb16_to_yuv420((uint8_t*)mTmpRgb16Buffer, buffer, mWidth, mHeight); 36065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 36165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 36265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid FakeCamera::drawSquare(uint16_t *dst, int x, int y, int size, int color, int shadow) 36365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{ 36465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int square_xstop, square_ystop, shadow_xstop, shadow_ystop; 36565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 36665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian square_xstop = min(mWidth, x+size); 36765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian square_ystop = min(mHeight, y+size); 36865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian shadow_xstop = min(mWidth, x+size+(size/4)); 36965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian shadow_ystop = min(mHeight, y+size+(size/4)); 37065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 37165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // Do the shadow. 37265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint16_t *sh = &dst[(y+(size/4))*mWidth]; 37365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian for (int j = y + (size/4); j < shadow_ystop; j++) { 37465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian for (int i = x + (size/4); i < shadow_xstop; i++) { 37565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sh[i] &= shadow; 37665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 37765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sh += mWidth; 37865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 37965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 38065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // Draw the square. 38165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian uint16_t *sq = &dst[y*mWidth]; 38265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian for (int j = y; j < square_ystop; j++) { 38365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian for (int i = x; i < square_xstop; i++) { 38465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sq[i] = color; 38565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 38665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian sq += mWidth; 38765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 38865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 38965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 39065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid FakeCamera::drawCheckerboard(uint16_t *dst, int size) 39165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{ 39265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian bool black = true; 39365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 39465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian if((mCheckX/size)&1) 39565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian black = false; 39665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian if((mCheckY/size)&1) 39765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian black = !black; 39865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 39965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int county = mCheckY%size; 40065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int checkxremainder = mCheckX%size; 40165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 40265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian for(int y=0;y<mHeight;y++) { 40365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int countx = checkxremainder; 40465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian bool current = black; 40565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian for(int x=0;x<mWidth;x++) { 40665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian dst[y*mWidth+x] = current?0:0xffff; 40765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian if(countx++ >= size) { 40865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian countx=0; 40965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian current = !current; 41065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 41165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 41265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian if(county++ >= size) { 41365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian county=0; 41465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian black = !black; 41565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 41665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 41765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mCheckX += 3; 41865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mCheckY++; 41965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 42065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 42165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 42265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid FakeCamera::dump(int fd) const 42365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{ 42465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian const size_t SIZE = 256; 42565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian char buffer[SIZE]; 42665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian String8 result; 42765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian snprintf(buffer, 255, " width x height (%d x %d), counter (%d), check x-y coordinate(%d, %d)\n", mWidth, mHeight, mCounter, mCheckX, mCheckY); 42865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian result.append(buffer); 42965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian ::write(fd, result.string(), result.size()); 43065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} 43165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 43265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 43365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; // namespace android 434