vncinput.cc (9356:b279bad40aa3) | vncinput.cc (10839:10cac0f0f419) |
---|---|
1/* | 1/* |
2 * Copyright (c) 2010 ARM Limited | 2 * Copyright (c) 2010, 2015 ARM Limited |
3 * All rights reserved 4 * 5 * The license below extends only to copyright in the software and shall 6 * not be construed as granting a license to any other intellectual 7 * property including but not limited to intellectual property relating 8 * to a hardware implementation of the functionality of the software 9 * licensed hereunder. You may use the software subject to the license 10 * terms below provided that you ensure that this notice is replicated --- 37 unchanged lines hidden (view full) --- 48#include "base/output.hh" //simout 49#include "base/trace.hh" 50#include "debug/VNC.hh" 51 52using namespace std; 53 54VncInput::VncInput(const Params *p) 55 : SimObject(p), keyboard(NULL), mouse(NULL), | 3 * All rights reserved 4 * 5 * The license below extends only to copyright in the software and shall 6 * not be construed as granting a license to any other intellectual 7 * property including but not limited to intellectual property relating 8 * to a hardware implementation of the functionality of the software 9 * licensed hereunder. You may use the software subject to the license 10 * terms below provided that you ensure that this notice is replicated --- 37 unchanged lines hidden (view full) --- 48#include "base/output.hh" //simout 49#include "base/trace.hh" 50#include "debug/VNC.hh" 51 52using namespace std; 53 54VncInput::VncInput(const Params *p) 55 : SimObject(p), keyboard(NULL), mouse(NULL), |
56 vc(NULL), fbPtr(NULL), videoMode(VideoConvert::UnknownMode), 57 _videoWidth(1), _videoHeight(1), captureEnabled(p->frame_capture), 58 captureCurrentFrame(0), captureLastHash(0), captureBitmap(0) | 56 fb(&FrameBuffer::dummy), 57 _videoWidth(fb->width()), _videoHeight(fb->height()), 58 captureEnabled(p->frame_capture), 59 captureCurrentFrame(0), captureLastHash(0) |
59{ 60 if (captureEnabled) { 61 // remove existing frame output directory if it exists, then create a 62 // clean empty directory 63 const string FRAME_OUTPUT_SUBDIR = "frames_" + name(); 64 simout.remove(FRAME_OUTPUT_SUBDIR, true); 65 captureOutputDirectory = simout.createSubdirectory( 66 FRAME_OUTPUT_SUBDIR); 67 } 68} 69 70void | 60{ 61 if (captureEnabled) { 62 // remove existing frame output directory if it exists, then create a 63 // clean empty directory 64 const string FRAME_OUTPUT_SUBDIR = "frames_" + name(); 65 simout.remove(FRAME_OUTPUT_SUBDIR, true); 66 captureOutputDirectory = simout.createSubdirectory( 67 FRAME_OUTPUT_SUBDIR); 68 } 69} 70 71void |
71VncInput::setFrameBufferParams(VideoConvert::Mode mode, uint16_t width, 72 uint16_t height) | 72VncInput::setFrameBuffer(const FrameBuffer *rfb) |
73{ | 73{ |
74 DPRINTF(VNC, "Updating video params: mode: %d width: %d height: %d\n", mode, 75 width, height); | 74 if (!rfb) 75 panic("Trying to VNC frame buffer to NULL!"); |
76 | 76 |
77 if (mode != videoMode || width != videoWidth() || height != videoHeight()) { 78 videoMode = mode; 79 _videoWidth = width; 80 _videoHeight = height; | 77 fb = rfb; |
81 | 78 |
82 if (vc) 83 delete vc; | 79 // create bitmap of the frame with new attributes 80 if (captureEnabled) 81 captureBitmap.reset(new Bitmap(rfb)); |
84 | 82 |
85 vc = new VideoConvert(mode, VideoConvert::rgb8888, videoWidth(), 86 videoHeight()); | 83 // Setting a new frame buffer means that we need to send an update 84 // to the client. Mark the internal buffers as dirty to do so. 85 setDirty(); 86} |
87 | 87 |
88 if (captureEnabled) { 89 // create bitmap of the frame with new attributes 90 if (captureBitmap) 91 delete captureBitmap; | 88void 89VncInput::setDirty() 90{ 91 const unsigned width(fb->width()); 92 const unsigned height(fb->height()); |
92 | 93 |
93 assert(fbPtr); 94 captureBitmap = new Bitmap(videoMode, width, height, fbPtr); 95 assert(captureBitmap); 96 } | 94 if (_videoWidth != width || _videoHeight != height) { 95 DPRINTF(VNC, "Updating video params: width: %d height: %d\n", 96 width, height); 97 98 _videoWidth = width; 99 _videoHeight = height; 100 101 frameBufferResized(); |
97 } | 102 } |
103 104 if (captureEnabled) 105 captureFrameBuffer(); |
|
98} 99 100void 101VncInput::captureFrameBuffer() 102{ 103 assert(captureBitmap); 104 105 // skip identical frames | 106} 107 108void 109VncInput::captureFrameBuffer() 110{ 111 assert(captureBitmap); 112 113 // skip identical frames |
106 uint64_t new_hash = captureBitmap->getHash(); | 114 uint64_t new_hash = fb->getHash(); |
107 if (captureLastHash == new_hash) 108 return; 109 captureLastHash = new_hash; 110 111 // get the filename for the current frame 112 char frameFilenameBuffer[64]; 113 snprintf(frameFilenameBuffer, 64, "fb.%06d.%lld.bmp.gz", 114 captureCurrentFrame, static_cast<long long int>(curTick())); 115 const string frameFilename(frameFilenameBuffer); 116 117 // create the compressed framebuffer file 118 ostream *fb_out = simout.create(captureOutputDirectory + frameFilename, | 115 if (captureLastHash == new_hash) 116 return; 117 captureLastHash = new_hash; 118 119 // get the filename for the current frame 120 char frameFilenameBuffer[64]; 121 snprintf(frameFilenameBuffer, 64, "fb.%06d.%lld.bmp.gz", 122 captureCurrentFrame, static_cast<long long int>(curTick())); 123 const string frameFilename(frameFilenameBuffer); 124 125 // create the compressed framebuffer file 126 ostream *fb_out = simout.create(captureOutputDirectory + frameFilename, |
119 true); 120 captureBitmap->write(fb_out); | 127 true); 128 captureBitmap->write(*fb_out); |
121 simout.close(fb_out); 122 123 ++captureCurrentFrame; 124} 125 126// create the VNC Replayer object 127VncInput * 128VncInputParams::create() 129{ 130 return new VncInput(this); 131} | 129 simout.close(fb_out); 130 131 ++captureCurrentFrame; 132} 133 134// create the VNC Replayer object 135VncInput * 136VncInputParams::create() 137{ 138 return new VncInput(this); 139} |