1/* |
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), |
56 fb(&FrameBuffer::dummy), 57 _videoWidth(fb->width()), _videoHeight(fb->height()), 58 captureEnabled(p->frame_capture), 59 captureCurrentFrame(0), captureLastHash(0) |
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 |
72VncInput::setFrameBuffer(const FrameBuffer *rfb) |
73{ |
74 if (!rfb) 75 panic("Trying to VNC frame buffer to NULL!"); |
76 |
77 fb = rfb; |
78 |
79 // create bitmap of the frame with new attributes 80 if (captureEnabled) 81 captureBitmap.reset(new Bitmap(rfb)); |
82 |
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 |
88void 89VncInput::setDirty() 90{ 91 const unsigned width(fb->width()); 92 const unsigned height(fb->height()); |
93 |
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(); |
102 } |
103 104 if (captureEnabled) 105 captureFrameBuffer(); |
106} 107 108void 109VncInput::captureFrameBuffer() 110{ 111 assert(captureBitmap); 112 113 // skip identical frames |
114 uint64_t new_hash = fb->getHash(); |
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, |
127 true); 128 captureBitmap->write(*fb_out); |
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} |