1 /* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
2  * Copyright (C) 2011 D. R. Commander.  All Rights Reserved.
3  * Copyright 2014 Pierre Ossman for Cendio AB
4  *
5  * This is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This software is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this software; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
18  * USA.
19  */
20 #ifndef __RFB_ENCODER_H__
21 #define __RFB_ENCODER_H__
22 
23 #include <rdr/types.h>
24 #include <rfb/Rect.h>
25 
26 namespace rfb {
27   class SConnection;
28   class PixelBuffer;
29   class Palette;
30   class PixelFormat;
31 
32   enum EncoderFlags {
33     // A constant for encoders that don't need anything special
34     EncoderPlain = 0,
35     // Give us the raw frame buffer, and not something converted to
36     // the what the client is asking for.
37     EncoderUseNativePF = 1 << 0,
38     // Encoder does not encode pixels perfectly accurate
39     EncoderLossy = 1 << 1,
40   };
41 
42   class Encoder {
43   public:
44     Encoder(SConnection* conn, int encoding,
45             enum EncoderFlags flags, unsigned int maxPaletteSize=-1,
46             int losslessQuality=-1);
47     virtual ~Encoder();
48 
49     // isSupported() should return a boolean indicating if this encoder
50     // is okay to use with the current connection. This usually involves
51     // checking the list of encodings in the connection parameters.
52     virtual bool isSupported()=0;
53 
setCompressLevel(int level)54     virtual void setCompressLevel(int level) {};
setQualityLevel(int level)55     virtual void setQualityLevel(int level) {};
setFineQualityLevel(int quality,int subsampling)56     virtual void setFineQualityLevel(int quality, int subsampling) {};
57 
getCompressLevel()58     virtual int getCompressLevel() { return -1; };
getQualityLevel()59     virtual int getQualityLevel() { return -1; };
60 
61     // writeRect() is the main interface that encodes the given rectangle
62     // with data from the PixelBuffer onto the SConnection given at
63     // encoder creation.
64     //
65     // The PixelBuffer will be in the PixelFormat specified in ConnParams
66     // unless the flag UseNativePF is specified. In that case the
67     // PixelBuffer will remain in its native format and encoder will have
68     // to handle any conversion itself.
69     //
70     // The Palette will always be in the PixelFormat specified in
71     // ConnParams. An empty palette indicates a large number of colours,
72     // but could still be less than maxPaletteSize.
73     virtual void writeRect(const PixelBuffer* pb, const Palette& palette)=0;
74 
75     // writeSolidRect() is a short cut in order to encode single colour
76     // rectangles efficiently without having to create a fake single
77     // colour PixelBuffer. The colour argument follows the same semantics
78     // as the PixelBuffer for writeRect().
79     //
80     // Note that there is a default implementation that can be called
81     // using Encoder::writeSolidRect() in the event that there is no
82     // efficient short cut.
83     virtual void writeSolidRect(int width, int height,
84                                 const PixelFormat& pf,
85                                 const rdr::U8* colour)=0;
86 
87   protected:
88     // Helper method for redirecting a single colour palette to the
89     // short cut method.
90     void writeSolidRect(const PixelBuffer* pb, const Palette& palette);
91 
92   public:
93     const int encoding;
94     const enum EncoderFlags flags;
95 
96     // Maximum size of the palette per rect
97     const unsigned int maxPaletteSize;
98 
99     // Minimum level where the quality loss will not be noticed by
100     // most users (only relevant with EncoderLossy flag)
101     const int losslessQuality;
102 
103   protected:
104     SConnection* conn;
105   };
106 }
107 
108 #endif
109