/src/libjpeg-turbo.main/turbojpeg.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright (C)2009-2015, 2017, 2020-2021, 2023 D. R. Commander. |
3 | | * All Rights Reserved. |
4 | | * |
5 | | * Redistribution and use in source and binary forms, with or without |
6 | | * modification, are permitted provided that the following conditions are met: |
7 | | * |
8 | | * - Redistributions of source code must retain the above copyright notice, |
9 | | * this list of conditions and the following disclaimer. |
10 | | * - Redistributions in binary form must reproduce the above copyright notice, |
11 | | * this list of conditions and the following disclaimer in the documentation |
12 | | * and/or other materials provided with the distribution. |
13 | | * - Neither the name of the libjpeg-turbo Project nor the names of its |
14 | | * contributors may be used to endorse or promote products derived from this |
15 | | * software without specific prior written permission. |
16 | | * |
17 | | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS", |
18 | | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
19 | | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
20 | | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE |
21 | | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
22 | | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
23 | | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
24 | | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
25 | | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
26 | | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
27 | | * POSSIBILITY OF SUCH DAMAGE. |
28 | | */ |
29 | | |
30 | | #ifndef __TURBOJPEG_H__ |
31 | | #define __TURBOJPEG_H__ |
32 | | |
33 | | #if defined(_WIN32) && defined(DLLDEFINE) |
34 | | #define DLLEXPORT __declspec(dllexport) |
35 | | #else |
36 | | #define DLLEXPORT |
37 | | #endif |
38 | | #define DLLCALL |
39 | | |
40 | | |
41 | | /** |
42 | | * @addtogroup TurboJPEG |
43 | | * TurboJPEG API. This API provides an interface for generating, decoding, and |
44 | | * transforming planar YUV and JPEG images in memory. |
45 | | * |
46 | | * @anchor YUVnotes |
47 | | * YUV Image Format Notes |
48 | | * ---------------------- |
49 | | * Technically, the JPEG format uses the YCbCr colorspace (which is technically |
50 | | * not a colorspace but a color transform), but per the convention of the |
51 | | * digital video community, the TurboJPEG API uses "YUV" to refer to an image |
52 | | * format consisting of Y, Cb, and Cr image planes. |
53 | | * |
54 | | * Each plane is simply a 2D array of bytes, each byte representing the value |
55 | | * of one of the components (Y, Cb, or Cr) at a particular location in the |
56 | | * image. The width and height of each plane are determined by the image |
57 | | * width, height, and level of chrominance subsampling. The luminance plane |
58 | | * width is the image width padded to the nearest multiple of the horizontal |
59 | | * subsampling factor (1 in the case of 4:4:4, grayscale, or 4:4:0; 2 in the |
60 | | * case of 4:2:2 or 4:2:0; 4 in the case of 4:1:1.) Similarly, the luminance |
61 | | * plane height is the image height padded to the nearest multiple of the |
62 | | * vertical subsampling factor (1 in the case of 4:4:4, 4:2:2, grayscale, or |
63 | | * 4:1:1; 2 in the case of 4:2:0 or 4:4:0.) This is irrespective of any |
64 | | * additional padding that may be specified as an argument to the various YUV |
65 | | * functions. The chrominance plane width is equal to the luminance plane |
66 | | * width divided by the horizontal subsampling factor, and the chrominance |
67 | | * plane height is equal to the luminance plane height divided by the vertical |
68 | | * subsampling factor. |
69 | | * |
70 | | * For example, if the source image is 35 x 35 pixels and 4:2:2 subsampling is |
71 | | * used, then the luminance plane would be 36 x 35 bytes, and each of the |
72 | | * chrominance planes would be 18 x 35 bytes. If you specify a row alignment |
73 | | * of 4 bytes on top of this, then the luminance plane would be 36 x 35 bytes, |
74 | | * and each of the chrominance planes would be 20 x 35 bytes. |
75 | | * |
76 | | * @{ |
77 | | */ |
78 | | |
79 | | |
80 | | /** |
81 | | * The number of chrominance subsampling options |
82 | | */ |
83 | 401k | #define TJ_NUMSAMP 6 |
84 | | |
85 | | /** |
86 | | * Chrominance subsampling options. |
87 | | * When pixels are converted from RGB to YCbCr (see #TJCS_YCbCr) or from CMYK |
88 | | * to YCCK (see #TJCS_YCCK) as part of the JPEG compression process, some of |
89 | | * the Cb and Cr (chrominance) components can be discarded or averaged together |
90 | | * to produce a smaller image with little perceptible loss of image clarity. |
91 | | * (The human eye is more sensitive to small changes in brightness than to |
92 | | * small changes in color.) This is called "chrominance subsampling". |
93 | | */ |
94 | | enum TJSAMP { |
95 | | /** |
96 | | * 4:4:4 chrominance subsampling (no chrominance subsampling). The JPEG or |
97 | | * YUV image will contain one chrominance component for every pixel in the |
98 | | * source image. |
99 | | */ |
100 | | TJSAMP_444 = 0, |
101 | | /** |
102 | | * 4:2:2 chrominance subsampling. The JPEG or YUV image will contain one |
103 | | * chrominance component for every 2x1 block of pixels in the source image. |
104 | | */ |
105 | | TJSAMP_422, |
106 | | /** |
107 | | * 4:2:0 chrominance subsampling. The JPEG or YUV image will contain one |
108 | | * chrominance component for every 2x2 block of pixels in the source image. |
109 | | */ |
110 | | TJSAMP_420, |
111 | | /** |
112 | | * Grayscale. The JPEG or YUV image will contain no chrominance components. |
113 | | */ |
114 | | TJSAMP_GRAY, |
115 | | /** |
116 | | * 4:4:0 chrominance subsampling. The JPEG or YUV image will contain one |
117 | | * chrominance component for every 1x2 block of pixels in the source image. |
118 | | * |
119 | | * @note 4:4:0 subsampling is not fully accelerated in libjpeg-turbo. |
120 | | */ |
121 | | TJSAMP_440, |
122 | | /** |
123 | | * 4:1:1 chrominance subsampling. The JPEG or YUV image will contain one |
124 | | * chrominance component for every 4x1 block of pixels in the source image. |
125 | | * JPEG images compressed with 4:1:1 subsampling will be almost exactly the |
126 | | * same size as those compressed with 4:2:0 subsampling, and in the |
127 | | * aggregate, both subsampling methods produce approximately the same |
128 | | * perceptual quality. However, 4:1:1 is better able to reproduce sharp |
129 | | * horizontal features. |
130 | | * |
131 | | * @note 4:1:1 subsampling is not fully accelerated in libjpeg-turbo. |
132 | | */ |
133 | | TJSAMP_411 |
134 | | }; |
135 | | |
136 | | /** |
137 | | * MCU block width (in pixels) for a given level of chrominance subsampling. |
138 | | * MCU block sizes: |
139 | | * - 8x8 for no subsampling or grayscale |
140 | | * - 16x8 for 4:2:2 |
141 | | * - 8x16 for 4:4:0 |
142 | | * - 16x16 for 4:2:0 |
143 | | * - 32x8 for 4:1:1 |
144 | | */ |
145 | | static const int tjMCUWidth[TJ_NUMSAMP] = { 8, 16, 16, 8, 8, 32 }; |
146 | | |
147 | | /** |
148 | | * MCU block height (in pixels) for a given level of chrominance subsampling. |
149 | | * MCU block sizes: |
150 | | * - 8x8 for no subsampling or grayscale |
151 | | * - 16x8 for 4:2:2 |
152 | | * - 8x16 for 4:4:0 |
153 | | * - 16x16 for 4:2:0 |
154 | | * - 32x8 for 4:1:1 |
155 | | */ |
156 | | static const int tjMCUHeight[TJ_NUMSAMP] = { 8, 8, 16, 8, 16, 8 }; |
157 | | |
158 | | |
159 | | /** |
160 | | * The number of pixel formats |
161 | | */ |
162 | 251k | #define TJ_NUMPF 12 |
163 | | |
164 | | /** |
165 | | * Pixel formats |
166 | | */ |
167 | | enum TJPF { |
168 | | /** |
169 | | * RGB pixel format. The red, green, and blue components in the image are |
170 | | * stored in 3-byte pixels in the order R, G, B from lowest to highest byte |
171 | | * address within each pixel. |
172 | | */ |
173 | | TJPF_RGB = 0, |
174 | | /** |
175 | | * BGR pixel format. The red, green, and blue components in the image are |
176 | | * stored in 3-byte pixels in the order B, G, R from lowest to highest byte |
177 | | * address within each pixel. |
178 | | */ |
179 | | TJPF_BGR, |
180 | | /** |
181 | | * RGBX pixel format. The red, green, and blue components in the image are |
182 | | * stored in 4-byte pixels in the order R, G, B from lowest to highest byte |
183 | | * address within each pixel. The X component is ignored when compressing |
184 | | * and undefined when decompressing. |
185 | | */ |
186 | | TJPF_RGBX, |
187 | | /** |
188 | | * BGRX pixel format. The red, green, and blue components in the image are |
189 | | * stored in 4-byte pixels in the order B, G, R from lowest to highest byte |
190 | | * address within each pixel. The X component is ignored when compressing |
191 | | * and undefined when decompressing. |
192 | | */ |
193 | | TJPF_BGRX, |
194 | | /** |
195 | | * XBGR pixel format. The red, green, and blue components in the image are |
196 | | * stored in 4-byte pixels in the order R, G, B from highest to lowest byte |
197 | | * address within each pixel. The X component is ignored when compressing |
198 | | * and undefined when decompressing. |
199 | | */ |
200 | | TJPF_XBGR, |
201 | | /** |
202 | | * XRGB pixel format. The red, green, and blue components in the image are |
203 | | * stored in 4-byte pixels in the order B, G, R from highest to lowest byte |
204 | | * address within each pixel. The X component is ignored when compressing |
205 | | * and undefined when decompressing. |
206 | | */ |
207 | | TJPF_XRGB, |
208 | | /** |
209 | | * Grayscale pixel format. Each 1-byte pixel represents a luminance |
210 | | * (brightness) level from 0 to 255. |
211 | | */ |
212 | | TJPF_GRAY, |
213 | | /** |
214 | | * RGBA pixel format. This is the same as @ref TJPF_RGBX, except that when |
215 | | * decompressing, the X component is guaranteed to be 0xFF, which can be |
216 | | * interpreted as an opaque alpha channel. |
217 | | */ |
218 | | TJPF_RGBA, |
219 | | /** |
220 | | * BGRA pixel format. This is the same as @ref TJPF_BGRX, except that when |
221 | | * decompressing, the X component is guaranteed to be 0xFF, which can be |
222 | | * interpreted as an opaque alpha channel. |
223 | | */ |
224 | | TJPF_BGRA, |
225 | | /** |
226 | | * ABGR pixel format. This is the same as @ref TJPF_XBGR, except that when |
227 | | * decompressing, the X component is guaranteed to be 0xFF, which can be |
228 | | * interpreted as an opaque alpha channel. |
229 | | */ |
230 | | TJPF_ABGR, |
231 | | /** |
232 | | * ARGB pixel format. This is the same as @ref TJPF_XRGB, except that when |
233 | | * decompressing, the X component is guaranteed to be 0xFF, which can be |
234 | | * interpreted as an opaque alpha channel. |
235 | | */ |
236 | | TJPF_ARGB, |
237 | | /** |
238 | | * CMYK pixel format. Unlike RGB, which is an additive color model used |
239 | | * primarily for display, CMYK (Cyan/Magenta/Yellow/Key) is a subtractive |
240 | | * color model used primarily for printing. In the CMYK color model, the |
241 | | * value of each color component typically corresponds to an amount of cyan, |
242 | | * magenta, yellow, or black ink that is applied to a white background. In |
243 | | * order to convert between CMYK and RGB, it is necessary to use a color |
244 | | * management system (CMS.) A CMS will attempt to map colors within the |
245 | | * printer's gamut to perceptually similar colors in the display's gamut and |
246 | | * vice versa, but the mapping is typically not 1:1 or reversible, nor can it |
247 | | * be defined with a simple formula. Thus, such a conversion is out of scope |
248 | | * for a codec library. However, the TurboJPEG API allows for compressing |
249 | | * packed-pixel CMYK images into YCCK JPEG images (see #TJCS_YCCK) and |
250 | | * decompressing YCCK JPEG images into packed-pixel CMYK images. |
251 | | */ |
252 | | TJPF_CMYK, |
253 | | /** |
254 | | * Unknown pixel format. Currently this is only used by #tjLoadImage(). |
255 | | */ |
256 | | TJPF_UNKNOWN = -1 |
257 | | }; |
258 | | |
259 | | /** |
260 | | * Red offset (in bytes) for a given pixel format. This specifies the number |
261 | | * of bytes that the red component is offset from the start of the pixel. For |
262 | | * instance, if a pixel of format TJPF_BGRX is stored in |
263 | | * `unsigned char pixel[]`, then the red component will be |
264 | | *`pixel[tjRedOffset[TJPF_BGRX]]`. This will be -1 if the pixel format does |
265 | | * not have a red component. |
266 | | */ |
267 | | static const int tjRedOffset[TJ_NUMPF] = { |
268 | | 0, 2, 0, 2, 3, 1, -1, 0, 2, 3, 1, -1 |
269 | | }; |
270 | | /** |
271 | | * Green offset (in bytes) for a given pixel format. This specifies the number |
272 | | * of bytes that the green component is offset from the start of the pixel. |
273 | | * For instance, if a pixel of format TJPF_BGRX is stored in |
274 | | * `unsigned char pixel[]`, then the green component will be |
275 | | * `pixel[tjGreenOffset[TJPF_BGRX]]`. This will be -1 if the pixel format does |
276 | | * not have a green component. |
277 | | */ |
278 | | static const int tjGreenOffset[TJ_NUMPF] = { |
279 | | 1, 1, 1, 1, 2, 2, -1, 1, 1, 2, 2, -1 |
280 | | }; |
281 | | /** |
282 | | * Blue offset (in bytes) for a given pixel format. This specifies the number |
283 | | * of bytes that the blue component is offset from the start of the pixel. For |
284 | | * instance, if a pixel of format TJPF_BGRX is stored in |
285 | | * `unsigned char pixel[]`, then the blue component will be |
286 | | * `pixel[tjBlueOffset[TJPF_BGRX]]`. This will be -1 if the pixel format does |
287 | | * not have a blue component. |
288 | | */ |
289 | | static const int tjBlueOffset[TJ_NUMPF] = { |
290 | | 2, 0, 2, 0, 1, 3, -1, 2, 0, 1, 3, -1 |
291 | | }; |
292 | | /** |
293 | | * Alpha offset (in bytes) for a given pixel format. This specifies the number |
294 | | * of bytes that the alpha component is offset from the start of the pixel. |
295 | | * For instance, if a pixel of format TJPF_BGRA is stored in |
296 | | * `unsigned char pixel[]`, then the alpha component will be |
297 | | * `pixel[tjAlphaOffset[TJPF_BGRA]]`. This will be -1 if the pixel format does |
298 | | * not have an alpha component. |
299 | | */ |
300 | | static const int tjAlphaOffset[TJ_NUMPF] = { |
301 | | -1, -1, -1, -1, -1, -1, -1, 3, 3, 0, 0, -1 |
302 | | }; |
303 | | /** |
304 | | * Pixel size (in bytes) for a given pixel format |
305 | | */ |
306 | | static const int tjPixelSize[TJ_NUMPF] = { |
307 | | 3, 3, 4, 4, 4, 4, 1, 4, 4, 4, 4, 4 |
308 | | }; |
309 | | |
310 | | |
311 | | /** |
312 | | * The number of JPEG colorspaces |
313 | | */ |
314 | | #define TJ_NUMCS 5 |
315 | | |
316 | | /** |
317 | | * JPEG colorspaces |
318 | | */ |
319 | | enum TJCS { |
320 | | /** |
321 | | * RGB colorspace. When compressing the JPEG image, the R, G, and B |
322 | | * components in the source image are reordered into image planes, but no |
323 | | * colorspace conversion or subsampling is performed. RGB JPEG images can be |
324 | | * decompressed to packed-pixel images with any of the extended RGB or |
325 | | * grayscale pixel formats, but they cannot be decompressed to planar YUV |
326 | | * images. |
327 | | */ |
328 | | TJCS_RGB = 0, |
329 | | /** |
330 | | * YCbCr colorspace. YCbCr is not an absolute colorspace but rather a |
331 | | * mathematical transformation of RGB designed solely for storage and |
332 | | * transmission. YCbCr images must be converted to RGB before they can |
333 | | * actually be displayed. In the YCbCr colorspace, the Y (luminance) |
334 | | * component represents the black & white portion of the original image, and |
335 | | * the Cb and Cr (chrominance) components represent the color portion of the |
336 | | * original image. Originally, the analog equivalent of this transformation |
337 | | * allowed the same signal to drive both black & white and color televisions, |
338 | | * but JPEG images use YCbCr primarily because it allows the color data to be |
339 | | * optionally subsampled for the purposes of reducing network or disk usage. |
340 | | * YCbCr is the most common JPEG colorspace, and YCbCr JPEG images can be |
341 | | * compressed from and decompressed to packed-pixel images with any of the |
342 | | * extended RGB or grayscale pixel formats. YCbCr JPEG images can also be |
343 | | * compressed from and decompressed to planar YUV images. |
344 | | */ |
345 | | TJCS_YCbCr, |
346 | | /** |
347 | | * Grayscale colorspace. The JPEG image retains only the luminance data (Y |
348 | | * component), and any color data from the source image is discarded. |
349 | | * Grayscale JPEG images can be compressed from and decompressed to |
350 | | * packed-pixel images with any of the extended RGB or grayscale pixel |
351 | | * formats, or they can be compressed from and decompressed to planar YUV |
352 | | * images. |
353 | | */ |
354 | | TJCS_GRAY, |
355 | | /** |
356 | | * CMYK colorspace. When compressing the JPEG image, the C, M, Y, and K |
357 | | * components in the source image are reordered into image planes, but no |
358 | | * colorspace conversion or subsampling is performed. CMYK JPEG images can |
359 | | * only be decompressed to packed-pixel images with the CMYK pixel format. |
360 | | */ |
361 | | TJCS_CMYK, |
362 | | /** |
363 | | * YCCK colorspace. YCCK (AKA "YCbCrK") is not an absolute colorspace but |
364 | | * rather a mathematical transformation of CMYK designed solely for storage |
365 | | * and transmission. It is to CMYK as YCbCr is to RGB. CMYK pixels can be |
366 | | * reversibly transformed into YCCK, and as with YCbCr, the chrominance |
367 | | * components in the YCCK pixels can be subsampled without incurring major |
368 | | * perceptual loss. YCCK JPEG images can only be compressed from and |
369 | | * decompressed to packed-pixel images with the CMYK pixel format. |
370 | | */ |
371 | | TJCS_YCCK |
372 | | }; |
373 | | |
374 | | |
375 | | /** |
376 | | * Rows in the packed-pixel source/destination image are stored in bottom-up |
377 | | * (Windows, OpenGL) order rather than in top-down (X11) order. |
378 | | */ |
379 | 83.9M | #define TJFLAG_BOTTOMUP 2 |
380 | | /** |
381 | | * When decompressing an image that was compressed using chrominance |
382 | | * subsampling, use the fastest chrominance upsampling algorithm available. |
383 | | * The default is to use smooth upsampling, which creates a smooth transition |
384 | | * between neighboring chrominance components in order to reduce upsampling |
385 | | * artifacts in the decompressed image. |
386 | | */ |
387 | 147k | #define TJFLAG_FASTUPSAMPLE 256 |
388 | | /** |
389 | | * Disable JPEG buffer (re)allocation. If passed to one of the JPEG |
390 | | * compression or transform functions, this flag will cause those functions to |
391 | | * generate an error if the JPEG destination buffer is invalid or too small, |
392 | | * rather than attempt to allocate or reallocate that buffer. |
393 | | */ |
394 | 0 | #define TJFLAG_NOREALLOC 1024 |
395 | | /** |
396 | | * Use the fastest DCT/IDCT algorithm available. The default if this flag is |
397 | | * not specified is implementation-specific. For example, the implementation |
398 | | * of the TurboJPEG API in libjpeg-turbo uses the fast algorithm by default |
399 | | * when compressing, because this has been shown to have only a very slight |
400 | | * effect on accuracy, but it uses the accurate algorithm when decompressing, |
401 | | * because this has been shown to have a larger effect. |
402 | | */ |
403 | 147k | #define TJFLAG_FASTDCT 2048 |
404 | | /** |
405 | | * Use the most accurate DCT/IDCT algorithm available. The default if this |
406 | | * flag is not specified is implementation-specific. For example, the |
407 | | * implementation of the TurboJPEG API in libjpeg-turbo uses the fast algorithm |
408 | | * by default when compressing, because this has been shown to have only a very |
409 | | * slight effect on accuracy, but it uses the accurate algorithm when |
410 | | * decompressing, because this has been shown to have a larger effect. |
411 | | */ |
412 | 0 | #define TJFLAG_ACCURATEDCT 4096 |
413 | | /** |
414 | | * Immediately discontinue the current compression/decompression/transform |
415 | | * operation if a warning (non-fatal error) occurs. The default behavior is to |
416 | | * allow the operation to complete unless a fatal error is encountered. |
417 | | */ |
418 | 251k | #define TJFLAG_STOPONWARNING 8192 |
419 | | /** |
420 | | * Use progressive entropy coding in JPEG images generated by the compression |
421 | | * and transform functions. Progressive entropy coding will generally improve |
422 | | * compression relative to baseline entropy coding (the default), but it will |
423 | | * reduce compression and decompression performance considerably. |
424 | | */ |
425 | 0 | #define TJFLAG_PROGRESSIVE 16384 |
426 | | /** |
427 | | * Limit the number of progressive JPEG scans that the decompression and |
428 | | * transform functions will process. If a progressive JPEG image contains an |
429 | | * unreasonably large number of scans, then this flag will cause the |
430 | | * decompression and transform functions to return an error. The primary |
431 | | * purpose of this is to allow security-critical applications to guard against |
432 | | * an exploit of the progressive JPEG format described in |
433 | | * <a href="https://libjpeg-turbo.org/pmwiki/uploads/About/TwoIssueswiththeJPEGStandard.pdf" target="_blank">this report</a>. |
434 | | */ |
435 | 503k | #define TJFLAG_LIMITSCANS 32768 |
436 | | |
437 | | |
438 | | /** |
439 | | * The number of error codes |
440 | | */ |
441 | | #define TJ_NUMERR 2 |
442 | | |
443 | | /** |
444 | | * Error codes |
445 | | */ |
446 | | enum TJERR { |
447 | | /** |
448 | | * The error was non-fatal and recoverable, but the destination image may |
449 | | * still be corrupt. |
450 | | */ |
451 | | TJERR_WARNING = 0, |
452 | | /** |
453 | | * The error was fatal and non-recoverable. |
454 | | */ |
455 | | TJERR_FATAL |
456 | | }; |
457 | | |
458 | | |
459 | | /** |
460 | | * The number of transform operations |
461 | | */ |
462 | | #define TJ_NUMXOP 8 |
463 | | |
464 | | /** |
465 | | * Transform operations for #tjTransform() |
466 | | */ |
467 | | enum TJXOP { |
468 | | /** |
469 | | * Do not transform the position of the image pixels |
470 | | */ |
471 | | TJXOP_NONE = 0, |
472 | | /** |
473 | | * Flip (mirror) image horizontally. This transform is imperfect if there |
474 | | * are any partial MCU blocks on the right edge (see #TJXOPT_PERFECT.) |
475 | | */ |
476 | | TJXOP_HFLIP, |
477 | | /** |
478 | | * Flip (mirror) image vertically. This transform is imperfect if there are |
479 | | * any partial MCU blocks on the bottom edge (see #TJXOPT_PERFECT.) |
480 | | */ |
481 | | TJXOP_VFLIP, |
482 | | /** |
483 | | * Transpose image (flip/mirror along upper left to lower right axis.) This |
484 | | * transform is always perfect. |
485 | | */ |
486 | | TJXOP_TRANSPOSE, |
487 | | /** |
488 | | * Transverse transpose image (flip/mirror along upper right to lower left |
489 | | * axis.) This transform is imperfect if there are any partial MCU blocks in |
490 | | * the image (see #TJXOPT_PERFECT.) |
491 | | */ |
492 | | TJXOP_TRANSVERSE, |
493 | | /** |
494 | | * Rotate image clockwise by 90 degrees. This transform is imperfect if |
495 | | * there are any partial MCU blocks on the bottom edge (see |
496 | | * #TJXOPT_PERFECT.) |
497 | | */ |
498 | | TJXOP_ROT90, |
499 | | /** |
500 | | * Rotate image 180 degrees. This transform is imperfect if there are any |
501 | | * partial MCU blocks in the image (see #TJXOPT_PERFECT.) |
502 | | */ |
503 | | TJXOP_ROT180, |
504 | | /** |
505 | | * Rotate image counter-clockwise by 90 degrees. This transform is imperfect |
506 | | * if there are any partial MCU blocks on the right edge (see |
507 | | * #TJXOPT_PERFECT.) |
508 | | */ |
509 | | TJXOP_ROT270 |
510 | | }; |
511 | | |
512 | | |
513 | | /** |
514 | | * This option will cause #tjTransform() to return an error if the transform is |
515 | | * not perfect. Lossless transforms operate on MCU blocks, whose size depends |
516 | | * on the level of chrominance subsampling used (see #tjMCUWidth and |
517 | | * #tjMCUHeight.) If the image's width or height is not evenly divisible by |
518 | | * the MCU block size, then there will be partial MCU blocks on the right |
519 | | * and/or bottom edges. It is not possible to move these partial MCU blocks to |
520 | | * the top or left of the image, so any transform that would require that is |
521 | | * "imperfect." If this option is not specified, then any partial MCU blocks |
522 | | * that cannot be transformed will be left in place, which will create |
523 | | * odd-looking strips on the right or bottom edge of the image. |
524 | | */ |
525 | 0 | #define TJXOPT_PERFECT 1 |
526 | | /** |
527 | | * This option will cause #tjTransform() to discard any partial MCU blocks that |
528 | | * cannot be transformed. |
529 | | */ |
530 | 0 | #define TJXOPT_TRIM 2 |
531 | | /** |
532 | | * This option will enable lossless cropping. See #tjTransform() for more |
533 | | * information. |
534 | | */ |
535 | 0 | #define TJXOPT_CROP 4 |
536 | | /** |
537 | | * This option will discard the color data in the source image and produce a |
538 | | * grayscale destination image. |
539 | | */ |
540 | 0 | #define TJXOPT_GRAY 8 |
541 | | /** |
542 | | * This option will prevent #tjTransform() from outputting a JPEG image for |
543 | | * this particular transform. (This can be used in conjunction with a custom |
544 | | * filter to capture the transformed DCT coefficients without transcoding |
545 | | * them.) |
546 | | */ |
547 | 0 | #define TJXOPT_NOOUTPUT 16 |
548 | | /** |
549 | | * This option will enable progressive entropy coding in the JPEG image |
550 | | * generated by this particular transform. Progressive entropy coding will |
551 | | * generally improve compression relative to baseline entropy coding (the |
552 | | * default), but it will reduce decompression performance considerably. |
553 | | */ |
554 | 0 | #define TJXOPT_PROGRESSIVE 32 |
555 | | /** |
556 | | * This option will prevent #tjTransform() from copying any extra markers |
557 | | * (including EXIF and ICC profile data) from the source image to the |
558 | | * destination image. |
559 | | */ |
560 | 0 | #define TJXOPT_COPYNONE 64 |
561 | | |
562 | | |
563 | | /** |
564 | | * Scaling factor |
565 | | */ |
566 | | typedef struct { |
567 | | /** |
568 | | * Numerator |
569 | | */ |
570 | | int num; |
571 | | /** |
572 | | * Denominator |
573 | | */ |
574 | | int denom; |
575 | | } tjscalingfactor; |
576 | | |
577 | | /** |
578 | | * Cropping region |
579 | | */ |
580 | | typedef struct { |
581 | | /** |
582 | | * The left boundary of the cropping region. This must be evenly divisible |
583 | | * by the MCU block width (see #tjMCUWidth.) |
584 | | */ |
585 | | int x; |
586 | | /** |
587 | | * The upper boundary of the cropping region. This must be evenly divisible |
588 | | * by the MCU block height (see #tjMCUHeight.) |
589 | | */ |
590 | | int y; |
591 | | /** |
592 | | * The width of the cropping region. Setting this to 0 is the equivalent of |
593 | | * setting it to the width of the source JPEG image - x. |
594 | | */ |
595 | | int w; |
596 | | /** |
597 | | * The height of the cropping region. Setting this to 0 is the equivalent of |
598 | | * setting it to the height of the source JPEG image - y. |
599 | | */ |
600 | | int h; |
601 | | } tjregion; |
602 | | |
603 | | /** |
604 | | * Lossless transform |
605 | | */ |
606 | | typedef struct tjtransform { |
607 | | /** |
608 | | * Cropping region |
609 | | */ |
610 | | tjregion r; |
611 | | /** |
612 | | * One of the @ref TJXOP "transform operations" |
613 | | */ |
614 | | int op; |
615 | | /** |
616 | | * The bitwise OR of one of more of the @ref TJXOPT_COPYNONE |
617 | | * "transform options" |
618 | | */ |
619 | | int options; |
620 | | /** |
621 | | * Arbitrary data that can be accessed within the body of the callback |
622 | | * function |
623 | | */ |
624 | | void *data; |
625 | | /** |
626 | | * A callback function that can be used to modify the DCT coefficients after |
627 | | * they are losslessly transformed but before they are transcoded to a new |
628 | | * JPEG image. This allows for custom filters or other transformations to be |
629 | | * applied in the frequency domain. |
630 | | * |
631 | | * @param coeffs pointer to an array of transformed DCT coefficients. (NOTE: |
632 | | * this pointer is not guaranteed to be valid once the callback returns, so |
633 | | * applications wishing to hand off the DCT coefficients to another function |
634 | | * or library should make a copy of them within the body of the callback.) |
635 | | * |
636 | | * @param arrayRegion #tjregion structure containing the width and height of |
637 | | * the array pointed to by `coeffs` as well as its offset relative to the |
638 | | * component plane. TurboJPEG implementations may choose to split each |
639 | | * component plane into multiple DCT coefficient arrays and call the callback |
640 | | * function once for each array. |
641 | | * |
642 | | * @param planeRegion #tjregion structure containing the width and height of |
643 | | * the component plane to which `coeffs` belongs |
644 | | * |
645 | | * @param componentID ID number of the component plane to which `coeffs` |
646 | | * belongs. (Y, Cb, and Cr have, respectively, ID's of 0, 1, and 2 in |
647 | | * typical JPEG images.) |
648 | | * |
649 | | * @param transformID ID number of the transformed image to which `coeffs` |
650 | | * belongs. This is the same as the index of the transform in the |
651 | | * `transforms` array that was passed to #tjTransform(). |
652 | | * |
653 | | * @param transform a pointer to a #tjtransform structure that specifies the |
654 | | * parameters and/or cropping region for this transform |
655 | | * |
656 | | * @return 0 if the callback was successful, or -1 if an error occurred. |
657 | | */ |
658 | | int (*customFilter) (short *coeffs, tjregion arrayRegion, |
659 | | tjregion planeRegion, int componentIndex, |
660 | | int transformIndex, struct tjtransform *transform); |
661 | | } tjtransform; |
662 | | |
663 | | /** |
664 | | * TurboJPEG instance handle |
665 | | */ |
666 | | typedef void *tjhandle; |
667 | | |
668 | | |
669 | | /** |
670 | | * Pad the given width to the nearest multiple of 4 |
671 | | */ |
672 | | #define TJPAD(width) (((width) + 3) & (~3)) |
673 | | |
674 | | /** |
675 | | * Compute the scaled value of `dimension` using the given scaling factor. |
676 | | * This macro performs the integer equivalent of `ceil(dimension * |
677 | | * scalingFactor)`. |
678 | | */ |
679 | | #define TJSCALED(dimension, scalingFactor) \ |
680 | 5.03M | (((dimension) * scalingFactor.num + scalingFactor.denom - 1) / \ |
681 | 5.03M | scalingFactor.denom) |
682 | | |
683 | | |
684 | | #ifdef __cplusplus |
685 | | extern "C" { |
686 | | #endif |
687 | | |
688 | | |
689 | | /** |
690 | | * Create a TurboJPEG compressor instance. |
691 | | * |
692 | | * @return a handle to the newly-created instance, or NULL if an error occurred |
693 | | * (see #tjGetErrorStr2().) |
694 | | */ |
695 | | DLLEXPORT tjhandle tjInitCompress(void); |
696 | | |
697 | | |
698 | | /** |
699 | | * Compress a packed-pixel RGB, grayscale, or CMYK image into a JPEG image. |
700 | | * |
701 | | * @param handle a handle to a TurboJPEG compressor or transformer instance |
702 | | * |
703 | | * @param srcBuf pointer to a buffer containing a packed-pixel RGB, grayscale, |
704 | | * or CMYK source image to be compressed |
705 | | * |
706 | | * @param width width (in pixels) of the source image |
707 | | * |
708 | | * @param pitch bytes per row in the source image. Normally this should be |
709 | | * <tt>width * #tjPixelSize[pixelFormat]</tt>, if the image is unpadded, or |
710 | | * <tt>#TJPAD(width * #tjPixelSize[pixelFormat])</tt> if each row of the image |
711 | | * is padded to the nearest multiple of 4 bytes, as is the case for Windows |
712 | | * bitmaps. You can also be clever and use this parameter to skip rows, etc. |
713 | | * Setting this parameter to 0 is the equivalent of setting it to |
714 | | * <tt>width * #tjPixelSize[pixelFormat]</tt>. |
715 | | * |
716 | | * @param height height (in pixels) of the source image |
717 | | * |
718 | | * @param pixelFormat pixel format of the source image (see @ref TJPF |
719 | | * "Pixel formats".) |
720 | | * |
721 | | * @param jpegBuf address of a pointer to a byte buffer that will receive the |
722 | | * JPEG image. TurboJPEG has the ability to reallocate the JPEG buffer to |
723 | | * accommodate the size of the JPEG image. Thus, you can choose to: |
724 | | * -# pre-allocate the JPEG buffer with an arbitrary size using #tjAlloc() and |
725 | | * let TurboJPEG grow the buffer as needed, |
726 | | * -# set `*jpegBuf` to NULL to tell TurboJPEG to allocate the buffer for you, |
727 | | * or |
728 | | * -# pre-allocate the buffer to a "worst case" size determined by calling |
729 | | * #tjBufSize(). This should ensure that the buffer never has to be |
730 | | * re-allocated. (Setting #TJFLAG_NOREALLOC guarantees that it won't be.) |
731 | | * . |
732 | | * If you choose option 1, then `*jpegSize` should be set to the size of your |
733 | | * pre-allocated buffer. In any case, unless you have set #TJFLAG_NOREALLOC, |
734 | | * you should always check `*jpegBuf` upon return from this function, as it may |
735 | | * have changed. |
736 | | * |
737 | | * @param jpegSize pointer to an unsigned long variable that holds the size of |
738 | | * the JPEG buffer. If `*jpegBuf` points to a pre-allocated buffer, then |
739 | | * `*jpegSize` should be set to the size of the buffer. Upon return, |
740 | | * `*jpegSize` will contain the size of the JPEG image (in bytes.) If |
741 | | * `*jpegBuf` points to a JPEG buffer that is being reused from a previous call |
742 | | * to one of the JPEG compression functions, then `*jpegSize` is ignored. |
743 | | * |
744 | | * @param jpegSubsamp the level of chrominance subsampling to be used when |
745 | | * generating the JPEG image (see @ref TJSAMP |
746 | | * "Chrominance subsampling options".) |
747 | | * |
748 | | * @param jpegQual the image quality of the generated JPEG image (1 = worst, |
749 | | * 100 = best) |
750 | | * |
751 | | * @param flags the bitwise OR of one or more of the @ref TJFLAG_ACCURATEDCT |
752 | | * "flags" |
753 | | * |
754 | | * @return 0 if successful, or -1 if an error occurred (see #tjGetErrorStr2() |
755 | | * and #tjGetErrorCode().) |
756 | | */ |
757 | | DLLEXPORT int tjCompress2(tjhandle handle, const unsigned char *srcBuf, |
758 | | int width, int pitch, int height, int pixelFormat, |
759 | | unsigned char **jpegBuf, unsigned long *jpegSize, |
760 | | int jpegSubsamp, int jpegQual, int flags); |
761 | | |
762 | | |
763 | | /** |
764 | | * Compress a unified planar YUV image into a JPEG image. |
765 | | * |
766 | | * @param handle a handle to a TurboJPEG compressor or transformer instance |
767 | | * |
768 | | * @param srcBuf pointer to a buffer containing a unified planar YUV source |
769 | | * image to be compressed. The size of this buffer should match the value |
770 | | * returned by #tjBufSizeYUV2() for the given image width, height, row |
771 | | * alignment, and level of chrominance subsampling. The Y, U (Cb), and V (Cr) |
772 | | * image planes should be stored sequentially in the buffer. (Refer to |
773 | | * @ref YUVnotes "YUV Image Format Notes".) |
774 | | * |
775 | | * @param width width (in pixels) of the source image. If the width is not an |
776 | | * even multiple of the MCU block width (see #tjMCUWidth), then an intermediate |
777 | | * buffer copy will be performed. |
778 | | * |
779 | | * @param align row alignment (in bytes) of the source image (must be a power |
780 | | * of 2.) Setting this parameter to n indicates that each row in each plane of |
781 | | * the source image is padded to the nearest multiple of n bytes |
782 | | * (1 = unpadded.) |
783 | | * |
784 | | * @param height height (in pixels) of the source image. If the height is not |
785 | | * an even multiple of the MCU block height (see #tjMCUHeight), then an |
786 | | * intermediate buffer copy will be performed. |
787 | | * |
788 | | * @param subsamp the level of chrominance subsampling used in the source image |
789 | | * (see @ref TJSAMP "Chrominance subsampling options".) |
790 | | * |
791 | | * @param jpegBuf address of a pointer to a byte buffer that will receive the |
792 | | * JPEG image. TurboJPEG has the ability to reallocate the JPEG buffer to |
793 | | * accommodate the size of the JPEG image. Thus, you can choose to: |
794 | | * -# pre-allocate the JPEG buffer with an arbitrary size using #tjAlloc() and |
795 | | * let TurboJPEG grow the buffer as needed, |
796 | | * -# set `*jpegBuf` to NULL to tell TurboJPEG to allocate the buffer for you, |
797 | | * or |
798 | | * -# pre-allocate the buffer to a "worst case" size determined by calling |
799 | | * #tjBufSize(). This should ensure that the buffer never has to be |
800 | | * re-allocated. (Setting #TJFLAG_NOREALLOC guarantees that it won't be.) |
801 | | * . |
802 | | * If you choose option 1, then `*jpegSize` should be set to the size of your |
803 | | * pre-allocated buffer. In any case, unless you have set #TJFLAG_NOREALLOC, |
804 | | * you should always check `*jpegBuf` upon return from this function, as it may |
805 | | * have changed. |
806 | | * |
807 | | * @param jpegSize pointer to an unsigned long variable that holds the size of |
808 | | * the JPEG buffer. If `*jpegBuf` points to a pre-allocated buffer, then |
809 | | * `*jpegSize` should be set to the size of the buffer. Upon return, |
810 | | * `*jpegSize` will contain the size of the JPEG image (in bytes.) If |
811 | | * `*jpegBuf` points to a JPEG buffer that is being reused from a previous call |
812 | | * to one of the JPEG compression functions, then `*jpegSize` is ignored. |
813 | | * |
814 | | * @param jpegQual the image quality of the generated JPEG image (1 = worst, |
815 | | * 100 = best) |
816 | | * |
817 | | * @param flags the bitwise OR of one or more of the @ref TJFLAG_ACCURATEDCT |
818 | | * "flags" |
819 | | * |
820 | | * @return 0 if successful, or -1 if an error occurred (see #tjGetErrorStr2() |
821 | | * and #tjGetErrorCode().) |
822 | | */ |
823 | | DLLEXPORT int tjCompressFromYUV(tjhandle handle, const unsigned char *srcBuf, |
824 | | int width, int align, int height, int subsamp, |
825 | | unsigned char **jpegBuf, |
826 | | unsigned long *jpegSize, int jpegQual, |
827 | | int flags); |
828 | | |
829 | | |
830 | | /** |
831 | | * Compress a set of Y, U (Cb), and V (Cr) image planes into a JPEG image. |
832 | | * |
833 | | * @param handle a handle to a TurboJPEG compressor or transformer instance |
834 | | * |
835 | | * @param srcPlanes an array of pointers to Y, U (Cb), and V (Cr) image planes |
836 | | * (or just a Y plane, if compressing a grayscale image) that contain a YUV |
837 | | * source image to be compressed. These planes can be contiguous or |
838 | | * non-contiguous in memory. The size of each plane should match the value |
839 | | * returned by #tjPlaneSizeYUV() for the given image width, height, strides, |
840 | | * and level of chrominance subsampling. Refer to @ref YUVnotes |
841 | | * "YUV Image Format Notes" for more details. |
842 | | * |
843 | | * @param width width (in pixels) of the source image. If the width is not an |
844 | | * even multiple of the MCU block width (see #tjMCUWidth), then an intermediate |
845 | | * buffer copy will be performed. |
846 | | * |
847 | | * @param strides an array of integers, each specifying the number of bytes per |
848 | | * row in the corresponding plane of the YUV source image. Setting the stride |
849 | | * for any plane to 0 is the same as setting it to the plane width (see |
850 | | * @ref YUVnotes "YUV Image Format Notes".) If `strides` is NULL, then the |
851 | | * strides for all planes will be set to their respective plane widths. You |
852 | | * can adjust the strides in order to specify an arbitrary amount of row |
853 | | * padding in each plane or to create a JPEG image from a subregion of a larger |
854 | | * planar YUV image. |
855 | | * |
856 | | * @param height height (in pixels) of the source image. If the height is not |
857 | | * an even multiple of the MCU block height (see #tjMCUHeight), then an |
858 | | * intermediate buffer copy will be performed. |
859 | | * |
860 | | * @param subsamp the level of chrominance subsampling used in the source image |
861 | | * (see @ref TJSAMP "Chrominance subsampling options".) |
862 | | * |
863 | | * @param jpegBuf address of a pointer to a byte buffer that will receive the |
864 | | * JPEG image. TurboJPEG has the ability to reallocate the JPEG buffer to |
865 | | * accommodate the size of the JPEG image. Thus, you can choose to: |
866 | | * -# pre-allocate the JPEG buffer with an arbitrary size using #tjAlloc() and |
867 | | * let TurboJPEG grow the buffer as needed, |
868 | | * -# set `*jpegBuf` to NULL to tell TurboJPEG to allocate the buffer for you, |
869 | | * or |
870 | | * -# pre-allocate the buffer to a "worst case" size determined by calling |
871 | | * #tjBufSize(). This should ensure that the buffer never has to be |
872 | | * re-allocated. (Setting #TJFLAG_NOREALLOC guarantees that it won't be.) |
873 | | * . |
874 | | * If you choose option 1, then `*jpegSize` should be set to the size of your |
875 | | * pre-allocated buffer. In any case, unless you have set #TJFLAG_NOREALLOC, |
876 | | * you should always check `*jpegBuf` upon return from this function, as it may |
877 | | * have changed. |
878 | | * |
879 | | * @param jpegSize pointer to an unsigned long variable that holds the size of |
880 | | * the JPEG buffer. If `*jpegBuf` points to a pre-allocated buffer, then |
881 | | * `*jpegSize` should be set to the size of the buffer. Upon return, |
882 | | * `*jpegSize` will contain the size of the JPEG image (in bytes.) If |
883 | | * `*jpegBuf` points to a JPEG buffer that is being reused from a previous call |
884 | | * to one of the JPEG compression functions, then `*jpegSize` is ignored. |
885 | | * |
886 | | * @param jpegQual the image quality of the generated JPEG image (1 = worst, |
887 | | * 100 = best) |
888 | | * |
889 | | * @param flags the bitwise OR of one or more of the @ref TJFLAG_ACCURATEDCT |
890 | | * "flags" |
891 | | * |
892 | | * @return 0 if successful, or -1 if an error occurred (see #tjGetErrorStr2() |
893 | | * and #tjGetErrorCode().) |
894 | | */ |
895 | | DLLEXPORT int tjCompressFromYUVPlanes(tjhandle handle, |
896 | | const unsigned char **srcPlanes, |
897 | | int width, const int *strides, |
898 | | int height, int subsamp, |
899 | | unsigned char **jpegBuf, |
900 | | unsigned long *jpegSize, int jpegQual, |
901 | | int flags); |
902 | | |
903 | | |
904 | | /** |
905 | | * The maximum size of the buffer (in bytes) required to hold a JPEG image with |
906 | | * the given parameters. The number of bytes returned by this function is |
907 | | * larger than the size of the uncompressed source image. The reason for this |
908 | | * is that the JPEG format uses 16-bit coefficients, so it is possible for a |
909 | | * very high-quality source image with very high-frequency content to expand |
910 | | * rather than compress when converted to the JPEG format. Such images |
911 | | * represent very rare corner cases, but since there is no way to predict the |
912 | | * size of a JPEG image prior to compression, the corner cases have to be |
913 | | * handled. |
914 | | * |
915 | | * @param width width (in pixels) of the image |
916 | | * |
917 | | * @param height height (in pixels) of the image |
918 | | * |
919 | | * @param jpegSubsamp the level of chrominance subsampling to be used when |
920 | | * generating the JPEG image (see @ref TJSAMP |
921 | | * "Chrominance subsampling options".) |
922 | | * |
923 | | * @return the maximum size of the buffer (in bytes) required to hold the |
924 | | * image, or -1 if the arguments are out of bounds. |
925 | | */ |
926 | | DLLEXPORT unsigned long tjBufSize(int width, int height, int jpegSubsamp); |
927 | | |
928 | | |
929 | | /** |
930 | | * The size of the buffer (in bytes) required to hold a unified planar YUV |
931 | | * image with the given parameters. |
932 | | * |
933 | | * @param width width (in pixels) of the image |
934 | | * |
935 | | * @param align row alignment (in bytes) of the image (must be a power of 2.) |
936 | | * Setting this parameter to n specifies that each row in each plane of the |
937 | | * image will be padded to the nearest multiple of n bytes (1 = unpadded.) |
938 | | * |
939 | | * @param height height (in pixels) of the image |
940 | | * |
941 | | * @param subsamp level of chrominance subsampling in the image (see |
942 | | * @ref TJSAMP "Chrominance subsampling options".) |
943 | | * |
944 | | * @return the size of the buffer (in bytes) required to hold the image, or -1 |
945 | | * if the arguments are out of bounds. |
946 | | */ |
947 | | DLLEXPORT unsigned long tjBufSizeYUV2(int width, int align, int height, |
948 | | int subsamp); |
949 | | |
950 | | |
951 | | /** |
952 | | * The size of the buffer (in bytes) required to hold a YUV image plane with |
953 | | * the given parameters. |
954 | | * |
955 | | * @param componentID ID number of the image plane (0 = Y, 1 = U/Cb, 2 = V/Cr) |
956 | | * |
957 | | * @param width width (in pixels) of the YUV image. NOTE: this is the width of |
958 | | * the whole image, not the plane width. |
959 | | * |
960 | | * @param stride bytes per row in the image plane. Setting this to 0 is the |
961 | | * equivalent of setting it to the plane width. |
962 | | * |
963 | | * @param height height (in pixels) of the YUV image. NOTE: this is the height |
964 | | * of the whole image, not the plane height. |
965 | | * |
966 | | * @param subsamp level of chrominance subsampling in the image (see |
967 | | * @ref TJSAMP "Chrominance subsampling options".) |
968 | | * |
969 | | * @return the size of the buffer (in bytes) required to hold the YUV image |
970 | | * plane, or -1 if the arguments are out of bounds. |
971 | | */ |
972 | | DLLEXPORT unsigned long tjPlaneSizeYUV(int componentID, int width, int stride, |
973 | | int height, int subsamp); |
974 | | |
975 | | |
976 | | /** |
977 | | * The plane width of a YUV image plane with the given parameters. Refer to |
978 | | * @ref YUVnotes "YUV Image Format Notes" for a description of plane width. |
979 | | * |
980 | | * @param componentID ID number of the image plane (0 = Y, 1 = U/Cb, 2 = V/Cr) |
981 | | * |
982 | | * @param width width (in pixels) of the YUV image |
983 | | * |
984 | | * @param subsamp level of chrominance subsampling in the image (see |
985 | | * @ref TJSAMP "Chrominance subsampling options".) |
986 | | * |
987 | | * @return the plane width of a YUV image plane with the given parameters, or |
988 | | * -1 if the arguments are out of bounds. |
989 | | */ |
990 | | DLLEXPORT int tjPlaneWidth(int componentID, int width, int subsamp); |
991 | | |
992 | | |
993 | | /** |
994 | | * The plane height of a YUV image plane with the given parameters. Refer to |
995 | | * @ref YUVnotes "YUV Image Format Notes" for a description of plane height. |
996 | | * |
997 | | * @param componentID ID number of the image plane (0 = Y, 1 = U/Cb, 2 = V/Cr) |
998 | | * |
999 | | * @param height height (in pixels) of the YUV image |
1000 | | * |
1001 | | * @param subsamp level of chrominance subsampling in the image (see |
1002 | | * @ref TJSAMP "Chrominance subsampling options".) |
1003 | | * |
1004 | | * @return the plane height of a YUV image plane with the given parameters, or |
1005 | | * -1 if the arguments are out of bounds. |
1006 | | */ |
1007 | | DLLEXPORT int tjPlaneHeight(int componentID, int height, int subsamp); |
1008 | | |
1009 | | |
1010 | | /** |
1011 | | * Encode a packed-pixel RGB or grayscale image into a unified planar YUV |
1012 | | * image. This function performs color conversion (which is accelerated in the |
1013 | | * libjpeg-turbo implementation) but does not execute any of the other steps in |
1014 | | * the JPEG compression process. |
1015 | | * |
1016 | | * @param handle a handle to a TurboJPEG compressor or transformer instance |
1017 | | * |
1018 | | * @param srcBuf pointer to a buffer containing a packed-pixel RGB or grayscale |
1019 | | * source image to be encoded |
1020 | | * |
1021 | | * @param width width (in pixels) of the source image |
1022 | | * |
1023 | | * @param pitch bytes per row in the source image. Normally this should be |
1024 | | * <tt>width * #tjPixelSize[pixelFormat]</tt>, if the image is unpadded, or |
1025 | | * <tt>#TJPAD(width * #tjPixelSize[pixelFormat])</tt> if each row of the image |
1026 | | * is padded to the nearest multiple of 4 bytes, as is the case for Windows |
1027 | | * bitmaps. You can also be clever and use this parameter to skip rows, etc. |
1028 | | * Setting this parameter to 0 is the equivalent of setting it to |
1029 | | * <tt>width * #tjPixelSize[pixelFormat]</tt>. |
1030 | | * |
1031 | | * @param height height (in pixels) of the source image |
1032 | | * |
1033 | | * @param pixelFormat pixel format of the source image (see @ref TJPF |
1034 | | * "Pixel formats".) |
1035 | | * |
1036 | | * @param dstBuf pointer to a buffer that will receive the unified planar YUV |
1037 | | * image. Use #tjBufSizeYUV2() to determine the appropriate size for this |
1038 | | * buffer based on the image width, height, row alignment, and level of |
1039 | | * chrominance subsampling. The Y, U (Cb), and V (Cr) image planes will be |
1040 | | * stored sequentially in the buffer. (Refer to @ref YUVnotes |
1041 | | * "YUV Image Format Notes".) |
1042 | | * |
1043 | | * @param align row alignment (in bytes) of the YUV image (must be a power of |
1044 | | * 2.) Setting this parameter to n will cause each row in each plane of the |
1045 | | * YUV image to be padded to the nearest multiple of n bytes (1 = unpadded.) |
1046 | | * To generate images suitable for X Video, `align` should be set to 4. |
1047 | | * |
1048 | | * @param subsamp the level of chrominance subsampling to be used when |
1049 | | * generating the YUV image (see @ref TJSAMP |
1050 | | * "Chrominance subsampling options".) To generate images suitable for X |
1051 | | * Video, `subsamp` should be set to @ref TJSAMP_420. This produces an image |
1052 | | * compatible with the I420 (AKA "YUV420P") format. |
1053 | | * |
1054 | | * @param flags the bitwise OR of one or more of the @ref TJFLAG_ACCURATEDCT |
1055 | | * "flags" |
1056 | | * |
1057 | | * @return 0 if successful, or -1 if an error occurred (see #tjGetErrorStr2() |
1058 | | * and #tjGetErrorCode().) |
1059 | | */ |
1060 | | DLLEXPORT int tjEncodeYUV3(tjhandle handle, const unsigned char *srcBuf, |
1061 | | int width, int pitch, int height, int pixelFormat, |
1062 | | unsigned char *dstBuf, int align, int subsamp, |
1063 | | int flags); |
1064 | | |
1065 | | |
1066 | | /** |
1067 | | * Encode a packed-pixel RGB or grayscale image into separate Y, U (Cb), and |
1068 | | * V (Cr) image planes. This function performs color conversion (which is |
1069 | | * accelerated in the libjpeg-turbo implementation) but does not execute any of |
1070 | | * the other steps in the JPEG compression process. |
1071 | | * |
1072 | | * @param handle a handle to a TurboJPEG compressor or transformer instance |
1073 | | * |
1074 | | * @param srcBuf pointer to a buffer containing a packed-pixel RGB or grayscale |
1075 | | * source image to be encoded |
1076 | | * |
1077 | | * @param width width (in pixels) of the source image |
1078 | | * |
1079 | | * @param pitch bytes per row in the source image. Normally this should be |
1080 | | * <tt>width * #tjPixelSize[pixelFormat]</tt>, if the image is unpadded, or |
1081 | | * <tt>#TJPAD(width * #tjPixelSize[pixelFormat])</tt> if each row of the image |
1082 | | * is padded to the nearest multiple of 4 bytes, as is the case for Windows |
1083 | | * bitmaps. You can also be clever and use this parameter to skip rows, etc. |
1084 | | * Setting this parameter to 0 is the equivalent of setting it to |
1085 | | * <tt>width * #tjPixelSize[pixelFormat]</tt>. |
1086 | | * |
1087 | | * @param height height (in pixels) of the source image |
1088 | | * |
1089 | | * @param pixelFormat pixel format of the source image (see @ref TJPF |
1090 | | * "Pixel formats".) |
1091 | | * |
1092 | | * @param dstPlanes an array of pointers to Y, U (Cb), and V (Cr) image planes |
1093 | | * (or just a Y plane, if generating a grayscale image) that will receive the |
1094 | | * encoded image. These planes can be contiguous or non-contiguous in memory. |
1095 | | * Use #tjPlaneSizeYUV() to determine the appropriate size for each plane based |
1096 | | * on the image width, height, strides, and level of chrominance subsampling. |
1097 | | * Refer to @ref YUVnotes "YUV Image Format Notes" for more details. |
1098 | | * |
1099 | | * @param strides an array of integers, each specifying the number of bytes per |
1100 | | * row in the corresponding plane of the YUV image. Setting the stride for any |
1101 | | * plane to 0 is the same as setting it to the plane width (see @ref YUVnotes |
1102 | | * "YUV Image Format Notes".) If `strides` is NULL, then the strides for all |
1103 | | * planes will be set to their respective plane widths. You can adjust the |
1104 | | * strides in order to add an arbitrary amount of row padding to each plane or |
1105 | | * to encode an RGB or grayscale image into a subregion of a larger planar YUV |
1106 | | * image. |
1107 | | * |
1108 | | * @param subsamp the level of chrominance subsampling to be used when |
1109 | | * generating the YUV image (see @ref TJSAMP |
1110 | | * "Chrominance subsampling options".) To generate images suitable for X |
1111 | | * Video, `subsamp` should be set to @ref TJSAMP_420. This produces an image |
1112 | | * compatible with the I420 (AKA "YUV420P") format. |
1113 | | * |
1114 | | * @param flags the bitwise OR of one or more of the @ref TJFLAG_ACCURATEDCT |
1115 | | * "flags" |
1116 | | * |
1117 | | * @return 0 if successful, or -1 if an error occurred (see #tjGetErrorStr2() |
1118 | | * and #tjGetErrorCode().) |
1119 | | */ |
1120 | | DLLEXPORT int tjEncodeYUVPlanes(tjhandle handle, const unsigned char *srcBuf, |
1121 | | int width, int pitch, int height, |
1122 | | int pixelFormat, unsigned char **dstPlanes, |
1123 | | int *strides, int subsamp, int flags); |
1124 | | |
1125 | | |
1126 | | /** |
1127 | | * Create a TurboJPEG decompressor instance. |
1128 | | * |
1129 | | * @return a handle to the newly-created instance, or NULL if an error occurred |
1130 | | * (see #tjGetErrorStr2().) |
1131 | | */ |
1132 | | DLLEXPORT tjhandle tjInitDecompress(void); |
1133 | | |
1134 | | |
1135 | | /** |
1136 | | * Retrieve information about a JPEG image without decompressing it, or prime |
1137 | | * the decompressor with quantization and Huffman tables. |
1138 | | * |
1139 | | * @param handle a handle to a TurboJPEG decompressor or transformer instance |
1140 | | * |
1141 | | * @param jpegBuf pointer to a byte buffer containing a JPEG image or an |
1142 | | * "abbreviated table specification" (AKA "tables-only") datastream. Passing a |
1143 | | * tables-only datastream to this function primes the decompressor with |
1144 | | * quantization and Huffman tables that can be used when decompressing |
1145 | | * subsequent "abbreviated image" datastreams. This is useful, for instance, |
1146 | | * when decompressing video streams in which all frames share the same |
1147 | | * quantization and Huffman tables. |
1148 | | * |
1149 | | * @param jpegSize size of the JPEG image or tables-only datastream (in bytes) |
1150 | | * |
1151 | | * @param width pointer to an integer variable that will receive the width (in |
1152 | | * pixels) of the JPEG image. If `jpegBuf` points to a tables-only datastream, |
1153 | | * then `width` is ignored. |
1154 | | * |
1155 | | * @param height pointer to an integer variable that will receive the height |
1156 | | * (in pixels) of the JPEG image. If `jpegBuf` points to a tables-only |
1157 | | * datastream, then `height` is ignored. |
1158 | | * |
1159 | | * @param jpegSubsamp pointer to an integer variable that will receive the |
1160 | | * level of chrominance subsampling used when the JPEG image was compressed |
1161 | | * (see @ref TJSAMP "Chrominance subsampling options".) If `jpegBuf` points to |
1162 | | * a tables-only datastream, then `jpegSubsamp` is ignored. |
1163 | | * |
1164 | | * @param jpegColorspace pointer to an integer variable that will receive one |
1165 | | * of the JPEG colorspace constants, indicating the colorspace of the JPEG |
1166 | | * image (see @ref TJCS "JPEG colorspaces".) If `jpegBuf` points to a |
1167 | | * tables-only datastream, then `jpegColorspace` is ignored. |
1168 | | * |
1169 | | * @return 0 if successful, or -1 if an error occurred (see #tjGetErrorStr2() |
1170 | | * and #tjGetErrorCode().) |
1171 | | */ |
1172 | | DLLEXPORT int tjDecompressHeader3(tjhandle handle, |
1173 | | const unsigned char *jpegBuf, |
1174 | | unsigned long jpegSize, int *width, |
1175 | | int *height, int *jpegSubsamp, |
1176 | | int *jpegColorspace); |
1177 | | |
1178 | | |
1179 | | /** |
1180 | | * Returns a list of fractional scaling factors that the JPEG decompressor |
1181 | | * supports. |
1182 | | * |
1183 | | * @param numScalingFactors pointer to an integer variable that will receive |
1184 | | * the number of elements in the list |
1185 | | * |
1186 | | * @return a pointer to a list of fractional scaling factors, or NULL if an |
1187 | | * error is encountered (see #tjGetErrorStr2().) |
1188 | | */ |
1189 | | DLLEXPORT tjscalingfactor *tjGetScalingFactors(int *numScalingFactors); |
1190 | | |
1191 | | |
1192 | | /** |
1193 | | * Decompress a JPEG image into a packed-pixel RGB, grayscale, or CMYK image. |
1194 | | * |
1195 | | * @param handle a handle to a TurboJPEG decompressor or transformer instance |
1196 | | * |
1197 | | * @param jpegBuf pointer to a byte buffer containing the JPEG image to |
1198 | | * decompress |
1199 | | * |
1200 | | * @param jpegSize size of the JPEG image (in bytes) |
1201 | | * |
1202 | | * @param dstBuf pointer to a buffer that will receive the packed-pixel |
1203 | | * decompressed image. This buffer should normally be `pitch * scaledHeight` |
1204 | | * bytes in size, where `scaledHeight` can be determined by calling #TJSCALED() |
1205 | | * with the JPEG image height and one of the scaling factors returned by |
1206 | | * #tjGetScalingFactors(). The `dstBuf` pointer may also be used to decompress |
1207 | | * into a specific region of a larger buffer. |
1208 | | * |
1209 | | * @param width desired width (in pixels) of the destination image. If this is |
1210 | | * different than the width of the JPEG image being decompressed, then |
1211 | | * TurboJPEG will use scaling in the JPEG decompressor to generate the largest |
1212 | | * possible image that will fit within the desired width. If `width` is set to |
1213 | | * 0, then only the height will be considered when determining the scaled image |
1214 | | * size. |
1215 | | * |
1216 | | * @param pitch bytes per row in the destination image. Normally this should |
1217 | | * be set to <tt>scaledWidth * #tjPixelSize[pixelFormat]</tt>, if the |
1218 | | * destination image should be unpadded, or |
1219 | | * <tt>#TJPAD(scaledWidth * #tjPixelSize[pixelFormat])</tt> if each row of the |
1220 | | * destination image should be padded to the nearest multiple of 4 bytes, as is |
1221 | | * the case for Windows bitmaps. (NOTE: `scaledWidth` can be determined by |
1222 | | * calling #TJSCALED() with the JPEG image width and one of the scaling factors |
1223 | | * returned by #tjGetScalingFactors().) You can also be clever and use the |
1224 | | * pitch parameter to skip rows, etc. Setting this parameter to 0 is the |
1225 | | * equivalent of setting it to |
1226 | | * <tt>scaledWidth * #tjPixelSize[pixelFormat]</tt>. |
1227 | | * |
1228 | | * @param height desired height (in pixels) of the destination image. If this |
1229 | | * is different than the height of the JPEG image being decompressed, then |
1230 | | * TurboJPEG will use scaling in the JPEG decompressor to generate the largest |
1231 | | * possible image that will fit within the desired height. If `height` is set |
1232 | | * to 0, then only the width will be considered when determining the scaled |
1233 | | * image size. |
1234 | | * |
1235 | | * @param pixelFormat pixel format of the destination image (see @ref |
1236 | | * TJPF "Pixel formats".) |
1237 | | * |
1238 | | * @param flags the bitwise OR of one or more of the @ref TJFLAG_ACCURATEDCT |
1239 | | * "flags" |
1240 | | * |
1241 | | * @return 0 if successful, or -1 if an error occurred (see #tjGetErrorStr2() |
1242 | | * and #tjGetErrorCode().) |
1243 | | */ |
1244 | | DLLEXPORT int tjDecompress2(tjhandle handle, const unsigned char *jpegBuf, |
1245 | | unsigned long jpegSize, unsigned char *dstBuf, |
1246 | | int width, int pitch, int height, int pixelFormat, |
1247 | | int flags); |
1248 | | |
1249 | | |
1250 | | /** |
1251 | | * Decompress a JPEG image into a unified planar YUV image. This function |
1252 | | * performs JPEG decompression but leaves out the color conversion step, so a |
1253 | | * planar YUV image is generated instead of a packed-pixel image. |
1254 | | * |
1255 | | * @param handle a handle to a TurboJPEG decompressor or transformer instance |
1256 | | * |
1257 | | * @param jpegBuf pointer to a byte buffer containing the JPEG image to |
1258 | | * decompress |
1259 | | * |
1260 | | * @param jpegSize size of the JPEG image (in bytes) |
1261 | | * |
1262 | | * @param dstBuf pointer to a buffer that will receive the unified planar YUV |
1263 | | * decompressed image. Use #tjBufSizeYUV2() to determine the appropriate size |
1264 | | * for this buffer based on the scaled image width, scaled image height, row |
1265 | | * alignment, and level of chrominance subsampling. The Y, U (Cb), and V (Cr) |
1266 | | * image planes will be stored sequentially in the buffer. (Refer to |
1267 | | * @ref YUVnotes "YUV Image Format Notes".) |
1268 | | * |
1269 | | * @param width desired width (in pixels) of the YUV image. If this is |
1270 | | * different than the width of the JPEG image being decompressed, then |
1271 | | * TurboJPEG will use scaling in the JPEG decompressor to generate the largest |
1272 | | * possible image that will fit within the desired width. If `width` is set to |
1273 | | * 0, then only the height will be considered when determining the scaled image |
1274 | | * size. If the scaled width is not an even multiple of the MCU block width |
1275 | | * (see #tjMCUWidth), then an intermediate buffer copy will be performed. |
1276 | | * |
1277 | | * @param align row alignment (in bytes) of the YUV image (must be a power of |
1278 | | * 2.) Setting this parameter to n will cause each row in each plane of the |
1279 | | * YUV image to be padded to the nearest multiple of n bytes (1 = unpadded.) |
1280 | | * To generate images suitable for X Video, `align` should be set to 4. |
1281 | | * |
1282 | | * @param height desired height (in pixels) of the YUV image. If this is |
1283 | | * different than the height of the JPEG image being decompressed, then |
1284 | | * TurboJPEG will use scaling in the JPEG decompressor to generate the largest |
1285 | | * possible image that will fit within the desired height. If `height` is set |
1286 | | * to 0, then only the width will be considered when determining the scaled |
1287 | | * image size. If the scaled height is not an even multiple of the MCU block |
1288 | | * height (see #tjMCUHeight), then an intermediate buffer copy will be |
1289 | | * performed. |
1290 | | * |
1291 | | * @param flags the bitwise OR of one or more of the @ref TJFLAG_ACCURATEDCT |
1292 | | * "flags" |
1293 | | * |
1294 | | * @return 0 if successful, or -1 if an error occurred (see #tjGetErrorStr2() |
1295 | | * and #tjGetErrorCode().) |
1296 | | */ |
1297 | | DLLEXPORT int tjDecompressToYUV2(tjhandle handle, const unsigned char *jpegBuf, |
1298 | | unsigned long jpegSize, unsigned char *dstBuf, |
1299 | | int width, int align, int height, int flags); |
1300 | | |
1301 | | |
1302 | | /** |
1303 | | * Decompress a JPEG image into separate Y, U (Cb), and V (Cr) image |
1304 | | * planes. This function performs JPEG decompression but leaves out the color |
1305 | | * conversion step, so a planar YUV image is generated instead of a |
1306 | | * packed-pixel image. |
1307 | | * |
1308 | | * @param handle a handle to a TurboJPEG decompressor or transformer instance |
1309 | | * |
1310 | | * @param jpegBuf pointer to a byte buffer containing the JPEG image to |
1311 | | * decompress |
1312 | | * |
1313 | | * @param jpegSize size of the JPEG image (in bytes) |
1314 | | * |
1315 | | * @param dstPlanes an array of pointers to Y, U (Cb), and V (Cr) image planes |
1316 | | * (or just a Y plane, if decompressing a grayscale image) that will receive |
1317 | | * the decompressed image. These planes can be contiguous or non-contiguous in |
1318 | | * memory. Use #tjPlaneSizeYUV() to determine the appropriate size for each |
1319 | | * plane based on the scaled image width, scaled image height, strides, and |
1320 | | * level of chrominance subsampling. Refer to @ref YUVnotes |
1321 | | * "YUV Image Format Notes" for more details. |
1322 | | * |
1323 | | * @param width desired width (in pixels) of the YUV image. If this is |
1324 | | * different than the width of the JPEG image being decompressed, then |
1325 | | * TurboJPEG will use scaling in the JPEG decompressor to generate the largest |
1326 | | * possible image that will fit within the desired width. If `width` is set to |
1327 | | * 0, then only the height will be considered when determining the scaled image |
1328 | | * size. If the scaled width is not an even multiple of the MCU block width |
1329 | | * (see #tjMCUWidth), then an intermediate buffer copy will be performed. |
1330 | | * |
1331 | | * @param strides an array of integers, each specifying the number of bytes per |
1332 | | * row in the corresponding plane of the YUV image. Setting the stride for any |
1333 | | * plane to 0 is the same as setting it to the scaled plane width (see |
1334 | | * @ref YUVnotes "YUV Image Format Notes".) If `strides` is NULL, then the |
1335 | | * strides for all planes will be set to their respective scaled plane widths. |
1336 | | * You can adjust the strides in order to add an arbitrary amount of row |
1337 | | * padding to each plane or to decompress the JPEG image into a subregion of a |
1338 | | * larger planar YUV image. |
1339 | | * |
1340 | | * @param height desired height (in pixels) of the YUV image. If this is |
1341 | | * different than the height of the JPEG image being decompressed, then |
1342 | | * TurboJPEG will use scaling in the JPEG decompressor to generate the largest |
1343 | | * possible image that will fit within the desired height. If `height` is set |
1344 | | * to 0, then only the width will be considered when determining the scaled |
1345 | | * image size. If the scaled height is not an even multiple of the MCU block |
1346 | | * height (see #tjMCUHeight), then an intermediate buffer copy will be |
1347 | | * performed. |
1348 | | * |
1349 | | * @param flags the bitwise OR of one or more of the @ref TJFLAG_ACCURATEDCT |
1350 | | * "flags" |
1351 | | * |
1352 | | * @return 0 if successful, or -1 if an error occurred (see #tjGetErrorStr2() |
1353 | | * and #tjGetErrorCode().) |
1354 | | */ |
1355 | | DLLEXPORT int tjDecompressToYUVPlanes(tjhandle handle, |
1356 | | const unsigned char *jpegBuf, |
1357 | | unsigned long jpegSize, |
1358 | | unsigned char **dstPlanes, int width, |
1359 | | int *strides, int height, int flags); |
1360 | | |
1361 | | |
1362 | | /** |
1363 | | * Decode a unified planar YUV image into a packed-pixel RGB or grayscale |
1364 | | * image. This function performs color conversion (which is accelerated in the |
1365 | | * libjpeg-turbo implementation) but does not execute any of the other steps in |
1366 | | * the JPEG decompression process. |
1367 | | * |
1368 | | * @param handle a handle to a TurboJPEG decompressor or transformer instance |
1369 | | * |
1370 | | * @param srcBuf pointer to a buffer containing a unified planar YUV source |
1371 | | * image to be decoded. The size of this buffer should match the value |
1372 | | * returned by #tjBufSizeYUV2() for the given image width, height, row |
1373 | | * alignment, and level of chrominance subsampling. The Y, U (Cb), and V (Cr) |
1374 | | * image planes should be stored sequentially in the source buffer. (Refer to |
1375 | | * @ref YUVnotes "YUV Image Format Notes".) |
1376 | | * |
1377 | | * @param align row alignment (in bytes) of the YUV source image (must be a |
1378 | | * power of 2.) Setting this parameter to n indicates that each row in each |
1379 | | * plane of the YUV source image is padded to the nearest multiple of n bytes |
1380 | | * (1 = unpadded.) |
1381 | | * |
1382 | | * @param subsamp the level of chrominance subsampling used in the YUV source |
1383 | | * image (see @ref TJSAMP "Chrominance subsampling options".) |
1384 | | * |
1385 | | * @param dstBuf pointer to a buffer that will receive the packed-pixel decoded |
1386 | | * image. This buffer should normally be `pitch * height` bytes in size, but |
1387 | | * the `dstBuf` pointer can also be used to decode into a specific region of a |
1388 | | * larger buffer. |
1389 | | * |
1390 | | * @param width width (in pixels) of the source and destination images |
1391 | | * |
1392 | | * @param pitch bytes per row in the destination image. Normally this should |
1393 | | * be set to <tt>width * #tjPixelSize[pixelFormat]</tt>, if the destination |
1394 | | * image should be unpadded, or |
1395 | | * <tt>#TJPAD(width * #tjPixelSize[pixelFormat])</tt> if each row of the |
1396 | | * destination image should be padded to the nearest multiple of 4 bytes, as is |
1397 | | * the case for Windows bitmaps. You can also be clever and use the pitch |
1398 | | * parameter to skip rows, etc. Setting this parameter to 0 is the equivalent |
1399 | | * of setting it to <tt>width * #tjPixelSize[pixelFormat]</tt>. |
1400 | | * |
1401 | | * @param height height (in pixels) of the source and destination images |
1402 | | * |
1403 | | * @param pixelFormat pixel format of the destination image (see @ref TJPF |
1404 | | * "Pixel formats".) |
1405 | | * |
1406 | | * @param flags the bitwise OR of one or more of the @ref TJFLAG_ACCURATEDCT |
1407 | | * "flags" |
1408 | | * |
1409 | | * @return 0 if successful, or -1 if an error occurred (see #tjGetErrorStr2() |
1410 | | * and #tjGetErrorCode().) |
1411 | | */ |
1412 | | DLLEXPORT int tjDecodeYUV(tjhandle handle, const unsigned char *srcBuf, |
1413 | | int align, int subsamp, unsigned char *dstBuf, |
1414 | | int width, int pitch, int height, int pixelFormat, |
1415 | | int flags); |
1416 | | |
1417 | | |
1418 | | /** |
1419 | | * Decode a set of Y, U (Cb), and V (Cr) image planes into a packed-pixel RGB |
1420 | | * or grayscale image. This function performs color conversion (which is |
1421 | | * accelerated in the libjpeg-turbo implementation) but does not execute any of |
1422 | | * the other steps in the JPEG decompression process. |
1423 | | * |
1424 | | * @param handle a handle to a TurboJPEG decompressor or transformer instance |
1425 | | * |
1426 | | * @param srcPlanes an array of pointers to Y, U (Cb), and V (Cr) image planes |
1427 | | * (or just a Y plane, if decoding a grayscale image) that contain a YUV image |
1428 | | * to be decoded. These planes can be contiguous or non-contiguous in memory. |
1429 | | * The size of each plane should match the value returned by #tjPlaneSizeYUV() |
1430 | | * for the given image width, height, strides, and level of chrominance |
1431 | | * subsampling. Refer to @ref YUVnotes "YUV Image Format Notes" for more |
1432 | | * details. |
1433 | | * |
1434 | | * @param strides an array of integers, each specifying the number of bytes per |
1435 | | * row in the corresponding plane of the YUV source image. Setting the stride |
1436 | | * for any plane to 0 is the same as setting it to the plane width (see |
1437 | | * @ref YUVnotes "YUV Image Format Notes".) If `strides` is NULL, then the |
1438 | | * strides for all planes will be set to their respective plane widths. You |
1439 | | * can adjust the strides in order to specify an arbitrary amount of row |
1440 | | * padding in each plane or to decode a subregion of a larger planar YUV image. |
1441 | | * |
1442 | | * @param subsamp the level of chrominance subsampling used in the YUV source |
1443 | | * image (see @ref TJSAMP "Chrominance subsampling options".) |
1444 | | * |
1445 | | * @param dstBuf pointer to a buffer that will receive the packed-pixel decoded |
1446 | | * image. This buffer should normally be `pitch * height` bytes in size, but |
1447 | | * the `dstBuf` pointer can also be used to decode into a specific region of a |
1448 | | * larger buffer. |
1449 | | * |
1450 | | * @param width width (in pixels) of the source and destination images |
1451 | | * |
1452 | | * @param pitch bytes per row in the destination image. Normally this should |
1453 | | * be set to <tt>width * #tjPixelSize[pixelFormat]</tt>, if the destination |
1454 | | * image should be unpadded, or |
1455 | | * <tt>#TJPAD(width * #tjPixelSize[pixelFormat])</tt> if each row of the |
1456 | | * destination image should be padded to the nearest multiple of 4 bytes, as is |
1457 | | * the case for Windows bitmaps. You can also be clever and use the pitch |
1458 | | * parameter to skip rows, etc. Setting this parameter to 0 is the equivalent |
1459 | | * of setting it to <tt>width * #tjPixelSize[pixelFormat]</tt>. |
1460 | | * |
1461 | | * @param height height (in pixels) of the source and destination images |
1462 | | * |
1463 | | * @param pixelFormat pixel format of the destination image (see @ref TJPF |
1464 | | * "Pixel formats".) |
1465 | | * |
1466 | | * @param flags the bitwise OR of one or more of the @ref TJFLAG_ACCURATEDCT |
1467 | | * "flags" |
1468 | | * |
1469 | | * @return 0 if successful, or -1 if an error occurred (see #tjGetErrorStr2() |
1470 | | * and #tjGetErrorCode().) |
1471 | | */ |
1472 | | DLLEXPORT int tjDecodeYUVPlanes(tjhandle handle, |
1473 | | const unsigned char **srcPlanes, |
1474 | | const int *strides, int subsamp, |
1475 | | unsigned char *dstBuf, int width, int pitch, |
1476 | | int height, int pixelFormat, int flags); |
1477 | | |
1478 | | |
1479 | | /** |
1480 | | * Create a new TurboJPEG transformer instance. |
1481 | | * |
1482 | | * @return a handle to the newly-created instance, or NULL if an error |
1483 | | * occurred (see #tjGetErrorStr2().) |
1484 | | */ |
1485 | | DLLEXPORT tjhandle tjInitTransform(void); |
1486 | | |
1487 | | |
1488 | | /** |
1489 | | * Losslessly transform a JPEG image into another JPEG image. Lossless |
1490 | | * transforms work by moving the raw DCT coefficients from one JPEG image |
1491 | | * structure to another without altering the values of the coefficients. While |
1492 | | * this is typically faster than decompressing the image, transforming it, and |
1493 | | * re-compressing it, lossless transforms are not free. Each lossless |
1494 | | * transform requires reading and performing Huffman decoding on all of the |
1495 | | * coefficients in the source image, regardless of the size of the destination |
1496 | | * image. Thus, this function provides a means of generating multiple |
1497 | | * transformed images from the same source or applying multiple transformations |
1498 | | * simultaneously, in order to eliminate the need to read the source |
1499 | | * coefficients multiple times. |
1500 | | * |
1501 | | * @param handle a handle to a TurboJPEG transformer instance |
1502 | | * |
1503 | | * @param jpegBuf pointer to a byte buffer containing the JPEG source image to |
1504 | | * transform |
1505 | | * |
1506 | | * @param jpegSize size of the JPEG source image (in bytes) |
1507 | | * |
1508 | | * @param n the number of transformed JPEG images to generate |
1509 | | * |
1510 | | * @param dstBufs pointer to an array of n byte buffers. `dstBufs[i]` will |
1511 | | * receive a JPEG image that has been transformed using the parameters in |
1512 | | * `transforms[i]`. TurboJPEG has the ability to reallocate the JPEG |
1513 | | * destination buffer to accommodate the size of the transformed JPEG image. |
1514 | | * Thus, you can choose to: |
1515 | | * -# pre-allocate the JPEG destination buffer with an arbitrary size using |
1516 | | * #tjAlloc() and let TurboJPEG grow the buffer as needed, |
1517 | | * -# set `dstBufs[i]` to NULL to tell TurboJPEG to allocate the buffer for |
1518 | | * you, or |
1519 | | * -# pre-allocate the buffer to a "worst case" size determined by calling |
1520 | | * #tjBufSize() with the transformed or cropped width and height. Under normal |
1521 | | * circumstances, this should ensure that the buffer never has to be |
1522 | | * re-allocated. (Setting #TJFLAG_NOREALLOC guarantees that it won't be.) |
1523 | | * Note, however, that there are some rare cases (such as transforming images |
1524 | | * with a large amount of embedded EXIF or ICC profile data) in which the |
1525 | | * transformed JPEG image will be larger than the worst-case size, and |
1526 | | * #TJFLAG_NOREALLOC cannot be used in those cases. |
1527 | | * . |
1528 | | * If you choose option 1, then `dstSizes[i]` should be set to the size of your |
1529 | | * pre-allocated buffer. In any case, unless you have set #TJFLAG_NOREALLOC, |
1530 | | * you should always check `dstBufs[i]` upon return from this function, as it |
1531 | | * may have changed. |
1532 | | * |
1533 | | * @param dstSizes pointer to an array of n unsigned long variables that will |
1534 | | * receive the actual sizes (in bytes) of each transformed JPEG image. If |
1535 | | * `dstBufs[i]` points to a pre-allocated buffer, then `dstSizes[i]` should be |
1536 | | * set to the size of the buffer. Upon return, `dstSizes[i]` will contain the |
1537 | | * size of the transformed JPEG image (in bytes.) |
1538 | | * |
1539 | | * @param transforms pointer to an array of n #tjtransform structures, each of |
1540 | | * which specifies the transform parameters and/or cropping region for the |
1541 | | * corresponding transformed JPEG image. |
1542 | | * |
1543 | | * @param flags the bitwise OR of one or more of the @ref TJFLAG_ACCURATEDCT |
1544 | | * "flags" |
1545 | | * |
1546 | | * @return 0 if successful, or -1 if an error occurred (see #tjGetErrorStr2() |
1547 | | * and #tjGetErrorCode().) |
1548 | | */ |
1549 | | DLLEXPORT int tjTransform(tjhandle handle, const unsigned char *jpegBuf, |
1550 | | unsigned long jpegSize, int n, |
1551 | | unsigned char **dstBufs, unsigned long *dstSizes, |
1552 | | tjtransform *transforms, int flags); |
1553 | | |
1554 | | |
1555 | | /** |
1556 | | * Destroy a TurboJPEG compressor, decompressor, or transformer instance. |
1557 | | * |
1558 | | * @param handle a handle to a TurboJPEG compressor, decompressor or |
1559 | | * transformer instance |
1560 | | * |
1561 | | * @return 0 if successful, or -1 if an error occurred (see #tjGetErrorStr2().) |
1562 | | */ |
1563 | | DLLEXPORT int tjDestroy(tjhandle handle); |
1564 | | |
1565 | | |
1566 | | /** |
1567 | | * Allocate a byte buffer for use with TurboJPEG. You should always use this |
1568 | | * function to allocate the JPEG destination buffer(s) for the compression and |
1569 | | * transform functions unless you are disabling automatic buffer (re)allocation |
1570 | | * (by setting #TJFLAG_NOREALLOC.) |
1571 | | * |
1572 | | * @param bytes the number of bytes to allocate |
1573 | | * |
1574 | | * @return a pointer to a newly-allocated buffer with the specified number of |
1575 | | * bytes. |
1576 | | * |
1577 | | * @sa tjFree() |
1578 | | */ |
1579 | | DLLEXPORT unsigned char *tjAlloc(int bytes); |
1580 | | |
1581 | | |
1582 | | /** |
1583 | | * Load a packed-pixel image from disk into memory. |
1584 | | * |
1585 | | * @param filename name of a file containing a packed-pixel image in Windows |
1586 | | * BMP or PBMPLUS (PPM/PGM) format |
1587 | | * |
1588 | | * @param width pointer to an integer variable that will receive the width (in |
1589 | | * pixels) of the packed-pixel image |
1590 | | * |
1591 | | * @param align row alignment of the packed-pixel buffer to be returned (must |
1592 | | * be a power of 2.) Setting this parameter to n will cause all rows in the |
1593 | | * buffer to be padded to the nearest multiple of n bytes (1 = unpadded.) |
1594 | | * |
1595 | | * @param height pointer to an integer variable that will receive the height |
1596 | | * (in pixels) of the packed-pixel image |
1597 | | * |
1598 | | * @param pixelFormat pointer to an integer variable that specifies or will |
1599 | | * receive the pixel format of the packed-pixel buffer. The behavior of |
1600 | | * #tjLoadImage() will vary depending on the value of `*pixelFormat` passed to |
1601 | | * the function: |
1602 | | * - @ref TJPF_UNKNOWN : The packed-pixel buffer returned by this function will |
1603 | | * use the most optimal pixel format for the file type, and `*pixelFormat` will |
1604 | | * contain the ID of that pixel format upon successful return from this |
1605 | | * function. |
1606 | | * - @ref TJPF_GRAY : Only PGM files and 8-bit-per-pixel BMP files with a |
1607 | | * grayscale colormap can be loaded. |
1608 | | * - @ref TJPF_CMYK : The RGB or grayscale pixels stored in the file will be |
1609 | | * converted using a quick & dirty algorithm that is suitable only for testing |
1610 | | * purposes. (Proper conversion between CMYK and other formats requires a |
1611 | | * color management system.) |
1612 | | * - Other @ref TJPF "pixel formats" : The packed-pixel buffer will use the |
1613 | | * specified pixel format, and pixel format conversion will be performed if |
1614 | | * necessary. |
1615 | | * |
1616 | | * @param flags the bitwise OR of one or more of the @ref TJFLAG_BOTTOMUP |
1617 | | * "flags". |
1618 | | * |
1619 | | * @return a pointer to a newly-allocated buffer containing the packed-pixel |
1620 | | * image, converted to the chosen pixel format and with the chosen row |
1621 | | * alignment, or NULL if an error occurred (see #tjGetErrorStr2().) This |
1622 | | * buffer should be freed using #tjFree(). |
1623 | | */ |
1624 | | DLLEXPORT unsigned char *tjLoadImage(const char *filename, int *width, |
1625 | | int align, int *height, int *pixelFormat, |
1626 | | int flags); |
1627 | | |
1628 | | |
1629 | | /** |
1630 | | * Save a packed-pixel image from memory to disk. |
1631 | | * |
1632 | | * @param filename name of a file to which to save the packed-pixel image. The |
1633 | | * image will be stored in Windows BMP or PBMPLUS (PPM/PGM) format, depending |
1634 | | * on the file extension. |
1635 | | * |
1636 | | * @param buffer pointer to a buffer containing a packed-pixel RGB, grayscale, |
1637 | | * or CMYK image to be saved |
1638 | | * |
1639 | | * @param width width (in pixels) of the packed-pixel image |
1640 | | * |
1641 | | * @param pitch bytes per row in the packed-pixel image. Setting this |
1642 | | * parameter to 0 is the equivalent of setting it to |
1643 | | * <tt>width * #tjPixelSize[pixelFormat]</tt>. |
1644 | | * |
1645 | | * @param height height (in pixels) of the packed-pixel image |
1646 | | * |
1647 | | * @param pixelFormat pixel format of the packed-pixel image (see @ref TJPF |
1648 | | * "Pixel formats".) If this parameter is set to @ref TJPF_GRAY, then the |
1649 | | * image will be stored in PGM or 8-bit-per-pixel (indexed color) BMP format. |
1650 | | * Otherwise, the image will be stored in PPM or 24-bit-per-pixel BMP format. |
1651 | | * If this parameter is set to @ref TJPF_CMYK, then the CMYK pixels will be |
1652 | | * converted to RGB using a quick & dirty algorithm that is suitable only for |
1653 | | * testing purposes. (Proper conversion between CMYK and other formats |
1654 | | * requires a color management system.) |
1655 | | * |
1656 | | * @param flags the bitwise OR of one or more of the @ref TJFLAG_BOTTOMUP |
1657 | | * "flags". |
1658 | | * |
1659 | | * @return 0 if successful, or -1 if an error occurred (see #tjGetErrorStr2().) |
1660 | | */ |
1661 | | DLLEXPORT int tjSaveImage(const char *filename, unsigned char *buffer, |
1662 | | int width, int pitch, int height, int pixelFormat, |
1663 | | int flags); |
1664 | | |
1665 | | |
1666 | | /** |
1667 | | * Free a byte buffer previously allocated by TurboJPEG. You should always use |
1668 | | * this function to free JPEG destination buffer(s) that were automatically |
1669 | | * (re)allocated by the compression and transform functions or that were |
1670 | | * manually allocated using #tjAlloc(). |
1671 | | * |
1672 | | * @param buffer address of the buffer to free. If the address is NULL, then |
1673 | | * this function has no effect. |
1674 | | * |
1675 | | * @sa tjAlloc() |
1676 | | */ |
1677 | | DLLEXPORT void tjFree(unsigned char *buffer); |
1678 | | |
1679 | | |
1680 | | /** |
1681 | | * Returns a descriptive error message explaining why the last command failed. |
1682 | | * |
1683 | | * @param handle a handle to a TurboJPEG compressor, decompressor, or |
1684 | | * transformer instance, or NULL if the error was generated by a global |
1685 | | * function (but note that retrieving the error message for a global function |
1686 | | * is thread-safe only on platforms that support thread-local storage.) |
1687 | | * |
1688 | | * @return a descriptive error message explaining why the last command failed. |
1689 | | */ |
1690 | | DLLEXPORT char *tjGetErrorStr2(tjhandle handle); |
1691 | | |
1692 | | |
1693 | | /** |
1694 | | * Returns a code indicating the severity of the last error. See |
1695 | | * @ref TJERR "Error codes". |
1696 | | * |
1697 | | * @param handle a handle to a TurboJPEG compressor, decompressor or |
1698 | | * transformer instance |
1699 | | * |
1700 | | * @return a code indicating the severity of the last error. See |
1701 | | * @ref TJERR "Error codes". |
1702 | | */ |
1703 | | DLLEXPORT int tjGetErrorCode(tjhandle handle); |
1704 | | |
1705 | | |
1706 | | /* Backward compatibility functions and macros (nothing to see here) */ |
1707 | | |
1708 | | /* TurboJPEG 1.0+ */ |
1709 | | |
1710 | | #define NUMSUBOPT TJ_NUMSAMP |
1711 | | #define TJ_444 TJSAMP_444 |
1712 | | #define TJ_422 TJSAMP_422 |
1713 | | #define TJ_420 TJSAMP_420 |
1714 | | #define TJ_411 TJSAMP_420 |
1715 | | #define TJ_GRAYSCALE TJSAMP_GRAY |
1716 | | |
1717 | 0 | #define TJ_BGR 1 |
1718 | | #define TJ_BOTTOMUP TJFLAG_BOTTOMUP |
1719 | | #define TJ_FORCEMMX TJFLAG_FORCEMMX |
1720 | | #define TJ_FORCESSE TJFLAG_FORCESSE |
1721 | | #define TJ_FORCESSE2 TJFLAG_FORCESSE2 |
1722 | 0 | #define TJ_ALPHAFIRST 64 |
1723 | | #define TJ_FORCESSE3 TJFLAG_FORCESSE3 |
1724 | | #define TJ_FASTUPSAMPLE TJFLAG_FASTUPSAMPLE |
1725 | | |
1726 | | DLLEXPORT unsigned long TJBUFSIZE(int width, int height); |
1727 | | |
1728 | | DLLEXPORT int tjCompress(tjhandle handle, unsigned char *srcBuf, int width, |
1729 | | int pitch, int height, int pixelSize, |
1730 | | unsigned char *dstBuf, unsigned long *compressedSize, |
1731 | | int jpegSubsamp, int jpegQual, int flags); |
1732 | | |
1733 | | DLLEXPORT int tjDecompress(tjhandle handle, unsigned char *jpegBuf, |
1734 | | unsigned long jpegSize, unsigned char *dstBuf, |
1735 | | int width, int pitch, int height, int pixelSize, |
1736 | | int flags); |
1737 | | |
1738 | | DLLEXPORT int tjDecompressHeader(tjhandle handle, unsigned char *jpegBuf, |
1739 | | unsigned long jpegSize, int *width, |
1740 | | int *height); |
1741 | | |
1742 | | DLLEXPORT char *tjGetErrorStr(void); |
1743 | | |
1744 | | /* TurboJPEG 1.1+ */ |
1745 | | |
1746 | 0 | #define TJ_YUV 512 |
1747 | | |
1748 | | DLLEXPORT unsigned long TJBUFSIZEYUV(int width, int height, int jpegSubsamp); |
1749 | | |
1750 | | DLLEXPORT int tjDecompressHeader2(tjhandle handle, unsigned char *jpegBuf, |
1751 | | unsigned long jpegSize, int *width, |
1752 | | int *height, int *jpegSubsamp); |
1753 | | |
1754 | | DLLEXPORT int tjDecompressToYUV(tjhandle handle, unsigned char *jpegBuf, |
1755 | | unsigned long jpegSize, unsigned char *dstBuf, |
1756 | | int flags); |
1757 | | |
1758 | | DLLEXPORT int tjEncodeYUV(tjhandle handle, unsigned char *srcBuf, int width, |
1759 | | int pitch, int height, int pixelSize, |
1760 | | unsigned char *dstBuf, int subsamp, int flags); |
1761 | | |
1762 | | /* TurboJPEG 1.2+ */ |
1763 | | |
1764 | 251k | #define TJFLAG_FORCEMMX 8 |
1765 | 251k | #define TJFLAG_FORCESSE 16 |
1766 | 251k | #define TJFLAG_FORCESSE2 32 |
1767 | | #define TJFLAG_FORCESSE3 128 |
1768 | | |
1769 | | DLLEXPORT unsigned long tjBufSizeYUV(int width, int height, int subsamp); |
1770 | | |
1771 | | DLLEXPORT int tjEncodeYUV2(tjhandle handle, unsigned char *srcBuf, int width, |
1772 | | int pitch, int height, int pixelFormat, |
1773 | | unsigned char *dstBuf, int subsamp, int flags); |
1774 | | |
1775 | | /** |
1776 | | * @} |
1777 | | */ |
1778 | | |
1779 | | #ifdef __cplusplus |
1780 | | } |
1781 | | #endif |
1782 | | |
1783 | | #endif |