libobs_wrapper\encoders/
enums.rs

1use std::{convert::Infallible, str::FromStr};
2
3use crate::utils::ObsString;
4
5macro_rules! encoder_enum {
6    ($name:ident, { $($plugin:literal: [ $($(#[$attr:meta])* $variant:ident,)* ],)* }) => { paste::paste! {
7        #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
8        #[allow(non_camel_case_types)]
9        pub enum $name {
10            $(
11                $(
12                    #[doc = "From plugin: `" $plugin "`"]
13                    $(#[$attr])*
14                    [<$variant:upper>],
15                )*
16            )*
17            Other(String),
18        }
19
20        impl FromStr for $name {
21            type Err = Infallible;
22            fn from_str(s: &str) -> Result<Self, Self::Err> {
23                #[allow(deprecated)]
24                return Ok(match s {
25                    $( $( stringify!($variant) => Self::[<$variant:upper>], )* )*
26                    e => Self::Other(e.to_string()),
27                });
28            }
29        }
30        impl From<$name> for ObsString {
31            fn from(v: $name) -> ObsString {
32                #[allow(deprecated)]
33                return match v {
34                    $( $( $name::[<$variant:upper>] => ObsString::new(stringify!($variant)), )* )*
35                    $name::Other(e) => ObsString::new(&e),
36                };
37            }
38        }
39    } };
40}
41
42// These lists were produced using
43//   rg "struct obs_encoder_info [^\*].*=" -A 4
44// on the OBS codebase, which lists all of the encoders and their types, as well as their
45// capabilities (including whether they're deprecated or not).
46
47encoder_enum!(
48    ObsVideoEncoderType,
49    {
50        "obs-ffmpeg": [
51            h264_texture_amf,
52            h265_texture_amf,
53            av1_texture_amf,
54            ffmpeg_vaapi,
55            ffmpeg_vaapi_tex,
56            av1_ffmpeg_vaapi,
57            av1_ffmpeg_vaapi_tex,
58            hevc_ffmpeg_vaapi,
59            hevc_ffmpeg_vaapi_tex,
60            ffmpeg_openh264,
61            #[deprecated]
62            ffmpeg_nvenc,
63            #[deprecated]
64            ffmpeg_hevc_nvenc,
65            ffmpeg_svt_av1,
66            ffmpeg_aom_av1,
67        ],
68        "obs-nvenc": [
69            #[deprecated]
70            obs_nvenc_h264_cuda,
71            #[deprecated]
72            obs_nvenc_hevc_cuda,
73            #[deprecated]
74            obs_nvenc_av1_cuda,
75            obs_nvenc_h264_tex,
76            obs_nvenc_hevc_tex,
77            obs_nvenc_av1_tex,
78            #[deprecated]
79            jim_nvenc,
80            #[deprecated]
81            jim_hevc_nvenc,
82            #[deprecated]
83            jim_av1_nvenc,
84            obs_nvenc_h264_soft,
85            obs_nvenc_hevc_soft,
86            obs_nvenc_av1_soft,
87        ],
88        "obs-qsv11": [
89            obs_qsv11,
90            obs_qsv11_soft,
91            obs_qsv11_v2,
92            obs_qsv11_soft_v2,
93            obs_qsv11_av1,
94            obs_qsv11_av1_soft,
95            obs_qsv11_hevc,
96            obs_qsv11_hevc_soft,
97        ],
98        "obs-x264": [
99            obs_x264,
100        ],
101    }
102);
103
104encoder_enum!(
105    ObsAudioEncoderType,
106    {
107        "obs-ffmpeg": [
108            ffmpeg_aac,
109            ffmpeg_opus,
110            ffmpeg_pcm_s16le,
111            ffmpeg_pcm_s24le,
112            ffmpeg_pcm_f32le,
113            ffmpeg_alac,
114            ffmpeg_flac,
115        ],
116        "obs-libfdk": [
117            libfdk_aac,
118        ],
119    }
120);