From 6f0b986b3dafb214b136b90b39dfe2f9a3176ec7 Mon Sep 17 00:00:00 2001 From: Sean DuBois Date: Fri, 5 Jan 2024 12:13:16 -0500 Subject: [PATCH] obs-webrtc: Add AV1 Support --- plugins/obs-webrtc/whip-output.cpp | 35 +++++++++++++++++++++-------- plugins/obs-webrtc/whip-output.h | 1 + plugins/obs-webrtc/whip-service.cpp | 2 +- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/plugins/obs-webrtc/whip-output.cpp b/plugins/obs-webrtc/whip-output.cpp index ee7350e423802c..bee010fa6be6e1 100644 --- a/plugins/obs-webrtc/whip-output.cpp +++ b/plugins/obs-webrtc/whip-output.cpp @@ -23,6 +23,7 @@ const uint8_t video_payload_type = 96; WHIPOutput::WHIPOutput(obs_data_t *, obs_output_t *output) : output(output), + is_av1(false), endpoint_url(), bearer_token(), resource_url(), @@ -54,6 +55,13 @@ bool WHIPOutput::Start() { std::lock_guard l(start_stop_mutex); + auto encoder = obs_output_get_video_encoder2(output, 0); + if (encoder == nullptr) { + return false; + } + + is_av1 = (strcmp("av1", obs_encoder_get_codec(encoder)) == 0); + if (!obs_output_can_begin_data_capture(output, 0)) return false; if (!obs_output_initialize_encoders(output, 0)) @@ -126,28 +134,37 @@ void WHIPOutput::ConfigureVideoTrack(std::string media_stream_id, std::string cname) { auto media_stream_track_id = std::string(media_stream_id + "-video"); + std::shared_ptr packetizer; // More predictable SSRC values between audio and video uint32_t ssrc = base_ssrc + 1; rtc::Description::Video video_description( video_mid, rtc::Description::Direction::SendOnly); - video_description.addH264Codec(video_payload_type); video_description.addSSRC(ssrc, cname, media_stream_id, media_stream_track_id); - video_track = peer_connection->addTrack(video_description); auto rtp_config = std::make_shared( ssrc, cname, video_payload_type, rtc::H264RtpPacketizer::defaultClockRate); - auto packetizer = std::make_shared( - rtc::H264RtpPacketizer::Separator::StartSequence, rtp_config, - MAX_VIDEO_FRAGMENT_SIZE); - video_sr_reporter = std::make_shared(rtp_config); - auto nack_responder = std::make_shared(); + if (is_av1) { + video_description.addAV1Codec(video_payload_type); + packetizer = std::make_shared( + rtc::AV1RtpPacketizer::Packetization::TemporalUnit, + rtp_config, MAX_VIDEO_FRAGMENT_SIZE); + } else { + video_description.addH264Codec(video_payload_type); + packetizer = std::make_shared( + rtc::H264RtpPacketizer::Separator::StartSequence, + rtp_config, MAX_VIDEO_FRAGMENT_SIZE); + } + + video_sr_reporter = std::make_shared(rtp_config); packetizer->addToChain(video_sr_reporter); - packetizer->addToChain(nack_responder); + packetizer->addToChain(std::make_shared()); + + video_track = peer_connection->addTrack(video_description); video_track->setMediaHandler(packetizer); } @@ -567,7 +584,7 @@ void register_whip_output() info.get_connect_time_ms = [](void *priv_data) -> int { return static_cast(priv_data)->GetConnectTime(); }; - info.encoded_video_codecs = "h264"; + info.encoded_video_codecs = "h264;av1"; info.encoded_audio_codecs = "opus"; info.protocols = "WHIP"; diff --git a/plugins/obs-webrtc/whip-output.h b/plugins/obs-webrtc/whip-output.h index 0f9a66e9e4d313..2933dfae64fb1b 100644 --- a/plugins/obs-webrtc/whip-output.h +++ b/plugins/obs-webrtc/whip-output.h @@ -43,6 +43,7 @@ class WHIPOutput { std::shared_ptr rtcp_sr_reporter); obs_output_t *output; + bool is_av1; std::string endpoint_url; std::string bearer_token; diff --git a/plugins/obs-webrtc/whip-service.cpp b/plugins/obs-webrtc/whip-service.cpp index 89bb24b7c7084f..bc6ef47d649bd2 100644 --- a/plugins/obs-webrtc/whip-service.cpp +++ b/plugins/obs-webrtc/whip-service.cpp @@ -1,7 +1,7 @@ #include "whip-service.h" const char *audio_codecs[MAX_CODECS] = {"opus"}; -const char *video_codecs[MAX_CODECS] = {"h264"}; +const char *video_codecs[MAX_CODECS] = {"h264", "av1"}; WHIPService::WHIPService(obs_data_t *settings, obs_service_t *) : server(),