Skip to content

Commit

Permalink
(Add) NVENC AV1 Hardware Encoder #126 (untested)
Browse files Browse the repository at this point in the history
  • Loading branch information
Alkl58 committed Nov 26, 2022
1 parent 1458a2a commit fb0581c
Show file tree
Hide file tree
Showing 6 changed files with 118 additions and 6 deletions.
27 changes: 26 additions & 1 deletion NotEnoughAV1Encodes/MainWindow.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -291,7 +291,8 @@
<ComboBoxItem Content="x265 (HEVC FFmpeg)" />
<ComboBoxItem Content="x264 (AVC FFmpeg)" />
<Separator />
<ComboBoxItem Content="Quick Sync (AV1 Intel HW)" />
<ComboBoxItem Content="QuickSync (AV1 Intel HW)" />
<ComboBoxItem Content="NVENC (AV1 NVIDIA HW)" />
</ComboBox>
<Label Content="{lex:Loc LabelBitDepth}" HorizontalAlignment="Left" Margin="19,54,0,0" VerticalAlignment="Top" Width="111" />
<ComboBox x:Name="ComboBoxVideoBitDepth" SelectedIndex="{Binding BitDepth}" HorizontalAlignment="Left" Margin="135,52,0,0" VerticalAlignment="Top" Width="70" Height="30" VerticalContentAlignment="Center">
Expand Down Expand Up @@ -578,6 +579,30 @@
<Label Content="{lex:Loc LabelBitrateAvg}" IsEnabled="{Binding ElementName=TextBoxBitrateQSVAV1, Path=IsEnabled, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" VerticalAlignment="Top" Width="105" Height="30" Canvas.Left="21" Canvas.Top="125"/>
<TextBox x:Name="TextBoxBitrateQSVAV1" Text="{Binding QSVAV1Bitrate}" PreviewTextInput="NumberValidationTextBox" TextWrapping="Wrap" VerticalAlignment="Top" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsEnabled="False" HorizontalAlignment="Left" Width="120" Canvas.Left="131" Canvas.Top="127"/>
</Canvas>
<!-- NVENC AV1 -->
<Canvas HorizontalAlignment="Left" Width="1055">
<Canvas.Style>
<Style>
<Setter Property="UIElement.Visibility" Value="Collapsed" />
<Style.Triggers>
<DataTrigger Binding="{Binding SelectedIndex, ElementName=ComboBoxVideoEncoder}" Value="13">
<Setter Property="UIElement.Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</Canvas.Style>
<Slider x:Name="SliderQualityNVENCAV1" Value="{Binding NVENCAV1Quantizer}" VerticalAlignment="Top" SmallChange="1" Maximum="63" TickPlacement="BottomRight" Height="34" IsSnapToTickEnabled="True" Canvas.Left="131" Canvas.Top="69" Width="520"/>
<Label Content="{Binding ElementName=SliderQualityNVENCAV1, Path=Value, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" HorizontalAlignment="Right" Width="78" Canvas.Left="664" Canvas.Top="75"/>
<Label Content="{lex:Loc LabelQualityMode}" HorizontalAlignment="Left" VerticalAlignment="Top" Width="108" Height="28" Canvas.Left="18" Canvas.Top="12"/>
<ComboBox x:Name="ComboBoxQualityModeNVENCAV1" SelectedIndex="{Binding QSVAV1QualityMode}" HorizontalAlignment="Left" Margin="131,10,0,0" VerticalAlignment="Top" Width="140" Height="30" SelectionChanged="ComboBoxQualityModeNVENCAV1_SelectionChanged">
<ComboBoxItem Content="CQP - Constant QP"/>
<ComboBoxItem Content="VBR - Variable Bitrate"/>
<ComboBoxItem Content="CBR - Constant Bitrate"/>
</ComboBox>
<Label Content="{lex:Loc LabelQuantizer}" IsEnabled="{Binding ElementName=SliderQualityNVENCAV1, Path=IsEnabled, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Margin="20,73,0,0" VerticalAlignment="Top" Width="106" Height="30"/>
<Label Content="{lex:Loc LabelBitrateAvg}" IsEnabled="{Binding ElementName=TextBoxBitrateNVENCAV1, Path=IsEnabled, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" VerticalAlignment="Top" Width="105" Height="30" Canvas.Left="21" Canvas.Top="125"/>
<TextBox x:Name="TextBoxBitrateNVENCAV1" Text="{Binding NVENCAV1Bitrate}" PreviewTextInput="NumberValidationTextBox" TextWrapping="Wrap" VerticalAlignment="Top" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsEnabled="False" HorizontalAlignment="Left" Width="120" Canvas.Left="131" Canvas.Top="127"/>
</Canvas>
</Grid>
</GroupBox>
</Grid>
Expand Down
83 changes: 82 additions & 1 deletion NotEnoughAV1Encodes/MainWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -836,6 +836,18 @@ private void ComboBoxVideoEncoder_SelectionChanged(object sender, System.Windows
ComboBoxVideoBitDepth.Visibility = Visibility.Collapsed;
ComboBoxVideoBitDepthLimited.Visibility = Visibility.Visible;
}
else if (ComboBoxVideoEncoder.SelectedIndex is (int) Video.Encoder.NVENCAV1)
{
// av1 hardware (nvenc rtx 4000)
SliderEncoderPreset.Maximum = 2;
SliderEncoderPreset.Value = 1;
CheckBoxTwoPassEncoding.IsEnabled = false;
CheckBoxTwoPassEncoding.IsOn = false;
CheckBoxRealTimeMode.IsOn = false;
CheckBoxRealTimeMode.Visibility = Visibility.Collapsed;
ComboBoxVideoBitDepth.Visibility = Visibility.Collapsed;
ComboBoxVideoBitDepthLimited.Visibility = Visibility.Visible;
}
if (ComboBoxVideoEncoder.SelectedIndex is (int) Video.Encoder.X264)
{
if (ComboBoxQualityMode.SelectedIndex == 2)
Expand Down Expand Up @@ -1038,6 +1050,25 @@ private void ComboBoxQualityModeQSVAV1_SelectionChanged(object sender, System.Wi
}
}

private void ComboBoxQualityModeNVENCAV1_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
if (ComboBoxQualityModeNVENCAV1.SelectedIndex == 0)
{
SliderQualityNVENCAV1.IsEnabled = true;
TextBoxBitrateNVENCAV1.IsEnabled = false;
}
else if (ComboBoxQualityModeNVENCAV1.SelectedIndex == 1)
{
SliderQualityNVENCAV1.IsEnabled = false;
TextBoxBitrateNVENCAV1.IsEnabled = true;
}
else if (ComboBoxQualityModeNVENCAV1.SelectedIndex == 2)
{
SliderQualityNVENCAV1.IsEnabled = false;
TextBoxBitrateNVENCAV1.IsEnabled = true;
}
}

private void CheckBoxTwoPassEncoding_Checked(object sender, RoutedEventArgs e)
{
if (ComboBoxVideoEncoder.SelectedIndex == (int) Video.Encoder.SVTAV1 && ComboBoxQualityModeSVTAV1.SelectedIndex == 0 && CheckBoxTwoPassEncoding.IsOn)
Expand Down Expand Up @@ -1099,6 +1130,12 @@ private void SliderEncoderPreset_ValueChanged(object sender, RoutedPropertyChang
{
LabelSpeedValue.Content = GenerateQuickSyncEncoderSpeed();
}

// av1 hardware (nvenc rtx 4000)
if (ComboBoxVideoEncoder.SelectedIndex is (int)Video.Encoder.NVENCAV1)
{
LabelSpeedValue.Content = GenerateNVENCEncoderSpeed();
}
}

private void CheckBoxCustomVideoSettings_Toggled(object sender, RoutedEventArgs e)
Expand Down Expand Up @@ -1575,6 +1612,7 @@ private string GenerateEncoderCommand()
9 => GenerateHEVCFFmpegCommand(),
10 => GenerateAVCFFmpegCommand(),
12 => GenerateQuickSyncCommand(),
13 => GenerateNVENCCommand(),
_ => ""
};

Expand Down Expand Up @@ -1947,7 +1985,7 @@ private string GenerateAVCFFmpegCommand()
private string GenerateQuickSyncCommand()
{
string settings = "-f yuv4mpegpipe - | " +
"\"" + Path.Combine(Directory.GetCurrentDirectory(), "Apps", "qsvenc", "QSVEncC64.exe") + "\" --y4m -i -";
"\"" + Path.Combine(Directory.GetCurrentDirectory(), "Apps", "qsvenc", "QSVEncC64.exe") + "\" --y4m -i -";

// Codec
settings += " --codec av1";
Expand Down Expand Up @@ -1988,6 +2026,38 @@ private string GenerateQuickSyncCommand()
return settings;
}

private string GenerateNVENCCommand()
{
string settings = "-f yuv4mpegpipe - | " +
"\"" + Path.Combine(Directory.GetCurrentDirectory(), "Apps", "nvenc", "NVEncC64.exe") + "\" --y4m -i -";

// Codec
settings += " --codec av1";

// Quality / Bitrate Selection
string quality = ComboBoxQualityModeQSVAV1.SelectedIndex switch
{
0 => " --cqp " + SliderQualityQSVAV1.Value,
1 => " --vbr " + TextBoxBitrateQSVAV1.Text,
2 => " --cbr " + TextBoxBitrateQSVAV1.Text,
_ => ""
};

// Preset
settings += quality + " --quality " + GenerateNVENCEncoderSpeed();

// Bit-Depth
settings += " --output-depth ";
settings += ComboBoxVideoBitDepthLimited.SelectedIndex switch
{
0 => "8",
1 => "10",
_ => "8"
};

return settings;
}

private string GenerateMPEGEncoderSpeed()
{
return SliderEncoderPreset.Value switch
Expand Down Expand Up @@ -2021,6 +2091,17 @@ private string GenerateQuickSyncEncoderSpeed()
};
}

private string GenerateNVENCEncoderSpeed()
{
return SliderEncoderPreset.Value switch
{
0 => "quality",
1 => "default",
2 => "performance",
_ => "default"
};
}

private string GenerateKeyFrameInerval()
{
int seconds = 10;
Expand Down
3 changes: 2 additions & 1 deletion NotEnoughAV1Encodes/Video/Encoder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ public enum Encoder
SVTAV1 = 7,
X265 = 9,
X264 = 10,
QSVAV1 = 12
QSVAV1 = 12,
NVENCAV1 = 13
}
}
2 changes: 1 addition & 1 deletion NotEnoughAV1Encodes/Video/VideoEncode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ public void Encode(int _workerCount, List<string> VideoChunks, Queue.QueueElemen
ChunkOutput = "\"" + Path.Combine(Global.Temp, "NEAV1E", queueElement.UniqueIdentifier, "Video", index.ToString("D6") + ".mp4") + "\"";
}
if (queueElement.EncodingMethod == (int) Encoder.QSVAV1)
if (queueElement.EncodingMethod is (int) Encoder.QSVAV1 or (int) Encoder.NVENCAV1)
{
ChunkOutput = " -o \"" + Path.Combine(Global.Temp, "NEAV1E", queueElement.UniqueIdentifier, "Video", index.ToString("D6") + ".webm") + "\"";
}
Expand Down
4 changes: 2 additions & 2 deletions NotEnoughAV1Encodes/Video/VideoMuxer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ private static void MuxFFmpegChunks(Queue.QueueElement queueElement)

string DAR = "";
// Set Display Aspect Ratio for external encoders
if (queueElement.EncodingMethod is (int) Encoder.AOMENC or (int) Encoder.RAV1E or (int) Encoder.SVTAV1 && !string.IsNullOrEmpty(queueElement.VideoDB.MIDisplayAspectRatio))
if (queueElement.EncodingMethod is (int) Encoder.AOMENC or (int) Encoder.RAV1E or (int) Encoder.SVTAV1 or (int) Encoder.QSVAV1 or (int) Encoder.NVENCAV1 && !string.IsNullOrEmpty(queueElement.VideoDB.MIDisplayAspectRatio))
{
if (queueElement.VideoDB.MIPixelAspectRatio != "1.000")
{
Expand Down Expand Up @@ -235,7 +235,7 @@ private static IOrderedEnumerable<string> GetSortedVideoChunks(Queue.QueueElemen
IOrderedEnumerable<string> sortedChunks = null;

// FFmpeg AOM, Rav1e, SVT-AV1, VPX-VP9
if (queueElement.EncodingMethod is (int) Encoder.AOMFFMPEG or (int) Encoder.RAV1EFFMPEG or (int) Encoder.SVTAV1FFMPEG or (int) Encoder.VPXVP9FFMPEG or (int) Encoder.QSVAV1)
if (queueElement.EncodingMethod is (int) Encoder.AOMFFMPEG or (int) Encoder.RAV1EFFMPEG or (int) Encoder.SVTAV1FFMPEG or (int) Encoder.VPXVP9FFMPEG or (int) Encoder.QSVAV1 or (int) Encoder.NVENCAV1)
{
Global.Logger("DEBUG - VideoMuxer.Concat() => Reading Chunk Directory by *.webm files", queueElement.Output + ".log");
sortedChunks = Directory.GetFiles(Path.Combine(Global.Temp, "NEAV1E", queueElement.UniqueIdentifier, "Video"), "*.webm").OrderBy(f => f);
Expand Down
5 changes: 5 additions & 0 deletions NotEnoughAV1Encodes/Video/VideoSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,11 @@ public class VideoSettings
public int QSVAV1Quantizer { get; set; } = 24;
public string QSVAV1Bitrate { get; set; } = "2000";

// Video Quality Settings NVENC AV1
public int NVENCAV1QualityMode { get; set; }
public int NVENCAV1Quantizer { get; set; } = 24;
public string NVENCAV1Bitrate { get; set; } = "2000";

// Audio
public int AudioCodecMono { get; set; } = 0;
public int AudioBitrateMono { get; set; } = 64;
Expand Down

0 comments on commit fb0581c

Please sign in to comment.