|
|
|
@ -38,266 +38,302 @@ |
|
|
|
</MudStack> |
|
|
|
</MudStack> |
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
<div class="d-flex"> |
|
|
|
<div class="d-flex"> |
|
|
|
<MudText>Preferred Resolution</MudText> |
|
|
|
<MudText>Normalize Audio</MudText> |
|
|
|
</div> |
|
|
|
|
|
|
|
<MudSelect @bind-Value="_model.Resolution" For="@(() => _model.Resolution)"> |
|
|
|
|
|
|
|
@foreach (ResolutionViewModel resolution in _resolutions) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
<MudSelectItem Value="@resolution">@resolution.Name</MudSelectItem> |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
</MudSelect> |
|
|
|
|
|
|
|
</MudStack> |
|
|
|
|
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
|
|
|
|
<div class="d-flex"> |
|
|
|
|
|
|
|
<MudText>Scaling Behavior</MudText> |
|
|
|
|
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<MudSelect @bind-Value="_model.ScalingBehavior" For="@(() => _model.ScalingBehavior)"> |
|
|
|
<MudCheckBox @bind-Value="@_model.NormalizeAudio" For="@(() => _model.NormalizeAudio)" Dense="true"/> |
|
|
|
<MudSelectItem Value="@ScalingBehavior.ScaleAndPad">Scale and Pad</MudSelectItem> |
|
|
|
|
|
|
|
<MudSelectItem Value="@ScalingBehavior.Stretch">Stretch</MudSelectItem> |
|
|
|
|
|
|
|
<MudSelectItem Value="@ScalingBehavior.Crop">Crop</MudSelectItem> |
|
|
|
|
|
|
|
</MudSelect> |
|
|
|
|
|
|
|
</MudStack> |
|
|
|
</MudStack> |
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
<div class="d-flex"> |
|
|
|
<div class="d-flex"> |
|
|
|
<MudText>Pad Mode</MudText> |
|
|
|
<MudText>Normalize Video</MudText> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<MudSelect @bind-Value="_model.PadMode" |
|
|
|
<MudCheckBox @bind-Value="@_model.NormalizeVideo" For="@(() => _model.NormalizeVideo)" Dense="true"/> |
|
|
|
For="@(() => _model.PadMode)" |
|
|
|
|
|
|
|
Disabled="_model.HardwareAcceleration is not HardwareAccelerationKind.Vaapi" |
|
|
|
|
|
|
|
HelperText="If hardware padding is green, software padding should be used instead"> |
|
|
|
|
|
|
|
<MudSelectItem Value="@FilterMode.HardwareIfPossible">Hardware If Possible</MudSelectItem> |
|
|
|
|
|
|
|
<MudSelectItem Value="@FilterMode.Software">Software</MudSelectItem> |
|
|
|
|
|
|
|
</MudSelect> |
|
|
|
|
|
|
|
</MudStack> |
|
|
|
</MudStack> |
|
|
|
<MudText Typo="Typo.h5" Class="mt-10 mb-2">Video</MudText> |
|
|
|
|
|
|
|
<MudDivider Class="mb-6"/> |
|
|
|
|
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
<div class="d-flex"> |
|
|
|
<div class="d-flex"> |
|
|
|
<MudText>Format</MudText> |
|
|
|
<MudText>Preferred Resolution</MudText> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<MudSelect @bind-Value="_model.VideoFormat" For="@(() => _model.VideoFormat)"> |
|
|
|
<MudSelect @bind-Value="_model.Resolution" For="@(() => _model.Resolution)"> |
|
|
|
<MudSelectItem Value="@FFmpegProfileVideoFormat.H264">h264</MudSelectItem> |
|
|
|
@foreach (ResolutionViewModel resolution in _resolutions) |
|
|
|
<MudSelectItem Value="@FFmpegProfileVideoFormat.Hevc">hevc</MudSelectItem> |
|
|
|
|
|
|
|
<MudSelectItem Value="@FFmpegProfileVideoFormat.Mpeg2Video">mpeg-2</MudSelectItem> |
|
|
|
|
|
|
|
@if (_model.HardwareAcceleration is (HardwareAccelerationKind.Nvenc or HardwareAccelerationKind.Vaapi or HardwareAccelerationKind.Qsv)) |
|
|
|
|
|
|
|
{ |
|
|
|
{ |
|
|
|
<MudSelectItem Value="@FFmpegProfileVideoFormat.Av1">av1</MudSelectItem> |
|
|
|
<MudSelectItem Value="@resolution">@resolution.Name</MudSelectItem> |
|
|
|
} |
|
|
|
} |
|
|
|
</MudSelect> |
|
|
|
</MudSelect> |
|
|
|
</MudStack> |
|
|
|
</MudStack> |
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
@if (_model.NormalizeVideo) |
|
|
|
<div class="d-flex"> |
|
|
|
{ |
|
|
|
<MudText>Profile</MudText> |
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
</div> |
|
|
|
<div class="d-flex"> |
|
|
|
<MudSelect @bind-Value="_model.VideoProfile" |
|
|
|
<MudText>Scaling Behavior</MudText> |
|
|
|
For="@(() => _model.VideoProfile)" |
|
|
|
</div> |
|
|
|
Disabled="@(_model.VideoFormat != FFmpegProfileVideoFormat.H264 || !HardwareAccelSupportsH264Profile(_model.HardwareAcceleration))" |
|
|
|
<MudSelect @bind-Value="_model.ScalingBehavior" For="@(() => _model.ScalingBehavior)"> |
|
|
|
Clearable="true"> |
|
|
|
<MudSelectItem Value="@ScalingBehavior.ScaleAndPad">Scale and Pad</MudSelectItem> |
|
|
|
<MudSelectItem Value="@VideoProfile.Main">main</MudSelectItem> |
|
|
|
<MudSelectItem Value="@ScalingBehavior.Stretch">Stretch</MudSelectItem> |
|
|
|
<MudSelectItem Value="@VideoProfile.High">high</MudSelectItem> |
|
|
|
<MudSelectItem Value="@ScalingBehavior.Crop">Crop</MudSelectItem> |
|
|
|
@if (_model.HardwareAcceleration is HardwareAccelerationKind.Nvenc) |
|
|
|
</MudSelect> |
|
|
|
{ |
|
|
|
</MudStack> |
|
|
|
<MudSelectItem Value="@VideoProfile.High444p">high444p</MudSelectItem> |
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
} |
|
|
|
<div class="d-flex"> |
|
|
|
else |
|
|
|
<MudText>Pad Mode</MudText> |
|
|
|
{ |
|
|
|
</div> |
|
|
|
<MudSelectItem Value="@VideoProfile.High10">high10</MudSelectItem> |
|
|
|
<MudSelect @bind-Value="_model.PadMode" |
|
|
|
|
|
|
|
For="@(() => _model.PadMode)" |
|
|
|
|
|
|
|
Disabled="_model.HardwareAcceleration is not HardwareAccelerationKind.Vaapi" |
|
|
|
|
|
|
|
HelperText="If hardware padding is green, software padding should be used instead"> |
|
|
|
|
|
|
|
<MudSelectItem Value="@FilterMode.HardwareIfPossible">Hardware If Possible</MudSelectItem> |
|
|
|
|
|
|
|
<MudSelectItem Value="@FilterMode.Software">Software</MudSelectItem> |
|
|
|
|
|
|
|
</MudSelect> |
|
|
|
|
|
|
|
</MudStack> |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
<MudText Typo="Typo.h5" Class="mt-10 mb-2">Video</MudText> |
|
|
|
|
|
|
|
<MudDivider Class="mb-6"/> |
|
|
|
|
|
|
|
@if (_model.NormalizeVideo) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
|
|
|
|
<div class="d-flex"> |
|
|
|
|
|
|
|
<MudText>Format</MudText> |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
<MudSelect @bind-Value="_model.VideoFormat" For="@(() => _model.VideoFormat)"> |
|
|
|
|
|
|
|
<MudSelectItem Value="@FFmpegProfileVideoFormat.H264">h264</MudSelectItem> |
|
|
|
|
|
|
|
<MudSelectItem Value="@FFmpegProfileVideoFormat.Hevc">hevc</MudSelectItem> |
|
|
|
|
|
|
|
<MudSelectItem Value="@FFmpegProfileVideoFormat.Mpeg2Video">mpeg-2</MudSelectItem> |
|
|
|
|
|
|
|
@if (_model.HardwareAcceleration is (HardwareAccelerationKind.Nvenc or HardwareAccelerationKind.Vaapi or HardwareAccelerationKind.Qsv)) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
<MudSelectItem Value="@FFmpegProfileVideoFormat.Av1">av1</MudSelectItem> |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
</MudSelect> |
|
|
|
|
|
|
|
</MudStack> |
|
|
|
|
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
|
|
|
|
<div class="d-flex"> |
|
|
|
|
|
|
|
<MudText>Profile</MudText> |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
<MudSelect @bind-Value="_model.VideoProfile" |
|
|
|
|
|
|
|
For="@(() => _model.VideoProfile)" |
|
|
|
|
|
|
|
Disabled="@(_model.VideoFormat != FFmpegProfileVideoFormat.H264 || !HardwareAccelSupportsH264Profile(_model.HardwareAcceleration))" |
|
|
|
|
|
|
|
Clearable="true"> |
|
|
|
|
|
|
|
<MudSelectItem Value="@VideoProfile.Main">main</MudSelectItem> |
|
|
|
|
|
|
|
<MudSelectItem Value="@VideoProfile.High">high</MudSelectItem> |
|
|
|
|
|
|
|
@if (_model.HardwareAcceleration is HardwareAccelerationKind.Nvenc) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
<MudSelectItem Value="@VideoProfile.High444p">high444p</MudSelectItem> |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
<MudSelectItem Value="@VideoProfile.High10">high10</MudSelectItem> |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
</MudSelect> |
|
|
|
|
|
|
|
</MudStack> |
|
|
|
|
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
|
|
|
|
<div class="d-flex"> |
|
|
|
|
|
|
|
<MudText>Preset</MudText> |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
@{ |
|
|
|
|
|
|
|
ICollection<string> presets = FFmpegLibraryHelper.PresetsForFFmpegProfile( |
|
|
|
|
|
|
|
_model.HardwareAcceleration, |
|
|
|
|
|
|
|
_model.VideoFormat, |
|
|
|
|
|
|
|
_model.BitDepth); |
|
|
|
} |
|
|
|
} |
|
|
|
</MudSelect> |
|
|
|
<MudSelect @bind-Value="_model.VideoPreset" |
|
|
|
</MudStack> |
|
|
|
For="@(() => _model.VideoPreset)" |
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
Disabled="@(presets.Count == 0)" |
|
|
|
<div class="d-flex"> |
|
|
|
Clearable="true"> |
|
|
|
<MudText>Preset</MudText> |
|
|
|
@foreach (string preset in presets) |
|
|
|
</div> |
|
|
|
{ |
|
|
|
@{ |
|
|
|
if (!string.IsNullOrWhiteSpace(preset)) |
|
|
|
ICollection<string> presets = FFmpegLibraryHelper.PresetsForFFmpegProfile( |
|
|
|
{ |
|
|
|
_model.HardwareAcceleration, |
|
|
|
<MudSelectItem Value="@preset">@preset</MudSelectItem> |
|
|
|
_model.VideoFormat, |
|
|
|
} |
|
|
|
_model.BitDepth); |
|
|
|
} |
|
|
|
} |
|
|
|
</MudSelect> |
|
|
|
<MudSelect @bind-Value="_model.VideoPreset" |
|
|
|
</MudStack> |
|
|
|
For="@(() => _model.VideoPreset)" |
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
Disabled="@(presets.Count == 0)" |
|
|
|
<div class="d-flex"> |
|
|
|
Clearable="true"> |
|
|
|
<MudText>Allow B-Frames</MudText> |
|
|
|
@foreach (string preset in presets) |
|
|
|
</div> |
|
|
|
{ |
|
|
|
<MudCheckBox @bind-Value="@_model.AllowBFrames" For="@(() => _model.AllowBFrames)" Dense="true"/> |
|
|
|
if (!string.IsNullOrWhiteSpace(preset)) |
|
|
|
</MudStack> |
|
|
|
|
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
|
|
|
|
<div class="d-flex"> |
|
|
|
|
|
|
|
<MudText>Bit Depth</MudText> |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
<MudSelect @bind-Value="_model.BitDepth" For="@(() => _model.BitDepth)"> |
|
|
|
|
|
|
|
<MudSelectItem Value="@FFmpegProfileBitDepth.EightBit">8-bit</MudSelectItem> |
|
|
|
|
|
|
|
<MudSelectItem Value="@FFmpegProfileBitDepth.TenBit">10-bit</MudSelectItem> |
|
|
|
|
|
|
|
</MudSelect> |
|
|
|
|
|
|
|
</MudStack> |
|
|
|
|
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
|
|
|
|
<div class="d-flex"> |
|
|
|
|
|
|
|
<MudText>Bitrate</MudText> |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
<MudTextField @bind-Value="_model.VideoBitrate" For="@(() => _model.VideoBitrate)" Adornment="Adornment.End" AdornmentText="kBit/s"/> |
|
|
|
|
|
|
|
</MudStack> |
|
|
|
|
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
|
|
|
|
<div class="d-flex"> |
|
|
|
|
|
|
|
<MudText>Buffer Size</MudText> |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
<MudTextField @bind-Value="_model.VideoBufferSize" For="@(() => _model.VideoBufferSize)" Adornment="Adornment.End" AdornmentText="kBit"/> |
|
|
|
|
|
|
|
</MudStack> |
|
|
|
|
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
|
|
|
|
<div class="d-flex"> |
|
|
|
|
|
|
|
<MudText>Hardware Acceleration</MudText> |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
<MudSelect @bind-Value="_model.HardwareAcceleration" For="@(() => _model.HardwareAcceleration)"> |
|
|
|
|
|
|
|
@foreach (HardwareAccelerationKind hwAccel in _hardwareAccelerationKinds) |
|
|
|
{ |
|
|
|
{ |
|
|
|
<MudSelectItem Value="@preset">@preset</MudSelectItem> |
|
|
|
<MudSelectItem Value="@hwAccel">@hwAccel</MudSelectItem> |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
</MudSelect> |
|
|
|
|
|
|
|
</MudStack> |
|
|
|
|
|
|
|
@if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
@if (_model.HardwareAcceleration is HardwareAccelerationKind.Vaapi) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
|
|
|
|
<div class="d-flex"> |
|
|
|
|
|
|
|
<MudText>VAAPI Driver</MudText> |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
<MudSelect @bind-Value="_model.VaapiDriver" For="@(() => _model.VaapiDriver)"> |
|
|
|
|
|
|
|
@foreach (VaapiDriver driver in Enum.GetValues<VaapiDriver>()) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
<MudSelectItem Value="@driver">@driver</MudSelectItem> |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
</MudSelect> |
|
|
|
|
|
|
|
</MudStack> |
|
|
|
|
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
|
|
|
|
<div class="d-flex"> |
|
|
|
|
|
|
|
<MudText>VAAPI Display</MudText> |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
<MudSelect @bind-Value="_model.VaapiDisplay" For="@(() => _model.VaapiDisplay)"> |
|
|
|
|
|
|
|
@foreach (string display in _vaapiDisplays) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
<MudSelectItem Value="@display">@display</MudSelectItem> |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
</MudSelect> |
|
|
|
|
|
|
|
</MudStack> |
|
|
|
} |
|
|
|
} |
|
|
|
</MudSelect> |
|
|
|
|
|
|
|
</MudStack> |
|
|
|
@if (_model.HardwareAcceleration is HardwareAccelerationKind.Vaapi or HardwareAccelerationKind.Qsv) |
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
|
|
|
|
<div class="d-flex"> |
|
|
|
|
|
|
|
<MudText>Allow B-Frames</MudText> |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
<MudCheckBox @bind-Value="@_model.AllowBFrames" For="@(() => _model.AllowBFrames)" Dense="true"/> |
|
|
|
|
|
|
|
</MudStack> |
|
|
|
|
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
|
|
|
|
<div class="d-flex"> |
|
|
|
|
|
|
|
<MudText>Bit Depth</MudText> |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
<MudSelect @bind-Value="_model.BitDepth" For="@(() => _model.BitDepth)"> |
|
|
|
|
|
|
|
<MudSelectItem Value="@FFmpegProfileBitDepth.EightBit">8-bit</MudSelectItem> |
|
|
|
|
|
|
|
<MudSelectItem Value="@FFmpegProfileBitDepth.TenBit">10-bit</MudSelectItem> |
|
|
|
|
|
|
|
</MudSelect> |
|
|
|
|
|
|
|
</MudStack> |
|
|
|
|
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
|
|
|
|
<div class="d-flex"> |
|
|
|
|
|
|
|
<MudText>Bitrate</MudText> |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
<MudTextField @bind-Value="_model.VideoBitrate" For="@(() => _model.VideoBitrate)" Adornment="Adornment.End" AdornmentText="kBit/s"/> |
|
|
|
|
|
|
|
</MudStack> |
|
|
|
|
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
|
|
|
|
<div class="d-flex"> |
|
|
|
|
|
|
|
<MudText>Buffer Size</MudText> |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
<MudTextField @bind-Value="_model.VideoBufferSize" For="@(() => _model.VideoBufferSize)" Adornment="Adornment.End" AdornmentText="kBit"/> |
|
|
|
|
|
|
|
</MudStack> |
|
|
|
|
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
|
|
|
|
<div class="d-flex"> |
|
|
|
|
|
|
|
<MudText>Hardware Acceleration</MudText> |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
<MudSelect @bind-Value="_model.HardwareAcceleration" For="@(() => _model.HardwareAcceleration)"> |
|
|
|
|
|
|
|
@foreach (HardwareAccelerationKind hwAccel in _hardwareAccelerationKinds) |
|
|
|
|
|
|
|
{ |
|
|
|
{ |
|
|
|
<MudSelectItem Value="@hwAccel">@hwAccel</MudSelectItem> |
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
|
|
|
|
<div class="d-flex"> |
|
|
|
|
|
|
|
<MudText>@(_model.HardwareAcceleration == HardwareAccelerationKind.Vaapi ? "VAAPI Device" : "QSV Device")</MudText> |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
<MudSelect @bind-Value="_model.VaapiDevice" For="@(() => _model.VaapiDevice)"> |
|
|
|
|
|
|
|
@foreach (string device in _vaapiDevices) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
<MudSelectItem Value="@device">@device</MudSelectItem> |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
</MudSelect> |
|
|
|
|
|
|
|
</MudStack> |
|
|
|
} |
|
|
|
} |
|
|
|
</MudSelect> |
|
|
|
} |
|
|
|
</MudStack> |
|
|
|
|
|
|
|
@if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) |
|
|
|
@if (_model.HardwareAcceleration == HardwareAccelerationKind.Qsv) |
|
|
|
{ |
|
|
|
|
|
|
|
@if (_model.HardwareAcceleration is HardwareAccelerationKind.Vaapi) |
|
|
|
|
|
|
|
{ |
|
|
|
{ |
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
<div class="d-flex"> |
|
|
|
<div class="d-flex"> |
|
|
|
<MudText>VAAPI Driver</MudText> |
|
|
|
<MudText>QSV Extra Hardware Frames</MudText> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<MudSelect @bind-Value="_model.VaapiDriver" For="@(() => _model.VaapiDriver)"> |
|
|
|
<MudTextField @bind-Value="_model.QsvExtraHardwareFrames" For="@(() => _model.QsvExtraHardwareFrames)"/> |
|
|
|
@foreach (VaapiDriver driver in Enum.GetValues<VaapiDriver>()) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
<MudSelectItem Value="@driver">@driver</MudSelectItem> |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
</MudSelect> |
|
|
|
|
|
|
|
</MudStack> |
|
|
|
|
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
|
|
|
|
<div class="d-flex"> |
|
|
|
|
|
|
|
<MudText>VAAPI Display</MudText> |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
<MudSelect @bind-Value="_model.VaapiDisplay" For="@(() => _model.VaapiDisplay)"> |
|
|
|
|
|
|
|
@foreach (string display in _vaapiDisplays) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
<MudSelectItem Value="@display">@display</MudSelectItem> |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
</MudSelect> |
|
|
|
|
|
|
|
</MudStack> |
|
|
|
</MudStack> |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
@if (_model.HardwareAcceleration is HardwareAccelerationKind.Vaapi or HardwareAccelerationKind.Qsv) |
|
|
|
|
|
|
|
{ |
|
|
|
{ |
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
<div class="d-flex"> |
|
|
|
<div class="d-flex"> |
|
|
|
<MudText>@(_model.HardwareAcceleration == HardwareAccelerationKind.Vaapi ? "VAAPI Device" : "QSV Device")</MudText> |
|
|
|
<MudText>Tonemap Algorithm</MudText> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<MudSelect @bind-Value="_model.VaapiDevice" For="@(() => _model.VaapiDevice)"> |
|
|
|
<MudSelect @bind-Value="_model.TonemapAlgorithm" For="@(() => _model.TonemapAlgorithm)"> |
|
|
|
@foreach (string device in _vaapiDevices) |
|
|
|
@foreach (FFmpegProfileTonemapAlgorithm algorithm in Enum.GetValues<FFmpegProfileTonemapAlgorithm>()) |
|
|
|
{ |
|
|
|
{ |
|
|
|
<MudSelectItem Value="@device">@device</MudSelectItem> |
|
|
|
<MudSelectItem Value="@algorithm">@algorithm</MudSelectItem> |
|
|
|
} |
|
|
|
} |
|
|
|
</MudSelect> |
|
|
|
</MudSelect> |
|
|
|
</MudStack> |
|
|
|
</MudStack> |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@if (_model.HardwareAcceleration == HardwareAccelerationKind.Qsv) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
<div class="d-flex"> |
|
|
|
<div class="d-flex"> |
|
|
|
<MudText>QSV Extra Hardware Frames</MudText> |
|
|
|
<MudText>Normalize Frame Rate</MudText> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<MudTextField @bind-Value="_model.QsvExtraHardwareFrames" For="@(() => _model.QsvExtraHardwareFrames)"/> |
|
|
|
<MudCheckBox @bind-Value="@_model.NormalizeFramerate" For="@(() => _model.NormalizeFramerate)" Dense="true"/> |
|
|
|
</MudStack> |
|
|
|
</MudStack> |
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
<div class="d-flex"> |
|
|
|
<div class="d-flex"> |
|
|
|
<MudText>Tonemap Algorithm</MudText> |
|
|
|
<MudText>Normalize Colors</MudText> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<MudSelect @bind-Value="_model.TonemapAlgorithm" For="@(() => _model.TonemapAlgorithm)"> |
|
|
|
<MudCheckBox @bind-Value="@_model.NormalizeColors" For="@(() => _model.NormalizeColors)" Dense="true"/> |
|
|
|
@foreach (FFmpegProfileTonemapAlgorithm algorithm in Enum.GetValues<FFmpegProfileTonemapAlgorithm>()) |
|
|
|
</MudStack> |
|
|
|
{ |
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
<MudSelectItem Value="@algorithm">@algorithm</MudSelectItem> |
|
|
|
<div class="d-flex"> |
|
|
|
} |
|
|
|
<MudText>Auto Deinterlace Video</MudText> |
|
|
|
</MudSelect> |
|
|
|
</div> |
|
|
|
|
|
|
|
<MudCheckBox @bind-Value="@_model.DeinterlaceVideo" For="@(() => _model.DeinterlaceVideo)" Dense="true"/> |
|
|
|
</MudStack> |
|
|
|
</MudStack> |
|
|
|
} |
|
|
|
} |
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
else |
|
|
|
<div class="d-flex"> |
|
|
|
{ |
|
|
|
<MudText>Normalize Frame Rate</MudText> |
|
|
|
<MudText>Video will be copied as-is, including timestamps, which *will* cause issues with most clients</MudText> |
|
|
|
</div> |
|
|
|
} |
|
|
|
<MudCheckBox @bind-Value="@_model.NormalizeFramerate" For="@(() => _model.NormalizeFramerate)" Dense="true"/> |
|
|
|
|
|
|
|
</MudStack> |
|
|
|
|
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
|
|
|
|
<div class="d-flex"> |
|
|
|
|
|
|
|
<MudText>Auto Deinterlace Video</MudText> |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
<MudCheckBox @bind-Value="@_model.DeinterlaceVideo" For="@(() => _model.DeinterlaceVideo)" Dense="true"/> |
|
|
|
|
|
|
|
</MudStack> |
|
|
|
|
|
|
|
<MudText Typo="Typo.h5" Class="mt-10 mb-2">Audio</MudText> |
|
|
|
<MudText Typo="Typo.h5" Class="mt-10 mb-2">Audio</MudText> |
|
|
|
<MudDivider Class="mb-6"/> |
|
|
|
<MudDivider Class="mb-6"/> |
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
@if (_model.NormalizeAudio) |
|
|
|
<div class="d-flex"> |
|
|
|
|
|
|
|
<MudText>Format</MudText> |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
<MudSelect @bind-Value="_model.AudioFormat" For="@(() => _model.AudioFormat)"> |
|
|
|
|
|
|
|
<MudSelectItem Value="@FFmpegProfileAudioFormat.Aac">aac</MudSelectItem> |
|
|
|
|
|
|
|
<MudSelectItem Value="@FFmpegProfileAudioFormat.Ac3">ac3</MudSelectItem> |
|
|
|
|
|
|
|
<MudSelectItem Value="@FFmpegProfileAudioFormat.AacLatm">aac (latm)</MudSelectItem> |
|
|
|
|
|
|
|
</MudSelect> |
|
|
|
|
|
|
|
</MudStack> |
|
|
|
|
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
|
|
|
|
<div class="d-flex"> |
|
|
|
|
|
|
|
<MudText>Bitrate</MudText> |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
<MudTextField @bind-Value="_model.AudioBitrate" For="@(() => _model.AudioBitrate)" Adornment="Adornment.End" AdornmentText="kBit/s"/> |
|
|
|
|
|
|
|
</MudStack> |
|
|
|
|
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
|
|
|
|
<div class="d-flex"> |
|
|
|
|
|
|
|
<MudText>Buffer Size</MudText> |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
<MudTextField @bind-Value="_model.AudioBufferSize" For="@(() => _model.AudioBufferSize)" Adornment="Adornment.End" AdornmentText="kBit"/> |
|
|
|
|
|
|
|
</MudStack> |
|
|
|
|
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
|
|
|
|
<div class="d-flex"> |
|
|
|
|
|
|
|
<MudText>Channels</MudText> |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
<MudTextField @bind-Value="_model.AudioChannels" For="@(() => _model.AudioChannels)"/> |
|
|
|
|
|
|
|
</MudStack> |
|
|
|
|
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
|
|
|
|
<div class="d-flex"> |
|
|
|
|
|
|
|
<MudText>Sample Rate</MudText> |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
<MudTextField @bind-Value="_model.AudioSampleRate" For="@(() => _model.AudioSampleRate)" Adornment="Adornment.End" AdornmentText="kHz"/> |
|
|
|
|
|
|
|
</MudStack> |
|
|
|
|
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
|
|
|
|
<div class="d-flex"> |
|
|
|
|
|
|
|
<MudText>Normalize Loudness</MudText> |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
<MudSelect @bind-Value="_model.NormalizeLoudnessMode" For="@(() => _model.NormalizeLoudnessMode)"> |
|
|
|
|
|
|
|
<MudSelectItem Value="@NormalizeLoudnessMode.Off">Off</MudSelectItem> |
|
|
|
|
|
|
|
<MudSelectItem Value="@NormalizeLoudnessMode.LoudNorm">loudnorm</MudSelectItem> |
|
|
|
|
|
|
|
</MudSelect> |
|
|
|
|
|
|
|
</MudStack> |
|
|
|
|
|
|
|
@if (_model.NormalizeLoudnessMode is NormalizeLoudnessMode.LoudNorm) |
|
|
|
|
|
|
|
{ |
|
|
|
{ |
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
<div class="d-flex"> |
|
|
|
<div class="d-flex"> |
|
|
|
<MudText>Target Loudness</MudText> |
|
|
|
<MudText>Format</MudText> |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
<MudSelect @bind-Value="_model.AudioFormat" For="@(() => _model.AudioFormat)"> |
|
|
|
|
|
|
|
<MudSelectItem Value="@FFmpegProfileAudioFormat.Aac">aac</MudSelectItem> |
|
|
|
|
|
|
|
<MudSelectItem Value="@FFmpegProfileAudioFormat.Ac3">ac3</MudSelectItem> |
|
|
|
|
|
|
|
<MudSelectItem Value="@FFmpegProfileAudioFormat.AacLatm">aac (latm)</MudSelectItem> |
|
|
|
|
|
|
|
</MudSelect> |
|
|
|
|
|
|
|
</MudStack> |
|
|
|
|
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
|
|
|
|
<div class="d-flex"> |
|
|
|
|
|
|
|
<MudText>Bitrate</MudText> |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
<MudTextField @bind-Value="_model.AudioBitrate" For="@(() => _model.AudioBitrate)" Adornment="Adornment.End" AdornmentText="kBit/s"/> |
|
|
|
|
|
|
|
</MudStack> |
|
|
|
|
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
|
|
|
|
<div class="d-flex"> |
|
|
|
|
|
|
|
<MudText>Buffer Size</MudText> |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
<MudTextField @bind-Value="_model.AudioBufferSize" For="@(() => _model.AudioBufferSize)" Adornment="Adornment.End" AdornmentText="kBit"/> |
|
|
|
|
|
|
|
</MudStack> |
|
|
|
|
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
|
|
|
|
<div class="d-flex"> |
|
|
|
|
|
|
|
<MudText>Channels</MudText> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<MudTextField @bind-Value="_model.TargetLoudness" For="@(() => _model.TargetLoudness)" Adornment="Adornment.End" AdornmentText="LUFS"/> |
|
|
|
<MudTextField @bind-Value="_model.AudioChannels" For="@(() => _model.AudioChannels)"/> |
|
|
|
</MudStack> |
|
|
|
</MudStack> |
|
|
|
|
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
|
|
|
|
<div class="d-flex"> |
|
|
|
|
|
|
|
<MudText>Sample Rate</MudText> |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
<MudTextField @bind-Value="_model.AudioSampleRate" For="@(() => _model.AudioSampleRate)" Adornment="Adornment.End" AdornmentText="kHz"/> |
|
|
|
|
|
|
|
</MudStack> |
|
|
|
|
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
|
|
|
|
<div class="d-flex"> |
|
|
|
|
|
|
|
<MudText>Normalize Loudness</MudText> |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
<MudSelect @bind-Value="_model.NormalizeLoudnessMode" For="@(() => _model.NormalizeLoudnessMode)"> |
|
|
|
|
|
|
|
<MudSelectItem Value="@NormalizeLoudnessMode.Off">Off</MudSelectItem> |
|
|
|
|
|
|
|
<MudSelectItem Value="@NormalizeLoudnessMode.LoudNorm">loudnorm</MudSelectItem> |
|
|
|
|
|
|
|
</MudSelect> |
|
|
|
|
|
|
|
</MudStack> |
|
|
|
|
|
|
|
@if (_model.NormalizeLoudnessMode is NormalizeLoudnessMode.LoudNorm) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5"> |
|
|
|
|
|
|
|
<div class="d-flex"> |
|
|
|
|
|
|
|
<MudText>Target Loudness</MudText> |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
<MudTextField @bind-Value="_model.TargetLoudness" For="@(() => _model.TargetLoudness)" Adornment="Adornment.End" AdornmentText="LUFS"/> |
|
|
|
|
|
|
|
</MudStack> |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
<MudText>Audio will be copied as-is, including timestamps, which *will* cause issues with most clients</MudText> |
|
|
|
} |
|
|
|
} |
|
|
|
</MudContainer> |
|
|
|
</MudContainer> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|