This commit is contained in:
2025-09-25 16:56:53 +08:00
parent e44678d519
commit 1d9da56656
88 changed files with 18171 additions and 0 deletions

215
displaywind.cpp Normal file
View File

@@ -0,0 +1,215 @@
#include "displaywind.h"
#include "ui_displaywind.h"
#include <QDebug>
#include <QPainter>
DisplayWind::DisplayWind(QWidget *parent) :
QWidget(parent),
ui(new Ui::DisplayWind),
bIsFull_(false)
// stParentWidget_(parent)
{
ui->setupUi(this);
win_width_ = width();
win_height_ = height();
memset(&dst_video_frame_, sizeof(VideoFrame), 0);
play_state_ = 2;
}
DisplayWind::~DisplayWind()
{
QMutexLocker locker(&m_mutex);
delete ui;
DeInit();
}
int DisplayWind::Draw(const Frame *frame)
{
QMutexLocker locker(&m_mutex);
if(!img_scaler_ || req_resize_) {
if(img_scaler_) {
DeInit();
}
win_width_ = width();
win_height_ = height();
video_width = frame->width;
video_height = frame->height;
img_scaler_ = new ImageScaler();
double video_aspect_ratio = frame->width * 1.0 / frame->height;
double win_aspect_ratio = win_width_ * 1.0 / win_height_;
if(win_aspect_ratio > video_aspect_ratio) {
//此时应该是调整x的起始位置以高度为基准
img_height = win_height_;
img_height &= 0xfffc;
img_width = img_height * video_aspect_ratio;
img_width &= 0xfffc;
y_ = 0;
x_ = (win_width_ - img_width) / 2;
} else {
//此时应该是调整y的起始位置以宽度为基准
img_width = win_width_;
img_width &= 0xfffc;
img_height = img_width / video_aspect_ratio;
img_height &= 0xfffc;
x_ = 0;
y_ = (win_height_ - img_height) / 2;
}
img_scaler_->Init(video_width, video_height, frame->format,
img_width, img_height, AV_PIX_FMT_RGB24);
memset(&dst_video_frame_, 0, sizeof(VideoFrame));
dst_video_frame_.width = img_width;
dst_video_frame_.height = img_height;
dst_video_frame_.format = AV_PIX_FMT_RGB24;
dst_video_frame_.data[0] = (uint8_t*)malloc(img_width * img_height * 3);
dst_video_frame_.linesize[0] = img_width * 3; // 每行的字节数
req_resize_ = false;
}
img_scaler_->Scale3(frame, &dst_video_frame_);
QImage imageTmp = QImage((uint8_t *)dst_video_frame_.data[0],
img_width, img_height, QImage::Format_RGB888);
img = imageTmp.copy(0, 0, img_width, img_height);
update();
// repaint();
return 0;
}
void DisplayWind::DeInit()
{
if(dst_video_frame_.data[0]) {
free(dst_video_frame_.data[0]);
dst_video_frame_.data[0] = NULL;
}
if(img_scaler_) {
delete img_scaler_;
img_scaler_ = NULL;
}
}
void DisplayWind::StartPlay()
{
QMutexLocker locker(&m_mutex);
play_state_ = 1;
}
void DisplayWind::StopPlay()
{
QMutexLocker locker(&m_mutex);
play_state_ = 2;
update();
}
void DisplayWind::onToggleFullScreen(bool full)
{
if (full && !bIsFull_) {
enterFullScreen();
}
else if (!full && bIsFull_) {
exitFullScreen();
}
}
void DisplayWind::enterFullScreen()
{
if (bIsFull_)
return;
bIsFull_ = true;
nWinHeightBack_ = height();
nWinWidthBack_ = width();
stParentWidget_ = this->parentWidget();
if (stParentWidget_) {
stParentLayout_ = qobject_cast<QBoxLayout*>(stParentWidget_->layout());
if (stParentLayout_) {
nParentLayoutIndex_ = stParentLayout_->indexOf(this);
stParentLayout_->removeWidget(this);
}
else {
stOriginalGeometry_ = geometry();
}
setParent(nullptr);
}
setWindowFlags(Qt::Window);
showFullScreen();
setFocus();
emit signalFullScreenChanged();
}
void DisplayWind::exitFullScreen()
{
if (!bIsFull_)
return;
bIsFull_ = false;
setWindowFlags(Qt::Widget);
hide();
if (stParentWidget_) {
setParent(stParentWidget_);
if (stParentLayout_ && nParentLayoutIndex_ >= 0) {
LOG(DEBUG)<< "insertWidget";
stParentLayout_->insertWidget(nParentLayoutIndex_, this);
}
else if (!stOriginalGeometry_.isNull()) {
LOG(DEBUG)<< "setGeometry";
setGeometry(stOriginalGeometry_);
}
}
resize(nWinWidthBack_, nWinHeightBack_);
show();
setFocus();
stParentLayout_ = nullptr;
nParentLayoutIndex_ = 0;
stOriginalGeometry_ = QRect();
emit signalFullScreenChanged();
}
void DisplayWind::paintEvent(QPaintEvent *)
{
QMutexLocker locker(&m_mutex);
if(play_state_ == 1) { // 播放状态
if (img.isNull()) {
return;
}
QPainter painter(this);
painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
// // p.translate(X, Y);
// // p.drawImage(QRect(0, 0, W, H), img);
QRect rect = QRect(x_, y_, img.width(), img.height());
// qDebug() << rect << ", win_w:" << this->width() << ", h:" << this->height();
painter.drawImage(rect, img.scaled(img.width(), img.height()));
} else if(play_state_ == 2) {
QPainter p(this);
p.setPen(Qt::NoPen);
p.setBrush(Qt::black);
p.drawRect(rect());
}
}
void DisplayWind::resizeEvent(QResizeEvent *event)
{
QMutexLocker locker(&m_mutex);
if(win_width_ != width() || win_height_ != height()) {
// DeInit(); // 释放尺寸缩放资源等下一次draw的时候重新初始化
// win_width = width();
// win_height = height();
req_resize_ = true;
}
}
void DisplayWind::keyPressEvent(QKeyEvent *event)
{
if (bIsFull_) {
if (event->key() == Qt::Key_Escape) {
exitFullScreen();
event->accept();
return;
}
}
}