pull/175/head^2
Apex Liu 2019-11-15 09:35:00 +08:00
parent 41fa960afc
commit 5455c9ab8d
8 changed files with 26 additions and 264 deletions

View File

@ -491,7 +491,7 @@ void Bar::onMousePress(int x, int y, Qt::MouseButton button) {
} }
} }
void Bar::onMouseRelease(int x, int y, Qt::MouseButton button) { void Bar::onMouseRelease(int, int, Qt::MouseButton button) {
// 我们只关心左键释放 // 我们只关心左键释放
if(button != Qt::LeftButton) if(button != Qt::LeftButton)
return; return;

View File

@ -33,6 +33,8 @@ MainWindow::MainWindow(QWidget *parent) :
m_play_state = PLAY_STATE_UNKNOWN; m_play_state = PLAY_STATE_UNKNOWN;
m_thr_data = nullptr; m_thr_data = nullptr;
m_disable_draw = false;
ui->setupUi(this); ui->setupUi(this);
ui->centralWidget->setMouseTracking(true); ui->centralWidget->setMouseTracking(true);
@ -99,7 +101,7 @@ void MainWindow::set_resource(const QString &res) {
void MainWindow::_do_first_run() { void MainWindow::_do_first_run() {
m_thr_data = new ThrData(this, m_res); m_thr_data = new ThrData(this, m_res);
connect(m_thr_data, SIGNAL(signal_update_data(UpdateData*)), this, SLOT(_do_update_data(UpdateData*))); connect(m_thr_data, SIGNAL(signal_update_data(UpdateData*)), this, SLOT(_do_update_data(UpdateData*)));
m_thr_data->start(); m_thr_data->start(QThread::TimeCriticalPriority);
m_thr_play = new ThrPlay(this); m_thr_play = new ThrPlay(this);
connect(m_thr_play, SIGNAL(signal_update_data(UpdateData*)), this, SLOT(_do_update_data(UpdateData*))); connect(m_thr_play, SIGNAL(signal_update_data(UpdateData*)), this, SLOT(_do_update_data(UpdateData*)));
@ -134,20 +136,6 @@ void MainWindow::paintEvent(QPaintEvent *e)
painter.drawPixmap(m_pt.x-m_pt_normal.width()/2, m_pt.y-m_pt_normal.height()/2, m_pt_normal); painter.drawPixmap(m_pt.x-m_pt_normal.width()/2, m_pt.y-m_pt_normal.height()/2, m_pt_normal);
} }
// {
// QRect rc_draw = e->rect();
// QRect rc(m_rc_message);
// //rc.moveTo(m_rc.left()+rc.left(), m_rc.top() + rc.top());
// int from_x = max(rc_draw.left(), rc.left()) - rc.left();
// int from_y = max(rc_draw.top(), rc.top()) - rc.top();
// int w = min(rc.right(), rc_draw.right()) - rc.left() - from_x + 1;
// int h = min(rc.bottom(), rc_draw.bottom()) - rc.top() - from_y + 1;
// int to_x = rc.left() + from_x;
// int to_y = rc.top() + from_y;
// painter.drawPixmap(to_x, to_y, m_img_message, from_x, from_y, w, h);
// }
// 绘制浮动控制窗 // 绘制浮动控制窗
if(m_bar_fading) { if(m_bar_fading) {
painter.setOpacity(m_bar_opacity); painter.setOpacity(m_bar_opacity);
@ -161,15 +149,16 @@ void MainWindow::paintEvent(QPaintEvent *e)
if(m_show_message) { if(m_show_message) {
QRect rc_draw = e->rect(); QRect rc_draw = e->rect();
QRect rc(m_rc_message); QRect rc(m_rc_message);
//rc.moveTo(m_rc.left()+rc.left(), m_rc.top() + rc.top());
int from_x = max(rc_draw.left(), rc.left()) - rc.left(); if(e->rect().intersects(rc)) {
int from_y = max(rc_draw.top(), rc.top()) - rc.top(); int from_x = max(rc_draw.left(), rc.left()) - rc.left();
int w = min(rc.right(), rc_draw.right()) - rc.left() - from_x + 1; int from_y = max(rc_draw.top(), rc.top()) - rc.top();
int h = min(rc.bottom(), rc_draw.bottom()) - rc.top() - from_y + 1; int w = min(rc.right(), rc_draw.right()) - rc.left() - from_x + 1;
int to_x = rc.left() + from_x; int h = min(rc.bottom(), rc_draw.bottom()) - rc.top() - from_y + 1;
int to_y = rc.top() + from_y; int to_x = rc.left() + from_x;
painter.drawPixmap(to_x, to_y, m_img_message, from_x, from_y, w, h); int to_y = rc.top() + from_y;
painter.drawPixmap(to_x, to_y, m_img_message, from_x, from_y, w, h);
}
} }
} }
@ -187,7 +176,6 @@ void MainWindow::resume(bool relocate, uint32_t ms) {
m_thr_play->resume(relocate, ms); m_thr_play->resume(relocate, ms);
} }
else if(m_play_state == PLAY_STATE_STOP) { else if(m_play_state == PLAY_STATE_STOP) {
// _start_play_thread();
m_thr_data->restart(ms); m_thr_data->restart(ms);
m_thr_play->resume(true, ms); m_thr_play->resume(true, ms);
} }
@ -218,7 +206,7 @@ void MainWindow::_do_update_data(UpdateData* dat) {
if(uimgs.size() == 0) if(uimgs.size() == 0)
return; return;
if(uimgs.size() > 1) { if(uimgs.size() > 1 && !m_disable_draw) {
// 禁止界面更新 // 禁止界面更新
setUpdatesEnabled(false); setUpdatesEnabled(false);
} }
@ -231,7 +219,7 @@ void MainWindow::_do_update_data(UpdateData* dat) {
} }
if(uimgs.size() > 1) { if(uimgs.size() > 1 && !m_disable_draw) {
// 允许界面更新 // 允许界面更新
setUpdatesEnabled(true); setUpdatesEnabled(true);
} }
@ -246,12 +234,14 @@ void MainWindow::_do_update_data(UpdateData* dat) {
else if(dat->data_type() == TYPE_DISABLE_DRAW) { else if(dat->data_type() == TYPE_DISABLE_DRAW) {
// 禁止界面更新 // 禁止界面更新
m_disable_draw = true;
setUpdatesEnabled(false); setUpdatesEnabled(false);
return; return;
} }
else if(dat->data_type() == TYPE_ENABLE_DRAW) { else if(dat->data_type() == TYPE_ENABLE_DRAW) {
// 允许界面更新 // 允许界面更新
m_disable_draw = false;
setUpdatesEnabled(true); setUpdatesEnabled(true);
return; return;
} }
@ -265,10 +255,6 @@ void MainWindow::_do_update_data(UpdateData* dat) {
m_show_message = true; m_show_message = true;
qDebug("1message, w=%d, h=%d", m_canvas.width(), m_canvas.height()); qDebug("1message, w=%d, h=%d", m_canvas.width(), m_canvas.height());
// if(0 == m_canvas.width()) {
// QMessageBox::warning(nullptr, QGuiApplication::applicationDisplayName(), dat->message());
// return;
// }
QPainter pp(&m_canvas); QPainter pp(&m_canvas);
QRect rcWin(0, 0, m_canvas.width(), m_canvas.height()); QRect rcWin(0, 0, m_canvas.width(), m_canvas.height());
@ -318,22 +304,13 @@ void MainWindow::_do_update_data(UpdateData* dat) {
qDebug() << "resize (" << m_rec_hdr.basic.width << "," << m_rec_hdr.basic.height << ")"; qDebug() << "resize (" << m_rec_hdr.basic.width << "," << m_rec_hdr.basic.height << ")";
//if(m_canvas.width() != m_rec_hdr.basic.width && m_canvas.height() != m_rec_hdr.basic.height) { m_canvas = QPixmap(m_rec_hdr.basic.width, m_rec_hdr.basic.height);
m_canvas = QPixmap(m_rec_hdr.basic.width, m_rec_hdr.basic.height);
//m_win_board_w = frameGeometry().width() - geometry().width(); QDesktopWidget *desktop = QApplication::desktop(); // =qApp->desktop();也可以
//m_win_board_h = frameGeometry().height() - geometry().height(); qDebug("desktop w:%d,h:%d, this w:%d,h:%d", desktop->width(), desktop->height(), width(), height());
move(10, (desktop->height() - m_rec_hdr.basic.height)/2);
QDesktopWidget *desktop = QApplication::desktop(); // =qApp->desktop();也可以 setFixedSize(m_rec_hdr.basic.width, m_rec_hdr.basic.height);
qDebug("desktop w:%d,h:%d, this w:%d,h:%d", desktop->width(), desktop->height(), width(), height());
//move((desktop->width() - this->width())/2, (desktop->height() - this->height())/2);
move(10, (desktop->height() - m_rec_hdr.basic.height)/2);
//setFixedSize(m_rec_hdr.basic.width + m_win_board_w, m_rec_hdr.basic.height + m_win_board_h);
//resize(m_rec_hdr.basic.width + m_win_board_w, m_rec_hdr.basic.height + m_win_board_h);
//resize(m_rec_hdr.basic.width, m_rec_hdr.basic.height);
setFixedSize(m_rec_hdr.basic.width, m_rec_hdr.basic.height);
//}
m_canvas.fill(QColor(38, 73, 111)); m_canvas.fill(QColor(38, 73, 111));
@ -352,13 +329,11 @@ void MainWindow::_do_update_data(UpdateData* dat) {
QString title; QString title;
if (m_rec_hdr.basic.conn_port == 3389) { if (m_rec_hdr.basic.conn_port == 3389) {
// title = QString(LOCAL8BIT("[%1] %2@%3 [Teleport-RDP录像回放]").arg(m_rec_hdr.basic.acc_username, m_rec_hdr.basic.user_username, m_rec_hdr.basic.conn_ip));
title = QString(LOCAL8BIT("用户 %1 访问 %2 的 %3 账号").arg(m_rec_hdr.basic.user_username, m_rec_hdr.basic.conn_ip, m_rec_hdr.basic.acc_username)); title = QString(LOCAL8BIT("用户 %1 访问 %2 的 %3 账号").arg(m_rec_hdr.basic.user_username, m_rec_hdr.basic.conn_ip, m_rec_hdr.basic.acc_username));
} }
else { else {
QString _port; QString _port;
_port.sprintf("%d", m_rec_hdr.basic.conn_port); _port.sprintf("%d", m_rec_hdr.basic.conn_port);
//title = QString(LOCAL8BIT("[%1] %2@%3:%4 [Teleport-RDP录像回放]").arg(m_rec_hdr.basic.acc_username, m_rec_hdr.basic.user_username, m_rec_hdr.basic.conn_ip, _port));
title = QString(LOCAL8BIT("用户 %1 访问 %2:%3 的 %4 账号").arg(m_rec_hdr.basic.user_username, m_rec_hdr.basic.conn_ip, _port, m_rec_hdr.basic.acc_username)); title = QString(LOCAL8BIT("用户 %1 访问 %2:%3 的 %4 账号").arg(m_rec_hdr.basic.user_username, m_rec_hdr.basic.conn_ip, _port, m_rec_hdr.basic.acc_username));
} }

View File

@ -46,8 +46,6 @@ private:
void mousePressEvent(QMouseEvent *e); void mousePressEvent(QMouseEvent *e);
void mouseReleaseEvent(QMouseEvent *e); void mouseReleaseEvent(QMouseEvent *e);
// void _start_play_thread();
private slots: private slots:
void _do_first_run(); // 默认界面加载完成后,开始播放操作(可能会进行数据下载) void _do_first_run(); // 默认界面加载完成后,开始播放操作(可能会进行数据下载)
void _do_update_data(UpdateData*); void _do_update_data(UpdateData*);
@ -86,6 +84,7 @@ private:
bool m_show_message; bool m_show_message;
QPixmap m_img_message; QPixmap m_img_message;
QRect m_rc_message; QRect m_rc_message;
bool m_disable_draw;
}; };
#endif // MAINWINDOW_H #endif // MAINWINDOW_H

View File

@ -311,7 +311,6 @@ void ThrData::_run() {
file_processed = 0; file_processed = 0;
qDebug("Open file tp-rdp-%d.tpd, processed: %" PRId64 ", size: %" PRId64, m_file_idx+1, file_processed, file_size); qDebug("Open file tp-rdp-%d.tpd, processed: %" PRId64 ", size: %" PRId64, m_file_idx+1, file_processed, file_size);
} }
// qDebug("B processed: %" PRId64 ", size: %" PRId64, file_processed, file_size);
// 如果指定了起始偏移,则跳过这部分数据 // 如果指定了起始偏移,则跳过这部分数据
if(m_offset > 0) { if(m_offset > 0) {
@ -331,8 +330,6 @@ void ThrData::_run() {
TS_RECORD_PKG pkg; TS_RECORD_PKG pkg;
read_len = fdata->read(reinterpret_cast<char*>(&pkg), sizeof(TS_RECORD_PKG)); read_len = fdata->read(reinterpret_cast<char*>(&pkg), sizeof(TS_RECORD_PKG));
// if(read_len == 0)
// break;
if(read_len != sizeof(TS_RECORD_PKG)) { if(read_len != sizeof(TS_RECORD_PKG)) {
qDebug("invaid tp-rdp-%d.tpd file, read_len=%" PRId64 " (1).", m_file_idx+1, read_len); qDebug("invaid tp-rdp-%d.tpd file, read_len=%" PRId64 " (1).", m_file_idx+1, read_len);
_notify_error(QString("%1\ntp-rdp-%2.tpd").arg(LOCAL8BIT("错误的录像数据文件!"), str_fidx)); _notify_error(QString("%1\ntp-rdp-%2.tpd").arg(LOCAL8BIT("错误的录像数据文件!"), str_fidx));
@ -358,9 +355,7 @@ void ThrData::_run() {
} }
file_processed += pkg.size; file_processed += pkg.size;
//UpdateData* dat = new UpdateData(m_hdr.basic.width, m_hdr.basic.height);
UpdateData* dat = _parse(pkg, pkg_data); UpdateData* dat = _parse(pkg, pkg_data);
//if(!dat->parse(pkg, pkg_data)) {
if(dat == nullptr) { if(dat == nullptr) {
qDebug("invaid tp-rdp-%d.tpd file (4).", m_file_idx+1); qDebug("invaid tp-rdp-%d.tpd file (4).", m_file_idx+1);
_notify_error(QString("%1\ntp-rdp-%2.tpd").arg(LOCAL8BIT("错误的录像数据文件!"), str_fidx)); _notify_error(QString("%1\ntp-rdp-%2.tpd").arg(LOCAL8BIT("错误的录像数据文件!"), str_fidx));
@ -398,7 +393,7 @@ void ThrData::_run() {
} }
// 让线程调度器让播放线程有机会执行 // 让线程调度器让播放线程有机会执行
msleep(1); // msleep(1);
// 如果此文件已经处理完毕,则关闭文件,这样下次处理一个新的文件 // 如果此文件已经处理完毕,则关闭文件,这样下次处理一个新的文件
if(file_processed >= file_size) { if(file_processed >= file_size) {
@ -692,20 +687,11 @@ bool ThrData::_load_keyframe() {
return true; return true;
} }
void ThrData::_prepare() {
UpdateData* d = new UpdateData(TYPE_HEADER_INFO);
m_locker.lock();
m_data.enqueue(d);
m_locker.unlock();
}
UpdateData* ThrData::get_data() { UpdateData* ThrData::get_data() {
UpdateData* d = nullptr; UpdateData* d = nullptr;
m_locker.lock(); m_locker.lock();
if(m_data.size() > 0) { if(m_data.size() > 0) {
// qDebug("get_data(), left: %d", m_data.size());
d = m_data.dequeue(); d = m_data.dequeue();
} }
m_locker.unlock(); m_locker.unlock();

View File

@ -34,12 +34,6 @@
*/ */
//typedef struct KEYFRAME_INFO {
// uint32_t time_ms; // 此关键帧的时间点
// uint32_t file_index; // 此关键帧图像数据位于哪一个数据文件中
// uint32_t offset; // 此关键帧图像数据在数据文件中的偏移
//}KEYFRAME_INFO;
typedef std::vector<TS_RECORD_RDP_KEYFRAME_INFO> KeyFrames; typedef std::vector<TS_RECORD_RDP_KEYFRAME_INFO> KeyFrames;
typedef std::vector<QImage*> CachedImages; typedef std::vector<QImage*> CachedImages;
@ -70,7 +64,7 @@ private:
bool _load_keyframe(); bool _load_keyframe();
void _clear_data(); void _clear_data();
void _prepare(); // void _prepare();
UpdateData* _parse(const TS_RECORD_PKG& pkg, const QByteArray& data); UpdateData* _parse(const TS_RECORD_PKG& pkg, const QByteArray& data);
@ -107,8 +101,6 @@ private:
uint32_t m_file_idx; uint32_t m_file_idx;
uint32_t m_offset; uint32_t m_offset;
// bool m_xxx;
// int m_restart_kf_idx;
CachedImages m_cache_imgs; CachedImages m_cache_imgs;
}; };

View File

@ -36,19 +36,9 @@ void ThrPlay::stop() {
if(!isRunning()) if(!isRunning())
return; return;
// warning: never call stop() inside thread::run() loop.
m_need_stop = true; m_need_stop = true;
wait(); wait();
qDebug() << "play-thread end."; qDebug() << "play-thread end.";
// if(m_thr_data) {
// m_thr_data->stop();
// qDebug("delete thrData.");
// //m_thr_download->wait();
// delete m_thr_data;
// m_thr_data = nullptr;
// }
} }
void ThrPlay::_notify_message(const QString& msg) { void ThrPlay::_notify_message(const QString& msg) {
@ -144,6 +134,7 @@ void ThrPlay::run() {
delete dat; delete dat;
dat = nullptr; dat = nullptr;
UpdateData* _disable = new UpdateData(TYPE_DISABLE_DRAW); UpdateData* _disable = new UpdateData(TYPE_DISABLE_DRAW);
msleep(500);
emit signal_update_data(_disable); emit signal_update_data(_disable);
break; break;
} }

View File

@ -1,81 +1,9 @@
#include "update_data.h" #include "update_data.h"
//#include "rle.h"
#include <QImage> #include <QImage>
#include <QDebug> #include <QDebug>
//static QImage* _rdpimg2QImage(int w, int h, int bitsPerPixel, bool isCompressed, const uint8_t* dat, uint32_t len) {
// QImage* out;
// switch(bitsPerPixel) {
// case 15:
// if(isCompressed) {
// uint8_t* _dat = reinterpret_cast<uint8_t*>(calloc(1, w*h*2));
// if(!bitmap_decompress1(_dat, w, h, dat, len)) {
// free(_dat);
// return nullptr;
// }
// out = new QImage(_dat, w, h, QImage::Format_RGB555);
// free(_dat);
// }
// else {
// out = new QImage(QImage(dat, w, h, QImage::Format_RGB555).transformed(QMatrix(1.0, 0.0, 0.0, -1.0, 0.0, 0.0)));
// }
// return out;
// case 16:
// if(isCompressed) {
// uint8_t* _dat = reinterpret_cast<uint8_t*>(calloc(1, w*h*2));
// if(!bitmap_decompress2(_dat, w, h, dat, len)) {
// free(_dat);
// qDebug() << "22------------------DECOMPRESS2 failed.";
// return nullptr;
// }
// // TODO: 这里需要进一步优化直接操作QImage的buffer。
// out = new QImage(w, h, QImage::Format_RGB16);
// for(int y = 0; y < h; y++) {
// for(int x = 0; x < w; x++) {
// uint16 a = ((uint16*)_dat)[y * w + x];
// uint8 r = ((a & 0xf800) >> 11) * 255 / 31;
// uint8 g = ((a & 0x07e0) >> 5) * 255 / 63;
// uint8 b = (a & 0x001f) * 255 / 31;
// out->setPixelColor(x, y, QColor(r,g,b));
// }
// }
// free(_dat);
// return out;
// }
// else {
// out = new QImage(QImage(dat, w, h, QImage::Format_RGB16).transformed(QMatrix(1.0, 0.0, 0.0, -1.0, 0.0, 0.0)));
// }
// return out;
// case 24:
// case 32:
// default:
// qDebug() << "--------NOT support UNKNOWN bitsPerPix" << bitsPerPixel;
// return nullptr;
// }
//}
//static QImage* _raw2QImage(int w, int h, const uint8_t* dat, uint32_t len) {
// QImage* out;
// // TODO: 这里需要进一步优化直接操作QImage的buffer。
// out = new QImage(w, h, QImage::Format_RGB16);
// for(int y = 0; y < h; y++) {
// for(int x = 0; x < w; x++) {
// uint16 a = ((uint16*)dat)[y * w + x];
// uint8 r = ((a & 0xf800) >> 11) * 255 / 31;
// uint8 g = ((a & 0x07e0) >> 5) * 255 / 63;
// uint8 b = (a & 0x001f) * 255 / 31;
// out->setPixelColor(x, y, QColor(r,g,b));
// }
// }
// return out;
//}
UpdateData::UpdateData() : QObject(nullptr) UpdateData::UpdateData() : QObject(nullptr)
{ {
_init(); _init();
@ -102,25 +30,14 @@ UpdateData::UpdateData(const TS_RECORD_HEADER& hdr) : QObject(nullptr)
memcpy(m_hdr, &hdr, sizeof(TS_RECORD_HEADER)); memcpy(m_hdr, &hdr, sizeof(TS_RECORD_HEADER));
} }
//UpdateData::UpdateData(uint16_t screen_w, uint16_t screen_h) {
// _init();
// m_screen_w = screen_w;
// m_screen_h = screen_h;
//}
void UpdateData::_init() { void UpdateData::_init() {
m_data_type = TYPE_UNKNOWN; m_data_type = TYPE_UNKNOWN;
m_hdr = nullptr; m_hdr = nullptr;
m_pointer = nullptr; m_pointer = nullptr;
// m_img = nullptr;
// m_img_info = nullptr;
m_data_buf = nullptr; m_data_buf = nullptr;
m_data_len = 0; m_data_len = 0;
m_time_ms = 0; m_time_ms = 0;
m_screen_w = 0;
m_screen_h = 0;
} }
UpdateData::~UpdateData() { UpdateData::~UpdateData() {
@ -128,10 +45,6 @@ UpdateData::~UpdateData() {
delete m_hdr; delete m_hdr;
if(m_pointer) if(m_pointer)
delete m_pointer; delete m_pointer;
// if(m_img)
// delete m_img;
// if(m_img_info)
// delete m_img_info;
for(int i = 0; i < m_images.size(); ++i) { for(int i = 0; i < m_images.size(); ++i) {
delete m_images[i].img; delete m_images[i].img;
} }
@ -148,88 +61,6 @@ void UpdateData::set_pointer(uint32_t ts, const TS_RECORD_RDP_POINTER* p) {
memcpy(m_pointer, p, sizeof(TS_RECORD_RDP_POINTER)); memcpy(m_pointer, p, sizeof(TS_RECORD_RDP_POINTER));
} }
#if 0
bool UpdateData::parse(const TS_RECORD_PKG& pkg, const QByteArray& data) {
m_time_ms = pkg.time_ms;
if(pkg.type == TS_RECORD_TYPE_RDP_POINTER) {
m_data_type = TYPE_POINTER;
if(data.size() != sizeof(TS_RECORD_RDP_POINTER))
return false;
m_pointer = new TS_RECORD_RDP_POINTER;
memcpy(m_pointer, data.data(), sizeof(TS_RECORD_RDP_POINTER));
return true;
}
else if(pkg.type == TS_RECORD_TYPE_RDP_IMAGE) {
m_data_type = TYPE_IMAGE;
if(data.size() <= static_cast<int>(sizeof(uint16_t) + sizeof(TS_RECORD_RDP_IMAGE_INFO)))
return false;
const uint8_t* dat_ptr = reinterpret_cast<const uint8_t*>(data.data());
uint16_t count = (reinterpret_cast<const uint16_t*>(dat_ptr))[0];
uint32_t offset = sizeof(uint16_t);
for(uint16_t i = 0; i < count; ++i) {
const TS_RECORD_RDP_IMAGE_INFO* info = reinterpret_cast<const TS_RECORD_RDP_IMAGE_INFO*>(dat_ptr+offset);
offset += sizeof(TS_RECORD_RDP_IMAGE_INFO);
//const uint8_t* img_dat = reinterpret_cast<const uint8_t*>(data.data() + sizeof(TS_RECORD_RDP_IMAGE_INFO));
//uint32_t img_len = data.size() - sizeof(TS_RECORD_RDP_IMAGE_INFO);
const uint8_t* img_dat = dat_ptr + offset;
offset += info->dat_len;
QImage* img = _rdpimg2QImage(info->width, info->height, info->bitsPerPixel, (info->format == TS_RDP_IMG_BMP) ? true : false, img_dat, info->dat_len);
if(img == nullptr)
return false;
// m_img = img;
// m_img_x = info->destLeft;
// m_img_y = info->destTop;
// m_img_w = info->destRight - info->destLeft + 1;
// m_img_h = info->destBottom - info->destTop + 1;
UPDATE_IMAGE uimg;
uimg.x = info->destLeft;
uimg.y = info->destTop;
uimg.w = info->destRight - info->destLeft + 1;
uimg.h = info->destBottom - info->destTop + 1;
uimg.img = img;
m_images.push_back(uimg);
}
return true;
}
else if(pkg.type == TS_RECORD_TYPE_RDP_KEYFRAME) {
m_data_type = TYPE_IMAGE;
// const TS_RECORD_RDP_KEYFRAME_INFO* info = reinterpret_cast<const TS_RECORD_RDP_KEYFRAME_INFO*>(data.data());
const uint8_t* img_dat = reinterpret_cast<const uint8_t*>(data.data() + sizeof(TS_RECORD_RDP_KEYFRAME_INFO));
uint32_t img_len = data.size() - sizeof(TS_RECORD_RDP_KEYFRAME_INFO);
QImage* img = _raw2QImage((int)m_screen_w, (int)m_screen_h, img_dat, img_len);
if(img == nullptr)
return false;
UPDATE_IMAGE uimg;
uimg.x = 0;
uimg.y = 0;
uimg.w = m_screen_w;
uimg.h = m_screen_h;
uimg.img = img;
m_images.push_back(uimg);
// m_img = img;
// m_img_x = 0;
// m_img_y = 0;
// m_img_w = m_screen_w;
// m_img_h = m_screen_h;
return true;
}
return false;
}
#endif
void UpdateData::alloc_data(uint32_t len) { void UpdateData::alloc_data(uint32_t len) {
if(m_data_buf) if(m_data_buf)
delete m_data_buf; delete m_data_buf;

View File

@ -39,12 +39,10 @@ public:
explicit UpdateData(int data_type); explicit UpdateData(int data_type);
explicit UpdateData(int data_type, uint32_t time_ms); explicit UpdateData(int data_type, uint32_t time_ms);
explicit UpdateData(const TS_RECORD_HEADER& hdr); explicit UpdateData(const TS_RECORD_HEADER& hdr);
//explicit UpdateData(uint16_t screen_w, uint16_t screen_h);
virtual ~UpdateData(); virtual ~UpdateData();
void set_pointer(uint32_t ts, const TS_RECORD_RDP_POINTER* p); void set_pointer(uint32_t ts, const TS_RECORD_RDP_POINTER* p);
// bool parse(const TS_RECORD_PKG& pkg, const QByteArray& data);
TS_RECORD_HEADER* get_header() {return m_hdr;} TS_RECORD_HEADER* get_header() {return m_hdr;}
TS_RECORD_RDP_POINTER* get_pointer() {return m_pointer;} TS_RECORD_RDP_POINTER* get_pointer() {return m_pointer;}
UpdateImages& get_images() {return m_images;} UpdateImages& get_images() {return m_images;}
@ -87,17 +85,7 @@ private:
// for POINTER // for POINTER
TS_RECORD_RDP_POINTER* m_pointer; TS_RECORD_RDP_POINTER* m_pointer;
// for IMAGE // for IMAGE
// QImage* m_img;
// int m_img_x;
// int m_img_y;
// int m_img_w;
// int m_img_h;
UpdateImages m_images; UpdateImages m_images;
// TS_RECORD_RDP_IMAGE_INFO* m_img_info;
uint16_t m_screen_w;
uint16_t m_screen_h;
}; };
class UpdateDataHelper { class UpdateDataHelper {