Files
client-sdk-rust/webrtc-sys/src/rtp_transceiver.cpp
T
Théo MonnomandGitHub cad6d36201 feat: video publishing (#42)
- Prepare webrtc abstraction ( for future wasm support )
- Added track publish support for videos
  - Added LogoTrack example to simple_room demo
- Lot of cleanup
- There are compiler warnings I'll solve on our v1 release
2023-03-18 03:25:16 +01:00

146 lines
4.6 KiB
C++

/*
* Copyright 2023 LiveKit
*
* Licensed under the Apache License, Version 2.0 (the “License”);
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an “AS IS” BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "livekit/rtp_transceiver.h"
namespace livekit {
webrtc::RtpTransceiverInit to_native_rtp_transceiver_init(
RtpTransceiverInit init) {
{
webrtc::RtpTransceiverInit native{};
native.direction =
static_cast<webrtc::RtpTransceiverDirection>(init.direction);
native.stream_ids = std::vector<std::string>(init.stream_ids.begin(),
init.stream_ids.end());
for (auto encoding : init.send_encodings)
native.send_encodings.push_back(
to_native_rtp_encoding_paramters(encoding));
return native;
}
}
RtpTransceiver::RtpTransceiver(
rtc::scoped_refptr<webrtc::RtpTransceiverInterface> transceiver)
: transceiver_(std::move(transceiver)) {}
MediaType RtpTransceiver::media_type() const {
return static_cast<MediaType>(transceiver_->media_type());
}
rust::String RtpTransceiver::mid() const {
// The error/Result is converted into an Option in Rust (Wait for Option
// suport in cxx.rs) (value throws an error if there's no value)
return transceiver_->mid().value();
}
std::shared_ptr<RtpSender> RtpTransceiver::sender() const {
return std::make_shared<RtpSender>(transceiver_->sender());
}
std::shared_ptr<RtpReceiver> RtpTransceiver::receiver() const {
return std::make_shared<RtpReceiver>(transceiver_->receiver());
}
bool RtpTransceiver::stopped() const {
return transceiver_->stopped();
}
bool RtpTransceiver::stopping() const {
return transceiver_->stopping();
}
RtpTransceiverDirection RtpTransceiver::direction() const {
return static_cast<RtpTransceiverDirection>(transceiver_->direction());
}
void RtpTransceiver::set_direction(RtpTransceiverDirection direction) const {
auto error = transceiver_->SetDirectionWithError(
static_cast<webrtc::RtpTransceiverDirection>(direction));
if (!error.ok()) {
throw std::runtime_error(serialize_error(to_error(error)));
}
}
RtpTransceiverDirection RtpTransceiver::current_direction() const {
return static_cast<RtpTransceiverDirection>(
transceiver_->current_direction().value());
}
RtpTransceiverDirection RtpTransceiver::fired_direction() const {
return static_cast<RtpTransceiverDirection>(
transceiver_->fired_direction().value());
}
void RtpTransceiver::stop_standard() const {
auto error = transceiver_->StopStandard();
if (!error.ok())
throw std::runtime_error(serialize_error(to_error(error)));
}
void RtpTransceiver::set_codec_preferences(
rust::Vec<RtpCodecCapability> codecs) const {
std::vector<webrtc::RtpCodecCapability> std_codecs;
for (auto codec : codecs)
std_codecs.push_back(to_native_rtp_codec_capability(codec));
auto error = transceiver_->SetCodecPreferences(std_codecs);
if (!error.ok())
throw std::runtime_error(serialize_error(to_error(error)));
}
rust::Vec<RtpCodecCapability> RtpTransceiver::codec_preferences() const {
rust::Vec<RtpCodecCapability> rust;
for (auto codec : transceiver_->codec_preferences())
rust.push_back(to_rust_rtp_codec_capability(codec));
return rust;
}
rust::Vec<RtpHeaderExtensionCapability>
RtpTransceiver::header_extensions_to_offer() const {
rust::Vec<RtpHeaderExtensionCapability> rust;
for (auto header : transceiver_->HeaderExtensionsToOffer())
rust.push_back(to_rust_rtp_header_extension_capability(header));
return rust;
}
rust::Vec<RtpHeaderExtensionCapability>
RtpTransceiver::header_extensions_negotiated() const {
rust::Vec<RtpHeaderExtensionCapability> rust;
for (auto header : transceiver_->HeaderExtensionsNegotiated())
rust.push_back(to_rust_rtp_header_extension_capability(header));
return rust;
}
void RtpTransceiver::set_offered_rtp_header_extensions(
rust::Vec<RtpHeaderExtensionCapability> header_extensions_to_offer) const {
std::vector<webrtc::RtpHeaderExtensionCapability> headers;
for (auto header : header_extensions_to_offer)
headers.push_back(to_native_rtp_header_extension_capability(header));
auto error = transceiver_->SetOfferedRtpHeaderExtensions(headers);
if (!error.ok())
throw std::runtime_error(serialize_error(to_error(error)));
}
} // namespace livekit