Full Code of meetecho/janus-gateway for AI

master a35984146b01 cached
457 files
7.4 MB
2.0M tokens
2441 symbols
1 requests
Download .txt
Showing preview only (7,802K chars total). Download the full file or copy to clipboard to get everything.
Repository: meetecho/janus-gateway
Branch: master
Commit: a35984146b01
Files: 457
Total size: 7.4 MB

Directory structure:
gitextract_t9bs5ubo/

├── .editorconfig
├── .gitattributes
├── .github/
│   ├── CONTRIBUTING.md
│   ├── ISSUE_TEMPLATE/
│   │   ├── config.yml
│   │   ├── janus-0-x-issue--legacy-.md
│   │   └── janus-1-x-issue--multistream-.md
│   └── workflows/
│       └── janus-ci.yml
├── .gitignore
├── CHANGELOG.md
├── COPYING
├── Makefile.am
├── README.md
├── SECURITY.md
├── autogen.sh
├── bower.json
├── conf/
│   ├── janus.eventhandler.gelfevh.jcfg.sample
│   ├── janus.eventhandler.mqttevh.jcfg.sample
│   ├── janus.eventhandler.nanomsgevh.jcfg.sample
│   ├── janus.eventhandler.rabbitmqevh.jcfg.sample
│   ├── janus.eventhandler.sampleevh.jcfg.sample
│   ├── janus.eventhandler.wsevh.jcfg.sample
│   ├── janus.jcfg.sample.in
│   ├── janus.logger.jsonlog.jcfg.sample
│   ├── janus.plugin.audiobridge.jcfg.sample
│   ├── janus.plugin.duktape.jcfg.sample.in
│   ├── janus.plugin.echotest.jcfg.sample
│   ├── janus.plugin.lua.jcfg.sample.in
│   ├── janus.plugin.nosip.jcfg.sample
│   ├── janus.plugin.recordplay.jcfg.sample.in
│   ├── janus.plugin.sip.jcfg.sample
│   ├── janus.plugin.streaming.jcfg.sample.in
│   ├── janus.plugin.textroom.jcfg.sample
│   ├── janus.plugin.videocall.jcfg.sample
│   ├── janus.plugin.videoroom.jcfg.sample
│   ├── janus.transport.http.jcfg.sample
│   ├── janus.transport.mqtt.jcfg.sample
│   ├── janus.transport.nanomsg.jcfg.sample
│   ├── janus.transport.pfunix.jcfg.sample
│   ├── janus.transport.rabbitmq.jcfg.sample
│   └── janus.transport.websockets.jcfg.sample
├── configure.ac
├── docs/
│   ├── Makefile.am
│   ├── doxy-boot.js
│   ├── footer.html
│   ├── header.html
│   └── janus-doxygen.cfg
├── emacs.el
├── eslint.config.mjs
├── fuzzers/
│   ├── build.sh
│   ├── config.sh
│   ├── corpora/
│   │   ├── rtcp_fuzzer/
│   │   │   ├── 1meetecho/
│   │   │   │   ├── fir.rtcp
│   │   │   │   ├── nacks.rtcp
│   │   │   │   ├── pli.rtcp
│   │   │   │   ├── remb.rtcp
│   │   │   │   ├── rr-remb.rtcp
│   │   │   │   ├── rr-sdes-bye.rtcp
│   │   │   │   ├── rr.rtcp
│   │   │   │   ├── rtcp_fuzzer-crash-1640b2f21ba20409d930e9653052d579d450073a
│   │   │   │   ├── rtcp_fuzzer-crash-16b8706455b637b7696aeb56ed40dad8f90d81d0
│   │   │   │   ├── rtcp_fuzzer-crash-17ccf761d298d6a703f71627197c5f1adcf57140
│   │   │   │   ├── rtcp_fuzzer-crash-3762f3b9f11328e939e577de46e20a3fb0ccc324
│   │   │   │   ├── rtcp_fuzzer-crash-461a0e9201a7ea5ea6a43511571bdafce10b8185
│   │   │   │   ├── rtcp_fuzzer-crash-7257232c6e9efe6362b921117ad3cd5d8170ec0d
│   │   │   │   ├── rtcp_fuzzer-crash-75a5a7739802ac20cbe2937d6206348ffde23605
│   │   │   │   ├── rtcp_fuzzer-crash-85b6e5d82d61837df67df0e333cb2392044a47c6
│   │   │   │   ├── rtcp_fuzzer-crash-c7a1f348bd6f9422caeb41079e46331551fd2587
│   │   │   │   ├── rtcp_fuzzer-crash-daf57e58c2552e5cf091b0b92aa9f4ab2d4a5b4a
│   │   │   │   ├── rtcp_fuzzer-timeout-78336d26b8a4ac47c13f6f363a37bc320e582e3b
│   │   │   │   ├── sr-sdes.rtcp
│   │   │   │   └── twcc-feedback.rtcp
│   │   │   └── 2webrtc/
│   │   │       ├── 0.rtcp
│   │   │       ├── 1.rtcp
│   │   │       ├── 10.rtcp
│   │   │       ├── 11.rtcp
│   │   │       ├── 12.rtcp
│   │   │       ├── 13.rtcp
│   │   │       ├── 14.rtcp
│   │   │       ├── 15.rtcp
│   │   │       ├── 16.rtcp
│   │   │       ├── 17.rtcp
│   │   │       ├── 18.rtcp
│   │   │       ├── 19.rtcp
│   │   │       ├── 2.rtcp
│   │   │       ├── 20.rtcp
│   │   │       ├── 21.rtcp
│   │   │       ├── 22.rtcp
│   │   │       ├── 23.rtcp
│   │   │       ├── 24.rtcp
│   │   │       ├── 25.rtcp
│   │   │       ├── 26.rtcp
│   │   │       ├── 27.rtcp
│   │   │       ├── 28.rtcp
│   │   │       ├── 29.rtcp
│   │   │       ├── 3.rtcp
│   │   │       ├── 30.rtcp
│   │   │       ├── 31.rtcp
│   │   │       ├── 32.rtcp
│   │   │       ├── 33.rtcp
│   │   │       ├── 34.rtcp
│   │   │       ├── 35.rtcp
│   │   │       ├── 36.rtcp
│   │   │       ├── 37.rtcp
│   │   │       ├── 38.rtcp
│   │   │       ├── 39.rtcp
│   │   │       ├── 4.rtcp
│   │   │       ├── 40.rtcp
│   │   │       ├── 41.rtcp
│   │   │       ├── 42.rtcp
│   │   │       ├── 43.rtcp
│   │   │       ├── 44.rtcp
│   │   │       ├── 45.rtcp
│   │   │       ├── 46.rtcp
│   │   │       ├── 47.rtcp
│   │   │       ├── 48.rtcp
│   │   │       ├── 49.rtcp
│   │   │       ├── 5.rtcp
│   │   │       ├── 50.rtcp
│   │   │       ├── 51.rtcp
│   │   │       ├── 52.rtcp
│   │   │       ├── 53.rtcp
│   │   │       ├── 54.rtcp
│   │   │       ├── 55.rtcp
│   │   │       ├── 56.rtcp
│   │   │       ├── 57.rtcp
│   │   │       ├── 58.rtcp
│   │   │       ├── 59.rtcp
│   │   │       ├── 6.rtcp
│   │   │       ├── 60.rtcp
│   │   │       ├── 61.rtcp
│   │   │       ├── 62.rtcp
│   │   │       ├── 63.rtcp
│   │   │       ├── 64.rtcp
│   │   │       ├── 65.rtcp
│   │   │       ├── 66.rtcp
│   │   │       ├── 7.rtcp
│   │   │       ├── 8.rtcp
│   │   │       ├── 9.rtcp
│   │   │       └── LICENSE
│   │   ├── rtp_fuzzer/
│   │   │   ├── 1meetecho/
│   │   │   │   ├── rtp_0_audio-with-ext
│   │   │   │   ├── rtp_1_video-with-ext
│   │   │   │   ├── rtp_fuzzer-crash-15d89650c0a728a6431c10c3adeb8e9a2484af83
│   │   │   │   ├── rtp_fuzzer-crash-1e7e56a8894a7dc2c735a0732429930f4e4a9232
│   │   │   │   ├── rtp_fuzzer-crash-24444c8966d82f286b2fdc85f82ba506fa863601
│   │   │   │   ├── rtp_fuzzer-crash-3370e3932c251e50c77607b59a5f15d9e2677162
│   │   │   │   ├── rtp_fuzzer-crash-42d33714b6275c8c7d33d2aae456dc98cff7179c
│   │   │   │   ├── rtp_fuzzer-crash-42df1e99b29f5c2e2a881c257a31ab3a3e76c650
│   │   │   │   ├── rtp_fuzzer-crash-4977c993381e813c89acf302b8a758bad10e261a
│   │   │   │   ├── rtp_fuzzer-crash-5b35219e5f366ac6577599c82bc54cc33f7bbba4
│   │   │   │   ├── rtp_fuzzer-crash-5c50f0b2a9cf96bfb714d60d8f5e9e5c3131b7ea
│   │   │   │   ├── rtp_fuzzer-crash-6182bab7f385f555b8503bd8ebbb344722dcb7fe
│   │   │   │   ├── rtp_fuzzer-crash-6d9f1846dbb7acbe5dcb70623e5ac9ade871de1a
│   │   │   │   ├── rtp_fuzzer-crash-7e2d460edd5d5d7f5548922f10489f468d1638bf
│   │   │   │   ├── rtp_fuzzer-crash-7e3b3351f85a64bf0932a9ec7faca66717991c0f
│   │   │   │   ├── rtp_fuzzer-crash-9b6dfaedb1a8baca07492a8be205582db2e81ae3
│   │   │   │   ├── rtp_fuzzer-crash-9f2f88ca49f28cb28131b89110bf822b373ddd56
│   │   │   │   ├── rtp_fuzzer-crash-af6dff495b4c6b06250561160b019a33de972478
│   │   │   │   ├── rtp_fuzzer-crash-b1bc002713327153b0fa53f64015df8526fe5279
│   │   │   │   ├── rtp_fuzzer-crash-b9a848d594a7b1d0a0d698d10d2fed4f2f96c038
│   │   │   │   ├── rtp_fuzzer-crash-ba25a83b65e08f750cf832e205e16f1d298ea614
│   │   │   │   ├── rtp_fuzzer-crash-c14c0b082685dee2e98ab564c39883932f869cdd
│   │   │   │   ├── rtp_fuzzer-crash-cfa7e784e21f69b78ddae212c639a02c92362430
│   │   │   │   └── rtp_fuzzer-crash-f1f1d6ead517a580e441a71350118035b3d16d3e
│   │   │   └── 2webrtc/
│   │   │       ├── rtp-0
│   │   │       ├── rtp-1
│   │   │       ├── rtp-2
│   │   │       ├── rtp-3
│   │   │       ├── rtp-4
│   │   │       ├── rtp-5
│   │   │       ├── rtp-6
│   │   │       └── rtp-7
│   │   └── sdp_fuzzer/
│   │       ├── 1meetecho/
│   │       │   ├── sdp_fuzzer-timeout-26f23f1364a16565e2f339c3297f71c275b6b0cf
│   │       │   └── sdp_fuzzer-timeout-80e8c427e72e9f33f02c8a088caab69d9d97702c
│   │       └── 2webrtc/
│   │           ├── 10.sdp
│   │           ├── 11.sdp
│   │           ├── 12.sdp
│   │           ├── 13.sdp
│   │           ├── 14.sdp
│   │           ├── 15.sdp
│   │           ├── 16.sdp
│   │           ├── 17.sdp
│   │           ├── 18.sdp
│   │           ├── 19.sdp
│   │           ├── 2.sdp
│   │           ├── 20.sdp
│   │           ├── 21.sdp
│   │           ├── 22.sdp
│   │           ├── 23.sdp
│   │           ├── 24.sdp
│   │           ├── 25.sdp
│   │           ├── 26.sdp
│   │           ├── 27.sdp
│   │           ├── 28.sdp
│   │           ├── 29.sdp
│   │           ├── 3.sdp
│   │           ├── 30.sdp
│   │           ├── 31.sdp
│   │           ├── 32.sdp
│   │           ├── 33.sdp
│   │           ├── 34.sdp
│   │           ├── 35.sdp
│   │           ├── 36.sdp
│   │           ├── 37.sdp
│   │           ├── 38.sdp
│   │           ├── 39.sdp
│   │           ├── 4.sdp
│   │           ├── 40.sdp
│   │           ├── 41.sdp
│   │           ├── 42.sdp
│   │           ├── 43.sdp
│   │           ├── 44.sdp
│   │           ├── 45.sdp
│   │           ├── 46.sdp
│   │           ├── 47.sdp
│   │           ├── 48.sdp
│   │           ├── 49.sdp
│   │           ├── 5.sdp
│   │           ├── 50.sdp
│   │           ├── 51.sdp
│   │           ├── 52.sdp
│   │           ├── 53.sdp
│   │           ├── 54.sdp
│   │           ├── 55.sdp
│   │           ├── 6.sdp
│   │           ├── 7.sdp
│   │           ├── 8.sdp
│   │           ├── 9.sdp
│   │           ├── firefox-1.sdp
│   │           ├── firefox-2.sdp
│   │           ├── opera-1.sdp
│   │           ├── opera-2.sdp
│   │           ├── unittest-1.sdp
│   │           ├── unittest-2.sdp
│   │           ├── unittest-3.sdp
│   │           ├── unittest-4.sdp
│   │           ├── unittest-5.sdp
│   │           ├── unittest-6.sdp
│   │           ├── unittest-7.sdp
│   │           ├── unittest-8.sdp
│   │           └── unittest-9.sdp
│   ├── engines/
│   │   └── standalone.c
│   ├── rtcp_fuzzer.c
│   ├── rtp_fuzzer.c
│   ├── run.sh
│   └── sdp_fuzzer.c
├── html/
│   ├── Makefile.am
│   ├── citeus.html
│   ├── css/
│   │   └── demo.css
│   ├── demos/
│   │   ├── admin.html
│   │   ├── admin.js
│   │   ├── audiobridge.html
│   │   ├── audiobridge.js
│   │   ├── canvas.html
│   │   ├── canvas.js
│   │   ├── devices.html
│   │   ├── devices.js
│   │   ├── e2e.html
│   │   ├── e2e.js
│   │   ├── echotest.html
│   │   ├── echotest.js
│   │   ├── index.html
│   │   ├── janus.js
│   │   ├── multiopus.html
│   │   ├── multiopus.js
│   │   ├── mvideoroom.html
│   │   ├── mvideoroom.js
│   │   ├── navbar.html
│   │   ├── nosip.html
│   │   ├── nosip.js
│   │   ├── recordplay.html
│   │   ├── recordplay.js
│   │   ├── screensharing.html
│   │   ├── screensharing.js
│   │   ├── settings.js
│   │   ├── sip.html
│   │   ├── sip.js
│   │   ├── streaming.html
│   │   ├── streaming.js
│   │   ├── surround/
│   │   │   └── ChID-BLITS-EBU.txt
│   │   ├── textroom.html
│   │   ├── textroom.js
│   │   ├── videocall.html
│   │   ├── videocall.js
│   │   ├── videoroom.html
│   │   ├── videoroom.js
│   │   ├── virtualbg.html
│   │   ├── virtualbg.js
│   │   ├── webaudio.html
│   │   └── webaudio.js
│   ├── docs/
│   │   └── index.html
│   ├── footer.html
│   ├── index.html
│   ├── navbar.html
│   └── support.html
├── janus-gateway.pc.in
├── npm/
│   ├── .gitignore
│   ├── .npmignore
│   ├── README.md
│   ├── janus.d.ts
│   ├── module.js
│   └── rollup.config.mjs
├── package.json
├── src/
│   ├── Makefile.am
│   ├── apierror.c
│   ├── apierror.h
│   ├── auth.c
│   ├── auth.h
│   ├── config.c
│   ├── config.h
│   ├── debug.h
│   ├── dtls-bio.c
│   ├── dtls-bio.h
│   ├── dtls.c
│   ├── dtls.h
│   ├── events/
│   │   ├── eventhandler.h
│   │   ├── janus_gelfevh.c
│   │   ├── janus_mqttevh.c
│   │   ├── janus_nanomsgevh.c
│   │   ├── janus_rabbitmqevh.c
│   │   ├── janus_sampleevh.c
│   │   └── janus_wsevh.c
│   ├── events.c
│   ├── events.h
│   ├── ice.c
│   ├── ice.h
│   ├── ip-utils.c
│   ├── ip-utils.h
│   ├── janus-cfgconv.1
│   ├── janus-cfgconv.c
│   ├── janus-valgrind.supp
│   ├── janus.1
│   ├── janus.c
│   ├── janus.h
│   ├── log.c
│   ├── log.h
│   ├── loggers/
│   │   ├── janus_jsonlog.c
│   │   └── logger.h
│   ├── mach_gettime.h
│   ├── mainpage.dox
│   ├── mutex.h
│   ├── options.c
│   ├── options.h
│   ├── plugins/
│   │   ├── audiobridge-deps/
│   │   │   ├── COPYING
│   │   │   ├── arch.h
│   │   │   ├── jitter.c
│   │   │   ├── os_support.h
│   │   │   ├── resample.c
│   │   │   └── speex/
│   │   │       ├── speex_jitter.h
│   │   │       ├── speex_resampler.h
│   │   │       ├── speexdsp_config_types.h
│   │   │       └── speexdsp_types.h
│   │   ├── duktape/
│   │   │   ├── echotest.js
│   │   │   └── janus-sdp.js
│   │   ├── duktape-deps/
│   │   │   ├── AUTHORS.rst
│   │   │   ├── LICENSE.txt
│   │   │   ├── duk_console.c
│   │   │   ├── duk_console.h
│   │   │   ├── duk_module_duktape.c
│   │   │   └── duk_module_duktape.h
│   │   ├── janus_audiobridge.c
│   │   ├── janus_duktape.c
│   │   ├── janus_duktape_data.h
│   │   ├── janus_duktape_extra.c
│   │   ├── janus_duktape_extra.h
│   │   ├── janus_echotest.c
│   │   ├── janus_lua.c
│   │   ├── janus_lua_data.h
│   │   ├── janus_lua_extra.c
│   │   ├── janus_lua_extra.h
│   │   ├── janus_nosip.c
│   │   ├── janus_recordplay.c
│   │   ├── janus_sip.c
│   │   ├── janus_streaming.c
│   │   ├── janus_textroom.c
│   │   ├── janus_videocall.c
│   │   ├── janus_videoroom.c
│   │   ├── lua/
│   │   │   ├── echotest.lua
│   │   │   ├── janus-logger.lua
│   │   │   ├── janus-sdp.lua
│   │   │   └── videoroom.lua
│   │   ├── plugin.c
│   │   ├── plugin.h
│   │   ├── recordings/
│   │   │   ├── 1234.nfo
│   │   │   ├── rec-sample-audio.mjr
│   │   │   └── rec-sample-video.mjr
│   │   └── streams/
│   │       ├── radio.alaw
│   │       ├── remembrance.opus
│   │       ├── test_gstreamer.sh
│   │       ├── test_gstreamer1.sh
│   │       ├── test_gstreamer1_multistream.sh
│   │       └── test_gstreamer_multistream.sh
│   ├── postprocessing/
│   │   ├── janus-pp-rec.1
│   │   ├── janus-pp-rec.c
│   │   ├── mjr2pcap.1
│   │   ├── mjr2pcap.c
│   │   ├── pcap2mjr.1
│   │   ├── pcap2mjr.c
│   │   ├── pp-av1.c
│   │   ├── pp-av1.h
│   │   ├── pp-avformat.c
│   │   ├── pp-avformat.h
│   │   ├── pp-binary.c
│   │   ├── pp-binary.h
│   │   ├── pp-g711.c
│   │   ├── pp-g711.h
│   │   ├── pp-g722.c
│   │   ├── pp-g722.h
│   │   ├── pp-h264.c
│   │   ├── pp-h264.h
│   │   ├── pp-h265.c
│   │   ├── pp-h265.h
│   │   ├── pp-l16.c
│   │   ├── pp-l16.h
│   │   ├── pp-options.c
│   │   ├── pp-options.h
│   │   ├── pp-opus-silence.h
│   │   ├── pp-opus.c
│   │   ├── pp-opus.h
│   │   ├── pp-rtp.h
│   │   ├── pp-srt.c
│   │   ├── pp-srt.h
│   │   ├── pp-webm.c
│   │   └── pp-webm.h
│   ├── record.c
│   ├── record.h
│   ├── refcount.h
│   ├── rtcp.c
│   ├── rtcp.h
│   ├── rtp.c
│   ├── rtp.h
│   ├── rtpfwd.c
│   ├── rtpfwd.h
│   ├── rtpsrtp.h
│   ├── sctp.c
│   ├── sctp.h
│   ├── sdp-utils.c
│   ├── sdp-utils.h
│   ├── sdp.c
│   ├── sdp.h
│   ├── text2pcap.c
│   ├── text2pcap.h
│   ├── transports/
│   │   ├── janus_http.c
│   │   ├── janus_mqtt.c
│   │   ├── janus_nanomsg.c
│   │   ├── janus_pfunix.c
│   │   ├── janus_rabbitmq.c
│   │   ├── janus_websockets.c
│   │   ├── transport.c
│   │   └── transport.h
│   ├── turnrest.c
│   ├── turnrest.h
│   ├── utils.c
│   ├── utils.h
│   └── version.h
└── test/
    ├── README.md
    ├── echo.py
    ├── requirements.txt
    └── test_aiortc.sh

================================================
FILE CONTENTS
================================================

================================================
FILE: .editorconfig
================================================
root = true

[*]
end_of_line = lf
indent_style = tab
trim_trailing_whitespace = true


================================================
FILE: .gitattributes
================================================
*.mulaw binary


================================================
FILE: .github/CONTRIBUTING.md
================================================
Contributing to Janus
=====================

If you really want to help, then first of all, thank you! Janus is a
project we firmly believe in, and so any contribution is more than
welcome to make it better.

If you want to open an issue, please make sure that:

1. you actually found a bug: for generic questions, use the
[Discourse](https://janus.discourse.group/)
group instead;
2. nobody opened the same bug already (do a search);
3. the issue wasn't already solved;
4. you don't paste a huge amount of text in the issue or comments: use
a service like [pastebin](https://pastebin.com/) or similar;
5. you provide a GDB stacktrace if Janus crashed on you, and/or output
from AddressSanitizer or Valgrind (more details available
[here](https://janus.conf.meetecho.com/docs/debug.html)).

If you want to contribute to the project by providing fixes, enhancements,
new features or other materials, then just clone the repo, make your changes, push to
your fork (good commit messages that explain what changed are welcome!)
and submit a pull request. Please make sure that, especially if you're
modifying the C code, you follow the same coding style we're using and
that you properly comment the code as we usually do ourselves.

That said, please beware that we do require all contributors to
<a href="https://cla.conf.meetecho.com/janus">sign the Contributor License Agreement</a>
before we can accept any code.


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: 💬 Janus Community (Discourse)
  url: https://janus.discourse.group/
  about: Please ask questions or discuss runtime problems on the group, not GitHub


================================================
FILE: .github/ISSUE_TEMPLATE/janus-0-x-issue--legacy-.md
================================================
---
name: Janus 0.x issue (legacy)
about: Open an issue related to Janus 0.x (legacy)
title: "[0.x]"
labels: legacy
assignees: ''

---

**What version of Janus is this happening on?**
Put the version and the commit identifier (available in `version.c` or from an `info` request) here

**Have you tested a more recent version of Janus too?**
Yes/no. If yes, which one. If not, why.

**Was this working before?**
If you have information on a version/commit where the issue wasn't there (e.g., the result of a `git bisect`), please provide it here.

**Is there a gdb or libasan trace of the issue?**
If you have a trace related to the issue (e.g., after a segfault), provide it as a gist/pastebin/other link here, or as a [collapsible section](https://gist.github.com/pierrejoubert73/902cc94d79424356a8d20be2b382e1ab). Do **NOT** paste logs inline. For more information on the kind of traces we may find useful, please refer to the [documentation](https://janus-legacy.conf.meetecho.com/docs/debug).

**Additional context**
Add any other context about the problem here.


================================================
FILE: .github/ISSUE_TEMPLATE/janus-1-x-issue--multistream-.md
================================================
---
name: Janus 1.x issue (multistream)
about: Open an issue related to Janus 1.x (multistream)
title: "[1.x]"
labels: multistream
assignees: ''

---

**What version of Janus is this happening on?**
Put the version and the commit identifier (available in `version.c` or from an `info` request) here

**Have you tested a more recent version of Janus too?**
Yes/no. If yes, which one. If not, why.

**Was this working before?**
If you have information on a version/commit where the issue wasn't there (e.g., the result of a `git bisect`), please provide it here.

**Is there a gdb or libasan trace of the issue?**
If you have a trace related to the issue (e.g., after a segfault), provide it as a gist/pastebin/other link here, or as a [collapsible section](https://gist.github.com/pierrejoubert73/902cc94d79424356a8d20be2b382e1ab). Do **NOT** paste logs inline. For more information on the kind of traces we may find useful, please refer to the [documentation](https://janus.conf.meetecho.com/docs/debug).

**Additional context**
Add any other context about the problem here.


================================================
FILE: .github/workflows/janus-ci.yml
================================================
name: janus-ci

on:
  push:
    branches:
      - master
      - test-ci
  pull_request:
    branches:
      - master
permissions:
  contents: read
jobs:
  build:
    runs-on: ubuntu-24.04
    strategy:
      matrix:
        compiler: [gcc, clang]
        datachannels: ["enable-datachannels", "disable-datachannels"]
        libcurl: ["enable-libcurl", "disable-libcurl"]
        include:
          - datachannels: "enable-datachannels"
            libcurl: "enable-libcurl"
            deps_from_src: "yes"
            janus_config_opts: ""
          - datachannels: "enable-datachannels"
            libcurl: "disable-libcurl"
            deps_from_src: "no"
            janus_config_opts: "--disable-aes-gcm -disable-mqtt --disable-mqtt-event-handler --disable-turn-rest-api --disable-sample-event-handler"
          - datachannels: "disable-datachannels"
            libcurl: "enable-libcurl"
            deps_from_src: "no"
            janus_config_opts: "--disable-aes-gcm -disable-mqtt --disable-mqtt-event-handler --disable-data-channels"
        exclude:
          - datachannels: "disable-datachannels"
            libcurl: "disable-libcurl"
    env:
      CC: ${{ matrix.compiler }}
    steps:
      - name: install janus apt dependencies
        run: >
          sudo apt-get update && sudo apt-get --no-install-recommends -y install
          duktape-dev
          libavcodec-dev
          libavformat-dev
          libavutil-dev
          libconfig-dev
          libglib2.0-dev
          libgirepository1.0-dev
          liblua5.3-dev
          libjansson-dev
          libmicrohttpd-dev
          libnanomsg-dev
          libogg-dev
          libopus-dev
          libpcap-dev
          librabbitmq-dev
          libsofia-sip-ua-dev
          libssl-dev
          libtool
          meson
          ninja-build
      - name: setup additional dependencies from apt
        if: ${{ matrix.deps_from_src == 'no' }}
        run: >
          sudo apt-get --no-install-recommends -y install
          libnice-dev
          libsrtp2-dev
          libusrsctp-dev
          libwebsockets-dev
      # Workaround for https://github.com/actions/runner-images/issues/11926
      - name: install cmake v3.31
        uses: jwlawson/actions-setup-cmake@v2
        with:
          cmake-version: "3.31.6"
      - name: install libcurl from apt
        if: ${{ matrix.libcurl == 'enable-libcurl' }}
        run: sudo apt-get --no-install-recommends -y install libcurl4-openssl-dev
      - name: setup python
        if: ${{ matrix.deps_from_src == 'yes' }}
        uses: actions/setup-python@v5
        with:
          python-version: "3.13"
          architecture: "x64"
      - name: checkout libnice source
        if: ${{ matrix.deps_from_src == 'yes' }}
        uses: actions/checkout@v4
        with:
          repository: libnice/libnice
          ref: master
      - name: setup libnice from sources
        if: ${{ matrix.deps_from_src == 'yes' }}
        run: |
          meson setup -Dprefix=/usr -Dlibdir=lib -Dc_args="-O0 -Wno-cast-align" \
            -Dexamples=disabled \
            -Dgtk_doc=disabled \
            -Dgstreamer=disabled \
            -Dgupnp=disabled \
            -Dtests=disabled \
            build
          ninja -C build
          sudo ninja -C build install
      - name: checkout libsrtp source
        if: ${{ matrix.deps_from_src == 'yes' }}
        uses: actions/checkout@v4
        with:
          repository: cisco/libsrtp
          ref: v2.7.0
      - name: setup libsrtp from sources
        if: ${{ matrix.deps_from_src == 'yes' }}
        run: |
          ./configure --prefix=/usr CFLAGS="-O0" \
            --disable-pcap \
            --enable-openssl
          make -j$(nproc) shared_library
          sudo make install
      - name: checkout usrsctp source
        if: ${{ matrix.datachannels == 'enable-datachannels' && matrix.deps_from_src == 'yes' }}
        uses: actions/checkout@v4
        with:
          repository: sctplab/usrsctp
          ref: master
      - name: setup usrsctp from sources
        if: ${{ matrix.datachannels == 'enable-datachannels' && matrix.deps_from_src == 'yes' }}
        run: |
          ./bootstrap
          ./configure --prefix=/usr CFLAGS="-O0" \
            --disable-debug \
            --disable-inet \
            --disable-inet6 \
            --disable-programs \
            --disable-static \
            --enable-shared
          make -j$(nproc)
          sudo make install
      - name: checkout lws source
        if: ${{ matrix.deps_from_src == 'yes' }}
        uses: actions/checkout@v4
        with:
          repository: warmcat/libwebsockets
          ref: v4.3-stable
      - name: setup lws from sources
        if: ${{ matrix.deps_from_src == 'yes' }}
        run: |
          mkdir build && cd build
          cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_C_FLAGS="-O0" \
            -DLWS_ROLE_RAW_FILE=OFF \
            -DLWS_WITH_HTTP2=OFF \
            -DLWS_WITHOUT_EXTENSIONS=OFF \
            -DLWS_WITHOUT_TESTAPPS=ON \
            -DLWS_WITHOUT_TEST_CLIENT=ON \
            -DLWS_WITHOUT_TEST_PING=ON \
            -DLWS_WITHOUT_TEST_SERVER=ON \
            -DLWS_WITH_STATIC=OFF \
            ..
          make -j$(nproc)
          sudo make install
      - name: checkout paho-mqtt source
        if: ${{ matrix.deps_from_src == 'yes' }}
        uses: actions/checkout@v4
        with:
          repository: eclipse/paho.mqtt.c
          ref: v1.3.14
      - name: setup paho-mqtt from sources
        if: ${{ matrix.deps_from_src == 'yes' }}
        run: |
          mkdir build.paho && cd build.paho
          cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_C_FLAGS="-O0" \
            -DPAHO_HIGH_PERFORMANCE=TRUE \
            -DPAHO_BUILD_DOCUMENTATION=FALSE \
            -DPAHO_BUILD_SAMPLES=FALSE \
            -DPAHO_BUILD_SHARED=TRUE \
            -DPAHO_BUILD_STATIC=FALSE \
            -DPAHO_ENABLE_TESTING=FALSE \
            -DPAHO_WITH_SSL=TRUE \
            ..
          make -j$(nproc)
          sudo make install
      - name: checkout janus source
        uses: actions/checkout@v4
      - name: build janus from sources
        env:
          JANUS_CONFIG_COMMON: "--disable-docs --enable-post-processing --enable-plugin-lua --enable-plugin-duktape --enable-json-logger"
          JANUS_CONFIG_OPTS: ${{ matrix.janus_config_opts }}
        run: |
          ./autogen.sh
          ./configure $JANUS_CONFIG_COMMON $JANUS_CONFIG_OPTS CFLAGS="-O0"
          make -j$(nproc)
          make check-fuzzers
  javascript-lint:
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@v4
      - name: Install modules
        run: |
          cd npm
          npm install
      - name: Run ESLint
        run: |
          cd npm
          npm run lint
  javascript-dist:
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@v4
      - name: Install modules
        run: |
          cd npm
          npm install
      - name: Make dist files
        run: |
          cd npm
          npm run prerelease
      - uses: actions/upload-artifact@v4
        with:
          name: janus.es.js
          path: npm/dist/janus.es.js


================================================
FILE: .gitignore
================================================
cmdline.c
cmdline.h
version.c
docs/html/
janus-gateway.pc

janus
janus-cfgconv
janus-pp-rec
mjr2pcap
pcap2mjr
*.so

Makefile
Makefile.in
/build
/configure
/configure~
/autom4te.cache
/aclocal.m4
/m4
/missing
/libtool
/depcomp
/compile
/install-sh
/install-sh~
/ltmain.sh

/config.log
/config.guess
/config.status
/config.sub

*.o
*.a
*.lo
*.la
.libs
pp-cmdline.c
pp-cmdline.h
p2m-cmdline.c
p2m-cmdline.h
/fuzzers/out

npm/dist
npm/src

/conf/janus.cfg.sample
/conf/janus.plugin.duktape.cfg.sample
/conf/janus.plugin.lua.cfg.sample
/conf/janus.plugin.recordplay.cfg.sample
/conf/janus.plugin.streaming.cfg.sample
/conf/janus.transport.http.cfg.sample
/conf/janus.transport.websockets.cfg.sample
/conf/janus.jcfg.sample
/conf/janus.plugin.duktape.jcfg.sample
/conf/janus.plugin.lua.jcfg.sample
/conf/janus.plugin.recordplay.jcfg.sample
/conf/janus.plugin.streaming.jcfg.sample

.deps
.dirstamp

cov-int

# OS X
.DS_Store

# CLion
.idea

.vscode
node_modules
.venv


================================================
FILE: CHANGELOG.md
================================================
# Changelog

All notable changes to this project will be documented in this file.


## [v1.4.0] - 2026-02-06

- Generate a pkg-config .pc file when installing Janus [[PR-3596](https://github.com/meetecho/janus-gateway/pull/3596)]
- Implemented compound RTCP reports (thanks @addisonpolcyn!) [[PR-3585](https://github.com/meetecho/janus-gateway/pull/3585)]
- Fixed when to negotiate the rtcp-fb transport-cc SDP attribute [[PR-3595](https://github.com/meetecho/janus-gateway/pull/3595)]
- Strip some WebRTC-specific SDP attributes in SIP and NoSIP plugins
- Added RTP forwarders support to SIP and NoSIP plugins (thanks @WebTrit!) [[PR-3583](https://github.com/meetecho/janus-gateway/pull/3583)]
- Fixed subscription renewal possibly going to the wrong host in the SIP plugin (thanks @digiboridev!) [[PR-3602](https://github.com/meetecho/janus-gateway/pull/3602)]
- Laid foundations for plugin-specific unique session ID in SIP and NoSIP plugins [[PR-3607](https://github.com/meetecho/janus-gateway/pull/3607)]
- Fixed 'use-after-free' in SIP session helpers (thanks @oleksandr-mihal-zultys!) [[PR-3613](https://github.com/meetecho/janus-gateway/pull/3613)]
- Fixed SIP plugin not offering SRTP in response to offerless INVITEs [[PR-3618](https://github.com/meetecho/janus-gateway/pull/3618)]
- Added new janus-pp-rec option to ignore RTP headers for timing purposes
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)

## [v1.3.3] - 2025-10-21

- Refactored keyframe buffering in Streaming plugin to store following deltas too (thanks [Byborg](https://www.byborgenterprises.com/)!) [[PR-3564](https://github.com/meetecho/janus-gateway/pull/3564)]
- Added optional events for RTSP disconnections/reconnections in the Streaming plugin [[PR-3578](https://github.com/meetecho/janus-gateway/pull/3578)]
- Fixed rare crash when reconnecting to RTSP servers in the Streaming plugin [[PR-3580](https://github.com/meetecho/janus-gateway/pull/3580)]
- Fixed small leak when recording Streaming mountpoints
- Fixed memory leak when stopping non-existing forwarders in the VideoRoom plugin
- Fixed rare crash in AudioBridge when notifying participants [[PR-3589](https://github.com/meetecho/janus-gateway/pull/3589)]
- Fixed payload type when RTP-forwarding AudioBridge rooms using G.711
- Added option for managing ringing manually in the SIP plugin (thanks @adnanel!) [[PR-3556](https://github.com/meetecho/janus-gateway/pull/3556)]
- Save custom headers and send them on SIP hangup event (thanks @kenangenjac!) [[PR-3558](https://github.com/meetecho/janus-gateway/pull/3558)]
- Fix small memory leak in SIP plugin (thanks @oleksandr-mihal-zultys!) [[PR-3565](3565)]
- Added support for Linux cooked capture v2 to pcap2mjr
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)

## [v1.3.2] - 2025-07-10

- Added workaround to potential libnice issue
- Deprecated nice_debug option (libnice debugging can be enabled via env variables) [[PR-3546](https://github.com/meetecho/janus-gateway/pull/3546)]
- Fixed broken session count in case of timeouts [[Issue-3526](https://github.com/meetecho/janus-gateway/issues/3526)]
- Fixed broken session count in case of API disconnections [[Issue-3532](https://github.com/meetecho/janus-gateway/issues/3532)]
- Added experimental support for the video-layers-allocation extension [PR-3504](https://github.com/meetecho/janus-gateway/pull/3504)]
- Added optional signal handler for log rotation [[PR-3550](https://github.com/meetecho/janus-gateway/pull/3550)]
- Fixed memory leaks when using dummy publishers [[PR-3541](https://github.com/meetecho/janus-gateway/pull/3541)]
- New options to advertise VideoRoom dummy publishers as e2ee [[PR-3553](https://github.com/meetecho/janus-gateway/pull/3553)]
- Fixed rare crash when using remote publishers in VideoRoom [[PR-3557](https://github.com/meetecho/janus-gateway/pull/3557)]
- Added request to stop all AudioBridge announcements in a room (thanks @keremcadirci!) [[PR-3403](https://github.com/meetecho/janus-gateway/pull/3403)]
- Allow plain RTP participants in AudioBridge to use generate_offer too [[PR-3534](https://github.com/meetecho/janus-gateway/pull/3534)]
- Fixed breaking condition in AudioBridge
- Fixed broken canvas demo [[Issue-3527](https://github.com/meetecho/janus-gateway/issues/3527)]
- Fixed broken multiopus demo
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)

## [v1.3.1] - 2025-03-05

- Make ip-utils aware of 0.0.0.0 and :: [[Issue-3470](https://github.com/meetecho/janus-gateway/issues/3470)]
- Optimize NACKs handling [[PR-3491](https://github.com/meetecho/janus-gateway/pull/3491)]
- Skip medium lookup when relaying RTCP by plugins to fix rare deadlock [[PR-3515](https://github.com/meetecho/janus-gateway/pull/3515)]
- Fixed FEC and DTX negotiated in VideoRoom also when not enabled in the room settings
- Fixed memory leak in VideoRoom (thanks @m08pvv!) [[PR-3493](https://github.com/meetecho/janus-gateway/pull/3493)]
- Fixed broken recordings when using remote publishers in the VideoRoom [[PR-3509](https://github.com/meetecho/janus-gateway/pull/3509)]
- Check if IPv6 is disabled when loading the Streaming plugin [[PR-3519](https://github.com/meetecho/janus-gateway/pull/3519)]
- Fixed SSRC not being set to a default value in AudioBridge forwarders when not explicitly set in the request
- Add support for "progress" request on SIP Plugin (thanks @adnan-mujagic!) [[PR-3466](https://github.com/meetecho/janus-gateway/pull/3466)]
- New programmatic API to ask for keyframes in SIP and NoSIP plugins [[PR-3517](https://github.com/meetecho/janus-gateway/pull/3517)]
- Fixed missing libcurl linking in TextRoom plugin
- Added support for private recordings in Record&Play [[PR-3518](https://github.com/meetecho/janus-gateway/pull/3518)]
- Fixed leak in recorder when adding descriptions (thanks @m08pvv!) [[PR-3487](https://github.com/meetecho/janus-gateway/pull/3487)]
- Fixed WebSocket transport binding to the wrong IP address in particular setups [[Issue-3500](https://github.com/meetecho/janus-gateway/issues/3550)]
- Improve DTX detection in janus-pp-rec [[PR-3488](#3488)]
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)

## [v1.3.0] - 2024-11-25

- Refactored logging internals [[PR-3428](https://github.com/meetecho/janus-gateway/pull/3428)]
- Use strtok to parse SDPs [[PR-3424](https://github.com/meetecho/janus-gateway/pull/3424)]
- Fixed rare condition that could lead to a deadlock in the VideoRoom [[PR-3446](https://github.com/meetecho/janus-gateway/pull/3446)]
- Fixed broken switch when using remote publishers in VideoRoom [[PR-3447](https://github.com/meetecho/janus-gateway/pull/3447)]
- Added SRTP support to VideoRoom remote publishers (thanks @spscream!) [[PR-3449](https://github.com/meetecho/janus-gateway/pull/3449)]
- Added support for generic JSON metadata to VideoRoom publishers (thanks @spscream!) [[PR-3467](https://github.com/meetecho/janus-gateway/pull/3467)]
- Fixed deadlock in VideoRoom when failing to open a socket for a new RTP forwarder (thanks @spscream!) [[PR-3468](https://github.com/meetecho/janus-gateway/pull/3468)]
- Fixed deadlock in VideoRoom caused by reverse ordering of mutex locks [[PR-3474](https://github.com/meetecho/janus-gateway/pull/3474)]
- Fixed memory leaks when using remote publishers in VideoRoom [[PR-3475](https://github.com/meetecho/janus-gateway/pull/3475)]
- Diluted frequency of PLI in the VideoRoom (thanks @natikaltura!) [[PR-3423](https://github.com/meetecho/janus-gateway/pull/3423)]
- Better cleanup after failed mountpoint creations in Streaming plugin [[PR-3465](https://github.com/meetecho/janus-gateway/pull/3465)]
- Fixed compilation of AudioBridge in case libogg isn't available (thanks @tmatth!) [[PR-3438](https://github.com/meetecho/janus-gateway/pull/3438)]
- Better management of call cleanup in SIP plugin [[Issue-3430](https://github.com/meetecho/janus-gateway/issues/3430)]
- Change the way call-IDs are tracked in the SIP plugin (thanks WebTrit!) [[PR-3443](https://github.com/meetecho/janus-gateway/pull/3443)]
- Increased maximum size of custom SIP headers [[Issue-3459](https://github.com/meetecho/janus-gateway/issues/3459)]
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)

## [v1.2.4] - 2024-09-10

- Limit number of SDP lines when parsing (workaround for OSS-Fuzz issue) [[PR-3414](https://github.com/meetecho/janus-gateway/pull/3414)]
- Normalized monotonic time to Janus start
- Added documentation for remote publishers feature in VideoRoom (SFU cascading)
- Added PLC (packet loss concealment) support to the AudioBridge (thanks @spscream!) [[PR-3349](https://github.com/meetecho/janus-gateway/pull/3349)]
- Cleanup participant queues when muted in the AudioBridge [[PR-3368](https://github.com/meetecho/janus-gateway/pull/3368)]
- Added "listannouncements" request to the AudioBridge (thanks @keremcadirci!) [[PR-3391](https://github.com/meetecho/janus-gateway/pull/3391)]
- Use sequence numbers instead of timestamps for the jitter buffer in the AudioBridge [[PR-3406](https://github.com/meetecho/janus-gateway/pull/3406)]
- Fixed event handers for SIP plugin when using Sofia SIP >= 1.13 (thanks @ ycherniavskyi!) [[PR-3386](https://github.com/meetecho/janus-gateway/pull/3386)]
- Fixed management of data buffering in Streaming plugin [[PR-3412](https://github.com/meetecho/janus-gateway/pull/3412)]
- Fixed small leak in Lua and Duktape plugins [[PR-3409](https://github.com/meetecho/janus-gateway/pull/3409)]
- Fixed recvonly m-lines not being added to SDP in janus.js when offering
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)

## [v1.2.3] - 2024-06-20

- Reduced size of RTP header struct in core
- Added support for helper threads to VideoRoom [[PR-3067]((https://github.com/meetecho/janus-gateway/pull/3067)]
- Fixed rare race condition in VideoRoom when destroying rooms [[PR-3361]((https://github.com/meetecho/janus-gateway/pull/3361)]
- Fixed rare crash in VideoRoom when using SVC
- Added optional RNNoise support to AudioBridge [[PR-3185]((https://github.com/meetecho/janus-gateway/pull/3185)]
- Handle jitter buffer delay manually in AudioBridge [[PR-3353]((https://github.com/meetecho/janus-gateway/pull/3353)]
- Fixed rare segfault when changing rooms in AudioBridge [[PR-3356]((https://github.com/meetecho/janus-gateway/pull/3356)]
- Empty queues in AudioBridge when muting status changes [[PR-3368]((https://github.com/meetecho/janus-gateway/pull/3368)]
- Fixed rare deadlock in AudioBridge plugin when closing connections [[PR-3387]((https://github.com/meetecho/janus-gateway/pull/3387)]
- Fixed compilation errors on MacOS for HTTP transport plugin [[Issue-3366]((https://github.com/meetecho/janus-gateway/issues/3366)]
- Fixed missing '--version' command line switch (thanks @fancycode!) [[PR-3384]((https://github.com/meetecho/janus-gateway/pull/3384)]
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)

## [v1.2.2] - 2024-04-02

* Update demos and docs to Bootstrap 5.x [[PR-3300](https://github.com/meetecho/janus-gateway/pull/3300)]
* Fixed rare race condition in VideoRoom [[PR-3331](https://github.com/meetecho/janus-gateway/pull/3331)]
* Fixed broken end-to-end encryption for subscribers in VideoRoom
* Fixed ports leak when using remote publishers in VideoRoom plugin [[Issue-3345](https://github.com/meetecho/janus-gateway/issues/3345)]
* Perform audio-level detection in AudioBridge participant thread [[PR-3312](https://github.com/meetecho/janus-gateway/pull/3312)]
* Fixed memory leak in AudioBridge in case of late packets
* Ship speexdsp's jitter buffer as part of local AudioBridge dependencies [[PR-3348](https://github.com/meetecho/janus-gateway/pull/3348)]
* Add support of abs-capture-time RTP extension to Streaming plugin (thanks @IbrayevRamil!) [[PR-3291](https://github.com/meetecho/janus-gateway/pull/3291)]
* Don't call close_pc in SIP plugin if there was no SDP [[PR-3339](https://github.com/meetecho/janus-gateway/pull/3339)]
* Fixed broken faststart when postprocessing AV1 recordings (thanks @corthiclem!) [[PR-3317](https://github.com/meetecho/janus-gateway/pull/3317)]
* Added new connectionState callback to janus.js (thanks @RSATom!) [[PR-3343](https://github.com/meetecho/janus-gateway/pull/3343)]
* Exposed Janus and Admin API ping request via GET [[Issue-3336](https://github.com/meetecho/janus-gateway/issues/3336)]
* Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)

## [v1.2.1] - 2023-12-06

* Added support for abs-capture-time RTP extension [[PR-3161](https://github.com/meetecho/janus-gateway/pull/3161)]
* Fixed truncated label in datachannels (thanks @veeting!) [[PR-3265](https://github.com/meetecho/janus-gateway/pull/3265)]
* Support larger values for SDP attributes (thanks @petarminchev!) [[PR-3282](https://github.com/meetecho/janus-gateway/pull/3282)]
* Fixed rare crash in VideoRoom plugin (thanks @tmatth!) [[PR-3259](https://github.com/meetecho/janus-gateway/pull/3259)]
* Don't create VideoRoom subscriptions to publisher streams with no associated codecs
* Added suspend/resume participant API to AudioBridge [[PR-3301](https://github.com/meetecho/janus-gateway/pull/3301)]
* Fixed rare crash in AudioBridge
* Fixed rare crash in Streaming plugin when doing ICE restarts [[Issue-3288](https://github.com/meetecho/janus-gateway/issues/3288)]
* Allow SIP and NoSIP plugins to bind media to a specific address (thanks @pawnnail!) [[PR-3263](https://github.com/meetecho/janus-gateway/pull/3263)]
* Removed advertised support for SIP UPDATE in SIP plugin
* Parse RFC2833 DTMF to custom events in SIP plugin (thanks @ywmoyue!) [[PR-3280](https://github.com/meetecho/janus-gateway/pull/3280)]
* Fixed missing Contact header in some dialogs in SIP plugin (thanks @ycherniavskyi!) [[PR-3286](https://github.com/meetecho/janus-gateway/pull/3286)]
* Properly set mid when notifying about ended tracks in janus.js
* Fixed broken restamping in janus-pp-rec
* Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)

## [v1.2.0] - 2023-08-09

- Added support for VP9/AV1 simulcast, and fixed broken AV1/SVC support [[PR-3218](https://github.com/meetecho/janus-gateway/pull/3218)]
- Fixed RTCP out quality stats [[PR-3228](https://github.com/meetecho/janus-gateway/pull/3228)]
- Default link quality stats to 100
- Added support for ICE consent freshness [[PR-3234](https://github.com/meetecho/janus-gateway/pull/3234)]
- Fixed rare race condition in VideoRoom [[PR-3219](https://github.com/meetecho/janus-gateway/pull/3219)] [[PR-3247](https://github.com/meetecho/janus-gateway/pull/3247)]
- Use speexdsp's jitter buffer in the AudioBridge [[PR-3233](https://github.com/meetecho/janus-gateway/pull/3233)]
- Fixed crash in Streaming plugin on mountpoints with too many streams [[Issue-3225](https://github.com/meetecho/janus-gateway/issues/3225)]
- Support for batched configure requests in Streaming plugin (thanks @petarminchev!) [[PR-3239](https://github.com/meetecho/janus-gateway/pull/3239)]
- Fixed rare deadlock in Streamin plugin [[PR-3250](https://github.com/meetecho/janus-gateway/pull/3250)]
- Fix simulated leave message for longer string ID rooms in TextRoom (thanks @adnanel!) [PR-3243](https://github.com/meetecho/janus-gateway/pull/3243)]
- Notify about count of sessions, handles and PeerConnections on a regular basis, when event handlers are enabled [[PR-3221](https://github.com/meetecho/janus-gateway/pull/3221)]
- Fixed broken Insertable Streams for recvonly streams when answering in janus.js
- Added background selector and blur support to Virtual Background demo
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)

## [v1.1.4] - 2023-05-19

- Moved discussions from Google Group to Discourse
- Fixed typo in command line argument validation
- Refactored RTP forwarder internals as a core feature [[PR-3155](https://github.com/meetecho/janus-gateway/pull/3155)]
- Refactored SVC processing as a core feature, and removed deprecated VP9/SVC demo [[PR-3174](https://github.com/meetecho/janus-gateway/pull/3174)]
- Don't create IPv6 sockets if IPv6 is completely disabled [[PR-3179](https://github.com/meetecho/janus-gateway/pull/3179)]
- Fixed some VideoRoom race conditions [[PR-3167](https://github.com/meetecho/janus-gateway/pull/3167)]
- Added simulcast/SVC params to switch in VideoRoom (thanks @brave44!) [[PR-3197](https://github.com/meetecho/janus-gateway/pull/3197)]
- Add support for receiving offers in Streaming plugin (for WHEP) [[PR-3199](https://github.com/meetecho/janus-gateway/pull/3199)]
- Add newline for SIP headers that are overflown in length (thanks @zayim!) [[PR-3184](https://github.com/meetecho/janus-gateway/pull/3184)]
- Save SIP reason state on multiple callbacks (thanks @kenangenjac!) [[PR-3210](https://github.com/meetecho/janus-gateway/pull/3210)]
- Avoid parsing whitespace as invalid JSON when receiving WebSocket messages (thanks @htrendev!) [[PR-3208](https://github.com/meetecho/janus-gateway/pull/3208)]
- Remove old tracks before adding/replacing new ones in janus.js [[PR-3203](https://github.com/meetecho/janus-gateway/pull/3203)]
- Tweaks to some janus.js internals (thanks @i8-pi!) [[PR-3211](https://github.com/meetecho/janus-gateway/pull/3211)]
- Fixed some typos and added some tweaks to Admin API demo
- Refactored npm version of janus.js
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)

## [v1.1.3] - 2023-03-06

- Use getaddrinfo instead of gethostbyname [[PR-3159](https://github.com/meetecho/janus-gateway/pull/3159)]
- Removed VoiceMail plugin and demo [[PR-3172](https://github.com/meetecho/janus-gateway/pull/3172)]
- Added configurable cap to number of queued events when reconnecting WebSocket event handler [[PR-3148](https://github.com/meetecho/janus-gateway/pull/3148)]
- Fixed broken support for text datachannels in Streaming plugin
- Add option to manually insert SPS/PPS RTP packets for H.264 mountpoints [[PR-3168](https://github.com/meetecho/janus-gateway/pull/3168)]
- Fixed From/To checks when getting a SIP INVITE [[Issue-3164](https://github.com/meetecho/janus-gateway/issues/3164)]
- Allow changing mjrs dir also when stopping recordings in AudioBridge [[Issue-3171](https://github.com/meetecho/janus-gateway/issues/3171)]
- Allow Lua and Duktape plugins to relay extensions when relaying RTP packets [[PR-3162](https://github.com/meetecho/janus-gateway/pull/3162)]
- Optionally support X-Forwarded-For in both HTTP and WebSocket transports [[PR-3160](https://github.com/meetecho/janus-gateway/pull/3160)]
- Add reason of track being added/removed in onremotetrack in janus.js (thanks @marekpiechut!) [[PR-3150](https://github.com/meetecho/janus-gateway/pull/3150)]
- Fixed broken VP9-SVC demo room [[Issue-3169](https://github.com/meetecho/janus-gateway/issues/3169)]
- Linted whole JS demo codebase [[PR-3170](https://github.com/meetecho/janus-gateway/pull/3170)]
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)

## [v1.1.2] - 2023-01-17

- Always add mid to the SDP, even for disabled m-lines
- Don't allow mid changes for m-line during renegotiations [[PR-3136](https://github.com/meetecho/janus-gateway/pull/3136)]
- Consider RTCP feedback messages when evaluating receiver SSRC
- Added partial support for L16 codec (uncompressed audio) [[PR-3116](https://github.com/meetecho/janus-gateway/pull/3116)]
- Fixed overwriting of 7-bit PictureID when doing VP8 simulcast [[PR-3121](https://github.com/meetecho/janus-gateway/pull/3121)]
- Send data stats when using event handlers [[PR-3126](https://github.com/meetecho/janus-gateway/pull/3126)]
- Copy formats from datachannel m-lines also when rejecting them [[Issue-3134](https://github.com/meetecho/janus-gateway/issues/3134)]
- Fixed compiler issue with recent versions of libcurl (thanks @bkmgit!) [[PR-3138](https://github.com/meetecho/janus-gateway/pull/3138)]
- Close mountpoint sockets when leaving relay thread [[PR-3143](https://github.com/meetecho/janus-gateway/pull/3143)]
- Fixed segfault in SIP plugin in case of broken SUBSCRIBE [[Issue-3133](https://github.com/meetecho/janus-gateway/issues/3133)]
- Support multiple requests in a single websocket message (thanks @jwittner!) [[PR-3123](https://github.com/meetecho/janus-gateway/pull/3123)]
- Fixed inability to add recvonly tracks in janus.js ([[Issue-3119](https://github.com/meetecho/janus-gateway/issues/3119)]
- Updated janus.d.ts type definitions (thanks @jerry4718!) [[PR-3125](https://github.com/meetecho/janus-gateway/pull/3125)]
- Fixed out of range error when passing large SSRC values to pcap2mjr
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)

## [v1.1.1] - 2022-12-07

- Added timing info on ICE starting and gathering done to Admin API
- Fixed rare crash when generating SDP to send [[Issue-3081](https://github.com/meetecho/janus-gateway/issues/3081)]
- Fixed rare crash when checking payload types (thanks @zevarito!) [[PR-3086](3086)]
- Fixed double a=ssrc attribute in SDP for inactive m-line
- Replaced non-portable strcasestr() with strncasecmp() (thanks @iskraman!) [[PR-3076](https://github.com/meetecho/janus-gateway/pull/3076)]
- Fixed parameters not being URL-encoded when using TURN REST API [[Issue-3112](https://github.com/meetecho/janus-gateway/issues/3112)]
- Fixed renegotiation sent to VideoRoom subscribers when a room is destroyed [[Issue-3083](https://github.com/meetecho/janus-gateway/issues/3083)]
- Added option to prevent automatic SDP offer updates to VideoRoom subscribers when a publisher leaves
- Fixed "send" property not being automatically reset to "true" in the VideoRoom for new subscriptions
- Fixed small memory leak in AudioBridge (thanks @RSATom!) [[PR-3088](https://github.com/meetecho/janus-gateway/pull/3088)]
- Minor fixes to the Streaming plugin
- Enforced media direction policies when SIP call is on hold [PR-3087](https://github.com/meetecho/janus-gateway/pull/3087)]
- Added code to send PLI to SIP peer when recording [[PR-3093](https://github.com/meetecho/janus-gateway/pull/3093)]
- Fixed renegotiations in VideoCall not updating session properties
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)

## [v1.1.0] - 2022-10-03

- Added versioning to .so files [[PR-3075](https://github.com/meetecho/janus-gateway/pull/3075)]
- Allow plugins to specify msid in SDPs [[PR-2998](https://github.com/meetecho/janus-gateway/pull/2998)]
- Fixed broken RTCP timestamp on 32bit architectures [[Issue-3045](https://github.com/meetecho/janus-gateway/issues/3045)]
- Fixed problems compiling against recent versions of libwebsockets [[Issue-3039](https://github.com/meetecho/janus-gateway/issues/3039)]
- Updated deprecated DTLS functions to OpenSSL v3.0 [PR-3048](https://github.com/meetecho/janus-gateway/pull/3048)]
- Switched to SHA256 for signing self signed DTLS certificates (thanks @tgabi333!) [[PR-3069](https://github.com/meetecho/janus-gateway/pull/3069)]
- Started using strnlen to optimize performance of some strlen calls (thanks @tmatth!) [[PR-3059](https://github.com/meetecho/janus-gateway/pull/3059)]
- Added checks to avoid RTX payload type collisions [[PR-3080](https://github.com/meetecho/janus-gateway/pull/3080)]
- Added new APIs for cascading VideoRoom publishers [[PR-3014](https://github.com/meetecho/janus-gateway/pull/3014)]
- Fixed deadlock when using legacy switch in VideoRoom [[Issue-3066](https://github.com/meetecho/janus-gateway/issues/3066)]
- Fixed disabled property not being advertized to subscribers when VideoRoom publishers removed tracks
- Fixed occasional deadlock when using G.711 in the AudioBridge [[Issue-3062](https://github.com/meetecho/janus-gateway/issues/3062)]
- Added new way of capturing devices/tracks in janus.js [[PR-3003](https://github.com/meetecho/janus-gateway/pull/3003)]
- Removed call to .stop() for remote tracks in demos [[PR-3056](https://github.com/meetecho/janus-gateway/pull/3056)]
- Fixed missing message/info/transfer buttons in SIP demo page
- Fixed postprocessing compilation issue on older FFmpeg versions [[PR-3064](https://github.com/meetecho/janus-gateway/pull/3064)]
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)

## [v1.0.4] - 2022-08-01

- Fixed problem with duplicate ptypes when codecs are added in renegotiations
- Added codec info to event handlers stats
- Allow offers to include other roles besides 'actpass' for DTLS [[PR-3020](https://github.com/meetecho/janus-gateway/pull/3020)]
- Fixed rare race conditions when attempting to relay packets sent by plugins [[PR-3010](https://github.com/meetecho/janus-gateway/pull/3010)]
- Fixed unprotected access to medium instances in janus_plugin_handle_sdp
- Set appropriate channel type when sending DATA_CHANNEL_OPEN_REQUEST message (thanks @ktyu!) [[PR-3018](https://github.com/meetecho/janus-gateway/pull/3018)]
- Fixed rare race condition when handling incoming RTCP feedback in VideoRoom
- Fixed memory leak in VideoRoom when using rid-based simulcast (thanks @OxleyS!) [[PR-2995](https://github.com/meetecho/janus-gateway/pull/2995)]
- Fixed IPv6 always enabled for VideoRoom RTP forwarders [[Issue-3011](https://github.com/meetecho/janus-gateway/issues/3011)]
- Start recording VideoRoom publisher on PeerConnection establishment, if needed (thanks @adnanel!) [[PR-3013](https://github.com/meetecho/janus-gateway/pull/3013)]
- Added an optional ID in subscribe requests to match with subscription events (thanks @JanFellner!) [[PR-3027](https://github.com/meetecho/janus-gateway/pull/3027)]
- Make Streaming plugin use SDP utils, and codecs instead of rtpmaps [[PR-2994](https://github.com/meetecho/janus-gateway/pull/2994)]
- Check response codes of RTSP requests in Streaming plugin [[Issue-3015](https://github.com/meetecho/janus-gateway/issues/3015)]
- Fixed small memory leak in SIP plugin [[Issue-3032](https://github.com/meetecho/janus-gateway/issues/3032)]
- Fixed broken simulcast support in Lua and Duktape plugins
- Don't use .clone() on tracks to render them in demos [[PR-3009](https://github.com/meetecho/janus-gateway/pull/3009)]
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)

## [v1.0.3] - 2022-06-20

- Keep track of RTP extensions when storing packets for retransmission [[PR-2981](https://github.com/meetecho/janus-gateway/pull/2981)]
- Fixed negotiation of RTP extensions when direction is involved
- Fixed broken VP8 payload descriptor parsing when 7-bit PictureID are used
- Support for batched configure requests in VideoRoom [[PR-2986](https://github.com/meetecho/janus-gateway/pull/2986)]
- Added missing info to VideoRoom publisher's info own event [[Issue-2988](https://github.com/meetecho/janus-gateway/issues/2988)]
- Fixed memory leaks in when upgrading old-style Videoroom requests (thanks @OxleyS!) [[PR-3002](https://github.com/meetecho/janus-gateway/pull/3002)]
- Fixed memory leak in VideoRoom when updating subscriptions with no changes
- Added 'kick_all' requests and possibility to remove PIN code to both Audiobridge and Streaming plugins (thanks @mikaelnousiainen!) [[PR-2978](https://github.com/meetecho/janus-gateway/pull/2978)]
- Added support for notifications in the Streaming plugin when metadata for a mountpoint is changed (thanks @amoizard!) [[PR-3000](https://github.com/meetecho/janus-gateway/pull/3000)]
- Fixed missing checks on auth challenges in SIP plugin
- Fixed missing Contact header in SUBSCRIBE requests in SIP plugin [[PR-2973](https://github.com/meetecho/janus-gateway/pull/2973)]
- Fixed segfault in SIP plugin when freeing a session with a subscription still active [[PR-2974](https://github.com/meetecho/janus-gateway/pull/2974)]
- Add new shared JavaScript file for settings in demos [[PR-2991](https://github.com/meetecho/janus-gateway/pull/2991)]
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)

## [v1.0.2] - 2022-05-23

- Abort DTLS handshake if DTLSv1_handle_timeout returns an error
- Fixed rtx not being offered on Janus originated PeerConnections
- Added configurable property to put a cap to task threads [[Issue-2964](https://github.com/meetecho/janus-gateway/issues/2964)]
- Fixed build issue with libressl >= 3.5.0 (thanks @ffontaine!) [[PR-2980](https://github.com/meetecho/janus-gateway/pull/2980)]
- Link to -lresolv explicitly when building websockets transport
- Fixed RED parsing not returning blocks when only primary data is available
- Fixed typo in stereo support in EchoTest plugin
- Added support for dummy publishers in VideoRoom [[PR-2958](https://github.com/meetecho/janus-gateway/pull/2958)]
- Added new VideoRoom request to combine subscribe and unsubscribe operations [[PR-2962](https://github.com/meetecho/janus-gateway/pull/2962)]
- Fixed incorrect removal of owner/subscriptions mapping in VideoRoom plugin [[Issue-2965](https://github.com/meetecho/janus-gateway/issues/2965)]
- Explicitly return list of IDs VideoRoom users are subscribed to for data [[Issue-2967](https://github.com/meetecho/janus-gateway/issues/2967)]
- Fixed data port not being returned when creating Streaming mountpoints with the legacy API
- Fix address size in Streaming plugin RTCP sendto call (thanks @sjkummer!) [[PR-2976](https://github.com/meetecho/janus-gateway/pull/2976)]
- Added custom headers for SIP SUBSCRIBE requests (thanks @oriol-c!) [[PR-2971](https://github.com/meetecho/janus-gateway/pull/2971)]
- Make SIP timer T1X64 configurable (thanks @oriol-c!) [[PR-2972](https://github.com/meetecho/janus-gateway/pull/2972)]
- Disable IPv6 in WebSockets transport if binding to IPv4 address explicitly [[Issue-2969](https://github.com/meetecho/janus-gateway/issues/2969)]
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)

## [v1.0.1] - 2022-04-26

- Removed gengetopt as a dependency, to use Glib's GOptionEntry instead [[PR-2898](https://github.com/meetecho/janus-gateway/pull/2898)]
- Fixed occasional problem of duplicate mid attribute in Janus SDPs [[Issue-2917](https://github.com/meetecho/janus-gateway/issues/2917)]
- Fixed receiving=false events not being sent right away for higher simulcast substreams [[Issue-2919](https://github.com/meetecho/janus-gateway/issues/2919)]
- Fix highest sequence number not being properly initialized in the RTCP context [[Issues-2920](https://github.com/meetecho/janus-gateway/issues/2920)]
- Reset rids when renegotiating SDPs [[PR-2931](https://github.com/meetecho/janus-gateway/pull/2931)]
- Fixed missing PLI when restoring previously paused streams in VideoRoom (thanks @flaviogrossi!) [[PR-2922](https://github.com/meetecho/janus-gateway/pull/2922)]
- Fixed deadlock when using the moderate API in the VideoRoom [[Issue-2956](https://github.com/meetecho/janus-gateway/issues/2956)]
- Check if IPv6 is disabled to avoid failure when creating forwarder sockets in AudioBridge and VideoRoom [[PR-2916](https://github.com/meetecho/janus-gateway/pull/2916)]
- Fixed invalid computation of Streaming mountpoint stream age (thanks @RouquinBlanc!) [[PR-2928](https://github.com/meetecho/janus-gateway/pull/2928)]
- Also return reason header protocol and cause if present in BYE in the SIP plugin (thanks @ajsa-terko!) [[PR-2935](https://github.com/meetecho/janus-gateway/pull/2935)]
- Fixed segfault in UNIX transport teardown caused by pathnames of different sizes
- Added new demos on WebAudio and Virtual Backgrounds [[PR-2941](https://github.com/meetecho/janus-gateway/pull/2941)]
- Fixed potential race conditions in multistream VideoRoom demo [[Issue-2929](https://github.com/meetecho/janus-gateway/issues/2929)]
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)

## [v1.0.0] - 2022-03-03

- Refactored Janus to support multistream PeerConnections [[PR-2211](https://github.com/meetecho/janus-gateway/pull/2211)]
- Moved all source files under new 'src' folder to unclutter the repo [[PR-2885](https://github.com/meetecho/janus-gateway/pull/2885)]
- Fixed definition of trylock wrapper when using pthreads [[Issue-2894](https://github.com/meetecho/janus-gateway/issues/2894)]
- Fixed broken RTP when no extensions are negotiated
- Added checks when inserting RTP extensions to avoid buffer overflows
- Added missing support for disabled rid simulcast substreams in SDP [[PR-2888](https://github.com/meetecho/janus-gateway/pull/2888)]
- Fixed TWCC feedback when simulcast SSRCs are missing (thanks @OxleyS!) [[PR-2908](https://github.com/meetecho/janus-gateway/pull/2908)]
- Added support for playout-delay RTP extension [[PR-2895](https://github.com/meetecho/janus-gateway/pull/2895)]
- Fixed partially broken H.264 support when using Firefox in VideoRoom
- Fixed new VideoRoom rtp_forward API ignoring some properties
- Fixed deadlock and segfault when stopping Streaming mountpoint recordings [[Issue-2902](https://github.com/meetecho/janus-gateway/issues/2902)]
- Fixed RTSP support in Streaming plugin for cameras that expect path-only DESCRIBE requests (thanks @jp-bennett!) [[PR-2909](https://github.com/meetecho/janus-gateway/pull/2909)]
- Fixed RTP being relayed incorrectly in Lua and Duktape plugins
- Added Duktape as optional dependency, instead of embedding the engine code [[PR-2886](https://github.com/meetecho/janus-gateway/pull/2886)]
- Fixed crash at startup when not able to connect to RabbitMQ server
- Improved fuzzing and checks on RTP extensions
- Removed distinction between simulcast and simulcast2 in janus.js [[PR-2887](https://github.com/meetecho/janus-gateway/pull/2887)]
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)

## [v0.11.8] - 2022-02-11

- Added initial (and limited) integration of RED audio [[PR-2685](https://github.com/meetecho/janus-gateway/pull/2685)]
- Added support for Two-Byte header RTP extensions (RFC8285) and, partially, for the new Depencency Descriptor RTP extension (needed for AV1-SVC) [[PR-2741](https://github.com/meetecho/janus-gateway/pull/2741)]
- Fixed rare race conditions between sending a packet and closing a connection [[PR-2869](https://github.com/meetecho/janus-gateway/pull/2869)]
- Fix last stats before closing PeerConnection not being sent to handlers (thanks @zodiak83!) [[PR-2874](https://github.com/meetecho/janus-gateway/pull/2874)]
- Changed automatic allocation on static loops from round robin to least used [[PR-2878](https://github.com/meetecho/janus-gateway/pull/2878)]
- Added new API to bulk start/stop MJR-based recordings in AudioBridge [[PR-2862](https://github.com/meetecho/janus-gateway/pull/2862)]
- Fixed broken duration in spatial AudioBridge recordings
- Fixed broken G.711 RTP forwarding in AudioBridge (thanks @AlexYaremchuk!) [[PR-2875](https://github.com/meetecho/janus-gateway/pull/2875)]
- Fixed broken recordings in NoSIP plugin
- Fixed warnings when postprocessing Opus recordings with DTX packets
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)

## [v0.11.7] - 2022-01-24

- Added faster strlcat variant that uses memccpy for writing SDPs [[PR-2835](https://github.com/meetecho/janus-gateway/pull/2835)]
- Fixed occasional crash when updating WebRTC sessions [[Issue-2840](https://github.com/meetecho/janus-gateway/issues/2840)]
- Changed SDP syntax for AV1 from "AV1X" to "AV1" [[Issue-2844](https://github.com/meetecho/janus-gateway/issues/2844)]
- Fixed signed_tokens property not being saved to permanent rooms in VideoRoom (thanks @timsolov!) [[PR-2843](https://github.com/meetecho/janus-gateway/pull/2843)]
- Made record directory changeable via "edit" in both AudioBridge and VideoRoom
- Added configurable expected loss to AudioBridge to actually send FEC [[PR-2802](https://github.com/meetecho/janus-gateway/pull/2802)]
- Fixed SIP plugin not working when using Sofia SIP >= 1.13 [[Issue-2683](https://github.com/meetecho/janus-gateway/issues/2683)]
- Fixed occasional crashes in SIP plugin [[Issue-2853](https://github.com/meetecho/janus-gateway/issues/2853)]
- Take note of video orientation extension when recording video in SIP plugin (thanks @adnanel!) [[PR-2836](https://github.com/meetecho/janus-gateway/pull/2836)]
- Allow 180 besides 183 to have SDP as well (thanks @lejlasolak!) [[PR-2849](https://github.com/meetecho/janus-gateway/pull/2849)]
- Fixed post-processor compilation issue with newer versions of FFmpeg [[Issue-2833](https://github.com/meetecho/janus-gateway/issues/2833)]
- Added option to print extended info on MJR file as JSON in postprocessor (thanks @adnanel!) [[PR-2858](https://github.com/meetecho/janus-gateway/pull/2858)]
- Allow pcap2mjr to autodetect SSRC
- Fixed problems compiling post-processor with older versions of FFmpeg
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)

## [v0.11.6] - 2021-12-13

- Added strlcat helper to detect and report truncations [[PR-2792](https://github.com/meetecho/janus-gateway/pull/2792)]
- Grow buffer as needed when generating SDPs [[PR-2797](https://github.com/meetecho/janus-gateway/pull/2797)]
- Added DTX support to some plugins [[PR-2789](https://github.com/meetecho/janus-gateway/pull/2789)]
- Added option to forcibly quit Janus when getting dlopen errors (thanks @tmatth!) [[PR-2828](https://github.com/meetecho/janus-gateway/pull/2828)]
- Fixed broken signed tokens in VideoRoom when using UUIDs (thanks @timsolov!) [[PR-2812](https://github.com/meetecho/janus-gateway/pull/2812)]
- Added option to choose whether signed tokens should be used in the VideoRoom when enabled in the core [[PR-2825](https://github.com/meetecho/janus-gateway/pull/2825)]
- Added MESSAGE authentication and out-of-dialog MESSAGE support to SIP plugin (thanks thetechpanda!) [[PR-2786](https://github.com/meetecho/janus-gateway/pull/2786)]
- Fixed potential race conditions in SIP plugin [[PR-2823](https://github.com/meetecho/janus-gateway/pull/2823)]
- Added basic history support to TextRoom plugin [[PR-2814](https://github.com/meetecho/janus-gateway/pull/2814)]
- Fixed Cross-site Scripting (XSS) vulnerability in some of the demos (thanks @SoufElhabti!) [[PR-2817](https://github.com/meetecho/janus-gateway/pull/2817)]
- Added support for custom datachannel options in janus.js (thanks @sqxieshuai!) [[PR-2806](https://github.com/meetecho/janus-gateway/pull/2806)]
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)

## [v0.11.5] - 2021-10-18

- Add API to optionally force Janus to use TURN [[PR-2774](https://github.com/meetecho/janus-gateway/pull/2774)]
- Fixed slow path on SDP parsing [[PR-2776](https://github.com/meetecho/janus-gateway/pull/2776)]
- Added event handlers option to send stats for a PeerConnection in a single event, rather than per-media (thanks @JanFellner!) [[PR-2785](https://github.com/meetecho/janus-gateway/pull/2785)]
- Fixed occasional deadlocks on malformed requests in VideoRoom [[Issue-2780](https://github.com/meetecho/janus-gateway/issues/2780)]
- Fixed AudioBridge plain RTP thread sometimes exiting prematurely
- Fixed broken upsampling when using G.711 in AudioBridge
- Add pause/resume recording functionality to Record&Play and SIP plugins (thanks @isnumanagic!) [[PR-2724](https://github.com/meetecho/janus-gateway/pull/2724)]
- Fixed broken support for Unix Sockets in WebSockets Admin API (thanks @thatsmydoing!) [[PR-2787](https://github.com/meetecho/janus-gateway/pull/2787)]
- Added timing info for video rotation when post-processing recordings
- Added linter checks to janus.js (thanks @davel!) [[PR-2272](https://github.com/meetecho/janus-gateway/pull/2272)]
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)

## [v0.11.4] - 2021-09-06

- Fixed ICE restart issues with recent versions of libnice [[PR-2729](https://github.com/meetecho/janus-gateway/pull/2729)]
- Changed randon number generators to use crypto-safe functions (thanks @jmfotokite!) [[PR-2738](https://github.com/meetecho/janus-gateway/pull/2738)]
- Added support for abs-send-time RTP extension [[PR-2721](https://github.com/meetecho/janus-gateway/pull/2721)]
- Added configurable mechanism for manually setting static event loop to use for new handles [[PR-2684](https://github.com/meetecho/janus-gateway/pull/2684)]
- Fixed datachannel protocol not being sent to plugins for incoming messages [[Issue-2753](https://github.com/meetecho/janus-gateway/issues/2753)]
- Added ability to specify recordings folder in AudioBridge [[PR-2707](https://github.com/meetecho/janus-gateway/pull/2707)]
- Added support for forwarding groups in AudioBridge [[PR-2653](https://github.com/meetecho/janus-gateway/pull/2653)]
- Fixed missing Contact header in SIP plugin when using Sofia >= 1.13 [[PR-2708](https://github.com/meetecho/janus-gateway/pull/2708)]
- Better SDES-SRTP negotiation in SIP and NoSIP plugins [[PR-2727](https://github.com/meetecho/janus-gateway/pull/2727)]
- Fixed WebSocket transport and event handler lagging 25/30s when shutting down or reconnecting (thanks @JanFellner!) [[Issue-2734](https://github.com/meetecho/janus-gateway/issues/2734)]
- Fixed incoming_header_prefixes not working for helper sessions in SIP plugin
- Fix partial/broken ACL support in TextRoom plugin [[PR-2763](https://github.com/meetecho/janus-gateway/pull/2763)]
- Fixed potential race condition when reclaiming sessions in HTTP transport plugin
- Fixed WebSocket event handler reconnect mechanism (thanks @JanFellner!) [[PR-2736](https://github.com/meetecho/janus-gateway/pull/2736)]
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)

## [v0.11.3] - 2021-06-15

- Fixed rare crash when detaching handles [[Issue-2464](https://github.com/meetecho/janus-gateway/issues/2464)]
- Added option to offer IPv6 link-local candidates as well [[PR-2689](https://github.com/meetecho/janus-gateway/pull/2689)]
- Added spatial audio support to AudioBridge via stereo mixing [[PR-2446](https://github.com/meetecho/janus-gateway/pull/2446)]
- Added support for plain RTP participants to AudioBridge [[PR-2464](https://github.com/meetecho/janus-gateway/pull/2464)]
- Added API to start/stop AudioBridge recordings dynamically (thanks @rajneeshksoni!) [[PR-2674](https://github.com/meetecho/janus-gateway/pull/2674)]
- Fixed broken mountpoint switching when using different payload types in Streaming plugin [[PR-2692](https://github.com/meetecho/janus-gateway/pull/2692)]
- Fixed occasional deadlock on Streaming plugin mountpoint destroy during RTSP reconnects (thanks @lionelnicolas!) [[PR-2700](https://github.com/meetecho/janus-gateway/pull/2700)]
- Added "Expires" support to SUBSCRIBE in SIP plugin (thanks @nicolasduteil!) [[PR-2661](https://github.com/meetecho/janus-gateway/pull/2661)]
- Added option to specify Call-ID for SUBSCRIBE dialogs in SIP plugin (thanks @nicolasduteil!) [[PR-2664](https://github.com/meetecho/janus-gateway/pull/2664)]
- Fixed broken simulcast support in VideoCall plugin (thanks @lucily-star!) [[PR-2671](https://github.com/meetecho/janus-gateway/pull/2671)]
- Implemented RabbitMQ reconnection logic, in both transport and event handler (thanks @chriswiggins!) [[PR-2651](https://github.com/meetecho/janus-gateway/pull/2651)]
- Added support for renegotiation of external streams in janus.js (thanks @kmeyerhofer!) [[PR-2604](https://github.com/meetecho/janus-gateway/pull/2604)]
- Added support for HEVC/H.265 aggregation packets (AP) to janus-pp-rec (thanks @nu774!) [[PR-2662](https://github.com/meetecho/janus-gateway/pull/2662)]
- Refactored janus-pp-rec to cleanup the code, and use libavformat for Opus as well (thanks @lu-zero!) [[PR-2665](https://github.com/meetecho/janus-gateway/pull/2665)]
- Added additional target formats for some recorded codecs [[PR-2680](https://github.com/meetecho/janus-gateway/pull/2680)]
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)

## [v0.11.2] - 2021-05-03

- Added support for relative paths in config files, currently only in MQTT event handler (thanks @RSATom!) [[PR-2623](https://github.com/meetecho/janus-gateway/pull/2623)]
- Removed support for now deprecated frame-marking RTP extension [[PR-2640](https://github.com/meetecho/janus-gateway/pull/2640)]
- Fixed rare race condition between VideoRoom publisher leaving and subscriber hanging up [[PR-2637](https://github.com/meetecho/janus-gateway/pull/2637)]
- Fixed occasional crash when using announcements in AudioBridge
- Fixed rare crash in Streaming plugin when reconnecting RTSP streams (thanks @lucylu-star!) [[PR-2542](https://github.com/meetecho/janus-gateway/pull/2542)]
- Fixed broken switch in Streaming plugin when using helper threads
- Fixed rare race conditions on socket close in SIP and NoSIP plugins [[PR-2599](https://github.com/meetecho/janus-gateway/pull/2599)]
- Added support for out-of-dialog SIP MESSAGE requests (thanks @ihusejnovic!) [[PR-2616](https://github.com/meetecho/janus-gateway/pull/2616)]
- Fixed memory leak when using helper threads in Streaming plugin
- Added support for datachannel label/protocol to Lua and Duktape plugins [[PR-2641](https://github.com/meetecho/janus-gateway/pull/2641)]
- Added ability to use WebSockets transport over Unix sockets (thanks @mdevaev!) [[PR-2620](https://github.com/meetecho/janus-gateway/pull/2620)]
- Added janus-pp-rec mechanism to correct wrong RTP timestamps in MJR recordings (thanks @tbence94!) [[PR-2573](https://github.com/meetecho/janus-gateway/pull/2573)]
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)

## [v0.11.1] - 2021-04-06

- Add new option to configure ICE nomination mode, if libnice is recent enough [[PR-2541](https://github.com/meetecho/janus-gateway/pull/2541)]
- Added support for per-session timeout values (thanks @alg!) [[PR-2577](https://github.com/meetecho/janus-gateway/pull/2577)]
- Added support for compilation on FreeBSD (thanks @jsm222!) [[PR-2508](https://github.com/meetecho/janus-gateway/pull/2508)]
- Fixed occasional auth errors when using both API secret and stored tokens (thanks @deep9!) [[PR-2581](https://github.com/meetecho/janus-gateway/pull/2581)]
- Added support for stdout logging to daemon-mode as well (thanks @mtorromeo!) [[PR-2591](https://github.com/meetecho/janus-gateway/pull/2591)]
- Fixed odr-violation issue between Lua and Duktape plugins [[PR-2540](https://github.com/meetecho/janus-gateway/pull/2540)]
- Fixed missing simulcast stats in Admin API and Event Handlers when using rid [[Issue-2610](https://github.com/meetecho/janus-gateway/issues/2610)]
- Fixed VideoRoom recording not stopped for participants entering after global recording was started [[PR-2550](https://github.com/meetecho/janus-gateway/pull/2550)]
- Fixed 'audiocodec'/'videocodec' being ignored when joining a VideoRoom via 'joinandconfigure'
- Added content type support to MESSAGE in SIP plugin (thanks @tijmenNL!) [[PR-2567](https://github.com/meetecho/janus-gateway/pull/2567)]
- Made RTSP timeouts configurable in Streaming plugin (thanks @pontscho!) [[PR-2598](https://github.com/meetecho/janus-gateway/pull/2598)]
- Fixed incorrect parsing of backend URL in WebSockets event handler [[Issue-2603](https://github.com/meetecho/janus-gateway/issues/2603)]
- Added support for secure connections and lws debugging to WebSockets event handler
- Fixed occasionally broken AV1 recordings post-processing
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)

## [v0.10.10] - 2021-02-06

- Reduced verbosity of a few LOG_WARN messages at startup
- Close libnice agent resources asynchronously when hanging up PeerConnections (thanks @fbellet!) [[PR-2492](https://github.com/meetecho/janus-gateway/pull/2492)]
- Fixed broken parsing of SDP when trying to match specific codec profiles [[PR-2549](https://github.com/meetecho/janus-gateway/pull/2549)]
- Added muting/moderation API to the VideoRoom plugin [[PR-2513](https://github.com/meetecho/janus-gateway/pull/2513)]
- Fixed a few race conditions in VideoRoom plugin that could lead to crashes [[PR-2539](https://github.com/meetecho/janus-gateway/pull/2539)]
- Send 480 instead of BYE when hanging up calls in early dialog in the SIP plugin (thanks @zayim!) [[PR-2521](https://github.com/meetecho/janus-gateway/pull/2521)]
- Added configurable media direction when putting calls on-hold in the SIP plugin [[PR-2525](https://github.com/meetecho/janus-gateway/pull/2525)]
- Fixed rare race condition in AudioBridge when using "changeroom" (thanks @JeckLabs!) [[PR-2535](https://github.com/meetecho/janus-gateway/pull/2535)]
- Fixed broken API secret management in HTTP long polls (thanks @remvst!) [[PR-2524](https://github.com/meetecho/janus-gateway/pull/2524)]
- Report failure if binding to a socket fails in WebSockets transport plugin (thanks @Symbiatch!) [[PR-2534](https://github.com/meetecho/janus-gateway/pull/2534)]
- Updated RabbitMQ logic in both transport and event handler (thanks @chriswiggins!) [[PR-2430](https://github.com/meetecho/janus-gateway/pull/2430)]
- Fixed segfault in WebSocket event handler when backend was unreachable
- Added TLS support to MQTT event handler (thanks @RSATom!) [[PR-2517](https://github.com/meetecho/janus-gateway/pull/2517)]
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)

## [v0.10.9] - 2020-12-23

- Replaced Travis CI with GitHub Actions [[PR-2486](https://github.com/meetecho/janus-gateway/pull/2486)]
- Fixed data channel messages potentially getting stuck in case of burst transfers (thanks @afshin2003!) [[PR-2427](https://github.com/meetecho/janus-gateway/pull/2427)]
- Fixed simulcast issues when renegotiating PeerConnections [[Issue-2466](https://github.com/meetecho/janus-gateway/issues/2466)]
- Added configurable TURN REST API timeout (thanks @evorw!) [[PR-2470](https://github.com/meetecho/janus-gateway/pull/2470)]
- Added support for recording of binary data channels [[PR-2481](https://github.com/meetecho/janus-gateway/pull/2481)]
- Fixed occasional SRTP errors when pausing and then resuming Streaming plugin handles after a long time
- Fixed occasional SRTP errors when leaving and joining AudioBridge rooms without a new PeerConnection after a long time
- Added support for playout of data channels in Record&Play plugin and demo (thanks @ricardo-salgado-tekever!) [[PR-2468](https://github.com/meetecho/janus-gateway/pull/2468)]
- Added option to override connections limit in HTTP transport plugin [[PR-2489](https://github.com/meetecho/janus-gateway/pull/2489)]
- Added options to enable libmicrohttpd debugging in HTTP transport plugin (thanks @evorw!) [[PR-2471](https://github.com/meetecho/janus-gateway/pull/2471)]
- Fixed a few compile and runtime issues in WebSocket event handler
- Refactored postprocessing management of timestamps to fix some key issues [[PR-2345](https://github.com/meetecho/janus-gateway/pull/2345)]
- Fixed postprocessing of audio recordings containing RTP silence suppression packets [[PR-2467](https://github.com/meetecho/janus-gateway/pull/2467)]
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)

## [v0.10.8] - 2020-11-23

- Added differentiation between IPv4 and IPv6 NAT-1-1 addresses [[PR-2423](https://github.com/meetecho/janus-gateway/pull/2423)]
- Made NACK buffer cleanup on outgoing keyframe disabled by default but configurable [[PR-2402](https://github.com/meetecho/janus-gateway/pull/2402)]
- Added support for simulcast and TWCC to Duktape and Lua plugins [[PR-2409](https://github.com/meetecho/janus-gateway/pull/2409)]
- Fixed rare crash in AudioBridge plugin when leaving a room [[Issue-2432](https://github.com/meetecho/janus-gateway/issues/2432)]
- Fixed codec names not being updated in the SIP plugin after renegotiations (thanks @ihusejnovic!) [[PR-2417](https://github.com/meetecho/janus-gateway/pull/2417)]
- Fixed crash in SIP plugin when handling REGISTER challenges without WWW-Authenticate headers [[Issue-2419](https://github.com/meetecho/janus-gateway/issues/2419)]
- Added option to SIP plugin to let users CANCEL pending transactions without waiting for a 1xx [[PR-2434](https://github.com/meetecho/janus-gateway/pull/2434)]
- Added option to enforce CORS on the server side in both HTTP and WebSocket transport plugins [[PR-2410](https://github.com/meetecho/janus-gateway/pull/2410)]
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)

## [v0.10.7] - 2020-10-30

- Fixed SDP negotiation when client uses max-bundle [[Issue-2390](https://github.com/meetecho/janus-gateway/issues/2390)]
- Added optional JSEP flag to invert processing order of simulcast "rid" in SDP [[PR-2385](https://github.com/meetecho/janus-gateway/pull/2385)]
- Fixed broken rid-based simulcast when using less than 3 substreams
- Fixed occasional misleading "private IP" warning on startup (thanks @npikimasu!) [[PR-2386](https://github.com/meetecho/janus-gateway/pull/2386)]
- Added "plugin-offer mode" to AudioBridge [[PR-2366](https://github.com/meetecho/janus-gateway/pull/2366)]
- Fixed occasional deadlock when sending SUBSCRIBE messages via SIP plugin [[PR-2387](https://github.com/meetecho/janus-gateway/pull/2387)]
- Fixed occasional SIGABRT in RabbitMQ transport (thanks @david-goncalves!) [[PR-2380](https://github.com/meetecho/janus-gateway/pull/2380)]
- Fixed broken RTP parsing in janus-pp-rec when there were too many extensions (thanks @isnumanagic!) [[PR-2411](https://github.com/meetecho/janus-gateway/pull/2411)]
- Fixed occasional segfault when post-processing G.722 mjr recordings
- Added configurable simulcast encodings to janus.js (thanks @fippo!) [[PR-2393](https://github.com/meetecho/janus-gateway/pull/2392)]
- Updated old Insertable Streams APIs in janus.js and e2etest.js
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)

## [v0.10.6] - 2020-10-05

- New mechanism to tweak/query transport plugins via Admin API [[PR-2354](https://github.com/meetecho/janus-gateway/pull/2354)]
- Fixed occasional segfault when using event handlers and VideoRoom [[Issue-2352](https://github.com/meetecho/janus-gateway/issues/2352)]
- Fixed occasional "Unsupported codec 'none'" log errors (thanks @neilyoung!) [[PR-2357](https://github.com/meetecho/janus-gateway/pull/2357)]
- Fixed broken AudioBridge RTP forwarding when using G711 [[Issue-2375](https://github.com/meetecho/janus-gateway/issues/2375)]
- Added helper threads support to RTSP mountpoints as well [[PR-2361](https://github.com/meetecho/janus-gateway/pull/2361)]
- Fixed data channels not working as expected in Streaming plugin when using helper threads
- Fixed simulcast occasionally not working in Streaming plugin until manual PLI trigger
- Added proper fragmentation in WebSockets transport plugin [[PR-2355](https://github.com/meetecho/janus-gateway/pull/2355)]
- Fixed timing resolution issue in MQTT transport (thanks @feymartynov!)) [[PR-2358](https://github.com/meetecho/janus-gateway/pull/2358)]
- Fixed MQTT transport issue when trying to shutdown gracefully (thanks @feymartynov!)) [[PR-2374](https://github.com/meetecho/janus-gateway/pull/2374)]
- Fixed broken configuration of Nanomsg Admin API (thanks @sdamodharan!)) [[PR-2372](https://github.com/meetecho/janus-gateway/pull/2372)]
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)

## [v0.10.5] - 2020-09-08

- Fixed occasional crash in event handlers [[Issue-2312](https://github.com/meetecho/janus-gateway/issues/2312)]
- Fixed occasional crash in VideoRoom plugin [[Issue-2318](https://github.com/meetecho/janus-gateway/issues/2318)]
- Fixed missing PLI when switching Streaming mountpoint [[Issue-2333](https://github.com/meetecho/janus-gateway/issues/2333)]
- Fixed broken recordings in VideoCall plugin (thanks @SamyCookie!) [[PR-2325](https://github.com/meetecho/janus-gateway/pull/2325)]
- Fixed "kick" not working in TextRoom plugin (thanks @backface!) [[PR-2332](https://github.com/meetecho/janus-gateway/pull/2332)]
- Fixed occasional post-processing issues with incomplete mjr files (thanks @SamyCookie!) [[PR-2356](https://github.com/meetecho/janus-gateway/pull/2356)]
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)

## [v0.10.4] - 2020-08-07

- Fixed usrsctp vulnerability by using internal hashmap in SCTP code [[PR-2302](https://github.com/meetecho/janus-gateway/pull/2302)]
- Fixed some issues when using BoringSSL for DTLS (thanks @fancycode!) [[PR-2278](https://github.com/meetecho/janus-gateway/pull/2278)]
- Added support for multiple nat-1-1 addresses (thanks @fancycode!) [[PR-2279](https://github.com/meetecho/janus-gateway/pull/2279)]
- Fixed negotiation issue on Firefox when Janus is built without datachannels [[PR-2281](https://github.com/meetecho/janus-gateway/pull/2281)]
- Fixed small memory leaks when dealing with local candidates (thanks @fancycode!) [[PR-2288](https://github.com/meetecho/janus-gateway/pull/2288)]
- Fixed occasional segfault in VideoRoom when failing to setup a new subscriber [[Issue-2277](https://github.com/meetecho/janus-gateway/issues/2277)]
- Fixed potential deadlock in AudioBridge when switching rooms (thanks @JeckLabs!) [[PR-2280](https://github.com/meetecho/janus-gateway/pull/2280)]
- Fixed small memory leak in AudioBridge (thanks @JeckLabs!) [[PR-2298](https://github.com/meetecho/janus-gateway/pull/2298)]
- Fixed occasional segfault in VideoCall when hanging up calls [[Issue-2300](https://github.com/meetecho/janus-gateway/issues/2300)]
- Fixed occasional curl hiccups with RTSP on some cameras
- Added reconnect mechanism to RabbitMQ event handler (thanks @david-goncalves!) [[PR-2267](https://github.com/meetecho/janus-gateway/pull/2267)]
- Extended MQTT support in transport and event handler to v5 (thanks @feymartynov!) [[PR-2273](https://github.com/meetecho/janus-gateway/pull/2273)]
- Added settings to configure MQTT buffers in the transport plugin (thanks @feymartynov!) [[PR-2286](https://github.com/meetecho/janus-gateway/pull/2286)]
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)


## [v0.10.3] - 2020-07-09

- Fixed occasional crashes in VideoRoom related to subscribers activity [[PR-2236](https://github.com/meetecho/janus-gateway/pull/2236)] [[PR-2253](https://github.com/meetecho/janus-gateway/pull/2253)]
- Fixed AudioBridge compilation issues when libogg is missing (thanks @ffontaine!) [[PR-2238](https://github.com/meetecho/janus-gateway/pull/2238)]
- Fixed broken SRTP forwarders in AudioBridge [[PR-2258](https://github.com/meetecho/janus-gateway/pull/2258)]
- Fixed occasional segfaults due to race conditions in SIP plugin [[PR-2247](https://github.com/meetecho/janus-gateway/pull/2247)]
- Fixed occasional recording issues in Janus and Duktape plugins
- Added timeout (120s) on idle connections in HTTP transport
- Fixed Opus recordings occasionally being way too large than the source file when processed via janus-pp-rec (thanks @neilkinnish!) [[PR-2250](https://github.com/meetecho/janus-gateway/pull/2250)]
- Added a new web demo to use canvas elements as a media source for PeerConnections [[PR-2261](https://github.com/meetecho/janus-gateway/pull/2261)]
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)


## [v0.10.2] - 2020-06-17

- Fixed sscanf-related security issues [[PR-2229](https://github.com/meetecho/janus-gateway/pull/2229)]
- Fixed some RTP extensions not working after renegotiations [[Issue-2192](https://github.com/meetecho/janus-gateway/issues/2192)]
- Fixed occasionally broken simulcast behaviour [[PR-2231](https://github.com/meetecho/janus-gateway/pull/2231)]
- Fixed "switch" request not taking simulcast/SVC into account in VideoRoom and Streaming plugins [[Issue-2219](https://github.com/meetecho/janus-gateway/issues/2219)]
- Fixed inability to ask for random ports when creating Streaming plugin mountpoints with simulcast support [[PR-2225](https://github.com/meetecho/janus-gateway/pull/2225)]
- Fixed occasional crashes in SIP plugin when using helpers [[PR-2216](https://github.com/meetecho/janus-gateway/pull/2216)]
- Updated Duktape dependencies to v2.5, and fixed Duktape plugin relaying text data as binary [[PR-2233](https://github.com/meetecho/janus-gateway/pull/2233)]
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)


## [v0.10.1] - 2020-06-11

- Added initial support for AV1 and H.265 video codecs [[PR-2120](https://github.com/meetecho/janus-gateway/pull/2120)]
- Added initial support for end-to-end encryption via Insertable Streams [[PR-2074](https://github.com/meetecho/janus-gateway/pull/2074)]
- Fixed security issues when processing SDPs [[PR-2214](https://github.com/meetecho/janus-gateway/pull/2214)]
- Fixed occasional codec profile negotiation issues (thanks @groupboard!) [[PR-2212](https://github.com/meetecho/janus-gateway/pull/2212)]
- Fixed occasional segfaults when hanging up VideoRoom subscribers
- Fixed RTSP issues when fmtp is missing (thanks @lionelnicolas!) [[PR-2190](https://github.com/meetecho/janus-gateway/pull/2190)]
- Fixed RTSP not following redirects, when used (thanks @lionelnicolas!) [[PR-2195](https://github.com/meetecho/janus-gateway/pull/2195)]
- Fixed SRTP-SDES and renegotiation issues in NoSIP plugin (thanks @ihusejnovic!) [[PR-2196](https://github.com/meetecho/janus-gateway/pull/2196)]
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)


## [v0.10.0] - 2020-06-01

- Added support for negotiation of codec profiles (mainly VP9 and H.264) [[PR-2080](https://github.com/meetecho/janus-gateway/pull/2080)]
- Added new callback to let plugins know when the datachannel first becomes available, and then any time it's writable (empty buffers) [[PR-2060](https://github.com/meetecho/janus-gateway/pull/2060)]
- Added support for data channel subprotocols [[PR-2157](https://github.com/meetecho/janus-gateway/pull/2157)]
- Added new event handler for GrayLog using GELF (thanks @mirkobrankovic!) [[PR-1788](https://github.com/meetecho/janus-gateway/pull/1788)]
- Added per-user override of global room 'audio_active_packets' and 'audio_level_average' properties to AudioBridge and VideoRoom (thanks @mirkobrankovic!) [[PR-2158](https://github.com/meetecho/janus-gateway/pull/2158)]
- Notify speaker that started/stopped talking too, when talking events are triggered in VideoRoom and AudioBridge (thanks @maxboehm!) [[PR-2172](https://github.com/meetecho/janus-gateway/pull/2172)]
- Allow listing of private rooms/mountpoints if an admin_key is used (thanks @robby2016!) [[PR-2161](https://github.com/meetecho/janus-gateway/pull/2161)]
- Fixed RTCP support not triggering PLIs for new simulcast mountpoint viewers [[Issue-2156](https://github.com/meetecho/janus-gateway/issues/2156)]
- Fixed occasional issue binding multicast mountpoints (thanks @PaulKerr!) [[PR-2167](https://github.com/meetecho/janus-gateway/pull/2167)]
- Fixed buffering of keyframes not working in Streaming plugin (thanks @TomFFF!) [[PR-2170](https://github.com/meetecho/janus-gateway/pull/2170)]
- Added support for buffering of keyframes to RTSP mountpoints too (thanks @lionelnicolas!) [[PR-2180](https://github.com/meetecho/janus-gateway/pull/2180)]
- Fixed renegotiation support in SIP plugin when audio/video is added (thanks @ihusejnovic!) [[PR-2164](https://github.com/meetecho/janus-gateway/pull/2164)] [[PR-2173](https://github.com/meetecho/janus-gateway/pull/2173)]
- Fixed menus in html documentation when using Doxygen >= 1.8.14 (thanks @i8-pi!) [[PR-2155](https://github.com/meetecho/janus-gateway/pull/2155)]
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)


## [v0.9.5] - 2020-05-18

- Fixed sessions not being cleaned up when disabling session timeouts and the transport disconnects (thanks @nicolasduteil!) [[PR-2143](https://github.com/meetecho/janus-gateway/pull/2143)]
- Added option to keep candidates with private host addresses when using nat-1-1, and advertize them too instead of just replacing them
- Added auth token, if available, to 'attached' event (handlers) and to Admin API (handle_info)
- Added new API to start/stop recording a VideoRoom as a whole, and a new option to prevent participants from starting/stopping their own recording (thanks @wheresjames!) [[PR-2137](https://github.com/meetecho/janus-gateway/pull/2137)]
- Fixed rare deadlock when wrapping up Streaming plugin mountpoints [[PR-2141](https://github.com/meetecho/janus-gateway/pull/2141)]
- Fixed rare deadlock when destroying AudioBridge rooms
- Added synchronous request to check if an announcement is playing in the AudioBridge
- Fixed AudioBridge announcement not waking up sleeping forwarder
- Added global room mute/unmute support to AudioBridge
- Added configurable DSCP support for outgoing RTP packets to SIP and NoSIP plugins (thanks @GerardM22!) [[PR-2150](https://github.com/meetecho/janus-gateway/pull/2150)]
- Added support for RTP extensions (audio-level, video-orientation) to NoSIP plugin [[Issue-2152](https://github.com/meetecho/janus-gateway/issues/2152)]
- Added option to configure ciphers suite for secure WebSockets (thanks @agclark81!) [[PR-2135](https://github.com/meetecho/janus-gateway/pull/2135)]
- Added timer to janus.js to avoid spamming onmute/onunmute events and flashing videos [[PR-2147](https://github.com/meetecho/janus-gateway/pull/2147)]
- Added a new tool to convert .pcap captures to .mjr recordings [[PR-2144](https://github.com/meetecho/janus-gateway/pull/2144)]
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)


## [v0.9.4] - 2020-05-04

- Updated code not to wait forever for local candidates when half-trickling and sending an SDP out
- Fixed occasional CPU spiking issues when dealing with ICE failures (thanks @sjkummer!)
- Fixed occasional stall when gathering ICE candidates (thanks @wheresjames!)
- Fixed the incorrect value being set via DSCP, when configured
- Fixed occasional race condition when hanging up VideoRoom subscribers
- Fixed Audiobridge and Streaming plugins not playing the last chunk of .opus files (thanks @RSATom!)
- Fixed duplicate subscriptions (and SRTP/SRTCP errors) on multiple watch requests in Streaming plugin
- Updated Streaming and TextRoom plugins to stop using legacy datachannel negotiation
- Fixed occasional crash in HTTP transport when dealing with unknown requests
- Fixed occasional disconnect in WebSockets (thanks @tomnotcat!)
- Made RabbitMQ exchange type configurable in both transport and event handler (thanks @voicenter!)
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)


## [v0.9.3] - 2020-04-22

- Change libsrtp detection in the configure script to use pkg-config
- Fixed compilation error with gcc10
- Fixed RTCP issue that could occasionally lead to broken retransmissions when using rtx
- Added option to specify DSCP Type of Service (ToS) for media streams
- Fixed a couple of race conditions during renegotiations
- Fixed VideoRoom and Streaming "destroy" not working properly when using string IDs
- Fix occasional segfault in VideoRoom (thanks @cb22!)
- Fixed AudioBridge "create" not working properly when using string IDs
- Added support for playing Opus files in AudioBridge rooms
- Added support to Opus files for file-based mountpoints in Streaming plugin
- Added support for generic metadata to Streaming mountpoints
- Streaming plugin now returns mountpoint IP address(es) in "create" and "info", when binding to specific IP/interface
- Fixed occasional segfault when using helper threads in Streaming plugin
- Fixed occasional race conditions in HTTP transport
- Added support for specifying screensharing framerate in janus.js (thanks @agclark81!)
- Cleaned up code in janus.js (thanks @alienpavlov!)
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)


## [v0.9.2] - 2020-03-26

- Converted HTTP transport plugin to single thread (now requires libmicrohttpd >= 0.9.59)
- Fixed .deb file packaging (thanks @FThrum!)
- Added foundation for aiortc-based functional testing (python)
- Fixed occasional audio/video desync
- Added asynchronous resolution of mDNS candidates, and an option to automatically ignore them entirely
- Updated default DTLS ciphers (thanks @fippo!)
- Added option to generate ECDSA certificates at startup, instead of RSA (thanks @Sean-Der!)
- Fixed rare race condition when claiming sessions
- Fixed rare crash in ice.c (thanks @tmatth!)
- Fixed dangerous typo in querylogger_parameters (copy/paste error)
- Fixed occasional deadlocks in VideoRoom (thanks @mivuDing and @agclark81!)
- Added support for RTSP Content-Base header to Streaming plugin
- Fixed double unlock when listing private rooms in AudioBridge
- Made AudioBridge prebuffering property configurable, both per-room and per-participant
- Added G.711 support to AudioBridge (both participants and RTP forwarders)
- Added called URI to 'incomingcall' and 'missed_call' events in SIP plugin (in case the registered user is associated with multiple public URIs)
- Fixed race conditions and leaks in VideoCall and VoiceMail plugins
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)


## [v0.9.1] - 2020-03-10

- Added configurable global prefix for log lines
- Implemented better management of remote candidates with invalid addresses
- Added subtype property to differentiate some macro-types in event handlers
- Improved detection of H.264 keyframes (thanks @cameronlucas3!)
- Added configurable support for strings as unique IDs in AudioBridge, VideoRoom, TextRoom and Streaming plugins
- Fixed small memory leak when creating Streaming mountpoints dynamically
- Fixed segfault when trying to start a SIP call with a non-existing refer_id (thanks @tmatth!)
- Fixed errors negotiating video in SIP plugin when multiple video profiles are provided
- Updated SIP plugin transfer code to answer with a 202 right away, instead of sending a 100 first (which won't work with proxies)
- Added several features and fixes several nits in SIP demo UI
- Fixed janus.js error callback not being invoked when an HTTP error happens trying to attach to a plugin (thanks @hxl-dy!)
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)


## [v0.9.0] - 2020-02-21

- Refactored core-plugin callbacks
- Added RTP extensions termination
- Removed requirement to enable ICE Lite to use ICE-TCP, even though it may cause issues (thanks @sjkummer!)
- Added support for transport-wide CC on outgoing streams (feedback still unused, though)
- Dynamically update NACK queue size depending on RTT
- Fixed risk of RTP header memory misalignment when dealing with rtx packets
- Users muted in AudioBridge by an admin are now notified as well (thanks @klanjabrik!)
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)


## [v0.8.2] - 2020-02-04

- Added Travis CI integration (thanks @fippo for kickstarting it!)
- New configuration property to add protected folders not to save recordings and pcap captures to
- Fixed rare race condition when joining and destroying a VideoRoom session
- Improved parsing of headers in RTSP messages (thanks @kefir266!)
- Fixed segfault in AudioBridge when leaving a room before PeerConnection is ready
- Fixed '500' errors being sent in response to incoming OPTIONS in the SIP plugin (thanks @ycherniavskyi!)
- Fixed helpers not being able to send SUBSCRIBE requests in SIP plugin
- Added option to fix audio skew compensation, if present, to janus-pp-rec
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)


## [v0.8.1] - 2020-01-13

- Added binary data support to data channels
- Fixed segfault at startup if event handlers or loggers directory couldn't be opened (thanks @kazzmir!)
- Fixed potential segfault when closing logging at shutdown
- Allowed RTCP ports to be picked randomly using 0, in Streaming plugin
- Fixed occasional memory leak when destroying mountpoints in Streaming plugin
- Fixed memory leak in SIP plugin
- Updated 'referred_by' field to contain the value of SIP referred-by header, and not just the URI (thanks @pawnnail!)
- Don't keep TextRoom plugin loaded if data channels were not compiled
- Removed SIPre plugin from the repo
- Fixed late initialization of janus.js constructor callbacks
- Changed janus.js to use sendBeacon instead of XHR when closing/refreshing page
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)


## [v0.8.0] - 2019-12-12

- Added changelog file to the repo and docs (thanks @oscarvadillog!)
- Added new category of plugins for modular logging (stdout and file still there, and part of the core)
- Removed option to enable rtx (now always supported, when negotiated)
- Added gzip compression helper method to the core utils
- Fixed RTSP SETUP issues when url contains query string parameters
- Added option to gzip events when using the Sample Event Handler
- Streamlined janus.js (thanks @oscarvadillog!)
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)


## [v0.7.6] - 2019-11-27

- Split SDP lines when parsing on line feed only, and trim carriage feed instead (\n instead of \r\n)
- Reduced default twcc_period (how often to send feedback when using Transport Side BWE) from 1s to 200ms
- Added option to skip (and disable) unreachable STUN/TURN server at startup (thanks @sjkummer!)
- Fixed video desynchronization when doing G.722/iSac audio
- Other generic fixes on A/V desync
- Added support for multiple concurrent calls for the same account to the SIP plugin
- Added support for blind and attended transfers to the SIP plugin
- Added way to inject custom Contact params in REGISTER to the SIP plugin
- Added way to intercept non-standard headers in SIP messages to SIP plugin (thanks @ihusejnovic!)
- Fixed missing SIP CANCEL when hanging up outgoing unanswered calls in SIP plugin
- Added support for domain names (and IPv6) to RTP forwarders in AudioBridge and VideoRoom
- Fixed broken b=TIAS SDP attribute support for Firefox in VideoRoom (thanks @MvEerd!)
- Fixed and improved VP9 SVC support in VideoRoom and Streaming plugins
- Added IPv6 support to Streaming plugin
- Fixed potential segfault in Streaming plugin (thanks @garry81!)
- Fixed occasional latching issues for RTSP in Streaming plugin
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)


## [v0.7.5] - 2019-10-28

- Added warning at startup if libnice version is outdated (at least 0.1.15 recommended)
- Added option to specify CWD when launching Janus as a daemon (thanks @l7s!)
- Extended the STUN test via Admin API to support binding to a specific port, and return the public one
- Fixed simulcast issue when needing to automatically drop to lower layers
- Fixed potential endless loop when binding ports in the Streaming plugin
- Made creating Streaming mountpoints more asynchronous (especially for RTSP)
- Added support for SIP SUBSCRIBE/NOTIFY to SIP plugin
- Added ability to add custom headers to SIP BYE (thanks @mmujic!)
- Added option to specify IP to bind to for media in SIP plugin (thanks @razvancrainea!)
- Fixed occasional segfault when leaving a VideoRoom
- Added audio level dBov average to talk events in VideoRoom plugin (thanks @aconchillo!)
- Added new synchronous API to mute other participants in the AudioBridge plugin (thanks @klanjabrik!)
- Fixed typo in SDP processing in Duktape/JavaScript plugin, and tied Duktape logging to the one in the Janus core (thanks @l7s!)
- Tied Lua logging to the one in the Janus core
- Added command line option to janus-pp-rec to specify the output format (thanks @rscreene!)
- Added new WebSocket and Nanomsg event handlers
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)


## [v0.7.4] - 2019-09-06

- Fixed duplicate values in config that could result in wrong property being used
- Fixed occasional race condition when processing SDPs (thanks @Bug-Fairy!)
- Fixed broken SDP when rejecting audio/video m-line
- Fixed Admin API not responding after sending messages to unresponsive plugins
- Fixed some issues with RTSP support in Streaming plugin
- Added option to keep recording Streaming mountpoints even when disabled
- Allow SIP plugin to negotiate SRTP separately for audio and video
- Fixed autoaccept_reinvites=FALSE not working when accepting calls in SIP plugin, and improved re-INVITEs support in general (thanks @pawnnail!)
- Added possibility to have different addresses for remote audio and video in SIP, SIPre and NoSIP plugins (thanks @pawnnail!)
- Make sure remote addresses are reset when call ends in SIP, SIPre and NoSIP plugins (thanks @pawnnail!)
- Added SIP Reason Header (RFC3326) info to "hangup" event in SIP plugin, if available (thanks @ihusejnovic!)
- Added method to list participants in a TextRoom (thanks @mtltechtemp!)
- Added method to send a room announcement in TextRoom plugin
- Fixed occasional segfault in TextRoom when using Admin API to send requests (thanks @MvEerd!)
- Added support for MQTT v5, and fixed reconnection issue (thanks @feymartynov!)
- Fixed occasional crashes when using more than one event handler at the same time
- Added configurable bitrate values for rid-based simulcast to janus.js (thanks @vivaldi-va!)
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)


## [v0.7.3] - 2019-07-10

- Added Admin API method to make synchronous requests to plugins
- Fixed broken media when removing/adding it again in renegotiations
- Fixed several issues related to datachannels
- Fixed occasional memory leak in the core when ending sessions from plugins (thanks @uxmaster!)
- Changed Janus API 'slowlink' event to use lost packets instead of NACKs, and made it configurable with a dynamic threshold
- Fixed broken SDES length in compound RTCP packets (thanks @glenn-hpcnt!)
- Fixed DTLS window size support in the core (thanks @garry81!)
- Added status messages to MQTT transport (thanks @feymartynov!)
- Changed default for sender-side bandwidth estimation in VideoRoom to TRUE
- Fixed occasional segfaults when using RTP forwarders with RTCP support
- Added VideoRoom RTP forwarder events to event handlers notifications
- Added a configurable RTP range to the Streaming plugin settings
- Fixed broken H.264 simulcast support in Streaming plugin
- Refactored janus-pp-rec to support command line options
- Fixed occasional segfault when post-processing VP8 recordings
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)


## [v0.7.2] - 2019-06-07

- Removed requirement for both sdpMid and sdpMLineIndex to be in trickle messages
- Set ICE remote credentials when receiving remote SDP, instead of later
- Fixed occasional segfaults when using WebSocket as a transport
- Fixed segfault in WebSocket transport when using ACL
- Added new Admin API messages to destroy a session, detach a handle and hangup a PeerConnection (same as Janus API)
- Fixed leak when RTP forwarding with RTCP feedback in the VideoRoom plugin
- Added support for third spatial layer when using VP9 SVC in VideoRoom (assuming EnabledByFlag_3SL3TL is used)
- Fixed segfault when changing rooms in AudioBridge
- Made sure the SIP stack doesn't accept new calls until the previous one has freed all resources
- Fixed occasional segfault when pushing SIP messages to event handlers
- Added option to locally cleanup handles when destroying a session in janus.js
- Fixed exception in janus.js when using datachannels
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)


## [v0.7.1] - 2019-05-20

- Added experimental debug mode with disabled WebRTC encryption (to use with the --disable-webrtc-encryption in Chrome unstable)
- Added Janus API ping/pong mechanism to Admin API as well
- Added Admin API methods to check address resolving capabilities and test a provided STUN server
- Added check on ICE gathering process start (fixes issue with exhausted port range)
- Added support for temporal layer in H.264 simulcast via frame marking
- Made sure a PLI is sent on all layers, when simulcast is used
- Fixed a crash when using event handlers in SIP plugin
- Fixed some race conditions on hangups in SIP plugin
- Added option to lock RTP forwarding functionality via an admin key/secret (VideoRoom and AudioBridge)
- Fixed regression in Streaming plugin RTCP support
- Added option to override payload type for RTSP mountpoints in Streaming plugin
- Fixed a few issues saving permanent mountpoints in Streaming plugin
- Separated checks for PeerConnection and getUserMedia support in janus.js (since plain HTTP hides getUserMedia now)
- Added sanity checks on createOffer/createAnswer in janus.js
- Fixed regression in simulcasting when doing SDP munging in janus.js
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)


## [v0.7.0] - 2019-05-10

- Added support for multiple datachannel streams in the same PeerConnection
- Forced DTLS 1.2 on older OpenSSL versions
- Added first integration of SDP support in the fuzzers
- Fixed several leaks in SDP utils
- Explicitly disabled support for encrypted RTP extensions (was causing SDP inconsistencies)
- Added count of incoming retransmissions to Admin API and Event Handlers stats
- Improved check for H.264 keyframe (thanks bwerther!)
- Modified "cap REMB" behavior to "replace REMB"
- Fixed missing notification of lurkers when first joining VideoRoom with notify_join=TRUE
- Improved support for incoming re-INVITEs in SIP plugin
- Fixed check in WebSocket transport that could lead to crashes
- Fixed occasional segfaults when postprocessing H.264 recordings
- Added new callback to janus.js to intercept the SDP before it is sent, e.g., for munging purposes (thx @carlcc!)
- Fixed direction property error in janus.js on Safari (thx @alienpavlov!)
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)


## [v0.6.3] - 2019-03-20

- Removed folder with self-signed certificate (unneeded and confusing)
- Added many fixes and improvements to the RTCP code
- Fixed typos that caused issues when sending retransmissions using RFC4588
- Fixed typo when sending empty RR coupled with REMB
- Made sure the CNAME is always the same for all m-lines in an SDP
- Added support for mid RTP extension
- Improved support for rid-based simulcasting
- Fixed publish errors in MQTT transport and event handler
- Fixed issue when switching Streaming mountpoints powered by helper threads
- Added info on whether VideoRoom publisher is simulcasting to join events
- Added option for new VideoRoom subscribers to specify simulcast substream/layer to subscribe to in join request (before it was configure-only)
- Added type definitions for janus.js (thanks Elias!)
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)


## [v0.6.2] - 2019-03-04

- Added RTP/RTCP fuzzing targets and tools
- Fixed occasional crash when pushing the local SDP to event handlers, when enabled
- Fixed NACK issue when receiving an out of order keyframe
- Added option to configure the TWCC feedback period
- Added option to include opaqueID in Janus API events
- Added option to negotiate Opus inband FEC in the VideoRoom
- Added option to specify temporary extension when recording AudioBridge rooms, and event handler notification for when recording is over
- Fixed occasional playout issue after recording, using Record&Play demo
- Fixed typo in janus.js that affected replacing audio tracks in renegotiations
- Changed default maxev (number of events in long poll results) to 10 in janus.js
- Updated path of getDisplayMedia in janus.js to reflect current spec (thanks cb22!)
- Fixed ambiguous check in Janus.isWebrtcSupported in janus.js
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)


## [v0.6.1] - 2019-02-11

- Added several fixes to RTP/RTCP parsing after fuzzing tests
- Added fixes to keyframe detection after fuzzing tests
- Fixed some demos not working after update to Chrome 72
- Fixed occasional crashes when saving .jcfg files (e.g., saving permanent Streaming mountpoints)
- Added new Admin API command to temporarily stop/resume accepting sessions (e.g., for draining servers)
- Fixed recordings sometimes not closed/destroyed/renamed when hanging up SIP sessions
- Added option to SIP/SIPre/NoSIP plugin to override c= IP in SDP
- Fixed missing RTSP support in Streaming plugin if TURN REST API was disabled in configure
- Fixed Streaming plugin not returning complete information on secret-less mountpoints (thanks @Musashi178!)
- Fixed missing .jcfg support in Duktape plugin (thanks @fbertone!)
- Updated janus.js to use transceivers for Chrome >=72
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)


## [v0.6.0] - 2019-01-07

- Changed default configuration format to libconfig (INI still supported but deprecated)
- Fixed several RTCP parsing issues that could lead to crashes (thanks to Fippo for bringing fuzzying to our attention!)
- Added support to clang compiler (needed for fuzzying)
- Fixed rtx packets ending up in retransmission buffer (thanks glenn-hpcnt!)
- Fixed occasional crash when cleaning NACK buffer (thanks tmatth!)
- Fixed loop termination warning when handling event handlers (thanks tmatth!)
- Fixed occasional invalid rtx payload type
- Fixed local SDP notification to event handlers
- Fixed typo in link quality calculation
- Fixed occasional crash in SIP plugin
- Added option to provide custom headers in SIP 200 OK as well (thanks ihusejnovic!)
- Fixed typo in Range header when sending RTSP PLAY in Streaming plugin (thanks Phil1972!)
- Made MQTT and RabbitMQ configuration files more consistent with other ones (thanks manifest!)
- Added support for Last Will and Testament to MQTT event handler (thanks 0nkery!)
- Fixed broken video when post-processing recordings with high-profile H.264
- Fixed missing success callback in sendDtmf JS method (thanks nevcos!)
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)


## [v0.5.0] - 2018-11-20

- Refactored core to have a persistent GMainLoop/thread per handle
- Added option to share static number of GMainLoop/thread instances for multiple handles
- Better management of incoming RTCP packets before passing them to plugins
- Updated TURN REST API to support both "key" and "api" as parameters
- Added support for dumping directly to .pcap, rather than text first via text2pcap
- Fixed occasional missing notifications of temporal layer changes, when doing simulcast
- Fixed occasional crash in TextRoom plugin
- Fixed crashes in Duktape plugin after some iterations
- Added .mjr metadata to media files when postprocessing the recordings, if supported by the container
- Fixed datachannels not working in Streaming demo, when configured
- Fixed dangling "Publish" button in VideoRoom demo
- Better management of timeout notifications when using websockets in janus.js (thanks @nevcos!)
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)


## [v0.4.5] - 2018-10-16

- Switched to GMutex for locks by default (changeable in configure)
- Fixed missing sdpMid in some trickle candidates, which could break full-trickle support
- Fixed missing TWCC info when handling rtx duplicates (thanks garry81!)
- Fixed H.264 keyframe detection and broken H.264 simulcast code
- Fixed bug in skew compensation code
- Fixed occasional crashes when closing PeerConnections in AudioBridge
- Fixed broken Record-Route usage in SIP plugin (thanks Dan!)
- Removed outdated autoack property from SIP plugin
- Switched from SET_PARAMETER to OPTIONS as an RTSP keep-alive (thanks cnzjy!)
- Fixed missing endianness for RTP packets in postprocessor, which caused problems on MacOS
- Fixed crash in postprocessor when handling high(er) H.264 profiles (e.g., Safari 12)
- Fixed multiple "First keyframe" log lines when postprocessing video
- Added support for parsing a few RTP extensions in the postprocessor
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)


## [v0.4.4] - 2018-09-28

- Added several important fixes to NACK and retransmission code
- Fixed connectivity establishment when only available candidates are prflx
- Fixed some leaks in TWCC code
- Fixed missing information when reporting TWCC reports (thanks Kangsik!)
- Made the timeout for trickle candidates configurable
- Added support for mDNS candidates (see draft-ietf-rtcweb-mdns-ice-candidates)
- Added option to configure the DTLS retransmission timer (BoringSSL only)
- Optimized DTLS writes by removing a copy on each send (thanks Joachim!)
- Added option to override codecs to negotiate in EchoTest
- Added H.264 simulcasting support to plugins that did VP8 simulcast already
- Added VP9/SVC support to the Streaming plugin
- Improved the way simulcast streams can be recorded and forwarded
- Added partial RTCP support to RTP forwarders (thanks Adam!)
- Fixed occasional segfaults in the VideoRoom when forcing private IDs (thanks tugtugtug!)
- Added option to use helper threads for Streaming plugin mountpoints
- Fixed a couple of errors in the RTSP support of the Streaming plugin (thanks nu774!)
- Several fixes in the NoSIP plugin (thanks Dmitry!)
- Fixed broken SIP MESSAGE support in SIP plugin
- Fixed occasional segfaults in SIP and SIPre plugins (thanks mharcar!)
- Fixed broken recording support in the VideoCall plugin (thanks codebot!)
- Fixed potential deadlock in Lua and Duktape plugins (thanks Gabriel!)
- Fixed memory leaks in VideoRoom, AudioBridge and TextRoom
- Added new MQTT event handler (thanks Olle!)
- Made HTTP REST API optionally more consistent with other transports
- Added new flag to postprocessor for just printing the JSON header
- Fixed occasional segfaults when processing recordings
- Added getDisplayMedia() support to janus.js
- Added better support to constraints when screensharing (thanks Sol!)
- Added better iOS devices support to janus.js and the demos
- Other smaller fixes and improvements (thanks to all who contributed pull requests and reported issues!)


## [v0.4.3] - 2018-08-27

- Fixed occasional crash when closing PeerConnections
- Fixed way of negotiating datachannels in Firefox Nightly
- Fixed broken check when enabling TURN REST API
- Fixed occasional crash when post-processing H.264 recordings (thanks Thomas!)
- Fixed occasional issue when creating PID file
- Fixed broken SDES generation (thanks Garry!)
- Added new Duktape plugin to write plugin logic in JavaScript
- Fixed occasional crash in VideoCall plugin when declining calls
- Added basic RTCP support to the Streaming plugin (thanks Adam!)
- Added basic RTCP support to RTP forwarders in the VideoRoom plugin
- Added new Nanomsg transport
- Changed the way libwebsockets logging is configured
- Updated janus.js to use promises for WebRTC APIs (thanks Philipp!)
- Some more bug fixes and improvements


## [v0.4.2] - 2018-06-18

- Fixed ICE loop not terminating at times, and spiking the CPU
- Fixed compilation against older OpenSSL versions (thanks Joachim!)
- Added option to statically enable locking debug via command line or configuration file
- Fixed occasional crash in VideoRoom when destroying rooms
- Fixed VideoRoom not closing subscribers PeerConnections when publisher goes away, if so configured
- Fixed SRTP errors when resuming VideoRoom subscribers that were paused for a long time
- Added new option to really force a cap on the bitrate in VideoRoom rooms
- Fixed recording not being started for VideoRoom publishers media added in a renegotiation
- Fixed occasional crash in AudioBridge when closing PeerConnections under load
- Added Opus FEC support to AudioBridge (thanks Eric!)
- Fixed pipe socket initialization in Streaming plugin (thanks Adam!)
- Added systemd support to Unix Sockets transport plugin (thanks Adam!)
- WebSocket connection is no longer torn down in case of a Janus session timeout
- Added options to configure keep-alive and long-poll timers in janus.js
- Some more bug fixes and improvements


## [v0.4.1] - 2018-05-29

- Single thread per PeerConnection, instead of two
- Fixed issue with API secret, where sessions would be created anyway
- Cleanup of ICE related code (thx Joachim!)
- Removed ad-hoc thread for SCTP code
- Fixed deadlock in VideoRoom plugin
- Fixed segfault in SIPre plugin
- Fixed leaks when using event handlers (thx zgjzzhw!)
- Fixed some missing events when closing PeerConnections
- Fixed broken dependencies mechanism in janus.js (thx Philippe!)
- Some more bug fixes and improvements


## [v0.4.0-broken] - 2018-05-22

- Changed memory management to use reference counters
- New plugin to write application logic in Lua
- Added mechanism to reclaim sessions after a reconnection (thx Geige!)
- Fixed broken renegotiations when upgrading from audio-only to audio-video
- Fixed typo in evaluation of RTT from RTCP packets
- Fixed crash when SRTP profile is missing in DTLS handshake
- Improved and streamlined a few events (event handlers), e.g., selected-pair
- Added new "external" events (event handlers), for events pushed via Admin API
- Fixed deadlock when joining a VideoRoom with notify_join=true
- Fixed some info not saved permanently in some plugins when editing
- Added media latching to RTSP streams setup in the Streaming plugin
- Fixed an issue with simulcast support in the Streaming plugin
- Fixed occasional unexpected WebSockets disconnects when using the Streaming plugin
- Fixed Streaming plugin not returning bound ports when creating mountpoints with random ones (port=0)
- Improved and streamlined documentation for all plugins
- Added option to limit ciphers/protocols in HTTP and WebSockets (thx Alexander!)
- Added transceivers support to janus.js for proper renegotiations in Firefox
- More bug fixing and general cleanup (thx to mtdxc, fancycode and others!)
- Added a way to support other screensharing extensions in janus.js in a programmatic way (thx Sol!)


## [v0.3.1] - 2018-04-04

- Changed threading model for processing requests in the core
- Added support for SRTP AES-GCM to core and SIP/SIPre/NoSIP plugins
- Changed set of ciphers negotiated in DTLS, disabling weaker ones (thanks Chad!)
- Added option to specify passphrase when dealing with certificates/keys
- Added ability for Admin API requests to tweak Event Handlers
- Integrated link quality stats info (thanks Piter!)
- Added support for storage-less authentication via Signed Tokens (thanks Sol!)
- Added option to force TCP for SIP messages in the SIP plugin
- Added option to not fail RTSP mountpoint creation right away if backend is not up
- Added SSL/TLS support to the MQTT transport (thanks Andrei!)
- Added new request to edit some Streaming mountpoint properties (thanks Rob!)
- Fixed management of DTMF in janus.js
- Updated management of constraints in janus.js (thanks Igor!)
- Bug fixing and general improvements


## [v0.3.0] - 2018-02-23

- Implemented renegotiations and ICE restarts
- Bundle and rtcp-mux now are always forced
- Added support to Transport Wide CC sender-side BWE (thanks Sergio!)
- Added SRTP support to Streaming mountpoints
- Implemented a skew compensation algorithm in the Streaming plugin
- Added SRTP support to RTP forwarders
- Implemented support for RFC4588 (rtx/90000 retransmissions)
- Janus can now do full-trickle too
- SIP plugin now supports 407 (proxy authentication)
- Fixed post-processing of G.711 recordings
- Added versioning info to janus-pp-rec
- Several fixes and cleanup


## [v0.2.6] - 2017-12-19

- New SIP plugin based on libre, SIPre (janus.plugin.sipre), and related demo
- New NoSIP plugin, that can be used with legacy applications (like SIP) without doing any signalling itself
- VideoRoom can now support multiple codecs at the same time, instead of being forced to choose just one per media type
- Plugins now record streams specifying the actual codec in use, instead of making assumptions (e.g., like Record&Play did with Opus and VP8)
- Streaming plugin now allows you to temporarily pause audio and/or video delivery via "configure" requests
- Removed RTCP BYE as a trigger to shutdown a PeerConnection (fixes Firefox 52 issues)
- Added RTCP support for simulcast SSRCs
- Fixed parsing of Firefox simulcast offer when order of attributes was different than expected
- Improved RTP headers rewriting in case of SSRC changes (e.g., context switches)
- Improved performance of the ICE send threads/loops and computation of transfer rates, by getting rid of all list traversals
- Added support for MSG_EOR in SCTP datachannels
- Added "exchange" support to RabbitMQ transport
- Added new info to Event Handlers (server info in "started" event, and server name in "emitter")
- Added RabbitMQ Event Handler
- You can now add additional constraints for a PeerConnection when invoking createOffer and createAnswer in janus.js
- Fixed occasional problems when postprocessing .mjr recordings, especially long ones, and Opus recordings
- Several bug and typo fixes, in both core and janus.js


## [v0.2.5] - 2017-10-23

- VP8 simulcasting supported in a few plugins (you may have experimented with it on the online demos already);
- VP9 SVC is also available (VideoRoom only);
- VideoRoom and Streaming plugins allow you to subscribe to a subset of the feed's media (e.g., only get audio even though feed is audio/video);
- automatic fallback in the VideoRoom to subset of the media in case of unsupported codecs (e.g., Safari joining VP8 room falls back to audio only);
- added option to override rtpmap and fmtp SDP attributes for RTSP mountpoints in the Streaming plugin;
- added support for other codecs besides opus and VP8 in Record&Play plugin;
- added option to have a static RTP forwarder for an AudioBridge room in the configuration file;
- added possibility to specify an RTP range to use in the SIP plugin;
- implemented text2pcap support to dump incoming and outgoing unencrypted RTP/RTCP traffic for debugging purposes;
- added support to G.722 in postprocessor;
- made sure that each m-line now has its own a=end-of-candidates attribute;
- fixed crash in websockets transport plugin when SSL was enabled on both APIs;
- added support to ping/pong mechanism in websockets transport plugin;
- switched from addstream to addtrack in janus.js;
- decoupled the dependencies in janus.js to allow for dynamic override of some features;
- added support to build JavaScript modules out of janus.js.


## [v0.2.4] - 2017-07-28

- binding to some or all interfaces/families has been fixed in the HTTP transport;
- the Access-Control-Allow-Origin return value is now configurable in the HTTP transport;
- fixed occasional slow WebSocket request management when DNS was involved;
- there's a new timer before we return an ICE failed (as due to trickling there may be a success shortly after a temporary failure);
- the frequency of media stats notifications (event 32) in event handlers has been made configurable (default is still 1s);
- event handlers now notify about each local and remote candidate as well;
- the admin.html demo page now prompts you with the password (although you can still hardcode it in the page, as before);
- several changes in the SIP plugin: support for offerless INVITEs, early media (183+SDP), outbound proxies, and fixes to some POLLERR messages;
- added support for LibreSSL as an alternative to OpenSSL and BoringSSL;
- added a=end-of-candidates to all m-lines, since we half-trickle (fixes Edge support);
- fixed a race condition in the TextRoom plugin;
- fixed the way janus.js used getStats, in particular for Firefox;
- fixed device selection demo;
- several smaller fixes derived from a static analysis of the code via Coverity.


## [v0.2.3] - 2017-06-12

- A few janus.js fixes (among which a small fix to get it working with Safari, and the possibility to add mic audio when screensharing);
- Several RTCP related enhancements in the Streaming plugin;
- Support for on-hold in SIP plugin;
- Fixed MQTT transport when credentials are needed;
- Improved "kick" in VideoRoom (needs forcing of private_id when creating room);
- Possibility to create Streaming mountpoints with random ports, instead of specifying them via API;
- Optional "talking" events in AudioBridge and VideoRoom;
- Possibility to force BUNDLE/rtcp-mux per handle via API (no need to wait for complete negotiation);
- Several bug fixes, a couple of them to nasty race conditions that finally got solved.


## [v0.2.2] - 2017-03-08

- ACL/Kick support in VideoRoom/AudioBridge/TextRoom
- Man pages for Janus and post-processor
- Opaque identifiers for Event handlers + Transport related events
- Ability to specify SSRC + payload type when using RTP forwarders
- Ability to relay datachannels in Streaming plugin
- Ability to send some TextRoom commands (e.g., create/list/etc.) via Janus API instead of only datachannels
- Configurable session timeouts
- Configurable "no-media" timeouts
- Optional temporary extension for recordings until they're done
- cleanup and bug fixing


## [v0.2.1] - 2016-12-13

- Missing info


## [v0.2.0] - 2016-10-10

- Missing info


## [v0.1.2] - 2016-09-05

- Missing info


## [v0.1.1] - 2016-06-15

- Missing info


## [v0.1.0] - 2016-05-27

- Missing info


## [v0.0.9] - 2015-11-11

- First release


================================================
FILE: COPYING
================================================
                    GNU GENERAL PUBLIC LICENSE
                       Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The GNU General Public License is a free, copyleft license for
software and other kinds of works.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.  We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors.  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

  To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights.  Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received.  You must make sure that they, too, receive
or can get the source code.  And you must show them these terms so they
know their rights.

  Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.

  For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software.  For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.

  Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so.  This is fundamentally incompatible with the aim of
protecting users' freedom to change the software.  The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable.  Therefore, we
have designed this version of the GPL to prohibit the practice for those
products.  If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.

  Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary.  To prevent this, the GPL assures that
patents cannot be used to render the program non-free.

  The precise terms and conditions for copying, distribution and
modification follow.

                       TERMS AND CONDITIONS

  0. Definitions.

  "This License" refers to version 3 of the GNU General Public License.

  "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

  "The Program" refers to any copyrightable work licensed under this
License.  Each licensee is addressed as "you".  "Licensees" and
"recipients" may be individuals or organizations.

  To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

  A "covered work" means either the unmodified Program or a work based
on the Program.

  To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

  To "convey" a work means any kind of propagation that enables other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

  An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

  1. Source Code.

  The "source code" for a work means the preferred form of the work
for making modifications to it.  "Object code" means any non-source
form of a work.

  A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

  The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

  The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

  The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

  The Corresponding Source for a work in source code form is that
same work.

  2. Basic Permissions.

  All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

  You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

  Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

  No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

  When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

  4. Conveying Verbatim Copies.

  You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

  You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

  You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

  A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

  6. Conveying Non-Source Forms.

  You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

  A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

  A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

  "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

  If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

  The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

  Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

  7. Additional Terms.

  "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

  When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

  Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

  All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

  If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

  Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

  8. Termination.

  You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

  However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

  Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

  Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

  9. Acceptance Not Required for Having Copies.

  You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

  Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

  An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

  You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

  11. Patents.

  A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor version".

  A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

  Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

  In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

  If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

  If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

  A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

  Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

  If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

  13. Use with the GNU Affero General Public License.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.

  14. Revised Versions of this License.

  The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

  Each version is given a distinguishing version number.  If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.

  If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

  Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

  15. Disclaimer of Warranty.

  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. Limitation of Liability.

  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.

  17. Interpretation of Sections 15 and 16.

  If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

  If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:

    <program>  Copyright (C) <year>  <name of author>
    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".

  You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.

  The GNU General Public License does not permit incorporating your program
into proprietary programs.  If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library.  If this is what you want to do, use the GNU Lesser General
Public License instead of this License.  But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.

========================================================================

Exception by Meetecho s.r.l.:

If you modify this Program, or any covered work, by linking or combining
it with OpenSSL (or a modified version of that library), containing
parts covered by the terms of OpenSSL License, the licensors of this
Program grant you additional permission to convey the resulting work.
Corresponding Source for a non-source form of such a combination shall
include the source code for the parts of OpenSSL used as well as that of
the covered work.


================================================
FILE: Makefile.am
================================================
ACLOCAL_AMFLAGS = -I m4

# FIXME: These should be enabled once the code is safe for them. That requires
# some fairly big refactoring though, which can wait.
# AM_CFLAGS += -Wshadow -Wstrict-aliasing=2

# FIXME: make docs work with distcheck
DISTCHECK_CONFIGURE_FLAGS = --disable-docs --enable-post-processing

EXTRA_DIST = $(NULL)
CLEANFILES = $(NULL)

confdir = $(sysconfdir)/janus
conf_DATA = conf/janus.jcfg.sample

plugindir = $(libdir)/janus/plugins
transportdir = $(libdir)/janus/transports
eventdir = $(libdir)/janus/events
loggerdir = $(libdir)/janus/loggers

SUBDIRS = src html
dist_html_DATA = README.md

demosdir = $(datadir)/janus/demos
demos_DATA = $(NULL)

jsmodulesdir = $(datadir)/janus/javascript
jsmodules_DATA = html/demos/janus.js

%.sample: %.sample.in
	$(MKDIR_P) $(@D)
	$(AM_V_GEN) sed -e "\
	    s|[@]confdir[@]|$(confdir)|;\
	    s|[@]plugindir[@]|$(plugindir)|;\
	    s|[@]transportdir[@]|$(transportdir)|;\
	    s|[@]eventdir[@]|$(eventdir)|;\
	    s|[@]loggerdir[@]|$(loggerdir)|;\
	    s|[@]recordingsdir[@]|$(recordingsdir)|;\
	    s|[@]demosdir[@]|$(demosdir)|;\
	    s|[@]streamdir[@]|$(streamdir)|; \
	    s|[@]luadir[@]|$(luadir)|; \
	    s|[@]duktapedir[@]|$(duktapedir)|" \
	$< > $@ || rm $@

EXTRA_DIST += conf/janus.jcfg.sample.in
CLEANFILES += conf/janus.jcfg.sample


##
# pkg-config file
##

EXTRA_DIST = janus-gateway.pc.in
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = janus-gateway.pc
DISTCLEANFILES = janus-gateway.pc


##
# Fuzzers checking
##

check-fuzzers: FORCE
	CC=$(CC) SKIP_JANUS_BUILD=1 LIB_FUZZING_ENGINE=fuzzers/standalone.o ./fuzzers/build.sh
	./fuzzers/run.sh rtcp_fuzzer out/rtcp_fuzzer_seed_corpus
	./fuzzers/run.sh rtp_fuzzer out/rtp_fuzzer_seed_corpus
	./fuzzers/run.sh sdp_fuzzer out/sdp_fuzzer_seed_corpus

.PHONY: FORCE
FORCE:

##
# Docs
##

if ENABLE_DOCS
SUBDIRS += docs
endif

##
# JavaScript module flavours for janus.js
##

if ENABLE_JAVASCRIPT_ES_MODULE
jsmodules_DATA += npm/dist/janus.es.js
endif

if ENABLE_JAVASCRIPT_UMD_MODULE
jsmodules_DATA += npm/dist/janus.umd.js
endif

if ENABLE_JAVASCRIPT_IIFE_MODULE
jsmodules_DATA += npm/dist/janus.iife.js
endif

if ENABLE_JAVASCRIPT_COMMON_JS_MODULE
jsmodules_DATA += npm/dist/janus.cjs.js
endif

EXTRA_DIST += $(jsmodules_DATA)

if ENABLE_JAVASCRIPT_MODULES

node_modules/rollup/dist/bin/rollup: package.json
	$(NPM) install && touch node_modules/rollup/dist/bin/rollup

npm/dist/janus.%.js: html/demos/janus.js node_modules/rollup/dist/bin/rollup npm/rollup.config.mjs npm/module.js
	$(NPM) run rollup -- --o $@ --f $*

endif

##
# Configuration
##

configs:
	$(MKDIR_P) $(DESTDIR)$(confdir)
	$(foreach config,$(conf_DATA),cp "$(CURDIR)/$(config)" "$(DESTDIR)$(confdir)/$(notdir $(basename $(config) .sample))";)
	$(MAKE) -C src configs

##
# Extra cleanup
##

clean-local:
	-rm -f docs/doxygen_sqlite3.db


================================================
FILE: README.md
================================================
Janus WebRTC Server
===================
[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-brightgreen.svg)](COPYING)
![janus-ci](https://github.com/meetecho/janus-gateway/workflows/janus-ci/badge.svg)
[![Coverity Scan Build Status](https://scan.coverity.com/projects/13265/badge.svg)](https://scan.coverity.com/projects/meetecho-janus-gateway)
[![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/janus-gateway.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:janus-gateway)

Janus is an open source, general purpose, WebRTC server designed and developed by [Meetecho](https://www.meetecho.com). This version of the server is tailored for Linux systems, although it can be compiled for, and installed on, MacOS machines as well. Windows is not supported, but if that's a requirement, Janus is known to work in the "Windows Subsystem for Linux" on Windows 10: do **NOT** trust repos that provide .exe builds of Janus, they are not official and will not be supported.

For some online demos and documentations, make sure you pay the [project website](https://janus.conf.meetecho.com/) a visit!

> **Note well:** this is the main branch for the `multistream` version of Janus, which is the new version. If you want to check the legacy version of Janus instead (i.e., `0.x`, a.k.a. "legacy") click [here](https://github.com/meetecho/janus-gateway/tree/0.x) instead.

If you have questions on Janus, or wish to discuss Janus with us and other users, please join our [Community](https://janus.discourse.group/). If you encounter bugs, please submit an issue on [GitHub](https://github.com/meetecho/janus-gateway/issues): make sure you read the [guidelines](.github/CONTRIBUTING.md) before opening an issue or a pull request, though.


## Dependencies
To install it, you'll need to satisfy the following dependencies:

* [GLib](https://docs.gtk.org/glib/)
* [zlib](https://zlib.net/)
* [pkg-config](https://www.freedesktop.org/wiki/Software/pkg-config/)
* [Jansson](https://github.com/akheron/jansson)
* [libconfig](https://hyperrealm.github.io/libconfig/)
* [libnice](https://libnice.freedesktop.org/) (at least v0.1.16 suggested, v0.1.18 recommended)
* [OpenSSL](https://www.openssl.org/) (at least v1.0.1e)
* [libsrtp](https://github.com/cisco/libsrtp) (at least v2.x suggested)

These are optional dependencies, depending on which features you're interested in:

* [usrsctp](https://github.com/sctplab/usrsctp) (only needed if you are interested in Data Channels)
* [libmicrohttpd](https://www.gnu.org/software/libmicrohttpd/) (at least v0.9.59; only needed if you are interested in REST support for the Janus API)
* [libwebsockets](https://libwebsockets.org/) (at least v4.x suggested; only needed if you are interested in WebSockets support for the Janus API)
* [cmake](https://www.cmake.org/) (only needed if you are interested in WebSockets and/or BoringSSL support, as they make use of it)
* [rabbitmq-c](https://github.com/alanxz/rabbitmq-c) (only needed if you are interested in RabbitMQ support for the Janus API or events)
* [paho.mqtt.c](https://eclipse.org/paho/clients/c) (only needed if you are interested in MQTT support for the Janus API or events)
* [nanomsg](https://nanomsg.org/) (only needed if you are interested in Nanomsg support for the Janus API)
* [libcurl](https://curl.haxx.se/libcurl/) (only needed if you are interested in the TURN REST API support)

A couple of plugins depend on a few more libraries (you only need to install the ones for the plugins you need):

* [Sofia-SIP](https://github.com/freeswitch/sofia-sip) (only needed for the SIP plugin)
* [libopus](https://opus-codec.org/) (only needed for the AudioBridge plugin)
* [libogg](https://xiph.org/ogg/) (needed for the recordings post-processor, and optionally AudioBridge and Streaming plugins)
* [libcurl](https://curl.haxx.se/libcurl/) (only needed if you are interested in RTSP support in the Streaming plugin or in the sample Event Handler plugin)
* [Lua](https://www.lua.org/download.html) (only needed for the Lua plugin)
* [Duktape](https://duktape.org/) (only needed for the Duktape plugin)


All of those libraries are usually available on most of the most common distributions. Installing these libraries on a recent Fedora, for instance, is very simple:

    yum install libmicrohttpd-devel jansson-devel \
       openssl-devel libsrtp-devel sofia-sip-devel glib2-devel \
       opus-devel libogg-devel libcurl-devel pkgconfig \
       libconfig-devel libtool autoconf automake

Notice that you may have to `yum install epel-release` as well if you're attempting an installation on a CentOS machine instead.

On Ubuntu or Debian, it would require something like this:

	apt install libmicrohttpd-dev libjansson-dev \
		libssl-dev libsofia-sip-ua-dev libglib2.0-dev \
		libopus-dev libogg-dev libcurl4-openssl-dev liblua5.3-dev \
		libconfig-dev pkg-config libtool automake

* *Note:* please notice that libopus may not be available out of the box on your distro. In that case, you'll have to [install it manually](https://www.opus-codec.org).

While `libnice` is typically available in most distros as a package, the version available out of the box in Ubuntu is known to cause problems. As such, we always recommend manually compiling and installing the master version of libnice.
To build libnice, you need Python 3, Meson and Ninja:

	git clone https://gitlab.freedesktop.org/libnice/libnice
	cd libnice
	meson --prefix=/usr build && ninja -C build && sudo ninja -C build install

* *Note:* Make sure you remove the distro version first, or you'll cause conflicts between the installations. In case you want to keep both for some reason, for custom installations of libnice you can also run `pkg-config --cflags --libs nice` to make sure Janus can find the right installation. If that fails, you may need to set the `PKG_CONFIG_PATH` environment variable prior to compiling Janus, e.g., `export PKG_CONFIG_PATH=/path/to/libnice/lib/pkgconfig`

In case you're interested in compiling the sample Event Handler plugin, you'll need to install the development version of libcurl as well (usually `libcurl-devel` on Fedora/CentOS, `libcurl4-openssl-dev` on Ubuntu/Debian).

If your distro ships a pre-1.5 version of libsrtp, you'll have to uninstall that version and [install 1.5.x, 1.6.x or 2.x manually](https://github.com/cisco/libsrtp/releases). In fact, 1.4.x is known to cause several issues with WebRTC. While 1.5.x is supported, we recommend installing 2.x instead. Notice that the following steps are for version 2.2.0, but there may be more recent versions available:

	wget https://github.com/cisco/libsrtp/archive/v2.2.0.tar.gz
	tar xfv v2.2.0.tar.gz
	cd libsrtp-2.2.0
	./configure --prefix=/usr --enable-openssl
	make shared_library && sudo make install

Notice that the `--enable-openssl` part is _important_, as it's needed for AES-GCM support. As an alternative, you can also pass `--enable-nss` to have libsrtp use NSS instead of OpenSSL. A failure to configure libsrtp with either might cause undefined references when starting Janus, as we'd be trying to use methods that aren't there.

The Janus configure script autodetects which one you have installed and links to the correct library automatically, choosing 2.x if both are installed. If you want 1.5 or 1.6 to be picked (which is NOT recommended), pass `--disable-libsrtp2` when configuring Janus to force it to use the older version instead.

* *Note:* when installing libsrtp, no matter which version, you may need to pass `--libdir=/usr/lib64` to the configure script if you're installing on a x86_64 distribution.

If you want to make use of BoringSSL instead of OpenSSL (e.g., because you want to take advantage of `--enable-dtls-settimeout`), you'll have to manually install it to a specific location. Use the following steps:

	git clone https://boringssl.googlesource.com/boringssl
	cd boringssl
	# Don't barf on errors
	sed -i s/" -Werror"//g CMakeLists.txt
	# Build
	mkdir -p build
	cd build
	cmake -DCMAKE_INSTALL_PREFIX=/opt/boringssl -DCMAKE_CXX_FLAGS="-lrt" ..
	make
	sudo make install

Once the library is installed, you'll have to pass an additional `--enable-boringssl` flag to the configure script, as by default Janus will be built assuming OpenSSL will be used. By default, Janus expects BoringSSL to be installed in `/opt/boringssl` -- if it's installed in another location, pass the path to the configure script as such: `--enable-boringssl=/path/to/boringssl` If you were using OpenSSL and want to switch to BoringSSL, make sure you also do a `make clean` in the Janus folder before compiling with the new BoringSSL support. If you enabled BoringSSL support and also want Janus to detect and react to DTLS timeouts with faster retransmissions, then pass `--enable-dtls-settimeout` to the configure script too.

* *Note:* as explained in [this issue](https://github.com/meetecho/janus-gateway/issues/3456), building Janus with more recent versions of BoringSSL may require you to pass a `CCLD=c++` for any `make` command to build Janus itself.

For what concerns usrsctp, which is needed for Data Channels support, it is usually not available in repositories, so if you're interested in them (support is optional) you'll have to install it manually. It is a pretty easy and standard process:

	git clone https://github.com/sctplab/usrsctp
	cd usrsctp
	./bootstrap
	./configure --prefix=/usr --disable-programs --disable-inet --disable-inet6
	make && sudo make install

* *Note:* you may need to pass `--libdir=/usr/lib64` to the configure script if you're installing on a x86_64 distribution.

The same applies for libwebsockets, which is needed for the optional WebSockets support. If you're interested in supporting WebSockets to control Janus, as an alternative (or replacement) to the default plain HTTP REST API, you'll have to install it manually:

	git clone https://libwebsockets.org/repo/libwebsockets
	cd libwebsockets
	# If you want the stable version of libwebsockets, uncomment the next line
	# git checkout v4.3-stable
	mkdir build
	cd build
	# See https://github.com/meetecho/janus-gateway/issues/732 re: LWS_MAX_SMP
	# See https://github.com/meetecho/janus-gateway/issues/2476 re: LWS_WITHOUT_EXTENSIONS
	cmake -DLWS_MAX_SMP=1 -DLWS_WITHOUT_EXTENSIONS=0 -DCMAKE_INSTALL_PREFIX:PATH=/usr -DCMAKE_C_FLAGS="-fpic" ..
	make && sudo make install

* *Note:* if libwebsockets.org is unreachable for any reason, replace the first line with this:

	git clone https://github.com/warmcat/libwebsockets.git

The same applies for Eclipse Paho MQTT C client library, which is needed for the optional MQTT support. If you're interested in integrating MQTT channels as an alternative (or replacement) to HTTP and/or WebSockets to control Janus, or as a carrier of Janus Events, you can install the latest version with the following steps:

	git clone https://github.com/eclipse/paho.mqtt.c.git
	cd paho.mqtt.c
	make && sudo make install

* *Note:* you may want to set up a different install path for the library, to achieve that, replace the last command by 'sudo prefix=/usr make install'.

In case you're interested in Nanomsg support, you'll need to install the related C library. It is usually available as an easily installable package in pretty much all repositories. The following is an example on how to install it on Ubuntu:

	aptitude install libnanomsg-dev

Finally, the same can be said for rabbitmq-c as well, which is needed for the optional RabbitMQ support. In fact, several different versions of the library can be found, and the versions usually available in most distribution repositories are not up-do-date with respect to the current state of the development. As such, if you're interested in integrating RabbitMQ queues as an alternative (or replacement) to HTTP and/or WebSockets to control Janus, you can install the latest version with the following steps:

	git clone https://github.com/alanxz/rabbitmq-c
	cd rabbitmq-c
	git submodule init
	git submodule update
	mkdir build && cd build
	cmake -DCMAKE_INSTALL_PREFIX=/usr ..
	make && sudo make install

* *Note:* you may need to pass `--libdir=/usr/lib64` to the configure script if you're installing on a x86_64 distribution.

To conclude, should you be interested in building the Janus documentation as well, you'll need some additional tools too:

* [Doxygen](https://www.doxygen.org)
* [Graphviz](https://www.graphviz.org/)

On Fedora:

	yum install doxygen graphviz

On Ubuntu/Debian:

	aptitude install doxygen graphviz


## Compile
Once you have installed all the dependencies, get the code:

	git clone https://github.com/meetecho/janus-gateway.git
	cd janus-gateway

Then just use:

	sh autogen.sh

to generate the configure file. After that, configure and compile as usual to start the whole compilation process:

	./configure --prefix=/opt/janus
	make
	make install

Since Janus requires configuration files for both the core and its modules in order to work, you'll probably also want to install the default configuration files to use, which you can do this way:

	make configs

Remember to only do this once, or otherwise a subsequent `make configs` will overwrite any configuration file you may have modified in the meanwhile.

If you've installed the above libraries but are not interested, for instance, in Data Channels, WebSockets, MQTT and/or RabbitMQ, you can disable them when configuring:

	./configure --disable-websockets --disable-data-channels --disable-rabbitmq --disable-mqtt

There are configuration flags for pretty much all external modules and many of the features, so you may want to issue a `./configure --help` to dig through the available options. A summary of what's going to be built will always appear after you do a configure, allowing you to double check if what you need and don't need is there.

If Doxygen and graphviz are available, the process can also build the documentation for you. By default the compilation process will not try to build the documentation, so if you instead prefer to build it, use the `--enable-docs` configuration option:

	./configure --enable-docs

You can also selectively enable/disable other features (e.g., specific plugins you don't care about, or whether or not you want to build the recordings post-processor). Use the --help option when configuring for more info.

### Building on FreeBSD
* *Note*: rtp_forward of streams only works streaming to IPv6,
because of #2051 and thus the feature is not supported on FreeBSD at the moment.

When building on FreeBSD you can install the depencencies from ports or packages, here only pkg method is used. You also need to use `gmake` instead of `make`,
since it is a GNU makefile. `./configure` can be run without arguments since the default prefix is `/usr/local` which is your default `LOCALBASE`.
Note that the `configure.ac` is coded to use openssl in base. If you wish to use openssl from ports or any other ssl you must change `configure.ac` accordingly.

	pkg install libsrtp2 libusrsctp jansson libnice libmicrohttpd libwebsockets curl opus sofia-sip libogg jansson libnice libconfig \
        libtool gmake autoconf autoconf-wrapper glib


### Building on MacOS
While most of the above instructions will work when compiling Janus on MacOS as well, there are a few aspects to highlight when doing that.

First of all, you can use `brew` to install most of the dependencies:

	brew install jansson libnice openssl srtp libusrsctp libmicrohttpd \
		libwebsockets cmake rabbitmq-c sofia-sip opus libogg curl glib \
		libconfig pkg-config autoconf automake libtool

For what concerns libwebsockets, though, make sure that the installed version is higher than `2.4.1`, or you might encounter the problems described in [this post](https://groups.google.com/forum/#!topic/meetecho-janus/HsFaEXBz4Cg). If `brew` doesn't provide a more recent version, you'll have to install the library manually.

Notice that you may need to provide a custom `prefix` and `PKG_CONFIG_PATH` when configuring Janus as well, e.g.:

	./configure --prefix=/usr/local/janus PKG_CONFIG_PATH=/usr/local/opt/openssl/lib/pkgconfig

Everything else works exactly the same way as on Linux.

## Configure and start
To start the server, you can use the `janus` executable. There are several things you can configure, either in a configuration file:

	<installdir>/etc/janus/janus.jcfg

or on the command line:

	<installdir>/bin/janus --help

	Usage: janus [OPTIONS]...

	-h, --help                    Print help and exit
	-V, --version                 Print version and exit
	-b, --daemon                  Launch Janus in background as a daemon
                                  (default=off)
	-p, --pid-file=path           Open the specified PID file when starting Janus
                                  (default=none)
	-N, --disable-stdout          Disable stdout based logging  (default=off)
	-L, --log-file=path           Log to the specified file (default=stdout only)
	-H  --cwd-path                Working directory for Janus daemon process
	                              (default=/)
	-i, --interface=ipaddress     Interface to use (will be the public IP)
	-P, --plugins-folder=path     Plugins folder (default=./plugins)
	-C, --config=filename         Configuration file to use
	-F, --configs-folder=path     Configuration files folder (default=./conf)
	-c, --cert-pem=filename       DTLS certificate
	-k, --cert-key=filename       DTLS certificate key
	-K, --cert-pwd=text           DTLS certificate key passphrase (if needed)
	-S, --stun-server=address:port
                                  STUN server(:port) to use, if needed (e.g.,
                                  Janus behind NAT, default=none)
	-1, --nat-1-1=ip              Public IP to put in all host candidates,
                                  assuming a 1:1 NAT is in place (e.g., Amazon
                                  EC2 instances, default=none)
	-2, --keep-private-host       When nat-1-1 is used (e.g., Amazon EC2
                                  instances), don't remove the private host,
                                  but keep both to simulate STUN  (default=off)
	-E, --ice-enforce-list=list   Comma-separated list of the only interfaces to
                                  use for ICE gathering; partial strings are
                                  supported (e.g., eth0 or eno1,wlan0,
                                  default=none)
	-X, --ice-ignore-list=list    Comma-separated list of interfaces or IP
                                  addresses to ignore for ICE gathering;
                                  partial strings are supported (e.g.,
                                  vmnet8,192.168.0.1,10.0.0.1 or
                                  vmnet,192.168., default=vmnet)
	-6, --ipv6-candidates         Whether to enable IPv6 candidates or not
                                  (experimental)  (default=off)
	-O, --ipv6-link-local         Whether IPv6 link-local candidates should be
                                  gathered as well  (default=off)
	-f, --full-trickle            Do full-trickle instead of half-trickle
                                  (default=off)
	-I, --ice-lite                Whether to enable the ICE Lite mode or not
                                  (default=off)
	-T, --ice-tcp                 Whether to enable ICE-TCP or not (warning: only
                                  works with ICE Lite)
                                  (default=off)
	-Q, --min-nack-queue=number   Minimum size of the NACK queue (in ms) per user
                                  for retransmissions, no matter the RTT
	-t, --no-media-timer=number   Time (in s) that should pass with no media
                                  (audio or video) being received before Janus
                                  notifies you about this
	-W, --slowlink-threshold=number
                                  Number of lost packets (per s) that should
                                  trigger a 'slowlink' Janus API event to users
                                  (default=0, feature disabled)
	-r, --rtp-port-range=min-max  Port range to use for RTP/RTCP (only available
								  if the installed libnice supports it)
	-B, --twcc-period=number      How often (in ms) to send TWCC feedback back to
                                  senders, if negotiated (default=200ms)
	-n, --server-name=name        Public name of this Janus instance
                                  (default=MyJanusInstance)
	-s, --session-timeout=number  Session timeout value, in seconds (default=60)
	-m, --reclaim-session-timeout=number
                                  Reclaim session timeout value, in seconds
                                  (default=0)
	-d, --debug-level=1-7         Debug/logging level (0=disable debugging,
                                  7=maximum debug level; default=4)
	-D, --debug-timestamps        Enable debug/logging timestamps  (default=off)
	-o, --disable-colors          Disable color in the logging  (default=off)
	-M, --debug-locks             Enable debugging of locks/mutexes (very
                                  verbose!)  (default=off)
	-a, --apisecret=randomstring  API secret all requests need to pass in order
                                  to be accepted by Janus (useful when wrapping
                                  Janus API requests in a server, none by
                                  default)
	-A, --token-auth              Enable token-based authentication for all
                                  requests  (default=off)
	-e, --event-handlers          Enable event handlers  (default=off)
	-w, --no-webrtc-encryption    Disable WebRTC encryption, so no DTLS or SRTP
                                  (only for debugging!)  (default=off)


Options passed through the command line have the precedence on those specified in the configuration file. To start the server, simply run:

	<installdir>/bin/janus

This will start the server, and have it look at the configuration file.

Make sure you have a look at all of the configuration files, to tailor Janus to your specific needs: each configuration file is documented, so it shouldn't be hard to make changes according to your requirements. The repo comes with some defaults (assuming you issues `make configs` after installing the server) that tend to make sense for generic deployments, and also includes some sample configurations for all the plugins (e.g., web servers to listen on, conference rooms to create, streaming mountpoints to make available at startup, etc.).

To test whether it's working correctly, you can use the demos provided with this package in the `html` folder: these are exactly the same demos available online on the [project website](https://janus.conf.meetecho.com/). Just copy the file it contains in a webserver, or use a userspace webserver to serve the files in the `html` folder (e.g., with php or python), and open the `index.html` page in either Chrome or Firefox. A list of demo pages exploiting the different plugins will be available. Remember to edit the transport/port details in the demo JavaScript files if you changed any transport-related configuration from its defaults. Besides, the demos refer to the pre-configured plugin resources, so if you add some new resources (e.g., a new videoconference) you may have to tweak the demo pages to actually use them.

## Documentation
Janus is thoroughly documented. You can find the current documentation, automatically generated with Doxygen, on the [project website](https://janus.conf.meetecho.com/docs/).

## Help us!
Any thought, feedback or (hopefully not!) insult is welcome!

Developed by [@meetecho](https://github.com/meetecho)


================================================
FILE: SECURITY.md
================================================
# Security Policy

## Supported Versions

Notice that, while there are multiple versions of Janus, they're simply
tagged versions of the master Janus branch. As such, once they're tagged
as versions, they won't receive security updates. The only way to get
security updates that are published after a specific version is to
either use a more recent tagged version (if it includes the security
fix) or refer to the master branch instead (which is where active
development focuses on). Refer to the [CHANGELOG.md](CHANGELOG.md)
file for information of what each version adds, including security
related fixes.

## Reporting a Vulnerability

In case you find a vulnerability you think we should be aware of,
please use the contact form on the [Meetecho website](https://www.meetecho.com),
using the "Not sure/Other" service type in the dropdown menu. We
take vulnerability reports very seriously, and so we tend to
prioritize the evaulation of such reports and, in case a fix
is indeed warranted, the development of a fix.


================================================
FILE: autogen.sh
================================================
#!/bin/sh

srcdir=`dirname $0`
test -z "$srcdir" && srcdir=.

mkdir -p m4

autoreconf --verbose --force --install || exit 1


================================================
FILE: bower.json
================================================
{
  "name": "janus-gateway",
  "version": "1.4.1",
  "homepage": "https://github.com/meetecho/janus-gateway",
  "authors": [
    "Lorenzo Miniero <lorenzo@meetecho.com>",
    "Philip Withnall <philip@tecnocode.co.uk>",
    "Jack Leigh",
    "Pierce Lopez <pierce.lopez@gmail.com>",
    "Benjamin Trent <ben.w.trent@gmail.com>",
    "Dustin Oprea <dustin@randomingenuity.com>",
    "Maurizio Porrato",
    "Giacomo Vacca",
    "mrauhu",
    "Min Wang",
    "leonuh",
    "Nicholas Wylie",
    "Graeme Yeates <yeatesgraeme@gmail.com>",
    "gatecrasher777",
    "Damon Oehlman <damon.oehlman@gmail.com>",
    "Scott <scottmortonashton@gmail.com>"
  ],
  "description": "A javascript library for interacting with the C based Janus WebRTC Server",
  "main": "./html/janus.js",
  "license": "GPLv3",
  "ignore": [
    "**/.*",
    "**/*.alaw",
    "**/*.mjr",
    "node_modules",
    "bower_components",
    "test",
    "tests"
  ],
  "dependencies": {
    "webrtc-adapter": "9.0.3"
  }
}


================================================
FILE: conf/janus.eventhandler.gelfevh.jcfg.sample
================================================
# This configures the GELF event handler. Appending necessary headers 
# and sending messages via TCP or UDP

general: {
	enabled = false						# By default the module is not enabled
	events = "all"
										# Comma separated list of the events mask you're interested
										# in. Valid values are none, sessions, handles, jsep, webrtc,
										# media, plugins, transports, core, external and all. By
										# default we subscribe to everything (all)

	backend = "your.graylog.server"		# DNS or IP of your Graylog server
	port = "12201"						# Port Graylog server is listening on
	protocol = "tcp"					# tcp or udp transport type
	max_message_len = 1024				# Note that we add 12 bytes of headers + standard UDP headers (8 bytes) 
										# when calculating packet size based on MTU   

	#compress = true					# Optionally, only for UDP transport, JSON messages can be compressed using zlib
	#compression = 9					# In case, you can specify the compression factor, where 1 is
										# the fastest (low compression), and 9 gives the best compression
}


================================================
FILE: conf/janus.eventhandler.mqttevh.jcfg.sample
================================================
# This configures the MQTT event handler. Events are sent either on
# one topic or on a topic per event type.
#
# By default, configuration topics for handle and webrtc event types
# with the base topic are configured to /janus/events, e.g.:
#	/janus/events/handle
#	/janus/events/webrtc

general: {
	enabled = false			# By default the module is not enabled
	events = "all"			# Comma separated list of the events mask you're interested
							# in. Valid values are none, sessions, handles, jsep, webrtc,
							# media, plugins, transports, core, external and all. By
							# default we subscribe to everything (all)
	json = "indented"		# Whether the JSON messages should be indented (default),
							# plain (no indentation) or compact (no indentation and no spaces)

	url = "tcp://localhost:1883"	# The URL of the MQTT server. "tcp://" and "ssl://" protocols are supported.
	#mqtt_version = "3.1.1"			# Protocol version. Available values: 3.1, 3.1.1 (default), 5.
	client_id = "janus.example.com"	# Janus client id. You have to configure a unique ID (default: guest).
	#keep_alive_interval = 20		# Keep connection for N seconds (default: 30)
	#cleansession = 0				# Clean session flag (default: off)
	#retain = 0						# Default MQTT retain flag for published events
	#qos = 1						# Default MQTT QoS for published events
	#max_inflight = 10				# Maximum number of inflight messages
	#max_buffered = 100				# Maximum number of buffered messages
	#disconnect_timeout = 100		# Seconds to wait before destroying client
	#username = "guest"				# Username for authentication (default: no authentication)
	#password = "guest"				# Password for authentication (default: no authentication)
	#topic = "/janus/events"		# Base topic (default: /janus/events)
	#addevent = true				# Whether we should add the event type to the base topic

	#tls_enable = false				# Whether TLS support must be enabled

	# Initial message sent to status topic
	#connect_status = "{\"event\": \"connected\", \"eventhandler\": \"janus.eventhandler.mqttevh\"}"
	# Message sent after disconnect or as LWT
	#disconnect_status = "{\"event\": \"disconnected\"}"

	#will_enabled = false							# Whether to enable LWT (default: false)
	#will_retain = 1								# Whether LWT should be retained (default: 1)
	#will_qos = 0									# QoS for LWT (default: 0)

	# Additional parameters if "mqtts://" schema is used
	#tls_verify_peer = true			# Whether peer verification must be enabled
	#tls_verify_hostname = true		# Whether hostname verification must be enabled

	# Certificates to use when TLS support is enabled, if needed
	#tls_cacert = "/path/to/cacert.pem"
	#tls_client_cert = "/path/to/cert.pem"
	#tls_client_key = "/path/to/key.pem"
	#tls_ciphers
	#tls_version

	# These options work with MQTT 5 only.
	#add_user_properties = ()	# List of user property ["key", "value"] pairs to add.
}


================================================
FILE: conf/janus.eventhandler.nanomsgevh.jcfg.sample
================================================
# This configures the Nanomsg event handler. Since this plugin only
# forwards each event it receives via Nanomsg, you simply need to
# configure (i) which events to subscribe to, (ii) the address to use for
# the communication, and (iii) whether the address should be used to bind
# locally or to connect to a remote endpoint. Notice that the only supported
# pattern is NN_PUBSUB, where the Nanomsg event handler is the publisher.

general: {
	enabled = false		# By default the module is not enabled
	events = "all"		# Comma separated list of the events mask you're interested
						# in. Valid values are none, sessions, handles, jsep, webrtc,
						# media, plugins, transports, core, external and all. By
						# default we subscribe to everything (all)
	grouping = true		# Whether events should be sent individually (one per
						# HTTP POST, JSON object), or if it's ok to group them
						# (one or more per HTTP POST, JSON array with objects)
						# The default is 'yes' to limit the number of connections.

						# Address the plugin will send all events to as HTTP POST
						# requests with an application/json payload. In case
						# authentication is required to contact the backend, set
						# the credentials as well (basic authentication only).
	json = "indented"	# Whether the JSON messages should be indented (default),
						# plain (no indentation) or compact (no indentation and no spaces)

	#mode = "bind"						# Whether we should 'bind' to the specified
										# address, or connect to it if remote (default)
	address = "ipc:///tmp/janusevh.ipc"	# Address to use, refer to the Nanomsg documentation
										# for more info on different transports you can use here
}


================================================
FILE: conf/janus.eventhandler.rabbitmqevh.jcfg.sample
================================================
# This configures the RabbitMQ event handler.

general: {
	enabled = false					# By default the module is not enabled
	events = "all"					# Comma separated list of the events mask you're interested
									# in. Valid values are none, sessions, handles, jsep, webrtc,
									# media, plugins, transports, core, external and all. By
									# default we subscribe to everything (all)
	grouping = true					# Whether events should be sent individually , or if it's ok
									# to group them. The default is 'yes' to limit the number of
									# messages
	json = "indented"				# Whether the JSON messages should be indented (default),
									# plain (no indentation) or compact (no indentation and no spaces)

	host = "localhost"				# The address of the RabbitMQ server
	#port = 5672					# The port of the RabbitMQ server (5672 by default)
	#username = "guest"				# Username to use to authenticate, if needed
	#password = "guest"				# Password to use to authenticate, if needed
	#vhost = "/"					# Virtual host to specify when logging in, if needed
	#exchange = "janus-exchange"
	route_key = "janus-events"		# Routing key to use when publishing messages
	#exchange_type = "fanout" 		# Rabbitmq exchange_type can be one of the available types: direct, topic, headers and fanout (fanout by defualt).
	#heartbeat = 60 				# Defines the seconds without communication that should pass before considering the TCP connection unreachable.
	#declare_outgoing_queue = true # By default (for backwards compatibility), we declare an outgoing queue. Set this to false to disable that behavior

	#ssl_enable = false				# Whether ssl support must be enabled
	#ssl_verify_peer = true			# Whether peer verification must be enabled
	#ssl_verify_hostname = true		# Whether hostname verification must be enabled

	# Certificates to use when SSL support is enabled, if needed
	#ssl_cacert = "/path/to/cacert.pem"
	#ssl_cert = "/path/to/cert.pem"
	#ssl_key = "/path/to/key.pem"
}


================================================
FILE: conf/janus.eventhandler.sampleevh.jcfg.sample
================================================
# This configures the sample event handler. Since this plugin simply
# forwards each event it receives via HTTP POST, you simply need to
# configure (i) which events to subscribe to, and (ii) the address of
# the web server which will receive the requests.

general: {
	enabled = false		# By default the module is not enabled
	events = "all"		# Comma separated list of the events mask you're interested
						# in. Valid values are none, sessions, handles, jsep, webrtc,
						# media, plugins, transports, core, external and all. By
						# default we subscribe to everything (all)
	grouping = true		# Whether events should be sent individually (one per
						# HTTP POST, JSON object), or if it's ok to group them
						# (one or more per HTTP POST, JSON array with objects)
						# The default is 'true' to limit the number of connections.
	json = "indented"	# Whether the JSON messages should be indented (default),
						# plain (no indentation) or compact (no indentation and no spaces)

	#compress = true	# Optionally, the JSON messages can be compressed using zlib
	#compression = 9	# In case, you can specify the compression factor, where 1 is
						# the fastest (low compression), and 9 gives the best compression

						# Address the plugin will send all events to as HTTP POST
						# requests with an application/json payload. In case
						# authentication is required to contact the backend, set
						# the credentials as well (basic authentication only).
	backend = "http://your.webserver.here/and/a/path"
	#backend_user = "myuser"
	#backend_pwd = "mypwd"

						# You can also configure how retransmissions should
						# happen, after a failed attempt to deliver an event.
						# Specifically, you can specify how many times a
						# retransmission should be attempted (default=5) and
						# which step is used, in milliseconds, for the exponential
						# backoff before retrying (e.g, if step=100ms, then the
						# the first retry will happen after 100ms, the second
						# after 200ms, then 400ms, and so on). If the event cannot
						# be retransmitted after the maximum number of attemps
						# is reached, then it's lost. Beware that retransmissions
						# will also delay pending events and increase the queue.
	#max_retransmissions = 5
	#retransmissions_backoff = 100
}


================================================
FILE: conf/janus.eventhandler.wsevh.jcfg.sample
================================================
# This configures the WebSockets event handler. Since this plugin only
# forwards each event it receives via WebSockets, you simply need to
# configure (i) which events to subscribe to, and (ii) the address of
# the WebSockets server which will receive the requests.

general: {
	enabled = false		# By default the module is not enabled
	events = "all"		# Comma separated list of the events mask you're interested
						# in. Valid values are none, sessions, handles, jsep, webrtc,
						# media, plugins, transports, core, external and all. By
						# default we subscribe to everything (all)
	grouping = true		# Whether events should be sent individually (one per
						# HTTP POST, JSON object), or if it's ok to group them
						# (one or more per HTTP POST, JSON array with objects)
						# The default is 'yes' to limit the number of connections.

	json = "indented"	# Whether the JSON messages should be indented (default),
						# plain (no indentation) or compact (no indentation and no spaces)

						# Address the plugin will send all events to as WebSocket
						# messages. In case authentication is required to contact
						# the backend, set the credentials as well.
	backend = "ws://your.websocket.here"
	# subprotocol = "your-subprotocol"

						# If the WebSocket server isn't reachable or the client has
						# to reconnect, the default behaviour of the handler plugin
						# is to retry with an exponential back-off, all while buffering
						# events that Janus may keep on pushing. Buffering has no
						# limit, so if reconnecting takes a long time (or forever)
						# memory usage will keep on growing; besides, it may cause
						# a network spike when eventually reconnected, as all stored
						# events would need to be sent to the backend before new
						# ones can be relayed as well. You can prune queued events
						# and put a cap on the amount of buffering to perform when
						# reconnecting by setting the 'events_cap_on_reconnect'
						# property accordingly: any number you set will be the
						# maximum number of events stored in memory until we
						# reconnect, which means older packets will be discarded
						# if the cap is exceeded. Notice that setting a value
						# of 0 will not mean "drop all packets", but will disable
						# the cap (default behaviour), which means the minimum
						# possible value is 1. Also notice that, when the cap is
						# enabled, this means the event receiver may end up missing key
						# events when a reconnection actually ends up taking place.
	# events_cap_on_reconnect = 10

						# In case you need to debug connection issues, you can configure
						# the libwebsockets debugging level as a comma separated list of things
						# to debug, supported values: err, warn, notice, info, debug, parser,
						# header, ext, client, latency, user, count (plus 'none' and 'all')
	#ws_logging = "err,warn"
}


================================================
FILE: conf/janus.jcfg.sample.in
================================================
# General configuration: folders where the configuration and the plugins
# can be found, how output should be logged, whether Janus should run as
# a daemon or in foreground, default interface to use, debug/logging level
# and, if needed, shared apisecret and/or token authentication mechanism
# between application(s) and Janus.
general: {
	configs_folder = "@confdir@"			# Configuration files folder
	plugins_folder = "@plugindir@"			# Plugins folder
	transports_folder = "@transportdir@"	# Transports folder
	events_folder = "@eventdir@"			# Event handlers folder
	loggers_folder = "@loggerdir@"			# External loggers folder

		# The next settings configure logging
	#log_to_stdout = false					# Whether the Janus output should be written
											# to stdout or not (default=true)
	#log_to_file = "/path/to/janus.log"		# Whether to use a log file or not
	#log_rotate_sig = "SIGUSR1"				# Signal to handle for log rotation, valid values
											# are "SIGUSR1" and "SIGHUP".
											# Default is no setting, which disables the
											# signal handler for log rotation.
	debug_level = 4							# Debug/logging level, valid values are 0-7
	#debug_timestamps = true				# Whether to show a timestamp for each log line
	#debug_colors = false					# Whether colors should be disabled in the log
	#debug_locks = true						# Whether to enable debugging of locks (very verbose!)
	#log_prefix = "[janus] "				# In case you want log lines to be prefixed by some
											# custom text, you can use the 'log_prefix' property.
											# It supports terminal colors, meaning something like
											# "[\x1b[32mjanus\x1b[0m] " would show a green "janus"
											# string in square brackets (assuming debug_colors=true).

		# This is what you configure if you want to launch Janus as a daemon
	#daemonize = true						# Whether Janus should run as a daemon
											# or not (default=run in foreground)
	#pid_file = "/path/to/janus.pid"		# PID file to create when Janus has been
											# started, and to destroy at shutdown

		# There are different ways you can authenticate the Janus and Admin APIs
	#api_secret = "janusrocks"		# String that all Janus requests must contain
									# to be accepted/authorized by the Janus core.
									# Useful if you're wrapping all Janus API requests
									# in your servers (that is, not in the browser,
									# where you do the things your way) and you
									# don't want other application to mess with
									# this Janus instance.
	#token_auth = true				# Enable a token based authentication
									# mechanism to force users to always provide
									# a valid token in all requests. Useful if
									# you want to authenticate requests from web
									# users.
	#token_auth_secret = "janus"	# Use HMAC-SHA1 signed tokens (with token_auth). Note that
									# without this, the Admin API MUST
									# be enabled, as tokens are added and removed
									# through messages sent there.
	admin_secret = "janusoverlord"	# String that all Janus requests must contain
									# to be accepted/authorized by the admin/monitor.
									# only needed if you enabled the admin API
									# in any of the available transports.

		# Generic settings
	#interface = "1.2.3.4"			# Interface to use (will be used in SDP)
	#server_name = "MyJanusInstance"# Public name of this Janus instance
									# as it will appear in an info request
	#session_timeout = 60			# How long (in seconds) we should wait before
									# deciding a Janus session has timed out. A
									# session times out when no request is received
									# for session_timeout seconds (default=60s).
									# Setting this to 0 will disable the timeout
									# mechanism, which is NOT suggested as it may
									# risk having orphaned sessions (sessions not
									# controlled by any transport and never freed).
									# To avoid timeouts, keep-alives can be used.
	#candidates_timeout = 45		# How long (in seconds) we should keep hold of
									# pending (trickle) candidates before discarding
									# them (default=45s). Notice that setting this
									# to 0 will NOT disable the timeout, but will
									# be considered an invalid value and ignored.
	#reclaim_session_timeout = 0	# How long (in seconds) we should wait for a
									# janus session to be reclaimed after the transport
									# is gone. After the transport is gone, a session
									# times out when no request is received for
									# reclaim_session_timeout seconds (default=0s).
									# Setting this to 0 will disable the timeout
									# mechanism, and sessions will be destroyed immediately
									# if the transport is gone.
	#recordings_tmp_ext = "tmp"		# The extension for recordings, in Janus, is
									# .mjr, a custom format we d
Download .txt
gitextract_t9bs5ubo/

├── .editorconfig
├── .gitattributes
├── .github/
│   ├── CONTRIBUTING.md
│   ├── ISSUE_TEMPLATE/
│   │   ├── config.yml
│   │   ├── janus-0-x-issue--legacy-.md
│   │   └── janus-1-x-issue--multistream-.md
│   └── workflows/
│       └── janus-ci.yml
├── .gitignore
├── CHANGELOG.md
├── COPYING
├── Makefile.am
├── README.md
├── SECURITY.md
├── autogen.sh
├── bower.json
├── conf/
│   ├── janus.eventhandler.gelfevh.jcfg.sample
│   ├── janus.eventhandler.mqttevh.jcfg.sample
│   ├── janus.eventhandler.nanomsgevh.jcfg.sample
│   ├── janus.eventhandler.rabbitmqevh.jcfg.sample
│   ├── janus.eventhandler.sampleevh.jcfg.sample
│   ├── janus.eventhandler.wsevh.jcfg.sample
│   ├── janus.jcfg.sample.in
│   ├── janus.logger.jsonlog.jcfg.sample
│   ├── janus.plugin.audiobridge.jcfg.sample
│   ├── janus.plugin.duktape.jcfg.sample.in
│   ├── janus.plugin.echotest.jcfg.sample
│   ├── janus.plugin.lua.jcfg.sample.in
│   ├── janus.plugin.nosip.jcfg.sample
│   ├── janus.plugin.recordplay.jcfg.sample.in
│   ├── janus.plugin.sip.jcfg.sample
│   ├── janus.plugin.streaming.jcfg.sample.in
│   ├── janus.plugin.textroom.jcfg.sample
│   ├── janus.plugin.videocall.jcfg.sample
│   ├── janus.plugin.videoroom.jcfg.sample
│   ├── janus.transport.http.jcfg.sample
│   ├── janus.transport.mqtt.jcfg.sample
│   ├── janus.transport.nanomsg.jcfg.sample
│   ├── janus.transport.pfunix.jcfg.sample
│   ├── janus.transport.rabbitmq.jcfg.sample
│   └── janus.transport.websockets.jcfg.sample
├── configure.ac
├── docs/
│   ├── Makefile.am
│   ├── doxy-boot.js
│   ├── footer.html
│   ├── header.html
│   └── janus-doxygen.cfg
├── emacs.el
├── eslint.config.mjs
├── fuzzers/
│   ├── build.sh
│   ├── config.sh
│   ├── corpora/
│   │   ├── rtcp_fuzzer/
│   │   │   ├── 1meetecho/
│   │   │   │   ├── fir.rtcp
│   │   │   │   ├── nacks.rtcp
│   │   │   │   ├── pli.rtcp
│   │   │   │   ├── remb.rtcp
│   │   │   │   ├── rr-remb.rtcp
│   │   │   │   ├── rr-sdes-bye.rtcp
│   │   │   │   ├── rr.rtcp
│   │   │   │   ├── rtcp_fuzzer-crash-1640b2f21ba20409d930e9653052d579d450073a
│   │   │   │   ├── rtcp_fuzzer-crash-16b8706455b637b7696aeb56ed40dad8f90d81d0
│   │   │   │   ├── rtcp_fuzzer-crash-17ccf761d298d6a703f71627197c5f1adcf57140
│   │   │   │   ├── rtcp_fuzzer-crash-3762f3b9f11328e939e577de46e20a3fb0ccc324
│   │   │   │   ├── rtcp_fuzzer-crash-461a0e9201a7ea5ea6a43511571bdafce10b8185
│   │   │   │   ├── rtcp_fuzzer-crash-7257232c6e9efe6362b921117ad3cd5d8170ec0d
│   │   │   │   ├── rtcp_fuzzer-crash-75a5a7739802ac20cbe2937d6206348ffde23605
│   │   │   │   ├── rtcp_fuzzer-crash-85b6e5d82d61837df67df0e333cb2392044a47c6
│   │   │   │   ├── rtcp_fuzzer-crash-c7a1f348bd6f9422caeb41079e46331551fd2587
│   │   │   │   ├── rtcp_fuzzer-crash-daf57e58c2552e5cf091b0b92aa9f4ab2d4a5b4a
│   │   │   │   ├── rtcp_fuzzer-timeout-78336d26b8a4ac47c13f6f363a37bc320e582e3b
│   │   │   │   ├── sr-sdes.rtcp
│   │   │   │   └── twcc-feedback.rtcp
│   │   │   └── 2webrtc/
│   │   │       ├── 0.rtcp
│   │   │       ├── 1.rtcp
│   │   │       ├── 10.rtcp
│   │   │       ├── 11.rtcp
│   │   │       ├── 12.rtcp
│   │   │       ├── 13.rtcp
│   │   │       ├── 14.rtcp
│   │   │       ├── 15.rtcp
│   │   │       ├── 16.rtcp
│   │   │       ├── 17.rtcp
│   │   │       ├── 18.rtcp
│   │   │       ├── 19.rtcp
│   │   │       ├── 2.rtcp
│   │   │       ├── 20.rtcp
│   │   │       ├── 21.rtcp
│   │   │       ├── 22.rtcp
│   │   │       ├── 23.rtcp
│   │   │       ├── 24.rtcp
│   │   │       ├── 25.rtcp
│   │   │       ├── 26.rtcp
│   │   │       ├── 27.rtcp
│   │   │       ├── 28.rtcp
│   │   │       ├── 29.rtcp
│   │   │       ├── 3.rtcp
│   │   │       ├── 30.rtcp
│   │   │       ├── 31.rtcp
│   │   │       ├── 32.rtcp
│   │   │       ├── 33.rtcp
│   │   │       ├── 34.rtcp
│   │   │       ├── 35.rtcp
│   │   │       ├── 36.rtcp
│   │   │       ├── 37.rtcp
│   │   │       ├── 38.rtcp
│   │   │       ├── 39.rtcp
│   │   │       ├── 4.rtcp
│   │   │       ├── 40.rtcp
│   │   │       ├── 41.rtcp
│   │   │       ├── 42.rtcp
│   │   │       ├── 43.rtcp
│   │   │       ├── 44.rtcp
│   │   │       ├── 45.rtcp
│   │   │       ├── 46.rtcp
│   │   │       ├── 47.rtcp
│   │   │       ├── 48.rtcp
│   │   │       ├── 49.rtcp
│   │   │       ├── 5.rtcp
│   │   │       ├── 50.rtcp
│   │   │       ├── 51.rtcp
│   │   │       ├── 52.rtcp
│   │   │       ├── 53.rtcp
│   │   │       ├── 54.rtcp
│   │   │       ├── 55.rtcp
│   │   │       ├── 56.rtcp
│   │   │       ├── 57.rtcp
│   │   │       ├── 58.rtcp
│   │   │       ├── 59.rtcp
│   │   │       ├── 6.rtcp
│   │   │       ├── 60.rtcp
│   │   │       ├── 61.rtcp
│   │   │       ├── 62.rtcp
│   │   │       ├── 63.rtcp
│   │   │       ├── 64.rtcp
│   │   │       ├── 65.rtcp
│   │   │       ├── 66.rtcp
│   │   │       ├── 7.rtcp
│   │   │       ├── 8.rtcp
│   │   │       ├── 9.rtcp
│   │   │       └── LICENSE
│   │   ├── rtp_fuzzer/
│   │   │   ├── 1meetecho/
│   │   │   │   ├── rtp_0_audio-with-ext
│   │   │   │   ├── rtp_1_video-with-ext
│   │   │   │   ├── rtp_fuzzer-crash-15d89650c0a728a6431c10c3adeb8e9a2484af83
│   │   │   │   ├── rtp_fuzzer-crash-1e7e56a8894a7dc2c735a0732429930f4e4a9232
│   │   │   │   ├── rtp_fuzzer-crash-24444c8966d82f286b2fdc85f82ba506fa863601
│   │   │   │   ├── rtp_fuzzer-crash-3370e3932c251e50c77607b59a5f15d9e2677162
│   │   │   │   ├── rtp_fuzzer-crash-42d33714b6275c8c7d33d2aae456dc98cff7179c
│   │   │   │   ├── rtp_fuzzer-crash-42df1e99b29f5c2e2a881c257a31ab3a3e76c650
│   │   │   │   ├── rtp_fuzzer-crash-4977c993381e813c89acf302b8a758bad10e261a
│   │   │   │   ├── rtp_fuzzer-crash-5b35219e5f366ac6577599c82bc54cc33f7bbba4
│   │   │   │   ├── rtp_fuzzer-crash-5c50f0b2a9cf96bfb714d60d8f5e9e5c3131b7ea
│   │   │   │   ├── rtp_fuzzer-crash-6182bab7f385f555b8503bd8ebbb344722dcb7fe
│   │   │   │   ├── rtp_fuzzer-crash-6d9f1846dbb7acbe5dcb70623e5ac9ade871de1a
│   │   │   │   ├── rtp_fuzzer-crash-7e2d460edd5d5d7f5548922f10489f468d1638bf
│   │   │   │   ├── rtp_fuzzer-crash-7e3b3351f85a64bf0932a9ec7faca66717991c0f
│   │   │   │   ├── rtp_fuzzer-crash-9b6dfaedb1a8baca07492a8be205582db2e81ae3
│   │   │   │   ├── rtp_fuzzer-crash-9f2f88ca49f28cb28131b89110bf822b373ddd56
│   │   │   │   ├── rtp_fuzzer-crash-af6dff495b4c6b06250561160b019a33de972478
│   │   │   │   ├── rtp_fuzzer-crash-b1bc002713327153b0fa53f64015df8526fe5279
│   │   │   │   ├── rtp_fuzzer-crash-b9a848d594a7b1d0a0d698d10d2fed4f2f96c038
│   │   │   │   ├── rtp_fuzzer-crash-ba25a83b65e08f750cf832e205e16f1d298ea614
│   │   │   │   ├── rtp_fuzzer-crash-c14c0b082685dee2e98ab564c39883932f869cdd
│   │   │   │   ├── rtp_fuzzer-crash-cfa7e784e21f69b78ddae212c639a02c92362430
│   │   │   │   └── rtp_fuzzer-crash-f1f1d6ead517a580e441a71350118035b3d16d3e
│   │   │   └── 2webrtc/
│   │   │       ├── rtp-0
│   │   │       ├── rtp-1
│   │   │       ├── rtp-2
│   │   │       ├── rtp-3
│   │   │       ├── rtp-4
│   │   │       ├── rtp-5
│   │   │       ├── rtp-6
│   │   │       └── rtp-7
│   │   └── sdp_fuzzer/
│   │       ├── 1meetecho/
│   │       │   ├── sdp_fuzzer-timeout-26f23f1364a16565e2f339c3297f71c275b6b0cf
│   │       │   └── sdp_fuzzer-timeout-80e8c427e72e9f33f02c8a088caab69d9d97702c
│   │       └── 2webrtc/
│   │           ├── 10.sdp
│   │           ├── 11.sdp
│   │           ├── 12.sdp
│   │           ├── 13.sdp
│   │           ├── 14.sdp
│   │           ├── 15.sdp
│   │           ├── 16.sdp
│   │           ├── 17.sdp
│   │           ├── 18.sdp
│   │           ├── 19.sdp
│   │           ├── 2.sdp
│   │           ├── 20.sdp
│   │           ├── 21.sdp
│   │           ├── 22.sdp
│   │           ├── 23.sdp
│   │           ├── 24.sdp
│   │           ├── 25.sdp
│   │           ├── 26.sdp
│   │           ├── 27.sdp
│   │           ├── 28.sdp
│   │           ├── 29.sdp
│   │           ├── 3.sdp
│   │           ├── 30.sdp
│   │           ├── 31.sdp
│   │           ├── 32.sdp
│   │           ├── 33.sdp
│   │           ├── 34.sdp
│   │           ├── 35.sdp
│   │           ├── 36.sdp
│   │           ├── 37.sdp
│   │           ├── 38.sdp
│   │           ├── 39.sdp
│   │           ├── 4.sdp
│   │           ├── 40.sdp
│   │           ├── 41.sdp
│   │           ├── 42.sdp
│   │           ├── 43.sdp
│   │           ├── 44.sdp
│   │           ├── 45.sdp
│   │           ├── 46.sdp
│   │           ├── 47.sdp
│   │           ├── 48.sdp
│   │           ├── 49.sdp
│   │           ├── 5.sdp
│   │           ├── 50.sdp
│   │           ├── 51.sdp
│   │           ├── 52.sdp
│   │           ├── 53.sdp
│   │           ├── 54.sdp
│   │           ├── 55.sdp
│   │           ├── 6.sdp
│   │           ├── 7.sdp
│   │           ├── 8.sdp
│   │           ├── 9.sdp
│   │           ├── firefox-1.sdp
│   │           ├── firefox-2.sdp
│   │           ├── opera-1.sdp
│   │           ├── opera-2.sdp
│   │           ├── unittest-1.sdp
│   │           ├── unittest-2.sdp
│   │           ├── unittest-3.sdp
│   │           ├── unittest-4.sdp
│   │           ├── unittest-5.sdp
│   │           ├── unittest-6.sdp
│   │           ├── unittest-7.sdp
│   │           ├── unittest-8.sdp
│   │           └── unittest-9.sdp
│   ├── engines/
│   │   └── standalone.c
│   ├── rtcp_fuzzer.c
│   ├── rtp_fuzzer.c
│   ├── run.sh
│   └── sdp_fuzzer.c
├── html/
│   ├── Makefile.am
│   ├── citeus.html
│   ├── css/
│   │   └── demo.css
│   ├── demos/
│   │   ├── admin.html
│   │   ├── admin.js
│   │   ├── audiobridge.html
│   │   ├── audiobridge.js
│   │   ├── canvas.html
│   │   ├── canvas.js
│   │   ├── devices.html
│   │   ├── devices.js
│   │   ├── e2e.html
│   │   ├── e2e.js
│   │   ├── echotest.html
│   │   ├── echotest.js
│   │   ├── index.html
│   │   ├── janus.js
│   │   ├── multiopus.html
│   │   ├── multiopus.js
│   │   ├── mvideoroom.html
│   │   ├── mvideoroom.js
│   │   ├── navbar.html
│   │   ├── nosip.html
│   │   ├── nosip.js
│   │   ├── recordplay.html
│   │   ├── recordplay.js
│   │   ├── screensharing.html
│   │   ├── screensharing.js
│   │   ├── settings.js
│   │   ├── sip.html
│   │   ├── sip.js
│   │   ├── streaming.html
│   │   ├── streaming.js
│   │   ├── surround/
│   │   │   └── ChID-BLITS-EBU.txt
│   │   ├── textroom.html
│   │   ├── textroom.js
│   │   ├── videocall.html
│   │   ├── videocall.js
│   │   ├── videoroom.html
│   │   ├── videoroom.js
│   │   ├── virtualbg.html
│   │   ├── virtualbg.js
│   │   ├── webaudio.html
│   │   └── webaudio.js
│   ├── docs/
│   │   └── index.html
│   ├── footer.html
│   ├── index.html
│   ├── navbar.html
│   └── support.html
├── janus-gateway.pc.in
├── npm/
│   ├── .gitignore
│   ├── .npmignore
│   ├── README.md
│   ├── janus.d.ts
│   ├── module.js
│   └── rollup.config.mjs
├── package.json
├── src/
│   ├── Makefile.am
│   ├── apierror.c
│   ├── apierror.h
│   ├── auth.c
│   ├── auth.h
│   ├── config.c
│   ├── config.h
│   ├── debug.h
│   ├── dtls-bio.c
│   ├── dtls-bio.h
│   ├── dtls.c
│   ├── dtls.h
│   ├── events/
│   │   ├── eventhandler.h
│   │   ├── janus_gelfevh.c
│   │   ├── janus_mqttevh.c
│   │   ├── janus_nanomsgevh.c
│   │   ├── janus_rabbitmqevh.c
│   │   ├── janus_sampleevh.c
│   │   └── janus_wsevh.c
│   ├── events.c
│   ├── events.h
│   ├── ice.c
│   ├── ice.h
│   ├── ip-utils.c
│   ├── ip-utils.h
│   ├── janus-cfgconv.1
│   ├── janus-cfgconv.c
│   ├── janus-valgrind.supp
│   ├── janus.1
│   ├── janus.c
│   ├── janus.h
│   ├── log.c
│   ├── log.h
│   ├── loggers/
│   │   ├── janus_jsonlog.c
│   │   └── logger.h
│   ├── mach_gettime.h
│   ├── mainpage.dox
│   ├── mutex.h
│   ├── options.c
│   ├── options.h
│   ├── plugins/
│   │   ├── audiobridge-deps/
│   │   │   ├── COPYING
│   │   │   ├── arch.h
│   │   │   ├── jitter.c
│   │   │   ├── os_support.h
│   │   │   ├── resample.c
│   │   │   └── speex/
│   │   │       ├── speex_jitter.h
│   │   │       ├── speex_resampler.h
│   │   │       ├── speexdsp_config_types.h
│   │   │       └── speexdsp_types.h
│   │   ├── duktape/
│   │   │   ├── echotest.js
│   │   │   └── janus-sdp.js
│   │   ├── duktape-deps/
│   │   │   ├── AUTHORS.rst
│   │   │   ├── LICENSE.txt
│   │   │   ├── duk_console.c
│   │   │   ├── duk_console.h
│   │   │   ├── duk_module_duktape.c
│   │   │   └── duk_module_duktape.h
│   │   ├── janus_audiobridge.c
│   │   ├── janus_duktape.c
│   │   ├── janus_duktape_data.h
│   │   ├── janus_duktape_extra.c
│   │   ├── janus_duktape_extra.h
│   │   ├── janus_echotest.c
│   │   ├── janus_lua.c
│   │   ├── janus_lua_data.h
│   │   ├── janus_lua_extra.c
│   │   ├── janus_lua_extra.h
│   │   ├── janus_nosip.c
│   │   ├── janus_recordplay.c
│   │   ├── janus_sip.c
│   │   ├── janus_streaming.c
│   │   ├── janus_textroom.c
│   │   ├── janus_videocall.c
│   │   ├── janus_videoroom.c
│   │   ├── lua/
│   │   │   ├── echotest.lua
│   │   │   ├── janus-logger.lua
│   │   │   ├── janus-sdp.lua
│   │   │   └── videoroom.lua
│   │   ├── plugin.c
│   │   ├── plugin.h
│   │   ├── recordings/
│   │   │   ├── 1234.nfo
│   │   │   ├── rec-sample-audio.mjr
│   │   │   └── rec-sample-video.mjr
│   │   └── streams/
│   │       ├── radio.alaw
│   │       ├── remembrance.opus
│   │       ├── test_gstreamer.sh
│   │       ├── test_gstreamer1.sh
│   │       ├── test_gstreamer1_multistream.sh
│   │       └── test_gstreamer_multistream.sh
│   ├── postprocessing/
│   │   ├── janus-pp-rec.1
│   │   ├── janus-pp-rec.c
│   │   ├── mjr2pcap.1
│   │   ├── mjr2pcap.c
│   │   ├── pcap2mjr.1
│   │   ├── pcap2mjr.c
│   │   ├── pp-av1.c
│   │   ├── pp-av1.h
│   │   ├── pp-avformat.c
│   │   ├── pp-avformat.h
│   │   ├── pp-binary.c
│   │   ├── pp-binary.h
│   │   ├── pp-g711.c
│   │   ├── pp-g711.h
│   │   ├── pp-g722.c
│   │   ├── pp-g722.h
│   │   ├── pp-h264.c
│   │   ├── pp-h264.h
│   │   ├── pp-h265.c
│   │   ├── pp-h265.h
│   │   ├── pp-l16.c
│   │   ├── pp-l16.h
│   │   ├── pp-options.c
│   │   ├── pp-options.h
│   │   ├── pp-opus-silence.h
│   │   ├── pp-opus.c
│   │   ├── pp-opus.h
│   │   ├── pp-rtp.h
│   │   ├── pp-srt.c
│   │   ├── pp-srt.h
│   │   ├── pp-webm.c
│   │   └── pp-webm.h
│   ├── record.c
│   ├── record.h
│   ├── refcount.h
│   ├── rtcp.c
│   ├── rtcp.h
│   ├── rtp.c
│   ├── rtp.h
│   ├── rtpfwd.c
│   ├── rtpfwd.h
│   ├── rtpsrtp.h
│   ├── sctp.c
│   ├── sctp.h
│   ├── sdp-utils.c
│   ├── sdp-utils.h
│   ├── sdp.c
│   ├── sdp.h
│   ├── text2pcap.c
│   ├── text2pcap.h
│   ├── transports/
│   │   ├── janus_http.c
│   │   ├── janus_mqtt.c
│   │   ├── janus_nanomsg.c
│   │   ├── janus_pfunix.c
│   │   ├── janus_rabbitmq.c
│   │   ├── janus_websockets.c
│   │   ├── transport.c
│   │   └── transport.h
│   ├── turnrest.c
│   ├── turnrest.h
│   ├── utils.c
│   ├── utils.h
│   └── version.h
└── test/
    ├── README.md
    ├── echo.py
    ├── requirements.txt
    └── test_aiortc.sh
Download .txt
Showing preview only (237K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2441 symbols across 127 files)

FILE: fuzzers/engines/standalone.c
  function main (line 8) | int main(int argc, char **argv) {

FILE: fuzzers/rtcp_fuzzer.c
  function RAND_bytes (line 17) | int RAND_bytes(uint8_t *key, int len) {
  function LLVMFuzzerTestOneInput (line 21) | int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {

FILE: fuzzers/rtp_fuzzer.c
  function RAND_bytes (line 17) | int RAND_bytes(uint8_t *key, int len) {
  function srtp_validate_rtp_header (line 26) | static int srtp_validate_rtp_header(char *data, int pkt_octet_len) {
  function LLVMFuzzerTestOneInput (line 54) | int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {

FILE: fuzzers/sdp_fuzzer.c
  function RAND_bytes (line 18) | int RAND_bytes(uint8_t *key, int len) {
  function LLVMFuzzerTestOneInput (line 22) | int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {

FILE: html/demos/admin.js
  function promptAccessDetails (line 46) | function promptAccessDetails() {
  function randomString (line 72) | function randomString(len) {
  function updateServerInfo (line 83) | function updateServerInfo() {
  function updateSettings (line 306) | function updateSettings() {
  function setSessionTimeoutValue (line 508) | function setSessionTimeoutValue(timeout) {
  function setLogLevel (line 513) | function setLogLevel(level) {
  function setLockingDebug (line 518) | function setLockingDebug(enable) {
  function setRefcountDebug (line 523) | function setRefcountDebug(enable) {
  function setLogTimestamps (line 528) | function setLogTimestamps(enable) {
  function setLogColors (line 533) | function setLogColors(enable) {
  function setMinNackQueue (line 538) | function setMinNackQueue(queue) {
  function setNoMediaTimer (line 543) | function setNoMediaTimer(timer) {
  function setSlowlinkThreshold (line 548) | function setSlowlinkThreshold(packets) {
  function sendSettingsRequest (line 553) | function sendSettingsRequest(request) {
  function resetPluginRequest (line 595) | function resetPluginRequest() {
  function addPluginMessageAttribute (line 657) | function addPluginMessageAttribute() {
  function sendPluginMessage (line 679) | function sendPluginMessage(plugin, message) {
  function resetTransportRequest (line 727) | function resetTransportRequest() {
  function addTransportMessageAttribute (line 789) | function addTransportMessageAttribute() {
  function sendTransportMessage (line 811) | function sendTransportMessage(transport, message) {
  function updateSessions (line 860) | function updateSessions() {
  function updateHandles (line 977) | function updateHandles() {
  function updateHandleInfo (line 1073) | function updateHandleInfo(refresh) {
  function rawHandleInfo (line 1169) | function rawHandleInfo() {
  function prettyHandleInfo (line 1174) | function prettyHandleInfo() {
  function updateTokens (line 1343) | function updateTokens() {
  function addToken (line 1456) | function addToken(token, permissions) {
  function removeToken (line 1461) | function removeToken(token) {
  function sendTokenRequest (line 1466) | function sendTokenRequest(request) {
  function captureTrafficPrompt (line 1508) | function captureTrafficPrompt() {
  function captureTrafficRequest (line 1561) | function captureTrafficRequest(start, text, folder, filename, truncate) {
  function checkEnter (line 1603) | function checkEnter(field, event) {

FILE: html/demos/audiobridge.js
  function checkEnter (line 431) | function checkEnter(field, event) {
  function registerUsername (line 441) | function registerUsername() {
  function getQueryStringValue (line 481) | function getQueryStringValue(name) {
  function escapeXmlTags (line 489) | function escapeXmlTags(value) {

FILE: html/demos/canvas.js
  function checkEnter (line 326) | function checkEnter(event) {
  function createCanvas (line 337) | function createCanvas() {
  function updateCanvas (line 444) | function updateCanvas() {
  function getQueryStringValue (line 454) | function getQueryStringValue(name) {
  function addSimulcastButtons (line 462) | function addSimulcastButtons(temporal) {
  function updateSimulcastButtons (line 546) | function updateSimulcastButtons(substream, temporal) {

FILE: html/demos/devices.js
  function initDevices (line 29) | function initDevices(devices) {
  function restartCapture (line 88) | function restartCapture() {
  function checkEnter (line 553) | function checkEnter(event) {
  function sendData (line 563) | function sendData() {
  function getQueryStringValue (line 577) | function getQueryStringValue(name) {
  function addSimulcastButtons (line 585) | function addSimulcastButtons(temporal) {
  function updateSimulcastButtons (line 668) | function updateSimulcastButtons(substream, temporal) {

FILE: html/demos/e2e.js
  function checkEnter (line 389) | function checkEnter(event) {
  function sendData (line 399) | function sendData() {
  function getQueryStringValue (line 413) | function getQueryStringValue(name) {
  function addSimulcastButtons (line 421) | function addSimulcastButtons(temporal) {
  function updateSimulcastButtons (line 505) | function updateSimulcastButtons(substream, temporal) {
  function promptCryptoKey (line 558) | function promptCryptoKey() {
  method start (line 609) | start() {
  method transform (line 613) | transform(chunk, controller) {
  method flush (line 631) | flush() {
  method start (line 637) | start() {
  method transform (line 641) | transform(chunk, controller) {
  method flush (line 667) | flush() {

FILE: html/demos/echotest.js
  function checkEnter (line 516) | function checkEnter(event) {
  function sendData (line 526) | function sendData() {
  function getQueryStringValue (line 540) | function getQueryStringValue(name) {
  function addSimulcastSvcButtons (line 548) | function addSimulcastSvcButtons(temporal) {
  function updateSimulcastSvcButtons (line 648) | function updateSimulcastSvcButtons(substream, temporal) {

FILE: html/demos/janus.js
  function Janus (line 571) | function Janus(gatewayCallbacks) {

FILE: html/demos/multiopus.js
  method customizeSdp (line 91) | customizeSdp(jsep) {
  function checkEnter (line 390) | function checkEnter(event) {
  function sendData (line 400) | function sendData() {
  function getQueryStringValue (line 414) | function getQueryStringValue(name) {
  function addSimulcastButtons (line 422) | function addSimulcastButtons(temporal) {
  function updateSimulcastButtons (line 506) | function updateSimulcastButtons(substream, temporal) {

FILE: html/demos/mvideoroom.js
  function checkEnter (line 407) | function checkEnter(field, event) {
  function registerUsername (line 417) | function registerUsername() {
  function publishOwnFeed (line 454) | function publishOwnFeed(useAudio) {
  function toggleMute (line 506) | function toggleMute() {
  function unpublishOwnFeed (line 517) | function unpublishOwnFeed() {
  function subscribeTo (line 525) | function subscribeTo(sources) {
  function unsubscribeFrom (line 885) | function unsubscribeFrom(id) {
  function getQueryStringValue (line 913) | function getQueryStringValue(name) {
  function escapeXmlTags (line 921) | function escapeXmlTags(value) {
  function addSimulcastSvcButtons (line 930) | function addSimulcastSvcButtons(feed, temporal) {
  function updateSimulcastSvcButtons (line 1043) | function updateSimulcastSvcButtons(feed, substream, temporal) {

FILE: html/demos/nosip.js
  function renegotiateVideo (line 479) | function renegotiateVideo() {

FILE: html/demos/recordplay.js
  function checkEnter (line 430) | function checkEnter(event) {
  function sendData (line 440) | function sendData() {
  function updateRecsList (line 453) | function updateRecsList() {
  function startRecording (line 494) | function startRecording() {
  function startPlayout (line 573) | function startPlayout() {
  function stopRecPlay (line 593) | function stopRecPlay() {
  function getQueryStringValue (line 602) | function getQueryStringValue(name) {
  function escapeXmlTags (line 610) | function escapeXmlTags(value) {

FILE: html/demos/screensharing.js
  function checkEnterShare (line 317) | function checkEnterShare(field, event) {
  function preShareScreen (line 327) | function preShareScreen() {
  function shareScreen (line 351) | function shareScreen() {
  function checkEnterJoin (line 385) | function checkEnterJoin(field, event) {
  function joinScreen (line 395) | function joinScreen() {
  function newRemoteFeed (line 422) | function newRemoteFeed(id, display) {
  function escapeXmlTags (line 579) | function escapeXmlTags(value) {

FILE: html/demos/sip.js
  function checkEnter (line 709) | function checkEnter(field, event) {
  function registerUsername (line 722) | function registerUsername() {
  function doCall (line 884) | function doCall(ev) {
  function actuallyDoCall (line 918) | function actuallyDoCall(handle, uri, doVideo, referId) {
  function doHangup (line 971) | function doHangup(ev) {
  function addHelper (line 1005) | function addHelper(helperCreated) {
  function removeHelper (line 1672) | function removeHelper(helperId) {

FILE: html/demos/streaming.js
  function updateStreamsList (line 307) | function updateStreamsList() {
  function getStreamInfo (line 367) | function getStreamInfo() {
  function startStream (line 382) | function startStream() {
  function stopStream (line 441) | function stopStream() {
  function escapeXmlTags (line 449) | function escapeXmlTags(value) {
  function addPanel (line 458) | function addPanel(panelId, mid, desc) {
  function addSimulcastButtons (line 482) | function addSimulcastButtons(mid) {
  function updateSimulcastButtons (line 561) | function updateSimulcastButtons(mid, substream, temporal) {
  function addSvcButtons (line 599) | function addSvcButtons(mid) {
  function updateSvcButtons (line 668) | function updateSvcButtons(mid, spatial, temporal) {

FILE: html/demos/textroom.js
  function checkEnter (line 207) | function checkEnter(field, event) {
  function registerUsername (line 220) | function registerUsername() {
  function sendPrivateMsg (line 302) | function sendPrivateMsg(username) {
  function sendData (line 328) | function sendData() {
  function getDateString (line 353) | function getDateString(jsonDate) {
  function getQueryStringValue (line 366) | function getQueryStringValue(name) {
  function escapeXmlTags (line 374) | function escapeXmlTags(value) {

FILE: html/demos/videocall.js
  function checkEnter (line 531) | function checkEnter(field, event) {
  function registerUsername (line 546) | function registerUsername() {
  function doCall (line 567) | function doCall() {
  function doHangup (line 612) | function doHangup() {
  function sendData (line 621) | function sendData() {
  function getQueryStringValue (line 635) | function getQueryStringValue(name) {
  function escapeXmlTags (line 643) | function escapeXmlTags(value) {
  function addSimulcastButtons (line 652) | function addSimulcastButtons(temporal) {
  function updateSimulcastButtons (line 736) | function updateSimulcastButtons(substream, temporal) {

FILE: html/demos/videoroom.js
  function checkEnter (line 404) | function checkEnter(field, event) {
  function registerUsername (line 414) | function registerUsername() {
  function publishOwnFeed (line 451) | function publishOwnFeed(useAudio) {
  function toggleMute (line 510) | function toggleMute() {
  function unpublishOwnFeed (line 521) | function unpublishOwnFeed() {
  function newRemoteFeed (line 529) | function newRemoteFeed(id, display, streams) {
  function getQueryStringValue (line 775) | function getQueryStringValue(name) {
  function escapeXmlTags (line 783) | function escapeXmlTags(value) {
  function addSimulcastSvcButtons (line 792) | function addSimulcastSvcButtons(feed, temporal) {
  function updateSimulcastSvcButtons (line 906) | function updateSimulcastSvcButtons(feed, substream, temporal) {

FILE: html/demos/virtualbg.js
  function getQueryStringValue (line 358) | function getQueryStringValue(name) {
  function handleSegmentationResults (line 366) | function handleSegmentationResults(results) {
  function createCanvas (line 399) | function createCanvas() {
  function addSimulcastButtons (line 489) | function addSimulcastButtons(temporal) {
  function updateSimulcastButtons (line 573) | function updateSimulcastButtons(substream, temporal) {

FILE: html/demos/webaudio.js
  function getQueryStringValue (line 210) | function getQueryStringValue(name) {
  function checkEnter (line 218) | function checkEnter(event) {
  function setupWebAudioDemo (line 279) | function setupWebAudioDemo() {
  function drawVisualizer (line 330) | function drawVisualizer() {

FILE: npm/janus.d.ts
  type Dependencies (line 6) | interface Dependencies {
  type DefaultDependencies (line 14) | interface DefaultDependencies extends Dependencies {
  type OldDependencies (line 19) | interface OldDependencies extends Dependencies {
  type DependenciesResult (line 23) | interface DependenciesResult {
  type ChromeExtension (line 31) | type ChromeExtension = {
  type GetScreenCallback (line 39) | type GetScreenCallback = (error:string, sourceId:string) => void
  type HttpApiCallOption (line 41) | type HttpApiCallOption = {
  type JanusRequest (line 51) | type JanusRequest = {
  type DebugLevel (line 65) | enum DebugLevel {
  type JSEP (line 74) | interface JSEP {
  type InitOptions (line 82) | interface InitOptions {
  type ConstructorOptions (line 88) | interface ConstructorOptions {
  type ReconnectOptions (line 106) | interface ReconnectOptions {
  type DestroyOptions (line 111) | interface DestroyOptions {
  type GetInfoOptions (line 119) | interface GetInfoOptions {
  type RemoteTrackMetadata (line 124) | interface RemoteTrackMetadata {
  type MessageType (line 128) | enum MessageType {
  type Message (line 138) | interface Message {
  type PluginCallbacks (line 148) | interface PluginCallbacks {
  type PluginOptions (line 166) | interface PluginOptions extends PluginCallbacks {
  type OfferParams (line 173) | interface OfferParams {
  type PluginMessage (line 205) | interface PluginMessage {
  type WebRTCInfo (line 215) | interface WebRTCInfo {
  type PluginCreateAnswerParam (line 260) | type PluginCreateAnswerParam = {
  type PluginHandleRemoteJsepParam (line 271) | type PluginHandleRemoteJsepParam = {
  type PluginReplaceTracksParam (line 277) | type PluginReplaceTracksParam = {
  type TrackOption (line 283) | type TrackOption = {
  type PluginDtmfParam (line 310) | type PluginDtmfParam = {
  type Dtmf (line 316) | type Dtmf = {
  type PluginDataParam (line 322) | type PluginDataParam = {
  type TrackDesc (line 332) | type TrackDesc = {
  type DetachOptions (line 339) | interface DetachOptions {
  type PluginHandle (line 345) | interface PluginHandle {
  class Janus (line 377) | class Janus {

FILE: src/auth.c
  function janus_auth_free_token (line 42) | static void janus_auth_free_token(char *token) {
  function janus_auth_init (line 47) | void janus_auth_init(gboolean enabled, const char *secret) {
  function gboolean (line 64) | gboolean janus_auth_is_enabled(void) {
  function gboolean (line 68) | gboolean janus_auth_is_stored_mode(void) {
  function gboolean (line 72) | gboolean janus_auth_is_signed_mode(void) {
  function janus_auth_deinit (line 76) | void janus_auth_deinit(void) {
  function gboolean (line 89) | gboolean janus_auth_check_signature(const char *token, const char *realm) {
  function gboolean (line 126) | gboolean janus_auth_check_signature_contains(const char *token, const ch...
  function gboolean (line 178) | gboolean janus_auth_add_token(const char *token) {
  function gboolean (line 197) | gboolean janus_auth_check_token(const char *token) {
  function GList (line 212) | GList *janus_auth_list_tokens(void) {
  function gboolean (line 231) | gboolean janus_auth_remove_token(const char *token) {
  function gboolean (line 249) | gboolean janus_auth_allow_plugin(const char *token, janus_plugin *plugin) {
  function gboolean (line 283) | gboolean janus_auth_check_plugin(const char *token, janus_plugin *plugin) {
  function GList (line 303) | GList *janus_auth_list_plugins(const char *token) {
  function gboolean (line 320) | gboolean janus_auth_disallow_plugin(const char *token, janus_plugin *plu...

FILE: src/config.c
  function gboolean (line 30) | static gboolean is_jcfg_config(const char *path) {
  function janus_config_jcfg_parse (line 62) | static int janus_config_jcfg_parse(janus_config *config, janus_config_co...
  function janus_config (line 178) | janus_config *janus_config_parse(const char *config_file) {
  function janus_config (line 318) | janus_config *janus_config_create(const char *name) {
  function janus_config_item (line 330) | janus_config_item *janus_config_item_create(const char *name, const char...
  function janus_config_category (line 342) | janus_config_category *janus_config_category_create(const char *name) {
  function janus_config_array (line 350) | janus_config_array *janus_config_array_create(const char *name) {
  function janus_config_container_destroy (line 358) | void janus_config_container_destroy(janus_config_container *container) {
  function janus_config_container (line 370) | static janus_config_container *janus_config_get_internal(janus_config *c...
  function janus_config_container (line 404) | janus_config_container *janus_config_get(janus_config *config,
  function janus_config_container (line 409) | janus_config_container *janus_config_get_create(janus_config *config,
  function janus_config_container (line 414) | janus_config_container *janus_config_search(janus_config *config, ...) {
  function janus_config_add (line 447) | int janus_config_add(janus_config *config, janus_config_container *conta...
  function janus_config_remove (line 466) | int janus_config_remove(janus_config *config, janus_config_container *co...
  function GList (line 485) | GList *janus_config_get_items(janus_config *config, janus_config_contain...
  function GList (line 499) | GList *janus_config_get_categories(janus_config *config, janus_config_co...
  function GList (line 513) | GList *janus_config_get_arrays(janus_config *config, janus_config_contai...
  function janus_config_print (line 529) | void janus_config_print(janus_config *config) {
  function janus_config_print_list (line 534) | static void janus_config_print_list(int level, GList *l, int indent) {
  function janus_config_print_as (line 561) | void janus_config_print_as(janus_config *config, int level) {
  function janus_config_save_list (line 569) | static void janus_config_save_list(janus_config *config, FILE *file, int...
  function gboolean (line 648) | gboolean janus_config_save(janus_config *config, const char *folder, con...
  function janus_config_destroy (line 700) | void janus_config_destroy(janus_config *config) {

FILE: src/config.h
  type janus_config_type (line 17) | typedef enum janus_config_type {
  type janus_config_container (line 29) | typedef struct janus_config_container {
  type janus_config_item (line 41) | typedef struct janus_config_container janus_config_item;
  type janus_config_category (line 44) | typedef struct janus_config_container janus_config_category;
  type janus_config_array (line 47) | typedef struct janus_config_container janus_config_array;
  type janus_config (line 50) | typedef struct janus_config {

FILE: src/dtls-bio.c
  function janus_dtls_bio_agent_set_mtu (line 20) | void janus_dtls_bio_agent_set_mtu(int start_mtu) {
  function janus_dtls_bio_agent_get_mtu (line 28) | int janus_dtls_bio_agent_get_mtu(void) {
  function janus_dtls_bio_agent_init (line 55) | int janus_dtls_bio_agent_init(void) {
  function BIO_METHOD (line 71) | static BIO_METHOD *BIO_janus_dtls_agent_method(void) {
  function BIO (line 79) | BIO *BIO_janus_dtls_agent_new(void *dtls) {
  function janus_dtls_bio_agent_new (line 92) | static int janus_dtls_bio_agent_new(BIO *bio) {
  function janus_dtls_bio_agent_free (line 105) | static int janus_dtls_bio_agent_free(BIO *bio) {
  function janus_dtls_bio_agent_write (line 117) | static int janus_dtls_bio_agent_write(BIO *bio, const char *in, int inl) {
  function janus_dtls_bio_agent_ctrl (line 171) | static long janus_dtls_bio_agent_ctrl(BIO *bio, int cmd, long num, void ...

FILE: src/dtls.c
  function gchar (line 28) | const gchar *janus_get_dtls_srtp_state(janus_dtls_state state) {
  function gchar (line 44) | const gchar *janus_get_dtls_srtp_role(janus_dtls_role role) {
  function gchar (line 58) | const gchar *janus_get_dtls_srtp_profile(int profile) {
  function janus_dtls_notify_state_change (line 77) | static void janus_dtls_notify_state_change(janus_dtls_srtp *dtls) {
  function gboolean (line 100) | gboolean janus_is_dtls(char *buf) {
  function gboolean (line 116) | gboolean janus_dtls_are_selfsigned_certs_ok(void) {
  function gchar (line 130) | gchar *janus_dtls_get_local_fingerprint(void) {
  function janus_dtls_cb_openssl_threadid (line 163) | static void janus_dtls_cb_openssl_threadid(CRYPTO_THREADID *tid) {
  function janus_dtls_cb_openssl_lock (line 175) | static void janus_dtls_cb_openssl_lock(int mode, int type, const char *f...
  function janus_dtls_generate_keys (line 185) | static int janus_dtls_generate_keys(X509 **certificate, EVP_PKEY **priva...
  function janus_dtls_load_keys (line 350) | static int janus_dtls_load_keys(const char *server_pem, const char *serv...
  function gint (line 398) | gint janus_dtls_srtp_init(const char *server_pem, const char *server_key...
  function janus_dtls_srtp_free (line 523) | static void janus_dtls_srtp_free(const janus_refcount *dtls_ref) {
  function janus_dtls_srtp_cleanup (line 549) | void janus_dtls_srtp_cleanup(void) {
  function janus_dtls_srtp (line 571) | janus_dtls_srtp *janus_dtls_srtp_create(void *ice_pc, janus_dtls_role ro...
  function janus_dtls_srtp_handshake (line 650) | void janus_dtls_srtp_handshake(janus_dtls_srtp *dtls) {
  function janus_dtls_srtp_create_sctp (line 669) | int janus_dtls_srtp_create_sctp(janus_dtls_srtp *dtls) {
  function janus_dtls_srtp_incoming_msg (line 693) | void janus_dtls_srtp_incoming_msg(janus_dtls_srtp *dtls, char *buf, uint...
  function janus_dtls_srtp_send_alert (line 978) | void janus_dtls_srtp_send_alert(janus_dtls_srtp *dtls) {
  function janus_dtls_srtp_destroy (line 989) | void janus_dtls_srtp_destroy(janus_dtls_srtp *dtls) {
  function janus_dtls_callback (line 1005) | void janus_dtls_callback(const SSL *ssl, int where, int ret) {
  function janus_dtls_verify_callback (line 1030) | int janus_dtls_verify_callback(int preverify_ok, X509_STORE_CTX *ctx) {
  function janus_dtls_sctp_data_ready (line 1048) | void janus_dtls_sctp_data_ready(janus_dtls_srtp *dtls) {
  function janus_dtls_wrap_sctp_data (line 1064) | void janus_dtls_wrap_sctp_data(janus_dtls_srtp *dtls, char *label, char ...
  function janus_dtls_send_sctp_data (line 1072) | int janus_dtls_send_sctp_data(janus_dtls_srtp *dtls, char *buf, int len) {
  function janus_dtls_notify_sctp_data (line 1083) | void janus_dtls_notify_sctp_data(janus_dtls_srtp *dtls, char *label, cha...
  function gboolean (line 1100) | gboolean janus_dtls_retry(gpointer stack) {

FILE: src/dtls.h
  type janus_dtls_role (line 51) | typedef enum janus_dtls_role {
  type janus_dtls_state (line 58) | typedef enum janus_dtls_state {
  type janus_dtls_srtp (line 66) | typedef struct janus_dtls_srtp {

FILE: src/events.c
  type janus_event_types (line 18) | struct janus_event_types {
  function janus_events_init (line 46) | int janus_events_init(gboolean enabled, char *server_name, GHashTable *h...
  function janus_events_deinit (line 69) | void janus_events_deinit(void) {
  function gboolean (line 83) | gboolean janus_events_is_enabled(void) {
  function janus_events_notify_handlers (line 87) | void janus_events_notify_handlers(int type, int subtype, guint64 session...
  function janus_events_edit_events_mask (line 327) | void janus_events_edit_events_mask(const char *list, janus_flags *target) {
  type janus_event_types (line 372) | struct janus_event_types
  type janus_event_types (line 382) | struct janus_event_types

FILE: src/events/eventhandler.h
  type janus_eventhandler (line 210) | typedef struct janus_eventhandler janus_eventhandler;
  type janus_eventhandler (line 214) | struct janus_eventhandler {
  type janus_eventhandler (line 278) | typedef janus_eventhandler* create_e(void);

FILE: src/events/janus_gelfevh.c
  function janus_eventhandler (line 81) | janus_eventhandler *create(void) {
  function janus_gelfevh_event_free (line 102) | static void janus_gelfevh_event_free(json_t *event) {
  type janus_gelfevh_socket_type (line 112) | typedef enum janus_gelfevh_socket_type {
  type janus_json_parameter (line 123) | struct janus_json_parameter
  type janus_json_parameter (line 125) | struct janus_json_parameter
  function janus_gelfevh_connect (line 156) | static int janus_gelfevh_connect(void) {
  function janus_gelfevh_send (line 196) | static int janus_gelfevh_send(char *message) {
  function janus_gelfevh_init (line 278) | int janus_gelfevh_init(const char *config_path) {
  function janus_gelfevh_destroy (line 404) | void janus_gelfevh_destroy(void) {
  function janus_gelfevh_get_api_compatibility (line 428) | int janus_gelfevh_get_api_compatibility(void) {
  function janus_gelfevh_get_version (line 433) | int janus_gelfevh_get_version(void) {
  function janus_gelfevh_incoming_event (line 457) | void janus_gelfevh_incoming_event(json_t *event) {
  function json_t (line 475) | json_t *janus_gelfevh_handle_request(json_t *request) {

FILE: src/events/janus_mqttevh.c
  function janus_mqttevh_event_free (line 73) | static void janus_mqttevh_event_free(json_t *event) {
  function janus_eventhandler (line 83) | janus_eventhandler *create(void) {
  type janus_json_parameter (line 124) | struct janus_json_parameter
  type janus_json_parameter (line 127) | struct janus_json_parameter
  type janus_mqttevh_context (line 141) | typedef struct janus_mqttevh_context {
  type janus_mqttevh_set_add_user_property_user_data (line 198) | typedef struct janus_mqttevh_set_add_user_property_user_data {
  function janus_mqttevh_get_api_compatibility (line 249) | static int janus_mqttevh_get_api_compatibility(void) {
  function janus_mqttevh_get_version (line 254) | static int janus_mqttevh_get_version(void) {
  function janus_mqttevh_send_message (line 279) | static int janus_mqttevh_send_message(void *context, const char *topic, ...
  function janus_mqttevh_client_publish_message_wrap (line 325) | int janus_mqttevh_client_publish_message_wrap(void *context, const char ...
  function janus_mqttevh_client_connection_lost (line 345) | static void janus_mqttevh_client_connection_lost(void *context, char *ca...
  function janus_mqttevh_client_connect (line 354) | static int janus_mqttevh_client_connect(janus_mqttevh_context *ctx) {
  function janus_mqttevh_client_connect_success (line 405) | static void janus_mqttevh_client_connect_success(void *context, MQTTAsyn...
  function janus_mqttevh_client_connect_success5 (line 410) | static void janus_mqttevh_client_connect_success5(void *context, MQTTAsy...
  function janus_mqttevh_client_connect_success_impl (line 415) | static void janus_mqttevh_client_connect_success_impl(void *context) {
  function janus_mqttevh_client_connect_failure (line 434) | static void janus_mqttevh_client_connect_failure(void *context, MQTTAsyn...
  function janus_mqttevh_client_connect_failure5 (line 440) | static void janus_mqttevh_client_connect_failure5(void *context, MQTTAsy...
  function janus_mqttevh_client_connect_failure_impl (line 446) | static void janus_mqttevh_client_connect_failure_impl(void *contexts, in...
  function janus_mqttevh_client_disconnect (line 452) | static int janus_mqttevh_client_disconnect(janus_mqttevh_context *ctx) {
  function janus_mqttevh_client_disconnect_success (line 486) | static void janus_mqttevh_client_disconnect_success(void *context, MQTTA...
  function janus_mqttevh_client_disconnect_success5 (line 491) | static void janus_mqttevh_client_disconnect_success5(void *context, MQTT...
  function janus_mqttevh_client_disconnect_success_impl (line 496) | static void janus_mqttevh_client_disconnect_success_impl(void *context) {
  function janus_mqttevh_client_disconnect_failure (line 505) | void janus_mqttevh_client_disconnect_failure(void *context, MQTTAsync_fa...
  function janus_mqttevh_client_disconnect_failure5 (line 511) | void janus_mqttevh_client_disconnect_failure5(void *context, MQTTAsync_f...
  function janus_mqttevh_client_disconnect_failure_impl (line 517) | void janus_mqttevh_client_disconnect_failure_impl(void *context, int rc) {
  function janus_mqttevh_client_publish_message (line 527) | static int janus_mqttevh_client_publish_message(janus_mqttevh_context *c...
  function janus_mqttevh_client_publish_message5 (line 561) | static int janus_mqttevh_client_publish_message5(janus_mqttevh_context *...
  function janus_mqttevh_client_publish_message_success (line 592) | static void janus_mqttevh_client_publish_message_success(void *context, ...
  function janus_mqttevh_client_publish_message_success5 (line 597) | static void janus_mqttevh_client_publish_message_success5(void *context,...
  function janus_mqttevh_client_publish_message_success_impl (line 602) | static void janus_mqttevh_client_publish_message_success_impl(void *cont...
  function janus_mqttevh_client_publish_message_failure (line 610) | static void janus_mqttevh_client_publish_message_failure(void *context, ...
  function janus_mqttevh_client_publish_message_failure5 (line 616) | static void janus_mqttevh_client_publish_message_failure5(void *context,...
  function janus_mqttevh_client_publish_message_failure_impl (line 622) | static void janus_mqttevh_client_publish_message_failure_impl(void *cont...
  function janus_mqttevh_client_destroy_context (line 633) | static void janus_mqttevh_client_destroy_context(janus_mqttevh_context *...
  function janus_mqttevh_client_message_arrived (line 651) | static int janus_mqttevh_client_message_arrived(void *context, char *top...
  function janus_mqttevh_client_delivery_complete (line 668) | static void janus_mqttevh_client_delivery_complete(void *context, MQTTAs...
  function janus_mqttevh_init (line 673) | static int janus_mqttevh_init(const char *config_path) {
  function janus_mqttevh_destroy (line 1089) | static void janus_mqttevh_destroy(void) {
  function janus_mqttevh_incoming_event (line 1116) | static void janus_mqttevh_incoming_event(json_t *event) {
  function json_t (line 1125) | json_t *janus_mqttevh_handle_request(json_t *request) {
  function janus_mqttevh_client_get_response_code (line 1224) | int janus_mqttevh_client_get_response_code(MQTTAsync_failureData *respon...
  function janus_mqttevh_client_get_response_code5 (line 1229) | int janus_mqttevh_client_get_response_code5(MQTTAsync_failureData5 *resp...
  function janus_mqttevh_add_properties (line 1233) | void janus_mqttevh_add_properties(GArray *user_properties, MQTTPropertie...
  function janus_mqttevh_set_add_user_property (line 1246) | void janus_mqttevh_set_add_user_property(gpointer item_ptr, gpointer use...

FILE: src/events/janus_nanomsgevh.c
  function janus_eventhandler (line 70) | janus_eventhandler *create(void) {
  function janus_nanomsgevh_event_free (line 86) | static void janus_nanomsgevh_event_free(json_t *event) {
  type janus_json_parameter (line 100) | struct janus_json_parameter
  type janus_json_parameter (line 103) | struct janus_json_parameter
  function janus_nanomsgevh_init (line 115) | int janus_nanomsgevh_init(const char *config_path) {
  function janus_nanomsgevh_destroy (line 271) | void janus_nanomsgevh_destroy(void) {
  function janus_nanomsgevh_get_api_compatibility (line 297) | int janus_nanomsgevh_get_api_compatibility(void) {
  function janus_nanomsgevh_get_version (line 302) | int janus_nanomsgevh_get_version(void) {
  function janus_nanomsgevh_incoming_event (line 326) | void janus_nanomsgevh_incoming_event(json_t *event) {
  function json_t (line 343) | json_t *janus_nanomsgevh_handle_request(json_t *request) {
  type nn_pollfd (line 459) | struct nn_pollfd

FILE: src/events/janus_rabbitmqevh.c
  function janus_eventhandler (line 78) | janus_eventhandler *create(void) {
  function janus_rabbitmqevh_event_free (line 96) | static void janus_rabbitmqevh_event_free(json_t *event) {
  type janus_json_parameter (line 128) | struct janus_json_parameter
  type janus_json_parameter (line 131) | struct janus_json_parameter
  function janus_rabbitmqevh_init (line 143) | int janus_rabbitmqevh_init(const char *config_path) {
  function janus_rabbitmqevh_connect (line 346) | int janus_rabbitmqevh_connect(void) {
  function janus_rabbitmqevh_destroy (line 431) | void janus_rabbitmqevh_destroy(void) {
  function janus_rabbitmqevh_get_api_compatibility (line 466) | int janus_rabbitmqevh_get_api_compatibility(void) {
  function janus_rabbitmqevh_get_version (line 471) | int janus_rabbitmqevh_get_version(void) {
  function janus_rabbitmqevh_incoming_event (line 495) | void janus_rabbitmqevh_incoming_event(json_t *event) {
  function json_t (line 512) | json_t *janus_rabbitmqevh_handle_request(json_t *request) {
  type timeval (line 639) | struct timeval

FILE: src/events/janus_sampleevh.c
  function janus_eventhandler (line 69) | janus_eventhandler *create(void) {
  function janus_sampleevh_event_free (line 92) | static void janus_sampleevh_event_free(json_t *event) {
  function janus_sampleehv_write_data (line 105) | static size_t janus_sampleehv_write_data(void *buffer, size_t size, size...
  type janus_json_parameter (line 111) | struct janus_json_parameter
  type janus_json_parameter (line 114) | struct janus_json_parameter
  function janus_sampleevh_init (line 131) | int janus_sampleevh_init(const char *config_path) {
  function janus_sampleevh_destroy (line 272) | void janus_sampleevh_destroy(void) {
  function janus_sampleevh_get_api_compatibility (line 293) | int janus_sampleevh_get_api_compatibility(void) {
  function janus_sampleevh_get_version (line 298) | int janus_sampleevh_get_version(void) {
  function janus_sampleevh_incoming_event (line 322) | void janus_sampleevh_incoming_event(json_t *event) {
  function json_t (line 340) | json_t *janus_sampleevh_handle_request(json_t *request) {
  type curl_slist (line 721) | struct curl_slist

FILE: src/events/janus_wsevh.c
  function janus_eventhandler (line 69) | janus_eventhandler *create(void) {
  function janus_wsevh_event_free (line 93) | static void janus_wsevh_event_free(json_t *event) {
  type janus_json_parameter (line 102) | struct janus_json_parameter
  type janus_json_parameter (line 105) | struct janus_json_parameter
  function janus_wsevh_log_emit_function (line 150) | static void janus_wsevh_log_emit_function(int level, const char *line) {
  type lws_context (line 161) | struct lws_context
  type janus_wsevh_client (line 170) | typedef struct janus_wsevh_client {
  type lws (line 179) | struct lws
  type lws (line 184) | struct lws
  type lws_callback_reasons (line 184) | enum lws_callback_reasons
  type lws_protocols (line 185) | struct lws_protocols
  type lws_extension (line 189) | struct lws_extension
  type lws_callback_reasons (line 199) | enum lws_callback_reasons
  function janus_wsevh_init (line 249) | int janus_wsevh_init(const char *config_path) {
  function janus_wsevh_destroy (line 449) | void janus_wsevh_destroy(void) {
  function janus_wsevh_get_api_compatibility (line 470) | int janus_wsevh_get_api_compatibility(void) {
  function janus_wsevh_get_version (line 475) | int janus_wsevh_get_version(void) {
  function janus_wsevh_incoming_event (line 499) | void janus_wsevh_incoming_event(json_t *event) {
  function json_t (line 542) | json_t *janus_wsevh_handle_request(json_t *request) {
  function janus_wsevh_callback (line 711) | static int janus_wsevh_callback(struct lws *wsi, enum lws_callback_reaso...

FILE: src/ice.c
  function janus_ice_get_stun_port (line 49) | uint16_t janus_ice_get_stun_port(void) {
  function janus_ice_get_turn_port (line 63) | uint16_t janus_ice_get_turn_port(void) {
  function janus_ice_allow_force_relay (line 79) | void janus_ice_allow_force_relay(void) {
  function gboolean (line 82) | gboolean janus_ice_is_force_relay_allowed(void) {
  function gboolean (line 88) | gboolean janus_ice_is_ice_lite_enabled(void) {
  function gboolean (line 94) | gboolean janus_ice_is_ice_tcp_enabled(void) {
  function gboolean (line 100) | gboolean janus_ice_is_full_trickle_enabled(void) {
  function gboolean (line 106) | gboolean janus_ice_is_mdns_enabled(void) {
  function gboolean (line 113) | gboolean janus_ice_is_ipv6_enabled(void) {
  function gboolean (line 117) | gboolean janus_ice_is_ipv6_linklocal_enabled(void) {
  function janus_ice_set_nomination_mode (line 125) | void janus_ice_set_nomination_mode(const char *nomination) {
  function janus_ice_set_consent_freshness_enabled (line 145) | void janus_ice_set_consent_freshness_enabled(gboolean enabled) {
  function gboolean (line 158) | gboolean janus_ice_is_consent_freshness_enabled(void) {
  function janus_ice_set_keepalive_conncheck_enabled (line 164) | void janus_ice_set_keepalive_conncheck_enabled(gboolean enabled) {
  function gboolean (line 174) | gboolean janus_ice_is_keepalive_conncheck_enabled(void) {
  function janus_ice_set_hangup_on_failed_enabled (line 180) | void janus_ice_set_hangup_on_failed_enabled(gboolean enabled) {
  function gboolean (line 186) | gboolean janus_ice_is_hangup_on_failed_enabled(void) {
  function janus_enable_opaqueid_in_api (line 194) | void janus_enable_opaqueid_in_api(void) {
  function gboolean (line 197) | gboolean janus_is_opaqueid_in_api_enabled(void) {
  type janus_ice_static_event_loop (line 202) | typedef struct janus_ice_static_event_loop {
  function janus_ice_static_event_loop_destroy (line 211) | static void janus_ice_static_event_loop_destroy(janus_ice_static_event_l...
  function janus_ice_static_event_loop_free (line 216) | static void janus_ice_static_event_loop_free(const janus_refcount *loop_...
  function janus_ice_get_static_event_loops (line 242) | int janus_ice_get_static_event_loops(void) {
  function gboolean (line 245) | gboolean janus_ice_is_loop_indication_allowed(void) {
  function janus_ice_set_static_event_loops (line 248) | void janus_ice_set_static_event_loops(int loops, gboolean allow_api) {
  function json_t (line 288) | json_t *janus_ice_static_event_loops_info(void) {
  function janus_ice_stop_static_event_loops (line 305) | void janus_ice_stop_static_event_loops(void) {
  function janus_ice_enable_nat_1_1 (line 325) | void janus_ice_enable_nat_1_1(gboolean kph) {
  function janus_ice_enforce_interface (line 334) | void janus_ice_enforce_interface(const char *ip) {
  function gboolean (line 342) | gboolean janus_ice_is_enforced(const char *ip) {
  function janus_ice_ignore_interface (line 361) | void janus_ice_ignore_interface(const char *ip) {
  function gboolean (line 372) | gboolean janus_ice_is_ignored(const char *ip) {
  function janus_ice_set_event_stats_period (line 394) | void janus_ice_set_event_stats_period(int period) {
  function janus_ice_get_event_stats_period (line 397) | int janus_ice_get_event_stats_period(void) {
  function janus_ice_event_set_combine_media_stats (line 403) | void janus_ice_event_set_combine_media_stats(gboolean combine_media_stat...
  function gboolean (line 406) | gboolean janus_ice_event_get_combine_media_stats(void) {
  function janus_ice_get_peerconnection_num (line 412) | int janus_ice_get_peerconnection_num(void) {
  function janus_media_type (line 427) | static janus_media_type janus_media_type_from_packet(int type) {
  type janus_ice_queued_packet (line 443) | typedef struct janus_ice_queued_packet {
  type janus_ice_nacked_packet (line 468) | typedef struct janus_ice_nacked_packet {
  function gboolean (line 474) | static gboolean janus_ice_nacked_packet_cleanup(gpointer user_data) {
  type janus_ice_outgoing_traffic (line 511) | typedef struct janus_ice_outgoing_traffic {
  function gboolean (line 519) | static gboolean janus_ice_outgoing_traffic_prepare(GSource *source, gint...
  function gboolean (line 523) | static gboolean janus_ice_outgoing_traffic_dispatch(GSource *source, GSo...
  function janus_ice_outgoing_traffic_finalize (line 533) | static void janus_ice_outgoing_traffic_finalize(GSource *source) {
  function GSource (line 553) | static GSource *janus_ice_outgoing_traffic_create(janus_ice_handle *hand...
  function janus_set_no_media_timer (line 569) | void janus_set_no_media_timer(uint timer) {
  function uint (line 576) | uint janus_get_no_media_timer(void) {
  function janus_set_slowlink_threshold (line 587) | void janus_set_slowlink_threshold(uint packets) {
  function uint (line 594) | uint janus_get_slowlink_threshold(void) {
  function janus_set_twcc_period (line 601) | void janus_set_twcc_period(uint period) {
  function uint (line 610) | uint janus_get_twcc_period(void) {
  function janus_set_dscp (line 616) | void janus_set_dscp(int dscp) {
  function janus_get_dscp (line 622) | int janus_get_dscp(void) {
  function janus_ice_free_rtp_packet (line 627) | static inline void janus_ice_free_rtp_packet(janus_rtp_packet *pkt) {
  function janus_ice_free_queued_packet (line 636) | static void janus_ice_free_queued_packet(janus_ice_queued_packet *pkt) {
  function janus_set_nack_optimizations_enabled (line 660) | void janus_set_nack_optimizations_enabled(gboolean optimize) {
  function gboolean (line 663) | gboolean janus_is_nack_optimizations_enabled(void) {
  function janus_set_min_nack_queue (line 668) | void janus_set_min_nack_queue(uint16_t mnq) {
  function janus_get_min_nack_queue (line 675) | uint16_t janus_get_min_nack_queue(void) {
  function janus_cleanup_nack_buffer (line 679) | static void janus_cleanup_nack_buffer(gint64 now, janus_ice_peerconnecti...
  function janus_seq_append (line 710) | static void janus_seq_append(janus_seq_info **head, janus_seq_info *new_...
  function janus_seq_info (line 723) | static janus_seq_info *janus_seq_pop_head(janus_seq_info **head) {
  function janus_seq_list_free (line 737) | void janus_seq_list_free(janus_seq_info **head) {
  function janus_seq_in_range (line 748) | static int janus_seq_in_range(guint16 seqn, guint16 start, guint16 len) {
  function gboolean (line 766) | gboolean janus_plugin_session_is_alive(janus_plugin_session *plugin_sess...
  function janus_plugin_session_dereference (line 779) | static void janus_plugin_session_dereference(janus_plugin_session *plugi...
  function janus_ice_clear_queued_candidates (line 785) | static void janus_ice_clear_queued_candidates(janus_ice_handle *handle) {
  function janus_ice_clear_queued_packets (line 794) | static void janus_ice_clear_queued_packets(janus_ice_handle *handle) {
  function janus_ice_notify_trickle (line 806) | static void janus_ice_notify_trickle(janus_ice_handle *handle, char *buf...
  function janus_ice_notify_media (line 837) | static void janus_ice_notify_media(janus_ice_handle *handle, char *mid, ...
  function janus_ice_notify_ice_failed (line 877) | static void janus_ice_notify_ice_failed(janus_ice_handle *handle) {
  function janus_ice_notify_hangup (line 896) | void janus_ice_notify_hangup(janus_ice_handle *handle, const char *reaso...
  function janus_ice_trickle (line 928) | janus_ice_trickle *janus_ice_trickle_new(const char *transaction, json_t...
  function gint (line 939) | gint janus_ice_trickle_parse(janus_ice_handle *handle, json_t *candidate...
  function janus_ice_trickle_destroy (line 1001) | void janus_ice_trickle_destroy(janus_ice_trickle *trickle) {
  function janus_ice_init (line 1014) | void janus_ice_init(gboolean ice_lite, gboolean ice_tcp, gboolean full_t...
  function janus_ice_deinit (line 1066) | void janus_ice_deinit(void) {
  function janus_ice_test_stun_server (line 1072) | int janus_ice_test_stun_server(janus_network_address *addr, uint16_t port,
  function janus_ice_set_stun_server (line 1206) | int janus_ice_set_stun_server(gchar *stun_server, uint16_t stun_port) {
  function janus_ice_set_turn_server (line 1252) | int janus_ice_set_turn_server(gchar *turn_server, uint16_t turn_port, gc...
  function janus_ice_set_turn_rest_api (line 1302) | int janus_ice_set_turn_rest_api(gchar *api_server, gchar *api_key, gchar...
  function gchar (line 1329) | const gchar *janus_get_ice_state_name(gint state) {
  function janus_ice_handle (line 1357) | janus_ice_handle *janus_ice_handle_create(void *core_session, const char...
  function gint (line 1393) | gint janus_ice_handle_attach_plugin(void *core_session, janus_ice_handle...
  function gint (line 1506) | gint janus_ice_handle_destroy(void *core_session, janus_ice_handle *hand...
  function janus_ice_handle_free (line 1570) | static void janus_ice_handle_free(const janus_refcount *handle_ref) {
  function janus_ice_cb_agent_closed (line 1605) | static void janus_ice_cb_agent_closed(GObject *src, GAsyncResult *result...
  function janus_ice_plugin_session_free (line 1617) | static void janus_ice_plugin_session_free(const janus_refcount *app_hand...
  function janus_ice_webrtc_hangup (line 1629) | void janus_ice_webrtc_hangup(janus_ice_handle *handle, const char *reaso...
  function janus_ice_webrtc_free (line 1659) | static void janus_ice_webrtc_free(janus_ice_handle *handle) {
  function janus_ice_peerconnection_destroy (line 1738) | void janus_ice_peerconnection_destroy(janus_ice_peerconnection *pc) {
  function janus_ice_peerconnection_free (line 1765) | static void janus_ice_peerconnection_free(const janus_refcount *pc_ref) {
  function janus_ice_peerconnection_medium (line 1841) | janus_ice_peerconnection_medium *janus_ice_peerconnection_medium_create(...
  function janus_ice_peerconnection_medium_destroy (line 1884) | static void janus_ice_peerconnection_medium_destroy(janus_ice_peerconnec...
  function janus_ice_peerconnection_medium_dereference (line 1895) | static void janus_ice_peerconnection_medium_dereference(janus_ice_peerco...
  function janus_ice_peerconnection_medium_free (line 1901) | static void janus_ice_peerconnection_medium_free(const janus_refcount *m...
  function janus_slow_link_update (line 1976) | static void
  function gboolean (line 2027) | static gboolean janus_ice_check_failed(gpointer data) {
  function janus_ice_cb_candidate_gathering_done (line 2082) | static void janus_ice_cb_candidate_gathering_done(NiceAgent *agent, guin...
  function janus_ice_cb_component_state_changed (line 2102) | static void janus_ice_cb_component_state_changed(NiceAgent *agent, guint...
  function janus_ice_cb_new_selected_pair (line 2169) | static void janus_ice_cb_new_selected_pair (NiceAgent *agent, guint stre...
  function janus_ice_cb_new_local_candidate (line 2292) | static void janus_ice_cb_new_local_candidate (NiceAgent *agent, NiceCand...
  function janus_ice_cb_new_remote_candidate (line 2394) | static void janus_ice_cb_new_remote_candidate (NiceAgent *agent, NiceCan...
  function janus_ice_cb_nice_recv (line 2541) | static void janus_ice_cb_nice_recv(NiceAgent *agent, guint stream_id, gu...
  function janus_ice_incoming_data (line 3287) | void janus_ice_incoming_data(janus_ice_handle *handle, char *label, char...
  function janus_ice_candidate_to_string (line 3300) | static int janus_ice_candidate_to_string(janus_ice_handle *handle, NiceC...
  function janus_ice_candidates_to_sdp (line 3462) | void janus_ice_candidates_to_sdp(janus_ice_handle *handle, janus_sdp_mli...
  function janus_ice_add_remote_candidate (line 3516) | void janus_ice_add_remote_candidate(janus_ice_handle *handle, NiceCandid...
  function janus_ice_setup_remote_candidates (line 3530) | void janus_ice_setup_remote_candidates(janus_ice_handle *handle, guint s...
  type sockaddr_in (line 3715) | struct sockaddr_in
  type sockaddr_in6 (line 3715) | struct sockaddr_in6
  function janus_ice_restart (line 3843) | void janus_ice_restart(janus_ice_handle *handle) {
  function janus_ice_resend_trickles (line 3853) | void janus_ice_resend_trickles(janus_ice_handle *handle) {
  function janus_ice_rtp_extension_update (line 3894) | static void janus_ice_rtp_extension_update(janus_ice_handle *handle, jan...
  function gint (line 4143) | static gint rtcp_transport_wide_cc_stats_comparator(gconstpointer item1,...
  function gboolean (line 4146) | static gboolean janus_ice_outgoing_transport_wide_cc_feedback(gpointer u...
  function janus_ice_send_compound_rtcp (line 4270) | static inline void janus_ice_send_compound_rtcp(janus_ice_handle *handle,
  function gboolean (line 4281) | static gboolean janus_ice_outgoing_rtcp_handle(gpointer user_data) {
  function gboolean (line 4393) | static gboolean janus_ice_outgoing_stats_handle(gpointer user_data) {
  function gboolean (line 4535) | static gboolean janus_ice_outgoing_traffic_handle(janus_ice_handle *hand...
  function janus_ice_queue_packet (line 5080) | static void janus_ice_queue_packet(janus_ice_handle *handle, janus_ice_q...
  function janus_ice_relay_rtp (line 5091) | void janus_ice_relay_rtp(janus_ice_handle *handle, janus_plugin_rtp *pac...
  function janus_ice_relay_rtcp_internal (line 5113) | void janus_ice_relay_rtcp_internal(janus_ice_handle *handle, janus_ice_p...
  function janus_ice_relay_rtcp (line 5163) | void janus_ice_relay_rtcp(janus_ice_handle *handle, janus_plugin_rtcp *p...
  function janus_ice_send_pli (line 5167) | void janus_ice_send_pli(janus_ice_handle *handle) {
  function janus_ice_send_pli_stream (line 5181) | void janus_ice_send_pli_stream(janus_ice_handle *handle, int mindex) {
  function janus_ice_send_remb (line 5190) | void janus_ice_send_remb(janus_ice_handle *handle, uint32_t bitrate) {
  function janus_ice_relay_data (line 5199) | void janus_ice_relay_data(janus_ice_handle *handle, janus_plugin_data *p...
  function janus_ice_relay_sctp (line 5220) | void janus_ice_relay_sctp(janus_ice_handle *handle, char *buffer, int le...
  function janus_ice_notify_data_ready (line 5248) | void janus_ice_notify_data_ready(janus_ice_handle *handle) {
  function janus_ice_notify_media_stopped (line 5262) | void janus_ice_notify_media_stopped(janus_ice_handle *handle) {
  function janus_ice_dtls_handshake_done (line 5274) | void janus_ice_dtls_handshake_done(janus_ice_handle *handle) {

FILE: src/ice.h
  type janus_ice_handle (line 248) | typedef struct janus_ice_handle janus_ice_handle;
  type janus_ice_peerconnection (line 250) | typedef struct janus_ice_peerconnection janus_ice_peerconnection;
  type janus_ice_peerconnection_medium (line 252) | typedef struct janus_ice_peerconnection_medium janus_ice_peerconnection_...
  type janus_ice_trickle (line 254) | typedef struct janus_ice_trickle janus_ice_trickle;
  type janus_media_type (line 280) | typedef enum janus_media_type {
  type janus_ice_stats_info (line 293) | typedef struct janus_ice_stats_info {
  type janus_ice_stats (line 310) | typedef struct janus_ice_stats {
  type janus_seq_info (line 330) | typedef struct janus_seq_info {
  type janus_ice_handle (line 347) | struct janus_ice_handle {
  type janus_ice_peerconnection (line 427) | struct janus_ice_peerconnection {
  type janus_ice_peerconnection_medium (line 541) | struct janus_ice_peerconnection_medium {
  type janus_ice_trickle (line 641) | struct janus_ice_trickle {

FILE: src/ip-utils.c
  function janus_ip_compare_byte_arrays (line 27) | static int janus_ip_compare_byte_arrays(const uint8_t *b1, const uint8_t...
  function janus_ip_iface_matches_name (line 37) | static int janus_ip_iface_matches_name(const struct ifaddrs *ifa, const ...
  function janus_ip_iface_matches_ipv4 (line 42) | static int janus_ip_iface_matches_ipv4(const struct ifaddrs *ifa, const ...
  function janus_ip_iface_matches_ipv6 (line 52) | static int janus_ip_iface_matches_ipv6(const struct ifaddrs *ifa, const ...
  function janus_ip_iface_matches (line 62) | static int janus_ip_iface_matches(const struct ifaddrs *ifa, const janus...
  type ifaddrs (line 73) | struct ifaddrs
  type ifaddrs (line 73) | struct ifaddrs
  function janus_network_prepare_device_query (line 83) | int janus_network_prepare_device_query(const char *user_value, const jan...
  function janus_network_prepare_device_query_default (line 106) | int janus_network_prepare_device_query_default(const char *user_value, j...
  function janus_ip_copy_ipv4 (line 110) | static int janus_ip_copy_ipv4(const struct sockaddr_in *iface, struct in...
  function janus_network_get_devices_ipv4 (line 115) | int janus_network_get_devices_ipv4(const struct ifaddrs *ifa, const janu...
  function janus_ip_copy_ipv6 (line 123) | static int janus_ip_copy_ipv6(const struct sockaddr_in6 *iface, struct i...
  function janus_network_get_devices_ipv6 (line 133) | int janus_network_get_devices_ipv6(const struct ifaddrs *ifa, const janu...
  function janus_network_get_device_address (line 141) | int janus_network_get_device_address(const struct ifaddrs *ifa, janus_ne...
  function janus_network_address_nullify (line 158) | void janus_network_address_nullify(janus_network_address *a) {
  function janus_network_address_is_null (line 165) | int janus_network_address_is_null(const janus_network_address *a) {
  function janus_network_address_from_sockaddr (line 169) | int janus_network_address_from_sockaddr(struct sockaddr *s, janus_networ...
  function janus_network_address_to_string_buffer (line 186) | int janus_network_address_to_string_buffer(const janus_network_address *...
  function janus_network_address_string_buffer_nullify (line 200) | void janus_network_address_string_buffer_nullify(janus_network_address_s...
  function janus_network_address_string_buffer_is_null (line 207) | int janus_network_address_string_buffer_is_null(const janus_network_addr...
  function janus_network_string_is_valid_address (line 219) | int janus_network_string_is_valid_address(janus_network_query_options ad...
  function janus_network_string_to_address (line 224) | int janus_network_string_to_address(janus_network_query_options addr_typ...
  function janus_network_lookup_interface (line 241) | int janus_network_lookup_interface(const struct ifaddrs *ifas, const cha...
  function janus_network_detect_local_ip (line 271) | int janus_network_detect_local_ip(janus_network_query_options addr_type,...
  function janus_network_resolve_address (line 334) | int janus_network_resolve_address(const char *host, struct sockaddr_stor...

FILE: src/ip-utils.h
  type janus_network_query_options (line 27) | typedef enum janus_network_query_options {
  type janus_network_query_config (line 39) | typedef struct janus_network_query_config {
  type janus_network_address (line 53) | typedef struct janus_network_address {
  type janus_network_address_string_buffer (line 71) | typedef struct janus_network_address_string_buffer {
  type ifaddrs (line 114) | struct ifaddrs
  type ifaddrs (line 114) | struct ifaddrs
  type ifaddrs (line 125) | struct ifaddrs
  type in_addr (line 125) | struct in_addr
  type ifaddrs (line 136) | struct ifaddrs
  type in6_addr (line 136) | struct in6_addr
  type ifaddrs (line 143) | struct ifaddrs
  type sockaddr (line 166) | struct sockaddr
  type ifaddrs (line 229) | struct ifaddrs
  type sockaddr_storage (line 261) | struct sockaddr_storage

FILE: src/janus-cfgconv.c
  function main (line 41) | int main(int argc, char *argv[])

FILE: src/janus.c
  type janus_json_parameter (line 98) | struct janus_json_parameter
  type janus_json_parameter (line 103) | struct janus_json_parameter
  type janus_json_parameter (line 108) | struct janus_json_parameter
  type janus_json_parameter (line 111) | struct janus_json_parameter
  type janus_json_parameter (line 119) | struct janus_json_parameter
  type janus_json_parameter (line 123) | struct janus_json_parameter
  type janus_json_parameter (line 126) | struct janus_json_parameter
  type janus_json_parameter (line 130) | struct janus_json_parameter
  type janus_json_parameter (line 133) | struct janus_json_parameter
  type janus_json_parameter (line 136) | struct janus_json_parameter
  type janus_json_parameter (line 139) | struct janus_json_parameter
  type janus_json_parameter (line 142) | struct janus_json_parameter
  type janus_json_parameter (line 145) | struct janus_json_parameter
  type janus_json_parameter (line 148) | struct janus_json_parameter
  type janus_json_parameter (line 151) | struct janus_json_parameter
  type janus_json_parameter (line 154) | struct janus_json_parameter
  type janus_json_parameter (line 157) | struct janus_json_parameter
  type janus_json_parameter (line 160) | struct janus_json_parameter
  type janus_json_parameter (line 163) | struct janus_json_parameter
  type janus_json_parameter (line 167) | struct janus_json_parameter
  type janus_json_parameter (line 171) | struct janus_json_parameter
  type janus_json_parameter (line 175) | struct janus_json_parameter
  type janus_json_parameter (line 179) | struct janus_json_parameter
  type janus_json_parameter (line 183) | struct janus_json_parameter
  type janus_json_parameter (line 187) | struct janus_json_parameter
  type janus_json_parameter (line 192) | struct janus_json_parameter
  type janus_json_parameter (line 195) | struct janus_json_parameter
  type janus_json_parameter (line 198) | struct janus_json_parameter
  function gchar (line 211) | gchar *janus_get_local_ip(void) {
  function guint (line 217) | guint janus_get_public_ip_count(void) {
  function gchar (line 220) | gchar *janus_get_public_ip(guint index) {
  function janus_add_public_ip (line 230) | void janus_add_public_ip(const gchar *ip) {
  function gboolean (line 249) | gboolean janus_has_public_ipv4_ip(void) {
  function gboolean (line 252) | gboolean janus_has_public_ipv6_ip(void) {
  function gint (line 258) | gint janus_is_stopping(void) {
  function json_t (line 267) | static json_t *janus_create_message(const char *status, uint64_t session...
  function gboolean (line 320) | gboolean janus_is_webrtc_encryption_enabled(void) {
  function json_t (line 325) | static json_t *janus_info(const char *transaction) {
  function janus_handle_signal (line 522) | static void janus_handle_signal(int signum) {
  function janus_termination_handler (line 551) | static void janus_termination_handler(void) {
  function janus_ice_handle_dereference (line 659) | static void janus_ice_handle_dereference(janus_ice_handle *handle) {
  function janus_session_free (line 664) | static void janus_session_free(const janus_refcount *session_ref) {
  function janus_request (line 679) | static janus_request *janus_session_get_request(janus_session *session) {
  function janus_request_unref (line 692) | static void janus_request_unref(janus_request *request) {
  function gboolean (line 697) | static gboolean janus_check_sessions(gpointer user_data) {
  function gpointer (line 743) | static gpointer janus_sessions_watchdog(gpointer user_data) {
  function gboolean (line 762) | static gboolean janus_status_sessions(gpointer user_data) {
  function janus_session (line 777) | janus_session *janus_session_create(guint64 session_id) {
  function janus_session (line 809) | janus_session *janus_session_find(guint64 session_id) {
  function janus_session_notify_event (line 821) | void janus_session_notify_event(janus_session *session, json_t *event) {
  function gint (line 841) | gint janus_session_destroy(janus_session *session) {
  function janus_ice_handle (line 853) | janus_ice_handle *janus_session_handles_find(janus_session *session, gui...
  function janus_session_handles_insert (line 867) | void janus_session_handles_insert(janus_session *session, janus_ice_hand...
  function gint (line 877) | gint janus_session_handles_remove(janus_session *session, janus_ice_hand...
  function janus_session_handles_clear (line 886) | void janus_session_handles_clear(janus_session *session) {
  function json_t (line 905) | json_t *janus_session_handles_list_json(janus_session *session) {
  function janus_request_free (line 924) | static void janus_request_free(const janus_refcount *request_ref) {
  function janus_request (line 943) | janus_request *janus_request_new(janus_transport *transport, janus_trans...
  function janus_request_destroy (line 962) | void janus_request_destroy(janus_request *request) {
  function janus_request_check_secret (line 968) | static int janus_request_check_secret(janus_request *request, guint64 se...
  function janus_request_ice_handle_answer (line 997) | static void janus_request_ice_handle_answer(janus_ice_handle *handle, ch...
  function janus_process_incoming_request (line 1059) | int janus_process_incoming_request(janus_request *request) {
  function json_t (line 2005) | static json_t *janus_json_token_plugin_array(const char *token_value) {
  function json_t (line 2022) | static json_t *janus_json_list_token_plugins(const char *token_value, co...
  function janus_request_allow_token (line 2032) | static int janus_request_allow_token(janus_request *request, guint64 ses...
  function janus_process_incoming_admin_request (line 2141) | int janus_process_incoming_admin_request(janus_request *request) {
  function janus_process_success (line 3137) | int janus_process_success(janus_request *request, json_t *payload)
  function janus_process_error_string (line 3146) | static int janus_process_error_string(janus_request *request, uint64_t s...
  function janus_process_error (line 3162) | int janus_process_error(janus_request *request, uint64_t session_id, con...
  function json_t (line 3183) | json_t *janus_admin_peerconnection_summary(janus_ice_peerconnection *pc) {
  function json_t (line 3302) | json_t *janus_admin_peerconnection_medium_summary(janus_ice_peerconnecti...
  function janus_transport_close (line 3458) | void janus_transport_close(gpointer key, gpointer value, gpointer user_d...
  function janus_transportso_close (line 3465) | void janus_transportso_close(gpointer key, gpointer value, gpointer user...
  function janus_transport_incoming_request (line 3474) | void janus_transport_incoming_request(janus_transport *plugin, janus_tra...
  function janus_transport_gone (line 3482) | void janus_transport_gone(janus_transport *plugin, janus_transport_sessi...
  function gboolean (line 3516) | gboolean janus_transport_is_api_secret_needed(janus_transport *plugin) {
  function gboolean (line 3520) | gboolean janus_transport_is_api_secret_valid(janus_transport *plugin, co...
  function gboolean (line 3526) | gboolean janus_transport_is_auth_token_needed(janus_transport *plugin) {
  function gboolean (line 3530) | gboolean janus_transport_is_auth_token_valid(janus_transport *plugin, co...
  function janus_transport_notify_event (line 3536) | void janus_transport_notify_event(janus_transport *plugin, void *transpo...
  function janus_transport_task (line 3549) | void janus_transport_task(gpointer data, gpointer user_data) {
  function janus_eventhandler_close (line 3611) | void janus_eventhandler_close(gpointer key, gpointer value, gpointer use...
  function janus_eventhandlerso_close (line 3618) | void janus_eventhandlerso_close(gpointer key, gpointer value, gpointer u...
  function janus_logger_close (line 3627) | void janus_logger_close(gpointer key, gpointer value, gpointer user_data) {
  function janus_loggerso_close (line 3634) | void janus_loggerso_close(gpointer key, gpointer value, gpointer user_da...
  function janus_plugin_close (line 3643) | void janus_plugin_close(gpointer key, gpointer value, gpointer user_data) {
  function janus_pluginso_close (line 3650) | void janus_pluginso_close(gpointer key, gpointer value, gpointer user_da...
  function janus_plugin (line 3658) | janus_plugin *janus_plugin_find(const gchar *package) {
  function janus_plugin_push_event (line 3666) | int janus_plugin_push_event(janus_plugin_session *plugin_session, janus_...
  function json_t (line 3755) | json_t *janus_plugin_handle_sdp(janus_plugin_session *plugin_session, ja...
  function janus_plugin_relay_rtp (line 4229) | void janus_plugin_relay_rtp(janus_plugin_session *plugin_session, janus_...
  function janus_plugin_relay_rtcp (line 4240) | void janus_plugin_relay_rtcp(janus_plugin_session *plugin_session, janus...
  function janus_plugin_relay_data (line 4251) | void janus_plugin_relay_data(janus_plugin_session *plugin_session, janus...
  function janus_plugin_send_pli (line 4266) | void janus_plugin_send_pli(janus_plugin_session *plugin_session) {
  function janus_plugin_send_pli_stream (line 4276) | void janus_plugin_send_pli_stream(janus_plugin_session *plugin_session, ...
  function janus_plugin_send_remb (line 4286) | void janus_plugin_send_remb(janus_plugin_session *plugin_session, uint32...
  function gboolean (line 4296) | static gboolean janus_plugin_close_pc_internal(gpointer user_data) {
  function janus_plugin_close_pc (line 4320) | void janus_plugin_close_pc(janus_plugin_session *plugin_session) {
  function gboolean (line 4334) | static gboolean janus_plugin_end_session_internal(gpointer user_data) {
  function janus_plugin_end_session (line 4362) | void janus_plugin_end_session(janus_plugin_session *plugin_session) {
  function janus_plugin_notify_event (line 4373) | void janus_plugin_notify_event(janus_plugin *plugin, janus_plugin_sessio...
  function gboolean (line 4407) | gboolean janus_plugin_auth_is_signed(void) {
  function gboolean (line 4411) | gboolean janus_plugin_auth_is_signature_valid(janus_plugin *plugin, cons...
  function gboolean (line 4415) | gboolean janus_plugin_auth_signature_contains(janus_plugin *plugin, cons...
  function gint (line 4421) | gint main(int argc, char *argv[]) {

FILE: src/janus.h
  type janus_request (line 41) | typedef struct janus_request janus_request;
  type janus_session (line 44) | typedef struct janus_session {
  type janus_request (line 119) | struct janus_request {

FILE: src/log.c
  type janus_log_buffer (line 26) | typedef struct janus_log_buffer {
  function janus_log_buffer_free (line 32) | static void janus_log_buffer_free(janus_log_buffer *b) {
  function gboolean (line 51) | gboolean janus_log_is_stdout_enabled(void) {
  function gboolean (line 55) | gboolean janus_log_is_logfile_enabled(void) {
  function janus_log_print_buffer (line 63) | static void janus_log_print_buffer(janus_log_buffer *b) {
  function janus_vprintf (line 140) | void janus_vprintf(const char *format, ...) {
  function janus_log_init (line 160) | int janus_log_init(gboolean daemon, gboolean console, const char *logfil...
  function janus_log_reload (line 211) | void janus_log_reload(void) {
  function janus_log_destroy (line 217) | void janus_log_destroy(void) {

FILE: src/loggers/janus_jsonlog.c
  function janus_logger (line 65) | janus_logger *create(void) {
  type janus_jsonlog_line (line 83) | typedef struct janus_jsonlog_line {
  function janus_jsonlog_line_free (line 88) | static void janus_jsonlog_line_free(janus_jsonlog_line *jline) {
  type janus_json_parameter (line 101) | struct janus_json_parameter
  function janus_jsonlog_init (line 112) | int janus_jsonlog_init(const char *server_name, const char *config_path) {
  function janus_jsonlog_destroy (line 206) | void janus_jsonlog_destroy(void) {
  function janus_jsonlog_get_api_compatibility (line 231) | int janus_jsonlog_get_api_compatibility(void) {
  function janus_jsonlog_get_version (line 236) | int janus_jsonlog_get_version(void) {
  function janus_jsonlog_incoming_logline (line 260) | void janus_jsonlog_incoming_logline(int64_t timestamp, const char *line) {
  function json_t (line 280) | json_t *janus_jsonlog_handle_request(json_t *request) {

FILE: src/loggers/logger.h
  type janus_logger (line 119) | typedef struct janus_logger janus_logger;
  type janus_logger (line 123) | struct janus_logger {
  type janus_logger (line 176) | typedef janus_logger* create_l(void);

FILE: src/mach_gettime.h
  type clockid_t (line 20) | typedef int clockid_t;
  type timespec (line 27) | struct timespec
  function clock_gettime (line 39) | int clock_gettime(clockid_t clk_id, struct timespec *tp)

FILE: src/mutex.h
  type pthread_mutex_t (line 23) | typedef pthread_mutex_t janus_mutex;
  type pthread_cond_t (line 50) | typedef pthread_cond_t janus_condition;
  type GMutex (line 73) | typedef GMutex janus_mutex;
  type GCond (line 100) | typedef GCond janus_condition;

FILE: src/options.c
  function gboolean (line 16) | gboolean janus_options_parse(janus_options *options, int argc, char *arg...
  function janus_options_destroy (line 80) | void janus_options_destroy(void) {

FILE: src/options.h
  type janus_options (line 17) | typedef struct janus_options {

FILE: src/plugins/audiobridge-deps/arch.h
  type spx_int16_t (line 83) | typedef spx_int16_t spx_word16_t;
  type spx_int32_t (line 84) | typedef spx_int32_t spx_word32_t;
  type spx_word32_t (line 85) | typedef spx_word32_t spx_mem_t;
  type spx_word16_t (line 86) | typedef spx_word16_t spx_coef_t;
  type spx_word16_t (line 87) | typedef spx_word16_t spx_lsp_t;
  type spx_word32_t (line 88) | typedef spx_word32_t spx_sig_t;
  type spx_mem_t (line 131) | typedef float spx_mem_t;
  type spx_coef_t (line 132) | typedef float spx_coef_t;
  type spx_lsp_t (line 133) | typedef float spx_lsp_t;
  type spx_sig_t (line 134) | typedef float spx_sig_t;
  type spx_word16_t (line 135) | typedef float spx_word16_t;
  type spx_word32_t (line 136) | typedef float spx_word32_t;

FILE: src/plugins/audiobridge-deps/jitter.c
  type TimingBuffer (line 81) | struct TimingBuffer {
  function tb_init (line 88) | static void tb_init(struct TimingBuffer *tb)
  function tb_add (line 95) | static void tb_add(struct TimingBuffer *tb, spx_int16_t timing)
  type JitterBuffer_ (line 136) | struct JitterBuffer_ {
  function spx_int16_t (line 174) | static spx_int16_t compute_opt_delay(JitterBuffer *jitter)
  function EXPORT (line 271) | EXPORT JitterBuffer *jitter_buffer_init(int step_size)
  function EXPORT (line 297) | EXPORT void jitter_buffer_reset(JitterBuffer *jitter)
  function EXPORT (line 328) | EXPORT void jitter_buffer_destroy(JitterBuffer *jitter)
  function update_timings (line 335) | static void update_timings(JitterBuffer *jitter, spx_int32_t timing)
  function shift_timings (line 356) | static void shift_timings(JitterBuffer *jitter, spx_int16_t amount)
  function EXPORT (line 368) | EXPORT void jitter_buffer_put(JitterBuffer *jitter, const JitterBufferPa...
  function EXPORT (line 472) | EXPORT int jitter_buffer_get(JitterBuffer *jitter, JitterBufferPacket *p...
  function EXPORT (line 684) | EXPORT int jitter_buffer_get_another(JitterBuffer *jitter, JitterBufferP...
  function _jitter_buffer_update_delay (line 720) | static int _jitter_buffer_update_delay(JitterBuffer *jitter, JitterBuffe...
  function EXPORT (line 743) | EXPORT int jitter_buffer_update_delay(JitterBuffer *jitter, JitterBuffer...
  function EXPORT (line 753) | EXPORT int jitter_buffer_get_pointer_timestamp(JitterBuffer *jitter)
  function EXPORT (line 758) | EXPORT void jitter_buffer_tick(JitterBuffer *jitter)
  function EXPORT (line 774) | EXPORT void jitter_buffer_remaining_span(JitterBuffer *jitter, spx_uint3...
  function EXPORT (line 787) | EXPORT int jitter_buffer_ctl(JitterBuffer *jitter, int request, void *ptr)

FILE: src/plugins/audiobridge-deps/os_support.h
  function speex_free (line 79) | static inline void speex_free (void *ptr)
  function speex_free_scratch (line 87) | static inline void speex_free_scratch (void *ptr)
  function _speex_fatal (line 111) | static inline void _speex_fatal(const char *str, const char *file, int l...
  function speex_warning (line 119) | static inline void speex_warning(const char *str)
  function speex_warning_int (line 128) | static inline void speex_warning_int(const char *str, int val)
  function speex_notify (line 137) | static inline void speex_notify(const char *str)
  function _speex_putc (line 147) | static inline void _speex_putc(int ch, void *file)
  function print_vec (line 158) | static inline void print_vec(float *vec, int len, char *name)

FILE: src/plugins/audiobridge-deps/resample.c
  function speex_free (line 68) | static void speex_free(void *ptr) {free(ptr);}
  type SpeexResamplerState_ (line 116) | struct SpeexResamplerState_ {
  type FuncDef (line 194) | struct FuncDef {
  type FuncDef (line 199) | struct FuncDef
  type FuncDef (line 201) | struct FuncDef
  type FuncDef (line 203) | struct FuncDef
  type FuncDef (line 205) | struct FuncDef
  type QualityMapping (line 208) | struct QualityMapping {
  type QualityMapping (line 226) | struct QualityMapping
  function compute_func (line 240) | static double compute_func(float x, const struct FuncDef *func)
  function main (line 262) | int main(int argc, char **argv)
  function spx_word16_t (line 275) | static spx_word16_t sinc(float cutoff, float x, int N, const struct Func...
  function spx_word16_t (line 288) | static spx_word16_t sinc(float cutoff, float x, int N, const struct Func...
  function cubic_coef (line 302) | static void cubic_coef(spx_word16_t x, spx_word16_t interp[4])
  function cubic_coef (line 318) | static void cubic_coef(spx_word16_t frac, spx_word16_t interp[4])
  function resampler_basic_direct_single (line 331) | static int resampler_basic_direct_single(SpeexResamplerState *st, spx_ui...
  function resampler_basic_direct_double (line 389) | static int resampler_basic_direct_double(SpeexResamplerState *st, spx_ui...
  function resampler_basic_interpolate_single (line 438) | static int resampler_basic_interpolate_single(SpeexResamplerState *st, s...
  function resampler_basic_interpolate_double (line 501) | static int resampler_basic_interpolate_double(SpeexResamplerState *st, s...
  function resampler_basic_zero (line 565) | static int resampler_basic_zero(SpeexResamplerState *st, spx_uint32_t ch...
  function multiply_frac (line 593) | static int multiply_frac(spx_uint32_t *result, spx_uint32_t value, spx_u...
  function update_filter (line 605) | static int update_filter(SpeexResamplerState *st)
  function EXPORT (line 794) | EXPORT SpeexResamplerState *speex_resampler_init(spx_uint32_t nb_channel...
  function EXPORT (line 799) | EXPORT SpeexResamplerState *speex_resampler_init_frac(spx_uint32_t nb_ch...
  function EXPORT (line 868) | EXPORT void speex_resampler_destroy(SpeexResamplerState *st)
  function speex_resampler_process_native (line 878) | static int speex_resampler_process_native(SpeexResamplerState *st, spx_u...
  function speex_resampler_magic (line 904) | static int speex_resampler_magic(SpeexResamplerState *st, spx_uint32_t c...
  function EXPORT (line 925) | EXPORT int speex_resampler_process_int(SpeexResamplerState *st, spx_uint...
  function EXPORT (line 966) | EXPORT int speex_resampler_process_float(SpeexResamplerState *st, spx_ui...
  function EXPORT (line 1038) | EXPORT int speex_resampler_process_interleaved_float(SpeexResamplerState...
  function EXPORT (line 1061) | EXPORT int speex_resampler_process_interleaved_int(SpeexResamplerState *...
  function EXPORT (line 1084) | EXPORT int speex_resampler_set_rate(SpeexResamplerState *st, spx_uint32_...
  function EXPORT (line 1089) | EXPORT void speex_resampler_get_rate(SpeexResamplerState *st, spx_uint32...
  function spx_uint32_t (line 1095) | static inline spx_uint32_t compute_gcd(spx_uint32_t a, spx_uint32_t b)
  function EXPORT (line 1107) | EXPORT int speex_resampler_set_rate_frac(SpeexResamplerState *st, spx_ui...
  function EXPORT (line 1147) | EXPORT void speex_resampler_get_ratio(SpeexResamplerState *st, spx_uint3...
  function EXPORT (line 1153) | EXPORT int speex_resampler_set_quality(SpeexResamplerState *st, int qual...
  function EXPORT (line 1165) | EXPORT void speex_resampler_get_quality(SpeexResamplerState *st, int *qu...
  function EXPORT (line 1170) | EXPORT void speex_resampler_set_input_stride(SpeexResamplerState *st, sp...
  function EXPORT (line 1175) | EXPORT void speex_resampler_get_input_stride(SpeexResamplerState *st, sp...
  function EXPORT (line 1180) | EXPORT void speex_resampler_set_output_stride(SpeexResamplerState *st, s...
  function EXPORT (line 1185) | EXPORT void speex_resampler_get_output_stride(SpeexResamplerState *st, s...
  function EXPORT (line 1190) | EXPORT int speex_resampler_get_input_latency(SpeexResamplerState *st)
  function EXPORT (line 1195) | EXPORT int speex_resampler_get_output_latency(SpeexResamplerState *st)
  function EXPORT (line 1200) | EXPORT int speex_resampler_skip_zeros(SpeexResamplerState *st)
  function EXPORT (line 1208) | EXPORT int speex_resampler_reset_mem(SpeexResamplerState *st)
  function EXPORT (line 1222) | EXPORT const char *speex_resampler_strerror(int err)

FILE: src/plugins/audiobridge-deps/speex/speex_jitter.h
  type JitterBuffer_ (line 51) | struct JitterBuffer_
  type JitterBuffer (line 54) | typedef struct JitterBuffer_ JitterBuffer;
  type JitterBufferPacket (line 57) | typedef struct _JitterBufferPacket JitterBufferPacket;
  type _JitterBufferPacket (line 60) | struct _JitterBufferPacket {

FILE: src/plugins/audiobridge-deps/speex/speex_resampler.h
  type SpeexResamplerState_ (line 114) | struct SpeexResamplerState_
  type SpeexResamplerState (line 115) | typedef struct SpeexResamplerState_ SpeexResamplerState;

FILE: src/plugins/audiobridge-deps/speex/speexdsp_config_types.h
  type spx_int16_t (line 6) | typedef int16_t spx_int16_t;
  type spx_uint16_t (line 7) | typedef uint16_t spx_uint16_t;
  type spx_int32_t (line 8) | typedef int32_t spx_int32_t;
  type spx_uint32_t (line 9) | typedef uint32_t spx_uint32_t;

FILE: src/plugins/audiobridge-deps/speex/speexdsp_types.h
  type _G_int32_t (line 29) | typedef _G_int32_t spx_int32_t;
  type _G_uint32_t (line 30) | typedef _G_uint32_t spx_uint32_t;
  type _G_int16_t (line 31) | typedef _G_int16_t spx_int16_t;
  type _G_uint16_t (line 32) | typedef _G_uint16_t spx_uint16_t;
  type spx_int16_t (line 34) | typedef short spx_int16_t;
  type spx_uint16_t (line 35) | typedef unsigned short spx_uint16_t;
  type spx_int32_t (line 36) | typedef int spx_int32_t;
  type spx_uint32_t (line 37) | typedef unsigned int spx_uint32_t;
  type spx_int32_t (line 39) | typedef int spx_int32_t;
  type spx_uint32_t (line 40) | typedef unsigned int spx_uint32_t;
  type spx_int16_t (line 41) | typedef short spx_int16_t;
  type spx_uint16_t (line 42) | typedef unsigned short spx_uint16_t;
  type __int32 (line 45) | typedef __int32 spx_int32_t;
  type spx_uint32_t (line 46) | typedef unsigned __int32 spx_uint32_t;
  type __int16 (line 47) | typedef __int16 spx_int16_t;
  type spx_uint16_t (line 48) | typedef unsigned __int16 spx_uint16_t;
  type SInt16 (line 54) | typedef SInt16 spx_int16_t;
  type UInt16 (line 55) | typedef UInt16 spx_uint16_t;
  type SInt32 (line 56) | typedef SInt32 spx_int32_t;
  type UInt32 (line 57) | typedef UInt32 spx_uint32_t;
  type spx_int16_t (line 62) | typedef int16_t spx_int16_t;
  type u_int16_t (line 63) | typedef u_int16_t spx_uint16_t;
  type spx_int32_t (line 64) | typedef int32_t spx_int32_t;
  type u_int32_t (line 65) | typedef u_int32_t spx_uint32_t;
  type spx_int16_t (line 71) | typedef int16_t spx_int16_t;
  type u_int16_t (line 72) | typedef u_int16_t spx_uint16_t;
  type spx_int32_t (line 73) | typedef int32_t spx_int32_t;
  type u_int32_t (line 74) | typedef u_int32_t spx_uint32_t;
  type spx_int16_t (line 79) | typedef short spx_int16_t;
  type spx_uint16_t (line 80) | typedef unsigned short spx_uint16_t;
  type spx_int32_t (line 81) | typedef int spx_int32_t;
  type spx_uint32_t (line 82) | typedef unsigned int spx_uint32_t;
  type spx_int16_t (line 87) | typedef short spx_int16_t;
  type spx_int32_t (line 88) | typedef int spx_int32_t;
  type spx_uint32_t (line 89) | typedef unsigned int spx_uint32_t;
  type spx_int32_t (line 94) | typedef int spx_int32_t;
  type spx_uint32_t (line 95) | typedef unsigned spx_uint32_t;
  type spx_int16_t (line 96) | typedef short spx_int16_t;
  type spx_int16_t (line 101) | typedef signed short spx_int16_t;
  type spx_uint16_t (line 102) | typedef unsigned short spx_uint16_t;
  type spx_int32_t (line 103) | typedef signed int spx_int32_t;
  type spx_uint32_t (line 104) | typedef unsigned int spx_uint32_t;
  type spx_int16_t (line 108) | typedef short spx_int16_t;
  type spx_uint16_t (line 109) | typedef unsigned short spx_uint16_t;
  type spx_int32_t (line 110) | typedef long spx_int32_t;
  type spx_uint32_t (line 111) | typedef unsigned long spx_uint32_t;
  type spx_int16_t (line 115) | typedef short spx_int16_t;
  type spx_uint16_t (line 116) | typedef unsigned short spx_uint16_t;
  type spx_int32_t (line 117) | typedef int spx_int32_t;
  type spx_uint32_t (line 118) | typedef unsigned int spx_uint32_t;

FILE: src/plugins/duktape-deps/duk_console.c
  function duk_ret_t (line 24) | static duk_ret_t duk__console_log_helper(duk_context *ctx, int level, co...
  function duk_ret_t (line 61) | static duk_ret_t duk__console_assert(duk_context *ctx) {
  function duk_ret_t (line 70) | static duk_ret_t duk__console_log(duk_context *ctx) {
  function duk_ret_t (line 74) | static duk_ret_t duk__console_trace(duk_context *ctx) {
  function duk_ret_t (line 78) | static duk_ret_t duk__console_info(duk_context *ctx) {
  function duk_ret_t (line 82) | static duk_ret_t duk__console_warn(duk_context *ctx) {
  function duk_ret_t (line 86) | static duk_ret_t duk__console_error(duk_context *ctx) {
  function duk_ret_t (line 90) | static duk_ret_t duk__console_dir(duk_context *ctx) {
  function duk__console_reg_vararg_func (line 95) | static void duk__console_reg_vararg_func(duk_context *ctx, duk_c_functio...
  function duk_console_init (line 104) | void duk_console_init(duk_context *ctx, duk_uint_t flags) {

FILE: src/plugins/duktape-deps/duk_module_duktape.c
  function duk__resolve_module_id (line 31) | static void duk__resolve_module_id(duk_context *ctx, const char *req_id,...
  function duk_ret_t (line 199) | static duk_ret_t duk__require(duk_context *ctx) {
  function duk_module_duktape_init (line 439) | void duk_module_duktape_init(duk_context *ctx) {

FILE: src/plugins/duktape/echotest.js
  function getVersion (line 50) | function getVersion() {
  function getVersionString (line 53) | function getVersionString() {
  function getDescription (line 56) | function getDescription() {
  function getName (line 59) | function getName() {
  function getAuthor (line 62) | function getAuthor() {
  function getPackage (line 65) | function getPackage() {
  function init (line 70) | function init(config) {
  function destroy (line 83) | function destroy() {
  function createSession (line 88) | function createSession(id) {
  function destroySession (line 101) | function destroySession(id) {
  function querySession (line 108) | function querySession(id) {
  function handleMessage (line 118) | function handleMessage(id, tr, msg, jsep) {
  function handleAdminMessage (line 149) | function handleAdminMessage(message) {
  function setupMedia (line 156) | function setupMedia(id) {
  function hangupMedia (line 163) | function hangupMedia(id) {
  function incomingTextData (line 176) | function incomingTextData(id, buf, len, label, protocol) {
  function incomingBinaryData (line 183) | function incomingBinaryData(id, buf, len, label, protocol) {
  function dataReady (line 188) | function dataReady(id) {
  function substreamChanged (line 196) | function substreamChanged(id, substream) {
  function temporalLayerChanged (line 206) | function temporalLayerChanged(id, temporal) {
  function resumeScheduler (line 216) | function resumeScheduler() {
  function processRequest (line 232) | function processRequest(id, msg) {
  function processAsync (line 296) | function processAsync(task) {

FILE: src/plugins/janus_audiobridge.c
  type janus_plugin_result (line 1269) | struct janus_plugin_result
  function janus_plugin (line 1304) | janus_plugin *create(void) {
  type janus_json_parameter (line 1310) | struct janus_json_parameter
  type janus_json_parameter (line 1313) | struct janus_json_parameter
  type janus_json_parameter (line 1316) | struct janus_json_parameter
  type janus_json_parameter (line 1319) | struct janus_json_parameter
  type janus_json_parameter (line 1322) | struct janus_json_parameter
  type janus_json_parameter (line 1325) | struct janus_json_parameter
  type janus_json_parameter (line 1328) | struct janus_json_parameter
  type janus_json_parameter (line 1331) | struct janus_json_parameter
  type janus_json_parameter (line 1334) | struct janus_json_parameter
  type janus_json_parameter (line 1337) | struct janus_json_parameter
  type janus_json_parameter (line 1340) | struct janus_json_parameter
  type janus_json_parameter (line 1343) | struct janus_json_parameter
  type janus_json_parameter (line 1368) | struct janus_json_parameter
  type janus_json_parameter (line 1378) | struct janus_json_parameter
  type janus_json_parameter (line 1381) | struct janus_json_parameter
  type janus_json_parameter (line 1386) | struct janus_json_parameter
  type janus_json_parameter (line 1389) | struct janus_json_parameter
  type janus_json_parameter (line 1411) | struct janus_json_parameter
  type janus_json_parameter (line 1416) | struct janus_json_parameter
  type janus_json_parameter (line 1420) | struct janus_json_parameter
  type janus_json_parameter (line 1427) | struct janus_json_parameter
  type janus_json_parameter (line 1443) | struct janus_json_parameter
  type janus_json_parameter (line 1455) | struct janus_json_parameter
  type janus_json_parameter (line 1459) | struct janus_json_parameter
  type janus_json_parameter (line 1465) | struct janus_json_parameter
  type janus_json_parameter (line 1469) | struct janus_json_parameter
  type janus_json_parameter (line 1473) | struct janus_json_parameter
  type janus_audiobridge_message (line 1508) | typedef struct janus_audiobridge_message {
  type janus_audiobridge_room (line 1519) | typedef struct janus_audiobridge_room {
  type janus_audiobridge_session (line 1572) | typedef struct janus_audiobridge_session {
  type janus_audiobridge_file (line 1588) | typedef struct janus_audiobridge_file {
  function janus_audiobridge_file_init (line 1601) | static int janus_audiobridge_file_init(janus_audiobridge_file *ctx) {
  function gboolean (line 1615) | static gboolean janus_audiobridge_ogg_is_opus(ogg_page *page) {
  function janus_audiobridge_file_read (line 1630) | static int janus_audiobridge_file_read(janus_audiobridge_file *ctx, Opus...
  function janus_audiobridge_file_free (line 1724) | static void janus_audiobridge_file_free(janus_audiobridge_file *ctx) {
  type janus_audiobridge_plainrtp_media (line 1739) | typedef struct janus_audiobridge_plainrtp_media {
  type janus_audiobridge_participant (line 1757) | typedef struct janus_audiobridge_participant {
  type janus_audiobridge_rtp_relay_packet (line 1831) | typedef struct janus_audiobridge_rtp_relay_packet {
  type janus_audiobridge_buffer_packet (line 1841) | typedef struct janus_audiobridge_buffer_packet {
  function janus_audiobridge_buffer_packet (line 1847) | static janus_audiobridge_buffer_packet *janus_audiobridge_buffer_packet_...
  function janus_audiobridge_buffer_packet_destroy (line 1853) | static void janus_audiobridge_buffer_packet_destroy(janus_audiobridge_bu...
  function janus_audiobridge_participant_clear_jitter_buffer (line 1865) | static void janus_audiobridge_participant_clear_jitter_buffer(janus_audi...
  function janus_audiobridge_participant_clear_inbuf (line 1871) | static void janus_audiobridge_participant_clear_inbuf(janus_audiobridge_...
  function janus_audiobridge_participant_clear_outbuf (line 1886) | static void janus_audiobridge_participant_clear_outbuf(janus_audiobridge...
  function janus_audiobridge_participant_destroy (line 1896) | static void janus_audiobridge_participant_destroy(janus_audiobridge_part...
  function janus_audiobridge_participant_unref (line 1905) | static void janus_audiobridge_participant_unref(janus_audiobridge_partic...
  function janus_audiobridge_participant_free (line 1912) | static void janus_audiobridge_participant_free(const janus_refcount *par...
  function janus_audiobridge_session_destroy (line 1967) | static void janus_audiobridge_session_destroy(janus_audiobridge_session ...
  function janus_audiobridge_session_free (line 1972) | static void janus_audiobridge_session_free(const janus_refcount *session...
  function janus_audiobridge_room_destroy (line 1983) | static void janus_audiobridge_room_destroy(janus_audiobridge_room *audio...
  function janus_audiobridge_room_free (line 1992) | static void janus_audiobridge_room_free(const janus_refcount *audiobridg...
  function janus_audiobridge_message_free (line 2018) | static void janus_audiobridge_message_free(janus_audiobridge_message *ms...
  type janus_audiobridge_rtp_forwarder_metadata (line 2045) | typedef struct janus_audiobridge_rtp_forwarder_metadata {
  function guint32 (line 2053) | static guint32 janus_audiobridge_rtp_forwarder_add_helper(janus_audiobri...
  type wav_header (line 2085) | typedef struct wav_header {
  function janus_audiobridge_g711_ulaw_encode (line 2155) | static uint8_t janus_audiobridge_g711_ulaw_encode(int16_t sample) {
  function janus_audiobridge_g711_alaw_encode (line 2219) | static uint8_t janus_audiobridge_g711_alaw_encode(int16_t sample) {
  function janus_audiobridge_resample (line 2238) | static int janus_audiobridge_resample(int16_t *input, int input_num, int...
  function janus_audiobridge_create_udp_socket_if_needed (line 2306) | static int janus_audiobridge_create_udp_socket_if_needed(janus_audiobrid...
  function janus_audiobridge_create_opus_encoder_if_needed (line 2329) | static int janus_audiobridge_create_opus_encoder_if_needed(janus_audiobr...
  function janus_audiobridge_create_static_rtp_forwarder (line 2369) | static int janus_audiobridge_create_static_rtp_forwarder(janus_config_ca...
  function janus_audiobridge_init (line 2526) | int janus_audiobridge_init(janus_callbacks *callback, const char *config...
  function janus_audiobridge_destroy (line 2954) | void janus_audiobridge_destroy(void) {
  function janus_audiobridge_get_api_compatibility (line 2985) | int janus_audiobridge_get_api_compatibility(void) {
  function janus_audiobridge_get_version (line 2990) | int janus_audiobridge_get_version(void) {
  function janus_audiobridge_session (line 3014) | static janus_audiobridge_session *janus_audiobridge_lookup_session(janus...
  function janus_audiobridge_create_session (line 3022) | void janus_audiobridge_create_session(janus_plugin_session *handle, int ...
  function janus_audiobridge_destroy_session (line 3042) | void janus_audiobridge_destroy_session(janus_plugin_session *handle, int...
  function janus_audiobridge_notify_participants (line 3063) | static void janus_audiobridge_notify_participants(janus_audiobridge_room...
  function json_t (line 3079) | json_t *janus_audiobridge_query_session(janus_plugin_session *handle) {
  function janus_audiobridge_access_room (line 3166) | static int janus_audiobridge_access_room(json_t *root, gboolean check_mo...
  function json_t (line 3209) | static json_t *janus_audiobridge_process_synchronous_request(janus_audio...
  type janus_plugin_result (line 6116) | struct janus_plugin_result
  function json_t (line 6218) | json_t *janus_audiobridge_handle_admin_message(json_t *message) {
  function janus_audiobridge_setup_media (line 6254) | void janus_audiobridge_setup_media(janus_plugin_session *handle) {
  function janus_audiobridge_incoming_rtp (line 6324) | void janus_audiobridge_incoming_rtp(janus_plugin_session *handle, janus_...
  function janus_audiobridge_incoming_rtcp (line 6381) | void janus_audiobridge_incoming_rtcp(janus_plugin_session *handle, janus...
  function janus_audiobridge_recorder_create (line 6387) | static void janus_audiobridge_recorder_create(janus_audiobridge_particip...
  function janus_audiobridge_recorder_close (line 6420) | static void janus_audiobridge_recorder_close(janus_audiobridge_participa...
  function janus_audiobridge_hangup_media (line 6430) | void janus_audiobridge_hangup_media(janus_plugin_session *handle) {
  function janus_audiobridge_hangup_media_internal (line 6437) | static void janus_audiobridge_hangup_media_internal(janus_plugin_session...
  type sockaddr_storage (line 7068) | struct sockaddr_storage
  type sockaddr_in6 (line 7076) | struct sockaddr_in6
  type sockaddr_in6 (line 7076) | struct sockaddr_in6
  type sockaddr_in (line 7079) | struct sockaddr_in
  type sockaddr_in (line 7079) | struct sockaddr_in
  type sockaddr (line 7084) | struct sockaddr
  type sockaddr_storage (line 7320) | struct sockaddr_storage
  type sockaddr_in6 (line 7328) | struct sockaddr_in6
  type sockaddr_in6 (line 7328) | struct sockaddr_in6
  type sockaddr_in (line 7331) | struct sockaddr_in
  type sockaddr_in (line 7331) | struct sockaddr_in
  type sockaddr (line 7336) | struct sockaddr
  function janus_audiobridge_rec_add_wav_header (line 8344) | static void janus_audiobridge_rec_add_wav_header(janus_audiobridge_room ...
  function janus_audiobridge_update_wav_header (line 8395) | static void janus_audiobridge_update_wav_header(janus_audiobridge_room *...
  type timeval (line 8533) | struct timeval
  function janus_audiobridge_relay_rtp_packet (line 9373) | static void janus_audiobridge_relay_rtp_packet(gpointer data, gpointer u...
  function janus_audiobridge_plainrtp_media_cleanup (line 9417) | static void janus_audiobridge_plainrtp_media_cleanup(janus_audiobridge_p...
  function janus_audiobridge_plainrtp_allocate_port (line 9439) | static int janus_audiobridge_plainrtp_allocate_port(janus_audiobridge_pl...
  type sockaddr_storage (line 9510) | struct sockaddr_storage
  type pollfd (line 9512) | struct pollfd
  type sockaddr (line 9587) | struct sockaddr
  function janus_audiobridge_participant_istalking (line 9628) | static void janus_audiobridge_participant_istalking(janus_audiobridge_se...
  function janus_audiobridge_participant_denoise (line 9695) | static void janus_audiobridge_participant_denoise(janus_audiobridge_part...
  function janus_audiobridge_participant_upsample (line 9825) | static void janus_audiobridge_participant_upsample(janus_audiobridge_par...
  function janus_audiobridge_participant_downsample (line 9838) | static void janus_audiobridge_participant_downsample(janus_audiobridge_p...

FILE: src/plugins/janus_duktape.c
  type janus_plugin_result (line 221) | struct janus_plugin_result
  function janus_plugin (line 262) | janus_plugin *create(void) {
  type janus_duktape_event (line 309) | typedef enum janus_duktape_event {
  type janus_duktape_callback (line 320) | typedef struct janus_duktape_callback {
  function janus_duktape_callback_free (line 328) | static void janus_duktape_callback_free(janus_duktape_callback *cb) {
  function janus_duktape_stackdump (line 339) | static void janus_duktape_stackdump(duk_context *ctx) {
  function janus_duktape_session_destroy (line 348) | static void janus_duktape_session_destroy(janus_duktape_session *session) {
  function janus_duktape_session_free (line 354) | static void janus_duktape_session_free(const janus_refcount *session_ref) {
  type janus_duktape_rtp_relay_packet (line 371) | typedef struct janus_duktape_rtp_relay_packet {
  type janus_duktape_async_event_type (line 389) | typedef enum janus_duktape_async_event_type {
  type janus_duktape_async_event (line 393) | typedef struct janus_duktape_async_event {
  function duk_ret_t (line 443) | static duk_ret_t janus_duktape_method_getmodulesfolder(duk_context *ctx) {
  function duk_ret_t (line 449) | static duk_ret_t janus_duktape_method_getversion(duk_context *ctx) {
  function duk_ret_t (line 454) | static duk_ret_t janus_duktape_method_readfile(duk_context *ctx) {
  function duk_ret_t (line 493) | static duk_ret_t janus_duktape_method_pokescheduler(duk_context *ctx) {
  function duk_ret_t (line 500) | static duk_ret_t janus_duktape_method_timecallback(duk_context *ctx) {
  function duk_ret_t (line 536) | static duk_ret_t janus_duktape_method_pushevent(duk_context *ctx) {
  function duk_ret_t (line 654) | static duk_ret_t janus_duktape_method_notifyevent(duk_context *ctx) {
  function duk_ret_t (line 696) | static duk_ret_t janus_duktape_method_eventsisenabled(duk_context *ctx) {
  function duk_ret_t (line 702) | static duk_ret_t janus_duktape_method_closepc(duk_context *ctx) {
  function duk_ret_t (line 725) | static duk_ret_t janus_duktape_method_endsession(duk_context *ctx) {
  function duk_ret_t (line 748) | static duk_ret_t janus_duktape_method_configuremedium(duk_context *ctx) {
  function duk_ret_t (line 810) | static duk_ret_t janus_duktape_method_addrecipient(duk_context *ctx) {
  function duk_ret_t (line 858) | static duk_ret_t janus_duktape_method_removerecipient(duk_context *ctx) {
  function duk_ret_t (line 910) | static duk_ret_t janus_duktape_method_setbitrate(duk_context *ctx) {
  function duk_ret_t (line 945) | static duk_ret_t janus_duktape_method_setplifreq(duk_context *ctx) {
  function duk_ret_t (line 975) | static duk_ret_t janus_duktape_method_setsubstream(duk_context *ctx) {
  function duk_ret_t (line 1006) | static duk_ret_t janus_duktape_method_settemporallayer(duk_context *ctx) {
  function duk_ret_t (line 1037) | static duk_ret_t janus_duktape_method_sendpli(duk_context *ctx) {
  function duk_ret_t (line 1063) | static duk_ret_t janus_duktape_method_relayrtp(duk_context *ctx) {
  function duk_ret_t (line 1110) | static duk_ret_t janus_duktape_method_relayrtcp(duk_context *ctx) {
  function duk_ret_t (line 1156) | static duk_ret_t janus_duktape_method_relaytextdata(duk_context *ctx) {
  function duk_ret_t (line 1228) | static duk_ret_t janus_duktape_method_relaybinarydata(duk_context *ctx) {
  function janus_duktape_method_relaydata (line 1299) | static int janus_duktape_method_relaydata(duk_context *ctx) {
  function duk_ret_t (line 1304) | static duk_ret_t janus_duktape_method_startrecording(duk_context *ctx) {
  function duk_ret_t (line 1426) | static duk_ret_t janus_duktape_method_stoprecording(duk_context *ctx) {
  function janus_duktape_init (line 1485) | int janus_duktape_init(janus_callbacks *callback, const char *config_pat...
  function janus_duktape_destroy (line 1773) | void janus_duktape_destroy(void) {
  function janus_duktape_get_api_compatibility (line 1837) | int janus_duktape_get_api_compatibility(void) {
  function janus_duktape_get_version (line 1842) | int janus_duktape_get_version(void) {
  function janus_duktape_session (line 2044) | janus_duktape_session *janus_duktape_lookup_session(janus_plugin_session...
  function janus_duktape_create_session (line 2052) | void janus_duktape_create_session(janus_plugin_session *handle, int *err...
  function janus_duktape_destroy_session (line 2107) | void janus_duktape_destroy_session(janus_plugin_session *handle, int *er...
  function json_t (line 2162) | json_t *janus_duktape_query_session(janus_plugin_session *handle) {
  type janus_plugin_result (line 2208) | struct janus_plugin_result
  function json_t (line 2322) | json_t *janus_duktape_handle_admin_message(json_t *message) {
  function janus_duktape_setup_media (line 2361) | void janus_duktape_setup_media(janus_plugin_session *handle) {
  function janus_duktape_incoming_rtp (line 2399) | void janus_duktape_incoming_rtp(janus_plugin_session *handle, janus_plug...
  function janus_duktape_incoming_rtcp (line 2516) | void janus_duktape_incoming_rtcp(janus_plugin_session *handle, janus_plu...
  function janus_duktape_incoming_data (line 2569) | void janus_duktape_incoming_data(janus_plugin_session *handle, janus_plu...
  function janus_duktape_data_ready (line 2628) | void janus_duktape_data_ready(janus_plugin_session *handle) {
  function janus_duktape_slow_link (line 2661) | void janus_duktape_slow_link(janus_plugin_session *handle, int mindex, g...
  function janus_duktape_hangup_media (line 2697) | void janus_duktape_hangup_media(janus_plugin_session *handle) {
  function janus_duktape_relay_rtp_packet (line 2770) | static void janus_duktape_relay_rtp_packet(gpointer data, gpointer user_...
  function janus_duktape_relay_data_packet (line 2884) | static void janus_duktape_relay_data_packet(gpointer data, gpointer user...
  function gboolean (line 2953) | static gboolean janus_duktape_timer_cb(void *data) {

FILE: src/plugins/janus_duktape_data.h
  type janus_duktape_session (line 51) | typedef struct janus_duktape_session {

FILE: src/plugins/janus_duktape_extra.c
  function duk_ret_t (line 29) | static duk_ret_t janus_duktape_extra_sample(duk_context *ctx) {
  function janus_duktape_register_extra_functions (line 39) | void janus_duktape_register_extra_functions(duk_context *ctx) {

FILE: src/plugins/janus_echotest.c
  type janus_plugin_result (line 150) | struct janus_plugin_result
  function janus_plugin (line 191) | janus_plugin *create(void) {
  type janus_json_parameter (line 197) | struct janus_json_parameter
  type janus_echotest_message (line 225) | typedef struct janus_echotest_message {
  type janus_echotest_session (line 234) | typedef struct janus_echotest_session {
  function janus_echotest_session_destroy (line 269) | static void janus_echotest_session_destroy(janus_echotest_session *sessi...
  function janus_echotest_session_free (line 274) | static void janus_echotest_session_free(const janus_refcount *session_re...
  function janus_echotest_message_free (line 287) | static void janus_echotest_message_free(janus_echotest_message *msg) {
  function janus_echotest_init (line 318) | int janus_echotest_init(janus_callbacks *callback, const char *config_pa...
  function janus_echotest_destroy (line 371) | void janus_echotest_destroy(void) {
  function janus_echotest_get_api_compatibility (line 395) | int janus_echotest_get_api_compatibility(void) {
  function janus_echotest_get_version (line 400) | int janus_echotest_get_version(void) {
  function janus_echotest_session (line 424) | static janus_echotest_session *janus_echotest_lookup_session(janus_plugi...
  function janus_echotest_create_session (line 432) | void janus_echotest_create_session(janus_plugin_session *handle, int *er...
  function janus_echotest_destroy_session (line 468) | void janus_echotest_destroy_session(janus_plugin_session *handle, int *e...
  function json_t (line 488) | json_t *janus_echotest_query_session(janus_plugin_session *handle) {
  type janus_plugin_result (line 549) | struct janus_plugin_result
  function json_t (line 571) | json_t *janus_echotest_handle_admin_message(json_t *message) {
  function janus_echotest_setup_media (line 578) | void janus_echotest_setup_media(janus_plugin_session *handle) {
  function janus_echotest_incoming_rtp (line 598) | void janus_echotest_incoming_rtp(janus_plugin_session *handle, janus_plu...
  function janus_echotest_incoming_rtcp (line 708) | void janus_echotest_incoming_rtcp(janus_plugin_session *handle, janus_pl...
  function janus_echotest_incoming_data (line 732) | void janus_echotest_incoming_data(janus_plugin_session *handle, janus_pl...
  function janus_echotest_data_ready (line 785) | void janus_echotest_data_ready(janus_plugin_session *handle) {
  function janus_echotest_slow_link (line 792) | void janus_echotest_slow_link(janus_plugin_session *handle, int mindex, ...
  function janus_echotest_recorder_close (line 837) | static void janus_echotest_recorder_close(janus_echotest_session *sessio...
  function janus_echotest_hangup_media (line 861) | void janus_echotest_hangup_media(janus_plugin_session *handle) {
  function janus_echotest_hangup_media_internal (line 868) | static void janus_echotest_hangup_media_internal(janus_plugin_session *h...

FILE: src/plugins/janus_lua.c
  type janus_plugin_result (line 222) | struct janus_plugin_result
  function janus_plugin (line 263) | janus_plugin *create(void) {
  type janus_lua_event (line 309) | typedef enum janus_lua_event {
  type janus_lua_callback (line 320) | typedef struct janus_lua_callback {
  function janus_lua_callback_free (line 328) | static void janus_lua_callback_free(janus_lua_callback *cb) {
  function janus_lua_stackdump (line 339) | static void janus_lua_stackdump(lua_State* l) {
  function janus_lua_session_destroy (line 348) | static void janus_lua_session_destroy(janus_lua_session *session) {
  function janus_lua_session_free (line 354) | static void janus_lua_session_free(const janus_refcount *session_ref) {
  type janus_lua_rtp_relay_packet (line 371) | typedef struct janus_lua_rtp_relay_packet {
  type janus_lua_async_event_type (line 389) | typedef enum janus_lua_async_event_type {
  type janus_lua_async_event (line 393) | typedef struct janus_lua_async_event {
  function janus_lua_method_januslog (line 422) | static int janus_lua_method_januslog(lua_State *s) {
  function janus_lua_method_pokescheduler (line 439) | static int janus_lua_method_pokescheduler(lua_State *s) {
  function janus_lua_method_timecallback (line 446) | static int janus_lua_method_timecallback(lua_State *s) {
  function janus_lua_method_pushevent (line 478) | static int janus_lua_method_pushevent(lua_State *s) {
  function janus_lua_method_notifyevent (line 578) | static int janus_lua_method_notifyevent(lua_State *s) {
  function janus_lua_method_eventsisenabled (line 615) | static int janus_lua_method_eventsisenabled(lua_State *s) {
  function janus_lua_method_closepc (line 628) | static int janus_lua_method_closepc(lua_State *s) {
  function janus_lua_method_endsession (line 653) | static int janus_lua_method_endsession(lua_State *s) {
  function janus_lua_method_configuremedium (line 678) | static int janus_lua_method_configuremedium(lua_State *s) {
  function janus_lua_method_addrecipient (line 727) | static int janus_lua_method_addrecipient(lua_State *s) {
  function janus_lua_method_removerecipient (line 772) | static int janus_lua_method_removerecipient(lua_State *s) {
  function janus_lua_method_setbitrate (line 821) | static int janus_lua_method_setbitrate(lua_State *s) {
  function janus_lua_method_setplifreq (line 853) | static int janus_lua_method_setplifreq(lua_State *s) {
  function janus_lua_method_setsubstream (line 880) | static int janus_lua_method_setsubstream(lua_State *s) {
  function janus_lua_method_settemporallayer (line 908) | static int janus_lua_method_settemporallayer(lua_State *s) {
  function janus_lua_method_sendpli (line 936) | static int janus_lua_method_sendpli(lua_State *s) {
  function janus_lua_method_relayrtp (line 965) | static int janus_lua_method_relayrtp(lua_State *s) {
  function janus_lua_method_relayrtcp (line 999) | static int janus_lua_method_relayrtcp(lua_State *s) {
  function janus_lua_method_relaytextdata (line 1032) | static int janus_lua_method_relaytextdata(lua_State *s) {
  function janus_lua_method_relaybinarydata (line 1085) | static int janus_lua_method_relaybinarydata(lua_State *s) {
  function janus_lua_method_relaydata (line 1138) | static int janus_lua_method_relaydata(lua_State *s) {
  function janus_lua_method_startrecording (line 1143) | static int janus_lua_method_startrecording(lua_State *s) {
  function janus_lua_method_stoprecording (line 1266) | static int janus_lua_method_stoprecording(lua_State *s) {
  function janus_lua_init (line 1324) | int janus_lua_init(janus_callbacks *callback, const char *config_path) {
  function janus_lua_destroy (line 1548) | void janus_lua_destroy(void) {
  function janus_lua_get_api_compatibility (line 1606) | int janus_lua_get_api_compatibility(void) {
  function janus_lua_get_version (line 1611) | int janus_lua_get_version(void) {
  function janus_lua_session (line 1753) | janus_lua_session *janus_lua_lookup_session(janus_plugin_session *handle) {
  function janus_lua_create_session (line 1761) | void janus_lua_create_session(janus_plugin_session *handle, int *error) {
  function janus_lua_destroy_session (line 1810) | void janus_lua_destroy_session(janus_plugin_session *handle, int *error) {
  function json_t (line 1859) | json_t *janus_lua_query_session(janus_plugin_session *handle) {
  type janus_plugin_result (line 1893) | struct janus_plugin_result
  function json_t (line 1996) | json_t *janus_lua_handle_admin_message(json_t *message) {
  function janus_lua_setup_media (line 2031) | void janus_lua_setup_media(janus_plugin_session *handle) {
  function janus_lua_incoming_rtp (line 2063) | void janus_lua_incoming_rtp(janus_plugin_session *handle, janus_plugin_r...
  function janus_lua_incoming_rtcp (line 2176) | void janus_lua_incoming_rtcp(janus_plugin_session *handle, janus_plugin_...
  function janus_lua_incoming_data (line 2223) | void janus_lua_incoming_data(janus_plugin_session *handle, janus_plugin_...
  function janus_lua_data_ready (line 2276) | void janus_lua_data_ready(janus_plugin_session *handle) {
  function janus_lua_slow_link (line 2303) | void janus_lua_slow_link(janus_plugin_session *handle, int mindex, gbool...
  function janus_lua_hangup_media (line 2333) | void janus_lua_hangup_media(janus_plugin_session *handle) {
  function janus_lua_relay_rtp_packet (line 2400) | static void janus_lua_relay_rtp_packet(gpointer data, gpointer user_data) {
  function janus_lua_relay_data_packet (line 2502) | static void janus_lua_relay_data_packet(gpointer data, gpointer user_dat...
  function gboolean (line 2567) | static gboolean janus_lua_timer_cb(void *data) {

FILE: src/plugins/janus_lua_data.h
  type janus_lua_session (line 51) | typedef struct janus_lua_session {

FILE: src/plugins/janus_lua_extra.c
  function janus_lua_extra_sample (line 29) | static int janus_lua_extra_sample(lua_State *s) {
  function janus_lua_register_extra_functions (line 39) | void janus_lua_register_extra_functions(lua_State *state) {

FILE: src/plugins/janus_nosip.c
  type janus_plugin_result (line 374) | struct janus_plugin_result
  function janus_plugin (line 407) | janus_plugin *create(void) {
  type janus_json_parameter (line 413) | struct janus_json_parameter
  type janus_json_parameter (line 416) | struct janus_json_parameter
  type janus_json_parameter (line 422) | struct janus_json_parameter
  type janus_json_parameter (line 430) | struct janus_json_parameter
  type janus_json_parameter (line 438) | struct janus_json_parameter
  type janus_json_parameter (line 442) | struct janus_json_parameter
  type janus_json_parameter (line 445) | struct janus_json_parameter
  type janus_json_parameter (line 455) | struct janus_json_parameter
  type janus_nosip_message (line 479) | typedef struct janus_nosip_message {
  type janus_nosip_media (line 489) | typedef struct janus_nosip_media {
  type janus_nosip_session (line 528) | typedef struct janus_nosip_session {
  function janus_nosip_session_destroy (line 562) | static void janus_nosip_session_destroy(janus_nosip_session *session) {
  function janus_nosip_session_free (line 567) | static void janus_nosip_session_free(const janus_refcount *session_ref) {
  function janus_nosip_message_free (line 599) | static void janus_nosip_message_free(janus_nosip_message *msg) {
  function janus_nosip_srtp_set_local (line 623) | static int janus_nosip_srtp_set_local(janus_nosip_session *session, gboo...
  function janus_nosip_srtp_set_remote (line 707) | static int janus_nosip_srtp_set_remote(janus_nosip_session *session, gbo...
  function janus_nosip_srtp_cleanup (line 792) | static void janus_nosip_srtp_cleanup(janus_nosip_session *session) {
  function janus_nosip_media_reset (line 841) | void janus_nosip_media_reset(janus_nosip_session *session) {
  function janus_nosip_init (line 894) | int janus_nosip_init(janus_callbacks *callback, const char *config_path) {
  function janus_nosip_destroy (line 1089) | void janus_nosip_destroy(void) {
  function janus_nosip_get_api_compatibility (line 1117) | int janus_nosip_get_api_compatibility(void) {
  function janus_nosip_get_version (line 1122) | int janus_nosip_get_version(void) {
  function janus_nosip_session (line 1146) | static janus_nosip_session *janus_nosip_lookup_session(janus_plugin_sess...
  function janus_nosip_create_session (line 1154) | void janus_nosip_create_session(janus_plugin_session *handle, int *error) {
  function janus_nosip_destroy_session (line 1245) | void janus_nosip_destroy_session(janus_plugin_session *handle, int *erro...
  function json_t (line 1267) | json_t *janus_nosip_query_session(janus_plugin_session *handle) {
  type janus_plugin_result (line 1306) | struct janus_plugin_result
  function janus_nosip_setup_media (line 1332) | void janus_nosip_setup_media(janus_plugin_session *handle) {
  function janus_nosip_incoming_rtp (line 1351) | void janus_nosip_incoming_rtp(janus_plugin_session *handle, janus_plugin...
  function janus_nosip_incoming_rtcp (line 1443) | void janus_nosip_incoming_rtcp(janus_plugin_session *handle, janus_plugi...
  function janus_nosip_recorder_close (line 1496) | static void janus_nosip_recorder_close(janus_nosip_session *session,
  function janus_nosip_hangup_media (line 1528) | void janus_nosip_hangup_media(janus_plugin_session *handle) {
  function janus_nosip_hangup_media_internal (line 1534) | static void janus_nosip_hangup_media_internal(janus_plugin_session *hand...
  type addrinfo (line 2114) | struct addrinfo
  type addrinfo (line 2117) | struct addrinfo
  function janus_nosip_sdp_process (line 2318) | void janus_nosip_sdp_process(janus_nosip_session *session, janus_sdp *sd...
  function janus_nosip_bind_socket (line 2568) | static int janus_nosip_bind_socket(int fd, int port) {
  function janus_nosip_allocate_port_pair (line 2592) | static int janus_nosip_allocate_port_pair(gboolean video, int fds[2], in...
  function janus_nosip_allocate_local_ports (line 2676) | static int janus_nosip_allocate_local_ports(janus_nosip_session *session...
  function janus_nosip_connect_sockets (line 2781) | static void janus_nosip_connect_sockets(janus_nosip_session *session, st...
  function janus_nosip_media_cleanup (line 2849) | static void janus_nosip_media_cleanup(janus_nosip_session *session) {
  type sockaddr_in (line 2905) | struct sockaddr_in
  type pollfd (line 2907) | struct pollfd
  type sockaddr_storage (line 2937) | struct sockaddr_storage
  type sockaddr (line 3076) | struct sockaddr
  function janus_nosip_rtcp_pli_send (line 3203) | static void janus_nosip_rtcp_pli_send(janus_nosip_session *session) {
  function janus_rtp_forwarder (line 3244) | static janus_rtp_forwarder *janus_nosip_rtp_forwarder_add_helper(janus_n...
  function json_t (line 3275) | static json_t *janus_nosip_rtp_forwarder_summary(janus_rtp_forwarder *f) {

FILE: src/plugins/janus_recordplay.c
  type janus_plugin_result (line 411) | struct janus_plugin_result
  function janus_plugin (line 450) | janus_plugin *create(void) {
  type janus_json_parameter (line 456) | struct janus_json_parameter
  type janus_json_parameter (line 459) | struct janus_json_parameter
  type janus_json_parameter (line 462) | struct janus_json_parameter
  type janus_json_parameter (line 465) | struct janus_json_parameter
  type janus_json_parameter (line 469) | struct janus_json_parameter
  type janus_json_parameter (line 481) | struct janus_json_parameter
  type janus_recordplay_message (line 496) | typedef struct janus_recordplay_message {
  type janus_recordplay_rtp_header_extension (line 505) | typedef struct janus_recordplay_rtp_header_extension {
  type janus_recordplay_frame_packet (line 510) | typedef struct janus_recordplay_frame_packet {
  type janus_recordplay_recording (line 520) | typedef struct janus_recordplay_recording {
  type janus_recordplay_session (line 550) | typedef struct janus_recordplay_session {
  function janus_recordplay_session_destroy (line 588) | static void janus_recordplay_session_destroy(janus_recordplay_session *s...
  function janus_recordplay_session_free (line 593) | static void janus_recordplay_session_free(const janus_refcount *session_...
  function janus_recordplay_recording_destroy (line 606) | static void janus_recordplay_recording_destroy(janus_recordplay_recordin...
  function janus_recordplay_recording_free (line 611) | static void janus_recordplay_recording_free(const janus_refcount *record...
  function janus_recordplay_generate_offer (line 822) | static int janus_recordplay_generate_offer(janus_recordplay_recording *r...
  function janus_recordplay_message_free (line 862) | static void janus_recordplay_message_free(janus_recordplay_message *msg) {
  function janus_recordplay_init (line 900) | int janus_recordplay_init(janus_callbacks *callback, const char *config_...
  function janus_recordplay_destroy (line 993) | void janus_recordplay_destroy(void) {
  function janus_recordplay_get_api_compatibility (line 1021) | int janus_recordplay_get_api_compatibility(void) {
  function janus_recordplay_get_version (line 1026) | int janus_recordplay_get_version(void) {
  function janus_recordplay_session (line 1050) | static janus_recordplay_session *janus_recordplay_lookup_session(janus_p...
  function janus_recordplay_create_session (line 1058) | void janus_recordplay_create_session(janus_plugin_session *handle, int *...
  function janus_recordplay_destroy_session (line 1094) | void janus_recordplay_destroy_session(janus_plugin_session *handle, int ...
  function json_t (line 1114) | json_t *janus_recordplay_query_session(janus_plugin_session *handle) {
  type janus_plugin_result (line 1144) | struct janus_plugin_result
  function json_t (line 1344) | json_t *janus_recordplay_handle_admin_message(json_t *message) {
  function janus_recordplay_setup_media (line 1396) | void janus_recordplay_setup_media(janus_plugin_session *handle) {
  function janus_recordplay_send_rtcp_feedback (line 1432) | void janus_recordplay_send_rtcp_feedback(janus_plugin_session *handle, i...
  function janus_recordplay_incoming_rtp (line 1469) | void janus_recordplay_incoming_rtp(janus_plugin_session *handle, janus_p...
  function janus_recordplay_incoming_rtcp (line 1526) | void janus_recordplay_incoming_rtcp(janus_plugin_session *handle, janus_...
  function janus_recordplay_incoming_data (line 1531) | void janus_recordplay_incoming_data(janus_plugin_session *handle, janus_...
  function janus_recordplay_slow_link (line 1549) | void janus_recordplay_slow_link(janus_plugin_session *handle, int mindex...
  function janus_recordplay_hangup_media (line 1577) | void janus_recordplay_hangup_media(janus_plugin_session *handle) {
  function janus_recordplay_hangup_media_internal (line 1584) | static void janus_recordplay_hangup_media_internal(janus_plugin_session ...
  type tm (line 1952) | struct tm
  function janus_recordplay_update_recordings_list (line 2347) | void janus_recordplay_update_recordings_list(void) {
  function janus_recordplay_frame_packet (line 2526) | janus_recordplay_frame_packet *janus_recordplay_get_frames(const char *d...
  type timeval (line 2995) | struct timeval

FILE: src/plugins/janus_sip.c
  type janus_plugin_result (line 923) | struct janus_plugin_result
  function janus_plugin (line 956) | janus_plugin *create(void) {
  type janus_json_parameter (line 962) | struct janus_json_parameter
  type janus_json_parameter (line 965) | struct janus_json_parameter
  type janus_json_parameter (line 986) | struct janus_json_parameter
  type janus_json_parameter (line 996) | struct janus_json_parameter
  type janus_json_parameter (line 1000) | struct janus_json_parameter
  type janus_json_parameter (line 1014) | struct janus_json_parameter
  type janus_json_parameter (line 1020) | struct janus_json_parameter
  type janus_json_parameter (line 1026) | struct janus_json_parameter
  type janus_json_parameter (line 1031) | struct janus_json_parameter
  type janus_json_parameter (line 1035) | struct janus_json_parameter
  type janus_json_parameter (line 1038) | struct janus_json_parameter
  type janus_json_parameter (line 1047) | struct janus_json_parameter
  type janus_json_parameter (line 1052) | struct janus_json_parameter
  type janus_json_parameter (line 1057) | struct janus_json_parameter
  type janus_json_parameter (line 1064) | struct janus_json_parameter
  type janus_json_parameter (line 1068) | struct janus_json_parameter
  type janus_json_parameter (line 1071) | struct janus_json_parameter
  type janus_json_parameter (line 1081) | struct janus_json_parameter
  type janus_sip_message (line 1115) | typedef struct janus_sip_message {
  type janus_sip_registration_status (line 1125) | typedef enum {
  type janus_sip_call_status (line 1154) | typedef enum {
  type ssip_t (line 1190) | typedef struct ssip_s ssip_t;
  type ssip_oper_t (line 1191) | typedef struct ssip_oper_s ssip_oper_t;
  type ssip_s (line 1200) | struct ssip_s {
  type janus_sip_transfer (line 1211) | typedef struct janus_sip_transfer {
  type janus_sip_secret_type (line 1219) | typedef enum {
  type janus_sip_account (line 1225) | typedef struct janus_sip_account {
  type janus_sip_media (line 1244) | typedef struct janus_sip_media {
  type janus_sip_dtmf (line 1292) | typedef struct janus_sip_dtmf {
  type janus_sip_session (line 1297) | typedef struct janus_sip_session {
  type janus_sip_call (line 1339) | typedef struct janus_sip_call {
  function janus_sip_call_update_status (line 1361) | static void janus_sip_call_update_status(janus_sip_session *session, jan...
  function gboolean (line 1368) | static gboolean janus_sip_call_is_established(janus_sip_session *session) {
  function janus_sip_session_destroy (line 1376) | static void janus_sip_session_destroy(janus_sip_session *session) {
  function janus_sip_session_dereference (line 1395) | static void janus_sip_session_dereference(janus_sip_session *session) {
  function janus_sip_session_free (line 1407) | static void janus_sip_session_free(const janus_refcount *session_ref) {
  function janus_sip_message_free (line 1521) | static void janus_sip_message_free(janus_sip_message *msg) {
  function janus_sip_transfer_destroy (line 1543) | static void janus_sip_transfer_destroy(janus_sip_transfer *t) {
  function janus_sip_srtp_set_local (line 1554) | static int janus_sip_srtp_set_local(janus_sip_session *session, gboolean...
  function janus_sip_srtp_set_remote (line 1638) | static int janus_sip_srtp_set_remote(janus_sip_session *session, gboolea...
  function janus_sip_srtp_cleanup (line 1723) | static void janus_sip_srtp_cleanup(janus_sip_session *session) {
  function janus_sip_media_reset (line 1774) | static void janus_sip_media_reset(janus_sip_session *session) {
  type janus_sip_uri_t (line 1829) | typedef struct {
  function janus_sip_parse_uri (line 1835) | static int janus_sip_parse_uri(janus_sip_uri_t *sip_uri, const char *dat...
  function janus_sip_parse_proxy_uri (line 1843) | static int janus_sip_parse_proxy_uri(janus_sip_uri_t *sip_uri, const cha...
  function janus_sip_remove_quotes (line 1851) | static void janus_sip_remove_quotes(char *str) {
  function json_t (line 1859) | static json_t *janus_sip_get_incoming_headers(const sip_t *sip, const ja...
  function janus_sip_random_string (line 1903) | static void janus_sip_random_string(int length, char *buffer) {
  function janus_sip_parse_custom_headers (line 1915) | static void janus_sip_parse_custom_headers(json_t *root, char *custom_he...
  function janus_sip_parse_custom_contact_params (line 1943) | static void janus_sip_parse_custom_contact_params(json_t *root, char *cu...
  function janus_sip_sofia_logger_parse_callid (line 1979) | static void janus_sip_sofia_logger_parse_callid(char *buffer, char *call...
  function janus_sip_sofia_logger_parse_fromto (line 2002) | static void janus_sip_sofia_logger_parse_fromto(char *buffer, const char...
  function janus_sip_sofia_logger_siptrace_callback (line 2042) | static void janus_sip_sofia_logger_siptrace_callback(void *stream, char ...
  function janus_sip_ref_active_call (line 2126) | static void janus_sip_ref_active_call(janus_sip_session *session) {
  function janus_sip_unref_active_call (line 2142) | static void janus_sip_unref_active_call(janus_sip_session *session) {
  function janus_sip_session (line 2162) | static janus_sip_session *janus_sip_active_call_from_callid(janus_sip_se...
  function janus_sip_init (line 2185) | int janus_sip_init(janus_callbacks *callback, const char *config_path) {
  function janus_sip_destroy (line 2452) | void janus_sip_destroy(void) {
  function janus_sip_get_api_compatibility (line 2494) | int janus_sip_get_api_compatibility(void) {
  function janus_sip_get_version (line 2499) | int janus_sip_get_version(void) {
  function janus_sip_session (line 2523) | static janus_sip_session *janus_sip_lookup_session(janus_plugin_session ...
  function janus_sip_create_session (line 2531) | void janus_sip_create_session(janus_plugin_session *handle, int *error) {
  function janus_sip_destroy_session (line 2660) | void janus_sip_destroy_session(janus_plugin_session *handle, int *error) {
  function json_t (line 2734) | json_t *janus_sip_query_session(janus_plugin_session *handle) {
  type janus_plugin_result (line 2803) | struct janus_plugin_result
  function janus_sip_setup_media (line 2828) | void janus_sip_setup_media(janus_plugin_session *handle) {
  function janus_sip_incoming_rtp (line 2850) | void janus_sip_incoming_rtp(janus_plugin_session *handle, janus_plugin_r...
  function janus_sip_incoming_rtcp (line 3003) | void janus_sip_incoming_rtcp(janus_plugin_session *handle, janus_plugin_...
  function janus_sip_recorder_close (line 3082) | static void janus_sip_recorder_close(janus_sip_session *session,
  function janus_sip_hangup_media (line 3114) | void janus_sip_hangup_media(janus_plugin_session *handle) {
  function janus_sip_hangup_media_internal (line 3121) | static void janus_sip_hangup_media_internal(janus_plugin_session *handle) {
  type addrinfo (line 5557) | struct addrinfo
  type addrinfo (line 5560) | struct addrinfo
  function janus_sip_sofia_callback (line 5782) | void janus_sip_sofia_callback(nua_event_t event, int status, char const ...
  function janus_sip_save_reason (line 7142) | void janus_sip_save_reason(sip_t const *sip, janus_sip_session *session) {
  function janus_sip_sdp_process (line 7168) | void janus_sip_sdp_process(janus_sip_session *session, janus_sdp *sdp, g...
  function janus_sip_allocate_local_ports (line 7474) | static int janus_sip_allocate_local_ports(janus_sip_session *session, gb...
  function janus_sip_connect_sockets (line 7707) | static void janus_sip_connect_sockets(janus_sip_session *session, struct...
  function janus_sip_media_cleanup (line 7770) | static void janus_sip_media_cleanup(janus_sip_session *session) {
  type sockaddr_in (line 7837) | struct sockaddr_in
  type pollfd (line 7839) | struct pollfd
  type sockaddr_storage (line 7870) | struct sockaddr_storage
  type sockaddr (line 8025) | struct sockaddr
  type sockaddr (line 8093) | struct sockaddr
  type sockaddr (line 8125) | struct sockaddr
  type sockaddr (line 8190) | struct sockaddr
  function gpointer (line 8229) | gpointer janus_sip_sofia_thread(gpointer user_data) {
  function janus_sip_check_rfc2833 (line 8318) | static void janus_sip_check_rfc2833(janus_sip_session *session, char *bu...
  function janus_sip_rtcp_pli_send (line 8366) | static void janus_sip_rtcp_pli_send(janus_sip_session *session) {
  function janus_rtp_forwarder (line 8409) | static janus_rtp_forwarder *janus_sip_rtp_forwarder_add_helper(janus_sip...
  function json_t (line 8440) | static json_t *janus_sip_rtp_forwarder_summary(janus_rtp_forwarder *f) {

FILE: src/plugins/janus_streaming.c
  type janus_plugin_result (line 1011) | struct janus_plugin_result
  function janus_plugin (line 1049) | janus_plugin *create(void) {
  type janus_json_parameter (line 1055) | struct janus_json_parameter
  type janus_json_parameter (line 1058) | struct janus_json_parameter
  type janus_json_parameter (line 1061) | struct janus_json_parameter
  type janus_json_parameter (line 1064) | struct janus_json_parameter
  type janus_json_parameter (line 1067) | struct janus_json_parameter
  type janus_json_parameter (line 1070) | struct janus_json_parameter
  type janus_json_parameter (line 1080) | struct janus_json_parameter
  type janus_json_parameter (line 1083) | struct janus_json_parameter
  type janus_json_parameter (line 1092) | struct janus_json_parameter
  type janus_json_parameter (line 1108) | struct janus_json_parameter
  type janus_json_parameter (line 1119) | struct janus_json_parameter
  type janus_json_parameter (line 1126) | struct janus_json_parameter
  type janus_json_parameter (line 1134) | struct janus_json_parameter
  type janus_json_parameter (line 1160) | struct janus_json_parameter
  type janus_json_parameter (line 1184) | struct janus_json_parameter
  type janus_json_parameter (line 1197) | struct janus_json_parameter
  type janus_json_parameter (line 1216) | struct janus_json_parameter
  type janus_json_parameter (line 1224) | struct janus_json_parameter
  type janus_json_parameter (line 1227) | struct janus_json_parameter
  type janus_json_parameter (line 1230) | struct janus_json_parameter
  type janus_json_parameter (line 1238) | struct janus_json_parameter
  type janus_json_parameter (line 1246) | struct janus_json_parameter
  type janus_json_parameter (line 1251) | struct janus_json_parameter
  type janus_json_parameter (line 1255) | struct janus_json_parameter
  type janus_json_parameter (line 1275) | struct janus_json_parameter
  type janus_streaming_type (line 1308) | typedef enum janus_streaming_type {
  type janus_streaming_source (line 1314) | typedef enum janus_streaming_source {
  type janus_streaming_rtp_keyframe (line 1320) | typedef struct janus_streaming_rtp_keyframe {
  type janus_streaming_rtp_relay_packet (line 1334) | typedef struct janus_streaming_rtp_relay_packet {
  function janus_streaming_rtp_relay_packet_free (line 1356) | static void janus_streaming_rtp_relay_packet_free(janus_streaming_rtp_re...
  type janus_streaming_buffer (line 1365) | typedef struct janus_streaming_buffer {
  type janus_streaming_codecs (line 1371) | typedef struct janus_streaming_codecs {
  type janus_streaming_rtp_source (line 1378) | typedef struct janus_streaming_rtp_source {
  type janus_streaming_media (line 1425) | typedef enum janus_streaming_media {
  function janus_streaming_media (line 1442) | static janus_streaming_media janus_streaming_parse_media(const char *typ...
  type janus_streaming_rtp_source_stream (line 1454) | typedef struct janus_streaming_rtp_source_stream {
  function janus_streaming_rtp_source_stream_unref (line 1489) | static void janus_streaming_rtp_source_stream_unref(janus_streaming_rtp_...
  type janus_streaming_file_source (line 1495) | typedef struct janus_streaming_file_source {
  type multiple_fds (line 1502) | typedef struct multiple_fds {
  type janus_streaming_mountpoint (line 1507) | typedef struct janus_streaming_mountpoint {
  type janus_streaming_helper (line 1535) | typedef struct janus_streaming_helper {
  function janus_streaming_helper_destroy (line 1546) | static void janus_streaming_helper_destroy(janus_streaming_helper *helpe...
  function janus_streaming_helper_free (line 1550) | static void janus_streaming_helper_free(const janus_refcount *helper_ref) {
  type janus_streaming_message (line 1591) | typedef struct janus_streaming_message {
  type janus_streaming_session_stream (line 1600) | typedef struct janus_streaming_session_stream {
  function janus_streaming_session_stream_free (line 1616) | static void janus_streaming_session_stream_free(janus_streaming_session_...
  type janus_streaming_session (line 1622) | typedef struct janus_streaming_session {
  function janus_streaming_session_destroy (line 1648) | static void janus_streaming_session_destroy(janus_streaming_session *ses...
  function janus_streaming_session_free (line 1653) | static void janus_streaming_session_free(const janus_refcount *session_r...
  function janus_streaming_mountpoint_destroy (line 1662) | static void janus_streaming_mountpoint_destroy(janus_streaming_mountpoin...
  function janus_streaming_mountpoint_free (line 1695) | static void janus_streaming_mountpoint_free(const janus_refcount *mp_ref) {
  function janus_streaming_message_free (line 1726) | static void janus_streaming_message_free(janus_streaming_message *msg) {
  function janus_streaming_notify_subscribers (line 1749) | static void janus_streaming_notify_subscribers(janus_streaming_mountpoin...
  type janus_streaming_opus_context (line 1769) | typedef struct janus_streaming_opus_context {
  function janus_streaming_opus_context_init (line 1780) | static int janus_streaming_opus_context_init(janus_streaming_opus_contex...
  function gboolean (line 1794) | static gboolean janus_streaming_ogg_is_opus(ogg_page *page) {
  function janus_streaming_opus_context_read (line 1809) | static int janus_streaming_opus_context_read(janus_streaming_opus_contex...
  function janus_streaming_opus_context_cleanup (line 1903) | static void janus_streaming_opus_context_cleanup(janus_streaming_opus_co...
  function janus_streaming_rtcp_pli_send (line 1914) | static void janus_streaming_rtcp_pli_send(janus_streaming_rtp_source_str...
  function janus_streaming_rtcp_remb_send (line 1948) | static void janus_streaming_rtcp_remb_send(janus_streaming_rtp_source *s...
  type ifaddrs (line 2054) | struct ifaddrs
  function janus_streaming_destroy (line 3004) | void janus_streaming_destroy(void) {
  function janus_streaming_get_api_compatibility (line 3037) | int janus_streaming_get_api_compatibility(void) {
  function janus_streaming_get_version (line 3042) | int janus_streaming_get_version(void) {
  function janus_streaming_session (line 3066) | static janus_streaming_session *janus_streaming_lookup_session(janus_plu...
  function janus_streaming_create_session (line 3074) | void janus_streaming_create_session(janus_plugin_session *handle, int *e...
  function janus_streaming_destroy_session (line 3096) | void janus_streaming_destroy_session(janus_plugin_session *handle, int *...
  function json_t (line 3116) | json_t *janus_streaming_query_session(janus_plugin_session *handle) {
  type ifaddrs (line 3211) | struct ifaddrs
  type janus_plugin_result (line 5648) | struct janus_plugin_result
  function json_t (line 5749) | json_t *janus_streaming_handle_admin_message(json_t *message) {
  function janus_streaming_setup_media (line 5785) | void janus_streaming_setup_media(janus_plugin_session *handle) {
  function janus_streaming_incoming_rtp (line 5857) | void janus_streaming_incoming_rtp(janus_plugin_session *handle, janus_pl...
  function janus_streaming_incoming_rtcp (line 5863) | void janus_streaming_incoming_rtcp(janus_plugin_session *handle, janus_p...
  function janus_streaming_data_ready (line 5904) | void janus_streaming_data_ready(janus_plugin_session *handle) {
  function janus_streaming_hangup_media (line 5939) | void janus_streaming_hangup_media(janus_plugin_session *handle) {
  function janus_streaming_hangup_media_internal (line 5946) | static void janus_streaming_hangup_media_internal(janus_plugin_session *...
  function else (line 6514) | else if(stream->type == JANUS_STREAMING_MEDIA_DATA && data) {
  function janus_streaming_create_fd (line 7411) | static int janus_streaming_create_fd(int port, in_addr_t mcast, const ja...
  function janus_streaming_allocate_port_pair (line 7573) | static int janus_streaming_allocate_port_pair(const char *name, const ch...
  function janus_streaming_get_fd_port (line 7621) | static int janus_streaming_get_fd_port(int fd) {
  function janus_streaming_rtp_source_stream_free (line 7632) | static void janus_streaming_rtp_source_stream_free(const janus_refcount ...
  function janus_streaming_rtp_source_free (line 7669) | static void janus_streaming_rtp_source_free(gpointer data) {
  function janus_streaming_file_source_free (line 7716) | static void janus_streaming_file_source_free(gpointer data) {
  function janus_streaming_rtp_source_stream (line 7725) | janus_streaming_rtp_source_stream *janus_streaming_create_rtp_source_str...
  function janus_streaming_mountpoint (line 7893) | janus_streaming_mountpoint *janus_streaming_create_rtp_source(
  function janus_streaming_rtsp_curl_callback (line 8195) | static size_t janus_streaming_rtsp_curl_callback(void *payload, size_t s...
  function janus_streaming_rtsp_parse_sdp (line 8208) | static int janus_streaming_rtsp_parse_sdp(const char *buffer, const char...
  function gint64 (line 8308) | static inline gint64 janus_streaming_min_if(gint64 a, gint64 b) {
  function janus_streaming_rtsp_connect_to_server (line 8314) | static int janus_streaming_rtsp_connect_to_server(janus_streaming_mountp...
  function janus_streaming_rtsp_latch (line 8955) | static void janus_streaming_rtsp_latch(int fd, char *host, int port, str...
  function janus_streaming_rtsp_play (line 8999) | static int janus_streaming_rtsp_play(janus_streaming_rtp_source *source) {
  function janus_streaming_mountpoint (line 9049) | janus_streaming_mountpoint *janus_streaming_create_rtsp_source(
  function janus_streaming_mountpoint (line 9235) | janus_streaming_mountpoint *janus_streaming_create_rtsp_source(
  type timeval (line 9332) | struct timeval
  type timeval (line 9484) | struct timeval
  function janus_streaming_buffer_keyframe_data (line 9571) | static void janus_streaming_buffer_keyframe_data(janus_streaming_rtp_sou...
  type sockaddr_storage (line 9663) | struct sockaddr_storage
  type pollfd (line 9665) | struct pollfd
  type pollfd (line 9665) | struct pollfd
  type pollfd (line 9784) | struct pollfd
  type sockaddr (line 9949) | struct sockaddr
  type sockaddr (line 9961) | struct sockaddr
  type sockaddr (line 10052) | struct sockaddr
  type sockaddr (line 10247) | struct sockaddr
  type sockaddr (line 10297) | struct sockaddr
  function janus_streaming_relay_rtp_packet (line 10403) | static void janus_streaming_relay_rtp_packet(gpointer data, gpointer use...
  function janus_streaming_relay_rtcp_packet (line 10735) | static void janus_streaming_relay_rtcp_packet(gpointer data, gpointer us...
  function janus_streaming_helper_rtprtcp_packet (line 10761) | static void janus_streaming_helper_rtprtcp_packet(gpointer data, gpointe...

FILE: src/plugins/janus_textroom.c
  type janus_plugin_result (line 598) | struct janus_plugin_result
  function janus_plugin (line 639) | janus_plugin *create(void) {
  type janus_json_parameter (line 646) | struct janus_json_parameter
  type janus_json_parameter (line 649) | struct janus_json_parameter
  type janus_json_parameter (line 653) | struct janus_json_parameter
  type janus_json_parameter (line 656) | struct janus_json_parameter
  type janus_json_parameter (line 659) | struct janus_json_parameter
  type janus_json_parameter (line 662) | struct janus_json_parameter
  type janus_json_parameter (line 665) | struct janus_json_parameter
  type janus_json_parameter (line 668) | struct janus_json_parameter
  type janus_json_parameter (line 678) | struct janus_json_parameter
  type janus_json_parameter (line 681) | struct janus_json_parameter
  type janus_json_parameter (line 690) | struct janus_json_parameter
  type janus_json_parameter (line 695) | struct janus_json_parameter
  type janus_json_parameter (line 699) | struct janus_json_parameter
  type janus_json_parameter (line 706) | struct janus_json_parameter
  type janus_json_parameter (line 712) | struct janus_json_parameter
  type janus_textroom_room (line 735) | typedef struct janus_textroom_room {
  type janus_textroom_session (line 756) | typedef struct janus_textroom_session {
  type janus_textroom_participant (line 771) | typedef struct janus_textroom_participant {
  function janus_textroom_room_destroy (line 781) | static void janus_textroom_room_destroy(janus_textroom_room *textroom) {
  function janus_textroom_room_free (line 785) | static void janus_textroom_room_free(const janus_refcount *textroom_ref) {
  function janus_textroom_session_destroy (line 801) | static void janus_textroom_session_destroy(janus_textroom_session *sessi...
  function janus_textroom_session_free (line 805) | static void janus_textroom_session_free(const janus_refcount *session_re...
  function janus_textroom_participant_dereference (line 815) | static void janus_textroom_participant_dereference(janus_textroom_partic...
  function janus_textroom_participant_destroy (line 820) | static void janus_textroom_participant_destroy(janus_textroom_participan...
  function janus_textroom_participant_free (line 824) | static void janus_textroom_participant_free(const janus_refcount *partic...
  type janus_textroom_message (line 834) | typedef struct janus_textroom_message {
  function janus_textroom_message_free (line 843) | static void janus_textroom_message_free(janus_textroom_message *msg) {
  function janus_textroom_write_data (line 894) | static size_t janus_textroom_write_data(void *buffer, size_t size, size_...
  function janus_textroom_init (line 912) | int janus_textroom_init(janus_callbacks *callback, const char *config_pa...
  function janus_textroom_destroy (line 1117) | void janus_textroom_destroy(void) {
  function janus_textroom_get_api_compatibility (line 1152) | int janus_textroom_get_api_compatibility(void) {
  function janus_textroom_get_version (line 1157) | int janus_textroom_get_version(void) {
  function janus_textroom_session (line 1181) | static janus_textroom_session *janus_textroom_lookup_session(janus_plugi...
  function janus_textroom_create_session (line 1189) | void janus_textroom_create_session(janus_plugin_session *handle, int *er...
  function janus_textroom_destroy_session (line 1212) | void janus_textroom_destroy_session(janus_plugin_session *handle, int *e...
  function json_t (line 1233) | json_t *janus_textroom_query_session(janus_plugin_session *handle) {
  type janus_plugin_result (line 1253) | struct janus_plugin_result
  function json_t (line 1372) | json_t *janus_textroom_handle_admin_message(json_t *message) {
  function janus_textroom_setup_media (line 1427) | void janus_textroom_setup_media(janus_plugin_session *handle) {
  function janus_textroom_incoming_rtp (line 1446) | void janus_textroom_incoming_rtp(janus_plugin_session *handle, janus_plu...
  function janus_textroom_incoming_rtcp (line 1450) | void janus_textroom_incoming_rtcp(janus_plugin_session *handle, janus_pl...
  function janus_textroom_incoming_data (line 1454) | void janus_textroom_incoming_data(janus_plugin_session *handle, janus_pl...
  function janus_textroom_data_ready (line 1487) | void janus_textroom_data_ready(janus_plugin_session *handle) {
  function janus_plugin_result (line 1501) | janus_plugin_result *janus_textroom_handle_incoming_request(janus_plugin...
  function janus_textroom_slow_link (line 3051) | void janus_textroom_slow_link(janus_plugin_session *handle, int mindex, ...
  function janus_textroom_hangup_media (line 3055) | void janus_textroom_hangup_media(janus_plugin_session *handle) {
  function janus_textroom_hangup_media_internal (line 3061) | static void janus_textroom_hangup_media_internal(janus_plugin_session *h...

FILE: src/plugins/janus_videocall.c
  type janus_plugin_result (line 291) | struct janus_plugin_result
  function janus_plugin (line 330) | janus_plugin *create(void) {
  type janus_json_parameter (line 336) | struct janus_json_parameter
  type janus_json_parameter (line 339) | struct janus_json_parameter
  type janus_json_parameter (line 342) | struct janus_json_parameter
  type janus_videocall_message (line 359) | typedef struct janus_videocall_message {
  type janus_videocall_session (line 368) | typedef struct janus_videocall_session {
  function janus_videocall_session_destroy (line 403) | static void janus_videocall_session_destroy(janus_videocall_session *ses...
  function janus_videocall_session_unref (line 407) | static void janus_videocall_session_unref(janus_videocall_session *sessi...
  function janus_videocall_session_free (line 412) | static void janus_videocall_session_free(const janus_refcount *session_r...
  function janus_videocall_message_free (line 425) | static void janus_videocall_message_free(janus_videocall_message *msg) {
  function janus_videocall_init (line 467) | int janus_videocall_init(janus_callbacks *callback, const char *config_p...
  function janus_videocall_destroy (line 524) | void janus_videocall_destroy(void) {
  function janus_videocall_get_api_compatibility (line 548) | int janus_videocall_get_api_compatibility(void) {
  function janus_videocall_get_version (line 553) | int janus_videocall_get_version(void) {
  function janus_videocall_session (line 577) | static janus_videocall_session *janus_videocall_lookup_session(janus_plu...
  function janus_videocall_create_session (line 585) | void janus_videocall_create_session(janus_plugin_session *handle, int *e...
  function janus_videocall_destroy_session (line 620) | void janus_videocall_destroy_session(janus_plugin_session *handle, int *...
  function json_t (line 644) | json_t *janus_videocall_query_session(janus_plugin_session *handle) {
  type janus_plugin_result (line 709) | struct janus_plugin_result
  function janus_videocall_setup_media (line 734) | void janus_videocall_setup_media(janus_plugin_session *handle) {
  function janus_videocall_incoming_rtp (line 754) | void janus_videocall_incoming_rtp(janus_plugin_session *handle, janus_pl...
  function janus_videocall_incoming_rtcp (line 845) | void janus_videocall_incoming_rtcp(janus_plugin_session *handle, janus_p...
  function janus_videocall_incoming_data (line 873) | void janus_videocall_incoming_data(janus_plugin_session *handle, janus_p...
  function janus_videocall_data_ready (line 911) | void janus_videocall_data_ready(janus_plugin_session *handle) {
  function janus_videocall_slow_link (line 924) | void janus_videocall_slow_link(janus_plugin_session *handle, int mindex,...
  function janus_videocall_recorder_close (line 963) | static void janus_videocall_recorder_close(janus_videocall_session *sess...
  function janus_videocall_hangup_media (line 987) | void janus_videocall_hangup_media(janus_plugin_session *handle) {
  function janus_videocall_hangup_media_internal (line 994) | static void janus_videocall_hangup_media_internal(janus_plugin_session *...

FILE: src/plugins/janus_videoroom.c
  type janus_plugin_result (line 1853) | struct janus_plugin_result
  function janus_plugin (line 1894) | janus_plugin *create(void) {
  type janus_json_parameter (line 1900) | struct janus_json_parameter
  type janus_json_parameter (line 1903) | struct janus_json_parameter
  type janus_json_parameter (line 1906) | struct janus_json_parameter
  type janus_json_parameter (line 1942) | struct janus_json_parameter
  type janus_json_parameter (line 1956) | struct janus_json_parameter
  type janus_json_parameter (line 1959) | struct janus_json_parameter
  type janus_json_parameter (line 1962) | struct janus_json_parameter
  type janus_json_parameter (line 1965) | struct janus_json_parameter
  type janus_json_parameter (line 1968) | struct janus_json_parameter
  type janus_json_parameter (line 1971) | struct janus_json_parameter
  type janus_json_parameter (line 1974) | struct janus_json_parameter
  type janus_json_parameter (line 1977) | struct janus_json_parameter
  type janus_json_parameter (line 1980) | struct janus_json_parameter
  type janus_json_parameter (line 1983) | struct janus_json_parameter
  type janus_json_parameter (line 1986) | struct janus_json_parameter
  type janus_json_parameter (line 1989) | struct janus_json_parameter
  type janus_json_parameter (line 1992) | struct janus_json_parameter
  type janus_json_parameter (line 1995) | struct janus_json_parameter
  type janus_json_parameter (line 1998) | struct janus_json_parameter
  type janus_json_parameter (line 2001) | struct janus_json_parameter
  type janus_json_parameter (line 2006) | struct janus_json_parameter
  type janus_json_parameter (line 2009) | struct janus_json_parameter
  type janus_json_parameter (line 2014) | struct janus_json_parameter
  type janus_json_parameter (line 2024) | struct janus_json_parameter
  type janus_json_parameter (line 2045) | struct janus_json_parameter
  type janus_json_parameter (line 2052) | struct janus_json_parameter
  type janus_json_parameter (line 2056) | struct janus_json_parameter
  type janus_json_parameter (line 2059) | struct janus_json_parameter
  type janus_json_parameter (line 2084) | struct janus_json_parameter
  type janus_json_parameter (line 2103) | struct janus_json_parameter
  type janus_json_parameter (line 2107) | struct janus_json_parameter
  type janus_json_parameter (line 2111) | struct janus_json_parameter
  type janus_json_parameter (line 2128) | struct janus_json_parameter
  type janus_json_parameter (line 2139) | struct janus_json_parameter
  type janus_json_parameter (line 2158) | struct janus_json_parameter
  type janus_json_parameter (line 2172) | struct janus_json_parameter
  type janus_json_parameter (line 2175) | struct janus_json_parameter
  type janus_json_parameter (line 2179) | struct janus_json_parameter
  type janus_json_parameter (line 2184) | struct janus_json_parameter
  type janus_json_parameter (line 2187) | struct janus_json_parameter
  type janus_json_parameter (line 2198) | struct janus_json_parameter
  type janus_json_parameter (line 2208) | struct janus_json_parameter
  type janus_json_parameter (line 2212) | struct janus_json_parameter
  type janus_json_parameter (line 2223) | struct janus_json_parameter
  type janus_json_parameter (line 2231) | struct janus_json_parameter
  type janus_videoroom_p_type (line 2267) | typedef enum janus_videoroom_p_type {
  type janus_videoroom_media (line 2273) | typedef enum janus_videoroom_media {
  function janus_sdp_mtype (line 2290) | static janus_sdp_mtype janus_videoroom_media_sdptype(janus_videoroom_med...
  function janus_videoroom_media (line 2301) | static janus_videoroom_media janus_videoroom_media_from_str(const char *...
  type janus_videoroom_message (line 2313) | typedef struct janus_videoroom_message {
  type janus_videoroom (line 2323) | typedef struct janus_videoroom {
  type janus_videoroom_session (line 2370) | typedef struct janus_videoroom_session {
  type janus_videoroom_helper (line 2389) | typedef struct janus_videoroom_helper {
  function janus_videoroom_helper_destroy (line 2400) | static void janus_videoroom_helper_destroy(janus_videoroom_helper *helpe...
  function janus_videoroom_helper_free (line 2404) | static void janus_videoroom_helper_free(const janus_refcount *helper_ref) {
  type janus_videoroom_publisher (line 2415) | typedef struct janus_videoroom_publisher {
  type janus_videoroom_publisher_stream (line 2466) | typedef struct janus_videoroom_publisher_stream {
  type janus_videoroom_subscriber (line 2553) | typedef struct janus_videoroom_subscriber {
  type janus_videoroom_subscriber_stream (line 2574) | typedef struct janus_videoroom_subscriber_stream {
  type janus_videoroom_stream_mapping (line 2602) | typedef struct janus_videoroom_stream_mapping {
  type janus_videoroom_rtp_relay_packet (line 2609) | typedef struct janus_videoroom_rtp_relay_packet {
  function janus_videoroom_rtp_relay_packet_free (line 2629) | static void janus_videoroom_rtp_relay_packet_free(janus_videoroom_rtp_re...
  type janus_videoroom_remote_recipient (line 2638) | typedef struct janus_videoroom_remote_recipient {
  function janus_videoroom_remote_recipient_free (line 2648) | static void janus_videoroom_remote_recipient_free(janus_videoroom_remote...
  function janus_videoroom_subscriber_stream_destroy (line 2662) | static void janus_videoroom_subscriber_stream_destroy(janus_videoroom_su...
  function janus_videoroom_subscriber_stream_unref (line 2668) | static void janus_videoroom_subscriber_stream_unref(janus_videoroom_subs...
  function janus_videoroom_subscriber_stream_free (line 2674) | static void janus_videoroom_subscriber_stream_free(const janus_refcount ...
  function janus_videoroom_subscriber_destroy (line 2688) | static void janus_videoroom_subscriber_destroy(janus_videoroom_subscribe...
  function janus_videoroom_subscriber_free (line 2693) | static void janus_videoroom_subscriber_free(const janus_refcount *s_ref) {
  function janus_videoroom_publisher_stream_destroy (line 2704) | static void janus_videoroom_publisher_stream_destroy(janus_videoroom_pub...
  function janus_videoroom_publisher_stream_unref (line 2714) | static void janus_videoroom_publisher_stream_unref(janus_videoroom_publi...
  function janus_videoroom_publisher_stream_free (line 2720) | static void janus_videoroom_publisher_stream_free(const janus_refcount *...
  function janus_videoroom_publisher_dereference (line 2745) | static void janus_videoroom_publisher_dereference(janus_videoroom_publis...
  function janus_videoroom_publisher_dereference_nodebug (line 2766) | static void janus_videoroom_publisher_dereference_nodebug(janus_videoroo...
  function janus_videoroom_publisher_destroy (line 2770) | static void janus_videoroom_publisher_destroy(janus_videoroom_publisher ...
  function janus_videoroom_publisher_free (line 2811) | static void janus_videoroom_publisher_free(const janus_refcount *p_ref) {
  function janus_videoroom_session_destroy (line 2852) | static void janus_videoroom_session_destroy(janus_videoroom_session *ses...
  function janus_videoroom_session_free (line 2857) | static void janus_videoroom_session_free(const janus_refcount *session_r...
  function janus_videoroom_room_dereference (line 2869) | static void janus_videoroom_room_dereference(janus_videoroom *room) {
  function janus_videoroom_room_destroy (line 2873) | static void janus_videoroom_room_destroy(janus_videoroom *room) {
  function janus_videoroom_room_free (line 2878) | static void janus_videoroom_room_free(const janus_refcount *room_ref) {
  function janus_videoroom_message_free (line 2902) | static void janus_videoroom_message_free(janus_videoroom_message *msg) {
  function janus_videoroom_codecstr (line 2924) | static void janus_videoroom_codecstr(janus_videoroom *videoroom, char *a...
  function janus_videoroom_reqpli (line 2969) | static void janus_videoroom_reqpli(janus_videoroom_publisher_stream *ps,...
  function janus_rtp_forwarder (line 3043) | static janus_rtp_forwarder *janus_videoroom_rtp_forwarder_add_helper(jan...
  function json_t (line 3080) | static json_t *janus_videoroom_rtp_forwarder_summary(janus_rtp_forwarder...
  function janus_videoroom_create_dummy_publisher (line 3125) | static void janus_videoroom_create_dummy_publisher(janus_videoroom *room...
  function janus_videoroom_subscriber_stream (line 3271) | static janus_videoroom_subscriber_stream *janus_videoroom_subscriber_str...
  function janus_videoroom_subscriber_stream (line 3358) | static janus_videoroom_subscriber_stream *janus_videoroom_subscriber_str...
  function janus_videoroom_subscriber_stream_remove (line 3477) | static void janus_videoroom_subscriber_stream_remove(janus_videoroom_sub...
  function json_t (line 3534) | static json_t *janus_videoroom_subscriber_streams_summary(janus_videoroo...
  function json_t (line 3624) | static json_t *janus_videoroom_subscriber_offer(janus_videoroom_subscrib...
  function janus_videoroom_init (line 3701) | int janus_videoroom_init(janus_callbacks *callback, const char *config_p...
  function janus_videoroom_destroy (line 4165) | void janus_videoroom_destroy(void) {
  function janus_videoroom_get_api_compatibility (line 4198) | int janus_videoroom_get_api_compatibility(void) {
  function janus_videoroom_get_version (line 4203) | int janus_videoroom_get_version(void) {
  function janus_videoroom_session (line 4227) | static janus_videoroom_session *janus_videoroom_lookup_session(janus_plu...
  function janus_videoroom_create_session (line 4235) | void janus_videoroom_create_session(janus_plugin_session *handle, int *e...
  function janus_videoroom_publisher (line 4257) | static janus_videoroom_publisher *janus_videoroom_session_get_publisher(...
  function janus_videoroom_publisher (line 4266) | static janus_videoroom_publisher *janus_videoroom_session_get_publisher_...
  function janus_videoroom_subscriber (line 4275) | static janus_videoroom_subscriber *janus_videoroom_session_get_subscribe...
  function janus_videoroom_subscriber (line 4284) | static janus_videoroom_subscriber *janus_videoroom_session_get_subscribe...
  function janus_videoroom_notify_participants (line 4293) | static void janus_videoroom_notify_participants(janus_videoroom_publishe...
  function janus_videoroom_notify_about_publisher (line 4310) | static void janus_videoroom_notify_about_publisher(janus_videoroom_publi...
  function janus_videoroom_participant_joining (line 4429) | static void janus_videoroom_participant_joining(janus_videoroom_publishe...
  function janus_videoroom_leave_or_unpublish (line 4452) | static void janus_videoroom_leave_or_unpublish(janus_videoroom_publisher...
  function janus_videoroom_destroy_session (line 4510) | void janus_videoroom_destroy_session(janus_plugin_session *handle, int *...
  function json_t (line 4577) | json_t *janus_videoroom_query_session(janus_plugin_session *handle) {
  function janus_videoroom_access_room (line 4692) | static int janus_videoroom_access_room(json_t *root, gboolean check_modi...
  function json_t (line 4755) | static json_t *janus_videoroom_process_synchronous_request(janus_videoro...
  type janus_plugin_result (line 8478) | struct janus_plugin_result
  function json_t (line 8581) | json_t *janus_videoroom_handle_admin_message(json_t *message) {
  function janus_videoroom_setup_media (line 8617) | void janus_videoroom_setup_media(janus_plugin_session *handle) {
  function janus_videoroom_incoming_rtp (line 8702) | void janus_videoroom_incoming_rtp(janus_plugin_session *handle, janus_pl...
  function janus_videoroom_incoming_rtp_internal (line 8713) | static void janus_videoroom_incoming_rtp_internal(janus_videoroom_sessio...
  function janus_videoroom_incoming_rtcp (line 8986) | void janus_videoroom_incoming_rtcp(janus_plugin_session *handle, janus_p...
  function janus_videoroom_incoming_data (line 9040) | void janus_videoroom_incoming_data(janus_plugin_session *handle, janus_p...
  function janus_videoroom_incoming_data_internal (line 9051) | static void janus_videoroom_incoming_data_internal(janus_videoroom_sessi...
  function janus_videoroom_data_ready (line 9154) | void janus_videoroom_data_ready(janus_plugin_session *handle) {
  function janus_videoroom_slow_link (line 9167) | void janus_videoroom_slow_link(janus_plugin_session *handle, int mindex,...
  function janus_videoroom_recorder_create (line 9231) | static void janus_videoroom_recorder_create(janus_videoroom_publisher_st...
  function janus_videoroom_recorder_close (line 9289) | static void janus_videoroom_recorder_close(janus_videoroom_publisher *pa...
  function janus_videoroom_hangup_media (line 9305) | void janus_videoroom_hangup_media(janus_plugin_session *handle) {
  function janus_videoroom_hangup_media_internal (line 9326) | static void janus_videoroom_hangup_media_internal(gpointer session_data) {
  function janus_videoroom_relay_rtp_packet (line 13314) | static void janus_videoroom_relay_rtp_packet(gpointer data, gpointer use...
  function janus_videoroom_relay_data_packet (line 13498) | static void janus_videoroom_relay_data_packet(gpointer data, gpointer us...
  function janus_videoroom_rtp_forwarder_rtcp_receive (line 13534) | static void janus_videoroom_rtp_forwarder_rtcp_receive(janus_rtp_forward...
  function janus_videoroom_create_fd (line 13632) | static int janus_videoroom_create_fd(int port, in_addr_t mcast, const ja...
  function janus_videoroom_get_fd_port (line 13787) | static int janus_videoroom_get_fd_port(int fd) {
  type sockaddr_storage (line 13813) | struct sockaddr_storage
  type pollfd (line 13815) | struct pollfd
  type sockaddr (line 13919) | struct sockaddr
  type sockaddr (line 13929) | struct sockaddr
  function janus_videoroom_helper_rtpdata_packet (line 14187) | static void janus_videoroom_helper_rtpdata_packet(gpointer data, gpointe...

FILE: src/plugins/plugin.c
  function janus_plugin_result (line 20) | janus_plugin_result *janus_plugin_result_new(janus_plugin_result_type ty...
  function janus_plugin_result_destroy (line 29) | void janus_plugin_result_destroy(janus_plugin_result *result) {
  function janus_plugin_rtp_extensions_reset (line 39) | void janus_plugin_rtp_extensions_reset(janus_plugin_rtp_extensions *exte...
  function janus_plugin_rtp_reset (line 55) | void janus_plugin_rtp_reset(janus_plugin_rtp *packet) {
  function janus_plugin_rtp (line 62) | janus_plugin_rtp *janus_plugin_rtp_duplicate(janus_plugin_rtp *packet) {
  function janus_plugin_rtcp_reset (line 80) | void janus_plugin_rtcp_reset(janus_plugin_rtcp *packet) {
  function janus_plugin_data_reset (line 86) | void janus_plugin_data_reset(janus_plugin_data *packet) {

FILE: src/plugins/plugin.h
  type janus_callbacks (line 218) | typedef struct janus_callbacks janus_callbacks;
  type janus_plugin (line 220) | typedef struct janus_plugin janus_plugin;
  type janus_plugin_session (line 222) | typedef struct janus_plugin_session janus_plugin_session;
  type janus_plugin_result (line 224) | typedef struct janus_plugin_result janus_plugin_result;
  type janus_plugin_rtp (line 227) | typedef struct janus_plugin_rtp janus_plugin_rtp;
  type janus_plugin_rtp_extensions (line 229) | typedef struct janus_plugin_rtp_extensions janus_plugin_rtp_extensions;
  type janus_plugin_rtcp (line 231) | typedef struct janus_plugin_rtcp janus_plugin_rtcp;
  type janus_plugin_data (line 233) | typedef struct janus_plugin_data janus_plugin_data;
  type json_t (line 236) | typedef struct json_t json_t;
  type janus_plugin_session (line 239) | struct janus_plugin_session {
  type janus_plugin (line 252) | struct janus_plugin {
  type janus_callbacks (line 359) | struct janus_callbacks {
  type janus_plugin (line 445) | typedef janus_plugin* create_p(void);
  type janus_plugin_result_type (line 468) | typedef enum janus_plugin_result_type {
  type janus_plugin_result (line 478) | struct janus_plugin_result {
  type janus_plugin_rtp_extensions (line 562) | struct janus_plugin_rtp_extensions {
  type janus_plugin_rtp (line 596) | struct janus_plugin_rtp {
  type janus_plugin_rtcp (line 628) | struct janus_plugin_rtcp {
  type janus_plugin_data (line 652) | struct janus_plugin_data {

FILE: src/postprocessing/janus-pp-rec.c
  function janus_pp_handle_signal (line 155) | static void janus_pp_handle_signal(int signum) {
  type janus_pp_rtp_skew_context (line 164) | typedef struct janus_pp_rtp_skew_context {
  function gboolean (line 180) | static gboolean janus_pp_extension_check(const char *extension, const ch...
  function main (line 209) | int main(int argc, char *argv[]) {
  function janus_pp_rtp_header_extension_find (line 1568) | static int janus_pp_rtp_header_extension_find(char *buf, int len, int id,
  function janus_pp_rtp_header_extension_parse_audio_level (line 1614) | static int janus_pp_rtp_header_extension_parse_audio_level(char *buf, in...
  function janus_pp_rtp_header_extension_parse_video_orientation (line 1625) | static int janus_pp_rtp_header_extension_parse_video_orientation(char *b...
  function gint (line 1645) | static gint janus_pp_skew_compensate_audio(janus_pp_frame_packet *pkt, j...
  function get_latency (line 1757) | static double get_latency(const janus_pp_frame_packet *tmp, int rate) {
  function get_moving_average_of_latency (line 1765) | static double get_moving_average_of_latency(janus_pp_frame_packet *pkt, ...

FILE: src/postprocessing/mjr2pcap.c
  type mjr2pcap_global_header (line 61) | typedef struct mjr2pcap_global_header {
  type mjr2pcap_packet_header (line 73) | typedef struct mjr2pcap_packet_header {
  type mjr2pcap_ethernet_header (line 81) | typedef struct mjr2pcap_ethernet_header {
  function mjr2pcap_ethernet_header_init (line 86) | static void mjr2pcap_ethernet_header_init(mjr2pcap_ethernet_header *eth) {
  type mjr2pcap_ip_header (line 92) | typedef struct mjr2pcap_ip_header {
  function mjr2pcap_ip_header_init (line 110) | static void mjr2pcap_ip_header_init(mjr2pcap_ip_header *ip, int psize) {
  type mjr2pcap_udp_header (line 131) | typedef struct mjr2pcap_udp_header {
  function mjr2pcap_udp_header_init (line 137) | static void mjr2pcap_udp_header_init(mjr2pcap_udp_header *udp, int psize) {
  function janus_pp_handle_signal (line 146) | static void janus_pp_handle_signal(int signum) {
  function main (line 152) | int main(int argc, char *argv[]) {

FILE: src/postprocessing/pcap2mjr.c
  type pcap2mjr_ethernet_header (line 78) | typedef struct pcap2mjr_ethernet_header {
  function janus_p2m_handle_signal (line 86) | static void janus_p2m_handle_signal(int signum) {
  function main (line 105) | int main(int argc, char *argv[]) {

FILE: src/postprocessing/pp-av1.c
  function janus_pp_av1_create (line 43) | int janus_pp_av1_create(char *destination, char *metadata, gboolean fast...
  function janus_pp_av1_lev128_decode (line 79) | static uint32_t janus_pp_av1_lev128_decode(uint8_t *base, uint16_t maxle...
  function janus_pp_av1_lev128_encode (line 96) | static void janus_pp_av1_lev128_encode(uint32_t value, uint8_t *base, si...
  function janus_pp_av1_getbit (line 110) | static uint32_t janus_pp_av1_getbit(uint8_t *base, uint32_t offset) {
  function janus_pp_av1_getbits (line 113) | static uint32_t janus_pp_av1_getbits(uint8_t *base, uint8_t num, uint32_...
  function janus_pp_av1_parse_sh (line 122) | static void janus_pp_av1_parse_sh(char *buffer, uint16_t *width, uint16_...
  function janus_pp_av1_preprocess (line 207) | int janus_pp_av1_preprocess(FILE *file, janus_pp_frame_packet *list, jso...
  function janus_pp_av1_process (line 351) | int janus_pp_av1_process(FILE *file, janus_pp_frame_packet *list, int *w...
  function janus_pp_av1_close (line 527) | void janus_pp_av1_close(void) {

FILE: src/postprocessing/pp-avformat.c
  function janus_pp_setup_avformat (line 10) | void janus_pp_setup_avformat(void) {
  function AVFormatContext (line 25) | AVFormatContext *janus_pp_create_avformatcontext(const char *format, con...
  function AVStream (line 54) | AVStream *janus_pp_new_audio_avstream(AVFormatContext *fctx, int codec_i...
  function AVStream (line 80) | AVStream *janus_pp_new_video_avstream(AVFormatContext *fctx, int codec_i...

FILE: src/postprocessing/pp-binary.c
  function janus_pp_binary_create (line 31) | int janus_pp_binary_create(char *destination, char *metadata) {
  function janus_pp_binary_process (line 45) | int janus_pp_binary_process(FILE *file, janus_pp_frame_packet *list, int...
  function janus_pp_binary_close (line 85) | void janus_pp_binary_close(void) {

FILE: src/postprocessing/pp-g711.c
  type janus_pp_g711_wav (line 27) | typedef struct janus_pp_g711_wav {
  function janus_pp_g711_create (line 128) | int janus_pp_g711_create(char *destination, char *metadata) {
  function janus_pp_g711_process (line 161) | int janus_pp_g711_process(FILE *file, janus_pp_frame_packet *list, int *...
  function janus_pp_g711_close (line 249) | void janus_pp_g711_close(void) {

FILE: src/postprocessing/pp-g722.c
  type janus_pp_g722_wav (line 32) | typedef struct janus_pp_g722_wav {
  function janus_pp_g722_create (line 58) | int janus_pp_g722_create(char *destination, char *metadata) {
  function janus_pp_g722_close (line 240) | void janus_pp_g722_close(void) {

FILE: src/postprocessing/pp-h264.c
  function janus_pp_h264_create (line 43) | int janus_pp_h264_create(char *destination, char *metadata, gboolean fas...
  function janus_pp_h264_eg_getbit (line 140) | static uint32_t janus_pp_h264_eg_getbit(uint8_t *base, uint32_t offset) {
  function janus_pp_h264_eg_decode (line 144) | static uint32_t janus_pp_h264_eg_decode(uint8_t *base, uint32_t *offset) {
  function janus_pp_h264_parse_sps (line 159) | static void janus_pp_h264_parse_sps(char *buffer, int *width, int *heigh...
  function janus_pp_h264_preprocess (line 237) | int janus_pp_h264_preprocess(FILE *file, janus_pp_frame_packet *list, js...
  function janus_pp_h264_process (line 374) | int janus_pp_h264_process(FILE *file, janus_pp_frame_packet *list, int *...
  function janus_pp_h264_close (line 547) | void janus_pp_h264_close(void) {

FILE: src/postprocessing/pp-h265.c
  function janus_pp_h265_create (line 43) | int janus_pp_h265_create(char *destination, char *metadata, gboolean fas...
  function janus_pp_h265_eg_getbit (line 139) | static uint32_t janus_pp_h265_eg_getbit(uint8_t *base, uint32_t offset) {
  function janus_pp_h265_eg_getbits (line 143) | static uint32_t janus_pp_h265_eg_getbits(uint8_t *base, uint8_t num, uin...
  function janus_pp_h265_eg_decode (line 152) | static uint32_t janus_pp_h265_eg_decode(uint8_t *base, uint32_t *offset) {
  function janus_pp_h265_parse_sps (line 167) | static void janus_pp_h265_parse_sps(char *buffer, int *width, int *heigh...
  function janus_pp_h265_preprocess (line 237) | int janus_pp_h265_preprocess(FILE *file, janus_pp_frame_packet *list, js...
  function janus_pp_h265_process (line 457) | int janus_pp_h265_process(FILE *file, janus_pp_frame_packet *list, int *...
  function janus_pp_h265_close (line 636) | void janus_pp_h265_close(void) {

FILE: src/postprocessing/pp-l16.c
  type janus_pp_l16_wav (line 28) | typedef struct janus_pp_l16_wav {
  function janus_pp_l16_create (line 55) | int janus_pp_l16_create(char *destination, int rate, char *metadata) {
  function janus_pp_l16_process (line 93) | int janus_pp_l16_process(FILE *file, janus_pp_frame_packet *list, int *w...
  function janus_pp_l16_close (line 173) | void janus_pp_l16_close(void) {

FILE: src/postprocessing/pp-options.c
  function gboolean (line 17) | gboolean janus_pprec_options_parse(janus_pprec_options *options, int arg...
  function janus_pprec_options_help (line 64) | void janus_pprec_options_help(void) {
  function janus_pprec_options_destroy (line 73) | void janus_pprec_options_destroy(void) {

FILE: src/postprocessing/pp-options.h
  type janus_pprec_options (line 19) | typedef struct janus_pprec_options {

FILE: src/postprocessing/pp-opus.c
  function janus_pp_opus_create (line 58) | int janus_pp_opus_create(char *destination, char *metadata, gboolean mul...
  function janus_pp_opus_process (line 104) | int janus_pp_opus_process(FILE *file, janus_pp_frame_packet *list, gbool...
  function janus_pp_opus_close (line 367) | void janus_pp_opus_close(void) {

FILE: src/postprocessing/pp-rtp.h
  type janus_pp_rtp_header (line 30) | typedef struct janus_pp_rtp_header
  type janus_pp_rtp_header_extension (line 53) | typedef struct janus_pp_rtp_header_extension {
  type janus_pp_frame_packet (line 58) | typedef struct janus_pp_frame_packet {

FILE: src/postprocessing/pp-srt.c
  function janus_pp_srt_format_time (line 29) | static void janus_pp_srt_format_time(char *buffer, int len, guint64 when) {
  function janus_pp_srt_create (line 48) | int janus_pp_srt_create(char *destination, char *metadata) {
  function janus_pp_srt_process (line 62) | int janus_pp_srt_process(FILE *file, janus_pp_frame_packet *list, int *w...
  function janus_pp_srt_close (line 125) | void janus_pp_srt_close(void) {

FILE: src/postprocessing/pp-webm.c
  function janus_pp_webm_create (line 50) | int janus_pp_webm_create(char *destination, char *metadata, gboolean vp8...
  function janus_pp_webm_preprocess (line 94) | int janus_pp_webm_preprocess(FILE *file, janus_pp_frame_packet *list, gb...
  function janus_pp_webm_process (line 325) | int janus_pp_webm_process(FILE *file, janus_pp_frame_packet *list, gbool...
  function janus_pp_webm_close (line 601) | void janus_pp_webm_close(void) {

FILE: src/record.c
  function janus_recorder_init (line 43) | void janus_recorder_init(gboolean tempnames, const char *extension) {
  function janus_recorder_deinit (line 57) | void janus_recorder_deinit(void) {
  function janus_recorder_free (line 62) | static void janus_recorder_free(const janus_refcount *recorder_ref) {
  function janus_recorder (line 85) | janus_recorder *janus_recorder_create(const char *dir, const char *codec...
  function janus_recorder (line 89) | janus_recorder *janus_recorder_create_full(const char *dir, const char *...
  function janus_recorder_pause (line 260) | int janus_recorder_pause(janus_recorder *recorder) {
  function janus_recorder_resume (line 268) | int janus_recorder_resume(janus_recorder *recorder) {
  function janus_recorder_add_extmap (line 285) | int janus_recorder_add_extmap(janus_recorder *recorder, int id, const ch...
  function janus_recorder_description (line 296) | int janus_recorder_description(janus_recorder *recorder, const char *des...
  function janus_recorder_opusred (line 311) | int janus_recorder_opusred(janus_recorder *recorder, int red_pt) {
  function janus_recorder_encrypted (line 321) | int janus_recorder_encrypted(janus_recorder *recorder) {
  function janus_recorder_save_frame (line 331) | int janus_recorder_save_frame(janus_recorder *recorder, char *buffer, ui...
  function janus_recorder_close (line 486) | int janus_recorder_close(janus_recorder *recorder) {
  function janus_recorder_destroy (line 524) | void janus_recorder_destroy(janus_recorder *recorder) {

FILE: src/record.h
  type janus_recorder_medium (line 34) | typedef enum janus_recorder_medium {
  type janus_recorder (line 41) | typedef struct janus_recorder {

FILE: src/refcount.h
  type janus_refcount (line 77) | typedef struct janus_refcount janus_refcount;
  type janus_refcount (line 78) | struct janus_refcount {

FILE: src/rtcp.c
  type janus_rtp_packet_status (line 27) | typedef enum janus_rtp_packet_status {
  function gboolean (line 45) | gboolean janus_is_rtcp(char *buf, guint len) {
  function janus_rtcp_parse (line 52) | int janus_rtcp_parse(janus_rtcp_context *ctx, char *packet, int len) {
  function guint32 (line 56) | guint32 janus_rtcp_get_sender_ssrc(char *packet, int len) {
  function guint32 (line 108) | guint32 janus_rtcp_get_receiver_ssrc(char *packet, int len) {
  function janus_rtcp_swap_report_blocks (line 173) | void janus_rtcp_swap_report_blocks(char *packet, int len, uint32_t rtx_s...
  function janus_rtcp_incoming_sr (line 226) | static void janus_rtcp_incoming_sr(janus_rtcp_context *ctx, janus_rtcp_s...
  function janus_rtcp_incoming_transport_cc (line 238) | static void janus_rtcp_incoming_transport_cc(janus_rtcp_context *ctx, ja...
  function janus_rtcp_link_quality_filter (line 345) | static double janus_rtcp_link_quality_filter(double last, double in) {
  function janus_rtcp_rr_update_stats (line 355) | static void janus_rtcp_rr_update_stats(rtcp_context *ctx, janus_report_b...
  function janus_rtcp_incoming_rr (line 402) | static void janus_rtcp_incoming_rr(janus_rtcp_context *ctx, janus_rtcp_r...
  function gboolean (line 443) | gboolean janus_rtcp_check_len(janus_rtcp_header *rtcp, int len) {
  function gboolean (line 456) | gboolean janus_rtcp_check_sr(janus_rtcp_header *rtcp, int len) {
  function gboolean (line 470) | gboolean janus_rtcp_check_rr(janus_rtcp_header *rtcp, int len) {
  function gboolean (line 480) | gboolean janus_rtcp_check_fci(janus_rtcp_header *rtcp, int len, int size...
  function gboolean (line 513) | gboolean janus_rtcp_check_remb(janus_rtcp_header *rtcp, int len) {
  function janus_rtcp_fix_ssrc (line 531) | int janus_rtcp_fix_ssrc(janus_rtcp_context *ctx, char *packet, int len, ...
  function janus_rtcp_process_incoming_rtp (line 848) | int janus_rtcp_process_incoming_rtp(janus_rtcp_context *ctx, char *packe...
  function janus_rtcp_context_get_rtt (line 933) | uint32_t janus_rtcp_context_get_rtt(janus_rtcp_context *ctx) {
  function janus_rtcp_context_get_in_link_quality (line 937) | uint32_t janus_rtcp_context_get_in_link_quality(janus_rtcp_context *ctx) {
  function janus_rtcp_context_get_in_media_link_quality (line 941) | uint32_t janus_rtcp_context_get_in_media_link_quality(janus_rtcp_context...
  function janus_rtcp_context_get_out_link_quality (line 945) | uint32_t janus_rtcp_context_get_out_link_quality(janus_rtcp_context *ctx) {
  function janus_rtcp_context_get_out_media_link_quality (line 949) | uint32_t janus_rtcp_context_get_out_media_link_quality(janus_rtcp_contex...
  function janus_rtcp_context_get_lost_all (line 953) | int32_t janus_rtcp_context_get_lost_all(janus_rtcp_context *ctx, gboolea...
  function janus_rtcp_context_get_lost (line 959) | static int32_t janus_rtcp_context_get_lost(janus_rtcp_context *ctx) {
  function janus_rtcp_context_get_lost_fraction (line 973) | static uint32_t janus_rtcp_context_get_lost_fraction(janus_rtcp_context ...
  function janus_rtcp_context_get_jitter (line 987) | uint32_t janus_rtcp_context_get_jitter(janus_rtcp_context *ctx, gboolean...
  function janus_rtcp_estimate_in_link_quality (line 993) | static void janus_rtcp_estimate_in_link_quality(janus_rtcp_context *ctx) {
  function janus_rtcp_report_block (line 1017) | int janus_rtcp_report_block(janus_rtcp_context *ctx, janus_report_block ...
  function janus_rtcp_fix_report_data (line 1048) | int janus_rtcp_fix_report_data(char *packet, int len, uint32_t base_ts, ...
  function gboolean (line 1118) | gboolean janus_rtcp_has_bye(char *packet, int len) {
  function gboolean (line 1145) | gboolean janus_rtcp_has_fir(char *packet, int len) {
  function gboolean (line 1178) | gboolean janus_rtcp_has_pli(char *packet, int len) {
  function janus_rtcp_get_nacks (line 1209) | void janus_rtcp_get_nacks(char *packet, int len, GQueue *nacks_queue) {
  function janus_rtcp_remove_nacks (line 1273) | int janus_rtcp_remove_nacks(char *packet, int len) {
  function janus_rtcp_get_remb (line 1328) | uint32_t janus_rtcp_get_remb(char *packet, int len) {
  function janus_rtcp_cap_remb (line 1372) | int janus_rtcp_cap_remb(char *packet, int len, uint32_t bitrate) {
  function janus_rtcp_sdes_cname (line 1437) | int janus_rtcp_sdes_cname(char *packet, int len, const char *cname, int ...
  function janus_rtcp_remb (line 1464) | int janus_rtcp_remb(char *packet, int len, uint32_t bitrate) {
  function janus_rtcp_remb_ssrcs (line 1469) | int janus_rtcp_remb_ssrcs(char *packet, int len, uint32_t bitrate, uint8...
  function janus_rtcp_fir (line 1514) | int janus_rtcp_fir(char *packet, int len, int *seqnr) {
  function janus_rtcp_pli (line 1536) | int janus_rtcp_pli(char *packet, int len) {
  function janus_rtcp_nacks (line 1550) | int janus_rtcp_nacks(char *packet, int len, GSList *nacks) {
  function janus_rtcp_transport_wide_cc_feedback (line 1594) | int janus_rtcp_transport_wide_cc_feedback(char *packet, size_t size, gui...

FILE: src/rtcp.h
  type rtcp_type (line 31) | typedef enum {
  type rtcp_type (line 42) | typedef rtcp_type janus_rtcp_type;
  type rtcp_header (line 46) | typedef struct rtcp_header
  type rtcp_header (line 61) | typedef rtcp_header janus_rtcp_header;
  type sender_info (line 64) | typedef struct sender_info
  type sender_info (line 72) | typedef sender_info janus_sender_info;
  type report_block (line 75) | typedef struct report_block
  type report_block (line 84) | typedef report_block janus_report_block;
  type rtcp_sr (line 87) | typedef struct rtcp_sr
  type rtcp_sr (line 94) | typedef rtcp_sr janus_rtcp_sr;
  type rtcp_rr (line 97) | typedef struct rtcp_rr
  type rtcp_rr (line 103) | typedef rtcp_rr janus_rtcp_rr;
  type rtcp_sdes_chunk (line 106) | typedef struct rtcp_sdes_chunk
  type rtcp_sdes_chunk (line 110) | typedef rtcp_sdes_chunk janus_rtcp_sdes_chunk;
  type rtcp_sdes_item (line 112) | typedef struct rtcp_sdes_item
  type rtcp_sdes_item (line 118) | typedef rtcp_sdes_item janus_rtcp_sdes_item;
  type rtcp_sdes (line 120) | typedef struct rtcp_sdes
  type rtcp_sdes (line 126) | typedef rtcp_sdes janus_rtcp_sdes;
  type rtcp_bye (line 129) | typedef struct rtcp_bye
  type rtcp_bye (line 134) | typedef rtcp_bye janus_rtcp_bye;
  type rtcp_app (line 137) | typedef struct rtcp_app
  type rtcp_app (line 143) | typedef rtcp_app janus_rtcp_app;
  type rtcp_nack (line 146) | typedef struct rtcp_nack
  type rtcp_nack (line 153) | typedef rtcp_nack janus_rtcp_nack;
  type janus_nack (line 156) | typedef struct janus_nack {
  type rtcp_remb (line 165) | typedef struct rtcp_remb
  type rtcp_remb (line 174) | typedef rtcp_remb janus_rtcp_fb_remb;
  type rtcp_fir (line 178) | typedef struct rtcp_fir
  type rtcp_fir (line 185) | typedef rtcp_fir janus_rtcp_fb_fir;
  type rtcp_fb (line 189) | typedef struct rtcp_fb
  type rtcp_fb (line 200) | typedef rtcp_fb janus_rtcp_fb;
  type extended_report_block (line 203) | typedef struct extended_report_block
  type extended_report_block (line 215) | typedef extended_report_block janus_extended_report_block;
  type rtcp_xr (line 218) | typedef struct rtcp_xr
  type rtcp_xr (line 224) | typedef rtcp_xr janus_rtcp_xr;
  type rtcp_context (line 228) | typedef struct rtcp_context
  type rtcp_context (line 287) | typedef rtcp_context janus_rtcp_context;
  type rtcp_transport_wide_cc_stats (line 290) | typedef struct rtcp_transport_wide_cc_stats
  type rtcp_transport_wide_cc_stats (line 297) | typedef rtcp_transport_wide_cc_stats janus_rtcp_transport_wide_cc_stats;

FILE: src/rtp.c
  type janus_rtp_vla_spatial_layer (line 19) | typedef struct janus_rtp_vla_spatial_layer {
  type janus_rtp_vla_rtp_stream (line 24) | typedef struct janus_rtp_vla_rtp_stream {
  function gboolean (line 31) | gboolean janus_is_rtp(char *buf, guint len) {
  function janus_rtp_header_extension_get_id (line 64) | int janus_rtp_header_extension_get_id(const char *sdp, const char *exten...
  function janus_rtp_header_extension_find (line 145) | static int janus_rtp_header_extension_find(char *buf, int len, int id,
  function janus_rtp_header_extension_parse_audio_level (line 230) | int janus_rtp_header_extension_parse_audio_level(char *buf, int len, int...
  function janus_rtp_header_extension_parse_video_orientation (line 245) | int janus_rtp_header_extension_parse_video_orientation(char *buf, int le...
  function janus_rtp_header_extension_parse_playout_delay (line 267) | int janus_rtp_header_extension_parse_playout_delay(char *buf, int len, i...
  function janus_rtp_header_extension_parse_mid (line 286) | int janus_rtp_header_extension_parse_mid(char *buf, int len, int id,
  function janus_rtp_header_extension_parse_rid (line 307) | int janus_rtp_header_extension_parse_rid(char *buf, int len, int id,
  function janus_rtp_header_extension_parse_dependency_desc (line 329) | int janus_rtp_header_extension_parse_dependency_desc(char *buf, int len,...
  function janus_rtp_header_extension_parse_abs_send_time (line 352) | int janus_rtp_header_extension_parse_abs_send_time(char *buf, int len, i...
  function janus_rtp_header_extension_set_abs_send_time (line 369) | int janus_rtp_header_extension_set_abs_send_time(char *buf, int len, int...
  function janus_rtp_header_extension_parse_abs_capture_time (line 383) | int janus_rtp_header_extension_parse_abs_capture_time(char *buf, int len...
  function janus_rtp_header_extension_set_abs_capture_time (line 400) | int janus_rtp_header_extension_set_abs_capture_time(char *buf, int len, ...
  function janus_rtp_header_extension_parse_transport_wide_cc (line 414) | int janus_rtp_header_extension_parse_transport_wide_cc(char *buf, int le...
  function janus_rtp_header_extension_set_transport_wide_cc (line 434) | int janus_rtp_header_extension_set_transport_wide_cc(char *buf, int len,...
  function janus_rtp_header_extension_parse_video_layers_allocation (line 448) | int janus_rtp_header_extension_parse_video_layers_allocation(char *buf, ...
  function janus_rtp_header_extension_replace_id (line 515) | int janus_rtp_header_extension_replace_id(char *buf, int len, int id, in...
  function janus_rtp_extension_id (line 580) | int janus_rtp_extension_id(const char *type) {
  function janus_rtp_switching_context_reset (line 607) | void janus_rtp_switching_context_reset(janus_rtp_switching_context *cont...
  function janus_rtp_skew_compensate_audio (line 614) | int janus_rtp_skew_compensate_audio(janus_rtp_header *header, janus_rtp_...
  function janus_rtp_skew_compensate_video (line 730) | int janus_rtp_skew_compensate_video(janus_rtp_header *header, janus_rtp_...
  function janus_rtp_header_update (line 844) | void janus_rtp_header_update(janus_rtp_header *header, janus_rtp_switchi...
  function srtp_crypto_get_random (line 907) | int srtp_crypto_get_random(uint8_t *key, int len) {
  function janus_audiocodec (line 1028) | janus_audiocodec janus_audiocodec_from_name(const char *name) {
  function janus_audiocodec_pt (line 1054) | int janus_audiocodec_pt(janus_audiocodec acodec) {
  function janus_videocodec (line 1103) | janus_videocodec janus_videocodec_from_name(const char *name) {
  function janus_videocodec_pt (line 1119) | int janus_videocodec_pt(janus_videocodec vcodec) {
  function janus_rtp_simulcasting_context_reset (line 1139) | void janus_rtp_simulcasting_context_reset(janus_rtp_simulcasting_context...
  function janus_rtp_simulcasting_prepare (line 1153) | void janus_rtp_simulcasting_prepare(json_t *simulcast, int *rid_ext_id, ...
  function janus_rtp_simulcasting_cleanup (line 1183) | void janus_rtp_simulcasting_cleanup(int *rid_ext_id, uint32_t *ssrcs, ch...
  function gboolean (line 1203) | gboolean janus_rtp_simulcasting_context_process_rtp(janus_rtp_simulcasti...
  function janus_rtp_svc_context_reset (line 1433) | void janus_rtp_svc_context_reset(janus_rtp_svc_context *context) {
  function gboolean (line 1443) | gboolean janus_rtp_svc_context_process_rtp(janus_rtp_svc_context *context,
  function janus_av1_svc_context_reset (line 1678) | void janus_av1_svc_context_reset(janus_av1_svc_context *context) {
  function gboolean (line 1687) | gboolean janus_av1_svc_context_process_dd(janus_av1_svc_context *context,

FILE: src/rtp.h
  type rtp_header (line 36) | typedef struct rtp_header
  type rtp_header (line 58) | typedef rtp_header janus_rtp_header;
  type janus_rtp_packet (line 61) | typedef struct janus_rtp_packet {
  type janus_rtp_header_extension (line 71) | typedef struct janus_rtp_header_extension {
  type janus_rtp_rfc2833_payload (line 77) | typedef struct janus_rtp_rfc2833_payload {
  type janus_audiocodec (line 122) | typedef enum janus_audiocodec {
  type janus_videocodec (line 139) | typedef enum janus_videocodec {
  type janus_rtp_switching_context (line 308) | typedef struct janus_rtp_switching_context {
  type janus_av1_svc_context (line 350) | typedef struct janus_av1_svc_context {
  type janus_av1_svc_template (line 366) | typedef struct janus_av1_svc_template {
  type janus_rtp_simulcasting_context (line 398) | typedef struct janus_rtp_simulcasting_context {
  type janus_rtp_svc_context (line 466) | typedef struct janus_rtp_svc_context {

FILE: src/rtpfwd.c
  function janus_rtp_forwarders_init (line 44) | int janus_rtp_forwarders_init(void) {
  function janus_rtp_forwarders_deinit (line 79) | void janus_rtp_forwarders_deinit(void) {
  type janus_rtcp_receiver (line 97) | typedef struct janus_rtcp_receiver {
  function janus_rtp_forwarder_rtcp_receive (line 102) | static void janus_rtp_forwarder_rtcp_receive(janus_rtp_forwarder *rf) {
  function gboolean (line 114) | static gboolean janus_rtp_forwarder_rtcp_prepare(GSource *source, gint *...
  function gboolean (line 118) | static gboolean janus_rtp_forwarder_rtcp_dispatch(GSource *source, GSour...
  function janus_rtp_forwarder_rtcp_finalize (line 125) | static void janus_rtp_forwarder_rtcp_finalize(GSource *source) {
  function janus_rtp_forwarder (line 145) | janus_rtp_forwarder *janus_rtp_forwarder_create(const char *ctx,
  function janus_rtp_forwarder_add_rtcp (line 246) | int janus_rtp_forwarder_add_rtcp(janus_rtp_forwarder *rf, int rtcp_port,
  function janus_rtp_forwarder_send_rtp (line 332) | void janus_rtp_forwarder_send_rtp(janus_rtp_forwarder *rf, char *buffer,...
  function janus_rtp_forwarder_send_rtp_full (line 337) | void janus_rtp_forwarder_send_rtp_full(janus_rtp_forwarder *rf, char *bu...
  function janus_rtp_forwarder_destroy (line 409) | void janus_rtp_forwarder_destroy(janus_rtp_forwarder *rf) {
  function janus_rtp_forwarder_unref (line 426) | static void janus_rtp_forwarder_unref(janus_rtp_forwarder *rf) {
  function janus_rtp_forwarder_free (line 432) | static void janus_rtp_forwarder_free(const janus_refcount *f_ref) {

FILE: src/rtpfwd.h
  type janus_rtp_forwarder (line 30) | typedef struct janus_rtp_forwarder {

FILE: src/rtpsrtp.h
  type janus_srtp_profile (line 52) | typedef enum janus_srtp_profile {

FILE: src/sctp.c
  type janus_sctp_pending_message (line 65) | typedef struct janus_sctp_pending_message {
  function janus_sctp_pending_message (line 71) | static janus_sctp_pending_message *janus_sctp_pending_message_create(uin...
  function janus_sctp_pending_message_free (line 85) | static void janus_sctp_pending_message_free(janus_sctp_pending_message *...
  type socket (line 94) | struct socket
  type sctp_rcvinfo (line 94) | struct sctp_rcvinfo
  type socket (line 99) | struct socket
  type socket (line 100) | struct socket
  type socket (line 101) | struct socket
  type sctp_assoc_change (line 115) | struct sctp_assoc_change
  type sctp_paddr_change (line 116) | struct sctp_paddr_change
  type sctp_adaptation_event (line 117) | struct sctp_adaptation_event
  type sctp_shutdown_event (line 118) | struct sctp_shutdown_event
  type sctp_stream_reset_event (line 119) | struct sctp_stream_reset_event
  type sctp_remote_error (line 120) | struct sctp_remote_error
  type sctp_send_failed_event (line 121) | struct sctp_send_failed_event
  function janus_sctp_init (line 132) | int janus_sctp_init(void) {
  function janus_sctp_deinit (line 150) | void janus_sctp_deinit(void) {
  function janus_sctp_association_unref (line 158) | static void janus_sctp_association_unref(janus_sctp_association *sctp) {
  function janus_sctp_association_free (line 163) | static void janus_sctp_association_free(const janus_refcount *sctp_ref) {
  function janus_sctp_association (line 180) | janus_sctp_association *janus_sctp_association_create(janus_dtls_srtp *d...
  function janus_sctp_association_destroy (line 357) | void janus_sctp_association_destroy(janus_sctp_association *sctp) {
  function janus_sctp_data_from_dtls (line 374) | void janus_sctp_data_from_dtls(janus_sctp_association *sctp, char *buf, ...
  function janus_sctp_data_to_dtls (line 392) | int janus_sctp_data_to_dtls(void *instance, void *buffer, size_t length,...
  function janus_sctp_incoming_data (line 414) | static int janus_sctp_incoming_data(struct socket *sock, union sctp_sock...
  function janus_sctp_send_data (line 433) | void janus_sctp_send_data(janus_sctp_association *sctp, char *label, cha...
  function janus_sctp_channel (line 500) | janus_sctp_channel *janus_sctp_find_channel_by_stream(janus_sctp_associa...
  function janus_sctp_channel (line 510) | janus_sctp_channel *janus_sctp_find_free_channel(janus_sctp_association ...
  function janus_sctp_find_free_stream (line 525) | uint16_t janus_sctp_find_free_stream(janus_sctp_association *sctp) {
  function janus_sctp_request_more_streams (line 553) | void janus_sctp_request_more_streams(janus_sctp_association *sctp) {
  function janus_sctp_send_open_request_message (line 586) | int janus_sctp_send_open_request_message(struct socket *sock, uint16_t s...
  function janus_sctp_send_open_response_message (line 646) | int janus_sctp_send_open_response_message(struct socket *sock, uint16_t ...
  function janus_sctp_send_open_ack_message (line 672) | int janus_sctp_send_open_ack_message(struct socket *sock, uint16_t strea...
  function janus_sctp_send_deferred_messages (line 695) | void janus_sctp_send_deferred_messages(janus_sctp_association *sctp) {
  function janus_sctp_open_channel (line 733) | int janus_sctp_open_channel(janus_sctp_association *sctp, char *label, c...
  function janus_sctp_send_text_or_binary (line 789) | int janus_sctp_send_text_or_binary(janus_sctp_association *sctp, uint16_...
  function janus_sctp_reset_outgoing_stream (line 834) | void janus_sctp_reset_outgoing_stream(janus_sctp_association *sctp, uint...
  function janus_sctp_send_outgoing_stream_reset (line 846) | void janus_sctp_send_outgoing_stream_reset(janus_sctp_association *sctp) {
  function janus_sctp_close_channel (line 874) | int janus_sctp_close_channel(janus_sctp_association *sctp, uint16_t id) {
  function janus_sctp_data_ready (line 890) | void janus_sctp_data_ready(janus_sctp_association *sctp) {
  function janus_sctp_handle_open_request_message (line 913) | void janus_sctp_handle_open_request_message(janus_sctp_association *sctp...
  function janus_sctp_handle_open_response_message (line 1017) | void janus_sctp_handle_open_response_message(janus_sctp_association *sct...
  function janus_sctp_handle_open_ack_message (line 1047) | void janus_sctp_handle_open_ack_message(janus_sctp_association *sctp, ja...
  function janus_sctp_handle_unknown_message (line 1067) | void janus_sctp_handle_unknown_message(char *msg, size_t length, uint16_...
  function janus_sctp_handle_data_message (line 1072) | void janus_sctp_handle_data_message(janus_sctp_association *sctp, gboole...
  function janus_sctp_handle_message (line 1104) | void janus_sctp_handle_message(janus_sctp_association *sctp, char *buffe...
  function janus_sctp_handle_association_change_event (line 1181) | void janus_sctp_handle_association_change_event(struct sctp_assoc_change...
  function janus_sctp_handle_peer_address_change_event (line 1249) | void janus_sctp_handle_peer_address_change_event(struct sctp_paddr_chang...
  function janus_sctp_handle_adaptation_indication (line 1297) | void janus_sctp_handle_adaptation_indication(struct sctp_adaptation_even...
  function janus_sctp_handle_shutdown_event (line 1302) | void janus_sctp_handle_shutdown_event(struct sctp_shutdown_event *sse) {
  function janus_sctp_handle_stream_reset_event (line 1308) | void janus_sctp_handle_stream_reset_event(janus_sctp_association *sctp, ...
  function janus_sctp_handle_remote_error_event (line 1361) | void janus_sctp_handle_remote_error_event(struct sctp_remote_error *sre) {
  function janus_sctp_handle_send_failed_event (line 1373) | void janus_sctp_handle_send_failed_event(struct sctp_send_failed_event *...
  function janus_sctp_handle_notification (line 1396) | void janus_sctp_handle_notification(janus_sctp_association *sctp, union ...

FILE: src/sctp.h
  type janus_dtls_srtp (line 77) | struct janus_dtls_srtp
  type janus_ice_handle (line 78) | struct janus_ice_handle
  type janus_sctp_channel (line 80) | typedef struct janus_sctp_channel {
  type janus_sctp_association (line 101) | typedef struct janus_sctp_association {
  type janus_datachannel_open_request (line 156) | typedef struct janus_datachannel_open_request {
  type janus_datachannel_open_response (line 174) | typedef struct janus_datachannel_open_response {
  type janus_datachannel_ack (line 185) | typedef struct janus_datachannel_ack {
  type janus_dtls_srtp (line 197) | struct janus_dtls_srtp
  type janus_ice_handle (line 197) | struct janus_ice_handle

FILE: src/sdp-utils.c
  function janus_sdp_destroy (line 33) | void janus_sdp_destroy(janus_sdp *sdp) {
  function janus_sdp_mline_destroy (line 39) | void janus_sdp_mline_destroy(janus_sdp_mline *m) {
  function janus_sdp_attribute_destroy (line 45) | void janus_sdp_attribute_destroy(janus_sdp_attribute *a) {
  function janus_sdp_free (line 52) | static void janus_sdp_free(const janus_refcount *sdp_ref) {
  function janus_sdp_mline_free (line 78) | static void janus_sdp_mline_free(const janus_refcount *mline_ref) {
  function janus_sdp_attribute_free (line 99) | static void janus_sdp_attribute_free(const janus_refcount *attr_ref) {
  function janus_sdp_mline (line 109) | janus_sdp_mline *janus_sdp_mline_create(janus_sdp_mtype type, guint16 po...
  function janus_sdp_mline (line 126) | janus_sdp_mline *janus_sdp_mline_find(janus_sdp *sdp, janus_sdp_mtype ty...
  function janus_sdp_mline (line 139) | janus_sdp_mline *janus_sdp_mline_find_by_index(janus_sdp *sdp, int index) {
  function janus_sdp_mline_remove (line 152) | int janus_sdp_mline_remove(janus_sdp *sdp, janus_sdp_mtype type) {
  function janus_sdp_attribute (line 170) | janus_sdp_attribute *janus_sdp_attribute_create(const char *name, const ...
  function janus_sdp_attribute_add_to_mline (line 190) | int janus_sdp_attribute_add_to_mline(janus_sdp_mline *mline, janus_sdp_a...
  function janus_sdp_mtype (line 197) | janus_sdp_mtype janus_sdp_parse_mtype(const char *type) {
  function janus_sdp_mdirection (line 224) | janus_sdp_mdirection janus_sdp_parse_mdirection(const char *direction) {
  function janus_sdp (line 298) | janus_sdp *janus_sdp_parse(const char *sdp, char *error, size_t errlen) {
  function janus_sdp_remove_payload_type (line 680) | int janus_sdp_remove_payload_type(janus_sdp *sdp, int index, int pt) {
  function janus_sdp_get_codec_pt (line 711) | int janus_sdp_get_codec_pt(janus_sdp *sdp, int index, const char *codec) {
  function janus_sdp_get_codec_pt_full (line 715) | int janus_sdp_get_codec_pt_full(janus_sdp *sdp, int index, const char *c...
  function janus_sdp_get_opusred_pt (line 1086) | int janus_sdp_get_opusred_pt(janus_sdp *sdp, int index) {
  function janus_sdp_find_preferred_codec (line 1250) | void janus_sdp_find_preferred_codec(janus_sdp *sdp, janus_sdp_mtype type...
  function janus_sdp_find_first_codec (line 1282) | void janus_sdp_find_first_codec(janus_sdp *sdp, janus_sdp_mtype type, in...
  function janus_sdp (line 1333) | janus_sdp *janus_sdp_new(const char *name, const char *address) {
  function janus_sdp_id_compare (line 1355) | static int janus_sdp_id_compare(gconstpointer a, gconstpointer b) {
  function janus_sdp (line 1358) | janus_sdp *janus_sdp_generate_offer(const char *name, const char *addres...
  function janus_sdp_generate_offer_mline (line 1572) | int janus_sdp_generate_offer_mline(janus_sdp *offer, ...) {
  function janus_sdp (line 1861) | janus_sdp *janus_sdp_generate_answer(janus_sdp *offer) {
  function janus_sdp_generate_answer_mline (line 1920) | int janus_sdp_generate_answer_mline(janus_sdp *offer, janus_sdp *answer,...

FILE: src/sdp-utils.h
  type janus_sdp (line 26) | typedef struct janus_sdp {
  type janus_sdp_mtype (line 60) | typedef enum janus_sdp_mtype {
  type janus_sdp_mdirection (line 80) | typedef enum janus_sdp_mdirection {
  type janus_sdp_mline (line 131) | typedef struct janus_sdp_mline {
  type janus_sdp_attribute (line 198) | typedef struct janus_sdp_attribute {
  type janus_sdp_oa_type (line 257) | typedef enum janus_sdp_oa_type {

FILE: src/sdp.c
  function janus_sdp (line 33) | janus_sdp *janus_sdp_preparse(void *ice_handle, const char *jsep_sdp, ch...
  function janus_sdp_process_remote (line 146) | int janus_sdp_process_remote(void *ice_handle, janus_sdp *remote_sdp, gb...
  function janus_sdp_process_local (line 757) | int janus_sdp_process_local(void *ice_handle, janus_sdp *remote_sdp, gbo...
  type janus_sdp_mdns_candidate (line 918) | typedef struct janus_sdp_mdns_candidate {
  function janus_sdp_mdns_resolved (line 923) | static void janus_sdp_mdns_resolved(GObject *source_object, GAsyncResult...
  function janus_sdp_parse_candidate (line 963) | int janus_sdp_parse_candidate(void *ice_pc, const char *candidate, int t...
  function janus_sdp_parse_ssrc_group (line 1192) | int janus_sdp_parse_ssrc_group(void *m, const char *group_attr, int vide...
  function janus_sdp_parse_ssrc (line 1288) | int janus_sdp_parse_ssrc(void *m, const char *ssrc_attr, int video) {
  function janus_sdp_anonymize (line 1315) | int janus_sdp_anonymize(janus_sdp *anon) {

FILE: src/text2pcap.c
  type janus_text2pcap_global_header (line 71) | typedef struct janus_text2pcap_global_header {
  type janus_text2pcap_packet_heade
Condensed preview — 457 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (8,665K chars).
[
  {
    "path": ".editorconfig",
    "chars": 85,
    "preview": "root = true\n\n[*]\nend_of_line = lf\nindent_style = tab\ntrim_trailing_whitespace = true\n"
  },
  {
    "path": ".gitattributes",
    "chars": 15,
    "preview": "*.mulaw binary\n"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "chars": 1414,
    "preview": "Contributing to Janus\n=====================\n\nIf you really want to help, then first of all, thank you! Janus is a\nprojec"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 202,
    "preview": "blank_issues_enabled: false\ncontact_links:\n- name: 💬 Janus Community (Discourse)\n  url: https://janus.discourse.group/\n "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/janus-0-x-issue--legacy-.md",
    "chars": 1067,
    "preview": "---\nname: Janus 0.x issue (legacy)\nabout: Open an issue related to Janus 0.x (legacy)\ntitle: \"[0.x]\"\nlabels: legacy\nassi"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/janus-1-x-issue--multistream-.md",
    "chars": 1075,
    "preview": "---\nname: Janus 1.x issue (multistream)\nabout: Open an issue related to Janus 1.x (multistream)\ntitle: \"[1.x]\"\nlabels: m"
  },
  {
    "path": ".github/workflows/janus-ci.yml",
    "chars": 7238,
    "preview": "name: janus-ci\n\non:\n  push:\n    branches:\n      - master\n      - test-ci\n  pull_request:\n    branches:\n      - master\npe"
  },
  {
    "path": ".gitignore",
    "chars": 962,
    "preview": "cmdline.c\ncmdline.h\nversion.c\ndocs/html/\njanus-gateway.pc\n\njanus\njanus-cfgconv\njanus-pp-rec\nmjr2pcap\npcap2mjr\n*.so\n\nMake"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 103022,
    "preview": "# Changelog\n\nAll notable changes to this project will be documented in this file.\n\n\n## [v1.4.0] - 2026-02-06\n\n- Generate"
  },
  {
    "path": "COPYING",
    "chars": 35695,
    "preview": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
  },
  {
    "path": "Makefile.am",
    "chars": 2834,
    "preview": "ACLOCAL_AMFLAGS = -I m4\n\n# FIXME: These should be enabled once the code is safe for them. That requires\n# some fairly bi"
  },
  {
    "path": "README.md",
    "chars": 23744,
    "preview": "Janus WebRTC Server\n===================\n[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-brightgreen.svg)]"
  },
  {
    "path": "SECURITY.md",
    "chars": 1020,
    "preview": "# Security Policy\n\n## Supported Versions\n\nNotice that, while there are multiple versions of Janus, they're simply\ntagged"
  },
  {
    "path": "autogen.sh",
    "chars": 124,
    "preview": "#!/bin/sh\n\nsrcdir=`dirname $0`\ntest -z \"$srcdir\" && srcdir=.\n\nmkdir -p m4\n\nautoreconf --verbose --force --install || exi"
  },
  {
    "path": "bower.json",
    "chars": 984,
    "preview": "{\n  \"name\": \"janus-gateway\",\n  \"version\": \"1.4.1\",\n  \"homepage\": \"https://github.com/meetecho/janus-gateway\",\n  \"authors"
  },
  {
    "path": "conf/janus.eventhandler.gelfevh.jcfg.sample",
    "chars": 1062,
    "preview": "# This configures the GELF event handler. Appending necessary headers \n# and sending messages via TCP or UDP\n\ngeneral: {"
  },
  {
    "path": "conf/janus.eventhandler.mqttevh.jcfg.sample",
    "chars": 2855,
    "preview": "# This configures the MQTT event handler. Events are sent either on\n# one topic or on a topic per event type.\n#\n# By def"
  },
  {
    "path": "conf/janus.eventhandler.nanomsgevh.jcfg.sample",
    "chars": 1699,
    "preview": "# This configures the Nanomsg event handler. Since this plugin only\n# forwards each event it receives via Nanomsg, you s"
  },
  {
    "path": "conf/janus.eventhandler.rabbitmqevh.jcfg.sample",
    "chars": 1964,
    "preview": "# This configures the RabbitMQ event handler.\n\ngeneral: {\n\tenabled = false\t\t\t\t\t# By default the module is not enabled\n\te"
  },
  {
    "path": "conf/janus.eventhandler.sampleevh.jcfg.sample",
    "chars": 2307,
    "preview": "# This configures the sample event handler. Since this plugin simply\n# forwards each event it receives via HTTP POST, yo"
  },
  {
    "path": "conf/janus.eventhandler.wsevh.jcfg.sample",
    "chars": 2902,
    "preview": "# This configures the WebSockets event handler. Since this plugin only\n# forwards each event it receives via WebSockets,"
  },
  {
    "path": "conf/janus.jcfg.sample.in",
    "chars": 24911,
    "preview": "# General configuration: folders where the configuration and the plugins\n# can be found, how output should be logged, wh"
  },
  {
    "path": "conf/janus.logger.jsonlog.jcfg.sample",
    "chars": 756,
    "preview": "# This configures the JSON-based file logger. This is a very simple logger\n# with no particular advantage over the exist"
  },
  {
    "path": "conf/janus.plugin.audiobridge.jcfg.sample",
    "chars": 5271,
    "preview": "# room-<unique room ID>: {\n# description = \"This is my awesome room\"\n# is_private = true|false (whether this room should"
  },
  {
    "path": "conf/janus.plugin.duktape.jcfg.sample.in",
    "chars": 1096,
    "preview": "# The only things you configure in here are which JavaScipt file to load and,\n# optionally, the paths to add for searchi"
  },
  {
    "path": "conf/janus.plugin.echotest.jcfg.sample",
    "chars": 102,
    "preview": "# events = true|false, whether events should be sent to event handlers\n\ngeneral: {\n\t#events = false\n}\n"
  },
  {
    "path": "conf/janus.plugin.lua.jcfg.sample.in",
    "chars": 1083,
    "preview": "# The only things you configure in here are which lua script to load and,\n# optionally, the paths to add for searching l"
  },
  {
    "path": "conf/janus.plugin.nosip.jcfg.sample",
    "chars": 826,
    "preview": "general: {\n\t# Specify which local IP address to bind to for media.\n\t# If not set it will be automatically guessed from t"
  },
  {
    "path": "conf/janus.plugin.recordplay.jcfg.sample.in",
    "chars": 593,
    "preview": "# path = where to place recordings in the file system\n# admin_key = plugin management secret; if set, private recordings"
  },
  {
    "path": "conf/janus.plugin.sip.jcfg.sample",
    "chars": 2089,
    "preview": "general: {\n\t# Specify which local IP address to bind to for SIP stack.\n\t# If not set it will be automatically guessed fr"
  },
  {
    "path": "conf/janus.plugin.streaming.jcfg.sample.in",
    "chars": 18591,
    "preview": "# You can configure static mountpoints that should be made available\n# when Janus starts in this configuration file. The"
  },
  {
    "path": "conf/janus.plugin.textroom.jcfg.sample",
    "chars": 1220,
    "preview": "# room-<unique room ID>: {\n# description = This is my awesome room\n# is_private = true|false (whether this room should b"
  },
  {
    "path": "conf/janus.plugin.videocall.jcfg.sample",
    "chars": 102,
    "preview": "# events = true|false, whether events should be sent to event handlers\n\ngeneral: {\n\t#events = false\n}\n"
  },
  {
    "path": "conf/janus.plugin.videoroom.jcfg.sample",
    "chars": 5414,
    "preview": "# room-<unique room ID>: {\n# description = This is my awesome room\n# is_private = true|false (whether this room should b"
  },
  {
    "path": "conf/janus.transport.http.jcfg.sample",
    "chars": 5032,
    "preview": "# Web server stuff: whether any should be enabled, which ports they\n# should use, whether security should be handled dir"
  },
  {
    "path": "conf/janus.transport.mqtt.jcfg.sample",
    "chars": 2894,
    "preview": "# Configuration of the MQTT additional transport for the Janus API.\ngeneral: {\n\tenabled = false\t\t\t\t\t\t# Whether the suppo"
  },
  {
    "path": "conf/janus.transport.nanomsg.jcfg.sample",
    "chars": 1478,
    "preview": "# You can also control a Janus instance using Nanomsg sockets. The only\n# aspect you need to configure here is the addre"
  },
  {
    "path": "conf/janus.transport.pfunix.jcfg.sample",
    "chars": 1198,
    "preview": "# You can also control a Janus instance using Unix Sockets. The only\n# aspect you need to configure here is the path of "
  },
  {
    "path": "conf/janus.transport.rabbitmq.jcfg.sample",
    "chars": 4913,
    "preview": "# Configuration of the RabbitMQ additional transport for the Janus API.\n# This is only useful when you're wrapping Janus"
  },
  {
    "path": "conf/janus.transport.websockets.jcfg.sample",
    "chars": 4583,
    "preview": "# WebSockets stuff: whether they should be enabled, which ports they\n# should use, and so on.\ngeneral: {\n\t#events = true"
  },
  {
    "path": "configure.ac",
    "chars": 43478,
    "preview": "AC_INIT([Janus WebRTC Server],[1.4.1],[https://github.com/meetecho/janus-gateway],[janus-gateway],[https://janus.conf.me"
  },
  {
    "path": "docs/Makefile.am",
    "chars": 553,
    "preview": "if ENABLE_DOCS\n\ndoxygendir = $(htmldir)/janus-gateway-$(VERSION)\n\nEXTRA_DIST = html\n\nall: html-local\n\nhtml-local:\n\tdoxyg"
  },
  {
    "path": "docs/doxy-boot.js",
    "chars": 3320,
    "preview": "$(document).ready(function() {\n\n\t$(\"div.headertitle\").addClass(\"pb-2 mt-4 mb-2 border-bottom\");\n\t$(\"div.title\").addClass"
  },
  {
    "path": "docs/footer.html",
    "chars": 644,
    "preview": "<!-- HTML footer for doxygen 1.8.18-->\n<!-- start footer part -->\n<!--BEGIN GENERATE_TREEVIEW-->\n<div id=\"nav-path\" clas"
  },
  {
    "path": "docs/header.html",
    "chars": 2937,
    "preview": "<!-- HTML header for doxygen 1.8.18-->\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"https://www.w3.or"
  },
  {
    "path": "docs/janus-doxygen.cfg",
    "chars": 109992,
    "preview": "# Doxyfile 1.8.18\n\n# This file describes the settings to be used by the documentation system\n# doxygen (www.doxygen.org)"
  },
  {
    "path": "emacs.el",
    "chars": 574,
    "preview": ";; Include this in your ~/.emacs file for editing Janus code in Emacs.\n\n;; Run \"M-x janus-mode\" to set the coding style "
  },
  {
    "path": "eslint.config.mjs",
    "chars": 717,
    "preview": "import globals from 'globals';\nimport js from '@eslint/js';\nimport html from 'eslint-plugin-html'\n\nexport default [\n\t{\n\t"
  },
  {
    "path": "fuzzers/build.sh",
    "chars": 3410,
    "preview": "#!/bin/bash -eu\n\n# Load script configuration\nsource $(dirname $0)/config.sh\n\n# Set fuzzing environment\n# Fallback to loc"
  },
  {
    "path": "fuzzers/config.sh",
    "chars": 1575,
    "preview": "#!/bin/bash\n\nSCRIPTPATH=\"$( cd \"$(dirname \"$0\")\" ; pwd -P )\"\n\n# Default environment\nDEFAULT_ENV=\"local\"\n\n# Working paths"
  },
  {
    "path": "fuzzers/corpora/rtcp_fuzzer/2webrtc/47.rtcp",
    "chars": 1,
    "preview": "€"
  },
  {
    "path": "fuzzers/corpora/rtcp_fuzzer/2webrtc/55.rtcp",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "fuzzers/corpora/rtcp_fuzzer/2webrtc/LICENSE",
    "chars": 1506,
    "preview": "Copyright (c) 2011, The WebRTC project authors. All rights reserved.\nRedistribution and use in source and binary forms, "
  },
  {
    "path": "fuzzers/corpora/rtp_fuzzer/1meetecho/rtp_fuzzer-crash-7e2d460edd5d5d7f5548922f10489f468d1638bf",
    "chars": 44,
    "preview": "(print_fusDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/1meetecho/sdp_fuzzer-timeout-26f23f1364a16565e2f339c3297f71c275b6b0cf",
    "chars": 1042823,
    "preview": "v=0\ns=~\no=R -32767-4INIP4 \na=d\na=Y\na=d\na=d\na=d\na=0\na=d\na=d\na=d\na=d\na=d\na=dd\na=d\na=d\na=d\na=d\na=d\na=d\na=d\na=d\na=d\na=d\na=d\n"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/1meetecho/sdp_fuzzer-timeout-80e8c427e72e9f33f02c8a088caab69d9d97702c",
    "chars": 54791,
    "preview": "v=0.t\nm=audio 9 UDP/T                                                                                                   "
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/10.sdp",
    "chars": 248,
    "preview": "v=0\no=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com\ns=\nc=IN IP4 host.atlanta.example.com\nt=0 0\nm=audio 491"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/11.sdp",
    "chars": 221,
    "preview": "v=0\no=bob 2808844564 2808844564 IN IP4 host.biloxi.example.com\ns=\nc=IN IP4 host.biloxi.example.com\nt=0 0\nm=audio 49172 R"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/12.sdp",
    "chars": 204,
    "preview": "v=0\no=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com\ns=\nc=IN IP4 host.atlanta.example.com\nt=0 0\nm=audio 491"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/13.sdp",
    "chars": 200,
    "preview": "v=0\no=bob 2808844564 2808844564 IN IP4 host.biloxi.example.com\ns=\nc=IN IP4 host.biloxi.example.com\nt=0 0\nm=audio 49174 R"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/14.sdp",
    "chars": 203,
    "preview": "v=0\no=bob 2808844564 2808844565 IN IP4 host.biloxi.example.com\ns=\nc=IN IP4 newhost.biloxi.example.com\nt=0 0\nm=audio 4917"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/15.sdp",
    "chars": 204,
    "preview": "v=0\no=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com\ns=\nc=IN IP4 host.atlanta.example.com\nt=0 0\nm=audio 491"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/16.sdp",
    "chars": 239,
    "preview": "v=0\no=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com\ns=\nc=IN IP4 host.atlanta.example.com\nt=0 0\nm=audio 491"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/17.sdp",
    "chars": 231,
    "preview": "v=0\no=bob 2808844564 2808844564 IN IP4 host.biloxi.example.com\ns=\nc=IN IP4 host.biloxi.example.com\nt=0 0\nm=audio 0 RTP/A"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/18.sdp",
    "chars": 204,
    "preview": "v=0\no=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com\ns=\nc=IN IP4 host.atlanta.example.com\nt=0 0\nm=audio 491"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/19.sdp",
    "chars": 200,
    "preview": "v=0\no=bob 2808844564 2808844564 IN IP4 host.biloxi.example.com\ns=\nc=IN IP4 host.biloxi.example.com\nt=0 0\nm=audio 49172 R"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/2.sdp",
    "chars": 275,
    "preview": "v=0\no=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com\ns=\nc=IN IP4 host.atlanta.example.com\nt=0 0\nm=audio 491"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/20.sdp",
    "chars": 229,
    "preview": "v=0\no=alice 2890844526 2890844527 IN IP4 host.atlanta.example.com\ns=\nc=IN IP4 host.atlanta.example.com\nt=0 0\nm=audio 491"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/21.sdp",
    "chars": 225,
    "preview": "v=0\no=bob 2808844564 2808844565 IN IP4 host.biloxi.example.com\ns=\nc=IN IP4 host.biloxi.example.com\nt=0 0\nm=audio 49172 R"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/22.sdp",
    "chars": 275,
    "preview": "v=0\no=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com\ns=\nc=IN IP4 host.atlanta.example.com\nt=0 0\nm=audio 491"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/23.sdp",
    "chars": 235,
    "preview": "v=0\no=bob 2808844564 2808844564 IN IP4 host.biloxi.example.com\ns=\nc=IN IP4 host.biloxi.example.com\nt=0 0\nm=audio 49174 R"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/24.sdp",
    "chars": 179,
    "preview": "v=0\no=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com\ns=\nc=IN IP4 host.atlanta.example.com\nt=0 0\nm=audio 491"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/25.sdp",
    "chars": 170,
    "preview": "v=0\no=bob 2808844564 2808844564 IN IP4 host.biloxi.example.com\ns=\nc=IN IP4 placeholder.biloxi.example.com\nt=0 0\nm=audio "
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/26.sdp",
    "chars": 152,
    "preview": "v=0\no=bob 2808844564 2808844565 IN IP4 host.biloxi.example.com\ns=\nc=IN IP4 host.biloxi.example.com\nt=0 0\nm=audio 49170 R"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/27.sdp",
    "chars": 156,
    "preview": "v=0\no=alice 2890844526 2890844527 IN IP4 host.atlanta.example.com\ns=\nc=IN IP4 host.atlanta.example.com\nt=0 0\nm=audio 491"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/28.sdp",
    "chars": 248,
    "preview": "v=0\no=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com\ns=\nc=IN IP4 host.atlanta.example.com\nt=0 0\nm=audio 491"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/29.sdp",
    "chars": 221,
    "preview": "v=0\no=bob 2808844564 2808844564 IN IP4 host.biloxi.example.com\ns=\nc=IN IP4 host.biloxi.example.com\nt=0 0\nm=audio 49172 R"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/3.sdp",
    "chars": 197,
    "preview": "v=0\no=bob 2808844564 2808844564 IN IP4 host.biloxi.example.com\ns=\nc=IN IP4 host.biloxi.example.com\nt=0 0\nm=audio 49174 R"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/30.sdp",
    "chars": 232,
    "preview": "v=0\no=bob 2808844564 2808844565 IN IP4 host.biloxi.example.com\ns=\nc=IN IP4 host.biloxi.example.com\nt=0 0\nm=audio 49172 R"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/31.sdp",
    "chars": 248,
    "preview": "v=0\no=alice 2890844526 2890844527 IN IP4 host.atlanta.example.com\ns=\nc=IN IP4 host.atlanta.example.com\nt=0 0\nm=audio 491"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/32.sdp",
    "chars": 179,
    "preview": "v=0\no=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com\ns=\nc=IN IP4 host.atlanta.example.com\nt=0 0\nm=audio 491"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/33.sdp",
    "chars": 152,
    "preview": "v=0\no=bob 2808844564 2808844564 IN IP4 host.biloxi.example.com\ns=\nc=IN IP4 host.biloxi.example.com\nt=0 0\nm=audio 49170 R"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/34.sdp",
    "chars": 261,
    "preview": "v=0\no=bob 2808844564 2808844565 IN IP4 host.biloxi.example.com\ns=\nc=IN IP4 host.biloxi.example.com\nt=0 0\nm=audio 49170 R"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/35.sdp",
    "chars": 259,
    "preview": "v=0\no=alice 2890844526 2890844527 IN IP4 host.atlanta.example.com\ns=\nc=IN IP4 host.atlanta.example.com\nt=0 0\nm=audio 491"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/36.sdp",
    "chars": 154,
    "preview": "v=0\no=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com\ns=\nc=IN IP4 host.atlanta.example.com\nt=0 0\nm=audio 491"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/37.sdp",
    "chars": 150,
    "preview": "v=0\no=bob 2808844564 2808844564 IN IP4 host.biloxi.example.com\ns=\nc=IN IP4 host.biloxi.example.com\nt=0 0\nm=audio 49172 R"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/38.sdp",
    "chars": 202,
    "preview": "v=0\no=alice 2890844526 2890844527 IN IP4 host.atlanta.example.com\ns=\nc=IN IP4 host.atlanta.example.com\nt=0 0\nm=audio 491"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/39.sdp",
    "chars": 198,
    "preview": "v=0\no=bob 2808844564 2808844565 IN IP4 host.biloxi.example.com\ns=\nc=IN IP4 host.biloxi.example.com\nt=0 0\nm=audio 49172 R"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/4.sdp",
    "chars": 275,
    "preview": "v=0\no=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com\ns=\nc=IN IP4 host.atlanta.example.com\nt=0 0\nm=audio 491"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/40.sdp",
    "chars": 204,
    "preview": "v=0\no=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com\ns=\nc=IN IP4 host.atlanta.example.com\nt=0 0\nm=audio 491"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/41.sdp",
    "chars": 200,
    "preview": "v=0\no=bob 2808844564 2808844564 IN IP4 host.biloxi.example.com\ns=\nc=IN IP4 host.biloxi.example.com\nt=0 0\nm=audio 49174 R"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/42.sdp",
    "chars": 196,
    "preview": "v=0\no=bob 2808844564 2808844565 IN IP4 host.biloxi.example.com\ns=\nc=IN IP4 host.biloxi.example.com\nt=0 0\nm=audio 49174 R"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/43.sdp",
    "chars": 200,
    "preview": "v=0\no=alice 2890844526 2890844527 IN IP4 host.atlanta.example.com\ns=\nc=IN IP4 host.atlanta.example.com\nt=0 0\nm=audio 491"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/44.sdp",
    "chars": 109,
    "preview": "v=0\no=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com\ns=\nc=IN IP4 host.atlanta.example.com\nt=0 0\n"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/45.sdp",
    "chars": 105,
    "preview": "v=0\no=bob 2808844564 2808844564 IN IP4 host.biloxi.example.com\ns=\nc=IN IP4 host.biloxi.example.com\nt=0 0\n"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/46.sdp",
    "chars": 156,
    "preview": "v=0\no=alice 2890844526 2890844527 IN IP4 host.atlanta.example.com\ns=\nc=IN IP4 host.atlanta.example.com\nt=0 0\nm=audio 491"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/47.sdp",
    "chars": 152,
    "preview": "v=0\no=bob 2808844564 2808844565 IN IP4 host.biloxi.example.com\ns=\nc=IN IP4 host.biloxi.example.com\nt=0 0\nm=audio 49172 R"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/48.sdp",
    "chars": 139,
    "preview": "v=0\no=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com\ns=\nc=IN IP4 0.0.0.0\nt=0 0\nm=audio 23442 RTP/AVP 97\na=r"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/49.sdp",
    "chars": 152,
    "preview": "v=0\no=bob 2808844564 2808844564 IN IP4 host.biloxi.example.com\ns=\nc=IN IP4 host.biloxi.example.com\nt=0 0\nm=audio 49170 R"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/5.sdp",
    "chars": 217,
    "preview": "v=0\no=bob 2808844564 2808844564 IN IP4 host.biloxi.example.com\ns=\nc=IN IP4 host.biloxi.example.com\nt=0 0\nm=audio 49172 R"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/50.sdp",
    "chars": 156,
    "preview": "v=0\no=alice 2890844526 2890844527 IN IP4 host.atlanta.example.com\ns=\nc=IN IP4 host.atlanta.example.com\nt=0 0\nm=audio 491"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/51.sdp",
    "chars": 152,
    "preview": "v=0\no=bob 2808844564 2808844564 IN IP4 host.biloxi.example.com\ns=\nc=IN IP4 host.biloxi.example.com\nt=0 0\nm=audio 49170 R"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/52.sdp",
    "chars": 156,
    "preview": "v=0\no=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com\ns=\nc=IN IP4 host.atlanta.example.com\nt=0 0\nm=audio 491"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/53.sdp",
    "chars": 135,
    "preview": "v=0\no=bob 2808844564 2808844564 IN IP4 host.biloxi.example.com\ns=\nc=IN IP4 0.0.0.0\nt=0 0\nm=audio 9322 RTP/AVP 97\na=rtpma"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/54.sdp",
    "chars": 152,
    "preview": "v=0\no=bob 2808844564 2808844565 IN IP4 host.biloxi.example.com\ns=\nc=IN IP4 host.biloxi.example.com\nt=0 0\nm=audio 49172 R"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/55.sdp",
    "chars": 157,
    "preview": "v=0\no=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com\ns=\nc=IN IP4 host.atlanta.example.com\nt=0 0\nm=audio 491"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/6.sdp",
    "chars": 198,
    "preview": "v=0\no=alice 2890844526 2890844527 IN IP4 host.atlanta.example.com\ns=\nc=IN IP4 host.atlanta.example.com\nt=0 0\nm=audio 513"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/7.sdp",
    "chars": 194,
    "preview": "v=0\no=bob 2808844564 2808844565 IN IP4 host.biloxi.example.com\ns=\nc=IN IP4 host.biloxi.example.com\nt=0 0\nm=audio 49172 R"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/8.sdp",
    "chars": 275,
    "preview": "v=0\no=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com\ns=\nc=IN IP4 host.atlanta.example.com\nt=0 0\nm=audio 491"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/9.sdp",
    "chars": 200,
    "preview": "v=0\no=bob 2808844564 2808844564 IN IP4 host.biloxi.example.com\ns=\nc=IN IP4 host.biloxi.example.com\nt=0 0\nm=audio 49172 R"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/firefox-1.sdp",
    "chars": 1815,
    "preview": "v=0\no=mozilla...THIS_IS_SDPARTA-46.0.1 5115930144083302970 0 IN IP4 0.0.0.0\ns=-\nt=0 0\na=fingerprint:sha-256 24:67:5E:1B:"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/firefox-2.sdp",
    "chars": 1249,
    "preview": "v=0\no=mozilla...THIS_IS_SDPARTA-46.0.1 3068771576687940834 0 IN IP4 0.0.0.0\ns=-\nt=0 0\na=fingerprint:sha-256 AD:87:B3:11:"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/opera-1.sdp",
    "chars": 2957,
    "preview": "v=0\no=- 1656229333038673902 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=group:BUNDLE audio video data\na=msid-semantic: WMS Ppsa09YmDL"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/opera-2.sdp",
    "chars": 2110,
    "preview": "v=0\no=- 2013283641453412290 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=group:BUNDLE audio video data\na=msid-semantic: WMS\nm=audio 9 "
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/unittest-1.sdp",
    "chars": 2158,
    "preview": "v=0\no=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS local_stream_1\nm=audio"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/unittest-2.sdp",
    "chars": 1180,
    "preview": "v=0\no=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS local_stream_1\nm=audio"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/unittest-3.sdp",
    "chars": 402,
    "preview": "m=application 9 RTP/SAVPF 101\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-ufrag:ufrag_data\na=ice-pwd:pwd_data\na=mid:d"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/unittest-4.sdp",
    "chars": 242,
    "preview": "v=0\no=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\nm=audio 9 RTP/SAVPF 11"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/unittest-5.sdp",
    "chars": 111,
    "preview": "v=0\no=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS local_stream\n"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/unittest-6.sdp",
    "chars": 307,
    "preview": "m=audio 9 RTP/SAVPF 111\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-ufrag:ufrag_voice\na=ice-pwd:pwd_voice\na=mid:audio"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/unittest-7.sdp",
    "chars": 304,
    "preview": "m=video 9 RTP/SAVPF 120\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-ufrag:ufrag_video\na=ice-pwd:pwd_video\na=mid:video"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/unittest-8.sdp",
    "chars": 2593,
    "preview": "v=0\no=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS local_stream_1 local_s"
  },
  {
    "path": "fuzzers/corpora/sdp_fuzzer/2webrtc/unittest-9.sdp",
    "chars": 2671,
    "preview": "v=0\no=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS local_stream_1 local_s"
  },
  {
    "path": "fuzzers/engines/standalone.c",
    "chars": 590,
    "preview": "#include <stdint.h>\n#include <stddef.h>\n#include <stdio.h>\n#include <stdlib.h>\n\nextern int LLVMFuzzerTestOneInput(const "
  },
  {
    "path": "fuzzers/rtcp_fuzzer.c",
    "chars": 2503,
    "preview": "#include <stdint.h>\n#include <stddef.h>\n#include <stdlib.h>\n\n#include <glib.h>\n#include \"../src/debug.h\"\n#include \"../sr"
  },
  {
    "path": "fuzzers/rtp_fuzzer.c",
    "chars": 3893,
    "preview": "#include <stdint.h>\n#include <stddef.h>\n#include <stdlib.h>\n\n#include <glib.h>\n#include \"../src/debug.h\"\n#include \"../sr"
  },
  {
    "path": "fuzzers/run.sh",
    "chars": 2594,
    "preview": "#!/bin/bash\n\nset -eu\n\nSCRIPTPATH=\"$( cd \"$(dirname \"$0\")\" ; pwd -P )\"\n\nTARGET=${1:-\"rtcp_fuzzer\"}\nCRASH_FILE=${2:-\"\"}\nif"
  },
  {
    "path": "fuzzers/sdp_fuzzer.c",
    "chars": 1118,
    "preview": "#include <stdint.h>\n#include <stddef.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include <glib.h>\n#include \"../src/debu"
  },
  {
    "path": "html/Makefile.am",
    "chars": 251,
    "preview": "demodir = $(datadir)/janus/html\n\nhtml-local:\n\ttrue\n\ninstall-data-local: html-local\n\t$(MKDIR_P) $(DESTDIR)$(demodir)\n\tcp "
  },
  {
    "path": "html/citeus.html",
    "chars": 6513,
    "preview": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content="
  },
  {
    "path": "html/css/demo.css",
    "chars": 1892,
    "preview": "body {\n\tpadding-top: 80px;\n}\n\na {\n\ttext-decoration: none;\n}\n\n.hide {\n\tdisplay: none !important;\n}\n\n.z-2 {\n\tz-index: 2000"
  },
  {
    "path": "html/demos/admin.html",
    "chars": 10107,
    "preview": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content="
  },
  {
    "path": "html/demos/admin.js",
    "chars": 53169,
    "preview": "//\n// This 'server' variable we use to contact the Admin/Monitor backend is\n// constructed in this example pretty much a"
  },
  {
    "path": "html/demos/audiobridge.html",
    "chars": 5645,
    "preview": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content="
  },
  {
    "path": "html/demos/audiobridge.js",
    "chars": 20838,
    "preview": "// We import the settings.js file to know which address we should contact\n// to talk to Janus, and optionally which STUN"
  },
  {
    "path": "html/demos/canvas.html",
    "chars": 8588,
    "preview": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content="
  },
  {
    "path": "html/demos/canvas.js",
    "chars": 24634,
    "preview": "// We import the settings.js file to know which address we should contact\n// to talk to Janus, and optionally which STUN"
  },
  {
    "path": "html/demos/devices.html",
    "chars": 7639,
    "preview": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content="
  },
  {
    "path": "html/demos/devices.js",
    "chars": 29984,
    "preview": "// We import the settings.js file to know which address we should contact\n// to talk to Janus, and optionally which STUN"
  },
  {
    "path": "html/demos/e2e.html",
    "chars": 7050,
    "preview": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content="
  },
  {
    "path": "html/demos/e2e.js",
    "chars": 29139,
    "preview": "// We import the settings.js file to know which address we should contact\n// to talk to Janus, and optionally which STUN"
  },
  {
    "path": "html/demos/echotest.html",
    "chars": 8386,
    "preview": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content="
  },
  {
    "path": "html/demos/echotest.js",
    "chars": 30070,
    "preview": "// We import the settings.js file to know which address we should contact\n// to talk to Janus, and optionally which STUN"
  },
  {
    "path": "html/demos/index.html",
    "chars": 5222,
    "preview": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content="
  },
  {
    "path": "html/demos/janus.js",
    "chars": 117451,
    "preview": "\"use strict\";\n\n/*\n\tThe MIT License (MIT)\n\n\tCopyright (c) 2016 Meetecho\n\n\tPermission is hereby granted, free of charge, t"
  },
  {
    "path": "html/demos/multiopus.html",
    "chars": 7243,
    "preview": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content="
  },
  {
    "path": "html/demos/multiopus.js",
    "chars": 23520,
    "preview": "// We import the settings.js file to know which address we should contact\n// to talk to Janus, and optionally which STUN"
  },
  {
    "path": "html/demos/mvideoroom.html",
    "chars": 7412,
    "preview": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content="
  },
  {
    "path": "html/demos/mvideoroom.js",
    "chars": 45371,
    "preview": "// We import the settings.js file to know which address we should contact\n// to talk to Janus, and optionally which STUN"
  },
  {
    "path": "html/demos/navbar.html",
    "chars": 2929,
    "preview": "<div class=\"container\">\n\t<a class=\"navbar-brand\" href=\"../index.html\">Janus (multistream)</a>\n\t<button type=\"button\" cla"
  },
  {
    "path": "html/demos/nosip.html",
    "chars": 5639,
    "preview": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content="
  },
  {
    "path": "html/demos/nosip.js",
    "chars": 20255,
    "preview": "// We import the settings.js file to know which address we should contact\n// to talk to Janus, and optionally which STUN"
  },
  {
    "path": "html/demos/recordplay.html",
    "chars": 5749,
    "preview": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content="
  },
  {
    "path": "html/demos/recordplay.js",
    "chars": 23498,
    "preview": "// We import the settings.js file to know which address we should contact\n// to talk to Janus, and optionally which STUN"
  },
  {
    "path": "html/demos/screensharing.html",
    "chars": 5961,
    "preview": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content="
  },
  {
    "path": "html/demos/screensharing.js",
    "chars": 21247,
    "preview": "// We import the settings.js file to know which address we should contact\n// to talk to Janus, and optionally which STUN"
  },
  {
    "path": "html/demos/settings.js",
    "chars": 4193,
    "preview": "/* eslint-disable no-unused-vars */\n\n// We use this shared JavaScript file as a simple way to have all demos\n// refer to"
  },
  {
    "path": "html/demos/sip.html",
    "chars": 8076,
    "preview": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content="
  },
  {
    "path": "html/demos/sip.js",
    "chars": 72380,
    "preview": "// We import the settings.js file to know which address we should contact\n// to talk to Janus, and optionally which STUN"
  },
  {
    "path": "html/demos/streaming.html",
    "chars": 5269,
    "preview": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content="
  },
  {
    "path": "html/demos/streaming.js",
    "chars": 32871,
    "preview": "// We import the settings.js file to know which address we should contact\n// to talk to Janus, and optionally which STUN"
  },
  {
    "path": "html/demos/surround/ChID-BLITS-EBU.txt",
    "chars": 74,
    "preview": "File downloaded from https://www2.iis.fraunhofer.de/AAC/multichannel.html\n"
  },
  {
    "path": "html/demos/textroom.html",
    "chars": 5843,
    "preview": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content="
  },
  {
    "path": "html/demos/textroom.js",
    "chars": 14061,
    "preview": "// We import the settings.js file to know which address we should contact\n// to talk to Janus, and optionally which STUN"
  },
  {
    "path": "html/demos/videocall.html",
    "chars": 8646,
    "preview": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content="
  },
  {
    "path": "html/demos/videocall.js",
    "chars": 32532,
    "preview": "// We import the settings.js file to know which address we should contact\n// to talk to Janus, and optionally which STUN"
  },
  {
    "path": "html/demos/videoroom.html",
    "chars": 8934,
    "preview": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content="
  },
  {
    "path": "html/demos/videoroom.js",
    "chars": 41012,
    "preview": "// We import the settings.js file to know which address we should contact\n// to talk to Janus, and optionally which STUN"
  },
  {
    "path": "html/demos/virtualbg.html",
    "chars": 6218,
    "preview": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content="
  },
  {
    "path": "html/demos/virtualbg.js",
    "chars": 26112,
    "preview": "// We import the settings.js file to know which address we should contact\n// to talk to Janus, and optionally which STUN"
  },
  {
    "path": "html/demos/webaudio.html",
    "chars": 5917,
    "preview": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content="
  },
  {
    "path": "html/demos/webaudio.js",
    "chars": 13792,
    "preview": "// We import the settings.js file to know which address we should contact\n// to talk to Janus, and optionally which STUN"
  },
  {
    "path": "html/docs/index.html",
    "chars": 3064,
    "preview": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content="
  },
  {
    "path": "html/footer.html",
    "chars": 92,
    "preview": "\t<p>Janus WebRTC Server &copy; <a href=\"http://www.meetecho.com\">Meetecho</a> 2014-2026</p>\n"
  },
  {
    "path": "html/index.html",
    "chars": 3645,
    "preview": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content="
  },
  {
    "path": "html/navbar.html",
    "chars": 3015,
    "preview": "<div class=\"container\">\n\t<a class=\"navbar-brand\" href=\"index.html\">Janus (multistream)</a>\n\t<button type=\"button\" class="
  },
  {
    "path": "html/support.html",
    "chars": 3847,
    "preview": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content="
  },
  {
    "path": "janus-gateway.pc.in",
    "chars": 232,
    "preview": "prefix=@prefix@\nexec_prefix=@exec_prefix@\nlibdir=@libdir@\nincludedir=@includedir@\n\nName: janus-gateway\nDescription: Janu"
  },
  {
    "path": "npm/.gitignore",
    "chars": 48,
    "preview": "bundles/\ndist/\nsrc/\nnode_modules/\nnpm-debug.log\n"
  },
  {
    "path": "npm/.npmignore",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "npm/README.md",
    "chars": 957,
    "preview": "Janus WebRTC Server (janus.js)\n==============================\n\nThis is the npm version of `janus.js`, a JavaScript libra"
  },
  {
    "path": "npm/janus.d.ts",
    "chars": 9818,
    "preview": "declare global {\n\tconst jQuery: any\n}\n\ndeclare namespace JanusJS {\n\tinterface Dependencies {\n\t\tadapter: any;\n\t\tWebSocket"
  },
  {
    "path": "npm/module.js",
    "chars": 185,
    "preview": "to_remove: {\n/*\n * Module shim for rollup.js to work with.\n * Simply re-export Janus from janus.js, the real 'magic' is "
  },
  {
    "path": "npm/rollup.config.mjs",
    "chars": 434,
    "preview": "import strip from '@rollup/plugin-strip';\nimport replace from '@rollup/plugin-replace';\nimport { readFileSync } from 'fs"
  },
  {
    "path": "package.json",
    "chars": 1258,
    "preview": "{\n\t\"name\": \"janus-gateway\",\n\t\"version\": \"1.4.1\",\n\t\"description\": \"A javascript library for interacting with the C based "
  },
  {
    "path": "src/Makefile.am",
    "chars": 20312,
    "preview": "EXTRA_DIST = $(NULL)\nCLEANFILES = $(NULL)\n\nbin_PROGRAMS = janus\n\nheaderdir = $(includedir)/janus\nheader_HEADERS = apierr"
  },
  {
    "path": "src/apierror.c",
    "chars": 2024,
    "preview": "#include \"apierror.h\"\n\nconst char *janus_get_api_error(int error) {\n\tswitch(error) {\n\t\tcase JANUS_OK:\n\t\t\treturn \"Success"
  },
  {
    "path": "src/apierror.h",
    "chars": 3557,
    "preview": "/*! \\file    apierror.h\n * \\author   Lorenzo Miniero <lorenzo@meetecho.com>\n * \\copyright GNU General Public License v3\n"
  },
  {
    "path": "src/auth.c",
    "chars": 10075,
    "preview": "/*! \\file    auth.c\n * \\author   Lorenzo Miniero <lorenzo@meetecho.com>\n * \\copyright GNU General Public License v3\n * \\"
  },
  {
    "path": "src/auth.h",
    "chars": 4798,
    "preview": "/*! \\file    auth.h\n * \\author   Lorenzo Miniero <lorenzo@meetecho.com>\n * \\copyright GNU General Public License v3\n * \\"
  },
  {
    "path": "src/config.c",
    "chars": 22273,
    "preview": "/*! \\file    config.c\n * \\author   Lorenzo Miniero <lorenzo@meetecho.com>\n * \\copyright GNU General Public License v3\n *"
  },
  {
    "path": "src/config.h",
    "chars": 9251,
    "preview": "/*! \\file    config.h\n * \\author   Lorenzo Miniero <lorenzo@meetecho.com>\n * \\copyright GNU General Public License v3\n *"
  },
  {
    "path": "src/debug.h",
    "chars": 3087,
    "preview": "/*! \\file    debug.h\n * \\author   Lorenzo Miniero <lorenzo@meetecho.com>\n * \\copyright GNU General Public License v3\n * "
  },
  {
    "path": "src/dtls-bio.c",
    "chars": 5474,
    "preview": "/*! \\file    dtls-bio.h\n * \\author   Lorenzo Miniero <lorenzo@meetecho.com>\n * \\copyright GNU General Public License v3\n"
  },
  {
    "path": "src/dtls-bio.h",
    "chars": 1437,
    "preview": "/*! \\file    dtls-bio.h\n * \\author   Lorenzo Miniero <lorenzo@meetecho.com>\n * \\copyright GNU General Public License v3\n"
  },
  {
    "path": "src/dtls.c",
    "chars": 40026,
    "preview": "/*! \\file    dtls.c\n * \\author   Lorenzo Miniero <lorenzo@meetecho.com>\n * \\copyright GNU General Public License v3\n * \\"
  },
  {
    "path": "src/dtls.h",
    "chars": 9852,
    "preview": "/*! \\file    dtls.h\n * \\author   Lorenzo Miniero <lorenzo@meetecho.com>\n * \\copyright GNU General Public License v3\n * \\"
  },
  {
    "path": "src/events/eventhandler.h",
    "chars": 13843,
    "preview": "/*! \\file   eventhandler.h\n * \\author Lorenzo Miniero <lorenzo@meetecho.com>\n * \\copyright GNU General Public License v3"
  },
  {
    "path": "src/events/janus_gelfevh.c",
    "chars": 20961,
    "preview": "/*! \\file   janus_gelfevh.c\n * \\author Mirko Brankovic <mirkobrankovic@gmail.com>\n * \\copyright GNU General Public Licen"
  },
  {
    "path": "src/events/janus_mqttevh.c",
    "chars": 47520,
    "preview": "/*! \\file   janus_mqttevh.c\n * \\author Olle E. Johansson <oej@edvina.net>\n * \\copyright GNU General Public License v3\n *"
  }
]

// ... and 257 more files (download for full content)

About this extraction

This page contains the full source code of the meetecho/janus-gateway GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 457 files (7.4 MB), approximately 2.0M tokens, and a symbol index with 2441 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!