aboutsummaryrefslogtreecommitdiff
path: root/cast/streaming/receiver_session.cc
diff options
context:
space:
mode:
authorJordan Bayles <jophba@chromium.org>2021-07-16 13:19:50 -0700
committerOpenscreen LUCI CQ <openscreen-scoped@luci-project-accounts.iam.gserviceaccount.com>2021-07-16 21:22:59 +0000
commit4f20671877f4b0d515641cbb566c4c0fe4a2c947 (patch)
tree6f28d4c5753b4ee1d7dc446474bb0f17b1194d4c /cast/streaming/receiver_session.cc
parentd29ea545e02197c5166c0e0c76b3c181b3e3b370 (diff)
downloadopenscreen-4f20671877f4b0d515641cbb566c4c0fe4a2c947.tar.gz
[Cast Streaming] Add codec parameter
This patch adds a new codec parameter to the OFFER/ANSWER exchange. This field respects the format laid out in RFC 6381, and is a strictly optional field that allows senders to provide more information about a given codec configuration. Bug: b/184429130 Change-Id: Ibd537f05e579b3bb2a488712b688edb407784841 Reviewed-on: https://chromium-review.googlesource.com/c/openscreen/+/2984452 Commit-Queue: Jordan Bayles <jophba@chromium.org> Reviewed-by: mark a. foltz <mfoltz@chromium.org>
Diffstat (limited to 'cast/streaming/receiver_session.cc')
-rw-r--r--cast/streaming/receiver_session.cc16
1 files changed, 11 insertions, 5 deletions
diff --git a/cast/streaming/receiver_session.cc b/cast/streaming/receiver_session.cc
index 8082af8e..b55784b2 100644
--- a/cast/streaming/receiver_session.cc
+++ b/cast/streaming/receiver_session.cc
@@ -29,10 +29,14 @@ namespace {
template <typename Stream, typename Codec>
std::unique_ptr<Stream> SelectStream(
const std::vector<Codec>& preferred_codecs,
+ ReceiverSession::Client* client,
const std::vector<Stream>& offered_streams) {
for (auto codec : preferred_codecs) {
for (const Stream& offered_stream : offered_streams) {
- if (offered_stream.codec == codec) {
+ if (offered_stream.codec == codec &&
+ (offered_stream.stream.codec_parameter.empty() ||
+ client->SupportsCodecParameter(
+ offered_stream.stream.codec_parameter))) {
OSP_VLOG << "Selected " << CodecToString(codec)
<< " as codec for streaming";
return std::make_unique<Stream>(offered_stream);
@@ -378,11 +382,11 @@ void ReceiverSession::SelectStreams(const Offer& offer,
if (offer.cast_mode == CastMode::kMirroring) {
if (!offer.audio_streams.empty() && !preferences_.audio_codecs.empty()) {
properties->selected_audio =
- SelectStream(preferences_.audio_codecs, offer.audio_streams);
+ SelectStream(preferences_.audio_codecs, client_, offer.audio_streams);
}
if (!offer.video_streams.empty() && !preferences_.video_codecs.empty()) {
properties->selected_video =
- SelectStream(preferences_.video_codecs, offer.video_streams);
+ SelectStream(preferences_.video_codecs, client_, offer.video_streams);
}
} else {
OSP_DCHECK(offer.cast_mode == CastMode::kRemoting);
@@ -459,7 +463,8 @@ ReceiverSession::ConfiguredReceivers ReceiverSession::SpawnReceivers(
properties.selected_audio->stream.channels,
properties.selected_audio->bit_rate,
properties.selected_audio->stream.rtp_timebase,
- properties.selected_audio->stream.target_delay};
+ properties.selected_audio->stream.target_delay,
+ properties.selected_audio->stream.codec_parameter};
}
VideoCaptureConfig video_config;
@@ -471,7 +476,8 @@ ReceiverSession::ConfiguredReceivers ReceiverSession::SpawnReceivers(
properties.selected_video->max_frame_rate,
properties.selected_video->max_bit_rate,
properties.selected_video->resolutions,
- properties.selected_video->stream.target_delay};
+ properties.selected_video->stream.target_delay,
+ properties.selected_video->stream.codec_parameter};
}
return ConfiguredReceivers{