blob: 62cb6ebcd9a009e9ac53cfe9351baeefc8d7b131 [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,
38 };
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000039
40 class Encoder {
41 public:
Pierre Ossmanc0397262014-03-14 15:59:46 +010042 Encoder(SConnection* conn, int encoding,
43 enum EncoderFlags flags, unsigned int maxPaletteSize);
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000044 virtual ~Encoder();
45
Pierre Ossmanc0397262014-03-14 15:59:46 +010046 // isSupported() should return a boolean indiciating if this encoder
47 // is okay to use with the current connection. This usually involves
48 // checking the list of encodings in the connection parameters.
49 virtual bool isSupported()=0;
50
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000051 virtual void setCompressLevel(int level) {};
52 virtual void setQualityLevel(int level) {};
Pierre Ossmanb948a912014-01-15 13:23:43 +010053 virtual void setFineQualityLevel(int quality, int subsampling) {};
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000054
Pierre Ossman717c07b2014-01-21 14:45:10 +010055 // writeRect() is the main interface that encodes the given rectangle
Pierre Ossman0c9bd4b2014-07-09 16:44:11 +020056 // with data from the PixelBuffer onto the SConnection given at
Pierre Ossmanc0397262014-03-14 15:59:46 +010057 // encoder creation.
58 //
59 // The PixelBuffer will be in the PixelFormat specified in ConnParams
60 // unless the flag UseNativePF is specified. In that case the
61 // PixelBuffer will remain in its native format and encoder will have
62 // to handle any conversion itself.
63 //
64 // The Palette will always be in the PixelFormat specified in
65 // ConnParams. An empty palette indicates a large number of colours,
66 // but could still be less than maxPaletteSize.
67 virtual void writeRect(const PixelBuffer* pb, const Palette& palette)=0;
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000068
Pierre Ossmanc0397262014-03-14 15:59:46 +010069 // writeSolidRect() is a short cut in order to encode single colour
70 // rectangles efficiently without having to create a fake single
71 // colour PixelBuffer. The colour argument follows the same semantics
72 // as the PixelBuffer for writeRect().
73 //
74 // Note that there is a default implementation that can be called
75 // using Encoder::writeSolidRect() in the event that there is no
76 // efficient short cut.
77 virtual void writeSolidRect(int width, int height,
78 const PixelFormat& pf,
79 const rdr::U8* colour)=0;
80
81 protected:
82 // Helper method for redirecting a single colour palette to the
83 // short cut method.
84 void writeSolidRect(const PixelBuffer* pb, const Palette& palette);
85
86 public:
87 const int encoding;
88 const enum EncoderFlags flags;
89
90 // Maximum size of the palette per rect
91 const unsigned int maxPaletteSize;
Pierre Ossman4aba19e2014-01-29 16:42:48 +010092
93 protected:
Pierre Ossman668468b2014-01-31 12:37:32 +010094 SConnection* conn;
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000095 };
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000096}
97
98#endif