1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
/* Copyright (C) 2000-2003 Constantin Kaplinsky. All Rights Reserved.
* Copyright (C) 2011 D. R. Commander. All Rights Reserved.
* Copyright 2014 Pierre Ossman for Cendio AB
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this software; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
* USA.
*/
#ifndef __RFB_ENCODEMANAGER_H__
#define __RFB_ENCODEMANAGER_H__
#include <vector>
#include <rdr/types.h>
#include <rfb/PixelBuffer.h>
namespace rfb {
class SConnection;
class Encoder;
class UpdateInfo;
class PixelBuffer;
class RenderedCursor;
class Region;
class Rect;
struct RectInfo;
class EncodeManager {
public:
EncodeManager(SConnection* conn);
~EncodeManager();
void logStats();
// Hack to let ConnParams calculate the client's preferred encoding
static bool supported(int encoding);
void writeUpdate(const UpdateInfo& ui, const PixelBuffer* pb,
const RenderedCursor* renderedCursor);
protected:
void prepareEncoders();
int computeNumRects(const Region& changed);
Encoder *startRect(const Rect& rect, int type);
void endRect();
void writeCopyRects(const UpdateInfo& ui);
void writeSolidRects(Region *changed, const PixelBuffer* pb);
void findSolidRect(const Rect& rect, Region *changed, const PixelBuffer* pb);
void writeRects(const Region& changed, const PixelBuffer* pb);
void writeSubRect(const Rect& rect, const PixelBuffer *pb);
bool checkSolidTile(const Rect& r, const rdr::U8* colourValue,
const PixelBuffer *pb);
void extendSolidAreaByBlock(const Rect& r, const rdr::U8* colourValue,
const PixelBuffer *pb, Rect* er);
void extendSolidAreaByPixel(const Rect& r, const Rect& sr,
const rdr::U8* colourValue,
const PixelBuffer *pb, Rect* er);
PixelBuffer* preparePixelBuffer(const Rect& rect,
const PixelBuffer *pb, bool convert);
bool analyseRect(const PixelBuffer *pb,
struct RectInfo *info, int maxColours);
protected:
// Preprocessor generated, optimised methods
inline bool checkSolidTile(const Rect& r, rdr::U8 colourValue,
const PixelBuffer *pb);
inline bool checkSolidTile(const Rect& r, rdr::U16 colourValue,
const PixelBuffer *pb);
inline bool checkSolidTile(const Rect& r, rdr::U32 colourValue,
const PixelBuffer *pb);
inline bool analyseRect(int width, int height,
const rdr::U8* buffer, int stride,
struct RectInfo *info, int maxColours);
inline bool analyseRect(int width, int height,
const rdr::U16* buffer, int stride,
struct RectInfo *info, int maxColours);
inline bool analyseRect(int width, int height,
const rdr::U32* buffer, int stride,
struct RectInfo *info, int maxColours);
protected:
SConnection *conn;
std::vector<Encoder*> encoders;
std::vector<int> activeEncoders;
struct EncoderStats {
unsigned rects;
unsigned long long bytes;
unsigned long long pixels;
unsigned long long equivalent;
};
typedef std::vector< std::vector<struct EncoderStats> > StatsVector;
unsigned updates;
EncoderStats copyStats;
StatsVector stats;
int activeType;
int beforeLength;
class OffsetPixelBuffer : public FullFramePixelBuffer {
public:
OffsetPixelBuffer() {}
virtual ~OffsetPixelBuffer() {}
void update(const PixelFormat& pf, int width, int height,
const rdr::U8* data_, int stride);
};
OffsetPixelBuffer offsetPixelBuffer;
ManagedPixelBuffer convertedPixelBuffer;
};
}
#endif
|