master-of-zen/Av1an

View on GitHub
.github/workflows/tests.yml

Summary

Maintainability
Test Coverage
name: tests
on:
  - push
  - pull_request

env:
  DEBIAN_FRONTEND: noninteractive

jobs:
  all-tests:
    runs-on: ubuntu-latest
    container: shssoichiro/av1an-ci:latest
    steps:
      - uses: actions/checkout@v3

      - uses: Swatinem/rust-cache@v2

      - name: Validate encoders
        run: |
          which aomenc
          which SvtAv1EncApp
          which rav1e
          which vpxenc
          which x265
          which x264

      - name: Validate formatting
        run: |
          cargo fmt --all -- --check

      - name: Build Av1an
        run: |
          cargo clippy --profile ci -- -D warnings
          cargo build --profile ci

      # 352x240 112 frames test video
      - name: Download test video
        run: |
          curl -LO https://media.xiph.org/video/derf/y4m/tt_sif.y4m

      - name: Testing unit tests
        working-directory: ./av1an-core
        run: |
          cargo test --profile ci

      # The baseline tests should not include the faster default params, because we want to also test that
      # it works without params passed
      - name: Testing baseline aom
        run: |
          target/ci/av1an -i tt_sif.y4m -e aom --pix-format yuv420p --sc-method fast -y -o "tt_sif.mkv"
          du -h tt_sif.mkv

      - name: Testing baseline rav1e
        run: |
          target/ci/av1an -i tt_sif.y4m -e rav1e --pix-format yuv420p --sc-method fast -y -o "tt_sif.mkv"
          du -h tt_sif.mkv

      - name: Testing baseline svt-av1
        run: |
          target/ci/av1an -i tt_sif.y4m -e svt-av1 --pix-format yuv420p --sc-method fast -y -o "tt_sif.mkv"
          du -h tt_sif.mkv

      - name: Testing baseline vpx
        run: |
          target/ci/av1an -i tt_sif.y4m -e vpx --pix-format yuv420p --sc-method fast -y -o "tt_sif.mkv"
          du -h tt_sif.mkv

      - name: Testing baseline x265
        run: |
          target/ci/av1an -i tt_sif.y4m -e x265 --pix-format yuv420p -c mkvmerge --sc-method fast -y -o "tt_sif.mkv"
          du -h tt_sif.mkv

      - name: Testing baseline x264
        run: |
          target/ci/av1an -i tt_sif.y4m -e x264 --pix-format yuv420p --sc-method fast -y -o "tt_sif.mkv"
          du -h tt_sif.mkv

      - name: Testing baseline-select aom
        run: |
          target/ci/av1an -i tt_sif.y4m -e aom --pix-format yuv420p --sc-method fast -y -o "tt_sif.mkv" -v " --cpu-used=10 --rt --threads=4" --chunk-method select
          du -h tt_sif.mkv

      - name: Testing baseline-select rav1e
        run: |
          target/ci/av1an -i tt_sif.y4m -e rav1e --pix-format yuv420p --sc-method fast -y -o "tt_sif.mkv" -v " --speed 10 --low-latency" --chunk-method select
          du -h tt_sif.mkv

      - name: Testing baseline-select svt-av1
        run: |
          target/ci/av1an -i tt_sif.y4m -e svt-av1 --pix-format yuv420p --sc-method fast -y -o "tt_sif.mkv" -v " --preset 8" --chunk-method select
          du -h tt_sif.mkv

      - name: Testing baseline-select vpx
        run: |
          target/ci/av1an -i tt_sif.y4m -e vpx --pix-format yuv420p --sc-method fast -y -o "tt_sif.mkv" -v " --cpu-used=9 --rt --threads=4" --chunk-method select
          du -h tt_sif.mkv

      - name: Testing baseline-select x265
        run: |
          target/ci/av1an -i tt_sif.y4m -e x265 --pix-format yuv420p -c mkvmerge --sc-method fast -y -o "tt_sif.mkv" -v " --preset ultrafast" --chunk-method select
          du -h tt_sif.mkv

      - name: Testing baseline-select x264
        run: |
          target/ci/av1an -i tt_sif.y4m -e x264 --pix-format yuv420p --sc-method fast -y -o "tt_sif.mkv" -v " --preset ultrafast" --chunk-method select
          du -h tt_sif.mkv

      - name: Testing target-quality
        run: |
          target/ci/av1an -i tt_sif.y4m -e x265 --pix-format yuv420p -c mkvmerge --sc-method fast -y -v " --preset ultrafast" --target-quality 95 -o "95.mkv" --log-file 95
          target/ci/av1an -i tt_sif.y4m -e x265 --pix-format yuv420p -c mkvmerge --sc-method fast -y -v " --preset ultrafast" --target-quality 80 -o "80.mkv" --log-file 80
          du -h 95.mkv 80.mkv
          # compare the size of the two files to make sure 95.mkv is larger than 80.mkv
          if [ $(stat -c%s "95.mkv") -gt $(stat -c%s "80.mkv") ]; then echo "Target quality is working correctly"; else echo "95.mkv is smaller than 80.mkv"; cat 95.log 80.log; exit 1; fi

      - name: Testing target-quality aom
        run: |
          target/ci/av1an -i tt_sif.y4m -e aom --pix-format yuv420p --sc-method fast -y -o "tt_sif.mkv" -v " --cpu-used=10 --rt --threads=4" --target-quality 95
          du -h tt_sif.mkv

      - name: Testing target-quality rav1e
        run: |
          target/ci/av1an -i tt_sif.y4m -e rav1e --pix-format yuv420p --sc-method fast -y -o "tt_sif.mkv" -v " --speed 10 --low-latency" --target-quality 95
          du -h tt_sif.mkv

      - name: Testing target-quality svt-av1
        run: |
          target/ci/av1an -i tt_sif.y4m -e svt-av1 --pix-format yuv420p --sc-method fast -y -o "tt_sif.mkv" -v " --preset 8" --target-quality 95
          du -h tt_sif.mkv

      - name: Testing target-quality vpx
        run: |
          target/ci/av1an -i tt_sif.y4m -e vpx --pix-format yuv420p --sc-method fast -y -o "tt_sif.mkv" -v " --cpu-used=9 --rt --threads=4" --target-quality 95
          du -h tt_sif.mkv

      - name: Testing target-quality x265
        run: |
          target/ci/av1an -i tt_sif.y4m -e x265 --pix-format yuv420p -c mkvmerge --sc-method fast -y -o "tt_sif.mkv" -v " --preset ultrafast" --target-quality 95
          du -h tt_sif.mkv

      - name: Testing target-quality x264
        run: |
          target/ci/av1an -i tt_sif.y4m -e x264 --pix-format yuv420p --sc-method fast -y -o "tt_sif.mkv" -v " --preset ultrafast" --target-quality 95
          du -h tt_sif.mkv

      - name: Testing target-quality replace crf
        run: |
          target/ci/av1an -i tt_sif.y4m -e x264 --pix-format yuv420p --sc-method fast -y -o "tt_sif.mkv" -v " --preset ultrafast --crf 0" --target-quality 95
          du -h tt_sif.mkv

      - name: Testing probe-slow aom
        run: |
          target/ci/av1an -i tt_sif.y4m -e aom --pix-format yuv420p --sc-method fast -y -o "tt_sif.mkv" -v " --cpu-used=10 --rt --threads=4" --target-quality 95 --probe-slow
          du -h tt_sif.mkv

      - name: Testing probe-slow rav1e
        run: |
          target/ci/av1an -i tt_sif.y4m -e rav1e --pix-format yuv420p --sc-method fast -y -o "tt_sif.mkv" -v " --speed 10 --low-latency" --target-quality 95 --probe-slow
          du -h tt_sif.mkv

      - name: Testing probe-slow svt-av1
        run: |
          target/ci/av1an -i tt_sif.y4m -e svt-av1 --pix-format yuv420p --sc-method fast -y -o "tt_sif.mkv" -v " --preset 8" --target-quality 95 --probe-slow
          du -h tt_sif.mkv

      - name: Testing probe-slow vpx
        run: |
          target/ci/av1an -i tt_sif.y4m -e vpx --pix-format yuv420p --sc-method fast -y -o "tt_sif.mkv" -v " --cpu-used=9 --rt --threads=4" --target-quality 95 --probe-slow
          du -h tt_sif.mkv

      - name: Testing probe-slow x265
        run: |
          target/ci/av1an -i tt_sif.y4m -e x265 --pix-format yuv420p -c mkvmerge --sc-method fast -y -o "tt_sif.mkv" -v " --preset ultrafast" --target-quality 95 --probe-slow
          du -h tt_sif.mkv

      - name: Testing probe-slow x264
        run: |
          target/ci/av1an -i tt_sif.y4m -e x264 --pix-format yuv420p --sc-method fast -y -o "tt_sif.mkv" -v " --preset ultrafast" --target-quality 95 --probe-slow
          du -h tt_sif.mkv

      - name: Testing chunk_hybrid aom
        run: |
          target/ci/av1an -i tt_sif.y4m -e aom --pix-format yuv420p --sc-method fast -y -o "tt_sif.mkv" -v " --cpu-used=10 --rt --threads=4" --chunk-method hybrid
          du -h tt_sif.mkv

      - name: Testing chunk_select aom
        run: |
          target/ci/av1an -i tt_sif.y4m -e aom --pix-format yuv420p --sc-method fast -y -o "tt_sif.mkv" -v " --cpu-used=10 --rt --threads=4" --chunk-method select
          du -h tt_sif.mkv

      - name: Testing chunk_ffms2 aom
        run: |
          target/ci/av1an -i tt_sif.y4m -e aom --pix-format yuv420p --sc-method fast -y -o "tt_sif.mkv" -v " --cpu-used=10 --rt --threads=4" --chunk-method ffms2
          du -h tt_sif.mkv

      - name: Testing chunk_lsmash aom
        run: |
          target/ci/av1an -i tt_sif.y4m -e aom --pix-format yuv420p --sc-method fast -y -o "tt_sif.mkv" -v " --cpu-used=10 --rt --threads=4" --chunk-method lsmash
          du -h tt_sif.mkv

      - name: Testing scenes aom
        run: |
          target/ci/av1an -i tt_sif.y4m -e aom --pix-format yuv420p --sc-method fast -y -o "tt_sif.mkv" -v " --cpu-used=10 --rt --threads=4" -s scenes.json
          du -h tt_sif.mkv

      - name: Testing workers aom
        run: |
          target/ci/av1an -i tt_sif.y4m -e aom --pix-format yuv420p --sc-method fast -y -o "tt_sif.mkv" -v " --cpu-used=10 --rt --threads=4" -w 2
          du -h tt_sif.mkv

      - name: Testing vmaf aom
        run: |
          target/ci/av1an -i tt_sif.y4m -e aom --pix-format yuv420p --sc-method fast -y -o "tt_sif.mkv" -v " --cpu-used=10 --rt --threads=4" --vmaf
          du -h tt_sif.mkv

      - name: Testing extra_splits aom
        run: |
          target/ci/av1an -i tt_sif.y4m -e aom --pix-format yuv420p --sc-method fast -y -o "tt_sif.mkv" -v " --cpu-used=10 --rt --threads=4" -x 10
          du -h tt_sif.mkv

      - name: Testing temp aom
        run: |
          target/ci/av1an -i tt_sif.y4m -e aom --pix-format yuv420p --sc-method fast -y -o "tt_sif.mkv" -v " --cpu-used=10 --rt --threads=4" --temp temporary
          du -h tt_sif.mkv

      - name: Testing concat mkvmerge aom
        run: |
          target/ci/av1an -i tt_sif.y4m -e aom --pix-format yuv420p --sc-method fast -y -o "tt_sif.mkv" -v " --cpu-used=10 --rt --threads=4" -c mkvmerge
          du -h tt_sif.mkv

      - name: Testing slow scenechange aom
        run: |
          target/ci/av1an -i tt_sif.y4m -e aom --pix-format yuv420p -y -o "tt_sif.mkv" -v " --cpu-used=10 --rt --threads=4" -c mkvmerge
          du -h tt_sif.mkv

      - name: Testing sc-only
        run: |
          target/ci/av1an -i tt_sif.y4m --sc-only --sc-method fast -s "tt_sif_scenes.json"
          du -h tt_sif_scenes.json
        continue-on-error: true

  docker:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Cache Docker layers
        uses: actions/cache@v3
        with:
          path: /tmp/.buildx-cache
          key: ${{ runner.os }}-buildx-${{ github.sha }}
          restore-keys: |
            ${{ runner.os }}-buildx-

      - name: Build
        id: docker_build
        uses: docker/build-push-action@v4
        with:
          context: .
          file: ./Dockerfile
          push: false
          tags: av1an:action
          cache-from: type=local,src=/tmp/.buildx-cache
          cache-to: type=local,dest=/tmp/.buildx-cache-new,mode=max

      - name: Move cache
        # Temp fix
        # https://github.com/docker/build-push-action/issues/252
        # https://github.com/moby/buildkit/issues/1896
        run: |
          rm -rf /tmp/.buildx-cache
          mv /tmp/.buildx-cache-new /tmp/.buildx-cache

  # Job to output if docker-publish should run or not based on if DOCKERHUB_USERNAME and DOCKERHUB_TOKEN are set
  publish-check:
    runs-on: ubuntu-latest
    outputs:
      should_publish: ${{ steps.publish_check.outputs.should_publish }}
    steps:
      - name: Check for DOCKERHUB_USERNAME and DOCKERHUB_TOKEN
        id: publish_check
        run: |
          if [ -z ${{ secrets.DOCKERHUB_USERNAME }} ] || [ -z ${{ secrets.DOCKERHUB_TOKEN }} ]; then
            echo "should_publish=false" >> $GITHUB_OUTPUT
          else
            echo "should_publish=true" >> $GITHUB_OUTPUT
          fi

  docker-publish:
    needs: [all-tests, docker, publish-check]
    runs-on: ubuntu-latest
    if: needs.publish-check.outputs.should_publish == 'true'
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Docker meta
        id: docker_meta

        uses: docker/metadata-action@v4
        with:
          images: ${{ secrets.DOCKERHUB_USERNAME }}/av1an
          tags: |
            type=raw,value=latest,enable=${{ startsWith(github.ref, 'refs/tags/') }}
            type=ref,event=branch
            type=semver,pattern={{version}}
            type=semver,pattern={{major}}.{{minor}}
            type=semver,pattern={{major}}
            type=sha

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Login to DockerHub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Cache Docker layers
        uses: actions/cache@v3
        with:
          path: /tmp/.buildx-cache
          key: ${{ runner.os }}-buildx-${{ github.sha }}
          restore-keys: |
            ${{ runner.os }}-buildx-

      - name: Build and push
        id: docker_build
        uses: docker/build-push-action@v4
        with:
          context: .
          file: ./Dockerfile
          push: true
          tags: ${{ steps.docker_meta.outputs.tags }}
          labels: ${{ steps.docker_meta.outputs.labels }}
          cache-from: type=local,src=/tmp/.buildx-cache

      - name: Image digest
        run: echo ${{ steps.docker_build.outputs.digest }}