From 0962a1429a466973a2eef6a20ba45a235de95f29 Mon Sep 17 00:00:00 2001 From: Jason Dove Date: Mon, 24 May 2021 21:12:55 -0500 Subject: [PATCH] use linuxserver base docker image (#207) * use one base docker image * remove nvidia and vaapi tags * fix playback that only uses fps filter --- .github/workflows/ci.yml | 42 ++----------------- .github/workflows/release.yml | 40 ++---------------- .../FFmpegPlaybackSettingsCalculatorTests.cs | 30 +++++++++++++ .../FFmpegPlaybackSettingsCalculator.cs | 2 +- docker/Dockerfile | 5 ++- docker/docker-compose.nvidia.yml | 9 +--- docker/docker-compose.vaapi.yml | 2 - docker/nvidia/Dockerfile | 40 ------------------ docker/vaapi/Dockerfile | 40 ------------------ 9 files changed, 43 insertions(+), 167 deletions(-) delete mode 100644 docker/nvidia/Dockerfile delete mode 100644 docker/vaapi/Dockerfile diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2eebe9c55..9bf82111b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -52,17 +52,9 @@ jobs: final="${tag2/prealpha/$short}" echo "GIT_TAG=${final}" >> $GITHUB_ENV - - name: Set up Docker Buildx Base + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 - id: builder-base - - - name: Set up Docker Buildx NVIDIA - uses: docker/setup-buildx-action@v1 - id: builder-nvidia - - - name: Set up Docker Buildx VAAPI - uses: docker/setup-buildx-action@v1 - id: builder-vaapi + id: builder - name: Login to DockerHub uses: docker/login-action@v1 @@ -70,10 +62,10 @@ jobs: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} - - name: Build and push base + - name: Build and push uses: docker/build-push-action@v2 with: - builder: ${{ steps.builder-base.outputs.name }} + builder: ${{ steps.builder.outputs.name }} context: . file: ./docker/Dockerfile push: true @@ -82,29 +74,3 @@ jobs: tags: | jasongdove/ersatztv:develop jasongdove/ersatztv:${{ github.sha }} - - - name: Build and push nvidia - uses: docker/build-push-action@v2 - with: - builder: ${{ steps.builder-nvidia.outputs.name }} - context: . - file: ./docker/nvidia/Dockerfile - push: true - build-args: | - INFO_VERSION=${{ env.GIT_TAG }}-docker-nvidia - tags: | - jasongdove/ersatztv:develop-nvidia - jasongdove/ersatztv:${{ github.sha }}-nvidia - - - name: Build and push vaapi - uses: docker/build-push-action@v2 - with: - builder: ${{ steps.builder-vaapi.outputs.name }} - context: . - file: ./docker/vaapi/Dockerfile - push: true - build-args: | - INFO_VERSION=${{ env.GIT_TAG }}-docker-vaapi - tags: | - jasongdove/ersatztv:develop-vaapi - jasongdove/ersatztv:${{ github.sha }}-vaapi diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 816ceef41..aad0e85ce 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -83,17 +83,9 @@ jobs: echo "GIT_TAG=${tag:1}" >> $GITHUB_ENV echo "DOCKER_TAG=${tag/-prealpha/}" >> $GITHUB_ENV - - name: Set up Docker Buildx Base + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 - id: builder-base - - - name: Set up Docker Buildx NVIDIA - uses: docker/setup-buildx-action@v1 - id: builder-nvidia - - - name: Set up Docker Buildx VAAPI - uses: docker/setup-buildx-action@v1 - id: builder-vaapi + id: builder - name: Login to DockerHub uses: docker/login-action@v1 @@ -104,7 +96,7 @@ jobs: - name: Build and push base uses: docker/build-push-action@v2 with: - builder: ${{ steps.builder-base.outputs.name }} + builder: ${{ steps.builder.outputs.name }} context: . file: ./docker/Dockerfile push: true @@ -113,29 +105,3 @@ jobs: tags: | jasongdove/ersatztv:latest jasongdove/ersatztv:${{ env.DOCKER_TAG }} - - - name: Build and push nvidia - uses: docker/build-push-action@v2 - with: - builder: ${{ steps.builder-nvidia.outputs.name }} - context: . - file: ./docker/nvidia/Dockerfile - push: true - build-args: | - INFO_VERSION=${{ env.GIT_TAG }}-docker-nvidia - tags: | - jasongdove/ersatztv:latest-nvidia - jasongdove/ersatztv:${{ env.DOCKER_TAG }}-nvidia - - - name: Build and push vaapi - uses: docker/build-push-action@v2 - with: - builder: ${{ steps.builder-vaapi.outputs.name }} - context: . - file: ./docker/vaapi/Dockerfile - push: true - build-args: | - INFO_VERSION=${{ env.GIT_TAG }}-docker-vaapi - tags: | - jasongdove/ersatztv:latest-vaapi - jasongdove/ersatztv:${{ env.DOCKER_TAG }}-vaapi diff --git a/ErsatzTV.Core.Tests/FFmpeg/FFmpegPlaybackSettingsCalculatorTests.cs b/ErsatzTV.Core.Tests/FFmpeg/FFmpegPlaybackSettingsCalculatorTests.cs index 9ac603db2..b67a43de2 100644 --- a/ErsatzTV.Core.Tests/FFmpeg/FFmpegPlaybackSettingsCalculatorTests.cs +++ b/ErsatzTV.Core.Tests/FFmpeg/FFmpegPlaybackSettingsCalculatorTests.cs @@ -466,6 +466,36 @@ namespace ErsatzTV.Core.Tests.FFmpeg actual.PadToDesiredResolution.Should().BeFalse(); actual.VideoCodec.Should().Be("copy"); } + + [Test] + public void ShouldNot_SetCopyVideoCodec_When_ContentIsCorrectSize_And_CorrectCodec_And_Framerate_ForTransportStream() + { + var ffmpegProfile = new FFmpegProfile + { + NormalizeVideo = true, + Resolution = new Resolution { Width = 1920, Height = 1080 }, + VideoCodec = "libx264", + FrameRate = "24" + }; + + // not anamorphic + var version = new MediaVersion + { Width = 1920, Height = 1080, SampleAspectRatio = "1:1" }; + + FFmpegPlaybackSettings actual = _calculator.CalculateSettings( + StreamingMode.TransportStream, + ffmpegProfile, + version, + new MediaStream { Codec = "libx264" }, + new MediaStream(), + DateTimeOffset.Now, + DateTimeOffset.Now); + + actual.ScaledSize.IsNone.Should().BeTrue(); + actual.PadToDesiredResolution.Should().BeFalse(); + actual.VideoCodec.Should().NotBe("copy"); + } + [Test] public void diff --git a/ErsatzTV.Core/FFmpeg/FFmpegPlaybackSettingsCalculator.cs b/ErsatzTV.Core/FFmpeg/FFmpegPlaybackSettingsCalculator.cs index 1f730af3d..af3846efc 100644 --- a/ErsatzTV.Core/FFmpeg/FFmpegPlaybackSettingsCalculator.cs +++ b/ErsatzTV.Core/FFmpeg/FFmpegPlaybackSettingsCalculator.cs @@ -99,7 +99,7 @@ namespace ErsatzTV.Core.FFmpeg } if (result.ScaledSize.IsSome || result.PadToDesiredResolution || - NeedToNormalizeVideoCodec(ffmpegProfile, videoStream)) + NeedToNormalizeVideoCodec(ffmpegProfile, videoStream) || result.FrameRate.IsSome) { result.VideoCodec = ffmpegProfile.VideoCodec; result.VideoBitrate = ffmpegProfile.VideoBitrate; diff --git a/docker/Dockerfile b/docker/Dockerfile index a7e9fe1bf..7d00f293a 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,6 +1,6 @@ FROM mcr.microsoft.com/dotnet/aspnet:5.0-focal-amd64 AS dotnet-runtime -FROM jrottenberg/ffmpeg:4.3-ubuntu2004 AS runtime-base +FROM linuxserver/ffmpeg:amd64-latest AS runtime-base COPY --from=dotnet-runtime /usr/share/dotnet /usr/share/dotnet RUN apt-get update && DEBIAN_FRONTEND="noninteractive" apt-get install -y libicu-dev tzdata @@ -37,4 +37,5 @@ FROM runtime-base WORKDIR /app EXPOSE 8409 COPY --from=build /app ./ -ENTRYPOINT ["./ErsatzTV"] +RUN usermod -a -G root abc +ENTRYPOINT ["/app/ErsatzTV"] diff --git a/docker/docker-compose.nvidia.yml b/docker/docker-compose.nvidia.yml index b44716dc7..d68e23d74 100644 --- a/docker/docker-compose.nvidia.yml +++ b/docker/docker-compose.nvidia.yml @@ -2,14 +2,9 @@ services: ersatztv: - build: - context: .. - dockerfile: docker/nvidia/Dockerfile - environment: - NVIDIA_VISIBLE_DEVICES: all - NVIDIA_DRIVER_CAPABILITIES: compute,utility,video + privileged: true deploy: resources: reservations: devices: - - capabilities: [ gpu ] + - capabilities: [ gpu ] diff --git a/docker/docker-compose.vaapi.yml b/docker/docker-compose.vaapi.yml index a00c42a51..59a313091 100644 --- a/docker/docker-compose.vaapi.yml +++ b/docker/docker-compose.vaapi.yml @@ -2,7 +2,5 @@ services: ersatztv: - build: - dockerfile: docker/vaapi/Dockerfile devices: - /dev/dri/renderD128:/dev/dri/renderD128 diff --git a/docker/nvidia/Dockerfile b/docker/nvidia/Dockerfile deleted file mode 100644 index e7625f9b5..000000000 --- a/docker/nvidia/Dockerfile +++ /dev/null @@ -1,40 +0,0 @@ -FROM mcr.microsoft.com/dotnet/aspnet:5.0-focal-amd64 AS dotnet-runtime - -FROM jrottenberg/ffmpeg:4.3-nvidia1804 AS runtime-base -COPY --from=dotnet-runtime /usr/share/dotnet /usr/share/dotnet -RUN apt-get update && DEBIAN_FRONTEND="noninteractive" apt-get install -y libicu-dev tzdata - -# https://hub.docker.com/_/microsoft-dotnet -FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build -RUN apt-get update && apt-get install -y ca-certificates -WORKDIR /source - -# copy csproj and restore as distinct layers -COPY *.sln . -COPY ErsatzTV/*.csproj ./ErsatzTV/ -COPY generated/ErsatzTV.Api.Sdk/src/ErsatzTV.Api.Sdk/*.csproj ./generated/ErsatzTV.Api.Sdk/src/ErsatzTV.Api.Sdk/ -COPY ErsatzTV.Application/*.csproj ./ErsatzTV.Application/ -COPY ErsatzTV.CommandLine/*.csproj ./ErsatzTV.CommandLine/ -COPY ErsatzTV.Core/*.csproj ./ErsatzTV.Core/ -COPY ErsatzTV.Core.Tests/*.csproj ./ErsatzTV.Core.Tests/ -COPY ErsatzTV.Infrastructure/*.csproj ./ErsatzTV.Infrastructure/ -RUN dotnet restore -r linux-x64 - -# copy everything else and build app -COPY ErsatzTV/. ./ErsatzTV/ -COPY generated/ErsatzTV.Api.Sdk/src/ErsatzTV.Api.Sdk/. ./generated/ErsatzTV.Api.Sdk/src/ErsatzTV.Api.Sdk/ -COPY ErsatzTV.Application/. ./ErsatzTV.Application/ -COPY ErsatzTV.CommandLine/. ./ErsatzTV.CommandLine/ -COPY ErsatzTV.Core/. ./ErsatzTV.Core/ -COPY ErsatzTV.Core.Tests/. ./ErsatzTV.Core.Tests/ -COPY ErsatzTV.Infrastructure/. ./ErsatzTV.Infrastructure/ -WORKDIR /source/ErsatzTV -ARG INFO_VERSION="unknown" -RUN dotnet publish -c release -o /app -r linux-x64 --self-contained false --no-restore /p:InformationalVersion=${INFO_VERSION} - -# final stage/image -FROM runtime-base -WORKDIR /app -EXPOSE 8409 -COPY --from=build /app ./ -ENTRYPOINT ["./ErsatzTV"] diff --git a/docker/vaapi/Dockerfile b/docker/vaapi/Dockerfile deleted file mode 100644 index 7dee22662..000000000 --- a/docker/vaapi/Dockerfile +++ /dev/null @@ -1,40 +0,0 @@ -FROM mcr.microsoft.com/dotnet/aspnet:5.0-focal-amd64 AS dotnet-runtime - -FROM jrottenberg/ffmpeg:4.3-vaapi2004 AS runtime-base -COPY --from=dotnet-runtime /usr/share/dotnet /usr/share/dotnet -RUN apt-get update && DEBIAN_FRONTEND="noninteractive" apt-get install -y libicu-dev tzdata - -# https://hub.docker.com/_/microsoft-dotnet -FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build -RUN apt-get update && apt-get install -y ca-certificates -WORKDIR /source - -# copy csproj and restore as distinct layers -COPY *.sln . -COPY ErsatzTV/*.csproj ./ErsatzTV/ -COPY generated/ErsatzTV.Api.Sdk/src/ErsatzTV.Api.Sdk/*.csproj ./generated/ErsatzTV.Api.Sdk/src/ErsatzTV.Api.Sdk/ -COPY ErsatzTV.Application/*.csproj ./ErsatzTV.Application/ -COPY ErsatzTV.CommandLine/*.csproj ./ErsatzTV.CommandLine/ -COPY ErsatzTV.Core/*.csproj ./ErsatzTV.Core/ -COPY ErsatzTV.Core.Tests/*.csproj ./ErsatzTV.Core.Tests/ -COPY ErsatzTV.Infrastructure/*.csproj ./ErsatzTV.Infrastructure/ -RUN dotnet restore -r linux-x64 - -# copy everything else and build app -COPY ErsatzTV/. ./ErsatzTV/ -COPY generated/ErsatzTV.Api.Sdk/src/ErsatzTV.Api.Sdk/. ./generated/ErsatzTV.Api.Sdk/src/ErsatzTV.Api.Sdk/ -COPY ErsatzTV.Application/. ./ErsatzTV.Application/ -COPY ErsatzTV.CommandLine/. ./ErsatzTV.CommandLine/ -COPY ErsatzTV.Core/. ./ErsatzTV.Core/ -COPY ErsatzTV.Core.Tests/. ./ErsatzTV.Core.Tests/ -COPY ErsatzTV.Infrastructure/. ./ErsatzTV.Infrastructure/ -WORKDIR /source/ErsatzTV -ARG INFO_VERSION="unknown" -RUN dotnet publish -c release -o /app -r linux-x64 --self-contained false --no-restore /p:InformationalVersion=${INFO_VERSION} - -# final stage/image -FROM runtime-base -WORKDIR /app -EXPOSE 8409 -COPY --from=build /app ./ -ENTRYPOINT ["./ErsatzTV"]