From faa5f66593405067c868f21f3ff8b21e98f1d153 Mon Sep 17 00:00:00 2001 From: Daniel Pelaez Date: Tue, 7 May 2024 10:20:48 -0500 Subject: [PATCH 1/5] Creating a webvtt hls ll playlist --- src/projects/mediarouter/mediarouter_stream.cpp | 3 +++ src/projects/providers/webvtt/webvtt_stream.cpp | 7 +++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/projects/mediarouter/mediarouter_stream.cpp b/src/projects/mediarouter/mediarouter_stream.cpp index 14a77f781..71d2e5111 100644 --- a/src/projects/mediarouter/mediarouter_stream.cpp +++ b/src/projects/mediarouter/mediarouter_stream.cpp @@ -821,6 +821,9 @@ bool MediaRouteStream::NormalizeMediaPacket(std::shared_ptr &media_t case cmn::BitstreamFormat::ID3v2: result = true; break; + case cmn::BitstreamFormat::WebVTT: + result = true; + break; case cmn::BitstreamFormat::JPEG: case cmn::BitstreamFormat::PNG: { diff --git a/src/projects/providers/webvtt/webvtt_stream.cpp b/src/projects/providers/webvtt/webvtt_stream.cpp index d27031199..aaad5855b 100644 --- a/src/projects/providers/webvtt/webvtt_stream.cpp +++ b/src/projects/providers/webvtt/webvtt_stream.cpp @@ -19,6 +19,9 @@ #include "modules/subtitles/webvtt/webvtt_decoder.h" #include "webvtt_provider_private.h" +// Fix track id +#define WEBVTT_TRACK_ID 0 + namespace pvd { std::shared_ptr WebVTTStream::Create(StreamSourceType source_type, uint32_t channel_id, const std::shared_ptr &client_socket, const std::shared_ptr &provider) @@ -85,7 +88,7 @@ namespace pvd auto media_packet = std::make_shared(GetMsid(), cmn::MediaType::Subtitle, - 1, + WEBVTT_TRACK_ID, cueData, cue->_time_start, cue->_duration, @@ -102,7 +105,7 @@ namespace pvd { auto subtitle_track = std::make_shared(); - subtitle_track->SetId(0); + subtitle_track->SetId(WEBVTT_TRACK_ID); subtitle_track->SetMediaType(cmn::MediaType::Subtitle); subtitle_track->SetTimeBase(1, 1000); subtitle_track->SetOriginBitstream(cmn::BitstreamFormat::WebVTT); From 61289e54056f57887d66164ad8bb436163cdfeb3 Mon Sep 17 00:00:00 2001 From: Daniel Pelaez Date: Wed, 8 May 2024 11:23:32 -0500 Subject: [PATCH 2/5] Creating a webvtt hls ll playlist --- src/projects/base/publisher/application.cpp | 5 +++++ src/projects/publishers/llhls/llhls_stream.cpp | 3 ++- src/projects/transcoder/transcoder_stream.cpp | 3 ++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/projects/base/publisher/application.cpp b/src/projects/base/publisher/application.cpp index da82d15a5..ac2ba1c7c 100644 --- a/src/projects/base/publisher/application.cpp +++ b/src/projects/base/publisher/application.cpp @@ -106,6 +106,11 @@ namespace pub { stream_data->_stream->SendDataFrame(stream_data->_media_packet); } + else if (stream_data->_media_packet->GetMediaType() == cmn::MediaType::Subtitle) + { + //TODO: might require a SendSubtitleFrame instead + stream_data->_stream->SendDataFrame(stream_data->_media_packet); + } else { // Nothing can do diff --git a/src/projects/publishers/llhls/llhls_stream.cpp b/src/projects/publishers/llhls/llhls_stream.cpp index da73f2828..2e916a153 100755 --- a/src/projects/publishers/llhls/llhls_stream.cpp +++ b/src/projects/publishers/llhls/llhls_stream.cpp @@ -1038,7 +1038,8 @@ void LLHlsStream::SendAudioFrame(const std::shared_ptr &media_packe void LLHlsStream::SendDataFrame(const std::shared_ptr &media_packet) { - if (media_packet->GetBitstreamFormat() != cmn::BitstreamFormat::ID3v2) + if (media_packet->GetBitstreamFormat() != cmn::BitstreamFormat::ID3v2 + && media_packet->GetBitstreamFormat() != cmn::BitstreamFormat::WebVTT) { // Not supported return; diff --git a/src/projects/transcoder/transcoder_stream.cpp b/src/projects/transcoder/transcoder_stream.cpp index 42e8d427b..b9555046b 100644 --- a/src/projects/transcoder/transcoder_stream.cpp +++ b/src/projects/transcoder/transcoder_stream.cpp @@ -336,11 +336,12 @@ bool TranscoderStream::IsAvailableSmoothTransitionStream(const std::shared_ptr packet) { +// SendFrame() if(_create_success == false) { return false; } - +// DecodePacket(std::move(packet)); return true; From 570ff0ab175045fab244dec98a6c51caed08e499 Mon Sep 17 00:00:00 2001 From: Daniel Pelaez Date: Wed, 8 May 2024 12:04:32 -0500 Subject: [PATCH 3/5] Creating a webvtt hls ll playlist --- src/projects/base/info/media_track.cpp | 7 +++++++ src/projects/transcoder/transcoder_stream.cpp | 16 ++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/projects/base/info/media_track.cpp b/src/projects/base/info/media_track.cpp index 49e802128..8c215a660 100644 --- a/src/projects/base/info/media_track.cpp +++ b/src/projects/base/info/media_track.cpp @@ -374,6 +374,13 @@ bool MediaTrack::IsValid() return true; } + // Subtitle type is always valid + if(GetMediaType() == MediaType::Subtitle) + { + _is_valid = true; + return true; + } + switch (GetCodecId()) { case MediaCodecId::H264: { diff --git a/src/projects/transcoder/transcoder_stream.cpp b/src/projects/transcoder/transcoder_stream.cpp index b9555046b..9f82a2ca5 100644 --- a/src/projects/transcoder/transcoder_stream.cpp +++ b/src/projects/transcoder/transcoder_stream.cpp @@ -532,6 +532,22 @@ std::shared_ptr TranscoderStream::CreateOutputStream(const cfg::vh AddComposite(GetIdentifiedForDataProfile(input_track_id), _input_stream, input_track, output_stream, output_track); } break; + + // If there is a subtitle type track in the input stream, it must be created equally in all output streams. + case cmn::MediaType::Subtitle: { + auto output_track = CreateOutputTrackDataType(input_track); + if (output_track == nullptr) + { + logtw("Failed to create media tracks. Encoding options need to be checked. track_id(%d)", input_track_id); + continue; + } + + output_stream->AddTrack(output_track); + + //TODO might need a different identifier + AddComposite(GetIdentifiedForDataProfile(input_track_id), _input_stream, input_track, output_stream, output_track); + } + break; default: { logtw("Unsupported media type of input track. type(%d)", input_track->GetMediaType()); continue; From be25c1a4bc32b89860c4228b45c0b2a3c828e0aa Mon Sep 17 00:00:00 2001 From: Daniel Pelaez Date: Thu, 9 May 2024 13:46:10 -0500 Subject: [PATCH 4/5] Creating a webvtt hls ll playlist --- docs/webvtt/Server.xml | 48 +++++++++++++++++++ .../providers/webvtt/webvtt_stream.cpp | 3 +- src/projects/transcoder/transcoder_stream.cpp | 5 +- .../transcoder/transcoder_stream_internal.cpp | 32 ++++++++++++- .../transcoder/transcoder_stream_internal.h | 4 +- 5 files changed, 86 insertions(+), 6 deletions(-) diff --git a/docs/webvtt/Server.xml b/docs/webvtt/Server.xml index dc00d3feb..61c572fec 100644 --- a/docs/webvtt/Server.xml +++ b/docs/webvtt/Server.xml @@ -31,6 +31,13 @@ 9090 + + + 3333 + 3334 + 1 + + @@ -66,9 +73,50 @@ true + + false + + bypass_stream + ${OriginStreamName} + + + + + + + + 10 + 10 + + 0.2 + 4 + 5 + + + false + live + + + playlist.m3u8 + + + /tmp/vod/html/${VHostName}_${AppName}_${StreamName}/${YYYY}_${MM}_${DD}_${hh}_${mm}_${ss} + + + + + * + + + + diff --git a/src/projects/providers/webvtt/webvtt_stream.cpp b/src/projects/providers/webvtt/webvtt_stream.cpp index aaad5855b..3f78ecccf 100644 --- a/src/projects/providers/webvtt/webvtt_stream.cpp +++ b/src/projects/providers/webvtt/webvtt_stream.cpp @@ -91,9 +91,10 @@ namespace pvd WEBVTT_TRACK_ID, cueData, cue->_time_start, - cue->_duration, + cue->_time_start, cmn::BitstreamFormat::WebVTT, cmn::PacketType::SUBTITLE_EVENT); + media_packet->SetDuration(cue->_duration); return SendFrame(media_packet); } diff --git a/src/projects/transcoder/transcoder_stream.cpp b/src/projects/transcoder/transcoder_stream.cpp index 9f82a2ca5..06c1df2c0 100644 --- a/src/projects/transcoder/transcoder_stream.cpp +++ b/src/projects/transcoder/transcoder_stream.cpp @@ -535,7 +535,7 @@ std::shared_ptr TranscoderStream::CreateOutputStream(const cfg::vh // If there is a subtitle type track in the input stream, it must be created equally in all output streams. case cmn::MediaType::Subtitle: { - auto output_track = CreateOutputTrackDataType(input_track); + auto output_track = CreateOutputTrackSubtitleType(input_track); if (output_track == nullptr) { logtw("Failed to create media tracks. Encoding options need to be checked. track_id(%d)", input_track_id); @@ -544,8 +544,7 @@ std::shared_ptr TranscoderStream::CreateOutputStream(const cfg::vh output_stream->AddTrack(output_track); - //TODO might need a different identifier - AddComposite(GetIdentifiedForDataProfile(input_track_id), _input_stream, input_track, output_stream, output_track); + AddComposite(GetIdentifiedForSubtitleProfile(input_track_id), _input_stream, input_track, output_stream, output_track); } break; default: { diff --git a/src/projects/transcoder/transcoder_stream_internal.cpp b/src/projects/transcoder/transcoder_stream_internal.cpp index ea0537ae0..819dce526 100644 --- a/src/projects/transcoder/transcoder_stream_internal.cpp +++ b/src/projects/transcoder/transcoder_stream_internal.cpp @@ -79,6 +79,11 @@ ov::String TranscoderStreamInternal::GetIdentifiedForDataProfile(const uint32_t return ov::String::FormatString("I=%d,O=bypass", track_id); } +ov::String TranscoderStreamInternal::GetIdentifiedForSubtitleProfile(const uint32_t track_id) +{ + return ov::String::FormatString("I=%d,O=bypass", track_id); +} + cmn::Timebase TranscoderStreamInternal::GetDefaultTimebaseByCodecId(cmn::MediaCodecId codec_id) { cmn::Timebase timebase(1, 1000); @@ -412,6 +417,31 @@ std::shared_ptr TranscoderStreamInternal::CreateOutputTrackDataType( return output_track; } +std::shared_ptr TranscoderStreamInternal::CreateOutputTrackSubtitleType(const std::shared_ptr &input_track) +{ + auto output_track = std::make_shared(); + if (output_track == nullptr) + { + return nullptr; + } + + output_track->SetMediaType(cmn::MediaType::Subtitle); + output_track->SetId(NewTrackId()); + output_track->SetVariantName(""); + output_track->SetPublicName(input_track->GetPublicName()); + output_track->SetLanguage(input_track->GetLanguage()); + output_track->SetBypass(true); + output_track->SetCodecId(input_track->GetCodecId()); + output_track->SetCodecModules(""); + output_track->SetCodecModuleId(input_track->GetCodecModuleId()); + output_track->SetOriginBitstream(input_track->GetOriginBitstream()); + output_track->SetWidth(input_track->GetWidth()); + output_track->SetHeight(input_track->GetHeight()); + output_track->SetFrameRateByMeasured(input_track->GetFrameRate()); + output_track->SetTimeBase(input_track->GetTimeBase()); + + return output_track; +} bool TranscoderStreamInternal::IsMatchesBypassCondition(const std::shared_ptr &input_track, const cfg::vhost::app::oprf::VideoProfile &profile) { @@ -699,4 +729,4 @@ void TranscoderStreamInternal::UpdateOutputTrackTranscode(const std::shared_ptr< output_track->SetChannel(buffer->GetChannels()); } } -} \ No newline at end of file +} diff --git a/src/projects/transcoder/transcoder_stream_internal.h b/src/projects/transcoder/transcoder_stream_internal.h index 9f2226530..0a7c0ffd2 100644 --- a/src/projects/transcoder/transcoder_stream_internal.h +++ b/src/projects/transcoder/transcoder_stream_internal.h @@ -33,13 +33,15 @@ class TranscoderStreamInternal static ov::String GetIdentifiedForAudioProfile(const uint32_t track_id, const cfg::vhost::app::oprf::AudioProfile &profile); static ov::String GetIdentifiedForImageProfile(const uint32_t track_id, const cfg::vhost::app::oprf::ImageProfile &profile); static ov::String GetIdentifiedForDataProfile(const uint32_t track_id); + static ov::String GetIdentifiedForSubtitleProfile(const uint32_t track_id); static cmn::Timebase GetDefaultTimebaseByCodecId(cmn::MediaCodecId codec_id); std::shared_ptr CreateOutputTrack(const std::shared_ptr &input_track, const cfg::vhost::app::oprf::VideoProfile &profile); std::shared_ptr CreateOutputTrack(const std::shared_ptr &input_track, const cfg::vhost::app::oprf::AudioProfile &profile); std::shared_ptr CreateOutputTrack(const std::shared_ptr &input_track, const cfg::vhost::app::oprf::ImageProfile &profile); - std::shared_ptr CreateOutputTrackDataType(const std::shared_ptr &input_track); + std::shared_ptr CreateOutputTrackDataType(const std::shared_ptr &input_track); + std::shared_ptr CreateOutputTrackSubtitleType(const std::shared_ptr &input_track); bool IsMatchesBypassCondition(const std::shared_ptr &input_track, const cfg::vhost::app::oprf::VideoProfile &profile); bool IsMatchesBypassCondition(const std::shared_ptr &input_track, const cfg::vhost::app::oprf::AudioProfile &profile); From 1d769e016a3fdd3dca3817eb78f8ad107fd9dd39 Mon Sep 17 00:00:00 2001 From: Daniel Pelaez Date: Thu, 9 May 2024 14:20:37 -0500 Subject: [PATCH 5/5] Creating a webvtt hls ll playlist --- src/projects/base/mediarouter/media_type.h | 1 + src/projects/base/publisher/application.cpp | 3 +-- src/projects/base/publisher/stream.h | 1 + .../providers/webvtt/webvtt_stream.cpp | 1 + src/projects/publishers/file/file_stream.h | 1 + .../publishers/llhls/llhls_stream.cpp | 25 +++++++++++++++++-- src/projects/publishers/llhls/llhls_stream.h | 1 + .../publishers/mpegtspush/mpegtspush_stream.h | 1 + src/projects/publishers/ovt/ovt_stream.h | 1 + .../publishers/rtmppush/rtmppush_stream.h | 1 + .../segment/segment_stream/segment_stream.h | 1 + .../publishers/thumbnail/thumbnail_stream.h | 1 + src/projects/publishers/webrtc/rtc_stream.h | 1 + 13 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/projects/base/mediarouter/media_type.h b/src/projects/base/mediarouter/media_type.h index 576d24715..f52acd525 100644 --- a/src/projects/base/mediarouter/media_type.h +++ b/src/projects/base/mediarouter/media_type.h @@ -96,6 +96,7 @@ namespace cmn Opus, Jpeg, Png, + WebVTT }; enum class MediaCodecModuleId : uint8_t diff --git a/src/projects/base/publisher/application.cpp b/src/projects/base/publisher/application.cpp index ac2ba1c7c..fc12cd85c 100644 --- a/src/projects/base/publisher/application.cpp +++ b/src/projects/base/publisher/application.cpp @@ -108,8 +108,7 @@ namespace pub } else if (stream_data->_media_packet->GetMediaType() == cmn::MediaType::Subtitle) { - //TODO: might require a SendSubtitleFrame instead - stream_data->_stream->SendDataFrame(stream_data->_media_packet); + stream_data->_stream->SendSubtitleFrame(stream_data->_media_packet); } else { diff --git a/src/projects/base/publisher/stream.h b/src/projects/base/publisher/stream.h index ab3abc3c2..d61e7b46b 100644 --- a/src/projects/base/publisher/stream.h +++ b/src/projects/base/publisher/stream.h @@ -96,6 +96,7 @@ namespace pub virtual void SendVideoFrame(const std::shared_ptr &media_packet) = 0; virtual void SendAudioFrame(const std::shared_ptr &media_packet) = 0; virtual void SendDataFrame(const std::shared_ptr &media_packet) = 0; + virtual void SendSubtitleFrame(const std::shared_ptr &media_packet) = 0; virtual bool Start(); virtual bool Stop(); diff --git a/src/projects/providers/webvtt/webvtt_stream.cpp b/src/projects/providers/webvtt/webvtt_stream.cpp index 3f78ecccf..3f337a305 100644 --- a/src/projects/providers/webvtt/webvtt_stream.cpp +++ b/src/projects/providers/webvtt/webvtt_stream.cpp @@ -110,6 +110,7 @@ namespace pvd subtitle_track->SetMediaType(cmn::MediaType::Subtitle); subtitle_track->SetTimeBase(1, 1000); subtitle_track->SetOriginBitstream(cmn::BitstreamFormat::WebVTT); + subtitle_track->SetCodecId(cmn::MediaCodecId::WebVTT); AddTrack(subtitle_track); diff --git a/src/projects/publishers/file/file_stream.h b/src/projects/publishers/file/file_stream.h index 12dff8d37..37d6cecf8 100755 --- a/src/projects/publishers/file/file_stream.h +++ b/src/projects/publishers/file/file_stream.h @@ -23,6 +23,7 @@ namespace pub void SendVideoFrame(const std::shared_ptr &media_packet) override; void SendAudioFrame(const std::shared_ptr &media_packet) override; void SendDataFrame(const std::shared_ptr &media_packet) override {} // Not supported + void SendSubtitleFrame(const std::shared_ptr &media_packet) override {} // Not supported std::shared_ptr CreateSession(); bool DeleteSession(uint32_t session_id); diff --git a/src/projects/publishers/llhls/llhls_stream.cpp b/src/projects/publishers/llhls/llhls_stream.cpp index 2e916a153..4eb455920 100755 --- a/src/projects/publishers/llhls/llhls_stream.cpp +++ b/src/projects/publishers/llhls/llhls_stream.cpp @@ -524,6 +524,7 @@ bool LLHlsStream::IsSupportedCodec(cmn::MediaCodecId codec_id) const case cmn::MediaCodecId::H264: case cmn::MediaCodecId::H265: case cmn::MediaCodecId::Aac: + case cmn::MediaCodecId::WebVTT: return true; default: return false; @@ -1038,8 +1039,7 @@ void LLHlsStream::SendAudioFrame(const std::shared_ptr &media_packe void LLHlsStream::SendDataFrame(const std::shared_ptr &media_packet) { - if (media_packet->GetBitstreamFormat() != cmn::BitstreamFormat::ID3v2 - && media_packet->GetBitstreamFormat() != cmn::BitstreamFormat::WebVTT) + if (media_packet->GetBitstreamFormat() != cmn::BitstreamFormat::ID3v2) { // Not supported return; @@ -1080,6 +1080,27 @@ void LLHlsStream::SendDataFrame(const std::shared_ptr &media_packet } } +void LLHlsStream::SendSubtitleFrame(const std::shared_ptr &media_packet) +{ + if (media_packet == nullptr || media_packet->GetData() == nullptr) + { + return; + } + + if (GetState() == State::CREATED) + { + BufferMediaPacketUntilReadyToPlay(media_packet); + return; + } + + if (_initial_media_packet_buffer.IsEmpty() == false) + { + SendBufferedPackets(); + } + + AppendMediaPacket(media_packet); +} + bool LLHlsStream::AppendMediaPacket(const std::shared_ptr &media_packet) { auto track = GetTrack(media_packet->GetTrackId()); diff --git a/src/projects/publishers/llhls/llhls_stream.h b/src/projects/publishers/llhls/llhls_stream.h index 4f072c8ec..24b60ce3e 100755 --- a/src/projects/publishers/llhls/llhls_stream.h +++ b/src/projects/publishers/llhls/llhls_stream.h @@ -38,6 +38,7 @@ class LLHlsStream : public pub::Stream, public bmff::FMp4StorageObserver void SendVideoFrame(const std::shared_ptr &media_packet) override; void SendAudioFrame(const std::shared_ptr &media_packet) override; void SendDataFrame(const std::shared_ptr &media_packet) override; + void SendSubtitleFrame(const std::shared_ptr &media_packet) override; enum class RequestResult : uint8_t { diff --git a/src/projects/publishers/mpegtspush/mpegtspush_stream.h b/src/projects/publishers/mpegtspush/mpegtspush_stream.h index 28fc82bc8..655b4363a 100755 --- a/src/projects/publishers/mpegtspush/mpegtspush_stream.h +++ b/src/projects/publishers/mpegtspush/mpegtspush_stream.h @@ -19,6 +19,7 @@ class MpegtsPushStream : public pub::Stream void SendVideoFrame(const std::shared_ptr &media_packet) override; void SendAudioFrame(const std::shared_ptr &media_packet) override; void SendDataFrame(const std::shared_ptr &media_packet) override {} // Not supported + void SendSubtitleFrame(const std::shared_ptr &media_packet) override {} // Not supported std::shared_ptr CreatePushSession(std::shared_ptr &push) override; diff --git a/src/projects/publishers/ovt/ovt_stream.h b/src/projects/publishers/ovt/ovt_stream.h index d20391de7..543325079 100644 --- a/src/projects/publishers/ovt/ovt_stream.h +++ b/src/projects/publishers/ovt/ovt_stream.h @@ -20,6 +20,7 @@ class OvtStream : public pub::Stream, public OvtPacketizerInterface void SendVideoFrame(const std::shared_ptr &media_packet) override; void SendAudioFrame(const std::shared_ptr &media_packet) override; void SendDataFrame(const std::shared_ptr &media_packet) override {} // Not supported yet + void SendSubtitleFrame(const std::shared_ptr &media_packet) override {} // Not supported bool OnOvtPacketized(std::shared_ptr &packet) override; diff --git a/src/projects/publishers/rtmppush/rtmppush_stream.h b/src/projects/publishers/rtmppush/rtmppush_stream.h index 55562ab6c..2fb65b88a 100755 --- a/src/projects/publishers/rtmppush/rtmppush_stream.h +++ b/src/projects/publishers/rtmppush/rtmppush_stream.h @@ -19,6 +19,7 @@ class RtmpPushStream : public pub::Stream void SendVideoFrame(const std::shared_ptr &media_packet) override; void SendAudioFrame(const std::shared_ptr &media_packet) override; void SendDataFrame(const std::shared_ptr &media_packet) override {} // Not supported + void SendSubtitleFrame(const std::shared_ptr &media_packet) override {} // Not supported std::shared_ptr CreatePushSession(std::shared_ptr &push) override; diff --git a/src/projects/publishers/segment/segment_stream/segment_stream.h b/src/projects/publishers/segment/segment_stream/segment_stream.h index 08378aab8..30c387e6f 100644 --- a/src/projects/publishers/segment/segment_stream/segment_stream.h +++ b/src/projects/publishers/segment/segment_stream/segment_stream.h @@ -50,6 +50,7 @@ class SegmentStream : public pub::Stream void SendVideoFrame(const std::shared_ptr &media_packet) override; void SendAudioFrame(const std::shared_ptr &media_packet) override; void SendDataFrame(const std::shared_ptr &media_packet) override{} // Not supported + void SendSubtitleFrame(const std::shared_ptr &media_packet) override {} // Not supported int GetSegmentDuration() { return _segment_duration; } protected: diff --git a/src/projects/publishers/thumbnail/thumbnail_stream.h b/src/projects/publishers/thumbnail/thumbnail_stream.h index 0fc95737c..04710187f 100755 --- a/src/projects/publishers/thumbnail/thumbnail_stream.h +++ b/src/projects/publishers/thumbnail/thumbnail_stream.h @@ -19,6 +19,7 @@ class ThumbnailStream : public pub::Stream void SendVideoFrame(const std::shared_ptr &media_packet) override; void SendAudioFrame(const std::shared_ptr &media_packet) override; void SendDataFrame(const std::shared_ptr &media_packet) override {} // Not supported + void SendSubtitleFrame(const std::shared_ptr &media_packet) override {} // Not supported std::shared_ptr GetVideoFrameByCodecId(cmn::MediaCodecId codec_id, int64_t timeout_ms = 0); private: diff --git a/src/projects/publishers/webrtc/rtc_stream.h b/src/projects/publishers/webrtc/rtc_stream.h index 8f04170b4..966c64fa0 100644 --- a/src/projects/publishers/webrtc/rtc_stream.h +++ b/src/projects/publishers/webrtc/rtc_stream.h @@ -39,6 +39,7 @@ class RtcStream : public pub::Stream, public RtpPacketizerInterface void SendVideoFrame(const std::shared_ptr &media_packet) override; void SendAudioFrame(const std::shared_ptr &media_packet) override; void SendDataFrame(const std::shared_ptr &media_packet) override {} // Not supported + void SendSubtitleFrame(const std::shared_ptr &media_packet) override {} // Not supported std::shared_ptr GetRtxRtpPacket(uint32_t track_id, uint8_t origin_payload_type, uint16_t origin_sequence_number);