diff --git a/AVQt/CMakeLists.txt b/AVQt/CMakeLists.txt index 4584f5d4d87f7aa088ef2044aa14346534f7e2a7..a8e5ada609e399de9ba17409e83569ca57458bec 100644 --- a/AVQt/CMakeLists.txt +++ b/AVQt/CMakeLists.txt @@ -12,10 +12,6 @@ set(CMAKE_INCLUDE_CURRENT_DIR on) #find_package(Qt6 COMPONENTS Core Gui Concurrent Widgets OpenGL OpenGLWidgets) find_package(Qt5 COMPONENTS Core Gui Concurrent Widgets OpenGL) -if (WIN32) - set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS on) -endif () - #if (${CMAKE_BUILD_TYPE} EQUAL "Release") # -O3) #endif () @@ -88,95 +84,105 @@ add_library(AVQt SHARED ${SOURCES}) add_library(AVQtStatic STATIC ${SOURCES}) set_target_properties(AVQtStatic PROPERTIES OUTPUT_NAME AVQt_static) -target_compile_options(AVQt PRIVATE - -std=c++20 - -Werror=all - -Werror=extra - -Werror=pedantic - -Wno-float-equal - -ansi - -Werror=init-self - -Werror=old-style-cast - -Werror=overloaded-virtual - -Werror=uninitialized - -Werror=missing-declarations - -Werror=init-self - # -Wall -Wextra - -Wno-error=non-virtual-dtor - # -Wno-unused-result - #-Wpedantic - -Wshadow - -Wfatal-errors - -Wundef - -Wuninitialized - -Winit-self - -Wconversion - -Wfloat-equal - -Wstrict-aliasing - -Wtrigraphs - -Wodr # one definition rule - -Wzero-as-null-pointer-constant - -Wsizeof-array-argument - -Winline - -Wcast-qual - -Weffc++ - - - # -fno-common # each global variable is only declared once. - # -fmerge-all-constants - # -ffunction-sections - # -fdata-sections - # -fno-use-cxa-atexit - # -fverbose-asm - # -fstrict-enums - -Wstack-protector - -Wdouble-promotion - ) -target_compile_options(AVQtStatic PRIVATE - -std=c++20 - -Werror=all - -Werror=extra - -Werror=pedantic - -ansi - -Werror=init-self - -Werror=old-style-cast - -Werror=overloaded-virtual - -Werror=uninitialized - -Werror=missing-declarations - -Werror=init-self - # -Wall -Wextra - -Wno-error=non-virtual-dtor - # -Wno-unused-result - #-Wpedantic - -Wshadow - -Wfatal-errors - -Wundef - -Wuninitialized - -Winit-self - -Wconversion - -Wfloat-equal - -Wstrict-aliasing - -Wtrigraphs - -Wodr # one definition rule - -Wzero-as-null-pointer-constant - -Wsizeof-array-argument - -Winline - -Wcast-qual - -Weffc++ - - - # -fno-common # each global variable is only declared once. - # -fmerge-all-constants - # -ffunction-sections - # -fdata-sections - # -fno-use-cxa-atexit - # -fverbose-asm - # -fstrict-enums - -Wstack-protector - -Wdouble-promotion - ) +if (!WIN32) + target_compile_options(AVQt PRIVATE + -std=c++20 + -Werror=all + -Werror=extra + -Werror=pedantic + -Wno-float-equal + -ansi + -Werror=init-self + -Werror=old-style-cast + -Werror=overloaded-virtual + -Werror=uninitialized + -Werror=missing-declarations + -Werror=init-self + # -Wall -Wextra + -Wno-error=non-virtual-dtor + # -Wno-unused-result + #-Wpedantic + -Wshadow + -Wfatal-errors + -Wundef + -Wuninitialized + -Winit-self + -Wconversion + -Wfloat-equal + -Wstrict-aliasing + -Wtrigraphs + -Wodr # one definition rule + -Wzero-as-null-pointer-constant + -Wsizeof-array-argument + -Winline + -Wcast-qual + -Weffc++ + + + # -fno-common # each global variable is only declared once. + # -fmerge-all-constants + # -ffunction-sections + # -fdata-sections + # -fno-use-cxa-atexit + # -fverbose-asm + # -fstrict-enums + -Wstack-protector + -Wdouble-promotion + ) + target_compile_options(AVQtStatic PRIVATE + -std=c++20 + -Werror=all + -Werror=extra + -Werror=pedantic + -ansi + -Werror=init-self + -Werror=old-style-cast + -Werror=overloaded-virtual + -Werror=uninitialized + -Werror=missing-declarations + -Werror=init-self + # -Wall -Wextra + -Wno-error=non-virtual-dtor + # -Wno-unused-result + #-Wpedantic + -Wshadow + -Wfatal-errors + -Wundef + -Wuninitialized + -Winit-self + -Wconversion + -Wfloat-equal + -Wstrict-aliasing + -Wtrigraphs + -Wodr # one definition rule + -Wzero-as-null-pointer-constant + -Wsizeof-array-argument + -Winline + -Wcast-qual + -Weffc++ + + + # -fno-common # each global variable is only declared once. + # -fmerge-all-constants + # -ffunction-sections + # -fdata-sections + # -fno-use-cxa-atexit + # -fverbose-asm + # -fstrict-enums + -Wstack-protector + -Wdouble-promotion + ) +endif () #target_link_libraries(AVQt Qt6::Core Qt6::Gui Qt6::Concurrent Qt6::Widgets Qt6::OpenGL Qt6::OpenGLWidgets avformat avfilter avutil avcodec avdevice swscale swresample GL openal) #target_link_libraries(AVQtStatic Qt6::Core Qt6::Gui Qt6::Concurrent Qt6::Widgets Qt6::OpenGL Qt6::OpenGLWidgets avformat avfilter avutil avcodec avdevice swscale swresample GL openal) -target_link_libraries(AVQt Qt5::Core Qt5::Gui Qt5::Concurrent Qt5::Widgets Qt5::OpenGL avformat avfilter avutil avcodec avdevice swscale swresample GL openal) -target_link_libraries(AVQtStatic Qt5::Core Qt5::Gui Qt5::Concurrent Qt5::Widgets Qt5::OpenGL avformat avfilter avutil avcodec avdevice swscale swresample GL openal) \ No newline at end of file +target_link_libraries(AVQt Qt5::Core Qt5::Gui Qt5::Concurrent Qt5::Widgets Qt5::OpenGL avformat avfilter avutil avcodec avdevice swscale swresample) +target_link_libraries(AVQtStatic Qt5::Core Qt5::Gui Qt5::Concurrent Qt5::Widgets Qt5::OpenGL avformat avfilter avutil avcodec avdevice swscale swresample) + +if (WIN32) + target_link_libraries(AVQt opengl32 OpenAL32) + target_link_libraries(AVQtStatic opengl32 OpenAL32) +else () + target_link_libraries(AVQt GL openal) + target_link_libraries(AVQtStatic GL openal) +endif () \ No newline at end of file diff --git a/AVQt/input/Demuxer.cpp b/AVQt/input/Demuxer.cpp index d99e134901427e16e18385b13a8bdb749967497e..fe24e6fe396b7a8038b3aa6b01b432fc4bacb8dc 100644 --- a/AVQt/input/Demuxer.cpp +++ b/AVQt/input/Demuxer.cpp @@ -102,7 +102,7 @@ namespace AVQt { bool initialized = true; d->m_initialized.compare_exchange_strong(initialized, true); if (!initialized) { - d->m_pBuffer = new uint8_t[DemuxerPrivate::BUFFER_SIZE]; + d->m_pBuffer = static_cast<uint8_t *>(av_malloc(DemuxerPrivate::BUFFER_SIZE)); d->m_pIOCtx = avio_alloc_context(d->m_pBuffer, DemuxerPrivate::BUFFER_SIZE, 0, d->m_inputDevice, &DemuxerPrivate::readFromIO, nullptr, &DemuxerPrivate::seekIO); d->m_pFormatCtx = avformat_alloc_context(); diff --git a/AVQt/input/private/Demuxer_p.h b/AVQt/input/private/Demuxer_p.h index aa6cc518b355539e34baecb91b801520db1bc449..1ba35b36645ceaa09a54a9085624ff7a58bb161b 100644 --- a/AVQt/input/private/Demuxer_p.h +++ b/AVQt/input/private/Demuxer_p.h @@ -37,7 +37,7 @@ namespace AVQt { QList<int64_t> m_videoStreams{}, m_audioStreams{}, m_subtitleStreams{}; int64_t m_videoStream{-1}, m_audioStream{-1}, m_subtitleStream{-1}; - static constexpr size_t BUFFER_SIZE{1024}; + static constexpr size_t BUFFER_SIZE{32 * 1024}; uint8_t *m_pBuffer{nullptr}; AVFormatContext *m_pFormatCtx{nullptr}; AVIOContext *m_pIOCtx{nullptr}; diff --git a/AVQt/output/Muxer.cpp b/AVQt/output/Muxer.cpp index 2e83823f7b07887bd37c73c6e66ff788f8c3be6e..6f6788730b8b9ed4a43c5dff6f7a5ce48ec9fa53 100644 --- a/AVQt/output/Muxer.cpp +++ b/AVQt/output/Muxer.cpp @@ -1,8 +1,6 @@ // // Created by silas on 5/24/21. // - -#include <experimental/algorithm> #include <input/IPacketSource.h> #include "private/Muxer_p.h" #include "Muxer.h" diff --git a/AVQt/output/OpenGLRenderer.cpp b/AVQt/output/OpenGLRenderer.cpp index 8ce839be0e36325e412df022e94d4ed8f2a58982..d78699bc6edecea2909780f3839ffd8c735ef741 100644 --- a/AVQt/output/OpenGLRenderer.cpp +++ b/AVQt/output/OpenGLRenderer.cpp @@ -64,10 +64,10 @@ namespace AVQt { d->m_paused.store(false); qDebug("Started renderer"); - showNormal(); - requestActivate(); + QMetaObject::invokeMethod(this, "showNormal", Qt::QueuedConnection); + QMetaObject::invokeMethod(this, "requestActivate", Qt::QueuedConnection); + QMetaObject::invokeMethod(this, "update", Qt::QueuedConnection); - update(); started(); } return 0; diff --git a/CMakeLists.txt b/CMakeLists.txt index 9a4414e8199c6c64be30ee0a20db1450da0d4bd2..e429a53e2a7ad9113ebb3c11859b72f8a4802fe5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,10 +3,19 @@ project(LibAVQt) set(CMAKE_CXX_STANDARD 20) +if (WIN32) + include_directories(${OPENAL_INCLUDE_DIR} ${FFMPEG_INCLUDE_DIR}) + link_directories(${OPENAL_LIBRARY} ${FFMPEG_LIBRARY}) + set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS on) +endif () + +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) + set(CMAKE_AUTOMOC on) set(CMAKE_AUTORCC on) set(CMAKE_AUTOUIC on) add_subdirectory(AVQt) include_directories(AVQt) -add_subdirectory(Player) +add_subdirectory(Player) \ No newline at end of file diff --git a/Player/main.cpp b/Player/main.cpp index a4623d4f5d22aafbcbdd9d0cc7a7ee9e43f33367..83656d8347d3ce3f95d26da4e4d02202162c9c3c 100644 --- a/Player/main.cpp +++ b/Player/main.cpp @@ -43,6 +43,9 @@ int main(int argc, char *argv[]) { app = new QApplication(argc, argv); signal(SIGINT, &signalHandler); signal(SIGTERM, &signalHandler); + + av_log_set_level(AV_LOG_DEBUG); + av_log_set_flags(AV_LOG_SKIP_REPEATED); // signal(SIGQUIT, &signalHandler); start = std::chrono::system_clock::now(); @@ -57,7 +60,7 @@ int main(int argc, char *argv[]) { return 0; } - inputFile->open(QIODevice::ReadOnly); + inputFile->open(QIODevice::ReadWrite); AVQt::Demuxer demuxer(inputFile); // AVQt::AudioDecoder decoder; @@ -67,8 +70,10 @@ int main(int argc, char *argv[]) { // decoder.registerCallback(&output); AVQt::IDecoder *videoDecoder; + AVQt::IEncoder *videoEncoder; #ifdef Q_OS_LINUX videoDecoder = new AVQt::DecoderVAAPI; + videoEncoder = new AVQt::EncoderVAAPI("hevc_vaapi"); #elif defined(Q_OS_WINDOWS) videoDecoder = new AVQt::DecoderDXVA2(); #else @@ -76,17 +81,15 @@ int main(int argc, char *argv[]) { #endif AVQt::OpenGLRenderer renderer; - AVQt::IEncoder *encoder = new AVQt::EncoderVAAPI("hevc_vaapi"); - demuxer.registerCallback(videoDecoder, AVQt::IPacketSource::CB_VIDEO); - videoDecoder->registerCallback(encoder); +// videoDecoder->registerCallback(videoEncoder); - QFile outputFile("output.mp4"); - outputFile.open(QIODevice::ReadWrite | QIODevice::Truncate); - outputFile.seek(0); - AVQt::Muxer muxer(&outputFile); +// QFile outputFile("output.mp4"); +// outputFile.open(QIODevice::ReadWrite | QIODevice::Truncate); +// outputFile.seek(0); +// AVQt::Muxer muxer(&outputFile); - encoder->registerCallback(&muxer, AVQt::IPacketSource::CB_VIDEO); +// videoEncoder->registerCallback(&muxer, AVQt::IPacketSource::CB_VIDEO); videoDecoder->registerCallback(&renderer); renderer.setMinimumSize(QSize(360, 240)); @@ -106,7 +109,7 @@ int main(int argc, char *argv[]) { QObject::connect(app, &QApplication::aboutToQuit, [&] { demuxer.deinit(); - delete encoder; +// delete videoEncoder; delete videoDecoder; });