| #ifndef _ANDROID_GRAPHICS_YUV_TO_JPEG_ENCODER_H_ |
| #define _ANDROID_GRAPHICS_YUV_TO_JPEG_ENCODER_H_ |
| |
| #include <android/data_space.h> |
| #include <nativehelper/ScopedPrimitiveArray.h> |
| #include <ultrahdr/jpegr.h> |
| |
| extern "C" { |
| #include "jpeglib.h" |
| #include "jerror.h" |
| } |
| |
| class SkWStream; |
| |
| class YuvToJpegEncoder { |
| public: |
| /** Create an encoder based on the YUV format. |
| * |
| * @param pixelFormat The yuv pixel format as defined in ui/PixelFormat.h. |
| * @param strides The number of row bytes in each image plane. |
| * @return an encoder based on the pixelFormat. |
| */ |
| static YuvToJpegEncoder* create(int pixelFormat, int* strides); |
| |
| explicit YuvToJpegEncoder(int* strides); |
| |
| /** Encode YUV data to jpeg, which is output to a stream. |
| * |
| * @param stream The jpeg output stream. |
| * @param inYuv The input yuv data. |
| * @param width Width of the Yuv data in terms of pixels. |
| * @param height Height of the Yuv data in terms of pixels. |
| * @param offsets The offsets in each image plane with respect to inYuv. |
| * @param jpegQuality Picture quality in [0, 100]. |
| * @return true if successfully compressed the stream. |
| */ |
| bool encode(SkWStream* stream, void* inYuv, int width, |
| int height, int* offsets, int jpegQuality); |
| |
| virtual ~YuvToJpegEncoder() {} |
| |
| protected: |
| int fNumPlanes; |
| int* fStrides; |
| void setJpegCompressStruct(jpeg_compress_struct* cinfo, int width, |
| int height, int quality); |
| virtual void configSamplingFactors(jpeg_compress_struct* cinfo) = 0; |
| virtual void compress(jpeg_compress_struct* cinfo, |
| uint8_t* yuv, int* offsets) = 0; |
| }; |
| |
| class Yuv420SpToJpegEncoder : public YuvToJpegEncoder { |
| public: |
| explicit Yuv420SpToJpegEncoder(int* strides); |
| virtual ~Yuv420SpToJpegEncoder() {} |
| |
| private: |
| void configSamplingFactors(jpeg_compress_struct* cinfo); |
| void deinterleaveYuv(uint8_t* yuv, int width, int height, |
| uint8_t*& yPlanar, uint8_t*& uPlanar, uint8_t*& vPlanar); |
| void deinterleave(uint8_t* vuPlanar, uint8_t* uRows, uint8_t* vRows, |
| int rowIndex, int width, int height); |
| void compress(jpeg_compress_struct* cinfo, uint8_t* yuv, int* offsets); |
| }; |
| |
| class Yuv422IToJpegEncoder : public YuvToJpegEncoder { |
| public: |
| explicit Yuv422IToJpegEncoder(int* strides); |
| virtual ~Yuv422IToJpegEncoder() {} |
| |
| private: |
| void configSamplingFactors(jpeg_compress_struct* cinfo); |
| void compress(jpeg_compress_struct* cinfo, uint8_t* yuv, int* offsets); |
| void deinterleave(uint8_t* yuv, uint8_t* yRows, uint8_t* uRows, |
| uint8_t* vRows, int rowIndex, int width, int height); |
| }; |
| |
| class P010Yuv420ToJpegREncoder { |
| public: |
| /** Encode YUV data to jpeg/r, which is output to a stream. |
| * This method will call JpegR::EncodeJPEGR() method. If encoding failed, |
| * Corresponding error code (defined in jpegrerrorcode.h) will be printed and this |
| * method will be terminated and return false. |
| * |
| * @param env JNI environment. |
| * @param stream The jpeg output stream. |
| * @param hdr The input yuv data (p010 format). |
| * @param hdrColorSpaceId color space id for the input hdr. |
| * @param sdr The input yuv data (yuv420p format). |
| * @param sdrColorSpaceId color space id for the input sdr. |
| * @param width Width of the Yuv data in terms of pixels. |
| * @param height Height of the Yuv data in terms of pixels. |
| * @param jpegQuality Picture quality in [0, 100]. |
| * @param exif Buffer holds EXIF package. |
| * @param hdrStrides The number of row bytes in each image plane of the HDR input. |
| * @param sdrStrides The number of row bytes in each image plane of the SDR input. |
| * @return true if successfully compressed the stream. |
| */ |
| bool encode(JNIEnv* env, |
| SkWStream* stream, void* hdr, int hdrColorSpace, void* sdr, int sdrColorSpace, |
| int width, int height, int jpegQuality, ScopedByteArrayRO* exif, |
| ScopedIntArrayRO* hdrStrides, ScopedIntArrayRO* sdrStrides); |
| |
| /** Map data space (defined in DataSpace.java and data_space.h) to the color gamut |
| * used in JPEG/R |
| * |
| * @param env JNI environment. |
| * @param aDataSpace data space defined in data_space.h. |
| * @return color gamut for JPEG/R. |
| */ |
| static ultrahdr::ultrahdr_color_gamut findColorGamut(JNIEnv* env, int aDataSpace); |
| |
| /** Map data space (defined in DataSpace.java and data_space.h) to the transfer function |
| * used in JPEG/R |
| * |
| * @param env JNI environment. |
| * @param aDataSpace data space defined in data_space.h. |
| * @return color gamut for JPEG/R. |
| */ |
| static ultrahdr::ultrahdr_transfer_function findHdrTransferFunction(JNIEnv* env, |
| int aDataSpace); |
| }; |
| |
| #endif // _ANDROID_GRAPHICS_YUV_TO_JPEG_ENCODER_H_ |