diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index 8893348..d841e6b 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -60,7 +60,7 @@ jobs: make CC=$CC CXX=$CXX ./tst_qavplayer --platform minimal -maxwarnings 100000 - - name: Examples + - name: QMake Examples run: | cd examples/qml_video qmake @@ -69,6 +69,15 @@ jobs: qmake make CC=$CC CXX=$CXX + - name: CMake Examples + run: | + cd examples/qml_video + cmake . -DQT_AVPLAYER_MULTIMEDIA=ON + make CC=$CC CXX=$CXX CXXFLAGS='-std=c++17' VERBOSE=1 + cd ../widget_video + cmake . -DQT_AVPLAYER_MULTIMEDIA=ON + make CC=$CC CXX=$CXX CXXFLAGS='-std=c++17' VERBOSE=1 + macos: strategy: matrix: @@ -110,7 +119,7 @@ jobs: make CC=$CC CXX=$CXX tst_qavplayer.app/Contents/MacOS/tst_qavplayer --platform minimal -maxwarnings 100000 - - name: Examples + - name: QMake Examples run: | export FFMPEG=`brew --prefix ffmpeg` cd examples/qml_video @@ -120,6 +129,16 @@ jobs: qmake INCLUDEPATH+="$FFMPEG/include" LIBS+="-L$FFMPEG/lib" make CC=$CC CXX=$CXX + - name: CMake Examples + run: | + export FFMPEG=`brew --prefix ffmpeg` + cd examples/qml_video + cmake . -DQT_AVPLAYER_MULTIMEDIA=ON -DCMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES=$FFMPEG/include -DCMAKE_LIBRARY_PATH=$FFMPEG/lib + make CC=$CC CXX=$CXX CXXFLAGS='-std=c++17' VERBOSE=1 + cd ../widget_video + cmake . -DQT_AVPLAYER_MULTIMEDIA=ON -DCMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES=$FFMPEG/include -DCMAKE_LIBRARY_PATH=$FFMPEG/lib + make CC=$CC CXX=$CXX CXXFLAGS='-std=c++17' VERBOSE=1 + windows: strategy: matrix: @@ -221,7 +240,7 @@ jobs: mingw32-make release\tst_qavplayer.exe -maxwarnings 100000 - - name: Examples + - name: QMake Examples if: ${{ matrix.type == 'MSVC' }} run: | cd examples/qml_video @@ -231,7 +250,17 @@ jobs: qmake nmake - - name: Examples + - name: CMake Examples + if: ${{ matrix.type == 'MSVC' }} + run: | + cd examples/qml_video + cmake . -DQT_AVPLAYER_MULTIMEDIA=ON -DCMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES=D:\a\QtAVPlayer\ffmpeg\include -DCMAKE_LIBRARY_PATH=D:\a\QtAVPlayer\ffmpeg\lib + cmake --build . -v + cd ../widget_video + cmake . -DQT_AVPLAYER_MULTIMEDIA=ON -DCMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES=D:\a\QtAVPlayer\ffmpeg\include -DCMAKE_LIBRARY_PATH=D:\a\QtAVPlayer\ffmpeg\lib + cmake --build . -v + + - name: QMake Examples if: ${{ matrix.type == 'MINGW' }} run: | cd examples/qml_video @@ -240,3 +269,4 @@ jobs: cd ../extract_frames qmake mingw32-make + diff --git a/examples/qml_video/CMakeLists.txt b/examples/qml_video/CMakeLists.txt new file mode 100644 index 0000000..6cc2d53 --- /dev/null +++ b/examples/qml_video/CMakeLists.txt @@ -0,0 +1,52 @@ +cmake_minimum_required(VERSION 3.8) +project(qml_video LANGUAGES CXX) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_AUTOMOC ON) + +find_package(Qt6 COMPONENTS CoreTools) +if(Qt6CoreTools_FOUND) + find_package(Qt6 COMPONENTS QmlTools Quick REQUIRED) + qt6_add_resources(QT_RESOURCES qml_qt6.qrc) + find_package(Qt6 COMPONENTS MultimediaQuickPrivate REQUIRED) + include_directories(${Qt6MultimediaQuick_PRIVATE_INCLUDE_DIRS}) + include_directories(${Qt6Multimedia_PRIVATE_INCLUDE_DIRS}) + find_package(Qt6 REQUIRED COMPONENTS Core BuildInternals OPTIONAL_COMPONENTS Multimedia) + add_definitions(${Qt6Core_DEFINITIONS}) +else() + find_package(Qt5 REQUIRED COMPONENTS Core OPTIONAL_COMPONENTS Gui Multimedia) + find_package(Qt5 COMPONENTS Quick) + qt5_add_resources(QT_RESOURCES qml.qrc) + include_directories(${Qt5Multimedia_PRIVATE_INCLUDE_DIRS}) + add_definitions(${Qt5Core_DEFINITIONS}) +endif() + +include_directories(../../src/) +set(QT_AVPLAYER_DIR ../../src/QtAVPlayer/) +include(../../src/QtAVPlayer/QtAVPlayer.cmake) + +set(SOURCES ${QtAVPlayer_SOURCES} main.cpp) + +add_executable(${PROJECT_NAME} WIN32 ${SOURCES} ${QT_RESOURCES}) +if(NOT WIN32) + add_definitions(-std=c++1z) + target_compile_options(${PROJECT_NAME} PRIVATE -fPIC) +endif() + +set(LIBS ${QtAVPlayer_LIBS}) + +if(Qt6_FOUND) + set(LIBS ${LIBS} Qt6::Core Qt6::Gui Qt6::Multimedia Qt6::Quick Qt6::MultimediaQuickPrivate) +else() + set(LIBS ${LIBS} Qt5::Core Qt5::Gui Qt5::Quick Qt5::Multimedia ${MultimediaQuick_LIBRARY}) + if (Qt5Core_VERSION VERSION_LESS 5.15.0) + find_library(MultimediaQuick_LIBRARY REQUIRED NAMES Qt5MultimediaQuick) + set(LIBS ${LIBS} ${MultimediaQuick_LIBRARY}) + else() + find_package(Qt5 COMPONENTS MultimediaQuick REQUIRED) + include_directories(${Qt5MultimediaQuick_PRIVATE_INCLUDE_DIRS}) + set(LIBS ${LIBS} Qt5::MultimediaQuick) + endif() +endif() + +target_link_libraries(${PROJECT_NAME} ${LIBS}) diff --git a/examples/widget_video/CMakeLists.txt b/examples/widget_video/CMakeLists.txt new file mode 100644 index 0000000..1a9fb02 --- /dev/null +++ b/examples/widget_video/CMakeLists.txt @@ -0,0 +1,42 @@ +cmake_minimum_required(VERSION 3.8) +project(widget_video LANGUAGES CXX) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_AUTOMOC ON) + +find_package(Qt6 COMPONENTS CoreTools) +if(Qt6CoreTools_FOUND) + find_package(Qt6 COMPONENTS MultimediaWidgets REQUIRED) + find_package(Qt6 REQUIRED COMPONENTS Core BuildInternals OPTIONAL_COMPONENTS Multimedia) + include_directories(${Qt6Multimedia_PRIVATE_INCLUDE_DIRS}) + include_directories(${Qt6MultimediaWidgets_INCLUDE_DIRS}) + add_definitions(${Qt6Core_DEFINITIONS}) +else() + find_package(Qt5 COMPONENTS MultimediaWidgets REQUIRED) + find_package(Qt5 REQUIRED COMPONENTS Core OPTIONAL_COMPONENTS Gui Multimedia) + include_directories(${Qt5Multimedia_PRIVATE_INCLUDE_DIRS}) + include_directories(${Qt5MultimediaWidgets_INCLUDE_DIRS}) + add_definitions(${Qt5Core_DEFINITIONS}) +endif() + +include_directories(../../src/) +set(QT_AVPLAYER_DIR ../../src/QtAVPlayer/) +include(../../src/QtAVPlayer/QtAVPlayer.cmake) + +set(SOURCES ${QtAVPlayer_SOURCES} main.cpp) + +add_executable(${PROJECT_NAME} WIN32 ${SOURCES} ${QT_RESOURCES}) +if(NOT WIN32) + add_definitions(-std=c++1z) + target_compile_options(${PROJECT_NAME} PRIVATE -fPIC) +endif() + +set(LIBS ${QtAVPlayer_LIBS}) + +if(Qt6_FOUND) + set(LIBS ${LIBS} Qt6::Core Qt6::Gui Qt6::Multimedia Qt6::MultimediaWidgets) +else() + set(LIBS ${LIBS} Qt5::Core Qt5::Gui Qt5::Multimedia Qt5::MultimediaWidgets) +endif() + +target_link_libraries(${PROJECT_NAME} ${LIBS}) diff --git a/src/QtAVPlayer/QtAVPlayer.cmake b/src/QtAVPlayer/QtAVPlayer.cmake new file mode 100644 index 0000000..6a160de --- /dev/null +++ b/src/QtAVPlayer/QtAVPlayer.cmake @@ -0,0 +1,225 @@ +if(NOT QT_AVPLAYER_DIR) + set(QT_AVPLAYER_DIR ${CMAKE_SOURCE_DIR}) +endif() + +option(QT_AVPLAYER_MULTIMEDIA "Enable QtMultimedia" OFF) +option(QT_AVPLAYER_VA_X11 "Enable libva-x11" OFF) +option(QT_AVPLAYER_VA_DRM "Enable libva-drm" OFF) +option(QT_AVPLAYER_VDPAU "Enable vdpau" OFF) + +find_library(AVDEVICE_LIBRARY REQUIRED NAMES avdevice) +find_library(AVCODEC_LIBRARY REQUIRED NAMES avcodec) +find_library(AVFILTER_LIBRARY REQUIRED NAMES avfilter) +find_library(AVFORMAT_LIBRARY REQUIRED NAMES avformat) +find_library(AVUTIL_LIBRARY REQUIRED NAMES avutil) +find_library(SWRESAMPLE_LIBRARY REQUIRED NAMES swresample) +find_library(SWSCALE_LIBRARY REQUIRED NAMES swscale) + +set(QtAVPlayer_LIBS + ${AVDEVICE_LIBRARY} + ${AVFILTER_LIBRARY} + ${AVCODEC_LIBRARY} + ${AVFORMAT_LIBRARY} + ${AVUTIL_LIBRARY} + ${SWRESAMPLE_LIBRARY} + ${SWSCALE_LIBRARY} +) + +set(QtAVPlayer_PRIVATE_HEADERS + ${QT_AVPLAYER_DIR}/qavcodec_p.h + ${QT_AVPLAYER_DIR}/qavcodec_p_p.h + ${QT_AVPLAYER_DIR}/qavframecodec_p.h + ${QT_AVPLAYER_DIR}/qavaudiocodec_p.h + ${QT_AVPLAYER_DIR}/qavvideocodec_p.h + ${QT_AVPLAYER_DIR}/qavsubtitlecodec_p.h + ${QT_AVPLAYER_DIR}/qavhwdevice_p.h + ${QT_AVPLAYER_DIR}/qavdemuxer_p.h + ${QT_AVPLAYER_DIR}/qavpacket_p.h + ${QT_AVPLAYER_DIR}/qavstreamframe_p.h + ${QT_AVPLAYER_DIR}/qavframe_p.h + ${QT_AVPLAYER_DIR}/qavpacketqueue_p.h + ${QT_AVPLAYER_DIR}/qavvideobuffer_p.h + ${QT_AVPLAYER_DIR}/qavvideobuffer_cpu_p.h + ${QT_AVPLAYER_DIR}/qavvideobuffer_gpu_p.h + ${QT_AVPLAYER_DIR}/qavfilter_p.h + ${QT_AVPLAYER_DIR}/qavfilter_p_p.h + ${QT_AVPLAYER_DIR}/qavvideofilter_p.h + ${QT_AVPLAYER_DIR}/qavaudiofilter_p.h + ${QT_AVPLAYER_DIR}/qavfiltergraph_p.h + ${QT_AVPLAYER_DIR}/qavinoutfilter_p.h + ${QT_AVPLAYER_DIR}/qavinoutfilter_p_p.h + ${QT_AVPLAYER_DIR}/qavvideoinputfilter_p.h + ${QT_AVPLAYER_DIR}/qavaudioinputfilter_p.h + ${QT_AVPLAYER_DIR}/qavvideooutputfilter_p.h + ${QT_AVPLAYER_DIR}/qavaudiooutputfilter_p.h + ${QT_AVPLAYER_DIR}/qavfilters_p.h +) + +set(QtAVPlayer_PUBLIC_HEADERS + ${QT_AVPLAYER_DIR}/qaviodevice.h + ${QT_AVPLAYER_DIR}/qavaudioformat.h + ${QT_AVPLAYER_DIR}/qavstreamframe.h + ${QT_AVPLAYER_DIR}/qavframe.h + ${QT_AVPLAYER_DIR}/qavvideoframe.h + ${QT_AVPLAYER_DIR}/qavaudioframe.h + ${QT_AVPLAYER_DIR}/qavsubtitleframe.h + ${QT_AVPLAYER_DIR}/qtavplayerglobal.h + ${QT_AVPLAYER_DIR}/qavstream.h + ${QT_AVPLAYER_DIR}/qavplayer.h +) + +set(QtAVPlayer_SOURCES + ${QT_AVPLAYER_DIR}/qavplayer.cpp + ${QT_AVPLAYER_DIR}/qavcodec.cpp + ${QT_AVPLAYER_DIR}/qavframecodec.cpp + ${QT_AVPLAYER_DIR}/qavaudiocodec.cpp + ${QT_AVPLAYER_DIR}/qavvideocodec.cpp + ${QT_AVPLAYER_DIR}/qavsubtitlecodec.cpp + ${QT_AVPLAYER_DIR}/qavdemuxer.cpp + ${QT_AVPLAYER_DIR}/qavpacket.cpp + ${QT_AVPLAYER_DIR}/qavframe.cpp + ${QT_AVPLAYER_DIR}/qavstreamframe.cpp + ${QT_AVPLAYER_DIR}/qavvideoframe.cpp + ${QT_AVPLAYER_DIR}/qavaudioframe.cpp + ${QT_AVPLAYER_DIR}/qavsubtitleframe.cpp + ${QT_AVPLAYER_DIR}/qavvideobuffer_cpu.cpp + ${QT_AVPLAYER_DIR}/qavvideobuffer_gpu.cpp + ${QT_AVPLAYER_DIR}/qavfilter.cpp + ${QT_AVPLAYER_DIR}/qavvideofilter.cpp + ${QT_AVPLAYER_DIR}/qavaudiofilter.cpp + ${QT_AVPLAYER_DIR}/qavfiltergraph.cpp + ${QT_AVPLAYER_DIR}/qavinoutfilter.cpp + ${QT_AVPLAYER_DIR}/qavvideoinputfilter.cpp + ${QT_AVPLAYER_DIR}/qavaudioinputfilter.cpp + ${QT_AVPLAYER_DIR}/qavvideooutputfilter.cpp + ${QT_AVPLAYER_DIR}/qavaudiooutputfilter.cpp + ${QT_AVPLAYER_DIR}/qaviodevice.cpp + ${QT_AVPLAYER_DIR}/qavstream.cpp + ${QT_AVPLAYER_DIR}/qavfilters.cpp +) + +if(WIN32) + set(QtAVPlayer_PRIVATE_HEADERS + ${QtAVPlayer_PRIVATE_HEADERS} + ${QT_AVPLAYER_DIR}/qavhwdevice_d3d11_p.h + ) + + set(QtAVPlayer_SOURCES + ${QtAVPlayer_SOURCES} + ${QT_AVPLAYER_DIR}/qavhwdevice_d3d11.cpp + ) +endif() + +if(APPLE) + find_library(IOSURFACE_LIBRARY IOSurface) + find_library(COREVIDEO_LIBRARY CoreVideo) + find_library(COREMEDIA_LIBRARY CoreMedia) + find_library(METAL_LIBRARY Metal) + find_library(METAL_FOUNDATION Foundation) + + set(QtAVPlayer_SOURCES + ${QtAVPlayer_SOURCES} + ${QT_AVPLAYER_DIR}/qavhwdevice_videotoolbox.mm + ) + + set(QtAVPlayer_LIBS + ${QtAVPlayer_LIBS} + ${IOSURFACE_LIBRARY} + ${COREVIDEO_LIBRARY} + ${COREMEDIA_LIBRARY} + ${METAL_LIBRARY} + ${METAL_FOUNDATION} + ) +endif() + +if(ANDROID) + set(QtAVPlayer_SOURCES + ${QtAVPlayer_SOURCES} + ${QT_AVPLAYER_DIR}/qavhwdevice_mediacodec.cpp + ${QT_AVPLAYER_DIR}/qavandroidsurfacetexture.cpp + ) +endif() + +if(QT_AVPLAYER_MULTIMEDIA) + message(STATUS "QT_AVPLAYER_MULTIMEDIA is defined") + add_definitions(-DQT_AVPLAYER_MULTIMEDIA) + + set(QtAVPlayer_PUBLIC_HEADERS + ${QtAVPlayer_PUBLIC_HEADERS} + ${QT_AVPLAYER_DIR}/qavaudiooutput.h + ${QT_AVPLAYER_DIR}/qavaudiooutputdevice.h + ) + + set(QtAVPlayer_SOURCES + ${QtAVPlayer_SOURCES} + ${QT_AVPLAYER_DIR}/qavaudiooutput.cpp + ${QT_AVPLAYER_DIR}/qavaudiooutputdevice.cpp + ) +endif() + +if(QT_AVPLAYER_VA_X11) + message(STATUS "QT_AVPLAYER_VA_X11 is defined") + add_definitions(-DQT_AVPLAYER_VA_X11) + + set(QtAVPlayer_LIBS + ${QtAVPlayer_LIBS} + OpenGL::GL + X11 + va-x11 + va + ) + + set(QtAVPlayer_PRIVATE_HEADERS + ${QtAVPlayer_PRIVATE_HEADERS} + ${QT_AVPLAYER_DIR}/qavhwdevice_vaapi_x11_glx_p.h + ) + + set(QtAVPlayer_SOURCES + ${QT_AVPLAYER_SOURCES} + ${QT_AVPLAYER_DIR}/qavhwdevice_vaapi_x11_glx.cpp + ) +endif() + +if(QT_AVPLAYER_VA_DRM) + message(STATUS "QT_AVPLAYER_VA_DRM is defined") + add_definitions(-DQT_AVPLAYER_VA_DRM) + + set(QtAVPlayer_LIBS + ${QtAVPlayer_LIBS} + OpenGL::GL + EGL + va-drm + va + ) + + set(QtAVPlayer_PRIVATE_HEADERS + ${QtAVPlayer_PRIVATE_HEADERS} + ${QT_AVPLAYER_DIR}/qavhwdevice_vaapi_drm_egl_p.h + ) + + set(QtAVPlayer_SOURCES + ${QtAVPlayer_SOURCES} + ${QT_AVPLAYER_DIR}/qavhwdevice_vaapi_drm_egl.cpp + ) +endif() + +if(QT_AVPLAYER_VDPAU) + message(STATUS "QT_AVPLAYER_VDPAU is defined") + add_definitions(-DQT_AVPLAYER_VDPAU) + + find_package(OpenGL REQUIRED) + set(QtAVPlayer_LIBS + ${QtAVPlayer_LIBS} + OpenGL::GL + ) + + set(QtAVPlayer_PRIVATE_HEADERS + ${QtAVPlayer_PRIVATE_HEADERS} + ${QT_AVPLAYER_DIR}/qavhwdevice_vdpau_p.h + ) + + set(QtAVPlayer_SOURCES + ${QtAVPlayer_SOURCES} + ${QT_AVPLAYER_DIR}/qavhwdevice_vdpau.cpp + ) +endif()