Jelajahi Sumber

V0.8
1、完成了对OpenGL和视频播放器的封装

apple 3 hari lalu
induk
melakukan
3fac8716fe
32 mengubah file dengan 222 tambahan dan 289 penghapusan
  1. 3 3
      CMakeLists.txt
  2. 1 1
      External
  3. 3 3
      demo/OpenGLWidgetLibrary/CMakeLists.txt
  4. 0 0
      demo/OpenGLWidgetLibrary/GLShader/ShaderBase.cpp
  5. 0 0
      demo/OpenGLWidgetLibrary/GLShader/ShaderBase.h
  6. 0 0
      demo/OpenGLWidgetLibrary/GLShader/ShaderRect.cpp
  7. 0 0
      demo/OpenGLWidgetLibrary/GLShader/ShaderRect.h
  8. 0 0
      demo/OpenGLWidgetLibrary/GLShader/ShaderYUV420.cpp
  9. 0 0
      demo/OpenGLWidgetLibrary/GLShader/ShaderYUV420.h
  10. 0 0
      demo/OpenGLWidgetLibrary/GLWidget/PlayerGLWidget.cpp
  11. 0 0
      demo/OpenGLWidgetLibrary/GLWidget/PlayerGLWidget.h
  12. 0 0
      demo/OpenGLWidgetLibrary/OpenGLWidgetAPI.cpp
  13. 0 0
      demo/OpenGLWidgetLibrary/OpenGLWidgetAPI.h
  14. 0 0
      demo/OpenGLWidgetLibrary/resShaderCode.qrc
  15. 0 0
      demo/OpenGLWidgetLibrary/shaderCode/fragmentShader.glsl
  16. 0 0
      demo/OpenGLWidgetLibrary/shaderCode/fragmentShaderRGBA.glsl
  17. 0 0
      demo/OpenGLWidgetLibrary/shaderCode/fragmentShaderYUV420.glsl
  18. 0 0
      demo/OpenGLWidgetLibrary/shaderCode/vertexShader.glsl
  19. 0 0
      demo/OpenGLWidgetLibrary/shaderCode/vertexShaderRGBA.glsl
  20. 0 0
      demo/OpenGLWidgetLibrary/shaderCode/vertexShaderYUV420.glsl
  21. 8 9
      demo/OpenGLWidgetTest/CMakeLists.txt
  22. 0 4
      demo/OpenGLWidgetTest/VideoPlayerAPI/VideoPlayerAPI.cpp
  23. 0 17
      demo/OpenGLWidgetTest/VideoPlayerAPI/VideoPlayerAPI.h
  24. 0 0
      demo/OpenGLWidgetTest/VideoPlayerAPI__/IVideoPlayer.h
  25. 84 0
      demo/OpenGLWidgetTest/VideoPlayerAPI__/VideoPlayerAPI.cpp
  26. 26 0
      demo/OpenGLWidgetTest/VideoPlayerAPI__/VideoPlayerAPI.h
  27. 38 45
      demo/OpenGLWidgetTest/widget.cpp
  28. 11 2
      demo/OpenGLWidgetTest/widget.h
  29. 41 2
      demo/OpenGLWidgetTest/widget.ui
  30. 7 7
      demo/VideoPlayerLibrary/CMakeLists.txt
  31. 0 154
      demo/VideoPlayerLibrary/OpenGLWidgetAPI/OpenGLWidgetAPI.cpp
  32. 0 42
      demo/VideoPlayerLibrary/OpenGLWidgetAPI/OpenGLWidgetAPI.h

+ 3 - 3
CMakeLists.txt

@@ -192,12 +192,12 @@ file(GLOB GLOBAL_SRC
 # add_subdirectory(${CMAKE_SOURCE_DIR}/demo/OneThread)
 # add_subdirectory(${CMAKE_SOURCE_DIR}/demo/timer)
 # add_subdirectory(${CMAKE_SOURCE_DIR}/demo/time)
-add_subdirectory(${CMAKE_SOURCE_DIR}/demo/VideoPlayer)
+# add_subdirectory(${CMAKE_SOURCE_DIR}/demo/VideoPlayer)
 # add_subdirectory(${CMAKE_SOURCE_DIR}/demo/xlsx)
 # add_subdirectory(${CMAKE_SOURCE_DIR}/demo/DesignerPattern)
 # add_subdirectory(${CMAKE_SOURCE_DIR}/demo/ViewModel)
-# add_subdirectory(${CMAKE_SOURCE_DIR}/demo/OpenGLWidget)
+add_subdirectory(${CMAKE_SOURCE_DIR}/demo/OpenGLWidgetLibrary)
 # add_subdirectory(${CMAKE_SOURCE_DIR}/demo/VideoPlayerGL)
-# add_subdirectory(${CMAKE_SOURCE_DIR}/demo/OpenGLWidgetTest)
+add_subdirectory(${CMAKE_SOURCE_DIR}/demo/OpenGLWidgetTest)
 add_subdirectory(${CMAKE_SOURCE_DIR}/demo/VideoPlayerLibrary)
 

+ 1 - 1
External

@@ -1 +1 @@
-Subproject commit 4bc45478c1cc4a944beec2d8df85b33459ad6e68
+Subproject commit 8069e47719f9c7d18e48f75e136c54c39587c2bc

+ 3 - 3
demo/OpenGLWidget/CMakeLists.txt → demo/OpenGLWidgetLibrary/CMakeLists.txt

@@ -27,9 +27,9 @@ add_library(${libName} SHARED
     ${LOCAL_SRC} 
 )
 
-# set_target_properties(${this_exe} PROPERTIES
-    
-# )
+set_target_properties(${libName} PROPERTIES
+    DEBUG_POSTFIX d
+)
 
 
 #添加头文件

+ 0 - 0
demo/OpenGLWidget/GLShader/ShaderBase.cpp → demo/OpenGLWidgetLibrary/GLShader/ShaderBase.cpp


+ 0 - 0
demo/OpenGLWidget/GLShader/ShaderBase.h → demo/OpenGLWidgetLibrary/GLShader/ShaderBase.h


+ 0 - 0
demo/OpenGLWidget/GLShader/ShaderRect.cpp → demo/OpenGLWidgetLibrary/GLShader/ShaderRect.cpp


+ 0 - 0
demo/OpenGLWidget/GLShader/ShaderRect.h → demo/OpenGLWidgetLibrary/GLShader/ShaderRect.h


+ 0 - 0
demo/OpenGLWidget/GLShader/ShaderYUV420.cpp → demo/OpenGLWidgetLibrary/GLShader/ShaderYUV420.cpp


+ 0 - 0
demo/OpenGLWidget/GLShader/ShaderYUV420.h → demo/OpenGLWidgetLibrary/GLShader/ShaderYUV420.h


+ 0 - 0
demo/OpenGLWidget/GLWidget/PlayerGLWidget.cpp → demo/OpenGLWidgetLibrary/GLWidget/PlayerGLWidget.cpp


+ 0 - 0
demo/OpenGLWidget/GLWidget/PlayerGLWidget.h → demo/OpenGLWidgetLibrary/GLWidget/PlayerGLWidget.h


+ 0 - 0
demo/OpenGLWidget/OpenGLWidgetAPI.cpp → demo/OpenGLWidgetLibrary/OpenGLWidgetAPI.cpp


+ 0 - 0
demo/OpenGLWidget/OpenGLWidgetAPI.h → demo/OpenGLWidgetLibrary/OpenGLWidgetAPI.h


+ 0 - 0
demo/OpenGLWidget/resShaderCode.qrc → demo/OpenGLWidgetLibrary/resShaderCode.qrc


+ 0 - 0
demo/OpenGLWidget/shaderCode/fragmentShader.glsl → demo/OpenGLWidgetLibrary/shaderCode/fragmentShader.glsl


+ 0 - 0
demo/OpenGLWidget/shaderCode/fragmentShaderRGBA.glsl → demo/OpenGLWidgetLibrary/shaderCode/fragmentShaderRGBA.glsl


+ 0 - 0
demo/OpenGLWidget/shaderCode/fragmentShaderYUV420.glsl → demo/OpenGLWidgetLibrary/shaderCode/fragmentShaderYUV420.glsl


+ 0 - 0
demo/OpenGLWidget/shaderCode/vertexShader.glsl → demo/OpenGLWidgetLibrary/shaderCode/vertexShader.glsl


+ 0 - 0
demo/OpenGLWidget/shaderCode/vertexShaderRGBA.glsl → demo/OpenGLWidgetLibrary/shaderCode/vertexShaderRGBA.glsl


+ 0 - 0
demo/OpenGLWidget/shaderCode/vertexShaderYUV420.glsl → demo/OpenGLWidgetLibrary/shaderCode/vertexShaderYUV420.glsl


+ 8 - 9
demo/OpenGLWidgetTest/CMakeLists.txt

@@ -10,13 +10,13 @@ file(GLOB LOCAL_SRC
     ${CMAKE_CURRENT_SOURCE_DIR}/*.rc
     ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/*.ui
-    ${CMAKE_CURRENT_SOURCE_DIR}/OpenGLWidgetAPI/*.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/VideoPlayer/*.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/VideoPlayerAPI/*.cpp
+    # ${CMAKE_CURRENT_SOURCE_DIR}/OpenGLWidgetAPI/*.cpp
+    # ${CMAKE_CURRENT_SOURCE_DIR}/VideoPlayer/*.cpp
+    # ${CMAKE_CURRENT_SOURCE_DIR}/VideoPlayerAPI/*.cpp
 
     ${CMAKE_SOURCE_DIR}/External/module/Logs/*.cpp
     ${CMAKE_SOURCE_DIR}/External/module/ThreadPool/*.cpp
-    
+    ${VideoPlayer_SOURCE_DIR}/*.cpp
 )
 
 
@@ -37,9 +37,9 @@ add_executable(${this_exe}
 target_include_directories(${this_exe} PRIVATE
 
     ${CMAKE_CURRENT_SOURCE_DIR}
-    ${CMAKE_CURRENT_SOURCE_DIR}/OpenGLWidgetAPI
-    ${CMAKE_CURRENT_SOURCE_DIR}/VideoPlayer
-    ${CMAKE_CURRENT_SOURCE_DIR}/VideoPlayerAPI
+    # ${CMAKE_CURRENT_SOURCE_DIR}/OpenGLWidgetAPI
+    # ${CMAKE_CURRENT_SOURCE_DIR}/VideoPlayer
+    # ${CMAKE_CURRENT_SOURCE_DIR}/VideoPlayerAPI
 
     ${CMAKE_SOURCE_DIR}/External/common
     ${CMAKE_SOURCE_DIR}/External/module
@@ -48,7 +48,7 @@ target_include_directories(${this_exe} PRIVATE
     
     ${spdlog_INCLUDE_DIR}
     ${FFMPEG_INCLUDE_DIR}
-    
+    ${VideoPlayer_INCLUDE_DIR}
 )
 
 
@@ -61,7 +61,6 @@ target_link_libraries(${this_exe} PRIVATE
 )
 
 target_link_libraries(${this_exe} PRIVATE
-    # ${CURL_LIBRARY}
     ${FFMPEG_LIBRARY}
     ${spdlog_LIBRARY}
 

+ 0 - 4
demo/OpenGLWidgetTest/VideoPlayerAPI/VideoPlayerAPI.cpp

@@ -1,4 +0,0 @@
-#include "VideoPlayerAPI.h"
-
-#include "spdlog/spdlog.h"
-

+ 0 - 17
demo/OpenGLWidgetTest/VideoPlayerAPI/VideoPlayerAPI.h

@@ -1,17 +0,0 @@
-#ifndef _VIDEOPLAYERAPI_H_
-#define _VIDEOPLAYERAPI_H_
-
-
-
-class QWidget;
-
-extern "C" {
-
-
-
-
-};
-
-
-
-#endif /* _VIDEOPLAYERAPI_H_ */

+ 0 - 0
demo/OpenGLWidgetTest/VideoPlayerAPI/IVideoPlayer.h → demo/OpenGLWidgetTest/VideoPlayerAPI__/IVideoPlayer.h


+ 84 - 0
demo/OpenGLWidgetTest/VideoPlayerAPI__/VideoPlayerAPI.cpp

@@ -0,0 +1,84 @@
+#include "VideoPlayerAPI.h"
+
+#include <QApplication>
+#include <QLibrary>
+#include <qchar.h>
+#include <qlibrary.h>
+
+#include "spdlog/spdlog.h"
+
+/* 定义函数 */
+using FuncCreateVideoPlayer = IVideoPlayer* (*)();
+using FuncDestroyVideoPlayer = void (*)(IVideoPlayer* player);
+
+/* 创建函数指针 */
+FuncCreateVideoPlayer pCreateVideoPlayer = nullptr;
+FuncDestroyVideoPlayer pDestroyVideoPlayer = nullptr;
+
+
+/* 加载动态库 */
+bool loadVideoPlayerLibrary()
+{
+    QString libPath = QApplication::applicationDirPath();
+
+#ifdef QT_DEBUG
+    libPath += "/libVideoPlayerd"; // Debug版本
+#else
+    libPath += "/libVideoPlayer"; // Release版本
+#endif
+
+
+#if defined (Q_OS_LINUX)
+    libPath += ".so"; // 或者 .dll 或者 .dylib
+#elif defined (Q_OS_WIN)
+    libPath += ".dll"; // Windows下的动态库
+#elif defined (Q_OS_MACOS)
+    libPath += ".dylib"; // macOS下的动态库
+#endif
+
+    QLibrary lib(libPath);
+    if(!lib.load())
+    {
+        SPDLOG_ERROR("加载VideoPlayerAPI库失败: {}", lib.errorString().toStdString());
+        SPDLOG_ERROR("VideoPlayer动态库路径: {}", libPath.toStdString());
+        return false;
+    }
+
+    pCreateVideoPlayer = reinterpret_cast<FuncCreateVideoPlayer>(lib.resolve("createVideoPlayer"));
+    if(!pCreateVideoPlayer)
+    {
+        SPDLOG_ERROR("无法解析createVideoPlayer函数: {}", lib.errorString().toStdString());
+        return false;
+    }
+    pDestroyVideoPlayer = reinterpret_cast<FuncDestroyVideoPlayer>(lib.resolve("destroyVideoPlayer"));
+    if(!pDestroyVideoPlayer)
+    {
+        SPDLOG_ERROR("无法解析destroyVideoPlayer函数: {}", lib.errorString().toStdString());
+        return false;
+    }
+
+    return true;
+}
+
+/* 创建播放器 */
+IVideoPlayer* createPlayer()
+{
+    if(pCreateVideoPlayer == nullptr)
+    {
+        SPDLOG_ERROR("createVideoPlayer函数指针为空,请先加载动态库");
+        return nullptr;
+    }
+    return pCreateVideoPlayer();
+}
+
+/* 销毁播放器 */
+void destroyPlayer(IVideoPlayer* player)
+{
+    if(pDestroyVideoPlayer == nullptr)
+    {
+        SPDLOG_ERROR("destroyVideoPlayer函数指针为空,请先加载动态库");
+        return;
+    }
+    pDestroyVideoPlayer(player);
+}
+

+ 26 - 0
demo/OpenGLWidgetTest/VideoPlayerAPI__/VideoPlayerAPI.h

@@ -0,0 +1,26 @@
+#ifndef _VIDEOPLAYERAPI_H_
+#define _VIDEOPLAYERAPI_H_
+
+
+#include "IVideoPlayer.h"
+
+
+
+extern "C" {
+
+
+/* 加载动态库 */
+bool loadVideoPlayerLibrary();
+
+/* 创建播放器 */
+IVideoPlayer* createPlayer();
+/* 销毁播放器 */
+void destroyPlayer(IVideoPlayer* player);
+
+
+
+};
+
+
+
+#endif /* _VIDEOPLAYERAPI_H_ */

+ 38 - 45
demo/OpenGLWidgetTest/widget.cpp

@@ -1,73 +1,66 @@
 #include "widget.h"
 #include "./ui_widget.h"
 
-#include <QTimer>
+#include <QFileDialog>
 #include "spdlog/spdlog.h"
 
 
 
+
 Widget::Widget(QWidget *parent)
     : QWidget(parent)
     , ui(new Ui::Widget)
 {
     ui->setupUi(this);
 
-    // m_playerGLWidget = createOpenGLWidget(ui->widget_display);
-    // m_playerGLWidget->show(); // 显示OpenGL窗口
-    // m_playerGLWidget->setGeometry(0, 0, ui->widget_display->width(), ui->widget_display->height());
-    // m_playerGLWidget->setStyleSheet(R"(border-radius:10px;)");
-
-    // /* 设置背景颜色 */
-    // this->setAutoFillBackground(true);
-    // QPalette palette = m_playerGLWidget->palette();
-    // palette.setColor(QPalette::Window, Qt::black); // 设置背景颜色为黑色
-    // this->setPalette(palette);
-
-    
-    // connect(&m_timer, &QTimer::timeout, this, [&]() {
-    //     // SPDLOG_DEBUG("刷新一帧");
-    //     QImage image = QImage(":/image/1.jpg");
-    //     if(image.isNull()) {
-    //         SPDLOG_WARN("Image is null, cannot refresh.");
-    //         return;
-    //     }
-    //     refreshRGBAImage(m_playerGLWidget, image); // 显示一张测试图片
-    // });
-    // m_timer.setSingleShot(false);
-    // m_timer.start(10); // 60 FPS
-
-    playVdeio();
-    
+    /* 加载动态库 */
+    loadVideoPlayerLibrary();
+    /* 创建播放器,并设置窗口 */
+    m_player = createPlayer();
+    if(m_player == nullptr) {
+        SPDLOG_ERROR("创建播放器失败");
+        return;
+    }
+    m_player->setWidgetParent(ui->widget_display, true);
+    m_playerWidget = m_player->getPlayWidget();
+    if(m_playerWidget == nullptr) {
+        SPDLOG_ERROR("获取播放器窗口失败");
+        return;
+    }
 }
 
 Widget::~Widget()
 {
-
+    if(m_player != nullptr) {
+        /* 销毁播放器 */
+        destroyPlayer(m_player);
+        m_player = nullptr;
+    }
     delete ui;
 }
 
-void Widget::playVdeio()
+void Widget::on_pBtn_openFile_clicked()
 {
-    // QString videoFile = QApplication::applicationDirPath() + "/YPM.rmvb";
-    // QString videoFile = QApplication::applicationDirPath() + "/2024-07-11.mp4"; 
-    QString videoFile = QApplication::applicationDirPath() + "/4K烤鸭.mp4"; // 测试视频文件
-
-    // VideoPlayer* player = new VideoPlayer(this);
-    // player->setWidgetParent(ui->widget_display, true); // 设置播放窗口
-    // if(!player->openPlayVedio(videoFile))
-    // {
-    //     SPDLOG_ERROR("Failed to open video file: {}", videoFile.toStdString());
-    //     delete player; // 释放资源
-    //     return;
-    // }
-
-    // player->play(); // 播放视频
+    // 打开文件对话框
+    QString fileName = QFileDialog::getOpenFileName(this, tr("打开视频文件"), "", tr("视频文件 (*.mp4 *.avi *.mkv *.flv *.mov)"));
+    if (fileName.isEmpty()) {
+        SPDLOG_WARN("未选择视频文件");
+        return;
+    }
+    m_player->openPlayVedio(fileName);
+    SPDLOG_INFO("打开视频文件: {}", fileName.toStdString());
 }
 
+void Widget::on_pBtn_play_clicked()
+{
+    m_player->play();
+}
+
+
 void Widget::resizeEvent(QResizeEvent *event) 
 {
-    if (m_playerGLWidget) {
-        m_playerGLWidget->setGeometry(0, 0, ui->widget_display->width(), ui->widget_display->height());
+    if (m_playerWidget) {
+        m_playerWidget->setGeometry(0, 0, ui->widget_display->width(), ui->widget_display->height());
     }
     QWidget::resizeEvent(event);
 }

+ 11 - 2
demo/OpenGLWidgetTest/widget.h

@@ -4,6 +4,10 @@
 #include <QWidget>
 #include <memory>
 #include <QTimer>
+#include <qwidget.h>
+
+#include "IVideoPlayer.h"
+#include "VideoPlayerAPI.h"
 
 QT_BEGIN_NAMESPACE
 namespace Ui { class Widget; }
@@ -17,7 +21,11 @@ public:
     Widget(QWidget *parent = nullptr);
     ~Widget();
 
-    void playVdeio();
+
+public slots:
+    void on_pBtn_openFile_clicked();
+
+    void on_pBtn_play_clicked();
 
 private slots:
 
@@ -27,7 +35,8 @@ protected:
 private:
     Ui::Widget *ui;
 
-    QWidget *m_playerGLWidget = nullptr;
+    QWidget* m_playerWidget = nullptr;  // 播放器的显示窗口
+    IVideoPlayer *m_player = nullptr;   
 
     QTimer m_timer;
 

+ 41 - 2
demo/OpenGLWidgetTest/widget.ui

@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>1600</width>
-    <height>900</height>
+    <width>870</width>
+    <height>605</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -32,6 +32,45 @@
    <item>
     <widget class="QWidget" name="widget_display" native="true"/>
    </item>
+   <item>
+    <widget class="QWidget" name="widget_bottom" native="true">
+     <property name="maximumSize">
+      <size>
+       <width>16777215</width>
+       <height>60</height>
+      </size>
+     </property>
+     <layout class="QHBoxLayout" name="horizontalLayout">
+      <item>
+       <widget class="QPushButton" name="pBtn_openFile">
+        <property name="text">
+         <string>打开视频</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="pBtn_play">
+        <property name="text">
+         <string>播放视频</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <spacer name="horizontalSpacer">
+        <property name="orientation">
+         <enum>Qt::Horizontal</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
+         <size>
+          <width>647</width>
+          <height>20</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
+     </layout>
+    </widget>
+   </item>
   </layout>
  </widget>
  <resources/>

+ 7 - 7
demo/VideoPlayerLibrary/CMakeLists.txt

@@ -10,13 +10,13 @@ file(GLOB LOCAL_SRC
     ${CMAKE_CURRENT_SOURCE_DIR}/*.rc
     ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/*.ui
-    ${CMAKE_CURRENT_SOURCE_DIR}/OpenGLWidgetAPI/*.cpp
+    # ${CMAKE_CURRENT_SOURCE_DIR}/OpenGLWidgetAPI/*.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/VideoPlayer/*.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/VideoPlayerAPI/*.cpp
 
     ${CMAKE_SOURCE_DIR}/External/module/Logs/*.cpp
     # ${CMAKE_SOURCE_DIR}/External/module/ThreadPool/*.cpp
-    
+    ${OpenGLWidget_SOURCE_DIR}/*.cpp
 )
 
 
@@ -28,16 +28,16 @@ add_library(${libName} SHARED
     ${LOCAL_SRC} 
 )
 
-# set_target_properties(${libName} PROPERTIES
-    
-# )
+set_target_properties(${libName} PROPERTIES
+    DEBUG_POSTFIX d
+)
 
 
 #添加头文件
 target_include_directories(${libName} PRIVATE
 
     ${CMAKE_CURRENT_SOURCE_DIR}
-    ${CMAKE_CURRENT_SOURCE_DIR}/OpenGLWidgetAPI
+    # ${CMAKE_CURRENT_SOURCE_DIR}/OpenGLWidgetAPI
     ${CMAKE_CURRENT_SOURCE_DIR}/VideoPlayer
     ${CMAKE_CURRENT_SOURCE_DIR}/VideoPlayerAPI
 
@@ -48,7 +48,7 @@ target_include_directories(${libName} PRIVATE
     
     ${spdlog_INCLUDE_DIR}
     ${FFMPEG_INCLUDE_DIR}
-    
+    ${OpenGLWidget_INCLUDE_DIR}
 )
 
 

+ 0 - 154
demo/VideoPlayerLibrary/OpenGLWidgetAPI/OpenGLWidgetAPI.cpp

@@ -1,154 +0,0 @@
-#include "OpenGLWidgetAPI.h"
-
-#include <QApplication>
-#include <QLibrary>
-
-#include "spdlog/spdlog.h"
-
-Image_YUV420P::Image_YUV420P(Image_YUV420P&& other): width(other.width), height(other.height),
-          yData(std::move(other.yData)), uData(std::move(other.uData)), vData(std::move(other.vData))
-{}
-
-Image_YUV420P::Image_YUV420P(const Image_YUV420P& other)
-        : width(other.width), height(other.height),
-          yData(other.yData), uData(other.uData), vData(other.vData)
-{}
-
-Image_YUV420P& Image_YUV420P::operator=(Image_YUV420P&& other) 
-{
-    if (this != &other) {
-        width = other.width;
-        height = other.height;
-        yData = std::move(other.yData);
-        uData = std::move(other.uData);
-        vData = std::move(other.vData);
-    }
-    return *this;
-}
-
-Image_YUV420P& Image_YUV420P::operator=(const Image_YUV420P& other) 
-{
-    if (this != &other) {
-        width = other.width;
-        height = other.height;
-        yData = other.yData;
-        uData = other.uData;
-        vData = other.vData;
-    }
-    return *this;
-}
-
-bool Image_YUV420P::isValid() const 
-{
-    return width > 0 && height > 0 && !yData.isEmpty() && !uData.isEmpty() && !vData.isEmpty();
-}
-
-void Image_YUV420P::clear()
-{
-    width = 0;
-    height = 0;
-    yData.clear();
-    uData.clear();
-    vData.clear();
-}
-
-/* ----------------------------------------------------------------
- * OpenGLWidget动态库 API
- * ---------------------------------------------------------------- */
-
-using funcCreateOpenGLWidget = QWidget* (*)(QWidget*);
-using funcDestroyOpenGLWidget = void (*)(QWidget* widget);
-using funcRefreshRGBAImage = void (*)(QWidget* widget, QImage& image);
-using funcRefreshYUV420Image = void (*)(QWidget* widget, Image_YUV420P* yuvData);
-
-
-funcCreateOpenGLWidget pCreateOpenGLWidget = nullptr;
-funcDestroyOpenGLWidget pDestroyOpenGLWidget = nullptr;
-funcRefreshRGBAImage pRefreshRGBAImage = nullptr;
-funcRefreshYUV420Image pRefreshYUV420Image = nullptr;
-
-static std::atomic_bool isLibraryLoaded = false;
-/* 加载动态库 */
-bool loadOpenGLWidgetLibrary()
-{
-    if(isLibraryLoaded.load()) 
-    {
-        return true;
-    }
-
-    QString libPath = QApplication::applicationDirPath();
-#ifdef Q_OS_WIN
-    libPath += "/libOpenGLWidget.dll";
-#elif defined(Q_OS_MACOS)
-    libPath += "/libOpenGLWidget.dylib";
-#elif defined(Q_OS_LINUX)
-    libPath += "/libOpenGLWidget.so";
-#endif
-    QLibrary lib(libPath);
-    if (!lib.load()) 
-    {
-        SPDLOG_ERROR("加载OpenGLWidget动态库失败: {}", libPath.toStdString());
-        SPDLOG_ERROR("错误信息: {}", lib.errorString().toStdString());
-        return false;
-    }
-
-    pCreateOpenGLWidget = reinterpret_cast<funcCreateOpenGLWidget>(lib.resolve("createOpenGLWidget"));
-    pDestroyOpenGLWidget = reinterpret_cast<funcDestroyOpenGLWidget>(lib.resolve("destroyOpenGLWidget"));
-    pRefreshRGBAImage = reinterpret_cast<funcRefreshRGBAImage>(lib.resolve("refreshRGBAImage"));
-    pRefreshYUV420Image = reinterpret_cast<funcRefreshYUV420Image>(lib.resolve("refreshYUV420Image"));
-
-    if(!pCreateOpenGLWidget || !pDestroyOpenGLWidget || 
-       !pRefreshRGBAImage || !pRefreshYUV420Image) 
-    {
-        SPDLOG_ERROR("加载OpenGLWidget动态库函数失败");
-        return false;
-    }
-
-    isLibraryLoaded = true;
-    return true;
-}
-
-/* 创建OpenGL窗口,返回QWidget指针 */
-QWidget* createOpenGLWidget(QWidget* parent)
-{
-    if(pCreateOpenGLWidget == nullptr) 
-    {
-        SPDLOG_ERROR("OpenGLWidget动态库函数未加载");
-        return nullptr;
-    }
-    return pCreateOpenGLWidget(parent);
-}
-
-/* 销毁OpenGL窗口 */
-void destroyOpenGLWidget(QWidget* widget)
-{
-    if(pDestroyOpenGLWidget == nullptr) 
-    {
-        SPDLOG_ERROR("OpenGLWidget动态库函数未加载");
-        return;
-    }
-    pDestroyOpenGLWidget(widget);
-}
-
-/* 刷新一帧RGBA图片 */
-void refreshRGBAImage(QWidget* widget, QImage& image)
-{
-    if(pRefreshRGBAImage == nullptr) 
-    {
-        SPDLOG_ERROR("OpenGLWidget动态库函数未加载");
-        return;
-    }
-    pRefreshRGBAImage(widget, image);
-}
-
-/* 刷新一帧YUV420图片 */
-void refreshYUV420Image(QWidget* widget, Image_YUV420P& yuvData)
-{
-    if(pRefreshYUV420Image == nullptr) 
-    {
-        SPDLOG_ERROR("OpenGLWidget动态库函数未加载");
-        return;
-    }
-    pRefreshYUV420Image(widget, &yuvData);
-}
-

+ 0 - 42
demo/VideoPlayerLibrary/OpenGLWidgetAPI/OpenGLWidgetAPI.h

@@ -1,42 +0,0 @@
-#ifndef _OPENGLWIDGETAPI_H_
-#define _OPENGLWIDGETAPI_H_
-
-#include <QWidget>
-#include <QString>
-
-/**
- * @brief YUV420图片格式
- * 
- */
-struct Image_YUV420P
-{
-    int width;          /* 宽度 */
-    int height;         /* 高度 */
-    QByteArray yData;   /* Y分量数据 */
-    QByteArray uData;   /* U分量数据 */
-    QByteArray vData;   /* V分量数据 */
-
-    Image_YUV420P() : width(0), height(0) {}
-    Image_YUV420P(Image_YUV420P&& other);
-    Image_YUV420P(const Image_YUV420P& other);
-    Image_YUV420P& operator=(Image_YUV420P&& other);
-    Image_YUV420P& operator=(const Image_YUV420P& other);
-    bool isValid() const;
-    void clear();
-};
-
-/* 加载动态库 */
-bool loadOpenGLWidgetLibrary();
-
-/* 创建OpenGL窗口,返回QWidget指针 */
-QWidget* createOpenGLWidget(QWidget* parent = nullptr);
-/* 销毁OpenGL窗口 */
-void destroyOpenGLWidget(QWidget* widget);
-
-/* 刷新一帧RGBA图片 */
-void refreshRGBAImage(QWidget* widget, QImage& image);
-/* 刷新一帧YUV420图片 */
-void refreshYUV420Image(QWidget* widget, Image_YUV420P& yuvData);
-
-
-#endif // _OPENGLWIDGETAPI_H_