Ver Fonte

V0.8.4
1、修复了删除再创建会内存泄露的问题

Apple há 1 mês atrás
pai
commit
28554e0520
6 ficheiros alterados com 198 adições e 33 exclusões
  1. 50 0
      CPlayer/Player/PlayerGLWidget.cpp
  2. 31 2
      CPlayer/cameraplayer.cpp
  3. 4 1
      CPlayer/cameraplayer.h
  4. 85 19
      show1/widget.cpp
  5. 6 1
      show1/widget.h
  6. 22 10
      show1/widget.ui

+ 50 - 0
CPlayer/Player/PlayerGLWidget.cpp

@@ -5,17 +5,65 @@
 
 PlayerGLWidget::PlayerGLWidget(QWidget *parent) : QOpenGLWidget(parent)
 {
+    textureY_ = nullptr;
+    textureU_ = nullptr;
+    textureV_ = nullptr;
+    textureIdY_ = 0;
+    textureIdU_ = 0;
+    textureIdV_ = 0;
+    Ortho2DSize_ = QSize(0, 0);
+    shaderProgram = 0;
+    VAO = 0;
+    VBO = 0;
+    EBO = 0;
+    
+
     // QString imagePath = QApplication::applicationDirPath() + "/0.jpg";
     // QImage image(imagePath);
     // Image_YUV420 yuv420;
     // convertQImageToYUV420(image, yuv420);
     // /* 显示图片  */
     // updateFrame(yuv420);
+
 }
 
 PlayerGLWidget::~PlayerGLWidget()
 {
+    if (textureIdY_ != 0) {
+        glDeleteTextures(1, &textureIdY_);
+        textureIdY_ = 0;
+    }
+    if (textureIdU_ != 0) {
+        glDeleteTextures(1, &textureIdU_);
+        textureIdU_ = 0;
+    }
+    if (textureIdV_ != 0) {
+        glDeleteTextures(1, &textureIdV_);
+        textureIdV_ = 0;
+    }
+    if (VAO != 0) {
+        glDeleteVertexArrays(1, &VAO);
+        VAO = 0;
+    }
+    if (VBO != 0) {
+        glDeleteBuffers(1, &VBO);
+        VBO = 0;
+    }
+    if (EBO != 0) {
+        glDeleteBuffers(1, &EBO);
+        EBO = 0;
+    }
+    if (shaderProgram != 0) {
+        glDeleteProgram(shaderProgram);
+        shaderProgram = 0;
+    }
 
+    delete textureY_;
+    textureY_ = nullptr;
+    delete textureU_;
+    textureU_ = nullptr;
+    delete textureV_;
+    textureV_ = nullptr;
 }
 
 /* 设置一张图片,用于显示默认的图片 */
@@ -208,6 +256,8 @@ void PlayerGLWidget::initializeGL()
 
     glBindVertexArray(VAO);
 
+    glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // 设置纹理对齐方式
+
     glBindBuffer(GL_ARRAY_BUFFER, VBO);
     glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
 

+ 31 - 2
CPlayer/cameraplayer.cpp

@@ -44,6 +44,7 @@ CameraPlayer::~CameraPlayer()
         m_frameTimer.stop();
     }
 
+
     /* 释放播放器资源 */
     if(m_player != nullptr)
     {
@@ -160,6 +161,11 @@ bool CameraPlayer::startRealPlay(int channel)
 /* 关闭预览 */
 void CameraPlayer::stopRealPlay()
 {
+    /* 停止定时器 */
+    if(m_frameTimer.isActive())
+    {
+        m_frameTimer.stop();
+    }
     //关闭预览
     NET_DVR_StopRealPlay(m_realPlayHandle);
     /* 释放播放的通道号 */
@@ -171,20 +177,29 @@ void CameraPlayer::stopRealPlay()
         m_playPort = -1;
     }
     LH_WRITE_LOG("实时获取数据结束");
+
+    /* 清空环形队列 */
+    clearRingQueue();
 }
 
 /* 开始播放预览 */
-void CameraPlayer::startPlay()
+bool CameraPlayer::startPlay()
 {
     if(m_frameRate == 0)
     {
         LH_WRITE_ERROR("帧率为0,无法播放");
-        return;
+        return false;
+    }
+    if(m_frameTimer.isActive())
+    {
+        return true;
     }
     /* 开启定时器 */
     m_frameTimer.setTimerType(Qt::PreciseTimer);
     m_frameTimer.setInterval(1000 / m_frameRate);
     m_frameTimer.start();
+
+    return true;
 }
 
 /* 设置播放窗口父指针 */
@@ -468,3 +483,17 @@ void CameraPlayer::DecCallBack(int nPort, char * pBuf, int nSize,FRAME_INFO * pF
     // LH_WRITE_LOG_DEBUG(QString("解码时间: %1 ms").arg(duration.count()));
 }
 
+/* 清空环形队列 */
+void CameraPlayer::clearRingQueue()
+{
+    int num = m_imageQueue.QueueSize();
+    for(int i = 0; i < num; i++)
+    {
+        auto one = m_imageQueue.front_pop_NoBlock();
+        if(one != nullptr)
+        {
+            delete one;
+        }
+    }
+}
+

+ 4 - 1
CPlayer/cameraplayer.h

@@ -46,7 +46,7 @@ public:
     /* 关闭预览 */
     void stopRealPlay();
     /* 开始播放预览 */
-    void startPlay();
+    bool startPlay();
     
     /* 设置播放窗口父指针 */
     void setPlayWndParent(QWidget* playWnd);
@@ -81,6 +81,9 @@ private:
     static void CALLBACK DecCallBack(int nPort, char * pBuf, int nSize,FRAME_INFO * pFrameInfo, void* nUser, int nReserved2);
 #endif
 
+    /* 清空环形队列 */
+    void clearRingQueue();
+
 private:
 
     int m_sdkVersion = 3;                               /* SDK版本,这个版本自己定义的,为了区分不同的接口函数 */

+ 85 - 19
show1/widget.cpp

@@ -19,7 +19,14 @@ widget::widget(QWidget *parent) :
 
 widget::~widget()
 {
-    delete m_cameraPlayer;
+    delete m_cameraPlayer1;
+    m_cameraPlayer1 = nullptr;
+    delete m_cameraPlayer2;
+    m_cameraPlayer2 = nullptr;
+    delete m_cameraPlayer3;
+    m_cameraPlayer3 = nullptr;
+    delete m_cameraPlayer4;
+    m_cameraPlayer4 = nullptr;
     delete ui;
 }
 
@@ -27,20 +34,40 @@ widget::~widget()
 /* 开启预览按钮 */
 void widget::on_pBtn_startRealPlay_clicked()
 {
-    m_cameraPlayer->startPlay();
+    m_cameraPlayer1->startPlay();
+    m_cameraPlayer2->startPlay();
+    m_cameraPlayer3->startPlay();
+    m_cameraPlayer4->startPlay();
     
 }
 
 /* 重新创建窗口 */
 void widget::on_pBtn_reCreate_clicked()
 {
-    if(m_cameraPlayer != nullptr)
+    if(m_cameraPlayer1 != nullptr)
     {
-        delete m_cameraPlayer;
-        m_cameraPlayer = nullptr;
+        delete m_cameraPlayer1;
+        m_cameraPlayer1 = nullptr;
     }
+    if(m_cameraPlayer2 != nullptr)
+    {
+        delete m_cameraPlayer2;
+        m_cameraPlayer2 = nullptr;
+    }
+    if(m_cameraPlayer3 != nullptr)
+    {
+        delete m_cameraPlayer3;
+        m_cameraPlayer3 = nullptr;
+    }
+    if(m_cameraPlayer4 != nullptr)
+    {
+        delete m_cameraPlayer4;
+        m_cameraPlayer4 = nullptr;
+    }
+
 
     initCameraPlayer();
+    on_pBtn_startRealPlay_clicked();
 }
 
 /* 窗口缩放事件 */
@@ -49,27 +76,66 @@ void widget::resizeEvent(QResizeEvent *event)
     QWidget::resizeEvent(event);
 
     /* 获取窗口大小 */
-    QSize size = event->size();
-    ui->widget_display->resize(size);
-    m_cameraPlayer->setPlayWndSize(event->size());
+    QSize size = ui->widget_display1->size();
+
+    // ui->m_cameraPlayer1->resize(size);
+    // ui->m_cameraPlayer2->resize(size);
+    // ui->m_cameraPlayer3->resize(size);
+    // ui->m_cameraPlayer4->resize(size);
+    m_cameraPlayer1->setPlayWndSize(size);
+    m_cameraPlayer2->setPlayWndSize(size);
+    m_cameraPlayer3->setPlayWndSize(size);
+    m_cameraPlayer4->setPlayWndSize(size);
+}
+
+/* 显示事件 */
+void widget::showEvent(QShowEvent *event)
+{
+    QWidget::showEvent(event);
+    /* 获取窗口大小 */
+    QSize size = ui->widget_display1->size();
+    m_cameraPlayer1->setPlayWndSize(size);
+    m_cameraPlayer2->setPlayWndSize(size);
+    m_cameraPlayer3->setPlayWndSize(size);
+    m_cameraPlayer4->setPlayWndSize(size);
 }
 
 void widget::initCameraPlayer()
 {
     /* 创建摄像机播放器 */
-    m_cameraPlayer = new CameraPlayer;
+    m_cameraPlayer1 = new CameraPlayer;
 
-    QString imagePath = QApplication::applicationDirPath() + "/2.jpg";
-    QImage image(imagePath);
+    // QString imagePath = QApplication::applicationDirPath() + "/2.jpg";
+    // QImage image(imagePath);
     // QImage image(1653, 899, QImage::Format_RGB888);
-    // QImage image(1666, 720, QImage::Format_RGB888);
+    QImage image(1666, 720, QImage::Format_RGB888);
     // QImage image(1280, 720, QImage::Format_RGB888);
-    m_cameraPlayer->setImage(image);
-
-    m_cameraPlayer->initCamera("192.1.2.73", 8000, "admin", "LH123456");
-    m_cameraPlayer->startRealPlay(1);
-
+    m_cameraPlayer1->setImage(image);
+    m_cameraPlayer1->initCamera("192.1.2.73", 8000, "admin", "LH123456");
+    m_cameraPlayer1->startRealPlay(1);
     /* 设置播放窗口 */
-    m_cameraPlayer->setPlayWndParent(ui->widget_display);
-    m_cameraPlayer->setPlayWndSize(ui->widget_display->size());
+    m_cameraPlayer1->setPlayWndParent(ui->widget_display1);
+    m_cameraPlayer1->setPlayWndSize(ui->widget_display1->size());
+
+    /* 创建其他播放窗口 */
+    m_cameraPlayer2 = new CameraPlayer;
+    m_cameraPlayer2->setImage(image);
+    m_cameraPlayer2->initCamera("192.1.2.73", 8000, "admin", "LH123456");
+    m_cameraPlayer2->startRealPlay(1);
+    m_cameraPlayer2->setPlayWndParent(ui->widget_display2);
+    m_cameraPlayer2->setPlayWndSize(ui->widget_display2->size());
+
+    m_cameraPlayer3 = new CameraPlayer;
+    m_cameraPlayer3->setImage(image);
+    m_cameraPlayer3->initCamera("192.1.2.73", 8000, "admin", "LH123456");
+    m_cameraPlayer3->startRealPlay(1);
+    m_cameraPlayer3->setPlayWndParent(ui->widget_display3);
+    m_cameraPlayer3->setPlayWndSize(ui->widget_display3->size());
+
+    m_cameraPlayer4 = new CameraPlayer;
+    m_cameraPlayer4->setImage(image);
+    m_cameraPlayer4->initCamera("192.1.2.73", 8000, "admin", "LH123456");
+    m_cameraPlayer4->startRealPlay(1);
+    m_cameraPlayer4->setPlayWndParent(ui->widget_display4);
+    m_cameraPlayer4->setPlayWndSize(ui->widget_display4->size());
 }

+ 6 - 1
show1/widget.h

@@ -26,6 +26,8 @@ private slots:
 protected:
     /* 窗口缩放事件 */
     void resizeEvent(QResizeEvent *event) override;
+    /* 显示事件 */
+    void showEvent(QShowEvent *event) override;
 
 private:
     void initCameraPlayer();
@@ -33,7 +35,10 @@ private:
 private:
     Ui::widget *ui;
 
-    CameraPlayer *m_cameraPlayer = nullptr;
+    CameraPlayer *m_cameraPlayer1 = nullptr;
+    CameraPlayer *m_cameraPlayer2 = nullptr;
+    CameraPlayer *m_cameraPlayer3 = nullptr;
+    CameraPlayer *m_cameraPlayer4 = nullptr;
 };
 
 #endif // WIDGET_H

+ 22 - 10
show1/widget.ui

@@ -6,17 +6,14 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>827</width>
-    <height>559</height>
+    <width>1096</width>
+    <height>731</height>
    </rect>
   </property>
   <property name="windowTitle">
    <string>Form</string>
   </property>
-  <layout class="QVBoxLayout" name="verticalLayout">
-   <property name="spacing">
-    <number>0</number>
-   </property>
+  <layout class="QGridLayout" name="gridLayout">
    <property name="leftMargin">
     <number>0</number>
    </property>
@@ -29,10 +26,7 @@
    <property name="bottomMargin">
     <number>0</number>
    </property>
-   <item>
-    <widget class="QWidget" name="widget_display" native="true"/>
-   </item>
-   <item>
+   <item row="2" column="0">
     <widget class="QWidget" name="widget_control" native="true">
      <property name="minimumSize">
       <size>
@@ -92,6 +86,24 @@
      </layout>
     </widget>
    </item>
+   <item row="0" column="0">
+    <widget class="QWidget" name="widget_content" native="true">
+     <layout class="QGridLayout" name="gridLayout_2">
+      <item row="0" column="0">
+       <widget class="QWidget" name="widget_display1" native="true"/>
+      </item>
+      <item row="0" column="2">
+       <widget class="QWidget" name="widget_display2" native="true"/>
+      </item>
+      <item row="1" column="2">
+       <widget class="QWidget" name="widget_display3" native="true"/>
+      </item>
+      <item row="1" column="0">
+       <widget class="QWidget" name="widget_display4" native="true"/>
+      </item>
+     </layout>
+    </widget>
+   </item>
   </layout>
  </widget>
  <resources/>