diff --git a/docs/sphinx/reference-services.rst b/docs/sphinx/reference-services.rst index 203e80d8d..6a3cf9619 100644 --- a/docs/sphinx/reference-services.rst +++ b/docs/sphinx/reference-services.rst @@ -139,6 +139,15 @@ Service Definition Structure :return: The output type that should be used with this service +.. member:: const char **(*get_supported_video_codecs)(void *data) + + (Optional) + + :return: A string pointer array of the supported video codecs, should + be stored by the plugin so the caller does not need to free + the data manually (typically best to use strlist_split to + generate this) + General Service Functions ------------------------- @@ -286,6 +295,14 @@ General Service Functions :param video_encoder_settings: Video encoder settings. Can be *NULL* :param audio_encoder_settings: Audio encoder settings. Can be *NULL* +--------------------- + +.. function:: const char **obs_service_get_supported_video_codecs(const obs_service_t *service) + + :return: An array of string pointers containing the supported codecs + for the service, terminated with a *NULL* pointer. Does not + need to be freed + .. --------------------------------------------------------------------------- .. _libobs/obs-service.h: https://github.com/obsproject/obs-studio/blob/master/libobs/obs-service.h diff --git a/libobs/obs-service.c b/libobs/obs-service.c index ba5d9e9f1..53269c6ca 100644 --- a/libobs/obs-service.c +++ b/libobs/obs-service.c @@ -467,3 +467,12 @@ void obs_service_get_max_bitrate(const obs_service_t *service, service->info.get_max_bitrate(service->context.data, video_bitrate, audio_bitrate); } + +const char ** +obs_service_get_supported_video_codecs(const obs_service_t *service) +{ + if (service->info.get_supported_video_codecs) + return service->info.get_supported_video_codecs( + service->context.data); + return NULL; +} diff --git a/libobs/obs-service.h b/libobs/obs-service.h index 697ccb39e..f025260ff 100644 --- a/libobs/obs-service.h +++ b/libobs/obs-service.h @@ -86,6 +86,8 @@ struct obs_service_info { void (*get_max_bitrate)(void *data, int *video_bitrate, int *audio_bitrate); + + const char **(*get_supported_video_codecs)(void *data); }; EXPORT void obs_register_service_s(const struct obs_service_info *info, diff --git a/libobs/obs.h b/libobs/obs.h index bcb6e6ebe..9df703527 100644 --- a/libobs/obs.h +++ b/libobs/obs.h @@ -2474,6 +2474,9 @@ EXPORT void obs_service_get_max_fps(const obs_service_t *service, int *fps); EXPORT void obs_service_get_max_bitrate(const obs_service_t *service, int *video_bitrate, int *audio_bitrate); +EXPORT const char ** +obs_service_get_supported_video_codecs(const obs_service_t *service); + /* NOTE: This function is temporary and should be removed/replaced at a later * date. */ EXPORT const char *obs_service_get_output_type(const obs_service_t *service); diff --git a/plugins/rtmp-services/data/package.json b/plugins/rtmp-services/data/package.json index 220072ac3..de2daafe9 100644 --- a/plugins/rtmp-services/data/package.json +++ b/plugins/rtmp-services/data/package.json @@ -1,11 +1,11 @@ { "$schema": "schema/package-schema.json", "url": "https://obsproject.com/obs2_update/rtmp-services", - "version": 201, + "version": 202, "files": [ { "name": "services.json", - "version": 201 + "version": 202 } ] } diff --git a/plugins/rtmp-services/data/schema/service-schema-v3.json b/plugins/rtmp-services/data/schema/service-schema-v3.json index 840588c68..cdedf1c68 100644 --- a/plugins/rtmp-services/data/schema/service-schema-v3.json +++ b/plugins/rtmp-services/data/schema/service-schema-v3.json @@ -25,6 +25,32 @@ "$ref": "#/definitions/saneUrl", "description": "Link where a logged-in user can find the 'stream key', presented as a button alongside the stream key field." }, + "supported video codecs": { + "type": "array", + "description": "Video codecs that are supported by the service.", + "items": { + "type": "string", + "description": "Short-form codec names.", + "minLength": 1, + "enum": [ + "h264", + "hevc" + ] + } + }, + "supported audio codecs": { + "type": "array", + "description": "Audio codecs that are supported by the service.", + "items": { + "type": "string", + "description": "Short-form codec names.", + "minLength": 1, + "enum": [ + "aac", + "opus" + ] + } + }, "servers": { "type": "array", "description": "List of servers.", @@ -209,4 +235,4 @@ ] } } -} \ No newline at end of file +} diff --git a/plugins/rtmp-services/data/services.json b/plugins/rtmp-services/data/services.json index 3ef5ea735..7a73bae3b 100644 --- a/plugins/rtmp-services/data/services.json +++ b/plugins/rtmp-services/data/services.json @@ -6,6 +6,12 @@ "name": "Twitch", "common": true, "stream_key_link": "https://dashboard.twitch.tv/settings/stream", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Asia: Hong Kong", @@ -204,6 +210,13 @@ "common": false, "more_info_link": "https://developers.google.com/youtube/v3/live/guides/ingestion-protocol-comparison", "stream_key_link": "https://www.youtube.com/live_dashboard", + "supported video codecs": [ + "h264", + "hevc" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Primary YouTube ingest server", @@ -230,6 +243,12 @@ "YouTube - RTMP", "YouTube - RTMPS (Beta)" ], + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Primary YouTube ingest server", @@ -257,6 +276,12 @@ { "name": "Loola.tv", "common": false, + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "US East: Virginia", @@ -290,6 +315,12 @@ }, { "name": "Lovecast", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Default", @@ -311,6 +342,12 @@ { "name": "Luzento.com - RTMP", "stream_key_link": "https://cms.luzento.com/dashboard/stream-key?from=OBS", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Primary", @@ -331,6 +368,12 @@ }, { "name": "VIMM", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Europe: Frankfurt", @@ -350,6 +393,12 @@ }, { "name": "Mobcrush", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Primary", @@ -365,6 +414,12 @@ }, { "name": "Web.TV", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Primary", @@ -380,6 +435,12 @@ }, { "name": "GoodGame.ru", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Моscow", @@ -390,6 +451,12 @@ { "name": "YouStreamer", "stream_key_link": "https://www.app.youstreamer.com/stream/", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Moscow", @@ -399,6 +466,12 @@ }, { "name": "Vaughn Live / iNSTAGIB", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "US: Chicago, IL", @@ -441,6 +514,12 @@ }, { "name": "Breakers.TV", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "US: Chicago, IL", @@ -485,6 +564,12 @@ "name": "Facebook Live", "common": true, "stream_key_link": "https://www.facebook.com/live/producer?ref=OBS", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Default", @@ -555,6 +640,12 @@ ], "common": true, "stream_key_link": "https://restream.io/settings/streaming-setup?from=OBS", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Autodetect", @@ -667,6 +758,12 @@ }, { "name": "Castr.io", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "US-East (Chicago, IL)", @@ -759,6 +856,12 @@ }, { "name": "Boomstream", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Default", @@ -768,6 +871,12 @@ }, { "name": "Meridix Live Sports Platform", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Primary", @@ -784,6 +893,12 @@ "아프리카TV", "Afreeca.TV" ], + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Asia : Korea", @@ -819,6 +934,12 @@ }, { "name": "CAM4", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "CAM4", @@ -834,6 +955,12 @@ }, { "name": "ePlay", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "ePlay Primary", @@ -849,6 +976,12 @@ }, { "name": "Picarto", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Autoselect closest server", @@ -883,6 +1016,12 @@ }, { "name": "Livestream", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Primary", @@ -892,6 +1031,12 @@ }, { "name": "Uscreen", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Default", @@ -906,6 +1051,12 @@ }, { "name": "Stripchat", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Auto", @@ -923,6 +1074,12 @@ }, { "name": "CamSoda", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "North America", @@ -960,6 +1117,12 @@ }, { "name": "Chaturbate", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Global Main Fastest - Recommended", @@ -1039,6 +1202,12 @@ "alt_names": [ "Twitter / Periscope" ], + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "US West: California", @@ -1101,6 +1270,12 @@ "alt_names": [ "Switchboard Live (Joicaster)" ], + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Global Zone (geo based)", @@ -1168,6 +1343,12 @@ { "name": "Looch", "common": false, + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Primary Looch ingest server", @@ -1183,6 +1364,12 @@ }, { "name": "Eventials", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Default", @@ -1198,6 +1385,12 @@ }, { "name": "EventLive.pro", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Default", @@ -1217,6 +1410,12 @@ }, { "name": "Lahzenegar - StreamG | لحظه‌نگار - استریمجی", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Primary", @@ -1236,6 +1435,12 @@ }, { "name": "MyLive", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Default", @@ -1255,6 +1460,12 @@ "Madcat" ], "stream_key_link": "https://studio.trovo.live/mychannel/stream", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Default", @@ -1270,6 +1481,12 @@ }, { "name": "Mixcloud", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Default", @@ -1294,6 +1511,12 @@ "alt_names": [ "SermonAudio.com" ], + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Primary", @@ -1307,6 +1530,12 @@ }, { "name": "Vimeo", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Default", @@ -1316,6 +1545,12 @@ }, { "name": "Aparat", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Default", @@ -1331,6 +1566,12 @@ }, { "name": "KakaoTV", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Default", @@ -1344,6 +1585,12 @@ }, { "name": "Piczel.tv", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Default", @@ -1359,6 +1606,12 @@ }, { "name": "STAGE TEN", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "STAGE TEN", @@ -1374,6 +1627,12 @@ }, { "name": "DLive", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Default", @@ -1388,6 +1647,12 @@ }, { "name": "Lightcast.com", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "North America / East", @@ -1426,6 +1691,12 @@ }, { "name": "Bongacams", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Automatic / Default", @@ -1454,6 +1725,12 @@ }, { "name": "Chathostess", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Chathostess - Backup", @@ -1468,6 +1745,12 @@ }, { "name": "OnlyFans.com", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "USA", @@ -1490,6 +1773,12 @@ { "name": "YouNow", "common": false, + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "opus" + ], "servers": [ { "name": "younow.com", @@ -1508,6 +1797,12 @@ { "name": "Steam", "common": false, + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Default", @@ -1523,6 +1818,12 @@ }, { "name": "Konduit.live", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Default", @@ -1536,6 +1837,12 @@ }, { "name": "LOCO", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Default", @@ -1548,6 +1855,12 @@ }, { "name": "niconico, premium member (ニコニコ生放送 プレミアム会員)", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Default", @@ -1564,6 +1877,12 @@ }, { "name": "niconico, free member (ニコニコ生放送 一般会員)", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Default", @@ -1580,6 +1899,12 @@ }, { "name": "WASD.TV", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Automatic", @@ -1606,6 +1931,12 @@ }, { "name": "Nimo TV", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Global:1", @@ -1628,6 +1959,12 @@ }, { "name": "XLoveCam.com", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Europe(main)", @@ -1668,6 +2005,12 @@ }, { "name": "AngelThump", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Auto", @@ -1715,6 +2058,12 @@ }, { "name": "api.video", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Default", @@ -1729,6 +2078,12 @@ }, { "name": "SHOWROOM", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Default", @@ -1745,6 +2100,12 @@ }, { "name": "Mux", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Global (RTMPS)", @@ -1763,6 +2124,12 @@ }, { "name": "Viloud", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Default", @@ -1777,6 +2144,12 @@ }, { "name": "MyFreeCams", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Automatic", @@ -1822,6 +2195,12 @@ }, { "name": "PolyStreamer.com", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Auto-select closest server", @@ -1863,6 +2242,12 @@ { "name": "Glimesh", "stream_key_link": "https://glimesh.tv/users/settings/stream", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "opus" + ], "servers": [ { "name": "North America - Chicago, United States", @@ -1913,6 +2298,12 @@ { "name": "OPENREC.tv - Premium member (プレミアム会員)", "stream_key_link": "https://www.openrec.tv/login?keep_login=true&url=https://www.openrec.tv/dashboard/live?from=obs", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Default", @@ -1929,6 +2320,12 @@ "name": "nanoStream Cloud / bintu", "more_info_link": "https://www.nanocosmos.de/obs", "stream_key_link": "https://bintu-cloud-frontend.nanocosmos.de/organisation", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "bintu-stream global ingest (rtmp)", @@ -1998,6 +2395,12 @@ }, { "name": "Dacast", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Default", @@ -2014,6 +2417,12 @@ { "name": "Brime Live", "stream_key_link": "https://brime.tv/studio", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "North America - Ashburn, VA", @@ -2041,6 +2450,12 @@ "alt_names": [ "Bilibili Live" ], + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Default | 默认", @@ -2051,6 +2466,12 @@ { "name": "Volume.com", "stream_key_link": "https://volume.com/b?show_key=1&webrtc=0", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Default - Recommended", @@ -2074,6 +2495,12 @@ { "name": "BoxCast", "stream_key_link": "https://dashboard.boxcast.com/#/sources", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "BoxCast", @@ -2083,6 +2510,12 @@ }, { "name": "Disciple Media", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Default", @@ -2092,6 +2525,12 @@ }, { "name": "Jio Games", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Primary", @@ -2111,6 +2550,12 @@ { "name": "Kuaishou Live", "stream_key_link": "https://studio.kuaishou.com/live/list", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Default", @@ -2124,6 +2569,12 @@ }, { "name": "Utreon", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Default", @@ -2138,6 +2589,12 @@ }, { "name": "Autistici.org Live", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Default", @@ -2153,6 +2610,12 @@ { "name": "PhoneLiveStreaming", "stream_key_link": "https://app.phonelivestreaming.com/media/rtmp", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "PhoneLiveStreaming", @@ -2167,6 +2630,12 @@ }, { "name": "ManyVids", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Default", @@ -2199,6 +2668,12 @@ "name": "Fantasy.Club", "stream_key_link": "https://fantasy.club/app/create-content/stream-now", "more_info_link": "https://help.fantasy.club/", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "US: East", @@ -2262,6 +2737,12 @@ { "name": "Shareplay", "more_info_link": "https://shareplay.tv", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Default", @@ -2326,6 +2807,12 @@ }, { "name": "Sympla", + "supported video codecs": [ + "h264" + ], + "supported audio codecs": [ + "aac" + ], "servers": [ { "name": "Sympla RTMP", diff --git a/plugins/rtmp-services/rtmp-common.c b/plugins/rtmp-services/rtmp-common.c index d89baa833..118d11c12 100644 --- a/plugins/rtmp-services/rtmp-common.c +++ b/plugins/rtmp-services/rtmp-common.c @@ -21,6 +21,8 @@ struct rtmp_common { size_t supported_resolutions_count; int max_fps; + char **video_codecs; + bool supports_additional_audio_track; }; @@ -113,17 +115,19 @@ static void rtmp_common_update(void *data, obs_data_t *settings) { struct rtmp_common *service = data; + bfree(service->supported_resolutions); + bfree(service->video_codecs); bfree(service->service); bfree(service->server); bfree(service->output); bfree(service->key); - bfree(service->supported_resolutions); service->service = bstrdup(obs_data_get_string(settings, "service")); service->server = bstrdup(obs_data_get_string(settings, "server")); service->key = bstrdup(obs_data_get_string(settings, "key")); service->supports_additional_audio_track = false; service->output = NULL; + service->video_codecs = NULL; service->supported_resolutions = NULL; service->supported_resolutions_count = 0; service->max_fps = 0; @@ -160,6 +164,7 @@ static void rtmp_common_destroy(void *data) struct rtmp_common *service = data; bfree(service->supported_resolutions); + bfree(service->video_codecs); bfree(service->service); bfree(service->server); bfree(service->output); @@ -850,6 +855,49 @@ fail: json_decref(root); } +static const char **rtmp_common_get_supported_video_codecs(void *data) +{ + struct rtmp_common *service = data; + + if (service->video_codecs) + return service->video_codecs; + + struct dstr codecs = {0}; + json_t *root = open_services_file(); + if (!root) + return NULL; + + json_t *json_service = find_service(root, service->service, NULL); + if (!json_service) { + goto fail; + } + + json_t *json_video_codecs = + json_object_get(json_service, "supported video codecs"); + if (!json_is_array(json_video_codecs)) { + goto fail; + } + + size_t index; + json_t *item; + + json_array_foreach (json_video_codecs, index, item) { + char codec[16]; + + snprintf(codec, sizeof(codec), "%s", json_string_value(item)); + if (codecs.len) + dstr_cat(&codecs, ";"); + dstr_cat(&codecs, codec); + } + + service->video_codecs = strlist_split(codecs.array, ';', false); + dstr_free(&codecs); + +fail: + json_decref(root); + return service->video_codecs; +} + static const char *rtmp_common_username(void *data) { struct rtmp_common *service = data; @@ -892,4 +940,5 @@ struct obs_service_info rtmp_common_service = { .get_supported_resolutions = rtmp_common_get_supported_resolutions, .get_max_fps = rtmp_common_get_max_fps, .get_max_bitrate = rtmp_common_get_max_bitrate, + .get_supported_video_codecs = rtmp_common_get_supported_video_codecs, };