Added new option for player:
Forces colour depth for the rfb session. Supports 8, 16, 24 bit mode.
It is useful option when the session file has wrong server init message.
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@201 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/rfbplayer/rfbplayer.cxx b/rfbplayer/rfbplayer.cxx
index 6a2ce63..65c268e 100644
--- a/rfbplayer/rfbplayer.cxx
+++ b/rfbplayer/rfbplayer.cxx
@@ -48,6 +48,8 @@
"usage: rfbplayer <options> <filename>\n"
"Command-line options:\n"
" -help \t- Provide usage information.\n"
+ " -depth <bit> \t- Forces the color depth for the session."
+ " \t Supports 8, 16 and 24 bit mode."
" -speed <value>\t- Sets playback speed, where 1 is normal speed,\n"
" \t is double speed, 0.5 is half speed. Default: 1.0.\n"
" -pos <ms> \t- Sets initial time position in the session file,\n"
@@ -64,6 +66,11 @@
#define DEFAULT_PLAYER_WIDTH 640
#define DEFAULT_PLAYER_HEIGHT 480
+#define DEPTH_AUTO 0
+#define DEPTH8_RGB332 8
+#define DEPTH16_RGB655 16
+#define DEPTH24_RGB888 24
+
#define ID_TOOLBAR 500
#define ID_PLAY 510
#define ID_PAUSE 520
@@ -73,7 +80,6 @@
#define ID_POS_TRACKBAR 560
#define ID_SPEED_UPDOWN 570
-
//
// -=- RfbPlayerClass
@@ -211,13 +217,15 @@
// -=- RfbPlayer instance implementation
//
-RfbPlayer::RfbPlayer(char *_fileName, long _initTime = 0, double _playbackSpeed = 1.0,
+RfbPlayer::RfbPlayer(char *_fileName, int _depth = DEPTH_AUTO,
+ long _initTime = 0, double _playbackSpeed = 1.0,
bool _autoplay = false, bool _acceptBell = false)
-: RfbProto(_fileName), initTime(_initTime), playbackSpeed(_playbackSpeed),
- autoplay(_autoplay), buffer(0), client_size(0, 0, 32, 32),
- window_size(0, 0, 32, 32), cutText(0), seekMode(false), fileName(_fileName),
- serverInitTime(0), lastPos(0), timeStatic(0), speedEdit(0), posTrackBar(0),
- speedUpDown(0), acceptBell(_acceptBell), rfbReader(0), sessionTimeMs(0),
+: RfbProto(_fileName), colourDepth(_depth), initTime(_initTime),
+ playbackSpeed(_playbackSpeed), autoplay(_autoplay), buffer(0),
+ client_size(0, 0, 32, 32), window_size(0, 0, 32, 32), cutText(0),
+ seekMode(false), fileName(_fileName), serverInitTime(0), lastPos(0),
+ timeStatic(0), speedEdit(0), posTrackBar(0), speedUpDown(0),
+ acceptBell(_acceptBell), rfbReader(0), sessionTimeMs(0),
sliderDraging(false), sliderStepMs(0), loopPlayback(false) {
CTRL_BAR_HEIGHT = 28;
@@ -839,7 +847,22 @@
throw rdr::Exception("This version plays only true color session!");
// Set the session pixel format
- buffer->setPF(cp.pf());
+ switch (colourDepth) {
+ case DEPTH_AUTO:
+ break;
+ case DEPTH8_RGB332:
+ cp.setPF(PixelFormat(8,8,0,1,7,7,3,0,3,6));
+ break;
+ case DEPTH16_RGB655:
+ cp.setPF(PixelFormat(16,16,0,1,63,31,31,0,6,11));
+ break;
+ case DEPTH24_RGB888:
+ cp.setPF(PixelFormat(32,24,0,1,255,255,255,16,8,0));
+ break;
+ default:
+ throw rdr::Exception("This color depth is not supported!");
+ }
+ buffer->setPF(cp.pf());
// If the window is not maximised then resize it
if (!(GetWindowLong(getMainHandle(), GWL_STYLE) & WS_MAXIMIZE))
@@ -1117,6 +1140,7 @@
double playbackSpeed = 1.0;
long initTime = -1;
+int depth = DEPTH_AUTO;
bool autoplay = false;
char *fileName = 0;
bool print_usage = false;
@@ -1135,6 +1159,16 @@
return true;
}
+ if ((strcasecmp(argv[i], "-depth") == 0) ||
+ (strcasecmp(argv[i], "/depth") == 0) && (i < argc-1)) {
+ depth = atoi(argv[++i]);
+ if (depth < 0) {
+ return false;
+ }
+ continue;
+ }
+
+
if ((strcasecmp(argv[i], "-speed") == 0) ||
(strcasecmp(argv[i], "/speed") == 0) && (i < argc-1)) {
playbackSpeed = atof(argv[++i]);
@@ -1195,7 +1229,7 @@
// Create the player
RfbPlayer *player = NULL;
try {
- player = new RfbPlayer(fileName, initTime, playbackSpeed, autoplay,
+ player = new RfbPlayer(fileName, depth, initTime, playbackSpeed, autoplay,
acceptBell);
} catch (rdr::Exception e) {
MessageBox(NULL, e.str(), e.type(), MB_OK | MB_ICONERROR);