name: CI

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:
  linux:
    strategy:
      matrix:
        compiler: ['gcc-9']
        qt_version: ["5.15.2", "6.8.2"]
        include:
          - compiler: gcc-9
            packages: gcc-9 g++-9
            env: { 'CC': 'gcc-9', 'CXX': 'g++-9' }
          - qt_version: "6.8.2"
            qt_modules: "qtmultimedia"
            qt_packages: "libxkbcommon-dev libgstreamer-plugins-base1.0-0 libgstreamer-gl1.0-0"

    runs-on: ubuntu-latest

    env: ${{ matrix.env }}

    steps:
      - uses: actions/checkout@v3

      - name: Install compiler and FFmpeg dependencies
        run: |
          sudo apt-get update &&
          sudo apt-get install -y ${{ matrix.packages }} ${{ matrix.qt_packages }} \
                                  libavcodec-dev \
                                  libavformat-dev \
                                  libavdevice-dev \
                                  libavfilter-dev \
                                  libavformat-dev \
                                  libavutil-dev \
                                  libswresample-dev \
                                  libswscale-dev \
                                  libva-x11-2 \
                                  libva-drm2 \
                                  libass-dev

      - name: Install Qt
        uses: jurplel/install-qt-action@v3
        with:
          version: ${{ matrix.qt_version }}
          modules: ${{ matrix.qt_modules }}

      - name: libQtAVPlayer
        run: |
          mkdir build
          cd build
          cmake ../src/QtAVPlayer -DCMAKE_INSTALL_PREFIX=../install -DQT_AVPLAYER_MULTIMEDIA=ON
          make CC=$CC CXX=$CXX CXXFLAGS='-std=c++17' VERBOSE=1
          make install
          cd ../examples/qml_video
          mkdir build
          cd build
          cmake ../ -DCMAKE_PREFIX_PATH="$PWD/../../../install/lib/cmake" -DQT_AVPLAYER_LIB=ON
          make CC=$CC CXX=$CXX CXXFLAGS='-std=c++17' VERBOSE=1

      - name: QMake Test
        run: |
          export QT_LOGGING_RULES="qt.QtAVPlayer.debug=true"
          cd tests/auto/integration/qavdemuxer
          qmake DEFINES+="QT_AVPLAYER_LIBASS"
          make CC=$CC CXX=$CXX
          ./tst_qavdemuxer -platform offscreen
          cd ../qavplayer
          qmake
          make CC=$CC CXX=$CXX
          ./tst_qavplayer --platform minimal -maxwarnings 100000

      - name: QMake Examples
        run: |
          cd examples/qml_video
          qmake
          make CC=$CC CXX=$CXX
          cd ../widget_video_opengl
          qmake
          make CC=$CC CXX=$CXX
          cd ../muxer
          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
          cd ../widget_video_opengl
          cmake . -DQT_AVPLAYER_MULTIMEDIA=ON
          make CC=$CC CXX=$CXX CXXFLAGS='-std=c++17' VERBOSE=1

      - name: CMake Examples
        if: ${{ matrix.qt_version == '6.8.2' }}
        run: |
          cd examples/qml_player
          cmake . -DQT_AVPLAYER_MULTIMEDIA=ON -DQT_AVPLAYER_LIBASS=ON
          make CC=$CC CXX=$CXX CXXFLAGS='-std=c++17' VERBOSE=1

  macos:
    strategy:
      matrix:
        compiler: ['clang-9']
        include:
          - compiler: clang-9
            packages: llvm@14
            env: { 'CC': 'clang', 'CXX': 'clang++', 'CXXFLAGS': '-DNS_FORMAT_ARGUMENT\(A\)= -fapplication-extension -std=c++17' }

    runs-on: macos-latest

    env: ${{ matrix.env }}

    steps:
      - uses: actions/checkout@v3

      - name: Install dependencies
        run: |
          brew install ${{ matrix.packages }} ffmpeg qt@5

      - name: Set environment path
        run: |
          brew --prefix ffmpeg
          brew --prefix qt@5
          echo `brew --prefix qt@5`/bin >> $GITHUB_PATH
          echo "/usr/local/opt/llvm@9/bin" >> $GITHUB_PATH

      - name: libQtAVPlayer
        run: |
          export FFMPEG=`brew --prefix ffmpeg`
          ls -l $FFMPEG
          mkdir build
          cd build
          cmake ../src/QtAVPlayer -DCMAKE_INSTALL_PREFIX=../install -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
          make install
          cd ../examples/qml_video
          mkdir build
          cd build
          cmake ../ -DCMAKE_PREFIX_PATH="$PWD/../../../install/lib/cmake" -DQT_AVPLAYER_LIB=ON -DCMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES=$FFMPEG/include -DCMAKE_LIBRARY_PATH=$FFMPEG/lib
          make CC=$CC CXX=$CXX CXXFLAGS='-std=c++17' VERBOSE=1

      - name: QMake Test
        run: |
          export FFMPEG=`brew --prefix ffmpeg`
          ls -l $FFMPEG
          export QT_LOGGING_RULES="qt.QtAVPlayer.debug=true"
          cd tests/auto/integration/qavdemuxer
          qmake INCLUDEPATH+="$FFMPEG/include" LIBS="-L$FFMPEG/lib"
          make CC=$CC CXX=$CXX
          tst_qavdemuxer.app/Contents/MacOS/tst_qavdemuxer
          cd ../qavplayer
          qmake INCLUDEPATH+="$FFMPEG/include" LIBS="-L$FFMPEG/lib"
          make CC=$CC CXX=$CXX
          tst_qavplayer.app/Contents/MacOS/tst_qavplayer --platform minimal -maxwarnings 100000

      - name: QMake Examples
        run: |
          export FFMPEG=`brew --prefix ffmpeg`
          cd examples/qml_video
          qmake INCLUDEPATH+="$FFMPEG/include" LIBS+="-L$FFMPEG/lib"
          make CC=$CC CXX=$CXX
          cd ../muxer
          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:
        qt_version: ["5.15.2", "6.8.2"]
        type: ["MSVC", "MINGW"]
        include:
          - qt_version: "6.8.2"
            qt_modules: "qtmultimedia"

    runs-on: windows-latest

    steps:
      - uses: actions/checkout@v3

      - name: Init vs environment
        if: ${{ matrix.type == 'MSVC' }}
        uses: egor-tensin/vs-shell@v2
        with:
          arch: x64

      - name: Install wget & unzip
        run: |
          choco install wget unzip xidel

      - name: Install Qt
        if: ${{ matrix.type == 'MINGW' && matrix.qt_version == '5.15.2' }}
        uses: jurplel/install-qt-action@v3
        with:
          arch: win64_mingw81
          version: ${{ matrix.qt_version }}

      - name: Install Qt
        if: ${{ matrix.type == 'MINGW' && matrix.qt_version == '6.8.2' }}
        uses: jurplel/install-qt-action@v3
        with:
          arch: win64_mingw
          version: ${{ matrix.qt_version }}
          modules: ${{ matrix.qt_modules }}

      - name: Install Qt
        if: ${{ matrix.type == 'MSVC' && matrix.qt_version == '5.15.2' }}
        uses: jurplel/install-qt-action@v3
        with:
          version: ${{ matrix.qt_version }}
          modules: ${{ matrix.qt_modules }}

      - name: Install Qt
        if: ${{ matrix.type == 'MSVC' && matrix.qt_version == '6.8.2' }}
        uses: jurplel/install-qt-action@v4
        with:
          target: 'desktop'
          arch: win64_msvc2022_64
          version: ${{ matrix.qt_version }}
          modules: ${{ matrix.qt_modules }}

      - name: Install FFmpeg
        shell: cmd
        run: |
          cd ..
          xidel https://github.com/BtbN/FFmpeg-Builds/releases -e "//a[contains(@href, '-gpl-shared.zip')]/@href[1]" --silent > ffmpeg.url
          xidel https://github.com/BtbN/FFmpeg-Builds/releases -e "(//a[contains(@href, '-gpl-shared.zip')])[1]/substring(., 0, string-length(.) - 3)" --silent > ffmpeg.name
          set /P FFMPEG_URL=< ffmpeg.url
          set /P FFMPEG_NAME=< ffmpeg.name
          wget https://github.com%FFMPEG_URL%
          unzip %FFMPEG_NAME%.zip
          ren %FFMPEG_NAME% ffmpeg
          dir ffmpeg
          dir ffmpeg\include
          dir ffmpeg\bin
          SET FFMPEG=%CD%\ffmpeg
          echo FFMPEG=%FFMPEG%>>%GITHUB_ENV%
          echo LIBRARY_PATH=C:\mingw64\bin;%FFMPEG%\lib;%FFMPEG%\bin;>>%GITHUB_ENV%
          echo %FFMPEG%\lib;%FFMPEG%\bin;C:\mingw64\bin>>%GITHUB_PATH%
          echo INCLUDE=%FFMPEG%\include;%INCLUDE%>>%GITHUB_ENV%
          echo CPLUS_INCLUDE_PATH=%FFMPEG%\include;%CPLUS_INCLUDE_PATH%>>%GITHUB_ENV%
          echo LIB=%FFMPEG%\lib;%FFMPEG%\bin;%LIB%>>%GITHUB_ENV%

      - name: QMake Test
        if: ${{ matrix.type == 'MSVC' }}
        shell: cmd
        run: |
          set QT_LOGGING_RULES=qt.QtAVPlayer.debug=true
          set QT_FORCE_STDERR_LOGGING=1
          set QT_ASSUME_STDERR_HAS_CONSOLE=1
          cd tests\auto\integration\qavdemuxer
          dir
          qmake
          nmake
          dir release
          release\tst_qavdemuxer.exe
          cd ..\qavplayer
          cd qavplayer
          qmake
          nmake
          release\tst_qavplayer.exe -maxwarnings 100000

      - name: libQtAVPlayer
        if: ${{ matrix.type == 'MSVC' }}
        run: |
          mkdir build
          cd build
          cmake ../src/QtAVPlayer -DCMAKE_INSTALL_PREFIX=../install -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
          cmake --install .
          cd ../examples/qml_video
          mkdir build
          cd build
          cmake ../ -DCMAKE_PREFIX_PATH="D:\a\QtAVPlayer\install\lib\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 Test
        if: ${{ matrix.type == 'MINGW' && matrix.qt_version == '5.15.2' }}
        shell: cmd
        run: |
          set QT_LOGGING_RULES=qt.QtAVPlayer.debug=true
          set QT_FORCE_STDERR_LOGGING=1
          set QT_ASSUME_STDERR_HAS_CONSOLE=1
          cd tests/auto/integration/qavdemuxer
          where g++
          qmake
          mingw32-make
          release\tst_qavdemuxer.exe
          cd ../qavplayer
          qmake
          mingw32-make
          release\tst_qavplayer.exe -maxwarnings 100000

      - name: QMake Examples
        if: ${{ matrix.type == 'MSVC' }}
        run: |
          cd examples/qml_video
          qmake
          nmake
          cd ../muxer
          qmake
          nmake

      - 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: CMake Examples
        if: ${{ matrix.type == 'MSVC' && matrix.qt_version == '6.8.2' }}
        run: |
          cd examples/qml_player
          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
          qmake
          mingw32-make
          cd ../muxer
          qmake
          mingw32-make

