Skip to content
This repository was archived by the owner on Sep 19, 2024. It is now read-only.

[RTC-32] Fetch actual bitrate of a variant #229

Merged
merged 31 commits into from
Mar 29, 2023
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
ee56567
Modify sdpOffer Media Event handling
LVala Jan 16, 2023
c4ead07
Add TrackVariantEvent and modify some elements to exchange variant ba…
LVala Jan 20, 2023
bfa6b6d
Change names from bandwidth to bitrate accordingly
LVala Jan 20, 2023
5a9d25c
Add handling of new variant bitrate message
LVala Jan 23, 2023
c64d938
Fix wrong bitrate units
LVala Jan 23, 2023
4d8666a
Minor code refactor
LVala Jan 23, 2023
c244a13
Fix trackSender tests
LVala Jan 23, 2023
d0a2bef
Minor bug fix and adjusting to changes in js sdk
LVala Jan 24, 2023
c18be7e
Fix bug in tee
LVala Jan 25, 2023
cdadb97
Add tests
LVala Jan 25, 2023
184fb6b
Add media event tests
LVala Jan 25, 2023
620ba14
Add event more tests
LVala Jan 25, 2023
f59d2bb
Merge branch 'master' into fetch-bitrate-of-simulcast-variant
LVala Mar 15, 2023
d11d27e
Chagne sdpOffer medai event to be backwards compatible
LVala Mar 15, 2023
f46e6ba
Change unit of variant bitrates in VariantSelector
LVala Mar 15, 2023
bd76bc8
Fix tests
LVala Mar 15, 2023
da36698
Changes to VariantSelector
LVala Mar 16, 2023
207027c
Fix sending some unnecessary VariantBitrate events
LVala Mar 16, 2023
42cdf8f
Not sent unnecessary media events from track_sender
LVala Mar 20, 2023
6172b10
Merge branch 'master' into fetch-bitrate-of-simulcast-variant
LVala Mar 20, 2023
82f55ab
Fix tests
LVala Mar 20, 2023
3262c90
Apply requested changes
LVala Mar 21, 2023
d806dad
Change default variant limits to chrome defaults
LVala Mar 22, 2023
4b5e337
Code style improvements
LVala Mar 22, 2023
212cb05
Remove unnecessary comment
LVala Mar 22, 2023
2f88d97
Fix tests
LVala Mar 22, 2023
138fccb
Add validation to media events with track variant bitrates
LVala Mar 23, 2023
a797a12
Remove validation of media events with track variant bitrates, add docs
LVala Mar 24, 2023
98dd709
Merge branch 'master' into fetch-bitrate-of-simulcast-variant
LVala Mar 24, 2023
95c8ceb
Add docs
LVala Mar 24, 2023
c20f387
Update internal_docs/webrtc_media_events.md
LVala Mar 29, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 20 additions & 3 deletions internal_docs/webrtc_media_events.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ Messages used by any WebRTC Endpoint plugin
| [candidate](#candidate) | Contains client's ICE candidate |
| [sdpOffer](#sdpoffer) | Contains an SDP offer from a client |
| [setTargetTrackVariant](#setTargetTrackVariant) | A request from a peer to receive a specific track variant |
| [trackVariantBitrates](#trackVariantBitrate) | Contains updated bitrates for track's variants |

#### WebRTC endpoint sends these type of custom messages to client
| Name | Description |
Expand Down Expand Up @@ -315,8 +316,9 @@ Messages used by any WebRTC Endpoint plugin

### `sdpOffer`

* Contains an SDP offer, a mapping between `track_id` and `track_metadata`, and a mapping between `mid` and `track_id`.
Both maps contain only information about current peer `sendonly` tracks.
* Contains an SDP offer, a mapping between `track_id` and `track_metadata`, mapping between `track_id`
and this track's bitrates (or all of its variants bitrates) and a mapping between `mid` and `track_id`.
Maps contain only information about current peer `sendonly` tracks.

```json
{
Expand All @@ -326,7 +328,10 @@ Messages used by any WebRTC Endpoint plugin
},
trackIdToTrackMetadata: {
trackId: any
}
},
trackIdToTrackBitrates: {
trackId: number | {rid: number}
},
midToTrackId: mid_to_track_id
}
```
Expand All @@ -345,6 +350,18 @@ Messages used by any WebRTC Endpoint plugin
}
```

### `trackVariantBitrates`

* Contains updated bitrates of variants of the track send by the peer.
Needs to contain all of the variants.

```json
{
trackId: track_id,
variantBitrates: {rid: number}
}
```

## WebRTC Enpoint -> Client

### `offerData`
Expand Down
43 changes: 19 additions & 24 deletions lib/membrane_rtc_engine/endpoints/webrtc/media_event.ex
Original file line number Diff line number Diff line change
Expand Up @@ -294,32 +294,28 @@ defmodule Membrane.RTC.Engine.Endpoint.WebRTC.MediaEvent do
"midToTrackId" => mid_to_track_id
} = data
} ->
# use default bitrates in VariantSelector if not present
default_bitrates =
Map.new(track_id_to_track_metadata, fn {id, _metadata} -> {id, %{}} end)

rid_bitrates = Map.get(data, "trackIdToTrackBitrates", %{})

if is_map(rid_bitrates) do
bitrates =
Map.new(rid_bitrates, fn {id, bitrate} -> {id, to_track_variants(bitrate)} end)

{:ok,
%{
type: :sdp_offer,
data: %{
sdp_offer: %{
type: :offer,
sdp: sdp
},
track_id_to_track_metadata: track_id_to_track_metadata,
# use default values in VariantSelector if "trackIdToTrackBitrates" is not present
track_id_to_track_bitrates: Map.merge(default_bitrates, bitrates),
mid_to_track_id: mid_to_track_id
}
}}
else
{:error, :invalid_media_event}
end
track_id_to_track_bitrate =
data
|> Map.get("trackIdToTrackBitrates", default_bitrates)
|> Map.new(fn {id, bitrate} -> {id, to_track_variants(bitrate)} end)

{:ok,
%{
type: :sdp_offer,
data: %{
sdp_offer: %{
type: :offer,
sdp: sdp
},
track_id_to_track_metadata: track_id_to_track_metadata,
track_id_to_track_bitrates: track_id_to_track_bitrate,
mid_to_track_id: mid_to_track_id
}
}}

_other ->
{:error, :invalid_media_event}
Expand Down Expand Up @@ -357,5 +353,4 @@ defmodule Membrane.RTC.Engine.Endpoint.WebRTC.MediaEvent do
end

defp to_track_variants(bitrate) when is_number(bitrate), do: %{high: bitrate}
defp to_track_variants(_bitrate), do: %{}
end
3 changes: 1 addition & 2 deletions lib/membrane_rtc_engine/endpoints/webrtc_endpoint.ex
Original file line number Diff line number Diff line change
Expand Up @@ -797,8 +797,7 @@ defmodule Membrane.RTC.Engine.Endpoint.WebRTC do
end

defp handle_media_event(%{type: :track_variant_bitrates, data: data}, ctx, state) do
track_bitrates = Map.merge(state.track_id_to_bitrates[data.track_id], data.variant_bitrates)
state = put_in(state, [:track_id_to_bitrates, data.track_id], track_bitrates)
state = put_in(state, [:track_id_to_bitrates, data.track_id], data.variant_bitrates)
msg = {:variant_bitrates, data.variant_bitrates}

{forward({:track_sender, data.track_id}, msg, ctx), state}
Expand Down
9 changes: 4 additions & 5 deletions test/membrane_rtc_engine/webrtc/media_event_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@ defmodule Membrane.RTC.Engine.Endpoint.WebRTC.MediaEventTest do
describe "deserializing sdpOffer media event" do
test "creates proper map when event is valid" do
metadata = %{"track_id" => %{"abc" => "cba"}}
bitrates = %{"track_id" => %{"m" => 200}}
decoded_bitrates = %{"track_id" => %{medium: 200}}
bitrates = %{"track_id" => %{"m" => 200, "h" => 500, "l" => 100}}
decoded_bitrates = %{"track_id" => %{medium: 200, high: 500, low: 100}}
mids = %{"5" => "track_id"}
sdp = "mock_sdp"

Expand Down Expand Up @@ -108,8 +108,8 @@ defmodule Membrane.RTC.Engine.Endpoint.WebRTC.MediaEventTest do
describe "deserializing trackVariantBitrates media event" do
test "creates proper map when event is valid" do
track_id = "track_id"
bitrates = %{"h" => 1000, "m" => 500}
decoded_bitrates = %{high: 1000, medium: 500}
bitrates = %{"h" => 1000, "m" => 500, "l" => 100}
decoded_bitrates = %{high: 1000, medium: 500, low: 100}

raw_media_event =
%{
Expand Down Expand Up @@ -146,7 +146,6 @@ defmodule Membrane.RTC.Engine.Endpoint.WebRTC.MediaEventTest do
"type" => "trackVariantBitrates",
"data" => %{
"trackId" => "track_id"
# missing variantBitrates
}
}
}
Expand Down