Skip to content

Commit

Permalink
obs-webrtc: Add support for audio-only and video-only outputs
Browse files Browse the repository at this point in the history
Adds the `whip_output_audio` and `whip_output_video` output kinds,
which selectively advertise only video or only audio support.

To use these types, it is effectively the same as with the AV
version. Just create the output, assign your video or audio encoder,
and you're good.

libobs does not have support for "optional" outputs. With an AV output,
if you only assign a video or audio encoder, start will fail.
  • Loading branch information
tt2468 authored and Lain-B committed Apr 22, 2024
1 parent cfb10ec commit 065d453
Showing 1 changed file with 25 additions and 4 deletions.
29 changes: 25 additions & 4 deletions plugins/obs-webrtc/whip-output.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -83,12 +83,12 @@ void WHIPOutput::Data(struct encoder_packet *packet)
return;
}

if (packet->type == OBS_ENCODER_AUDIO) {
if (audio_track && packet->type == OBS_ENCODER_AUDIO) {
int64_t duration = packet->dts_usec - last_audio_timestamp;
Send(packet->data, packet->size, duration, audio_track,
audio_sr_reporter);
last_audio_timestamp = packet->dts_usec;
} else if (packet->type == OBS_ENCODER_VIDEO) {
} else if (video_track && packet->type == OBS_ENCODER_VIDEO) {
int64_t duration = packet->dts_usec - last_video_timestamp;
Send(packet->data, packet->size, duration, video_track,
video_sr_reporter);
Expand All @@ -99,6 +99,12 @@ void WHIPOutput::Data(struct encoder_packet *packet)
void WHIPOutput::ConfigureAudioTrack(std::string media_stream_id,
std::string cname)
{
if (!obs_output_get_audio_encoder(output, 0)) {
do_log(LOG_DEBUG,
"Not configuring audio track: Audio encoder not assigned");
return;
}

auto media_stream_track_id = std::string(media_stream_id + "-audio");

uint32_t ssrc = base_ssrc;
Expand All @@ -125,6 +131,12 @@ void WHIPOutput::ConfigureAudioTrack(std::string media_stream_id,
void WHIPOutput::ConfigureVideoTrack(std::string media_stream_id,
std::string cname)
{
if (!obs_output_get_video_encoder(output)) {
do_log(LOG_DEBUG,
"Not configuring video track: Video encoder not assigned");
return;
}

auto media_stream_track_id = std::string(media_stream_id + "-video");
std::shared_ptr<rtc::RtpPacketizer> packetizer;

Expand Down Expand Up @@ -590,10 +602,11 @@ void WHIPOutput::Send(void *data, uintptr_t size, uint64_t duration,

void register_whip_output()
{
struct obs_output_info info = {};
const uint32_t base_flags = OBS_OUTPUT_ENCODED | OBS_OUTPUT_SERVICE;

struct obs_output_info info = {};
info.id = "whip_output";
info.flags = OBS_OUTPUT_AV | OBS_OUTPUT_ENCODED | OBS_OUTPUT_SERVICE;
info.flags = OBS_OUTPUT_AV | base_flags;
info.get_name = [](void *) -> const char * {
return obs_module_text("Output.Name");
};
Expand Down Expand Up @@ -630,4 +643,12 @@ void register_whip_output()
info.protocols = "WHIP";

obs_register_output(&info);

info.id = "whip_output_video";
info.flags = OBS_OUTPUT_VIDEO | base_flags;
obs_register_output(&info);

info.id = "whip_output_audio";
info.flags = OBS_OUTPUT_AUDIO | base_flags;
obs_register_output(&info);
}

0 comments on commit 065d453

Please sign in to comment.