/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
///////////////////////////////////////////////////
// ImageUtils.h
// $Id: ImageUtils.h,v 1.9 2011/05/16 15:33:06 mbansal Exp $
#ifndef IMAGE_UTILS_H
#define IMAGE_UTILS_H
#include <stdlib.h>
/**
* Definition of basic image types
*/
typedef unsigned char ImageTypeBase;
typedef ImageTypeBase *ImageType;
typedef short ImageTypeShortBase;
typedef ImageTypeShortBase *ImageTypeShort;
typedef float ImageTypeFloatBase;
typedef ImageTypeFloatBase *ImageTypeFloat;
class ImageUtils {
public:
/**
* Default number of channels in image.
*/
static const int IMAGE_TYPE_NUM_CHANNELS = 3;
/**
* Definition of an empty image.
*/
static const int IMAGE_TYPE_NOIMAGE = NULL;
/**
* Convert image from BGR (interlaced) to YVU (non-interlaced)
*
* Arguments:
* out: Resulting image (note must be preallocated before
* call)
* in: Input image
* width: Width of input image
* height: Height of input image
*/
static void rgb2yvu(ImageType out, ImageType in, int width, int height);
static void rgba2yvu(ImageType out, ImageType in, int width, int height);
/**
* Convert image from YVU (non-interlaced) to BGR (interlaced)
*
* Arguments:
* out: Resulting image (note must be preallocated before
* call)
* in: Input image
* width: Width of input image
* height: Height of input image
*/
static void yvu2rgb(ImageType out, ImageType in, int width, int height);
static void yvu2bgr(ImageType out, ImageType in, int width, int height);
/**
* Convert image from BGR to grayscale
*
* Arguments:
* in: Input image
* width: Width of input image
* height: Height of input image
*
* Return:
* Pointer to resulting image (allocation is done here, free
* must be done by caller)
*/
static ImageType rgb2gray(ImageType in, int width, int height);
static ImageType rgb2gray(ImageType out, ImageType in, int width, int height);
/**
* Read a binary PPM image
*/
static ImageType readBinaryPPM(const char *filename, int &width, int &height);
/**
* Write a binary PPM image
*/
static void writeBinaryPPM(ImageType image, const char *filename, int width, int height, int numChannels = IMAGE_TYPE_NUM_CHANNELS);
/**
* Allocate space for a standard image.
*/
static ImageType allocateImage(int width, int height, int numChannels, short int border = 0);
/**
* Free memory of image
*/
static void freeImage(ImageType image);
static ImageType *imageTypeToRowPointers(ImageType out, int width, int height);
/**
* Get time.
*/
static double getTime();
protected:
/**
* Constants for YVU/RGB conversion
*/
static const int REDY = 257;
static const int REDV = 439;
static const int REDU = 148;
static const int GREENY = 504;
static const int GREENV = 368;
static const int GREENU = 291;
static const int BLUEY = 98;
static const int BLUEV = 71;
static const int BLUEU = 439;
};
/**
* Structure containing an image and other bookkeeping items.
* Used in YUVinfo to store separate YVU image planes.
*/
typedef struct {
ImageType *ptr;
unsigned short width;
unsigned short height;
unsigned short border;
unsigned short pitch;
} BimageInfo;
/**
* A YUV image container,
*/
class YUVinfo {
public:
static YUVinfo *allocateImage(unsigned short width, unsigned short height);
static void mapYUVInfoToImage(YUVinfo *img, unsigned char *position);
/**
* Y Plane
*/
BimageInfo Y;
/**
* V (1st color) plane
*/
BimageInfo V;
/**
* U (1st color) plane
*/
BimageInfo U;
};
#endif