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   */
504fabf52f7e8b2419749f5cdc03925d5f8b1c0199Angus Kong  static const int IMAGE_TYPE_NOIMAGE = 0;
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