1bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen#ifndef YuvToJpegEncoder_DEFINED 2bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen#define YuvToJpegEncoder_DEFINED 3bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen 4bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen#include "SkTypes.h" 5bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen#include "SkStream.h" 6bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chenextern "C" { 7bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen #include "jpeglib.h" 8bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen #include "jerror.h" 9bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen} 10bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen 11bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chenclass YuvToJpegEncoder { 12bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chenpublic: 13bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen /** Create an encoder based on the YUV format. 14bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen * 15bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen * @param pixelFormat The yuv pixel format as defined in ui/PixelFormat.h. 16bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen * @param strides The number of row bytes in each image plane. 17bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen * @return an encoder based on the pixelFormat. 18bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen */ 19bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen static YuvToJpegEncoder* create(int pixelFormat, int* strides); 20bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen 21bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen YuvToJpegEncoder(int* strides); 22bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen 23bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen /** Encode YUV data to jpeg, which is output to a stream. 24bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen * 25bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen * @param stream The jpeg output stream. 26bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen * @param inYuv The input yuv data. 27bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen * @param width Width of the the Yuv data in terms of pixels. 28bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen * @param height Height of the Yuv data in terms of pixels. 29bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen * @param offsets The offsets in each image plane with respect to inYuv. 30bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen * @param jpegQuality Picture quality in [0, 100]. 31bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen * @return true if successfully compressed the stream. 32bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen */ 33bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen bool encode(SkWStream* stream, void* inYuv, int width, 34bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen int height, int* offsets, int jpegQuality); 35bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen 36bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen virtual ~YuvToJpegEncoder() {} 37bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen 38bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chenprotected: 39bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen int fNumPlanes; 40bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen int* fStrides; 41bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen void setJpegCompressStruct(jpeg_compress_struct* cinfo, int width, 42bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen int height, int quality); 43bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen virtual void configSamplingFactors(jpeg_compress_struct* cinfo) = 0; 44bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen virtual void compress(jpeg_compress_struct* cinfo, 45bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen uint8_t* yuv, int* offsets) = 0; 46bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen}; 47bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen 48bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chenclass Yuv420SpToJpegEncoder : public YuvToJpegEncoder { 49bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chenpublic: 50bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen Yuv420SpToJpegEncoder(int* strides); 51bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen virtual ~Yuv420SpToJpegEncoder() {} 52bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen 53bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chenprivate: 54bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen void configSamplingFactors(jpeg_compress_struct* cinfo); 55bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen void deinterleaveYuv(uint8_t* yuv, int width, int height, 56bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen uint8_t*& yPlanar, uint8_t*& uPlanar, uint8_t*& vPlanar); 57bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen void deinterleave(uint8_t* vuPlanar, uint8_t* uRows, uint8_t* vRows, 584b63f14c96841d02b6bffce987f7705b6aa8e2a9Wu-cheng Li int rowIndex, int width, int height); 59bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen void compress(jpeg_compress_struct* cinfo, uint8_t* yuv, int* offsets); 60bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen}; 61bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen 62bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chenclass Yuv422IToJpegEncoder : public YuvToJpegEncoder { 63bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chenpublic: 64bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen Yuv422IToJpegEncoder(int* strides); 65bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen virtual ~Yuv422IToJpegEncoder() {} 66bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen 67bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chenprivate: 68bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen void configSamplingFactors(jpeg_compress_struct* cinfo); 69bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen void compress(jpeg_compress_struct* cinfo, uint8_t* yuv, int* offsets); 70bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen void deinterleave(uint8_t* yuv, uint8_t* yRows, uint8_t* uRows, 71bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen uint8_t* vRows, int rowIndex, int width, int height); 72bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen}; 73bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen 74bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen#endif 75