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