Skip to content

Commit

Permalink
obs-webrtc: Add AV1 Support
Browse files Browse the repository at this point in the history
  • Loading branch information
Sean-Der committed Jul 28, 2023
1 parent 11a6348 commit d639dda
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 17 deletions.
54 changes: 38 additions & 16 deletions plugins/obs-webrtc/whip-output.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
Expand Down Expand Up @@ -54,6 +55,13 @@ bool WHIPOutput::Start()
{
std::lock_guard<std::mutex> 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))
Expand Down Expand Up @@ -128,31 +136,45 @@ 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<rtc::MediaChainableHandler> media_handler;

// More predictable SSRC values between audio and video
uint32_t ssrc = base_ssrc + 1;

auto rtp_config = std::make_shared<rtc::RtpPacketizationConfig>(
ssrc, cname, video_payload_type,
rtc::AV1RtpPacketizer::defaultClockRate);
auto nack_responder = std::make_shared<rtc::RtcpNackResponder>();
video_sr_reporter = std::make_shared<rtc::RtcpSrReporter>(rtp_config);

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<rtc::RtpPacketizationConfig>(
ssrc, cname, video_payload_type,
rtc::H264RtpPacketizer::defaultClockRate);
auto packetizer = std::make_shared<rtc::H264RtpPacketizer>(
rtc::H264RtpPacketizer::Separator::StartSequence, rtp_config,
MAX_VIDEO_FRAGMENT_SIZE);
video_sr_reporter = std::make_shared<rtc::RtcpSrReporter>(rtp_config);
auto nack_responder = std::make_shared<rtc::RtcpNackResponder>();
if (is_av1) {
video_description.addAV1Codec(video_payload_type);

auto packetizer = std::make_shared<rtc::AV1RtpPacketizer>(
rtc::AV1RtpPacketizer::Packetization::TemporalUnit,
rtp_config, MAX_VIDEO_FRAGMENT_SIZE);
media_handler = std::make_shared<rtc::AV1PacketizationHandler>(
packetizer);
} else {
video_description.addH264Codec(video_payload_type);

auto packetizer = std::make_shared<rtc::H264RtpPacketizer>(
rtc::H264RtpPacketizer::Separator::StartSequence,
rtp_config, MAX_VIDEO_FRAGMENT_SIZE);
media_handler = std::make_shared<rtc::H264PacketizationHandler>(
packetizer);
}

auto h264_handler =
std::make_shared<rtc::H264PacketizationHandler>(packetizer);
h264_handler->addToChain(video_sr_reporter);
h264_handler->addToChain(nack_responder);
video_track->setMediaHandler(h264_handler);
media_handler->addToChain(video_sr_reporter);
media_handler->addToChain(nack_responder);

video_track = peer_connection->addTrack(video_description);
video_track->setMediaHandler(media_handler);
}

/**
Expand Down Expand Up @@ -539,7 +561,7 @@ void register_whip_output()
info.get_connect_time_ms = [](void *priv_data) -> int {
return static_cast<WHIPOutput *>(priv_data)->GetConnectTime();
};
info.encoded_video_codecs = "h264";
info.encoded_video_codecs = "h264;av1";
info.encoded_audio_codecs = "opus";
info.protocols = "WHIP";

Expand Down
1 change: 1 addition & 0 deletions plugins/obs-webrtc/whip-output.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ class WHIPOutput {
std::shared_ptr<rtc::RtcpSrReporter> rtcp_sr_reporter);

obs_output_t *output;
bool is_av1;

std::string endpoint_url;
std::string bearer_token;
Expand Down
2 changes: 1 addition & 1 deletion plugins/obs-webrtc/whip-service.cpp
Original file line number Diff line number Diff line change
@@ -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(),
Expand Down

0 comments on commit d639dda

Please sign in to comment.