1 /*===========================================================================* 2 - Copyright 2010 Google Inc. 3 - 4 - This code is licensed under the same terms as WebM: 5 - Software License Agreement: http://www.webmproject.org/license/software/ 6 - Additional IP Rights Grant: http://www.webmproject.org/license/additional/ 7 *===========================================================================*/ 8 9 /* 10 * Encoding/Decoding of WebP still image compression format. 11 * 12 * 1. WebPDecode: Takes an array of bytes (string) corresponding to the WebP 13 * encoded image and generates output in the YUV format with 14 * the color components U, V subsampled to 1/2 resolution along 15 * each dimension. 16 * 17 * 2. YUV420toRGBA: Converts from YUV (with color subsampling) such as produced 18 * by the WebPDecode routine into 32 bits per pixel RGBA data 19 * array. This data array can be directly used by the Leptonica 20 * Pix in-memory image format. 21 * 22 * 3. WebPEncode: Takes a Y, U, V data buffers (with color components U and V 23 * subsampled to 1/2 resolution) and generates the WebP string 24 * 25 * 4. RGBAToYUV420: Generates Y, U, V data (with color subsampling) from 32 bits 26 * per pixel RGBA data buffer. The resulting YUV data can be 27 * directly fed into the WebPEncode routine. 28 * 29 * 5. AdjustColorspace: 30 * 31 * 6. AdjustColorspaceBack: 32 */ 33 34 #ifndef THIRD_PARTY_VP8_VP8IMG_H_ 35 #define THIRD_PARTY_VP8_VP8IMG_H_ 36 37 #ifdef __cplusplus 38 extern "C" { 39 #endif /* __cplusplus */ 40 41 typedef unsigned char uint8; 42 typedef unsigned int uint32; 43 typedef enum WebPResultType { 44 webp_success = 0, 45 webp_failure = -1 46 } WebPResult; 47 48 /* Takes an array of bytes (string) corresponding to the WebP 49 * encoded image and generates output in the YUV format with 50 * the color components U, V subsampled to 1/2 resolution along 51 * each dimension. 52 * Input: 53 * 1. data: the WebP data stream (array of bytes) 54 * 2. data_size: count of bytes in the WebP data stream 55 * 56 * Output: 57 * 3. p_Y/p_U/p_V : pointer to the Y/U/V data buffer (this routine will 58 * allocate memory for the buffer, fill the buffer with 59 * appropriate data and transfer owner ship of the buffer 60 * to caller. Caller is responsible for freeing the memory). 61 * Note that the memory for Y, U, V buffers is alloacted 62 * in one chunk, hence one should call free(*p_Y) only. 63 * Do not try to free the U and V buffers. 64 * 65 * 6. p_width: this routine returns the width of the decoded image here 66 * 7. p_height: this routine returns the width of the decoded image here 67 * Return: success/failure 68 */ 69 WebPResult WebPDecode(const uint8* data, 70 int data_size, 71 uint8** p_Y, 72 uint8** p_U, 73 uint8** p_V, 74 int* p_width, 75 int* p_height); 76 77 /* WebPEncode: Takes a Y, U, V data buffers (with color components U and V 78 * subsampled to 1/2 resolution) and generates the WebP string. 79 * Input: 80 * 1, 2, 3. Y, U, V: The input YUV data buffers 81 * 4, 5. y_width, y_height: The width and height of the image whose data 82 * is in Y, U, V. This matches the Y plane. The U 83 * and V planes typically have 1/2 width and 84 * height. 85 * 6. y_stride: The width (in bytes) of one row of Y data. This may not 86 * match width if there is end of row padding (e.g., for 32 87 * bit row alignment). 88 * 7. QP: the quantization parameter. This parameter controls the 89 * compression vs quality tradeoff. Use smaller numbers for better 90 * quality (compression will be lesser) and vice versa. 20 is a 91 * good optimal value. 92 * Output: 93 * 8. p_out: the output array of bytes corresponding to the encoded WebP 94 * image. This routine allocates memory for the buffer, fills it 95 * with appropriate values and transfers ownership to caller. 96 * Caller responsible for freeing of memory. 97 * Return: success/failure 98 */ 99 WebPResult WebPEncode(const uint8* Y, 100 const uint8* U, 101 const uint8* V, 102 int y_width, 103 int y_height, 104 int y_stride, 105 int uv_width, 106 int uv_height, 107 int uv_stride, 108 int QP, 109 unsigned char** p_out, 110 int* p_out_size_bytes, 111 double* psnr); 112 113 /* Converts from YUV (with color subsampling) such as produced by the WebPDecode 114 * routine into 32 bits per pixel RGBA data array. This data array can be 115 * directly used by the Leptonica Pix in-memory image format. 116 * Input: 117 * 1, 2, 3. Y, U, V: the input data buffers 118 * 4. pixwpl: the desired words per line corresponding to the supplied 119 * output pixdata. 120 * 5. width, height: the dimensions of the image whose data resides in Y, 121 * U, V. 122 * Output: 123 * 6. pixdata: the output data buffer. Caller should allocate 124 * height * pixwpl bytes of memory before calling this routine. 125 */ 126 void YUV420toRGBA(uint8* Y, 127 uint8* U, 128 uint8* V, 129 int words_per_line, 130 int width, 131 int height, 132 uint32* pixdata); 133 134 /* Generates Y, U, V data (with color subsampling) from 32 bits 135 * per pixel RGBA data buffer. The resulting YUV data can be directly fed into 136 * the WebPEncode routine. 137 * Input: 138 * 1. pix data input rgba data buffer 139 * 2. words per line corresponding to pixdata 140 * 3, 4. image width and height respectively 141 * Output: 142 * 5, 6, 7. Output YUV data buffers 143 */ 144 void RGBAToYUV420(uint32* pixdata, 145 int words_per_line, 146 int width, 147 int height, 148 uint8* Y, 149 uint8* U, 150 uint8* V); 151 152 /* This function adjust from YUV420J (jpeg decoding) to YUV420 (webp input) 153 * Hints: http://en.wikipedia.org/wiki/YCbCr 154 */ 155 void AdjustColorspace(uint8* Y, uint8* U, uint8* V, int width, int height); 156 157 /* Inverse function: convert from YUV420 to YUV420J */ 158 void AdjustColorspaceBack(uint8* Y, uint8* U, uint8* V, int width, int height); 159 160 /* Checks WebP image header and outputs height and width information of 161 * the image 162 * 163 * Input: 164 * 1. data: the WebP data stream (array of bytes) 165 * 2. data_size: count of bytes in the WebP data stream 166 * 167 * Outut: 168 * width/height: width and height of the image 169 * 170 * Return: success/failure 171 */ 172 WebPResult WebPGetInfo(const uint8* data, 173 int data_size, 174 int *width, 175 int *height); 176 177 #ifdef __cplusplus 178 } 179 #endif /* __cplusplus */ 180 181 #endif /* THIRD_PARTY_VP8_VP8IMG_H_ */ 182