Browse Source

feat: use amf and rkmpp hw accel with next engine (#2883)

* feat: use amf and rkmpp hw accel with next engine

* update changelog

* use next engine with mpeg-ts hybrid streaming mode
dependabot/nuget/ErsatzTV/BlazorSortable-6.0.2
Jason Dove 3 weeks ago committed by GitHub
parent
commit
d8955134f1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 4
      CHANGELOG.md
  2. 4
      ErsatzTV.Application/Channels/Commands/CreateChannelHandler.cs
  3. 4
      ErsatzTV.Application/Channels/Commands/UpdateChannelHandler.cs
  4. 2
      ErsatzTV.Application/Streaming/Commands/StartFFmpegNextSessionHandler.cs
  5. 12
      ErsatzTV.Core/Next/Config/ChannelConfig.cs
  6. 9
      ErsatzTV/Controllers/IptvController.cs
  7. 2
      ErsatzTV/ErsatzTV.csproj
  8. 1
      ErsatzTV/Pages/ChannelEditor.razor

4
CHANGELOG.md

@ -8,6 +8,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). @@ -8,6 +8,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Add `Streaming Engine` setting to Channel
- `Legacy` - (default) uses existing streaming engine
- `Next` - uses ErsatzTV Next streaming engine
- Add `Next Engine Text Subtitle Mode` setting to Channel
- `Burn` - (default) will burn all subtitles, including text subtitles
- `Convert If Possible` - will attempt to convert text subtitles to WebVTT
- WebVTT subtitles can be dynamically enabled and disabled during playback in supported HLS clients
### Fixed
- Fix `Add Playout` button not opening drop down menu (regression from v26.4.0)

4
ErsatzTV.Application/Channels/Commands/CreateChannelHandler.cs

@ -114,7 +114,9 @@ public class CreateChannelHandler( @@ -114,7 +114,9 @@ public class CreateChannelHandler(
channel.PlayoutOffset = null;
}
if (channel.StreamingEngine is StreamingEngine.Next)
if (channel.StreamingEngine is StreamingEngine.Next &&
channel.StreamingMode is not StreamingMode.HttpLiveStreamingSegmenter &&
channel.StreamingMode is not StreamingMode.TransportStreamHybrid)
{
channel.StreamingMode = StreamingMode.HttpLiveStreamingSegmenter;
}

4
ErsatzTV.Application/Channels/Commands/UpdateChannelHandler.cs

@ -142,7 +142,9 @@ public class UpdateChannelHandler( @@ -142,7 +142,9 @@ public class UpdateChannelHandler(
c.WatermarkId = update.WatermarkId;
c.FallbackFillerId = update.FallbackFillerId;
if (c.StreamingEngine is StreamingEngine.Next)
if (c.StreamingEngine is StreamingEngine.Next &&
c.StreamingMode is not StreamingMode.HttpLiveStreamingSegmenter &&
c.StreamingMode is not StreamingMode.TransportStreamHybrid)
{
c.StreamingMode = StreamingMode.HttpLiveStreamingSegmenter;
}

2
ErsatzTV.Application/Streaming/Commands/StartFFmpegNextSessionHandler.cs

@ -338,8 +338,10 @@ public class StartFFmpegNextSessionHandler( @@ -338,8 +338,10 @@ public class StartFFmpegNextSessionHandler(
},
Accel = ffmpegProfile.HardwareAcceleration switch
{
HardwareAccelerationKind.Amf => AccelEnum.Amf,
HardwareAccelerationKind.Nvenc => AccelEnum.Cuda,
HardwareAccelerationKind.Qsv => AccelEnum.Qsv,
HardwareAccelerationKind.Rkmpp => AccelEnum.Rkmpp,
HardwareAccelerationKind.Vaapi => AccelEnum.Vaapi,
HardwareAccelerationKind.VideoToolbox => AccelEnum.Videotoolbox,
_ => null

12
ErsatzTV.Core/Next/Config/ChannelConfig.cs

@ -151,7 +151,7 @@ namespace ErsatzTV.Core.Next.Config @@ -151,7 +151,7 @@ namespace ErsatzTV.Core.Next.Config
public enum Mode { Burn, Convert };
public enum AccelEnum { Cuda, Qsv, Vaapi, Videotoolbox, Vulkan };
public enum AccelEnum { Amf, Cuda, Qsv, Rkmpp, Vaapi, Videotoolbox, Vulkan };
public enum VideoFormat { H264, Hevc };
@ -280,10 +280,14 @@ namespace ErsatzTV.Core.Next.Config @@ -280,10 +280,14 @@ namespace ErsatzTV.Core.Next.Config
var value = serializer.Deserialize<string>(reader);
switch (value)
{
case "amf":
return AccelEnum.Amf;
case "cuda":
return AccelEnum.Cuda;
case "qsv":
return AccelEnum.Qsv;
case "rkmpp":
return AccelEnum.Rkmpp;
case "vaapi":
return AccelEnum.Vaapi;
case "videotoolbox":
@ -304,12 +308,18 @@ namespace ErsatzTV.Core.Next.Config @@ -304,12 +308,18 @@ namespace ErsatzTV.Core.Next.Config
var value = (AccelEnum)untypedValue;
switch (value)
{
case AccelEnum.Amf:
serializer.Serialize(writer, "amf");
return;
case AccelEnum.Cuda:
serializer.Serialize(writer, "cuda");
return;
case AccelEnum.Qsv:
serializer.Serialize(writer, "qsv");
return;
case AccelEnum.Rkmpp:
serializer.Serialize(writer, "rkmpp");
return;
case AccelEnum.Vaapi:
serializer.Serialize(writer, "vaapi");
return;

9
ErsatzTV/Controllers/IptvController.cs

@ -91,15 +91,6 @@ public class IptvController : StreamingControllerBase @@ -91,15 +91,6 @@ public class IptvController : StreamingControllerBase
return NotFound();
}
foreach (ChannelViewModel channel in maybeChannel)
{
// NEXT: MPEG-TS streams are not (yet?) supported
if (!channel.IsEnabled || channel.StreamingEngine is StreamingEngine.Next)
{
return NotFound();
}
}
// if mode is "unspecified" - find the configured mode and set it or redirect
if (string.IsNullOrWhiteSpace(mode) || mode == "mixed")
{

2
ErsatzTV/ErsatzTV.csproj

@ -55,7 +55,7 @@ @@ -55,7 +55,7 @@
<PackageReference Include="MudBlazor" Version="9.4.0" />
<PackageReference Include="NaturalSort.Extension" Version="4.4.1" />
<PackageReference Include="Refit.HttpClientFactory" Version="10.1.6" />
<PackageReference Include="Scalar.AspNetCore" Version="2.14.9" />
<PackageReference Include="Scalar.AspNetCore" Version="2.14.10" />
<PackageReference Include="Serilog" Version="4.3.1" />
<PackageReference Include="Serilog.AspNetCore" Version="10.0.0" />
<PackageReference Include="Serilog.Settings.Configuration" Version="10.0.0" />

1
ErsatzTV/Pages/ChannelEditor.razor

@ -159,6 +159,7 @@ else @@ -159,6 +159,7 @@ else
<MudSelect @bind-Value="_model.StreamingMode" For="@(() => _model.StreamingMode)">
@if (_model.StreamingEngine is StreamingEngine.Next)
{
<MudSelectItem Value="@(StreamingMode.TransportStreamHybrid)">MPEG-TS</MudSelectItem>
<MudSelectItem Value="@(StreamingMode.HttpLiveStreamingSegmenter)">HLS Segmenter</MudSelectItem>
}
else

Loading…
Cancel
Save