blob: d5a0288ee9ba6eebb17f4e773f8c01cef53f0445 [file] [log] [blame]
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +00001/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved.
DRCb4a83232011-08-19 04:57:18 +00002 * Copyright (C) 2011 D. R. Commander. All Rights Reserved.
Pierre Ossman316a3242014-01-15 12:40:20 +01003 * Copyright 2014 Pierre Ossman for Cendio AB
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +00004 *
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
Pierre Ossmanc0397262014-03-14 15:59:46 +010023#include <rdr/types.h>
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000024#include <rfb/Rect.h>
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000025
26namespace rfb {
Pierre Ossman668468b2014-01-31 12:37:32 +010027 class SConnection;
Pierre Ossman0c9bd4b2014-07-09 16:44:11 +020028 class PixelBuffer;
Pierre Ossmanc0397262014-03-14 15:59:46 +010029 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,
Pierre Ossman6b2f1132016-11-30 08:03:35 +010038 // Encoder does not encode pixels perfectly accurate
39 EncoderLossy = 1 << 1,
Pierre Ossmanc0397262014-03-14 15:59:46 +010040 };
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000041
42 class Encoder {
43 public:
Pierre Ossmanc0397262014-03-14 15:59:46 +010044 Encoder(SConnection* conn, int encoding,
Pierre Ossmanbeab2b62018-09-20 10:52:15 +020045 enum EncoderFlags flags, unsigned int maxPaletteSize=-1,
46 int losslessQuality=-1);
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000047 virtual ~Encoder();
48
klemens0536d092017-01-28 20:56:56 +010049 // isSupported() should return a boolean indicating if this encoder
Pierre Ossmanc0397262014-03-14 15:59:46 +010050 // 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
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000054 virtual void setCompressLevel(int level) {};
55 virtual void setQualityLevel(int level) {};
Pierre Ossmanb948a912014-01-15 13:23:43 +010056 virtual void setFineQualityLevel(int quality, int subsampling) {};
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000057
Pierre Ossmanab9fd6b2018-09-20 10:51:00 +020058 virtual int getCompressLevel() { return -1; };
59 virtual int getQualityLevel() { return -1; };
60
Pierre Ossman717c07b2014-01-21 14:45:10 +010061 // writeRect() is the main interface that encodes the given rectangle
Pierre Ossman0c9bd4b2014-07-09 16:44:11 +020062 // with data from the PixelBuffer onto the SConnection given at
Pierre Ossmanc0397262014-03-14 15:59:46 +010063 // 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;
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000074
Pierre Ossmanc0397262014-03-14 15:59:46 +010075 // 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;
Pierre Ossman4aba19e2014-01-29 16:42:48 +010098
Pierre Ossmanbeab2b62018-09-20 10:52:15 +020099 // Minimum level where the quality loss will not be noticed by
100 // most users (only relevant with EncoderLossy flag)
101 const int losslessQuality;
102
Pierre Ossman4aba19e2014-01-29 16:42:48 +0100103 protected:
Pierre Ossman668468b2014-01-31 12:37:32 +0100104 SConnection* conn;
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +0000105 };
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +0000106}
107
108#endif