|
|
@@ -0,0 +1,2328 @@
|
|
|
+/*
|
|
|
+ * Copyright (C)2009-2015, 2017, 2020-2023 D. R. Commander.
|
|
|
+ * All Rights Reserved.
|
|
|
+ *
|
|
|
+ * Redistribution and use in source and binary forms, with or without
|
|
|
+ * modification, are permitted provided that the following conditions are met:
|
|
|
+ *
|
|
|
+ * - Redistributions of source code must retain the above copyright notice,
|
|
|
+ * this list of conditions and the following disclaimer.
|
|
|
+ * - Redistributions in binary form must reproduce the above copyright notice,
|
|
|
+ * this list of conditions and the following disclaimer in the documentation
|
|
|
+ * and/or other materials provided with the distribution.
|
|
|
+ * - Neither the name of the libjpeg-turbo Project nor the names of its
|
|
|
+ * contributors may be used to endorse or promote products derived from this
|
|
|
+ * software without specific prior written permission.
|
|
|
+ *
|
|
|
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS",
|
|
|
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
|
|
|
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
|
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
|
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
|
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
|
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
|
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
|
+ * POSSIBILITY OF SUCH DAMAGE.
|
|
|
+ */
|
|
|
+
|
|
|
+#ifndef __TURBOJPEG_H__
|
|
|
+#define __TURBOJPEG_H__
|
|
|
+
|
|
|
+#include <stddef.h>
|
|
|
+
|
|
|
+#if defined(_WIN32) && defined(DLLDEFINE)
|
|
|
+#define DLLEXPORT __declspec(dllexport)
|
|
|
+#else
|
|
|
+#define DLLEXPORT
|
|
|
+#endif
|
|
|
+#define DLLCALL
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * @addtogroup TurboJPEG
|
|
|
+ * TurboJPEG API. This API provides an interface for generating, decoding, and
|
|
|
+ * transforming planar YUV and JPEG images in memory.
|
|
|
+ *
|
|
|
+ * @anchor YUVnotes
|
|
|
+ * YUV Image Format Notes
|
|
|
+ * ----------------------
|
|
|
+ * Technically, the JPEG format uses the YCbCr colorspace (which is technically
|
|
|
+ * not a colorspace but a color transform), but per the convention of the
|
|
|
+ * digital video community, the TurboJPEG API uses "YUV" to refer to an image
|
|
|
+ * format consisting of Y, Cb, and Cr image planes.
|
|
|
+ *
|
|
|
+ * Each plane is simply a 2D array of bytes, each byte representing the value
|
|
|
+ * of one of the components (Y, Cb, or Cr) at a particular location in the
|
|
|
+ * image. The width and height of each plane are determined by the image
|
|
|
+ * width, height, and level of chrominance subsampling. The luminance plane
|
|
|
+ * width is the image width padded to the nearest multiple of the horizontal
|
|
|
+ * subsampling factor (1 in the case of 4:4:4, grayscale, 4:4:0, or 4:4:1; 2 in
|
|
|
+ * the case of 4:2:2 or 4:2:0; 4 in the case of 4:1:1.) Similarly, the
|
|
|
+ * luminance plane height is the image height padded to the nearest multiple of
|
|
|
+ * the vertical subsampling factor (1 in the case of 4:4:4, 4:2:2, grayscale,
|
|
|
+ * or 4:1:1; 2 in the case of 4:2:0 or 4:4:0; 4 in the case of 4:4:1.) This is
|
|
|
+ * irrespective of any additional padding that may be specified as an argument
|
|
|
+ * to the various YUV functions. The chrominance plane width is equal to the
|
|
|
+ * luminance plane width divided by the horizontal subsampling factor, and the
|
|
|
+ * chrominance plane height is equal to the luminance plane height divided by
|
|
|
+ * the vertical subsampling factor.
|
|
|
+ *
|
|
|
+ * For example, if the source image is 35 x 35 pixels and 4:2:2 subsampling is
|
|
|
+ * used, then the luminance plane would be 36 x 35 bytes, and each of the
|
|
|
+ * chrominance planes would be 18 x 35 bytes. If you specify a row alignment
|
|
|
+ * of 4 bytes on top of this, then the luminance plane would be 36 x 35 bytes,
|
|
|
+ * and each of the chrominance planes would be 20 x 35 bytes.
|
|
|
+ *
|
|
|
+ * @{
|
|
|
+ */
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * The number of initialization options
|
|
|
+ */
|
|
|
+#define TJ_NUMINIT 3
|
|
|
+
|
|
|
+/**
|
|
|
+ * Initialization options.
|
|
|
+ */
|
|
|
+enum TJINIT {
|
|
|
+ /**
|
|
|
+ * Initialize the TurboJPEG instance for compression.
|
|
|
+ */
|
|
|
+ TJINIT_COMPRESS,
|
|
|
+ /**
|
|
|
+ * Initialize the TurboJPEG instance for decompression.
|
|
|
+ */
|
|
|
+ TJINIT_DECOMPRESS,
|
|
|
+ /**
|
|
|
+ * Initialize the TurboJPEG instance for lossless transformation (both
|
|
|
+ * compression and decompression.)
|
|
|
+ */
|
|
|
+ TJINIT_TRANSFORM
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * The number of chrominance subsampling options
|
|
|
+ */
|
|
|
+#define TJ_NUMSAMP 7
|
|
|
+
|
|
|
+/**
|
|
|
+ * Chrominance subsampling options.
|
|
|
+ * When pixels are converted from RGB to YCbCr (see #TJCS_YCbCr) or from CMYK
|
|
|
+ * to YCCK (see #TJCS_YCCK) as part of the JPEG compression process, some of
|
|
|
+ * the Cb and Cr (chrominance) components can be discarded or averaged together
|
|
|
+ * to produce a smaller image with little perceptible loss of image clarity.
|
|
|
+ * (The human eye is more sensitive to small changes in brightness than to
|
|
|
+ * small changes in color.) This is called "chrominance subsampling".
|
|
|
+ */
|
|
|
+enum TJSAMP {
|
|
|
+ /**
|
|
|
+ * 4:4:4 chrominance subsampling (no chrominance subsampling). The JPEG or
|
|
|
+ * YUV image will contain one chrominance component for every pixel in the
|
|
|
+ * source image.
|
|
|
+ */
|
|
|
+ TJSAMP_444,
|
|
|
+ /**
|
|
|
+ * 4:2:2 chrominance subsampling. The JPEG or YUV image will contain one
|
|
|
+ * chrominance component for every 2x1 block of pixels in the source image.
|
|
|
+ */
|
|
|
+ TJSAMP_422,
|
|
|
+ /**
|
|
|
+ * 4:2:0 chrominance subsampling. The JPEG or YUV image will contain one
|
|
|
+ * chrominance component for every 2x2 block of pixels in the source image.
|
|
|
+ */
|
|
|
+ TJSAMP_420,
|
|
|
+ /**
|
|
|
+ * Grayscale. The JPEG or YUV image will contain no chrominance components.
|
|
|
+ */
|
|
|
+ TJSAMP_GRAY,
|
|
|
+ /**
|
|
|
+ * 4:4:0 chrominance subsampling. The JPEG or YUV image will contain one
|
|
|
+ * chrominance component for every 1x2 block of pixels in the source image.
|
|
|
+ *
|
|
|
+ * @note 4:4:0 subsampling is not fully accelerated in libjpeg-turbo.
|
|
|
+ */
|
|
|
+ TJSAMP_440,
|
|
|
+ /**
|
|
|
+ * 4:1:1 chrominance subsampling. The JPEG or YUV image will contain one
|
|
|
+ * chrominance component for every 4x1 block of pixels in the source image.
|
|
|
+ * JPEG images compressed with 4:1:1 subsampling will be almost exactly the
|
|
|
+ * same size as those compressed with 4:2:0 subsampling, and in the
|
|
|
+ * aggregate, both subsampling methods produce approximately the same
|
|
|
+ * perceptual quality. However, 4:1:1 is better able to reproduce sharp
|
|
|
+ * horizontal features.
|
|
|
+ *
|
|
|
+ * @note 4:1:1 subsampling is not fully accelerated in libjpeg-turbo.
|
|
|
+ */
|
|
|
+ TJSAMP_411,
|
|
|
+ /**
|
|
|
+ * 4:4:1 chrominance subsampling. The JPEG or YUV image will contain one
|
|
|
+ * chrominance component for every 1x4 block of pixels in the source image.
|
|
|
+ * JPEG images compressed with 4:4:1 subsampling will be almost exactly the
|
|
|
+ * same size as those compressed with 4:2:0 subsampling, and in the
|
|
|
+ * aggregate, both subsampling methods produce approximately the same
|
|
|
+ * perceptual quality. However, 4:4:1 is better able to reproduce sharp
|
|
|
+ * vertical features.
|
|
|
+ *
|
|
|
+ * @note 4:4:1 subsampling is not fully accelerated in libjpeg-turbo.
|
|
|
+ */
|
|
|
+ TJSAMP_441,
|
|
|
+ /**
|
|
|
+ * Unknown subsampling. The JPEG image uses an unusual type of chrominance
|
|
|
+ * subsampling. Such images can be decompressed into packed-pixel images,
|
|
|
+ * but they cannot be
|
|
|
+ * - decompressed into planar YUV images,
|
|
|
+ * - losslessly transformed if #TJXOPT_CROP is specified, or
|
|
|
+ * - partially decompressed using a cropping region.
|
|
|
+ */
|
|
|
+ TJSAMP_UNKNOWN = -1
|
|
|
+};
|
|
|
+
|
|
|
+/**
|
|
|
+ * MCU block width (in pixels) for a given level of chrominance subsampling.
|
|
|
+ * MCU block sizes:
|
|
|
+ * - 8x8 for no subsampling or grayscale
|
|
|
+ * - 16x8 for 4:2:2
|
|
|
+ * - 8x16 for 4:4:0
|
|
|
+ * - 16x16 for 4:2:0
|
|
|
+ * - 32x8 for 4:1:1
|
|
|
+ * - 8x32 for 4:4:1
|
|
|
+ */
|
|
|
+static const int tjMCUWidth[TJ_NUMSAMP] = { 8, 16, 16, 8, 8, 32, 8 };
|
|
|
+
|
|
|
+/**
|
|
|
+ * MCU block height (in pixels) for a given level of chrominance subsampling.
|
|
|
+ * MCU block sizes:
|
|
|
+ * - 8x8 for no subsampling or grayscale
|
|
|
+ * - 16x8 for 4:2:2
|
|
|
+ * - 8x16 for 4:4:0
|
|
|
+ * - 16x16 for 4:2:0
|
|
|
+ * - 32x8 for 4:1:1
|
|
|
+ * - 8x32 for 4:4:1
|
|
|
+ */
|
|
|
+static const int tjMCUHeight[TJ_NUMSAMP] = { 8, 8, 16, 8, 16, 8, 32 };
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * The number of pixel formats
|
|
|
+ */
|
|
|
+#define TJ_NUMPF 12
|
|
|
+
|
|
|
+/**
|
|
|
+ * Pixel formats
|
|
|
+ */
|
|
|
+enum TJPF {
|
|
|
+ /**
|
|
|
+ * RGB pixel format. The red, green, and blue components in the image are
|
|
|
+ * stored in 3-sample pixels in the order R, G, B from lowest to highest
|
|
|
+ * memory address within each pixel.
|
|
|
+ */
|
|
|
+ TJPF_RGB,
|
|
|
+ /**
|
|
|
+ * BGR pixel format. The red, green, and blue components in the image are
|
|
|
+ * stored in 3-sample pixels in the order B, G, R from lowest to highest
|
|
|
+ * memory address within each pixel.
|
|
|
+ */
|
|
|
+ TJPF_BGR,
|
|
|
+ /**
|
|
|
+ * RGBX pixel format. The red, green, and blue components in the image are
|
|
|
+ * stored in 4-sample pixels in the order R, G, B from lowest to highest
|
|
|
+ * memory address within each pixel. The X component is ignored when
|
|
|
+ * compressing and undefined when decompressing.
|
|
|
+ */
|
|
|
+ TJPF_RGBX,
|
|
|
+ /**
|
|
|
+ * BGRX pixel format. The red, green, and blue components in the image are
|
|
|
+ * stored in 4-sample pixels in the order B, G, R from lowest to highest
|
|
|
+ * memory address within each pixel. The X component is ignored when
|
|
|
+ * compressing and undefined when decompressing.
|
|
|
+ */
|
|
|
+ TJPF_BGRX,
|
|
|
+ /**
|
|
|
+ * XBGR pixel format. The red, green, and blue components in the image are
|
|
|
+ * stored in 4-sample pixels in the order R, G, B from highest to lowest
|
|
|
+ * memory address within each pixel. The X component is ignored when
|
|
|
+ * compressing and undefined when decompressing.
|
|
|
+ */
|
|
|
+ TJPF_XBGR,
|
|
|
+ /**
|
|
|
+ * XRGB pixel format. The red, green, and blue components in the image are
|
|
|
+ * stored in 4-sample pixels in the order B, G, R from highest to lowest
|
|
|
+ * memory address within each pixel. The X component is ignored when
|
|
|
+ * compressing and undefined when decompressing.
|
|
|
+ */
|
|
|
+ TJPF_XRGB,
|
|
|
+ /**
|
|
|
+ * Grayscale pixel format. Each 1-sample pixel represents a luminance
|
|
|
+ * (brightness) level from 0 to the maximum sample value (255 for 8-bit
|
|
|
+ * samples, 4095 for 12-bit samples, and 65535 for 16-bit samples.)
|
|
|
+ */
|
|
|
+ TJPF_GRAY,
|
|
|
+ /**
|
|
|
+ * RGBA pixel format. This is the same as @ref TJPF_RGBX, except that when
|
|
|
+ * decompressing, the X component is guaranteed to be equal to the maximum
|
|
|
+ * sample value, which can be interpreted as an opaque alpha channel.
|
|
|
+ */
|
|
|
+ TJPF_RGBA,
|
|
|
+ /**
|
|
|
+ * BGRA pixel format. This is the same as @ref TJPF_BGRX, except that when
|
|
|
+ * decompressing, the X component is guaranteed to be equal to the maximum
|
|
|
+ * sample value, which can be interpreted as an opaque alpha channel.
|
|
|
+ */
|
|
|
+ TJPF_BGRA,
|
|
|
+ /**
|
|
|
+ * ABGR pixel format. This is the same as @ref TJPF_XBGR, except that when
|
|
|
+ * decompressing, the X component is guaranteed to be equal to the maximum
|
|
|
+ * sample value, which can be interpreted as an opaque alpha channel.
|
|
|
+ */
|
|
|
+ TJPF_ABGR,
|
|
|
+ /**
|
|
|
+ * ARGB pixel format. This is the same as @ref TJPF_XRGB, except that when
|
|
|
+ * decompressing, the X component is guaranteed to be equal to the maximum
|
|
|
+ * sample value, which can be interpreted as an opaque alpha channel.
|
|
|
+ */
|
|
|
+ TJPF_ARGB,
|
|
|
+ /**
|
|
|
+ * CMYK pixel format. Unlike RGB, which is an additive color model used
|
|
|
+ * primarily for display, CMYK (Cyan/Magenta/Yellow/Key) is a subtractive
|
|
|
+ * color model used primarily for printing. In the CMYK color model, the
|
|
|
+ * value of each color component typically corresponds to an amount of cyan,
|
|
|
+ * magenta, yellow, or black ink that is applied to a white background. In
|
|
|
+ * order to convert between CMYK and RGB, it is necessary to use a color
|
|
|
+ * management system (CMS.) A CMS will attempt to map colors within the
|
|
|
+ * printer's gamut to perceptually similar colors in the display's gamut and
|
|
|
+ * vice versa, but the mapping is typically not 1:1 or reversible, nor can it
|
|
|
+ * be defined with a simple formula. Thus, such a conversion is out of scope
|
|
|
+ * for a codec library. However, the TurboJPEG API allows for compressing
|
|
|
+ * packed-pixel CMYK images into YCCK JPEG images (see #TJCS_YCCK) and
|
|
|
+ * decompressing YCCK JPEG images into packed-pixel CMYK images.
|
|
|
+ */
|
|
|
+ TJPF_CMYK,
|
|
|
+ /**
|
|
|
+ * Unknown pixel format. Currently this is only used by #tj3LoadImage8(),
|
|
|
+ * #tj3LoadImage12(), and #tj3LoadImage16().
|
|
|
+ */
|
|
|
+ TJPF_UNKNOWN = -1
|
|
|
+};
|
|
|
+
|
|
|
+/**
|
|
|
+ * Red offset (in samples) for a given pixel format. This specifies the number
|
|
|
+ * of samples that the red component is offset from the start of the pixel.
|
|
|
+ * For instance, if an 8-bit-per-component pixel of format TJPF_BGRX is stored
|
|
|
+ * in `unsigned char pixel[]`, then the red component will be
|
|
|
+ * `pixel[tjRedOffset[TJPF_BGRX]]`. This will be -1 if the pixel format does
|
|
|
+ * not have a red component.
|
|
|
+ */
|
|
|
+static const int tjRedOffset[TJ_NUMPF] = {
|
|
|
+ 0, 2, 0, 2, 3, 1, -1, 0, 2, 3, 1, -1
|
|
|
+};
|
|
|
+/**
|
|
|
+ * Green offset (in samples) for a given pixel format. This specifies the
|
|
|
+ * number of samples that the green component is offset from the start of the
|
|
|
+ * pixel. For instance, if an 8-bit-per-component pixel of format TJPF_BGRX is
|
|
|
+ * stored in `unsigned char pixel[]`, then the green component will be
|
|
|
+ * `pixel[tjGreenOffset[TJPF_BGRX]]`. This will be -1 if the pixel format does
|
|
|
+ * not have a green component.
|
|
|
+ */
|
|
|
+static const int tjGreenOffset[TJ_NUMPF] = {
|
|
|
+ 1, 1, 1, 1, 2, 2, -1, 1, 1, 2, 2, -1
|
|
|
+};
|
|
|
+/**
|
|
|
+ * Blue offset (in samples) for a given pixel format. This specifies the
|
|
|
+ * number of samples that the blue component is offset from the start of the
|
|
|
+ * pixel. For instance, if an 8-bit-per-component pixel of format TJPF_BGRX is
|
|
|
+ * stored in `unsigned char pixel[]`, then the blue component will be
|
|
|
+ * `pixel[tjBlueOffset[TJPF_BGRX]]`. This will be -1 if the pixel format does
|
|
|
+ * not have a blue component.
|
|
|
+ */
|
|
|
+static const int tjBlueOffset[TJ_NUMPF] = {
|
|
|
+ 2, 0, 2, 0, 1, 3, -1, 2, 0, 1, 3, -1
|
|
|
+};
|
|
|
+/**
|
|
|
+ * Alpha offset (in samples) for a given pixel format. This specifies the
|
|
|
+ * number of samples that the alpha component is offset from the start of the
|
|
|
+ * pixel. For instance, if an 8-bit-per-component pixel of format TJPF_BGRA is
|
|
|
+ * stored in `unsigned char pixel[]`, then the alpha component will be
|
|
|
+ * `pixel[tjAlphaOffset[TJPF_BGRA]]`. This will be -1 if the pixel format does
|
|
|
+ * not have an alpha component.
|
|
|
+ */
|
|
|
+static const int tjAlphaOffset[TJ_NUMPF] = {
|
|
|
+ -1, -1, -1, -1, -1, -1, -1, 3, 3, 0, 0, -1
|
|
|
+};
|
|
|
+/**
|
|
|
+ * Pixel size (in samples) for a given pixel format
|
|
|
+ */
|
|
|
+static const int tjPixelSize[TJ_NUMPF] = {
|
|
|
+ 3, 3, 4, 4, 4, 4, 1, 4, 4, 4, 4, 4
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * The number of JPEG colorspaces
|
|
|
+ */
|
|
|
+#define TJ_NUMCS 5
|
|
|
+
|
|
|
+/**
|
|
|
+ * JPEG colorspaces
|
|
|
+ */
|
|
|
+enum TJCS {
|
|
|
+ /**
|
|
|
+ * RGB colorspace. When compressing the JPEG image, the R, G, and B
|
|
|
+ * components in the source image are reordered into image planes, but no
|
|
|
+ * colorspace conversion or subsampling is performed. RGB JPEG images can be
|
|
|
+ * compressed from and decompressed to packed-pixel images with any of the
|
|
|
+ * extended RGB or grayscale pixel formats, but they cannot be compressed
|
|
|
+ * from or decompressed to planar YUV images.
|
|
|
+ */
|
|
|
+ TJCS_RGB,
|
|
|
+ /**
|
|
|
+ * YCbCr colorspace. YCbCr is not an absolute colorspace but rather a
|
|
|
+ * mathematical transformation of RGB designed solely for storage and
|
|
|
+ * transmission. YCbCr images must be converted to RGB before they can
|
|
|
+ * actually be displayed. In the YCbCr colorspace, the Y (luminance)
|
|
|
+ * component represents the black & white portion of the original image, and
|
|
|
+ * the Cb and Cr (chrominance) components represent the color portion of the
|
|
|
+ * original image. Originally, the analog equivalent of this transformation
|
|
|
+ * allowed the same signal to drive both black & white and color televisions,
|
|
|
+ * but JPEG images use YCbCr primarily because it allows the color data to be
|
|
|
+ * optionally subsampled for the purposes of reducing network or disk usage.
|
|
|
+ * YCbCr is the most common JPEG colorspace, and YCbCr JPEG images can be
|
|
|
+ * compressed from and decompressed to packed-pixel images with any of the
|
|
|
+ * extended RGB or grayscale pixel formats. YCbCr JPEG images can also be
|
|
|
+ * compressed from and decompressed to planar YUV images.
|
|
|
+ */
|
|
|
+ TJCS_YCbCr,
|
|
|
+ /**
|
|
|
+ * Grayscale colorspace. The JPEG image retains only the luminance data (Y
|
|
|
+ * component), and any color data from the source image is discarded.
|
|
|
+ * Grayscale JPEG images can be compressed from and decompressed to
|
|
|
+ * packed-pixel images with any of the extended RGB or grayscale pixel
|
|
|
+ * formats, or they can be compressed from and decompressed to planar YUV
|
|
|
+ * images.
|
|
|
+ */
|
|
|
+ TJCS_GRAY,
|
|
|
+ /**
|
|
|
+ * CMYK colorspace. When compressing the JPEG image, the C, M, Y, and K
|
|
|
+ * components in the source image are reordered into image planes, but no
|
|
|
+ * colorspace conversion or subsampling is performed. CMYK JPEG images can
|
|
|
+ * only be compressed from and decompressed to packed-pixel images with the
|
|
|
+ * CMYK pixel format.
|
|
|
+ */
|
|
|
+ TJCS_CMYK,
|
|
|
+ /**
|
|
|
+ * YCCK colorspace. YCCK (AKA "YCbCrK") is not an absolute colorspace but
|
|
|
+ * rather a mathematical transformation of CMYK designed solely for storage
|
|
|
+ * and transmission. It is to CMYK as YCbCr is to RGB. CMYK pixels can be
|
|
|
+ * reversibly transformed into YCCK, and as with YCbCr, the chrominance
|
|
|
+ * components in the YCCK pixels can be subsampled without incurring major
|
|
|
+ * perceptual loss. YCCK JPEG images can only be compressed from and
|
|
|
+ * decompressed to packed-pixel images with the CMYK pixel format.
|
|
|
+ */
|
|
|
+ TJCS_YCCK
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * Parameters
|
|
|
+ */
|
|
|
+enum TJPARAM {
|
|
|
+ /**
|
|
|
+ * Error handling behavior
|
|
|
+ *
|
|
|
+ * **Value**
|
|
|
+ * - `0` *[default]* Allow the current compression/decompression/transform
|
|
|
+ * operation to complete unless a fatal error is encountered.
|
|
|
+ * - `1` Immediately discontinue the current
|
|
|
+ * compression/decompression/transform operation if a warning (non-fatal
|
|
|
+ * error) occurs.
|
|
|
+ */
|
|
|
+ TJPARAM_STOPONWARNING,
|
|
|
+ /**
|
|
|
+ * Row order in packed-pixel source/destination images
|
|
|
+ *
|
|
|
+ * **Value**
|
|
|
+ * - `0` *[default]* top-down (X11) order
|
|
|
+ * - `1` bottom-up (Windows, OpenGL) order
|
|
|
+ */
|
|
|
+ TJPARAM_BOTTOMUP,
|
|
|
+ /**
|
|
|
+ * JPEG destination buffer (re)allocation [compression, lossless
|
|
|
+ * transformation]
|
|
|
+ *
|
|
|
+ * **Value**
|
|
|
+ * - `0` *[default]* Attempt to allocate or reallocate the JPEG destination
|
|
|
+ * buffer as needed.
|
|
|
+ * - `1` Generate an error if the JPEG destination buffer is invalid or too
|
|
|
+ * small.
|
|
|
+ */
|
|
|
+ TJPARAM_NOREALLOC,
|
|
|
+ /**
|
|
|
+ * Perceptual quality of lossy JPEG images [compression only]
|
|
|
+ *
|
|
|
+ * **Value**
|
|
|
+ * - `1`-`100` (`1` = worst quality but best compression, `100` = best
|
|
|
+ * quality but worst compression) *[no default; must be explicitly
|
|
|
+ * specified]*
|
|
|
+ */
|
|
|
+ TJPARAM_QUALITY,
|
|
|
+ /**
|
|
|
+ * Chrominance subsampling level
|
|
|
+ *
|
|
|
+ * The JPEG or YUV image uses (decompression, decoding) or will use (lossy
|
|
|
+ * compression, encoding) the specified level of chrominance subsampling.
|
|
|
+ *
|
|
|
+ * **Value**
|
|
|
+ * - One of the @ref TJSAMP "chrominance subsampling options" *[no default;
|
|
|
+ * must be explicitly specified for lossy compression, encoding, and
|
|
|
+ * decoding]*
|
|
|
+ */
|
|
|
+ TJPARAM_SUBSAMP,
|
|
|
+ /**
|
|
|
+ * JPEG width (in pixels) [decompression only, read-only]
|
|
|
+ */
|
|
|
+ TJPARAM_JPEGWIDTH,
|
|
|
+ /**
|
|
|
+ * JPEG height (in pixels) [decompression only, read-only]
|
|
|
+ */
|
|
|
+ TJPARAM_JPEGHEIGHT,
|
|
|
+ /**
|
|
|
+ * JPEG data precision (bits per sample) [decompression only, read-only]
|
|
|
+ *
|
|
|
+ * The JPEG image uses the specified number of bits per sample.
|
|
|
+ *
|
|
|
+ * **Value**
|
|
|
+ * - `8`, `12`, or `16`
|
|
|
+ *
|
|
|
+ * 12-bit data precision implies #TJPARAM_OPTIMIZE unless #TJPARAM_ARITHMETIC
|
|
|
+ * is set.
|
|
|
+ */
|
|
|
+ TJPARAM_PRECISION,
|
|
|
+ /**
|
|
|
+ * JPEG colorspace
|
|
|
+ *
|
|
|
+ * The JPEG image uses (decompression) or will use (lossy compression) the
|
|
|
+ * specified colorspace.
|
|
|
+ *
|
|
|
+ * **Value**
|
|
|
+ * - One of the @ref TJCS "JPEG colorspaces" *[default for lossy compression:
|
|
|
+ * automatically selected based on the subsampling level and pixel format]*
|
|
|
+ */
|
|
|
+ TJPARAM_COLORSPACE,
|
|
|
+ /**
|
|
|
+ * Chrominance upsampling algorithm [lossy decompression only]
|
|
|
+ *
|
|
|
+ * **Value**
|
|
|
+ * - `0` *[default]* Use smooth upsampling when decompressing a JPEG image
|
|
|
+ * that was compressed using chrominance subsampling. This creates a smooth
|
|
|
+ * transition between neighboring chrominance components in order to reduce
|
|
|
+ * upsampling artifacts in the decompressed image.
|
|
|
+ * - `1` Use the fastest chrominance upsampling algorithm available, which
|
|
|
+ * may combine upsampling with color conversion.
|
|
|
+ */
|
|
|
+ TJPARAM_FASTUPSAMPLE,
|
|
|
+ /**
|
|
|
+ * DCT/IDCT algorithm [lossy compression and decompression]
|
|
|
+ *
|
|
|
+ * **Value**
|
|
|
+ * - `0` *[default]* Use the most accurate DCT/IDCT algorithm available.
|
|
|
+ * - `1` Use the fastest DCT/IDCT algorithm available.
|
|
|
+ *
|
|
|
+ * This parameter is provided mainly for backward compatibility with libjpeg,
|
|
|
+ * which historically implemented several different DCT/IDCT algorithms
|
|
|
+ * because of performance limitations with 1990s CPUs. In the libjpeg-turbo
|
|
|
+ * implementation of the TurboJPEG API:
|
|
|
+ * - The "fast" and "accurate" DCT/IDCT algorithms perform similarly on
|
|
|
+ * modern x86/x86-64 CPUs that support AVX2 instructions.
|
|
|
+ * - The "fast" algorithm is generally only about 5-15% faster than the
|
|
|
+ * "accurate" algorithm on other types of CPUs.
|
|
|
+ * - The difference in accuracy between the "fast" and "accurate" algorithms
|
|
|
+ * is the most pronounced at JPEG quality levels above 90 and tends to be
|
|
|
+ * more pronounced with decompression than with compression.
|
|
|
+ * - The "fast" algorithm degrades and is not fully accelerated for JPEG
|
|
|
+ * quality levels above 97, so it will be slower than the "accurate"
|
|
|
+ * algorithm.
|
|
|
+ */
|
|
|
+ TJPARAM_FASTDCT,
|
|
|
+ /**
|
|
|
+ * Optimized baseline entropy coding [lossy compression only]
|
|
|
+ *
|
|
|
+ * **Value**
|
|
|
+ * - `0` *[default]* The JPEG image will use the default Huffman tables.
|
|
|
+ * - `1` Optimal Huffman tables will be computed for the JPEG image. For
|
|
|
+ * lossless transformation, this can also be specified using
|
|
|
+ * #TJXOPT_OPTIMIZE.
|
|
|
+ *
|
|
|
+ * Optimized baseline entropy coding will improve compression slightly
|
|
|
+ * (generally 5% or less), but it will reduce compression performance
|
|
|
+ * considerably.
|
|
|
+ */
|
|
|
+ TJPARAM_OPTIMIZE,
|
|
|
+ /**
|
|
|
+ * Progressive entropy coding
|
|
|
+ *
|
|
|
+ * **Value**
|
|
|
+ * - `0` *[default for compression, lossless transformation]* The lossy JPEG
|
|
|
+ * image uses (decompression) or will use (compression, lossless
|
|
|
+ * transformation) baseline entropy coding.
|
|
|
+ * - `1` The lossy JPEG image uses (decompression) or will use (compression,
|
|
|
+ * lossless transformation) progressive entropy coding. For lossless
|
|
|
+ * transformation, this can also be specified using #TJXOPT_PROGRESSIVE.
|
|
|
+ *
|
|
|
+ * Progressive entropy coding will generally improve compression relative to
|
|
|
+ * baseline entropy coding, but it will reduce compression and decompression
|
|
|
+ * performance considerably. Can be combined with #TJPARAM_ARITHMETIC.
|
|
|
+ * Implies #TJPARAM_OPTIMIZE unless #TJPARAM_ARITHMETIC is also set.
|
|
|
+ */
|
|
|
+ TJPARAM_PROGRESSIVE,
|
|
|
+ /**
|
|
|
+ * Progressive JPEG scan limit for lossy JPEG images [decompression, lossless
|
|
|
+ * transformation]
|
|
|
+ *
|
|
|
+ * Setting this parameter will cause the decompression and transform
|
|
|
+ * functions to return an error if the number of scans in a progressive JPEG
|
|
|
+ * image exceeds the specified limit. The primary purpose of this is to
|
|
|
+ * allow security-critical applications to guard against an exploit of the
|
|
|
+ * progressive JPEG format described in
|
|
|
+ * <a href="https://libjpeg-turbo.org/pmwiki/uploads/About/TwoIssueswiththeJPEGStandard.pdf" target="_blank">this report</a>.
|
|
|
+ *
|
|
|
+ * **Value**
|
|
|
+ * - maximum number of progressive JPEG scans that the decompression and
|
|
|
+ * transform functions will process *[default: `0` (no limit)]*
|
|
|
+ *
|
|
|
+ * @see #TJPARAM_PROGRESSIVE
|
|
|
+ */
|
|
|
+ TJPARAM_SCANLIMIT,
|
|
|
+ /**
|
|
|
+ * Arithmetic entropy coding
|
|
|
+ *
|
|
|
+ * **Value**
|
|
|
+ * - `0` *[default for compression, lossless transformation]* The lossy JPEG
|
|
|
+ * image uses (decompression) or will use (compression, lossless
|
|
|
+ * transformation) Huffman entropy coding.
|
|
|
+ * - `1` The lossy JPEG image uses (decompression) or will use (compression,
|
|
|
+ * lossless transformation) arithmetic entropy coding. For lossless
|
|
|
+ * transformation, this can also be specified using #TJXOPT_ARITHMETIC.
|
|
|
+ *
|
|
|
+ * Arithmetic entropy coding will generally improve compression relative to
|
|
|
+ * Huffman entropy coding, but it will reduce compression and decompression
|
|
|
+ * performance considerably. Can be combined with #TJPARAM_PROGRESSIVE.
|
|
|
+ */
|
|
|
+ TJPARAM_ARITHMETIC,
|
|
|
+ /**
|
|
|
+ * Lossless JPEG
|
|
|
+ *
|
|
|
+ * **Value**
|
|
|
+ * - `0` *[default for compression]* The JPEG image is (decompression) or
|
|
|
+ * will be (compression) lossy/DCT-based.
|
|
|
+ * - `1` The JPEG image is (decompression) or will be (compression)
|
|
|
+ * lossless/predictive.
|
|
|
+ *
|
|
|
+ * In most cases, compressing and decompressing lossless JPEG images is
|
|
|
+ * considerably slower than compressing and decompressing lossy JPEG images,
|
|
|
+ * and lossless JPEG images are much larger than lossy JPEG images. Thus,
|
|
|
+ * lossless JPEG images are typically used only for applications that require
|
|
|
+ * mathematically lossless compression. Also note that the following
|
|
|
+ * features are not available with lossless JPEG images:
|
|
|
+ * - Colorspace conversion (lossless JPEG images always use #TJCS_RGB,
|
|
|
+ * #TJCS_GRAY, or #TJCS_CMYK, depending on the pixel format of the source
|
|
|
+ * image)
|
|
|
+ * - Chrominance subsampling (lossless JPEG images always use #TJSAMP_444)
|
|
|
+ * - JPEG quality selection
|
|
|
+ * - DCT/IDCT algorithm selection
|
|
|
+ * - Progressive entropy coding
|
|
|
+ * - Arithmetic entropy coding
|
|
|
+ * - Compression from/decompression to planar YUV images
|
|
|
+ * - Decompression scaling
|
|
|
+ * - Lossless transformation
|
|
|
+ *
|
|
|
+ * @see #TJPARAM_LOSSLESSPSV, #TJPARAM_LOSSLESSPT
|
|
|
+ */
|
|
|
+ TJPARAM_LOSSLESS,
|
|
|
+ /**
|
|
|
+ * Lossless JPEG predictor selection value (PSV)
|
|
|
+ *
|
|
|
+ * **Value**
|
|
|
+ * - `1`-`7` *[default for compression: `1`]*
|
|
|
+ *
|
|
|
+ * Lossless JPEG compression shares no algorithms with lossy JPEG
|
|
|
+ * compression. Instead, it uses differential pulse-code modulation (DPCM),
|
|
|
+ * an algorithm whereby each sample is encoded as the difference between the
|
|
|
+ * sample's value and a "predictor", which is based on the values of
|
|
|
+ * neighboring samples. If Ra is the sample immediately to the left of the
|
|
|
+ * current sample, Rb is the sample immediately above the current sample, and
|
|
|
+ * Rc is the sample diagonally to the left and above the current sample, then
|
|
|
+ * the relationship between the predictor selection value and the predictor
|
|
|
+ * is as follows:
|
|
|
+ *
|
|
|
+ * PSV | Predictor
|
|
|
+ * ----|----------
|
|
|
+ * 1 | Ra
|
|
|
+ * 2 | Rb
|
|
|
+ * 3 | Rc
|
|
|
+ * 4 | Ra + Rb – Rc
|
|
|
+ * 5 | Ra + (Rb – Rc) / 2
|
|
|
+ * 6 | Rb + (Ra – Rc) / 2
|
|
|
+ * 7 | (Ra + Rb) / 2
|
|
|
+ *
|
|
|
+ * Predictors 1-3 are 1-dimensional predictors, whereas Predictors 4-7 are
|
|
|
+ * 2-dimensional predictors. The best predictor for a particular image
|
|
|
+ * depends on the image.
|
|
|
+ *
|
|
|
+ * @see #TJPARAM_LOSSLESS
|
|
|
+ */
|
|
|
+ TJPARAM_LOSSLESSPSV,
|
|
|
+ /**
|
|
|
+ * Lossless JPEG point transform (Pt)
|
|
|
+ *
|
|
|
+ * **Value**
|
|
|
+ * - `0` through ***precision*** *- 1*, where ***precision*** is the JPEG
|
|
|
+ * data precision in bits *[default for compression: `0`]*
|
|
|
+ *
|
|
|
+ * A point transform value of `0` is necessary in order to generate a fully
|
|
|
+ * lossless JPEG image. (A non-zero point transform value right-shifts the
|
|
|
+ * input samples by the specified number of bits, which is effectively a form
|
|
|
+ * of lossy color quantization.)
|
|
|
+ *
|
|
|
+ * @see #TJPARAM_LOSSLESS, #TJPARAM_PRECISION
|
|
|
+ */
|
|
|
+ TJPARAM_LOSSLESSPT,
|
|
|
+ /**
|
|
|
+ * JPEG restart marker interval in MCU blocks (lossy) or samples (lossless)
|
|
|
+ * [compression only]
|
|
|
+ *
|
|
|
+ * The nature of entropy coding is such that a corrupt JPEG image cannot
|
|
|
+ * be decompressed beyond the point of corruption unless it contains restart
|
|
|
+ * markers. A restart marker stops and restarts the entropy coding algorithm
|
|
|
+ * so that, if a JPEG image is corrupted, decompression can resume at the
|
|
|
+ * next marker. Thus, adding more restart markers improves the fault
|
|
|
+ * tolerance of the JPEG image, but adding too many restart markers can
|
|
|
+ * adversely affect the compression ratio and performance.
|
|
|
+ *
|
|
|
+ * **Value**
|
|
|
+ * - the number of MCU blocks or samples between each restart marker
|
|
|
+ * *[default: `0` (no restart markers)]*
|
|
|
+ *
|
|
|
+ * Setting this parameter to a non-zero value sets #TJPARAM_RESTARTROWS to 0.
|
|
|
+ */
|
|
|
+ TJPARAM_RESTARTBLOCKS,
|
|
|
+ /**
|
|
|
+ * JPEG restart marker interval in MCU rows (lossy) or sample rows (lossless)
|
|
|
+ * [compression only]
|
|
|
+ *
|
|
|
+ * See #TJPARAM_RESTARTBLOCKS for a description of restart markers.
|
|
|
+ *
|
|
|
+ * **Value**
|
|
|
+ * - the number of MCU rows or sample rows between each restart marker
|
|
|
+ * *[default: `0` (no restart markers)]*
|
|
|
+ *
|
|
|
+ * Setting this parameter to a non-zero value sets #TJPARAM_RESTARTBLOCKS to
|
|
|
+ * 0.
|
|
|
+ */
|
|
|
+ TJPARAM_RESTARTROWS,
|
|
|
+ /**
|
|
|
+ * JPEG horizontal pixel density
|
|
|
+ *
|
|
|
+ * **Value**
|
|
|
+ * - The JPEG image has (decompression) or will have (compression) the
|
|
|
+ * specified horizontal pixel density *[default for compression: `1`]*.
|
|
|
+ *
|
|
|
+ * This value is stored in or read from the JPEG header. It does not affect
|
|
|
+ * the contents of the JPEG image. Note that this parameter is set by
|
|
|
+ * #tj3LoadImage8() when loading a Windows BMP file that contains pixel
|
|
|
+ * density information, and the value of this parameter is stored to a
|
|
|
+ * Windows BMP file by #tj3SaveImage8() if the value of #TJPARAM_DENSITYUNITS
|
|
|
+ * is `2`.
|
|
|
+ *
|
|
|
+ * @see TJPARAM_DENSITYUNITS
|
|
|
+ */
|
|
|
+ TJPARAM_XDENSITY,
|
|
|
+ /**
|
|
|
+ * JPEG vertical pixel density
|
|
|
+ *
|
|
|
+ * **Value**
|
|
|
+ * - The JPEG image has (decompression) or will have (compression) the
|
|
|
+ * specified vertical pixel density *[default for compression: `1`]*.
|
|
|
+ *
|
|
|
+ * This value is stored in or read from the JPEG header. It does not affect
|
|
|
+ * the contents of the JPEG image. Note that this parameter is set by
|
|
|
+ * #tj3LoadImage8() when loading a Windows BMP file that contains pixel
|
|
|
+ * density information, and the value of this parameter is stored to a
|
|
|
+ * Windows BMP file by #tj3SaveImage8() if the value of #TJPARAM_DENSITYUNITS
|
|
|
+ * is `2`.
|
|
|
+ *
|
|
|
+ * @see TJPARAM_DENSITYUNITS
|
|
|
+ */
|
|
|
+ TJPARAM_YDENSITY,
|
|
|
+ /**
|
|
|
+ * JPEG pixel density units
|
|
|
+ *
|
|
|
+ * **Value**
|
|
|
+ * - `0` *[default for compression]* The pixel density of the JPEG image is
|
|
|
+ * expressed (decompression) or will be expressed (compression) in unknown
|
|
|
+ * units.
|
|
|
+ * - `1` The pixel density of the JPEG image is expressed (decompression) or
|
|
|
+ * will be expressed (compression) in units of pixels/inch.
|
|
|
+ * - `2` The pixel density of the JPEG image is expressed (decompression) or
|
|
|
+ * will be expressed (compression) in units of pixels/cm.
|
|
|
+ *
|
|
|
+ * This value is stored in or read from the JPEG header. It does not affect
|
|
|
+ * the contents of the JPEG image. Note that this parameter is set by
|
|
|
+ * #tj3LoadImage8() when loading a Windows BMP file that contains pixel
|
|
|
+ * density information, and the value of this parameter is stored to a
|
|
|
+ * Windows BMP file by #tj3SaveImage8() if the value is `2`.
|
|
|
+ *
|
|
|
+ * @see TJPARAM_XDENSITY, TJPARAM_YDENSITY
|
|
|
+ */
|
|
|
+ TJPARAM_DENSITYUNITS,
|
|
|
+ /**
|
|
|
+ * Memory limit for intermediate buffers
|
|
|
+ *
|
|
|
+ * **Value**
|
|
|
+ * - the maximum amount of memory (in megabytes) that will be allocated for
|
|
|
+ * intermediate buffers, which are used with progressive JPEG compression and
|
|
|
+ * decompression, optimized baseline entropy coding, lossless JPEG
|
|
|
+ * compression, and lossless transformation *[default: `0` (no limit)]*
|
|
|
+ */
|
|
|
+ TJPARAM_MAXMEMORY,
|
|
|
+ /**
|
|
|
+ * Image size limit [decompression, lossless transformation, packed-pixel
|
|
|
+ * image loading]
|
|
|
+ *
|
|
|
+ * Setting this parameter will cause the decompression, transform, and image
|
|
|
+ * loading functions to return an error if the number of pixels in the source
|
|
|
+ * image exceeds the specified limit. This allows security-critical
|
|
|
+ * applications to guard against excessive memory consumption.
|
|
|
+ *
|
|
|
+ * **Value**
|
|
|
+ * - maximum number of pixels that the decompression, transform, and image
|
|
|
+ * loading functions will process *[default: `0` (no limit)]*
|
|
|
+ */
|
|
|
+ TJPARAM_MAXPIXELS
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * The number of error codes
|
|
|
+ */
|
|
|
+#define TJ_NUMERR 2
|
|
|
+
|
|
|
+/**
|
|
|
+ * Error codes
|
|
|
+ */
|
|
|
+enum TJERR {
|
|
|
+ /**
|
|
|
+ * The error was non-fatal and recoverable, but the destination image may
|
|
|
+ * still be corrupt.
|
|
|
+ */
|
|
|
+ TJERR_WARNING,
|
|
|
+ /**
|
|
|
+ * The error was fatal and non-recoverable.
|
|
|
+ */
|
|
|
+ TJERR_FATAL
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * The number of transform operations
|
|
|
+ */
|
|
|
+#define TJ_NUMXOP 8
|
|
|
+
|
|
|
+/**
|
|
|
+ * Transform operations for #tj3Transform()
|
|
|
+ */
|
|
|
+enum TJXOP {
|
|
|
+ /**
|
|
|
+ * Do not transform the position of the image pixels
|
|
|
+ */
|
|
|
+ TJXOP_NONE,
|
|
|
+ /**
|
|
|
+ * Flip (mirror) image horizontally. This transform is imperfect if there
|
|
|
+ * are any partial MCU blocks on the right edge (see #TJXOPT_PERFECT.)
|
|
|
+ */
|
|
|
+ TJXOP_HFLIP,
|
|
|
+ /**
|
|
|
+ * Flip (mirror) image vertically. This transform is imperfect if there are
|
|
|
+ * any partial MCU blocks on the bottom edge (see #TJXOPT_PERFECT.)
|
|
|
+ */
|
|
|
+ TJXOP_VFLIP,
|
|
|
+ /**
|
|
|
+ * Transpose image (flip/mirror along upper left to lower right axis.) This
|
|
|
+ * transform is always perfect.
|
|
|
+ */
|
|
|
+ TJXOP_TRANSPOSE,
|
|
|
+ /**
|
|
|
+ * Transverse transpose image (flip/mirror along upper right to lower left
|
|
|
+ * axis.) This transform is imperfect if there are any partial MCU blocks in
|
|
|
+ * the image (see #TJXOPT_PERFECT.)
|
|
|
+ */
|
|
|
+ TJXOP_TRANSVERSE,
|
|
|
+ /**
|
|
|
+ * Rotate image clockwise by 90 degrees. This transform is imperfect if
|
|
|
+ * there are any partial MCU blocks on the bottom edge (see
|
|
|
+ * #TJXOPT_PERFECT.)
|
|
|
+ */
|
|
|
+ TJXOP_ROT90,
|
|
|
+ /**
|
|
|
+ * Rotate image 180 degrees. This transform is imperfect if there are any
|
|
|
+ * partial MCU blocks in the image (see #TJXOPT_PERFECT.)
|
|
|
+ */
|
|
|
+ TJXOP_ROT180,
|
|
|
+ /**
|
|
|
+ * Rotate image counter-clockwise by 90 degrees. This transform is imperfect
|
|
|
+ * if there are any partial MCU blocks on the right edge (see
|
|
|
+ * #TJXOPT_PERFECT.)
|
|
|
+ */
|
|
|
+ TJXOP_ROT270
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * This option will cause #tj3Transform() to return an error if the transform
|
|
|
+ * is not perfect. Lossless transforms operate on MCU blocks, whose size
|
|
|
+ * depends on the level of chrominance subsampling used (see #tjMCUWidth and
|
|
|
+ * #tjMCUHeight.) If the image's width or height is not evenly divisible by
|
|
|
+ * the MCU block size, then there will be partial MCU blocks on the right
|
|
|
+ * and/or bottom edges. It is not possible to move these partial MCU blocks to
|
|
|
+ * the top or left of the image, so any transform that would require that is
|
|
|
+ * "imperfect." If this option is not specified, then any partial MCU blocks
|
|
|
+ * that cannot be transformed will be left in place, which will create
|
|
|
+ * odd-looking strips on the right or bottom edge of the image.
|
|
|
+ */
|
|
|
+#define TJXOPT_PERFECT (1 << 0)
|
|
|
+/**
|
|
|
+ * This option will cause #tj3Transform() to discard any partial MCU blocks
|
|
|
+ * that cannot be transformed.
|
|
|
+ */
|
|
|
+#define TJXOPT_TRIM (1 << 1)
|
|
|
+/**
|
|
|
+ * This option will enable lossless cropping. See #tj3Transform() for more
|
|
|
+ * information.
|
|
|
+ */
|
|
|
+#define TJXOPT_CROP (1 << 2)
|
|
|
+/**
|
|
|
+ * This option will discard the color data in the source image and produce a
|
|
|
+ * grayscale destination image.
|
|
|
+ */
|
|
|
+#define TJXOPT_GRAY (1 << 3)
|
|
|
+/**
|
|
|
+ * This option will prevent #tj3Transform() from outputting a JPEG image for
|
|
|
+ * this particular transform. (This can be used in conjunction with a custom
|
|
|
+ * filter to capture the transformed DCT coefficients without transcoding
|
|
|
+ * them.)
|
|
|
+ */
|
|
|
+#define TJXOPT_NOOUTPUT (1 << 4)
|
|
|
+/**
|
|
|
+ * This option will enable progressive entropy coding in the JPEG image
|
|
|
+ * generated by this particular transform. Progressive entropy coding will
|
|
|
+ * generally improve compression relative to baseline entropy coding (the
|
|
|
+ * default), but it will reduce decompression performance considerably.
|
|
|
+ * Can be combined with #TJXOPT_ARITHMETIC. Implies #TJXOPT_OPTIMIZE unless
|
|
|
+ * #TJXOPT_ARITHMETIC is also specified.
|
|
|
+ */
|
|
|
+#define TJXOPT_PROGRESSIVE (1 << 5)
|
|
|
+/**
|
|
|
+ * This option will prevent #tj3Transform() from copying any extra markers
|
|
|
+ * (including EXIF and ICC profile data) from the source image to the
|
|
|
+ * destination image.
|
|
|
+ */
|
|
|
+#define TJXOPT_COPYNONE (1 << 6)
|
|
|
+/**
|
|
|
+ * This option will enable arithmetic entropy coding in the JPEG image
|
|
|
+ * generated by this particular transform. Arithmetic entropy coding will
|
|
|
+ * generally improve compression relative to Huffman entropy coding (the
|
|
|
+ * default), but it will reduce decompression performance considerably. Can be
|
|
|
+ * combined with #TJXOPT_PROGRESSIVE.
|
|
|
+ */
|
|
|
+#define TJXOPT_ARITHMETIC (1 << 7)
|
|
|
+/**
|
|
|
+ * This option will enable optimized baseline entropy coding in the JPEG image
|
|
|
+ * generated by this particular transform. Optimized baseline entropy coding
|
|
|
+ * will improve compression slightly (generally 5% or less.)
|
|
|
+ */
|
|
|
+#define TJXOPT_OPTIMIZE (1 << 8)
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * Scaling factor
|
|
|
+ */
|
|
|
+typedef struct {
|
|
|
+ /**
|
|
|
+ * Numerator
|
|
|
+ */
|
|
|
+ int num;
|
|
|
+ /**
|
|
|
+ * Denominator
|
|
|
+ */
|
|
|
+ int denom;
|
|
|
+} tjscalingfactor;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Cropping region
|
|
|
+ */
|
|
|
+typedef struct {
|
|
|
+ /**
|
|
|
+ * The left boundary of the cropping region. This must be evenly divisible
|
|
|
+ * by the MCU block width (see #tjMCUWidth.)
|
|
|
+ */
|
|
|
+ int x;
|
|
|
+ /**
|
|
|
+ * The upper boundary of the cropping region. For lossless transformation,
|
|
|
+ * this must be evenly divisible by the MCU block height (see #tjMCUHeight.)
|
|
|
+ */
|
|
|
+ int y;
|
|
|
+ /**
|
|
|
+ * The width of the cropping region. Setting this to 0 is the equivalent of
|
|
|
+ * setting it to the width of the source JPEG image - x.
|
|
|
+ */
|
|
|
+ int w;
|
|
|
+ /**
|
|
|
+ * The height of the cropping region. Setting this to 0 is the equivalent of
|
|
|
+ * setting it to the height of the source JPEG image - y.
|
|
|
+ */
|
|
|
+ int h;
|
|
|
+} tjregion;
|
|
|
+
|
|
|
+/**
|
|
|
+ * A #tjregion structure that specifies no cropping
|
|
|
+ */
|
|
|
+static const tjregion TJUNCROPPED = { 0, 0, 0, 0 };
|
|
|
+
|
|
|
+/**
|
|
|
+ * Lossless transform
|
|
|
+ */
|
|
|
+typedef struct tjtransform {
|
|
|
+ /**
|
|
|
+ * Cropping region
|
|
|
+ */
|
|
|
+ tjregion r;
|
|
|
+ /**
|
|
|
+ * One of the @ref TJXOP "transform operations"
|
|
|
+ */
|
|
|
+ int op;
|
|
|
+ /**
|
|
|
+ * The bitwise OR of one of more of the @ref TJXOPT_ARITHMETIC
|
|
|
+ * "transform options"
|
|
|
+ */
|
|
|
+ int options;
|
|
|
+ /**
|
|
|
+ * Arbitrary data that can be accessed within the body of the callback
|
|
|
+ * function
|
|
|
+ */
|
|
|
+ void *data;
|
|
|
+ /**
|
|
|
+ * A callback function that can be used to modify the DCT coefficients after
|
|
|
+ * they are losslessly transformed but before they are transcoded to a new
|
|
|
+ * JPEG image. This allows for custom filters or other transformations to be
|
|
|
+ * applied in the frequency domain.
|
|
|
+ *
|
|
|
+ * @param coeffs pointer to an array of transformed DCT coefficients. (NOTE:
|
|
|
+ * this pointer is not guaranteed to be valid once the callback returns, so
|
|
|
+ * applications wishing to hand off the DCT coefficients to another function
|
|
|
+ * or library should make a copy of them within the body of the callback.)
|
|
|
+ *
|
|
|
+ * @param arrayRegion #tjregion structure containing the width and height of
|
|
|
+ * the array pointed to by `coeffs` as well as its offset relative to the
|
|
|
+ * component plane. TurboJPEG implementations may choose to split each
|
|
|
+ * component plane into multiple DCT coefficient arrays and call the callback
|
|
|
+ * function once for each array.
|
|
|
+ *
|
|
|
+ * @param planeRegion #tjregion structure containing the width and height of
|
|
|
+ * the component plane to which `coeffs` belongs
|
|
|
+ *
|
|
|
+ * @param componentID ID number of the component plane to which `coeffs`
|
|
|
+ * belongs. (Y, Cb, and Cr have, respectively, ID's of 0, 1, and 2 in
|
|
|
+ * typical JPEG images.)
|
|
|
+ *
|
|
|
+ * @param transformID ID number of the transformed image to which `coeffs`
|
|
|
+ * belongs. This is the same as the index of the transform in the
|
|
|
+ * `transforms` array that was passed to #tj3Transform().
|
|
|
+ *
|
|
|
+ * @param transform a pointer to a #tjtransform structure that specifies the
|
|
|
+ * parameters and/or cropping region for this transform
|
|
|
+ *
|
|
|
+ * @return 0 if the callback was successful, or -1 if an error occurred.
|
|
|
+ */
|
|
|
+ int (*customFilter) (short *coeffs, tjregion arrayRegion,
|
|
|
+ tjregion planeRegion, int componentID, int transformID,
|
|
|
+ struct tjtransform *transform);
|
|
|
+} tjtransform;
|
|
|
+
|
|
|
+/**
|
|
|
+ * TurboJPEG instance handle
|
|
|
+ */
|
|
|
+typedef void *tjhandle;
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * Compute the scaled value of `dimension` using the given scaling factor.
|
|
|
+ * This macro performs the integer equivalent of `ceil(dimension *
|
|
|
+ * scalingFactor)`.
|
|
|
+ */
|
|
|
+#define TJSCALED(dimension, scalingFactor) \
|
|
|
+ (((dimension) * scalingFactor.num + scalingFactor.denom - 1) / \
|
|
|
+ scalingFactor.denom)
|
|
|
+
|
|
|
+/**
|
|
|
+ * A #tjscalingfactor structure that specifies a scaling factor of 1/1 (no
|
|
|
+ * scaling)
|
|
|
+ */
|
|
|
+static const tjscalingfactor TJUNSCALED = { 1, 1 };
|
|
|
+
|
|
|
+
|
|
|
+#ifdef __cplusplus
|
|
|
+extern "C" {
|
|
|
+#endif
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * Create a new TurboJPEG instance.
|
|
|
+ *
|
|
|
+ * @param initType one of the @ref TJINIT "initialization options"
|
|
|
+ *
|
|
|
+ * @return a handle to the newly-created instance, or NULL if an error occurred
|
|
|
+ * (see #tj3GetErrorStr().)
|
|
|
+ */
|
|
|
+DLLEXPORT tjhandle tj3Init(int initType);
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * Set the value of a parameter.
|
|
|
+ *
|
|
|
+ * @param handle handle to a TurboJPEG instance
|
|
|
+ *
|
|
|
+ * @param param one of the @ref TJPARAM "parameters"
|
|
|
+ *
|
|
|
+ * @param value value of the parameter (refer to @ref TJPARAM
|
|
|
+ * "parameter documentation")
|
|
|
+ *
|
|
|
+ * @return 0 if successful, or -1 if an error occurred (see #tj3GetErrorStr().)
|
|
|
+ */
|
|
|
+DLLEXPORT int tj3Set(tjhandle handle, int param, int value);
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * Get the value of a parameter.
|
|
|
+ *
|
|
|
+ * @param handle handle to a TurboJPEG instance
|
|
|
+ *
|
|
|
+ * @param param one of the @ref TJPARAM "parameters"
|
|
|
+ *
|
|
|
+ * @return the value of the specified parameter, or -1 if the value is unknown.
|
|
|
+ */
|
|
|
+DLLEXPORT int tj3Get(tjhandle handle, int param);
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * Compress an 8-bit-per-sample packed-pixel RGB, grayscale, or CMYK image into
|
|
|
+ * an 8-bit-per-sample JPEG image.
|
|
|
+ *
|
|
|
+ * @param handle handle to a TurboJPEG instance that has been initialized for
|
|
|
+ * compression
|
|
|
+ *
|
|
|
+ * @param srcBuf pointer to a buffer containing a packed-pixel RGB, grayscale,
|
|
|
+ * or CMYK source image to be compressed. This buffer should normally be
|
|
|
+ * `pitch * height` samples in size. However, you can also use this parameter
|
|
|
+ * to compress from a specific region of a larger buffer.
|
|
|
+ *
|
|
|
+ * @param width width (in pixels) of the source image
|
|
|
+ *
|
|
|
+ * @param pitch samples per row in the source image. Normally this should be
|
|
|
+ * <tt>width * #tjPixelSize[pixelFormat]</tt>, if the image is unpadded.
|
|
|
+ * (Setting this parameter to 0 is the equivalent of setting it to
|
|
|
+ * <tt>width * #tjPixelSize[pixelFormat]</tt>.) However, you can also use this
|
|
|
+ * parameter to specify the row alignment/padding of the source image, to skip
|
|
|
+ * rows, or to compress from a specific region of a larger buffer.
|
|
|
+ *
|
|
|
+ * @param height height (in pixels) of the source image
|
|
|
+ *
|
|
|
+ * @param pixelFormat pixel format of the source image (see @ref TJPF
|
|
|
+ * "Pixel formats".)
|
|
|
+ *
|
|
|
+ * @param jpegBuf address of a pointer to a byte buffer that will receive the
|
|
|
+ * JPEG image. TurboJPEG has the ability to reallocate the JPEG buffer to
|
|
|
+ * accommodate the size of the JPEG image. Thus, you can choose to:
|
|
|
+ * -# pre-allocate the JPEG buffer with an arbitrary size using #tj3Alloc() and
|
|
|
+ * let TurboJPEG grow the buffer as needed,
|
|
|
+ * -# set `*jpegBuf` to NULL to tell TurboJPEG to allocate the buffer for you,
|
|
|
+ * or
|
|
|
+ * -# pre-allocate the buffer to a "worst case" size determined by calling
|
|
|
+ * #tj3JPEGBufSize(). This should ensure that the buffer never has to be
|
|
|
+ * re-allocated. (Setting #TJPARAM_NOREALLOC guarantees that it won't be.)
|
|
|
+ * .
|
|
|
+ * If you choose option 1, then `*jpegSize` should be set to the size of your
|
|
|
+ * pre-allocated buffer. In any case, unless you have set #TJPARAM_NOREALLOC,
|
|
|
+ * you should always check `*jpegBuf` upon return from this function, as it may
|
|
|
+ * have changed.
|
|
|
+ *
|
|
|
+ * @param jpegSize pointer to a size_t variable that holds the size of the JPEG
|
|
|
+ * buffer. If `*jpegBuf` points to a pre-allocated buffer, then `*jpegSize`
|
|
|
+ * should be set to the size of the buffer. Upon return, `*jpegSize` will
|
|
|
+ * contain the size of the JPEG image (in bytes.) If `*jpegBuf` points to a
|
|
|
+ * JPEG buffer that is being reused from a previous call to one of the JPEG
|
|
|
+ * compression functions, then `*jpegSize` is ignored.
|
|
|
+ *
|
|
|
+ * @return 0 if successful, or -1 if an error occurred (see #tj3GetErrorStr()
|
|
|
+ * and #tj3GetErrorCode().)
|
|
|
+ */
|
|
|
+DLLEXPORT int tj3Compress8(tjhandle handle, const unsigned char *srcBuf,
|
|
|
+ int width, int pitch, int height, int pixelFormat,
|
|
|
+ unsigned char **jpegBuf, size_t *jpegSize);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Compress a 12-bit-per-sample packed-pixel RGB, grayscale, or CMYK image into
|
|
|
+ * a 12-bit-per-sample JPEG image.
|
|
|
+ *
|
|
|
+ * \details \copydetails tj3Compress8()
|
|
|
+ */
|
|
|
+DLLEXPORT int tj3Compress12(tjhandle handle, const short *srcBuf, int width,
|
|
|
+ int pitch, int height, int pixelFormat,
|
|
|
+ unsigned char **jpegBuf, size_t *jpegSize);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Compress a 16-bit-per-sample packed-pixel RGB, grayscale, or CMYK image into
|
|
|
+ * a 16-bit-per-sample lossless JPEG image.
|
|
|
+ *
|
|
|
+ * \details \copydetails tj3Compress8()
|
|
|
+ */
|
|
|
+DLLEXPORT int tj3Compress16(tjhandle handle, const unsigned short *srcBuf,
|
|
|
+ int width, int pitch, int height, int pixelFormat,
|
|
|
+ unsigned char **jpegBuf, size_t *jpegSize);
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * Compress an 8-bit-per-sample unified planar YUV image into an
|
|
|
+ * 8-bit-per-sample JPEG image.
|
|
|
+ *
|
|
|
+ * @param handle handle to a TurboJPEG instance that has been initialized for
|
|
|
+ * compression
|
|
|
+ *
|
|
|
+ * @param srcBuf pointer to a buffer containing a unified planar YUV source
|
|
|
+ * image to be compressed. The size of this buffer should match the value
|
|
|
+ * returned by #tj3YUVBufSize() for the given image width, height, row
|
|
|
+ * alignment, and level of chrominance subsampling (see #TJPARAM_SUBSAMP.) The
|
|
|
+ * Y, U (Cb), and V (Cr) image planes should be stored sequentially in the
|
|
|
+ * buffer. (Refer to @ref YUVnotes "YUV Image Format Notes".)
|
|
|
+ *
|
|
|
+ * @param width width (in pixels) of the source image. If the width is not an
|
|
|
+ * even multiple of the MCU block width (see #tjMCUWidth), then an intermediate
|
|
|
+ * buffer copy will be performed.
|
|
|
+ *
|
|
|
+ * @param align row alignment (in bytes) of the source image (must be a power
|
|
|
+ * of 2.) Setting this parameter to n indicates that each row in each plane of
|
|
|
+ * the source image is padded to the nearest multiple of n bytes
|
|
|
+ * (1 = unpadded.)
|
|
|
+ *
|
|
|
+ * @param height height (in pixels) of the source image. If the height is not
|
|
|
+ * an even multiple of the MCU block height (see #tjMCUHeight), then an
|
|
|
+ * intermediate buffer copy will be performed.
|
|
|
+ *
|
|
|
+ * @param jpegBuf address of a pointer to a byte buffer that will receive the
|
|
|
+ * JPEG image. TurboJPEG has the ability to reallocate the JPEG buffer to
|
|
|
+ * accommodate the size of the JPEG image. Thus, you can choose to:
|
|
|
+ * -# pre-allocate the JPEG buffer with an arbitrary size using #tj3Alloc() and
|
|
|
+ * let TurboJPEG grow the buffer as needed,
|
|
|
+ * -# set `*jpegBuf` to NULL to tell TurboJPEG to allocate the buffer for you,
|
|
|
+ * or
|
|
|
+ * -# pre-allocate the buffer to a "worst case" size determined by calling
|
|
|
+ * #tj3JPEGBufSize(). This should ensure that the buffer never has to be
|
|
|
+ * re-allocated. (Setting #TJPARAM_NOREALLOC guarantees that it won't be.)
|
|
|
+ * .
|
|
|
+ * If you choose option 1, then `*jpegSize` should be set to the size of your
|
|
|
+ * pre-allocated buffer. In any case, unless you have set #TJPARAM_NOREALLOC,
|
|
|
+ * you should always check `*jpegBuf` upon return from this function, as it may
|
|
|
+ * have changed.
|
|
|
+ *
|
|
|
+ * @param jpegSize pointer to a size_t variable that holds the size of the JPEG
|
|
|
+ * buffer. If `*jpegBuf` points to a pre-allocated buffer, then `*jpegSize`
|
|
|
+ * should be set to the size of the buffer. Upon return, `*jpegSize` will
|
|
|
+ * contain the size of the JPEG image (in bytes.) If `*jpegBuf` points to a
|
|
|
+ * JPEG buffer that is being reused from a previous call to one of the JPEG
|
|
|
+ * compression functions, then `*jpegSize` is ignored.
|
|
|
+ *
|
|
|
+ * @return 0 if successful, or -1 if an error occurred (see #tj3GetErrorStr()
|
|
|
+ * and #tj3GetErrorCode().)
|
|
|
+ */
|
|
|
+DLLEXPORT int tj3CompressFromYUV8(tjhandle handle,
|
|
|
+ const unsigned char *srcBuf, int width,
|
|
|
+ int align, int height,
|
|
|
+ unsigned char **jpegBuf, size_t *jpegSize);
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * Compress a set of 8-bit-per-sample Y, U (Cb), and V (Cr) image planes into
|
|
|
+ * an 8-bit-per-sample JPEG image.
|
|
|
+ *
|
|
|
+ * @param handle handle to a TurboJPEG instance that has been initialized for
|
|
|
+ * compression
|
|
|
+ *
|
|
|
+ * @param srcPlanes an array of pointers to Y, U (Cb), and V (Cr) image planes
|
|
|
+ * (or just a Y plane, if compressing a grayscale image) that contain a YUV
|
|
|
+ * source image to be compressed. These planes can be contiguous or
|
|
|
+ * non-contiguous in memory. The size of each plane should match the value
|
|
|
+ * returned by #tj3YUVPlaneSize() for the given image width, height, strides,
|
|
|
+ * and level of chrominance subsampling (see #TJPARAM_SUBSAMP.) Refer to
|
|
|
+ * @ref YUVnotes "YUV Image Format Notes" for more details.
|
|
|
+ *
|
|
|
+ * @param width width (in pixels) of the source image. If the width is not an
|
|
|
+ * even multiple of the MCU block width (see #tjMCUWidth), then an intermediate
|
|
|
+ * buffer copy will be performed.
|
|
|
+ *
|
|
|
+ * @param strides an array of integers, each specifying the number of bytes per
|
|
|
+ * row in the corresponding plane of the YUV source image. Setting the stride
|
|
|
+ * for any plane to 0 is the same as setting it to the plane width (see
|
|
|
+ * @ref YUVnotes "YUV Image Format Notes".) If `strides` is NULL, then the
|
|
|
+ * strides for all planes will be set to their respective plane widths. You
|
|
|
+ * can adjust the strides in order to specify an arbitrary amount of row
|
|
|
+ * padding in each plane or to create a JPEG image from a subregion of a larger
|
|
|
+ * planar YUV image.
|
|
|
+ *
|
|
|
+ * @param height height (in pixels) of the source image. If the height is not
|
|
|
+ * an even multiple of the MCU block height (see #tjMCUHeight), then an
|
|
|
+ * intermediate buffer copy will be performed.
|
|
|
+ *
|
|
|
+ * @param jpegBuf address of a pointer to a byte buffer that will receive the
|
|
|
+ * JPEG image. TurboJPEG has the ability to reallocate the JPEG buffer to
|
|
|
+ * accommodate the size of the JPEG image. Thus, you can choose to:
|
|
|
+ * -# pre-allocate the JPEG buffer with an arbitrary size using #tj3Alloc() and
|
|
|
+ * let TurboJPEG grow the buffer as needed,
|
|
|
+ * -# set `*jpegBuf` to NULL to tell TurboJPEG to allocate the buffer for you,
|
|
|
+ * or
|
|
|
+ * -# pre-allocate the buffer to a "worst case" size determined by calling
|
|
|
+ * #tj3JPEGBufSize(). This should ensure that the buffer never has to be
|
|
|
+ * re-allocated. (Setting #TJPARAM_NOREALLOC guarantees that it won't be.)
|
|
|
+ * .
|
|
|
+ * If you choose option 1, then `*jpegSize` should be set to the size of your
|
|
|
+ * pre-allocated buffer. In any case, unless you have set #TJPARAM_NOREALLOC,
|
|
|
+ * you should always check `*jpegBuf` upon return from this function, as it may
|
|
|
+ * have changed.
|
|
|
+ *
|
|
|
+ * @param jpegSize pointer to a size_t variable that holds the size of the JPEG
|
|
|
+ * buffer. If `*jpegBuf` points to a pre-allocated buffer, then `*jpegSize`
|
|
|
+ * should be set to the size of the buffer. Upon return, `*jpegSize` will
|
|
|
+ * contain the size of the JPEG image (in bytes.) If `*jpegBuf` points to a
|
|
|
+ * JPEG buffer that is being reused from a previous call to one of the JPEG
|
|
|
+ * compression functions, then `*jpegSize` is ignored.
|
|
|
+ *
|
|
|
+ * @return 0 if successful, or -1 if an error occurred (see #tj3GetErrorStr()
|
|
|
+ * and #tj3GetErrorCode().)
|
|
|
+ */
|
|
|
+DLLEXPORT int tj3CompressFromYUVPlanes8(tjhandle handle,
|
|
|
+ const unsigned char * const *srcPlanes,
|
|
|
+ int width, const int *strides,
|
|
|
+ int height, unsigned char **jpegBuf,
|
|
|
+ size_t *jpegSize);
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * The maximum size of the buffer (in bytes) required to hold a JPEG image with
|
|
|
+ * the given parameters. The number of bytes returned by this function is
|
|
|
+ * larger than the size of the uncompressed source image. The reason for this
|
|
|
+ * is that the JPEG format uses 16-bit coefficients, so it is possible for a
|
|
|
+ * very high-quality source image with very high-frequency content to expand
|
|
|
+ * rather than compress when converted to the JPEG format. Such images
|
|
|
+ * represent very rare corner cases, but since there is no way to predict the
|
|
|
+ * size of a JPEG image prior to compression, the corner cases have to be
|
|
|
+ * handled.
|
|
|
+ *
|
|
|
+ * @param width width (in pixels) of the image
|
|
|
+ *
|
|
|
+ * @param height height (in pixels) of the image
|
|
|
+ *
|
|
|
+ * @param jpegSubsamp the level of chrominance subsampling to be used when
|
|
|
+ * generating the JPEG image (see @ref TJSAMP
|
|
|
+ * "Chrominance subsampling options".) #TJSAMP_UNKNOWN is treated like
|
|
|
+ * #TJSAMP_444, since a buffer large enough to hold a JPEG image with no
|
|
|
+ * subsampling should also be large enough to hold a JPEG image with an
|
|
|
+ * arbitrary level of subsampling. Note that lossless JPEG images always
|
|
|
+ * use #TJSAMP_444.
|
|
|
+ *
|
|
|
+ * @return the maximum size of the buffer (in bytes) required to hold the
|
|
|
+ * image, or 0 if the arguments are out of bounds.
|
|
|
+ */
|
|
|
+DLLEXPORT size_t tj3JPEGBufSize(int width, int height, int jpegSubsamp);
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * The size of the buffer (in bytes) required to hold a unified planar YUV
|
|
|
+ * image with the given parameters.
|
|
|
+ *
|
|
|
+ * @param width width (in pixels) of the image
|
|
|
+ *
|
|
|
+ * @param align row alignment (in bytes) of the image (must be a power of 2.)
|
|
|
+ * Setting this parameter to n specifies that each row in each plane of the
|
|
|
+ * image will be padded to the nearest multiple of n bytes (1 = unpadded.)
|
|
|
+ *
|
|
|
+ * @param height height (in pixels) of the image
|
|
|
+ *
|
|
|
+ * @param subsamp level of chrominance subsampling in the image (see
|
|
|
+ * @ref TJSAMP "Chrominance subsampling options".)
|
|
|
+ *
|
|
|
+ * @return the size of the buffer (in bytes) required to hold the image, or 0
|
|
|
+ * if the arguments are out of bounds.
|
|
|
+ */
|
|
|
+DLLEXPORT size_t tj3YUVBufSize(int width, int align, int height, int subsamp);
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * The size of the buffer (in bytes) required to hold a YUV image plane with
|
|
|
+ * the given parameters.
|
|
|
+ *
|
|
|
+ * @param componentID ID number of the image plane (0 = Y, 1 = U/Cb, 2 = V/Cr)
|
|
|
+ *
|
|
|
+ * @param width width (in pixels) of the YUV image. NOTE: this is the width of
|
|
|
+ * the whole image, not the plane width.
|
|
|
+ *
|
|
|
+ * @param stride bytes per row in the image plane. Setting this to 0 is the
|
|
|
+ * equivalent of setting it to the plane width.
|
|
|
+ *
|
|
|
+ * @param height height (in pixels) of the YUV image. NOTE: this is the height
|
|
|
+ * of the whole image, not the plane height.
|
|
|
+ *
|
|
|
+ * @param subsamp level of chrominance subsampling in the image (see
|
|
|
+ * @ref TJSAMP "Chrominance subsampling options".)
|
|
|
+ *
|
|
|
+ * @return the size of the buffer (in bytes) required to hold the YUV image
|
|
|
+ * plane, or 0 if the arguments are out of bounds.
|
|
|
+ */
|
|
|
+DLLEXPORT size_t tj3YUVPlaneSize(int componentID, int width, int stride,
|
|
|
+ int height, int subsamp);
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * The plane width of a YUV image plane with the given parameters. Refer to
|
|
|
+ * @ref YUVnotes "YUV Image Format Notes" for a description of plane width.
|
|
|
+ *
|
|
|
+ * @param componentID ID number of the image plane (0 = Y, 1 = U/Cb, 2 = V/Cr)
|
|
|
+ *
|
|
|
+ * @param width width (in pixels) of the YUV image
|
|
|
+ *
|
|
|
+ * @param subsamp level of chrominance subsampling in the image (see
|
|
|
+ * @ref TJSAMP "Chrominance subsampling options".)
|
|
|
+ *
|
|
|
+ * @return the plane width of a YUV image plane with the given parameters, or 0
|
|
|
+ * if the arguments are out of bounds.
|
|
|
+ */
|
|
|
+DLLEXPORT int tj3YUVPlaneWidth(int componentID, int width, int subsamp);
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * The plane height of a YUV image plane with the given parameters. Refer to
|
|
|
+ * @ref YUVnotes "YUV Image Format Notes" for a description of plane height.
|
|
|
+ *
|
|
|
+ * @param componentID ID number of the image plane (0 = Y, 1 = U/Cb, 2 = V/Cr)
|
|
|
+ *
|
|
|
+ * @param height height (in pixels) of the YUV image
|
|
|
+ *
|
|
|
+ * @param subsamp level of chrominance subsampling in the image (see
|
|
|
+ * @ref TJSAMP "Chrominance subsampling options".)
|
|
|
+ *
|
|
|
+ * @return the plane height of a YUV image plane with the given parameters, or
|
|
|
+ * 0 if the arguments are out of bounds.
|
|
|
+ */
|
|
|
+DLLEXPORT int tj3YUVPlaneHeight(int componentID, int height, int subsamp);
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * Encode an 8-bit-per-sample packed-pixel RGB or grayscale image into an
|
|
|
+ * 8-bit-per-sample unified planar YUV image. This function performs color
|
|
|
+ * conversion (which is accelerated in the libjpeg-turbo implementation) but
|
|
|
+ * does not execute any of the other steps in the JPEG compression process.
|
|
|
+ *
|
|
|
+ * @param handle handle to a TurboJPEG instance that has been initialized for
|
|
|
+ * compression
|
|
|
+ *
|
|
|
+ * @param srcBuf pointer to a buffer containing a packed-pixel RGB or grayscale
|
|
|
+ * source image to be encoded. This buffer should normally be `pitch * height`
|
|
|
+ * bytes in size. However, you can also use this parameter to encode from a
|
|
|
+ * specific region of a larger buffer.
|
|
|
+ *
|
|
|
+ * @param width width (in pixels) of the source image
|
|
|
+ *
|
|
|
+ * @param pitch bytes per row in the source image. Normally this should be
|
|
|
+ * <tt>width * #tjPixelSize[pixelFormat]</tt>, if the image is unpadded.
|
|
|
+ * (Setting this parameter to 0 is the equivalent of setting it to
|
|
|
+ * <tt>width * #tjPixelSize[pixelFormat]</tt>.) However, you can also use this
|
|
|
+ * parameter to specify the row alignment/padding of the source image, to skip
|
|
|
+ * rows, or to encode from a specific region of a larger packed-pixel image.
|
|
|
+ *
|
|
|
+ * @param height height (in pixels) of the source image
|
|
|
+ *
|
|
|
+ * @param pixelFormat pixel format of the source image (see @ref TJPF
|
|
|
+ * "Pixel formats".)
|
|
|
+ *
|
|
|
+ * @param dstBuf pointer to a buffer that will receive the unified planar YUV
|
|
|
+ * image. Use #tj3YUVBufSize() to determine the appropriate size for this
|
|
|
+ * buffer based on the image width, height, row alignment, and level of
|
|
|
+ * chrominance subsampling (see #TJPARAM_SUBSAMP.) The Y, U (Cb), and V (Cr)
|
|
|
+ * image planes will be stored sequentially in the buffer. (Refer to
|
|
|
+ * @ref YUVnotes "YUV Image Format Notes".)
|
|
|
+ *
|
|
|
+ * @param align row alignment (in bytes) of the YUV image (must be a power of
|
|
|
+ * 2.) Setting this parameter to n will cause each row in each plane of the
|
|
|
+ * YUV image to be padded to the nearest multiple of n bytes (1 = unpadded.)
|
|
|
+ * To generate images suitable for X Video, `align` should be set to 4.
|
|
|
+ *
|
|
|
+ * @return 0 if successful, or -1 if an error occurred (see #tj3GetErrorStr()
|
|
|
+ * and #tj3GetErrorCode().)
|
|
|
+ */
|
|
|
+DLLEXPORT int tj3EncodeYUV8(tjhandle handle, const unsigned char *srcBuf,
|
|
|
+ int width, int pitch, int height, int pixelFormat,
|
|
|
+ unsigned char *dstBuf, int align);
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * Encode an 8-bit-per-sample packed-pixel RGB or grayscale image into separate
|
|
|
+ * 8-bit-per-sample Y, U (Cb), and V (Cr) image planes. This function performs
|
|
|
+ * color conversion (which is accelerated in the libjpeg-turbo implementation)
|
|
|
+ * but does not execute any of the other steps in the JPEG compression process.
|
|
|
+ *
|
|
|
+ * @param handle handle to a TurboJPEG instance that has been initialized for
|
|
|
+ * compression
|
|
|
+ *
|
|
|
+ * @param srcBuf pointer to a buffer containing a packed-pixel RGB or grayscale
|
|
|
+ * source image to be encoded. This buffer should normally be `pitch * height`
|
|
|
+ * bytes in size. However, you can also use this parameter to encode from a
|
|
|
+ * specific region of a larger buffer.
|
|
|
+ *
|
|
|
+ *
|
|
|
+ * @param width width (in pixels) of the source image
|
|
|
+ *
|
|
|
+ * @param pitch bytes per row in the source image. Normally this should be
|
|
|
+ * <tt>width * #tjPixelSize[pixelFormat]</tt>, if the image is unpadded.
|
|
|
+ * (Setting this parameter to 0 is the equivalent of setting it to
|
|
|
+ * <tt>width * #tjPixelSize[pixelFormat]</tt>.) However, you can also use this
|
|
|
+ * parameter to specify the row alignment/padding of the source image, to skip
|
|
|
+ * rows, or to encode from a specific region of a larger packed-pixel image.
|
|
|
+ *
|
|
|
+ * @param height height (in pixels) of the source image
|
|
|
+ *
|
|
|
+ * @param pixelFormat pixel format of the source image (see @ref TJPF
|
|
|
+ * "Pixel formats".)
|
|
|
+ *
|
|
|
+ * @param dstPlanes an array of pointers to Y, U (Cb), and V (Cr) image planes
|
|
|
+ * (or just a Y plane, if generating a grayscale image) that will receive the
|
|
|
+ * encoded image. These planes can be contiguous or non-contiguous in memory.
|
|
|
+ * Use #tj3YUVPlaneSize() to determine the appropriate size for each plane
|
|
|
+ * based on the image width, height, strides, and level of chrominance
|
|
|
+ * subsampling (see #TJPARAM_SUBSAMP.) Refer to @ref YUVnotes
|
|
|
+ * "YUV Image Format Notes" for more details.
|
|
|
+ *
|
|
|
+ * @param strides an array of integers, each specifying the number of bytes per
|
|
|
+ * row in the corresponding plane of the YUV image. Setting the stride for any
|
|
|
+ * plane to 0 is the same as setting it to the plane width (see @ref YUVnotes
|
|
|
+ * "YUV Image Format Notes".) If `strides` is NULL, then the strides for all
|
|
|
+ * planes will be set to their respective plane widths. You can adjust the
|
|
|
+ * strides in order to add an arbitrary amount of row padding to each plane or
|
|
|
+ * to encode an RGB or grayscale image into a subregion of a larger planar YUV
|
|
|
+ * image.
|
|
|
+ *
|
|
|
+ * @return 0 if successful, or -1 if an error occurred (see #tj3GetErrorStr()
|
|
|
+ * and #tj3GetErrorCode().)
|
|
|
+ */
|
|
|
+DLLEXPORT int tj3EncodeYUVPlanes8(tjhandle handle, const unsigned char *srcBuf,
|
|
|
+ int width, int pitch, int height,
|
|
|
+ int pixelFormat, unsigned char **dstPlanes,
|
|
|
+ int *strides);
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * Retrieve information about a JPEG image without decompressing it, or prime
|
|
|
+ * the decompressor with quantization and Huffman tables. If a JPEG image is
|
|
|
+ * passed to this function, then the @ref TJPARAM "parameters" that describe
|
|
|
+ * the JPEG image will be set when the function returns.
|
|
|
+ *
|
|
|
+ * @param handle handle to a TurboJPEG instance that has been initialized for
|
|
|
+ * decompression
|
|
|
+ *
|
|
|
+ * @param jpegBuf pointer to a byte buffer containing a JPEG image or an
|
|
|
+ * "abbreviated table specification" (AKA "tables-only") datastream. Passing a
|
|
|
+ * tables-only datastream to this function primes the decompressor with
|
|
|
+ * quantization and Huffman tables that can be used when decompressing
|
|
|
+ * subsequent "abbreviated image" datastreams. This is useful, for instance,
|
|
|
+ * when decompressing video streams in which all frames share the same
|
|
|
+ * quantization and Huffman tables.
|
|
|
+ *
|
|
|
+ * @param jpegSize size of the JPEG image or tables-only datastream (in bytes)
|
|
|
+ *
|
|
|
+ * @return 0 if successful, or -1 if an error occurred (see #tj3GetErrorStr()
|
|
|
+ * and #tj3GetErrorCode().)
|
|
|
+ */
|
|
|
+DLLEXPORT int tj3DecompressHeader(tjhandle handle,
|
|
|
+ const unsigned char *jpegBuf,
|
|
|
+ size_t jpegSize);
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * Returns a list of fractional scaling factors that the JPEG decompressor
|
|
|
+ * supports.
|
|
|
+ *
|
|
|
+ * @param numScalingFactors pointer to an integer variable that will receive
|
|
|
+ * the number of elements in the list
|
|
|
+ *
|
|
|
+ * @return a pointer to a list of fractional scaling factors, or NULL if an
|
|
|
+ * error is encountered (see #tj3GetErrorStr().)
|
|
|
+ */
|
|
|
+DLLEXPORT tjscalingfactor *tj3GetScalingFactors(int *numScalingFactors);
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * Set the scaling factor for subsequent lossy decompression operations.
|
|
|
+ *
|
|
|
+ * @param handle handle to a TurboJPEG instance that has been initialized for
|
|
|
+ * decompression
|
|
|
+ *
|
|
|
+ * @param scalingFactor #tjscalingfactor structure that specifies a fractional
|
|
|
+ * scaling factor that the decompressor supports (see #tj3GetScalingFactors()),
|
|
|
+ * or <tt>#TJUNSCALED</tt> for no scaling. Decompression scaling is a function
|
|
|
+ * of the IDCT algorithm, so scaling factors are generally limited to multiples
|
|
|
+ * of 1/8. If the entire JPEG image will be decompressed, then the width and
|
|
|
+ * height of the scaled destination image can be determined by calling
|
|
|
+ * #TJSCALED() with the JPEG width and height (see #TJPARAM_JPEGWIDTH and
|
|
|
+ * #TJPARAM_JPEGHEIGHT) and the specified scaling factor. When decompressing
|
|
|
+ * into a planar YUV image, an intermediate buffer copy will be performed if
|
|
|
+ * the width or height of the scaled destination image is not an even multiple
|
|
|
+ * of the MCU block size (see #tjMCUWidth and #tjMCUHeight.) Note that
|
|
|
+ * decompression scaling is not available (and the specified scaling factor is
|
|
|
+ * ignored) when decompressing lossless JPEG images (see #TJPARAM_LOSSLESS),
|
|
|
+ * since the IDCT algorithm is not used with those images. Note also that
|
|
|
+ * #TJPARAM_FASTDCT is ignored when decompression scaling is enabled.
|
|
|
+ *
|
|
|
+ * @return 0 if successful, or -1 if an error occurred (see #tj3GetErrorStr().)
|
|
|
+ */
|
|
|
+DLLEXPORT int tj3SetScalingFactor(tjhandle handle,
|
|
|
+ tjscalingfactor scalingFactor);
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * Set the cropping region for partially decompressing a lossy JPEG image into
|
|
|
+ * a packed-pixel image
|
|
|
+ *
|
|
|
+ * @param handle handle to a TurboJPEG instance that has been initialized for
|
|
|
+ * decompression
|
|
|
+ *
|
|
|
+ * @param croppingRegion #tjregion structure that specifies a subregion of the
|
|
|
+ * JPEG image to decompress, or <tt>#TJUNCROPPED</tt> for no cropping. The
|
|
|
+ * left boundary of the cropping region must be evenly divisible by the scaled
|
|
|
+ * MCU block width (<tt>#TJSCALED(#tjMCUWidth[subsamp], scalingFactor)</tt>,
|
|
|
+ * where `subsamp` is the level of chrominance subsampling in the JPEG image
|
|
|
+ * (see #TJPARAM_SUBSAMP) and `scalingFactor` is the decompression scaling
|
|
|
+ * factor (see #tj3SetScalingFactor().) The cropping region should be
|
|
|
+ * specified relative to the scaled image dimensions. Unless `croppingRegion`
|
|
|
+ * is <tt>#TJUNCROPPED</tt>, the JPEG header must be read (see
|
|
|
+ * #tj3DecompressHeader()) prior to calling this function.
|
|
|
+ *
|
|
|
+ * @return 0 if successful, or -1 if an error occurred (see #tj3GetErrorStr().)
|
|
|
+ */
|
|
|
+DLLEXPORT int tj3SetCroppingRegion(tjhandle handle, tjregion croppingRegion);
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * Decompress an 8-bit-per-sample JPEG image into an 8-bit-per-sample
|
|
|
+ * packed-pixel RGB, grayscale, or CMYK image. The @ref TJPARAM "parameters"
|
|
|
+ * that describe the JPEG image will be set when this function returns.
|
|
|
+ *
|
|
|
+ * @param handle handle to a TurboJPEG instance that has been initialized for
|
|
|
+ * decompression
|
|
|
+ *
|
|
|
+ * @param jpegBuf pointer to a byte buffer containing the JPEG image to
|
|
|
+ * decompress
|
|
|
+ *
|
|
|
+ * @param jpegSize size of the JPEG image (in bytes)
|
|
|
+ *
|
|
|
+ * @param dstBuf pointer to a buffer that will receive the packed-pixel
|
|
|
+ * decompressed image. This buffer should normally be
|
|
|
+ * `pitch * destinationHeight` samples in size. However, you can also use this
|
|
|
+ * parameter to decompress into a specific region of a larger buffer. NOTE:
|
|
|
+ * If the JPEG image is lossy, then `destinationHeight` is either the scaled
|
|
|
+ * JPEG height (see #TJSCALED(), #TJPARAM_JPEGHEIGHT, and
|
|
|
+ * #tj3SetScalingFactor()) or the height of the cropping region (see
|
|
|
+ * #tj3SetCroppingRegion().) If the JPEG image is lossless, then
|
|
|
+ * `destinationHeight` is the JPEG height.
|
|
|
+ *
|
|
|
+ * @param pitch samples per row in the destination image. Normally this should
|
|
|
+ * be set to <tt>destinationWidth * #tjPixelSize[pixelFormat]</tt>, if the
|
|
|
+ * destination image should be unpadded. (Setting this parameter to 0 is the
|
|
|
+ * equivalent of setting it to
|
|
|
+ * <tt>destinationWidth * #tjPixelSize[pixelFormat]</tt>.) However, you can
|
|
|
+ * also use this parameter to specify the row alignment/padding of the
|
|
|
+ * destination image, to skip rows, or to decompress into a specific region of
|
|
|
+ * a larger buffer. NOTE: If the JPEG image is lossy, then `destinationWidth`
|
|
|
+ * is either the scaled JPEG width (see #TJSCALED(), #TJPARAM_JPEGWIDTH, and
|
|
|
+ * #tj3SetScalingFactor()) or the width of the cropping region (see
|
|
|
+ * #tj3SetCroppingRegion().) If the JPEG image is lossless, then
|
|
|
+ * `destinationWidth` is the JPEG width.
|
|
|
+ *
|
|
|
+ * @param pixelFormat pixel format of the destination image (see @ref
|
|
|
+ * TJPF "Pixel formats".)
|
|
|
+ *
|
|
|
+ * @return 0 if successful, or -1 if an error occurred (see #tj3GetErrorStr()
|
|
|
+ * and #tj3GetErrorCode().)
|
|
|
+ */
|
|
|
+DLLEXPORT int tj3Decompress8(tjhandle handle, const unsigned char *jpegBuf,
|
|
|
+ size_t jpegSize, unsigned char *dstBuf, int pitch,
|
|
|
+ int pixelFormat);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Decompress a 12-bit-per-sample JPEG image into a 12-bit-per-sample
|
|
|
+ * packed-pixel RGB, grayscale, or CMYK image.
|
|
|
+ *
|
|
|
+ * \details \copydetails tj3Decompress8()
|
|
|
+ */
|
|
|
+DLLEXPORT int tj3Decompress12(tjhandle handle, const unsigned char *jpegBuf,
|
|
|
+ size_t jpegSize, short *dstBuf, int pitch,
|
|
|
+ int pixelFormat);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Decompress a 16-bit-per-sample lossless JPEG image into a 16-bit-per-sample
|
|
|
+ * packed-pixel RGB, grayscale, or CMYK image.
|
|
|
+ *
|
|
|
+ * \details \copydetails tj3Decompress8()
|
|
|
+ */
|
|
|
+DLLEXPORT int tj3Decompress16(tjhandle handle, const unsigned char *jpegBuf,
|
|
|
+ size_t jpegSize, unsigned short *dstBuf,
|
|
|
+ int pitch, int pixelFormat);
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * Decompress an 8-bit-per-sample JPEG image into an 8-bit-per-sample unified
|
|
|
+ * planar YUV image. This function performs JPEG decompression but leaves out
|
|
|
+ * the color conversion step, so a planar YUV image is generated instead of a
|
|
|
+ * packed-pixel image. The @ref TJPARAM "parameters" that describe the JPEG
|
|
|
+ * image will be set when this function returns.
|
|
|
+ *
|
|
|
+ * @param handle handle to a TurboJPEG instance that has been initialized for
|
|
|
+ * decompression
|
|
|
+ *
|
|
|
+ * @param jpegBuf pointer to a byte buffer containing the JPEG image to
|
|
|
+ * decompress
|
|
|
+ *
|
|
|
+ * @param jpegSize size of the JPEG image (in bytes)
|
|
|
+ *
|
|
|
+ * @param dstBuf pointer to a buffer that will receive the unified planar YUV
|
|
|
+ * decompressed image. Use #tj3YUVBufSize() to determine the appropriate size
|
|
|
+ * for this buffer based on the scaled JPEG width and height (see #TJSCALED(),
|
|
|
+ * #TJPARAM_JPEGWIDTH, #TJPARAM_JPEGHEIGHT, and #tj3SetScalingFactor()), row
|
|
|
+ * alignment, and level of chrominance subsampling (see #TJPARAM_SUBSAMP.) The
|
|
|
+ * Y, U (Cb), and V (Cr) image planes will be stored sequentially in the
|
|
|
+ * buffer. (Refer to @ref YUVnotes "YUV Image Format Notes".)
|
|
|
+ *
|
|
|
+ * @param align row alignment (in bytes) of the YUV image (must be a power of
|
|
|
+ * 2.) Setting this parameter to n will cause each row in each plane of the
|
|
|
+ * YUV image to be padded to the nearest multiple of n bytes (1 = unpadded.)
|
|
|
+ * To generate images suitable for X Video, `align` should be set to 4.
|
|
|
+ *
|
|
|
+ * @return 0 if successful, or -1 if an error occurred (see #tj3GetErrorStr()
|
|
|
+ * and #tj3GetErrorCode().)
|
|
|
+ */
|
|
|
+DLLEXPORT int tj3DecompressToYUV8(tjhandle handle,
|
|
|
+ const unsigned char *jpegBuf,
|
|
|
+ size_t jpegSize,
|
|
|
+ unsigned char *dstBuf, int align);
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * Decompress an 8-bit-per-sample JPEG image into separate 8-bit-per-sample Y,
|
|
|
+ * U (Cb), and V (Cr) image planes. This function performs JPEG decompression
|
|
|
+ * but leaves out the color conversion step, so a planar YUV image is generated
|
|
|
+ * instead of a packed-pixel image. The @ref TJPARAM "parameters" that
|
|
|
+ * describe the JPEG image will be set when this function returns.
|
|
|
+ *
|
|
|
+ * @param handle handle to a TurboJPEG instance that has been initialized for
|
|
|
+ * decompression
|
|
|
+ *
|
|
|
+ * @param jpegBuf pointer to a byte buffer containing the JPEG image to
|
|
|
+ * decompress
|
|
|
+ *
|
|
|
+ * @param jpegSize size of the JPEG image (in bytes)
|
|
|
+ *
|
|
|
+ * @param dstPlanes an array of pointers to Y, U (Cb), and V (Cr) image planes
|
|
|
+ * (or just a Y plane, if decompressing a grayscale image) that will receive
|
|
|
+ * the decompressed image. These planes can be contiguous or non-contiguous in
|
|
|
+ * memory. Use #tj3YUVPlaneSize() to determine the appropriate size for each
|
|
|
+ * plane based on the scaled JPEG width and height (see #TJSCALED(),
|
|
|
+ * #TJPARAM_JPEGWIDTH, #TJPARAM_JPEGHEIGHT, and #tj3SetScalingFactor()),
|
|
|
+ * strides, and level of chrominance subsampling (see #TJPARAM_SUBSAMP.) Refer
|
|
|
+ * to @ref YUVnotes "YUV Image Format Notes" for more details.
|
|
|
+ *
|
|
|
+ * @param strides an array of integers, each specifying the number of bytes per
|
|
|
+ * row in the corresponding plane of the YUV image. Setting the stride for any
|
|
|
+ * plane to 0 is the same as setting it to the scaled plane width (see
|
|
|
+ * @ref YUVnotes "YUV Image Format Notes".) If `strides` is NULL, then the
|
|
|
+ * strides for all planes will be set to their respective scaled plane widths.
|
|
|
+ * You can adjust the strides in order to add an arbitrary amount of row
|
|
|
+ * padding to each plane or to decompress the JPEG image into a subregion of a
|
|
|
+ * larger planar YUV image.
|
|
|
+ *
|
|
|
+ * @return 0 if successful, or -1 if an error occurred (see #tj3GetErrorStr()
|
|
|
+ * and #tj3GetErrorCode().)
|
|
|
+ */
|
|
|
+DLLEXPORT int tj3DecompressToYUVPlanes8(tjhandle handle,
|
|
|
+ const unsigned char *jpegBuf,
|
|
|
+ size_t jpegSize,
|
|
|
+ unsigned char **dstPlanes,
|
|
|
+ int *strides);
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * Decode an 8-bit-per-sample unified planar YUV image into an 8-bit-per-sample
|
|
|
+ * packed-pixel RGB or grayscale image. This function performs color
|
|
|
+ * conversion (which is accelerated in the libjpeg-turbo implementation) but
|
|
|
+ * does not execute any of the other steps in the JPEG decompression process.
|
|
|
+ *
|
|
|
+ * @param handle handle to a TurboJPEG instance that has been initialized for
|
|
|
+ * decompression
|
|
|
+ *
|
|
|
+ * @param srcBuf pointer to a buffer containing a unified planar YUV source
|
|
|
+ * image to be decoded. The size of this buffer should match the value
|
|
|
+ * returned by #tj3YUVBufSize() for the given image width, height, row
|
|
|
+ * alignment, and level of chrominance subsampling (see #TJPARAM_SUBSAMP.) The
|
|
|
+ * Y, U (Cb), and V (Cr) image planes should be stored sequentially in the
|
|
|
+ * source buffer. (Refer to @ref YUVnotes "YUV Image Format Notes".)
|
|
|
+ *
|
|
|
+ * @param align row alignment (in bytes) of the YUV source image (must be a
|
|
|
+ * power of 2.) Setting this parameter to n indicates that each row in each
|
|
|
+ * plane of the YUV source image is padded to the nearest multiple of n bytes
|
|
|
+ * (1 = unpadded.)
|
|
|
+ *
|
|
|
+ * @param dstBuf pointer to a buffer that will receive the packed-pixel decoded
|
|
|
+ * image. This buffer should normally be `pitch * height` bytes in size.
|
|
|
+ * However, you can also use this parameter to decode into a specific region of
|
|
|
+ * a larger buffer.
|
|
|
+ *
|
|
|
+ * @param width width (in pixels) of the source and destination images
|
|
|
+ *
|
|
|
+ * @param pitch bytes per row in the destination image. Normally this should
|
|
|
+ * be set to <tt>width * #tjPixelSize[pixelFormat]</tt>, if the destination
|
|
|
+ * image should be unpadded. (Setting this parameter to 0 is the equivalent of
|
|
|
+ * setting it to <tt>width * #tjPixelSize[pixelFormat]</tt>.) However, you can
|
|
|
+ * also use this parameter to specify the row alignment/padding of the
|
|
|
+ * destination image, to skip rows, or to decode into a specific region of a
|
|
|
+ * larger buffer.
|
|
|
+ *
|
|
|
+ * @param height height (in pixels) of the source and destination images
|
|
|
+ *
|
|
|
+ * @param pixelFormat pixel format of the destination image (see @ref TJPF
|
|
|
+ * "Pixel formats".)
|
|
|
+ *
|
|
|
+ * @return 0 if successful, or -1 if an error occurred (see #tj3GetErrorStr()
|
|
|
+ * and #tj3GetErrorCode().)
|
|
|
+ */
|
|
|
+DLLEXPORT int tj3DecodeYUV8(tjhandle handle, const unsigned char *srcBuf,
|
|
|
+ int align, unsigned char *dstBuf, int width,
|
|
|
+ int pitch, int height, int pixelFormat);
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * Decode a set of 8-bit-per-sample Y, U (Cb), and V (Cr) image planes into an
|
|
|
+ * 8-bit-per-sample packed-pixel RGB or grayscale image. This function
|
|
|
+ * performs color conversion (which is accelerated in the libjpeg-turbo
|
|
|
+ * implementation) but does not execute any of the other steps in the JPEG
|
|
|
+ * decompression process.
|
|
|
+ *
|
|
|
+ * @param handle handle to a TurboJPEG instance that has been initialized for
|
|
|
+ * decompression
|
|
|
+ *
|
|
|
+ * @param srcPlanes an array of pointers to Y, U (Cb), and V (Cr) image planes
|
|
|
+ * (or just a Y plane, if decoding a grayscale image) that contain a YUV image
|
|
|
+ * to be decoded. These planes can be contiguous or non-contiguous in memory.
|
|
|
+ * The size of each plane should match the value returned by #tj3YUVPlaneSize()
|
|
|
+ * for the given image width, height, strides, and level of chrominance
|
|
|
+ * subsampling (see #TJPARAM_SUBSAMP.) Refer to @ref YUVnotes
|
|
|
+ * "YUV Image Format Notes" for more details.
|
|
|
+ *
|
|
|
+ * @param strides an array of integers, each specifying the number of bytes per
|
|
|
+ * row in the corresponding plane of the YUV source image. Setting the stride
|
|
|
+ * for any plane to 0 is the same as setting it to the plane width (see
|
|
|
+ * @ref YUVnotes "YUV Image Format Notes".) If `strides` is NULL, then the
|
|
|
+ * strides for all planes will be set to their respective plane widths. You
|
|
|
+ * can adjust the strides in order to specify an arbitrary amount of row
|
|
|
+ * padding in each plane or to decode a subregion of a larger planar YUV image.
|
|
|
+ *
|
|
|
+ * @param dstBuf pointer to a buffer that will receive the packed-pixel decoded
|
|
|
+ * image. This buffer should normally be `pitch * height` bytes in size.
|
|
|
+ * However, you can also use this parameter to decode into a specific region of
|
|
|
+ * a larger buffer.
|
|
|
+ *
|
|
|
+ * @param width width (in pixels) of the source and destination images
|
|
|
+ *
|
|
|
+ * @param pitch bytes per row in the destination image. Normally this should
|
|
|
+ * be set to <tt>width * #tjPixelSize[pixelFormat]</tt>, if the destination
|
|
|
+ * image should be unpadded. (Setting this parameter to 0 is the equivalent of
|
|
|
+ * setting it to <tt>width * #tjPixelSize[pixelFormat]</tt>.) However, you can
|
|
|
+ * also use this parameter to specify the row alignment/padding of the
|
|
|
+ * destination image, to skip rows, or to decode into a specific region of a
|
|
|
+ * larger buffer.
|
|
|
+ *
|
|
|
+ * @param height height (in pixels) of the source and destination images
|
|
|
+ *
|
|
|
+ * @param pixelFormat pixel format of the destination image (see @ref TJPF
|
|
|
+ * "Pixel formats".)
|
|
|
+ *
|
|
|
+ * @return 0 if successful, or -1 if an error occurred (see #tj3GetErrorStr()
|
|
|
+ * and #tj3GetErrorCode().)
|
|
|
+ */
|
|
|
+DLLEXPORT int tj3DecodeYUVPlanes8(tjhandle handle,
|
|
|
+ const unsigned char * const *srcPlanes,
|
|
|
+ const int *strides, unsigned char *dstBuf,
|
|
|
+ int width, int pitch, int height,
|
|
|
+ int pixelFormat);
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * Losslessly transform a JPEG image into another JPEG image. Lossless
|
|
|
+ * transforms work by moving the raw DCT coefficients from one JPEG image
|
|
|
+ * structure to another without altering the values of the coefficients. While
|
|
|
+ * this is typically faster than decompressing the image, transforming it, and
|
|
|
+ * re-compressing it, lossless transforms are not free. Each lossless
|
|
|
+ * transform requires reading and performing entropy decoding on all of the
|
|
|
+ * coefficients in the source image, regardless of the size of the destination
|
|
|
+ * image. Thus, this function provides a means of generating multiple
|
|
|
+ * transformed images from the same source or applying multiple transformations
|
|
|
+ * simultaneously, in order to eliminate the need to read the source
|
|
|
+ * coefficients multiple times.
|
|
|
+ *
|
|
|
+ * @param handle handle to a TurboJPEG instance that has been initialized for
|
|
|
+ * lossless transformation
|
|
|
+ *
|
|
|
+ * @param jpegBuf pointer to a byte buffer containing the JPEG source image to
|
|
|
+ * transform
|
|
|
+ *
|
|
|
+ * @param jpegSize size of the JPEG source image (in bytes)
|
|
|
+ *
|
|
|
+ * @param n the number of transformed JPEG images to generate
|
|
|
+ *
|
|
|
+ * @param dstBufs pointer to an array of n byte buffers. `dstBufs[i]` will
|
|
|
+ * receive a JPEG image that has been transformed using the parameters in
|
|
|
+ * `transforms[i]`. TurboJPEG has the ability to reallocate the JPEG
|
|
|
+ * destination buffer to accommodate the size of the transformed JPEG image.
|
|
|
+ * Thus, you can choose to:
|
|
|
+ * -# pre-allocate the JPEG destination buffer with an arbitrary size using
|
|
|
+ * #tj3Alloc() and let TurboJPEG grow the buffer as needed,
|
|
|
+ * -# set `dstBufs[i]` to NULL to tell TurboJPEG to allocate the buffer for
|
|
|
+ * you, or
|
|
|
+ * -# pre-allocate the buffer to a "worst case" size determined by calling
|
|
|
+ * #tj3JPEGBufSize() with the transformed or cropped width and height and the
|
|
|
+ * level of subsampling used in the source image. Under normal circumstances,
|
|
|
+ * this should ensure that the buffer never has to be re-allocated. (Setting
|
|
|
+ * #TJPARAM_NOREALLOC guarantees that it won't be.) Note, however, that there
|
|
|
+ * are some rare cases (such as transforming images with a large amount of
|
|
|
+ * embedded EXIF or ICC profile data) in which the transformed JPEG image will
|
|
|
+ * be larger than the worst-case size, and #TJPARAM_NOREALLOC cannot be used in
|
|
|
+ * those cases.
|
|
|
+ * .
|
|
|
+ * If you choose option 1, then `dstSizes[i]` should be set to the size of your
|
|
|
+ * pre-allocated buffer. In any case, unless you have set #TJPARAM_NOREALLOC,
|
|
|
+ * you should always check `dstBufs[i]` upon return from this function, as it
|
|
|
+ * may have changed.
|
|
|
+ *
|
|
|
+ * @param dstSizes pointer to an array of n size_t variables that will receive
|
|
|
+ * the actual sizes (in bytes) of each transformed JPEG image. If `dstBufs[i]`
|
|
|
+ * points to a pre-allocated buffer, then `dstSizes[i]` should be set to the
|
|
|
+ * size of the buffer. Upon return, `dstSizes[i]` will contain the size of the
|
|
|
+ * transformed JPEG image (in bytes.)
|
|
|
+ *
|
|
|
+ * @param transforms pointer to an array of n #tjtransform structures, each of
|
|
|
+ * which specifies the transform parameters and/or cropping region for the
|
|
|
+ * corresponding transformed JPEG image.
|
|
|
+ *
|
|
|
+ * @return 0 if successful, or -1 if an error occurred (see #tj3GetErrorStr()
|
|
|
+ * and #tj3GetErrorCode().)
|
|
|
+ */
|
|
|
+DLLEXPORT int tj3Transform(tjhandle handle, const unsigned char *jpegBuf,
|
|
|
+ size_t jpegSize, int n, unsigned char **dstBufs,
|
|
|
+ size_t *dstSizes, const tjtransform *transforms);
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * Destroy a TurboJPEG instance.
|
|
|
+ *
|
|
|
+ * @param handle handle to a TurboJPEG instance. If the handle is NULL, then
|
|
|
+ * this function has no effect.
|
|
|
+ */
|
|
|
+DLLEXPORT void tj3Destroy(tjhandle handle);
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * Allocate a byte buffer for use with TurboJPEG. You should always use this
|
|
|
+ * function to allocate the JPEG destination buffer(s) for the compression and
|
|
|
+ * transform functions unless you are disabling automatic buffer (re)allocation
|
|
|
+ * (by setting #TJPARAM_NOREALLOC.)
|
|
|
+ *
|
|
|
+ * @param bytes the number of bytes to allocate
|
|
|
+ *
|
|
|
+ * @return a pointer to a newly-allocated buffer with the specified number of
|
|
|
+ * bytes.
|
|
|
+ *
|
|
|
+ * @see tj3Free()
|
|
|
+ */
|
|
|
+DLLEXPORT void *tj3Alloc(size_t bytes);
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * Load an 8-bit-per-sample packed-pixel image from disk into memory.
|
|
|
+ *
|
|
|
+ * @param handle handle to a TurboJPEG instance
|
|
|
+ *
|
|
|
+ * @param filename name of a file containing a packed-pixel image in Windows
|
|
|
+ * BMP or PBMPLUS (PPM/PGM) format. Windows BMP files require 8-bit-per-sample
|
|
|
+ * data precision. If the data precision of the PBMPLUS file does not match
|
|
|
+ * the target data precision, then upconverting or downconverting will be
|
|
|
+ * performed.
|
|
|
+ *
|
|
|
+ * @param width pointer to an integer variable that will receive the width (in
|
|
|
+ * pixels) of the packed-pixel image
|
|
|
+ *
|
|
|
+ * @param align row alignment (in samples) of the packed-pixel buffer to be
|
|
|
+ * returned (must be a power of 2.) Setting this parameter to n will cause all
|
|
|
+ * rows in the buffer to be padded to the nearest multiple of n samples
|
|
|
+ * (1 = unpadded.)
|
|
|
+ *
|
|
|
+ * @param height pointer to an integer variable that will receive the height
|
|
|
+ * (in pixels) of the packed-pixel image
|
|
|
+ *
|
|
|
+ * @param pixelFormat pointer to an integer variable that specifies or will
|
|
|
+ * receive the pixel format of the packed-pixel buffer. The behavior of this
|
|
|
+ * function will vary depending on the value of `*pixelFormat` passed to the
|
|
|
+ * function:
|
|
|
+ * - @ref TJPF_UNKNOWN : The packed-pixel buffer returned by this function will
|
|
|
+ * use the most optimal pixel format for the file type, and `*pixelFormat` will
|
|
|
+ * contain the ID of that pixel format upon successful return from this
|
|
|
+ * function.
|
|
|
+ * - @ref TJPF_GRAY : Only PGM files and 8-bit-per-pixel BMP files with a
|
|
|
+ * grayscale colormap can be loaded.
|
|
|
+ * - @ref TJPF_CMYK : The RGB or grayscale pixels stored in the file will be
|
|
|
+ * converted using a quick & dirty algorithm that is suitable only for testing
|
|
|
+ * purposes. (Proper conversion between CMYK and other formats requires a
|
|
|
+ * color management system.)
|
|
|
+ * - Other @ref TJPF "pixel formats" : The packed-pixel buffer will use the
|
|
|
+ * specified pixel format, and pixel format conversion will be performed if
|
|
|
+ * necessary.
|
|
|
+ *
|
|
|
+ * @return a pointer to a newly-allocated buffer containing the packed-pixel
|
|
|
+ * image, converted to the chosen pixel format and with the chosen row
|
|
|
+ * alignment, or NULL if an error occurred (see #tj3GetErrorStr().) This
|
|
|
+ * buffer should be freed using #tj3Free().
|
|
|
+ */
|
|
|
+DLLEXPORT unsigned char *tj3LoadImage8(tjhandle handle, const char *filename,
|
|
|
+ int *width, int align, int *height,
|
|
|
+ int *pixelFormat);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Load a 12-bit-per-sample packed-pixel image from disk into memory.
|
|
|
+ *
|
|
|
+ * \details \copydetails tj3LoadImage8()
|
|
|
+ */
|
|
|
+DLLEXPORT short *tj3LoadImage12(tjhandle handle, const char *filename,
|
|
|
+ int *width, int align, int *height,
|
|
|
+ int *pixelFormat);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Load a 16-bit-per-sample packed-pixel image from disk into memory.
|
|
|
+ *
|
|
|
+ * \details \copydetails tj3LoadImage8()
|
|
|
+ */
|
|
|
+DLLEXPORT unsigned short *tj3LoadImage16(tjhandle handle, const char *filename,
|
|
|
+ int *width, int align, int *height,
|
|
|
+ int *pixelFormat);
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * Save an 8-bit-per-sample packed-pixel image from memory to disk.
|
|
|
+ *
|
|
|
+ * @param handle handle to a TurboJPEG instance
|
|
|
+ *
|
|
|
+ * @param filename name of a file to which to save the packed-pixel image. The
|
|
|
+ * image will be stored in Windows BMP or PBMPLUS (PPM/PGM) format, depending
|
|
|
+ * on the file extension. Windows BMP files require 8-bit-per-sample data
|
|
|
+ * precision.
|
|
|
+ *
|
|
|
+ * @param buffer pointer to a buffer containing a packed-pixel RGB, grayscale,
|
|
|
+ * or CMYK image to be saved
|
|
|
+ *
|
|
|
+ * @param width width (in pixels) of the packed-pixel image
|
|
|
+ *
|
|
|
+ * @param pitch samples per row in the packed-pixel image. Setting this
|
|
|
+ * parameter to 0 is the equivalent of setting it to
|
|
|
+ * <tt>width * #tjPixelSize[pixelFormat]</tt>.
|
|
|
+ *
|
|
|
+ * @param height height (in pixels) of the packed-pixel image
|
|
|
+ *
|
|
|
+ * @param pixelFormat pixel format of the packed-pixel image (see @ref TJPF
|
|
|
+ * "Pixel formats".) If this parameter is set to @ref TJPF_GRAY, then the
|
|
|
+ * image will be stored in PGM or 8-bit-per-pixel (indexed color) BMP format.
|
|
|
+ * Otherwise, the image will be stored in PPM or 24-bit-per-pixel BMP format.
|
|
|
+ * If this parameter is set to @ref TJPF_CMYK, then the CMYK pixels will be
|
|
|
+ * converted to RGB using a quick & dirty algorithm that is suitable only for
|
|
|
+ * testing purposes. (Proper conversion between CMYK and other formats
|
|
|
+ * requires a color management system.)
|
|
|
+ *
|
|
|
+ * @return 0 if successful, or -1 if an error occurred (see #tj3GetErrorStr().)
|
|
|
+ */
|
|
|
+DLLEXPORT int tj3SaveImage8(tjhandle handle, const char *filename,
|
|
|
+ const unsigned char *buffer, int width, int pitch,
|
|
|
+ int height, int pixelFormat);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Save a 12-bit-per-sample packed-pixel image from memory to disk.
|
|
|
+ *
|
|
|
+ * \details \copydetails tj3SaveImage8()
|
|
|
+ */
|
|
|
+DLLEXPORT int tj3SaveImage12(tjhandle handle, const char *filename,
|
|
|
+ const short *buffer, int width, int pitch,
|
|
|
+ int height, int pixelFormat);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Save a 16-bit-per-sample packed-pixel image from memory to disk.
|
|
|
+ *
|
|
|
+ * \details \copydetails tj3SaveImage8()
|
|
|
+ */
|
|
|
+DLLEXPORT int tj3SaveImage16(tjhandle handle, const char *filename,
|
|
|
+ const unsigned short *buffer, int width,
|
|
|
+ int pitch, int height, int pixelFormat);
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * Free a byte buffer previously allocated by TurboJPEG. You should always use
|
|
|
+ * this function to free JPEG destination buffer(s) that were automatically
|
|
|
+ * (re)allocated by the compression and transform functions or that were
|
|
|
+ * manually allocated using #tj3Alloc().
|
|
|
+ *
|
|
|
+ * @param buffer address of the buffer to free. If the address is NULL, then
|
|
|
+ * this function has no effect.
|
|
|
+ *
|
|
|
+ * @see tj3Alloc()
|
|
|
+ */
|
|
|
+DLLEXPORT void tj3Free(void *buffer);
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * Returns a descriptive error message explaining why the last command failed.
|
|
|
+ *
|
|
|
+ * @param handle handle to a TurboJPEG instance, or NULL if the error was
|
|
|
+ * generated by a global function (but note that retrieving the error message
|
|
|
+ * for a global function is thread-safe only on platforms that support
|
|
|
+ * thread-local storage.)
|
|
|
+ *
|
|
|
+ * @return a descriptive error message explaining why the last command failed.
|
|
|
+ */
|
|
|
+DLLEXPORT char *tj3GetErrorStr(tjhandle handle);
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * Returns a code indicating the severity of the last error. See
|
|
|
+ * @ref TJERR "Error codes".
|
|
|
+ *
|
|
|
+ * @param handle handle to a TurboJPEG instance
|
|
|
+ *
|
|
|
+ * @return a code indicating the severity of the last error. See
|
|
|
+ * @ref TJERR "Error codes".
|
|
|
+ */
|
|
|
+DLLEXPORT int tj3GetErrorCode(tjhandle handle);
|
|
|
+
|
|
|
+
|
|
|
+/* Backward compatibility functions and macros (nothing to see here) */
|
|
|
+
|
|
|
+/* TurboJPEG 1.0+ */
|
|
|
+
|
|
|
+#define NUMSUBOPT TJ_NUMSAMP
|
|
|
+#define TJ_444 TJSAMP_444
|
|
|
+#define TJ_422 TJSAMP_422
|
|
|
+#define TJ_420 TJSAMP_420
|
|
|
+#define TJ_411 TJSAMP_420
|
|
|
+#define TJ_GRAYSCALE TJSAMP_GRAY
|
|
|
+
|
|
|
+#define TJ_BGR 1
|
|
|
+#define TJ_BOTTOMUP TJFLAG_BOTTOMUP
|
|
|
+#define TJ_FORCEMMX TJFLAG_FORCEMMX
|
|
|
+#define TJ_FORCESSE TJFLAG_FORCESSE
|
|
|
+#define TJ_FORCESSE2 TJFLAG_FORCESSE2
|
|
|
+#define TJ_ALPHAFIRST 64
|
|
|
+#define TJ_FORCESSE3 TJFLAG_FORCESSE3
|
|
|
+#define TJ_FASTUPSAMPLE TJFLAG_FASTUPSAMPLE
|
|
|
+
|
|
|
+#define TJPAD(width) (((width) + 3) & (~3))
|
|
|
+
|
|
|
+DLLEXPORT unsigned long TJBUFSIZE(int width, int height);
|
|
|
+
|
|
|
+DLLEXPORT int tjCompress(tjhandle handle, unsigned char *srcBuf, int width,
|
|
|
+ int pitch, int height, int pixelSize,
|
|
|
+ unsigned char *dstBuf, unsigned long *compressedSize,
|
|
|
+ int jpegSubsamp, int jpegQual, int flags);
|
|
|
+
|
|
|
+DLLEXPORT int tjDecompress(tjhandle handle, unsigned char *jpegBuf,
|
|
|
+ unsigned long jpegSize, unsigned char *dstBuf,
|
|
|
+ int width, int pitch, int height, int pixelSize,
|
|
|
+ int flags);
|
|
|
+
|
|
|
+DLLEXPORT int tjDecompressHeader(tjhandle handle, unsigned char *jpegBuf,
|
|
|
+ unsigned long jpegSize, int *width,
|
|
|
+ int *height);
|
|
|
+
|
|
|
+DLLEXPORT int tjDestroy(tjhandle handle);
|
|
|
+
|
|
|
+DLLEXPORT char *tjGetErrorStr(void);
|
|
|
+
|
|
|
+DLLEXPORT tjhandle tjInitCompress(void);
|
|
|
+
|
|
|
+DLLEXPORT tjhandle tjInitDecompress(void);
|
|
|
+
|
|
|
+/* TurboJPEG 1.1+ */
|
|
|
+
|
|
|
+#define TJ_YUV 512
|
|
|
+
|
|
|
+DLLEXPORT unsigned long TJBUFSIZEYUV(int width, int height, int jpegSubsamp);
|
|
|
+
|
|
|
+DLLEXPORT int tjDecompressHeader2(tjhandle handle, unsigned char *jpegBuf,
|
|
|
+ unsigned long jpegSize, int *width,
|
|
|
+ int *height, int *jpegSubsamp);
|
|
|
+
|
|
|
+DLLEXPORT int tjDecompressToYUV(tjhandle handle, unsigned char *jpegBuf,
|
|
|
+ unsigned long jpegSize, unsigned char *dstBuf,
|
|
|
+ int flags);
|
|
|
+
|
|
|
+DLLEXPORT int tjEncodeYUV(tjhandle handle, unsigned char *srcBuf, int width,
|
|
|
+ int pitch, int height, int pixelSize,
|
|
|
+ unsigned char *dstBuf, int subsamp, int flags);
|
|
|
+
|
|
|
+/* TurboJPEG 1.2+ */
|
|
|
+
|
|
|
+#define TJFLAG_BOTTOMUP 2
|
|
|
+#define TJFLAG_FORCEMMX 8
|
|
|
+#define TJFLAG_FORCESSE 16
|
|
|
+#define TJFLAG_FORCESSE2 32
|
|
|
+#define TJFLAG_FORCESSE3 128
|
|
|
+#define TJFLAG_FASTUPSAMPLE 256
|
|
|
+#define TJFLAG_NOREALLOC 1024
|
|
|
+
|
|
|
+DLLEXPORT unsigned char *tjAlloc(int bytes);
|
|
|
+
|
|
|
+DLLEXPORT unsigned long tjBufSize(int width, int height, int jpegSubsamp);
|
|
|
+
|
|
|
+DLLEXPORT unsigned long tjBufSizeYUV(int width, int height, int subsamp);
|
|
|
+
|
|
|
+DLLEXPORT int tjCompress2(tjhandle handle, const unsigned char *srcBuf,
|
|
|
+ int width, int pitch, int height, int pixelFormat,
|
|
|
+ unsigned char **jpegBuf, unsigned long *jpegSize,
|
|
|
+ int jpegSubsamp, int jpegQual, int flags);
|
|
|
+
|
|
|
+DLLEXPORT int tjDecompress2(tjhandle handle, const unsigned char *jpegBuf,
|
|
|
+ unsigned long jpegSize, unsigned char *dstBuf,
|
|
|
+ int width, int pitch, int height, int pixelFormat,
|
|
|
+ int flags);
|
|
|
+
|
|
|
+DLLEXPORT int tjEncodeYUV2(tjhandle handle, unsigned char *srcBuf, int width,
|
|
|
+ int pitch, int height, int pixelFormat,
|
|
|
+ unsigned char *dstBuf, int subsamp, int flags);
|
|
|
+
|
|
|
+DLLEXPORT void tjFree(unsigned char *buffer);
|
|
|
+
|
|
|
+DLLEXPORT tjscalingfactor *tjGetScalingFactors(int *numscalingfactors);
|
|
|
+
|
|
|
+DLLEXPORT tjhandle tjInitTransform(void);
|
|
|
+
|
|
|
+DLLEXPORT int tjTransform(tjhandle handle, const unsigned char *jpegBuf,
|
|
|
+ unsigned long jpegSize, int n,
|
|
|
+ unsigned char **dstBufs, unsigned long *dstSizes,
|
|
|
+ tjtransform *transforms, int flags);
|
|
|
+
|
|
|
+/* TurboJPEG 1.2.1+ */
|
|
|
+
|
|
|
+#define TJFLAG_FASTDCT 2048
|
|
|
+#define TJFLAG_ACCURATEDCT 4096
|
|
|
+
|
|
|
+/* TurboJPEG 1.4+ */
|
|
|
+
|
|
|
+DLLEXPORT unsigned long tjBufSizeYUV2(int width, int align, int height,
|
|
|
+ int subsamp);
|
|
|
+
|
|
|
+DLLEXPORT int tjCompressFromYUV(tjhandle handle, const unsigned char *srcBuf,
|
|
|
+ int width, int align, int height, int subsamp,
|
|
|
+ unsigned char **jpegBuf,
|
|
|
+ unsigned long *jpegSize, int jpegQual,
|
|
|
+ int flags);
|
|
|
+
|
|
|
+DLLEXPORT int tjCompressFromYUVPlanes(tjhandle handle,
|
|
|
+ const unsigned char **srcPlanes,
|
|
|
+ int width, const int *strides,
|
|
|
+ int height, int subsamp,
|
|
|
+ unsigned char **jpegBuf,
|
|
|
+ unsigned long *jpegSize, int jpegQual,
|
|
|
+ int flags);
|
|
|
+
|
|
|
+DLLEXPORT int tjDecodeYUV(tjhandle handle, const unsigned char *srcBuf,
|
|
|
+ int align, int subsamp, unsigned char *dstBuf,
|
|
|
+ int width, int pitch, int height, int pixelFormat,
|
|
|
+ int flags);
|
|
|
+
|
|
|
+DLLEXPORT int tjDecodeYUVPlanes(tjhandle handle,
|
|
|
+ const unsigned char **srcPlanes,
|
|
|
+ const int *strides, int subsamp,
|
|
|
+ unsigned char *dstBuf, int width, int pitch,
|
|
|
+ int height, int pixelFormat, int flags);
|
|
|
+
|
|
|
+DLLEXPORT int tjDecompressHeader3(tjhandle handle,
|
|
|
+ const unsigned char *jpegBuf,
|
|
|
+ unsigned long jpegSize, int *width,
|
|
|
+ int *height, int *jpegSubsamp,
|
|
|
+ int *jpegColorspace);
|
|
|
+
|
|
|
+DLLEXPORT int tjDecompressToYUV2(tjhandle handle, const unsigned char *jpegBuf,
|
|
|
+ unsigned long jpegSize, unsigned char *dstBuf,
|
|
|
+ int width, int align, int height, int flags);
|
|
|
+
|
|
|
+DLLEXPORT int tjDecompressToYUVPlanes(tjhandle handle,
|
|
|
+ const unsigned char *jpegBuf,
|
|
|
+ unsigned long jpegSize,
|
|
|
+ unsigned char **dstPlanes, int width,
|
|
|
+ int *strides, int height, int flags);
|
|
|
+
|
|
|
+DLLEXPORT int tjEncodeYUV3(tjhandle handle, const unsigned char *srcBuf,
|
|
|
+ int width, int pitch, int height, int pixelFormat,
|
|
|
+ unsigned char *dstBuf, int align, int subsamp,
|
|
|
+ int flags);
|
|
|
+
|
|
|
+DLLEXPORT int tjEncodeYUVPlanes(tjhandle handle, const unsigned char *srcBuf,
|
|
|
+ int width, int pitch, int height,
|
|
|
+ int pixelFormat, unsigned char **dstPlanes,
|
|
|
+ int *strides, int subsamp, int flags);
|
|
|
+
|
|
|
+DLLEXPORT int tjPlaneHeight(int componentID, int height, int subsamp);
|
|
|
+
|
|
|
+DLLEXPORT unsigned long tjPlaneSizeYUV(int componentID, int width, int stride,
|
|
|
+ int height, int subsamp);
|
|
|
+
|
|
|
+DLLEXPORT int tjPlaneWidth(int componentID, int width, int subsamp);
|
|
|
+
|
|
|
+/* TurboJPEG 2.0+ */
|
|
|
+
|
|
|
+#define TJFLAG_STOPONWARNING 8192
|
|
|
+#define TJFLAG_PROGRESSIVE 16384
|
|
|
+
|
|
|
+DLLEXPORT int tjGetErrorCode(tjhandle handle);
|
|
|
+
|
|
|
+DLLEXPORT char *tjGetErrorStr2(tjhandle handle);
|
|
|
+
|
|
|
+DLLEXPORT unsigned char *tjLoadImage(const char *filename, int *width,
|
|
|
+ int align, int *height, int *pixelFormat,
|
|
|
+ int flags);
|
|
|
+
|
|
|
+DLLEXPORT int tjSaveImage(const char *filename, unsigned char *buffer,
|
|
|
+ int width, int pitch, int height, int pixelFormat,
|
|
|
+ int flags);
|
|
|
+
|
|
|
+/* TurboJPEG 2.1+ */
|
|
|
+
|
|
|
+#define TJFLAG_LIMITSCANS 32768
|
|
|
+
|
|
|
+/**
|
|
|
+ * @}
|
|
|
+ */
|
|
|
+
|
|
|
+#ifdef __cplusplus
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
+#endif
|