1e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/* 2e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Copyright (C) 2011 The Android Open Source Project 3e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * 4e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Licensed under the Apache License, Version 2.0 (the "License"); 5e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * you may not use this file except in compliance with the License. 6e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * You may obtain a copy of the License at 7e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * 8e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * http://www.apache.org/licenses/LICENSE-2.0 9e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * 10e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Unless required by applicable law or agreed to in writing, software 11e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * distributed under the License is distributed on an "AS IS" BASIS, 12e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * See the License for the specific language governing permissions and 14e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * limitations under the License. 15e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */ 16e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 17e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/////////////////////////////////////////////////// 18e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen// ImageUtils.h 19e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen// $Id: ImageUtils.h,v 1.9 2011/05/16 15:33:06 mbansal Exp $ 20e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 21e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#ifndef IMAGE_UTILS_H 22e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#define IMAGE_UTILS_H 23e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 24e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#include <stdlib.h> 25e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 26e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/** 27e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Definition of basic image types 28e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */ 29e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chentypedef unsigned char ImageTypeBase; 30e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chentypedef ImageTypeBase *ImageType; 31e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 32e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chentypedef short ImageTypeShortBase; 33e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chentypedef ImageTypeShortBase *ImageTypeShort; 34e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 35e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chentypedef float ImageTypeFloatBase; 36e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chentypedef ImageTypeFloatBase *ImageTypeFloat; 37e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 38e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 39e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenclass ImageUtils { 40e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenpublic: 41e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 42e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen /** 43e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Default number of channels in image. 44e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */ 45e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen static const int IMAGE_TYPE_NUM_CHANNELS = 3; 46e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 47e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen /** 48e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Definition of an empty image. 49e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */ 50e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen static const int IMAGE_TYPE_NOIMAGE = NULL; 51e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 52e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen /** 53e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Convert image from BGR (interlaced) to YVU (non-interlaced) 54e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * 55e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Arguments: 56e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * out: Resulting image (note must be preallocated before 57e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * call) 58e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * in: Input image 59e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * width: Width of input image 60e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * height: Height of input image 61e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */ 62e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen static void rgb2yvu(ImageType out, ImageType in, int width, int height); 63e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 6441a2e9735136f372de95652d0828600282c8e967mbansal static void rgba2yvu(ImageType out, ImageType in, int width, int height); 6541a2e9735136f372de95652d0828600282c8e967mbansal 66e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen /** 67e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Convert image from YVU (non-interlaced) to BGR (interlaced) 68e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * 69e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Arguments: 70e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * out: Resulting image (note must be preallocated before 71e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * call) 72e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * in: Input image 73e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * width: Width of input image 74e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * height: Height of input image 75e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */ 76e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen static void yvu2rgb(ImageType out, ImageType in, int width, int height); 77e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen static void yvu2bgr(ImageType out, ImageType in, int width, int height); 78e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 79e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen /** 80e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Convert image from BGR to grayscale 81e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * 82e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Arguments: 83e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * in: Input image 84e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * width: Width of input image 85e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * height: Height of input image 86e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * 87e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Return: 88e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Pointer to resulting image (allocation is done here, free 89e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * must be done by caller) 90e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */ 91e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen static ImageType rgb2gray(ImageType in, int width, int height); 92e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen static ImageType rgb2gray(ImageType out, ImageType in, int width, int height); 93e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 94e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen /** 95e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Read a binary PPM image 96e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */ 97e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen static ImageType readBinaryPPM(const char *filename, int &width, int &height); 98e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 99e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen /** 100e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Write a binary PPM image 101e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */ 102e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen static void writeBinaryPPM(ImageType image, const char *filename, int width, int height, int numChannels = IMAGE_TYPE_NUM_CHANNELS); 103e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 104e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen /** 105e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Allocate space for a standard image. 106e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */ 107e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen static ImageType allocateImage(int width, int height, int numChannels, short int border = 0); 108e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 109e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen /** 110e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Free memory of image 111e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */ 112e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen static void freeImage(ImageType image); 113e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 114e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen static ImageType *imageTypeToRowPointers(ImageType out, int width, int height); 115e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen /** 116e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Get time. 117e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */ 118e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen static double getTime(); 119e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 120e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenprotected: 121e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 122e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen /** 123e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Constants for YVU/RGB conversion 124e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */ 125e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen static const int REDY = 257; 126e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen static const int REDV = 439; 127e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen static const int REDU = 148; 128e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen static const int GREENY = 504; 129e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen static const int GREENV = 368; 130e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen static const int GREENU = 291; 131e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen static const int BLUEY = 98; 132e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen static const int BLUEV = 71; 133e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen static const int BLUEU = 439; 134e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 135e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}; 136e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 137e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/** 138e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Structure containing an image and other bookkeeping items. 139e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Used in YUVinfo to store separate YVU image planes. 140e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */ 141e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chentypedef struct { 142e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen ImageType *ptr; 143e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen unsigned short width; 144e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen unsigned short height; 145e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen unsigned short border; 146e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen unsigned short pitch; 147e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen} BimageInfo; 148e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 149e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/** 150e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * A YUV image container, 151e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */ 152e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenclass YUVinfo { 153e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenpublic: 154e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen static YUVinfo *allocateImage(unsigned short width, unsigned short height); 155e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen static void mapYUVInfoToImage(YUVinfo *img, unsigned char *position); 156e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 157e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen /** 158e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Y Plane 159e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */ 160e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen BimageInfo Y; 161e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 162e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen /** 163e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * V (1st color) plane 164e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */ 165e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen BimageInfo V; 166e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 167e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen /** 168e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * U (1st color) plane 169e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */ 170e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen BimageInfo U; 171e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}; 172e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 173e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#endif 174