Releases: elixir-webrtc/ex_webrtc
v0.6.3
v0.6.2
v0.5.1
v0.6.1
v0.6.0
v0.5.0
Breaking Changes
This release doesn't include any breaking changes! 🎉
What's Changed
- Add DataChannels by @LVala in #157
- DataChannels: allow for closing, apply negotiated stream parameters by @LVala in #161
- Include DataChannel stats in
PeerConnection.get_statsby @LVala in #162 - Make DataChannel support optional by @LVala in #163
- Add guide on offering to receive media tracks by @mickel8 in #165
- Fix typo in docs by @Arp-G in #166
New Contributors
Full Changelog: v0.4.1...v0.5.0
v0.4.1
v0.4.0
Breaking changes
- Packets sent in the
{:rtcp, ...}message now come wrapped in a 2-element tuple. A new field denotes the ID of the corresponding track (the one to which the feedback is related), i.e.
{:ex_webrtc, input_pc, {:rtcp, packets}} = msg
for packet <- packets do
case packet do
- %ExRTCP.Packet.PayloadFeedback.PLI{} ->
+ {track_id, %ExRTCP.Packet.PayloadFeedback.PLI{}} ->
# do something
...In the case of PLI and NACK, this is the ID of an outgoing (sender's) track; in the case of Sender and Receiver Reports, it's the ID of an incoming (receiver's) track.
If matching to a track was not possible (like in the case of TWCC packets), track_id is set to nil, i.e.
...
- %ExRTCP.Packet.TransportFeedback.CC{} ->
+ {nil, %ExRTCP.Packet.TransportFeedback.CC{}} ->
# do something else
end
end- Supported payloaders (VP8, Opus) are now created and accessed using the same module:
ExWebRTC.RTP.Payloader. The same applies to depayloaders (ExWebRTC.RTP.Depayloader):
video_codec = %ExWebRTC.RTPCodecParameters{
payload_type: 96,
mime_type: "video/VP8",
clock_rate: 90_000
}
audio_codec = %ExWebRTC.RTPCodecParameters{
payload_type: 111,
mime_type: "audio/opus",
clock_rate: 48_000,
channels: 2
}
# Creating (de)payloaders
- video_payloader = ExWebRTC.RTP.VP8.Payloader.new()
+ {:ok, video_payloader} = ExWebRTC.RTP.Payloader.new(video_codec)
+ {:ok, audio_depayloader} = ExWebRTC.RTP.Depayloader.new(audio_codec)
# Using (de)payloaders
- {packets, video_payloader} = ExWebRTC.RTP.VP8.Payloader.payload(video_payloader, frame)
+ {packets, video_payloader} = ExWebRTC.RTP.Payloader.payload(video_payloader, frame)
- frame = ExWebRTC.RTP.Opus.Depayloader.depayload(packet)
+ {frame, audio_depayloader} = ExWebRTC.RTP.Depayloader.depayload(audio_depayloader, packet)Refer to Payloader and Depayloader docs for more info.
What's Changed
- Remove redundant FMTP specification from default codecs by @mickel8 in #125
- Add
RTP.Mungerand H264 codec utilities by @LVala in #126 - Update examples. Update ex_webrtc deps. by @mickel8 in #131
- Fix examples sometimes not loading in Chromium by @mickel8 in #133
- Improve inbound/outbound RTP stats by @LVala in #134
- Fix: always include remote fingerprint in stats by @LVala in #135
- Expose ICE port range by @mickel8 in #139
- Add
Introduction to Elixir WebRTCtutorial by @LVala in #136 - Add
track_idto packets sent in{:rtcp, ...}message by @LVala in #140 - Further improvements to
Introduction to Elixir WebRTCtutorial by @LVala in #141 - Fix
set_remote_descriptionfailing on description with rejected m-lines by @LVala in #145 - Handle other retransmit case in DTLSTransport by @sgfn in #148
- Add tutorial about debugging by @LVala in #146
- Ignore lack of
rtcp_muxin rejected m-lines by @LVala in #150 - Add
format parametersto default video codecs by @LVala in #153 - Add simulcast tutorial by @mickel8 in #151
- Add behaviour and dynamic dispatch for (de)payloaders by @sgfn in #147
- Bump deps, release 0.4.0 by @sgfn in #155
Full Changelog: v0.3.0...v0.4.0
v0.3.0
Breaking changes
-
RTP packets are now returned in 4 element tuple (comparing to 3 element tuple before). A new field denotes RID i.e.
- {:ex_webrtc, input_pc, {:rtp, id, packet}} + {:ex_webrtc, input_pc, {:rtp, id, rid, packet}}
RID identifies simulcast layer. If client side offers simulcast, ExWebRTC will by default accept it. If simulcast is disabled, RID is equal to
nil. -
all features like RTX, TWCC, Simulcast, etc. are now by default enabled. You can disable them using feature option of PeerConnection configuration options. This means you can remove RTX codec from your list of codecs:
@video_codecs [ %RTPCodecParameters{ payload_type: 96, mime_type: "video/H264", clock_rate: 90_000, - rtcp_fbs: [%ExSDP.Attribute.RTCPFeedback{pt: 96, feedback_type: :nack}] }, - %RTPCodecParameters{ - payload_type: 97, - mime_type: "video/rtx", - clock_rate: 90_000, - sdp_fmtp_line: %ExSDP.Attribute.FMTP{pt: 97, apt: 96} - } ] -
ExWebRTC now supports MediaStreams. If you offer to send media tracks, they, by default, won't be assigned to any media stream. As a result, on the other side, in particular in a web browser,
streamsfield of theRTCTrackEventwill be an empty array. You have to either create a stream in Elixir WebRTC or in a web browser i.e.To keep this working:
pc.ontrack = event => videoPlayer.srcObject = event.streams[0];
assign tracks to media stream in Elixir WebRTC:
- {:ok, _sender} = PeerConnection.add_track(pc, MediaStreamTrack.new(:audio)) - {:ok, _sender} = PeerConnection.add_track(pc, MediaStreamTrack.new(:video)) + media_stream_id = MediaStreamTrack.generate_stream_id() + {:ok, _sender} = PeerConnection.add_track(pc, MediaStreamTrack.new(:audio, [media_stream_id])) + {:ok, _sender} = PeerConnection.add_track(pc, MediaStreamTrack.new(:video, [media_stream_id]))
What's Changed
- Add
whip_whepexample by @LVala in #109 - Fix typos by @kianmeng in #115
- Fix send_rtp for non-existing track id by @ndrean in #114
- Inbound Simulcast by @LVala in #111
- Add support for MediaStreams by @LVala in #117
- Fix simulcast issues by @LVala in #121
- Improve UX of
Configurationby @LVala in #120 - Create a module for every codec in
ExWebRTC.RTPby @LVala in #122 - Handle VP8.Payload.parse errors by @mickel8 in #123
New Contributors
Full Changelog: v0.2.0...v0.3.0
v0.2.0
What's Changed
- Add logo by @mickel8 in #70
- Add support for TWCC feedbacks by @LVala in #63
- Allow
MediaStreamTrack.t()as a parameter tosend_rtp/3by @srcrip in #72 - Fix invalid order of return values from `TWCCRecorder.get_feedback/1 by @LVala in #73
- Move functions modyfing
RTPSenderout ofPeerConnectionby @LVala in #75 - adding rtcp processing example by @themusicman in #76
- Add support for RTCP Receiver Reports by @LVala in #77
- Add support for RTCP Sender Reports by @LVala in #78
- Update bidirectional connection example in the transceiver guide by @mickel8 in #79
- Fix SDPUtils.get_dtls_role/1. Handle multiple Group attributes. by @mickel8 in #82
- Allow for setting custom controlling process by @mickel8 in #84
- Add local/remote ICE candidates to current/pending description. by @LVala in #83
- Fix get_all_running/0 test by @mickel8 in #85
- Fix
TWCCRecorderbase timestamp evaluation bug by @LVala in #86 - Sending RTCP Reports by @LVala in #81
- Use normalized comparison in PeerConnection.Configuration.supported_codec?/2 by @clone1018 in #87
- Fix issue with not-updating RTP header extensions on remote description by @LVala in #89
- Allow
add_ice_candidatewhencurrent_remote_descriptionis not set by @LVala in #92 - Improve CI by @LVala in #91
- Generate NACKs and handle incoming RTX packets by @LVala in #90
- Handle incoming data before receiving an answer by @LVala in #95
- Add ice_gathering_state_change event by @mickel8 in #96
- Change controlling process spec to
Process.dest()by @LVala in #97 - Add WHEP from file example by @clone1018 in #88
- Add
send_plifunction by @LVala in #99 - Allow to pass GenServer opts to the PeerConnection by @mickel8 in #98
- Add outbound RTX by @LVala in #101
- Adjustments for BUNDLE group. Update ex_ice. by @mickel8 in #102
- Update
README.mdby @LVala in #103 - Improve the structs in the API, add docs by @LVala in #104
- Accept padding packets in VP8 depayloader by @mickel8 in #106
- Release
0.2.0by @LVala in #105
New Contributors
- @srcrip made their first contribution in #72
- @themusicman made their first contribution in #76
- @clone1018 made their first contribution in #87
Full Changelog: v0.1.0...v0.2.0