mirror of https://github.com/tp4a/teleport
.temp.
parent
41fa960afc
commit
5455c9ab8d
|
@ -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;
|
||||||
|
|
|
@ -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,8 +149,8 @@ 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());
|
|
||||||
|
|
||||||
|
if(e->rect().intersects(rc)) {
|
||||||
int from_x = max(rc_draw.left(), rc.left()) - rc.left();
|
int from_x = max(rc_draw.left(), rc.left()) - rc.left();
|
||||||
int from_y = max(rc_draw.top(), rc.top()) - rc.top();
|
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 w = min(rc.right(), rc_draw.right()) - rc.left() - from_x + 1;
|
||||||
|
@ -172,6 +160,7 @@ void MainWindow::paintEvent(QPaintEvent *e)
|
||||||
painter.drawPixmap(to_x, to_y, m_img_message, from_x, from_y, w, h);
|
painter.drawPixmap(to_x, to_y, m_img_message, from_x, from_y, w, h);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::pause() {
|
void MainWindow::pause() {
|
||||||
if(m_play_state != PLAY_STATE_RUNNING)
|
if(m_play_state != PLAY_STATE_RUNNING)
|
||||||
|
@ -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();
|
|
||||||
//m_win_board_h = frameGeometry().height() - geometry().height();
|
|
||||||
|
|
||||||
QDesktopWidget *desktop = QApplication::desktop(); // =qApp->desktop();也可以
|
QDesktopWidget *desktop = QApplication::desktop(); // =qApp->desktop();也可以
|
||||||
qDebug("desktop w:%d,h:%d, this w:%d,h:%d", desktop->width(), desktop->height(), width(), 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);
|
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);
|
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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in New Issue