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