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