- Update
Catch
to 2.13.5. - Update NPM deps.
SimulcastConsumer
: Fix miscalculation when increasing layer (PR #541 by @penguinol).- Rust version with thread-based worker (PR #540).
- Update NPM deps.
- Welcome to
mediasoup-rust
! Authored by @nazar-pc (PRs #518 and #533). - Update NPM deps.
- Update
usrsctp
.
- Fix crash if empty
fingerprints
array is given inwebrtcTransport.connect()
(issue #537).
Producer
: Add new stats field 'rtxPacketsDiscarded' (PR #536).
XxxxConsumer.hpp
: makeIsActive()
returntrue
(even ifProducer
's score is 0) when DTX is enabled (PR #534 due to issue #532).- Update NPM deps.
- Fix crash (regression, issue #529).
- Add missing
delete cb
that otherwise would leak (PR #527 based on PR #526 by @vpalmisano). router.pipeToRouter()
: Fix possible inconsistency inpipeProducer.paused
status (as discussed in this thread in the mediasoup forum).- Update
nlohmann/json
to 3.9.1. - Update
usrsctp
. - Update NPM deps.
- Enhance Jitter calculation.
- Fix notifications from
mediasoup-worker
being processed before responses received before them (issue #501).
- Move
bufferedAmount
fromdataConsumer.dump()
todataConsumer.getStats()
. - Update NPM deps.
- Add
pipe
option totransport.consume()
(PR #494).- So the receiver will get all streams from the
Producer
. - It works for any kind of transport (but
PipeTransport
which is always like this).
- So the receiver will get all streams from the
- Update NPM deps.
- Add
LICENSE
andPATENTS
files inlibwebrtc
dependency (issue #495). - Added
worker/src/Utils/README_BASE64_UTILS
(issue #497). - Update
Catch
to 2.13.4. - Update
usrsctp
.
- Fix wrong message about
rtcMinPort
andrtcMaxPort
. - Update deps.
- Improve
EnhancedEventEmitter.safeAsPromise()
(although not used).
- Fix replacement of
__MEDIASOUP_VERSION__
inlib/index.d.ts
(issue #483). - Update NPM deps.
worker/scripts/configure.py
: Handle 'mips64' (PR #485).
- Update NPM deps.
- Allow the
mediasoup-worker
process to inherit all environment variables (issue #480).
- BWE tweaks and debug logs.
- Update NPM deps.
- Update
Catch
to 2.13.2. - Update NPM deps.
- sctp fixes #479.
- Update
awaitqueue
dependency.
- Fix yet another memory leak in Node.js layer due to
PayloadChannel
event listener not being removed. - Update NPM deps.
Transport.cpp
: Provide transport congestion client with RTCP Receiver Reports (#464).- Update
libuv
to 1.40.0. - Update Node deps.
SctpAssociation.cpp
: increasesctpBufferedAmount
before sending any data (#472).
- Fix memory leak in Node.js layer due to
PayloadChannel
event listener not being removed (related to #463).
- Remove
-fwrapv
when building mediasoup-worker inDebug
mode (issue #460). - Add
MEDIASOUP_MAX_CORES
to limitNUM_CORES
during mediasoup-worker build (PR #462).
- Update
usrsctp
dependency. - Update
typescript-eslint
deps. - Update Node deps.
- Fix
ortc.getConsumerRtpParameters()
RTX codec comparison issue (PR #453). - RtpObserver: expose
RtpObserverAddRemoveProducerOptions
foraddProducer()
andremoveProducer()
methods.
- Update
libuv
to 1.39.0. - Update Node deps.
- SimulcastConsumer: Prefer the highest spatial layer initially (PR #450).
- RtpStreamRecv: Set RtpDataCounter window size to 6 secs if DTX (#451)
SctpAssociation.cpp
: FixOnSctpAssociationBufferedAmount()
call.- Update deps.
- New API to send data from Node throught SCTP DataConsumer.
- Avoid SRTP leak by deleting invalid SSRCs after STRP decryption (issue #437, thanks to @penguinol for reporting).
- Update
usrsctp
dep. - DataConsumer 'bufferedAmount' implementation (PR #442).
- Fix
usrsctp
vulnerability (PR #439). - Fix issue #435 (thanks to @penguinol for reporting).
TransportCongestionControlClient.cpp
: Enable periodic ALR probing to recover faster from network issues.- Update NPM deps.
- Update
nlohmann::json
C++ dep to 3.9.0. - Update
Catch
to 2.13.0.
- RTP on
DirectTransport
(issue #433, PR #434):- New API
producer.send(rtpPacket: Buffer)
. - New API
consumer.on('rtp', (rtpPacket: Buffer)
. - New API
directTransport.sendRtcp(rtcpPacket: Buffer)
. - New API
directTransport.on('rtcp', (rtpPacket: Buffer)
.
- New API
- Release script.
Transport
: renamemaxSctpSendBufferSize
tosctpSendBufferSize
.
Transport
: ImplementmaxSctpSendBufferSize
.- Update
libuv
to 1.38.1. - Update
Catch
to 2.12.4. - Update NPM deps.
Transport::ReceiveRtpPacket()
: CallRecvStreamClosed(packet->GetSsrc())
if received RTP packet does not match anyProducer
.Transport::HandleRtcpPacket()
: EnsureConsumer
is found for received NACK Feedback packets.- Update NPM deps.
- Update C++
Catch
dep. - Fix issue #408.
- Fix SRTP leak due to streams not being removed when a
Producer
orConsumer
is closed.- PR #428 (fixes issues #426).
- Credits to credits to @penguinol for reporting and initial work at PR #427.
- Update
nlohmann::json
C++ dep to 3.8.0. - C++: Enhance
const
correctness. - Update NPM deps.
ConsumerScore
: AddproducerScores
, scores of all RTP streams in the producer ordered by encoding (just useful when the producer uses simulcast).- PR #421 (fixes issues #420).
- Hide worker executable console in Windows.
- PR #419 (credits to @BlueMagnificent).
RtpStream.cpp
: Fix wrongstd::round()
usage.- Issue #423.
- Update
usrsctp
library. - Update ESlint and TypeScript related dependencies.
- Set
score:0
whendtx:true
is set in anencoding
and there is no RTP for some seconds for that RTP stream.- Fixes #415.
gyp
: Fix CLT version detection in OSX Catalina when XCode app is not installed.- PR #413 (credits to @enimo).
- Modernize TypeScript.
- Fix crash in
Transport.ts
when closing aDataConsumer
created on aDirectTransport
.
- Export new
DirectTransport
intypes
. - Make
DataProducerOptions
optional (not needed when in aDirectTransport
).
- SCTP/DataChannel termination:
- PR #409
- Allow the Node application to directly send text/binary messages to mediasoup-worker C++ process so others can consume them using
DataConsumers
. - And vice-versa: allow the Node application to directly consume in Node messages send by
DataProducers
.
- Add
WorkerLogTag
TypeScript enum and also add a new 'message' tag into it.
- Simulcast and SVC: Better computation of desired bitrate based on
maxBitrate
field in theproducer.rtpParameters.encodings
.
- Update deps, specially
uuid
and@types/uuid
that had a TypeScript related bug. TransportCongestionClient.cpp
: Improve sender side bandwidth estimation by do not reportingthis->initialAvailableBitrate
as available bitrate due to strange behavior in the algorithm.
- Simplify
GetDesiredBitrate()
inSimulcastConsumer
andSvcConsumer
. - Update libuv to 1.38.0.
SeqManager.cpp
: Improve performance.- PR #398 (credits to @penguinol).
SeqManager.cpp
: Fix a bug and improve performance.- Fixes issue #395 via PR #396 (credits to @penguinol).
- Drop Node.js 8 support. Minimum supported Node.js version is now 10.
- Upgrade
eslint
andjest
major versions.
SimulcastConsumer.cpp
: FixIncreaseLayer()
method (fixes #394).- Udpate Node deps.
libwebrtc
: Apply patch by @sspanak and @Ivaka to avoid crash. Related issue: #357.PortManager.cpp
: Do not useUV_UDP_RECVMMSG
in Windows due to a bug in libuv 1.37.0.- Update Node deps.
- Enable
UV_UDP_RECVMMSG
:- Upgrade libuv to 1.37.0.
- Use
uv_udp_init_ex()
withUV_UDP_RECVMMSG
flag. - Add our own
uv.gyp
now that libuv has removed support for GYP (fixes #384).
- Fix crash in mediasoup-worker due to conversion from
uint64_t
toint64_t
(used withinlibwebrtc
code. Fixes #357. - Update
usrsctp
library. - Update Node deps.
SeqManager.cpp
: Fix video lag after a long time.- Fixes #372 (thanks @penguinol for reporting it and giving the solution).
UdpSocket.cpp
: Revertuv__udp_recvmmsg()
usage since it notifies about received UDP packets in reverse order. Feature on hold until fixed.
Transport.cpp
: Enable transport congestion client for the first video Consumer, no matter it's uses simulcast, SVC or a single stream.- Update libuv to 1.35.0.
UdpSocket.cpp
: Ensure the new libuv'suv__udp_recvmmsg()
is used, which is more efficient.
PlainTransport
: RemovemultiSource
option. It was a hack nobody should use.
- Enable MID RTP extension in mediasoup to receivers direction (for consumers).
- This requires mediasoup-client 3.5.2 to work.
PlainTransport
: Fix event name: 'rtcpTuple' => 'rtcptuple'.
PipeTransport
: Add support for SRTP and RTP retransmission (RTX + NACK). Useful when connecting two mediasoup servers running in different hosts via pipe transports.PlainTransport
: Add support for SRTP.- Rename
PlainRtpTransport
toPlainTransport
everywhere (classes, methods, TypeScript types, etc). Keep previous names and mark them as DEPRECATED. - Fix vulnarability in IPv6 parser.
- Update
uuid
dep to 7.0.X (new API). - Fix crash due wrong array index in
PipeConsumer::FillJson()
.- Fixes #364
- TypeScript: generate
es2020
instead ofes6
. - Update
usrsctp
library.- Fixes #362 (thanks @chvarlam for reporting it).
IceServer.cpp
: Reject received STUN Binding request with 487 if remote peer indicates ICE-CONTROLLED into it.
ProducerOptions
: RenamekeyFrameWaitTime
option tokeyFrameRequestDelay
and make it work as expected.
- Add
Utils::Json::IsPositiveInteger()
to not rely onis_number_unsigned()
of json lib, which is unreliable due to its design. - Avoid ES6
export default
and always use namedexport
. router.pipeToRouter()
: Ensure a singlePipeTransport
pair is created betweenrouter1
androuter2
.- Since the operation is async, it may happen that two simultaneous calls to
router1.pipeToRouter({ producerId: xxx, router: router2 })
would end up generating two pairs ofPipeTranports
. To prevent that, let's use an async queue.
- Since the operation is async, it may happen that two simultaneous calls to
- Add
keyFrameWaitTime
option toProducerOptions
. - Update Node and C++ deps.
libsrtp.gyp
: Fix regression in mediasoup for Windows.libsrtp.gyp
: Modernize it based on the newBUILD.gn
in Chromium.libsrtp.gyp
: Don't include "test" and other targets.- Assume
HAVE_INTTYPES_H
,HAVE_INT8_T
, etc. in Windows. - Issue details: sctplab/usrsctp#353
gyp
dependency: Add support for Microsoft Visual Studio 2019.- Modify our own
gyp
sources to fix the issue. - CL uploaded to GYP project with the fix.
- Issue details: sctplab/usrsctp#347
- Modify our own
PortManager.cpp
: Do not limit the number of failedbind()
attempts to 20 since it does not work well in scenarios that launch tons ofWorkers
with same port range. Instead iterate all ports in the range given to the Worker.- Do not copy
catch.hpp
intotest/include/
but make the GYPmediasoup-worker-test
target include the corresponding folder indeps/catch
.
- Update libsrtp to 2.3.0.
- Update ESLint and TypeScript deps.
- Update deps.
- Fix text in
./github/Bug_Report.md
so it no longer references the deprecated mailing list.
Transport.cpp
: Ignore RTCP SDES packets (we don't do anything with them anyway).Producer
andConsumer
stats: Always showroundTripTime
(even if calculated value is 0) after aroundTripTime
> 0 has been seen.
Transport.cpp
: Fix RTCP FIR processing:- Instead of looking at the media ssrc in the common header, iterate FIR items and look for associated
Consumers
based on ssrcs in each FIR item. - Fixes #350 (thanks @j1elo for reporting and documenting the issue).
- Instead of looking at the media ssrc in the common header, iterate FIR items and look for associated
SctpAssociation.cpp
: Improve/fix logs.- Improve Node
EventEmitter
events inline documentation. test-node-sctp.js
: Wait for SCTP association to be open before sending data.
- Improve mediasoup-worker build system by using
sh
instead ofbash
and default to 4 cores (thanks @smoke, PR #349).
- Add
worker.getResourceUsage()
API. - Update OpenSSL to 1.1.1d.
- Update libuv to 1.34.0.
- Update TypeScript and ESLint NPM dependencies.
- Update usrsctp dependency (it fixes a potential wrong memory access).
- More details in the reported issue: sctplab/usrsctp#408
- Fix
version
getter.
SctpAssociation.cpp
: Initialize theusrsctp
socket in the class constructor. Fixes #348.
- Fix usage of a deallocated
RTC::TcpConnection
instance under heavy CPU usage due to mediasoup deleting the instance in the middle of a receiving iteration. Fixes #333.- More details in the commit: https://github.com/versatica/mediasoup/commit/49824baf102ab6d2b01e5bca565c29b8ac0fec22
- IPv6 fix: Use
INET6_ADDRSTRLEN
instead ofINET_ADDRSTRLEN
.
- Add
consumer.setPriority()
andconsumer.priority
API to prioritize how the estimated outgoing bitrate in a transport is distributed among all video consumers (in case there is not enough bitrate to satisfy them). - Make video
SimpleConsumers
play the BWE game by helping in probation generation and bitrate distribution. - Add
consumer.preferredLayers
getter. - Rename
enablePacketEvent()
and "packet" event toenableTraceEvent()
and "trace" event (sorry SEMVER). - Transport: Add a new "trace" event of type "bwe" with detailed information about bitrates.
- Improve "packet" event by not firing both "keyframe" and "rtp" types for the same RTP packet.
- Add type "keyframe" as a valid type for "packet" event in
Producers
andConsumers
.
- Add transport-cc bandwidth estimation and congestion control in sender and receiver side.
- Run in Windows.
- Rewrite to TypeScript.
- Tons of improvements.
- Fix TCP leak (#325).
PlainRtpTransport
: Fix comedia mode.
RateCalculator
: improve efficiency inGetRate()
method (#324).
RtpDataCounter
: use window size of 2500 ms instead of 1000 ms.- Fixes false "lack of RTP" detection in some screen sharing usages with simulcast.
- Fixes #312.
- Add RTCP Extended Reports for RTT calculation on receiver RTP stream (thanks @yangjinechofor for initial pull request #314).
- Make mediasoup-worker compile in Armbian Debian Buster (thanks @krishisola, fixes #321).
- Add DataChannel support via DataProducers and DataConsumers (#10).
- SRTP: Add support for AEAD GCM (#320).
PipeConsumer.cpp
: Fix RTCP generation (thanks @vpalmisano).
- VP8 and H264: Fix regression in 3.1.5 that produces lot of changes in current temporal layer detection.
- VP8 and H264: Allow packets without temporal layer information even if N temporal layers were announced.
- Add
-fPIC
incflags
to compile in x86-64. Fixes #315.
- Set the sender SSRC on PLI and FIR requests related thread.
- Workaround to detect H264 key frames when Chrome uses external encoder (related issue). Fixes #313.
- Improve
GetBitratePriority()
method inSimulcastConsumer
andSvcConsumer
by checking the total bitrate of all temporal layers in a given producer stream or spatial layer.
- Add SVC support. It includes VP9 full SVC and VP9 K-SVC as implemented by libwebrtc.
- Prefer Python 2 (if available) over Python 3. This is because there are yet pending issues with gyp + Python 3.
- Do not require Python 2 to compile mediasoup worker (#207). Both Python 2 and 3 can now be used.
- Codecs: Improve temporal layer switching in VP8 and H264.
- Skip worker compilation if
MEDIASOUP_WORKER_BIN
environment variable is given (#309). This makes it possible to install mediasoup in platforms in which, somehow, gcc > 4.8 is not available duringnpm install mediasoup
but it's available later. - Fix
RtpStreamRecv::TransmissionCounter::GetBitrate()
.
parseScalabilityMode()
: allow "S" as spatial layer (and not just "L"). "L" means "dependent spatial layer" while "S" means "independent spatial layer", which is used in K-SVC (VP9, AV1, etc).
RtpStreamSend::ReceiveRtcpReceiverReport()
: improvertt
calculation if no Sender Report info is reported in received Received Report.- Update libuv to version 1.29.1.
- VP8 & H264: Improve temporal layer switching.
- RTP frame-marking: Add some missing checks.
- Fix regression in proxied RTP header extensions.
- Add support for frame-marking RTP extensions and use it to enable temporal layers switching in H264 codec (#305).
- Improve RTP probation for simulcast/svc consumers by using proper RTP retransmission with increasing sequence number.
- Simulcast: Improve timestamps extra offset handling by having a map of extra offsets indexed by received timestamps. This helps in case of packet retransmission.
- Simulcast: proper RTP stream switching by rewriting packet timestamp with a new timestamp calculated from the SenderReports' NTP relationship.
- Fix crash in
SimulcastConsumer::IncreaseLayer()
with Safari and H264 (#300).
- v3 is here!
RtpStreamSend.cpp
: Fix a crash inStorePacket()
when it receives an old packet and there is no space left in the storage buffer (thanks to zkfun for reporting it and providing us with the solution).- Update deps.
- Fix usage of a deallocated
RTC::TcpConnection
instance under heavy CPU usage due to mediasoup deleting the instance in the middle of a receiving iteration.
- Improve build system by using all available CPU cores in parallel.
- Don't mandate server port range to be >= 99.
- Fix NACK retransmissions.
- Fix TCP leak (#325).
- Make mediasoup-worker compile in Armbian Debian Buster (thanks @krishisola, fixes #321).
- Update deps.
- Fix RTCP Receiver Report handling.
- Update deps.
- Simulcast: Increase profiles one by one unless explicitly forced (fixes #188).
PlainRtpTransport.js
: Add missing methods and events.
- Remove a potential crash if a single
encoding
is given in the ProducerrtpParameters
and it has aprofile
value.
- C++: Verify in libuv static callbacks that the associated C++ instance has not been deallocated (thanks @artushin and @mariat-atg for reporting and providing valuable help in #258).
- Fix wrong destruction of Transports in Router.cpp that generates 100% CPU usage in mediasoup-worker processes.
- Fix a port leak when a WebRtcTransport is remotely closed due to a DTLS close alert (thanks @artushin for reporting it in #259).
- RtpPacket: Fix Two-Byte header extensions parsing.
- Upgrade again to OpenSSL 1.1.0j (20 Nov 2018) after adding a workaround for issue #257.
- Downgrade OpenSSL to version 1.1.0h (27 Mar 2018) until issue #257 is fixed.
- C++: Remove all
Destroy()
class methods and no longer dodelete this
. - Update libuv to 1.24.1.
- Update OpenSSL to 1.1.0g.
- worker: Internal refactor and code cleanup.
- Remove announced support for certain RTCP feedback types that mediasoup does nothing with (and avoid forwarding them to the remote RTP sender).
- fuzzer: fix some wrong memory access in
RtpPacket::Dump()
andStunMessage::Dump()
(just used during development).
- Integrate libFuzzer into mediasoup (documentation in the
doc
folder). Extensive testing done. Several heap-buffer-overflow and memory leaks fixed.
Producer.cpp
: RemoveUpdateRtpParameters()
. It was broken since Consumers were not notified about profile removed and so on, so they may crash.Producer.cpp: Remove some maps and simplify streams handling by having a single
mapSsrcRtpStreamInfo. Just keep
mapActiveProfilesbecause
GetActiveProfiles()` method needs it.Producer::MayNeedNewStream()
: Ignore new media streams with new SSRC if its RID is already in use by other media stream (fixes #235).- Fix a bad memory access when using two byte RTP header extensions.
Server.js
: If a worker crashes make sure_latestWorkerIdx
becomes 0.
server.Room()
: Assign workers incrementally or explicitly via newworkerIdx
argument.- Add
server.numWorkers
getter.
- Don't announce
muxId
nor RTP MID extension support inConsumer
RTP parameters.
- Enable RTP MID extension again.
- Disable RTP MID extension until #230 is fixed.
- Add RTP MID extension support.
- Do not close
Transport
on ICE disconnected (as it would prevent ICE restart on "recv" TCP transports).
- Improve codec matching.
- Fix audio codec matching when
channels
parameter is not given.
- Make
PlainRtpTransport
not leak if port allocation fails (related issue #224).
- Fix a crash in when no more RTP ports were available (see related issue #222).
- Update dependencies.
- Allow non WebRTC peers to create plain RTP transports (no ICE/DTLS/SRTP but just plain RTP and RTCP) for sending and receiving media.
- Fix C++ syntax to avoid an error when building the worker with clang 8.0.0 (OSX 10.11.6).
Channel.js
: UpgradeREQUEST_TIMEOUT
to 20 seconds to avoid timeout errors when the Node or worker thread usage is too high (related to this issue).
- H264: Check if there is room for the indicated NAL unit size (thanks @ggarber).
- H264: Code cleanup.
- Add new "spy" feature. A "spy" peer cannot produce media and is invisible for other peers in the room.
- Fix H264 simulcast by properly detecting when the profile switching should be done.
- Fix a crash in
Consumer::GetStats()
(see related issue #196).
- Add H264 simulcast capability.
- Avoid calling deprecated (NOOP)
SSL_CTX_set_ecdh_auto()
function in OpenSSL >= 1.1.0.
- Fix #4: Avoid DTLS handshake fragmentation.
- Fix #196: Crash in
Consumer::getStats()
due to wrongtargetProfile
.
- Improve issue #209.
- Fix #209:
DtlsTransport
: don't crash when signaled fingerprint and DTLS fingerprint do not match (thanks @yangjinecho for reporting it).
- Update Node and C/C++ dependencies.
- Add
localIP
option forroom.createRtpStreamer()
andtransport.startMirroring()
PR #199.
- Improve C++ usage (remove "warning: missing initializer for member" [-Wmissing-field-initializers]).
- Update Travis-CI settings.
- Make
PlainRtpTransport
also send RTCP SR/RR reports (thanks @artushin for reporting).
- Fix #193:
preferTcp
not honored (thanks @artushin).
- Avoid crash when no remote IP/port is given.
- Add
handled
andunhandled
events toConsumer
.
- Fix #185: Consumer: initialize effective profile to 'NONE' (thanks @artushin).
- Fix #186: NackGenerator code being executed after instance deletion (thanks @baiyufei).
- Fix #183: Always reset the effective
Consumer
profile when removed (thanks @thehappycoder).
- Make ICE+DTLS more flexible by allowing sending DTLS handshake when ICE is just connected.
- Disable stats periodic retrieval also on remote closure of
Producer
andWebRtcTransport
.
- Fix #180: Added missing include
cmath
so thatstd::round
can be used (thanks @jacobEAdamson).
- Fix #173: Avoid buffer overflow in
()
(thanks @lightmare). - Improve stream layers management in
Consumer
by using the newRtpMonitor
class.
- Fix #164: Sometimes video freezes forever (no RTP received in browser at all).
- Fix #160: Assert error in
RTC::Consumer::GetStats()
.
- Fix #159: Don’t rely on VP8 payload descriptor flags to assure the existence of data.
- Fix #160: Reset
targetProfile
when the corresponding profile is removed.
- worker: Fix crash when VP8 payload has no
PictureId
.
- worker: Remove wrong
assert
onProducer::DeactivateStreamProfiles()
.
- Update README file.
- New design based on
Producers
andConsumer
plus a mediasoup protocol and the mediasoup-client client side SDK.
- Fix a crash due to RTX packet processing while the associated
NackGenerator
is not yet created.
- Habemus RTX (RFC 4588) for proper RTP retransmission.
- Fix an issue in
buffer.toString()
that makes mediasoup fail in Node 8. - Update libuv to version 1.12.0.
- Add support for ICE renomination.
- Fix a SDP negotiation issue when the remote peer does not have compatible codecs.
- Add video codecs supported by Microsoft Edge.
RtpReceiver
: generate RTCP PLI when "rtpraw" or "rtpobject" event listener is set.
RtpReceiver
: fix an error producing packets when "rtpobject" event is set.
RtpSender
: allowdisable()
/enable()
without forcing SDP renegotiation (#114).
- Add
Room.on('audiolevels')
event.
- Set a maximum value of 1500 bytes for packet storage in
RtpStreamSend
.
- Avoid possible segfault if
RemoteBitrateEstimator
generates a bandwidth estimation with zero SSRCs.
- First stable release.