{"id":47577467,"url":"https://github.com/nilstate/icey","last_synced_at":"2026-04-11T17:25:26.977Z","repository":{"id":2546959,"uuid":"3524917","full_name":"nilstate/icey","owner":"nilstate","description":"Real-time media stack and lightweight libwebrtc alternative, built in C++20","archived":false,"fork":false,"pushed_at":"2026-04-06T15:37:57.000Z","size":40198,"stargazers_count":1351,"open_issues_count":6,"forks_count":350,"subscribers_count":123,"default_branch":"main","last_synced_at":"2026-04-06T16:30:53.428Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://0state.com/icey","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-2.1","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nilstate.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"docs/contributing.md","funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2012-02-23T11:55:51.000Z","updated_at":"2026-04-06T13:57:06.000Z","dependencies_parsed_at":"2023-01-13T13:00:47.796Z","dependency_job_id":null,"html_url":"https://github.com/nilstate/icey","commit_stats":null,"previous_names":["sourcey/icey","nilstate/icey"],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/nilstate/icey","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nilstate%2Ficey","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nilstate%2Ficey/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nilstate%2Ficey/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nilstate%2Ficey/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nilstate","download_url":"https://codeload.github.com/nilstate/icey/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nilstate%2Ficey/sbom","scorecard":{"id":839483,"data":{"date":"2025-08-11","repo":{"name":"github.com/sourcey/libsourcey","commit":"98df3c31ea1c5e8162f32e7424fb839292075119"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.8,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Code-Review","score":2,"reason":"Found 6/21 approved changesets -- score normalized to 2","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.md:0","Info: FSF or OSI recognized license: GNU Lesser General Public License v2.1: LICENSE.md:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 15 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: containerImage not pinned by hash: Dockerfile:1: pin your Docker image by updating ubuntu:14.04 to ubuntu:14.04@sha256:64483f3496c1373bfd55348e88694d1c4d0c9b660dee6bfef5e12f43b9933b30","Info:   0 out of   1 containerImage dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Vulnerabilities","score":0,"reason":"43 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-pxg6-pf52-xh8x","Warn: Project is vulnerable to: GHSA-9vvw-cc9w-f27h","Warn: Project is vulnerable to: GHSA-gxpj-cx7g-858c","Warn: Project is vulnerable to: GHSA-3w5v-p54c-f74x","Warn: Project is vulnerable to: GHSA-6x77-rpqf-j6mw","Warn: Project is vulnerable to: GHSA-hwcf-pp87-7x6p","Warn: Project is vulnerable to: GHSA-phwq-j96m-2c2q","Warn: Project is vulnerable to: GHSA-ghr5-ch3p-vcr6","Warn: Project is vulnerable to: GHSA-j4f2-536g-r55m","Warn: Project is vulnerable to: GHSA-r7qp-cfhv-p84w","Warn: Project is vulnerable to: GHSA-rv95-896h-c2vc","Warn: Project is vulnerable to: GHSA-qw6h-vgh9-j6wx","Warn: Project is vulnerable to: GHSA-9qj9-36jm-prpv","Warn: Project is vulnerable to: GHSA-6c3j-c64m-qhgq","Warn: Project is vulnerable to: GHSA-gxr4-xjj5-5px2","Warn: Project is vulnerable to: GHSA-jpcq-cgw6-v4j6","Warn: Project is vulnerable to: GHSA-wrvr-8mpx-r7pp","Warn: Project is vulnerable to: GHSA-w9mr-4mfr-499f","Warn: Project is vulnerable to: GHSA-7mc5-chhp-fmc3","Warn: Project is vulnerable to: GHSA-q75g-2496-mxpp","Warn: Project is vulnerable to: GHSA-6fx8-h7jm-663j","Warn: Project is vulnerable to: GHSA-9wv6-86v2-598j","Warn: Project is vulnerable to: GHSA-rhx6-c78j-4q9w","Warn: Project is vulnerable to: GHSA-gqgv-6jq5-jjj9","Warn: Project is vulnerable to: GHSA-hrpp-h998-j3pp","Warn: Project is vulnerable to: GHSA-m6fv-jmcg-4jfg","Warn: Project is vulnerable to: GHSA-cm22-4g7w-348p","Warn: Project is vulnerable to: GHSA-fxwf-4rqh-v8g3","Warn: Project is vulnerable to: GHSA-25hc-qcg6-38wj","Warn: Project is vulnerable to: GHSA-xfhh-g9f5-x4m4","Warn: Project is vulnerable to: GHSA-qm95-pgcg-qqfq","Warn: Project is vulnerable to: GHSA-cqmj-92xf-r6r9","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q","Warn: Project is vulnerable to: GHSA-72mh-269x-7mh5","Warn: Project is vulnerable to: GHSA-h4j5-c7cj-74xg","Warn: Project is vulnerable to: CVE-2024-24806","Warn: Project is vulnerable to: CVE-2016-9840","Warn: Project is vulnerable to: CVE-2016-9841","Warn: Project is vulnerable to: CVE-2016-9842","Warn: Project is vulnerable to: CVE-2016-9843","Warn: Project is vulnerable to: CVE-2018-25032","Warn: Project is vulnerable to: CVE-2022-37434","Warn: Project is vulnerable to: CVE-2023-45853"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-23T20:06:05.931Z","repository_id":2546959,"created_at":"2025-08-23T20:06:05.931Z","updated_at":"2025-08-23T20:06:05.931Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31689214,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-11T13:07:20.380Z","status":"ssl_error","status_checked_at":"2026-04-11T13:06:47.903Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-03-31T06:00:36.043Z","updated_at":"2026-04-11T17:25:26.969Z","avatar_url":"https://github.com/nilstate.png","language":"C++","readme":"# icey\n\n[![CI](https://github.com/nilstate/icey/actions/workflows/ci.yml/badge.svg)](https://github.com/nilstate/icey/actions/workflows/ci.yml)\n[![License: LGPL-2.1+](https://img.shields.io/badge/license-LGPL--2.1%2B-blue.svg)](LICENSE.md)\n\n\u003e The C++ Media Stack\n\nWebRTC, FFmpeg, and async networking in one toolkit. No Google monolith. No dependency hell. No fighting three build systems to get a frame on screen.\n\n```cpp\n// The core of a WebRTC media server\nPacketStream stream;\nstream.attachSource(capture.get());\nstream.attach(\u0026session-\u003emedia().videoSender(), 5);\nstream.start();\n```\n\nicey is the connective tissue: a modular C++20 toolkit that pulls FFmpeg, libuv, OpenSSL, llhttp, libdatachannel, Symple, STUN, and TURN into one runtime model. Capture, encode, transport, signalling, and relay. Core third-party code is pulled in by CMake; system TLS and media dependencies are auto-detected. Builds in minutes.\n\n**[Documentation](docs/index.md)** | **[Changelog](CHANGELOG.md)** | **[Contributing](docs/contributing.md)** | **[LGPL-2.1+](LICENSE.md)**\n\n## Fastest Path\n\nIf you want the shortest path from zero to browser video, use the published `icey-server` image from the separate `icey-cli` repo.\n\nOne command. One URL. One click.\n\n```bash\ndocker run --rm --network host 0state/icey-server:latest\n```\n\nThen open `http://localhost:4500` and click `Watch` on the `icey` peer.\n\nThis express path ships from `nilstate/icey-cli` and starts `stream` mode with the bundled demo source. If you want the repo-backed app path for local edits or richer runtime control, use the separate `icey-cli` app surface on top of the core `icey` modules.\n\n## Why icey\n\n| | libWebRTC (Google) | libdatachannel | GStreamer | **icey** |\n|---|---|---|---|---|\n| Build system | GN/Ninja | CMake | Meson | **CMake** |\n| Build time | Hours | Minutes | 30+ min | **Minutes** |\n| Binary size | 50MB+ | Small | Large | **Small** |\n| SSL | BoringSSL (conflicts) | OpenSSL | OpenSSL | **OpenSSL** |\n| Media codecs | Bundled | None | GObject plugins | **FFmpeg (any codec)** |\n| Capture/encode | Included | No | Plugin pipeline | **PacketStream pipeline** |\n| Signalling | No | No | No | **Symple (built-in)** |\n| TURN server | No | No | No | **RFC 5766 (built-in)** |\n| Language | C++ | C++17 | C/GObject | **C++20** |\n\nlibdatachannel gives you the WebRTC transport pipe. icey gives you the pipe, the water, and the faucet.\n\n## Architecture\n\nEverything flows through `PacketStream`. Plug in a source, chain processors, attach a sink. Borrowed packets stay zero-copy until the first queue or retained adapter; that boundary is explicit in the graph. The pipeline handles backpressure, frame dropping, and teardown so you don't. Nothing runs that you didn't ask for. Decoded branches can feed `vision` and `speech` processors without changing the transport path.\n\n```\n┌─────────────────────────────────────────────────────────────────┐\n│                        PacketStream                             │\n│                                                                 │\n│  ┌──────────┐    ┌──────────────┐    ┌───────────────────────┐  │\n│  │  Source  │───▶│  Processor   │───▶│        Sink           │  │\n│  │          │    │              │    │                       │  │\n│  │ Camera   │    │ FFmpeg H.264 │    │ WebRTC Track Sender   │  │\n│  │ File     │    │ Opus encode  │    │ Network socket        │  │\n│  │ Network  │    │ OpenCV       │    │ File recorder         │  │\n│  │ Device   │    │ Custom       │    │ HTTP response         │  │\n│  └──────────┘    └──────────────┘    └───────────────────────┘  │\n└─────────────────────────────────────────────────────────────────┘\n\nWebRTC send path:\n  MediaCapture → VideoEncoder → WebRtcTrackSender → [libdatachannel]\n                                                        │\n  Browser ◀── RTP/SRTP ◀── DTLS ◀── ICE (libjuice) ◀───┘\n                                      │\n                              icey TURN server\n                              (relay for symmetric NATs)\n\nWebRTC receive path:\n  [libdatachannel] → WebRtcTrackReceiver → FFmpeg decode → file/display\n        │\n        └─── ICE → DTLS → SRTP decrypt → RTP depacketise → raw frames\n\nSignalling (Symple v4):\n  C++ server/client ◀──── WebSocket ────▶ Browser (symple-player)\n  Auth, presence, rooms, call protocol (init/accept/offer/answer/candidate)\n```\n\nCamera to browser in 150 lines. Browser to file in 130. The pipeline handles the plumbing.\n\n## What You Can Build\n\n### Stream a webcam to any browser\n\n150 lines of C++. Camera capture, H.264 encoding, WebRTC transport, Symple signalling. Open a browser, see video. No plugins, no Google, no pain.\n\n```cpp\n// Accept call, wire up the pipeline, stream\nsession.IncomingCall += [\u0026](const std::string\u0026 peerId) {\n    session.accept();\n};\n\nsession.StateChanged += [\u0026](wrtc::PeerSession::State state) {\n    if (state == wrtc::PeerSession::State::Active) {\n        stream.attachSource(capture.get());\n        stream.attach(\u0026session-\u003emedia().videoSender(), 5);\n        stream.start();\n    }\n};\n```\n\nSee [src/webrtc/samples/webcam-streamer/](src/webrtc/samples/webcam-streamer/) or read [WebRTC in 150 Lines of C++](https://0state.com/writing/webrtc-in-150-lines-of-cpp).\n\n### Record a browser's camera server-side\n\nBrowser sends WebRTC, your C++ server decodes with FFmpeg, writes to any format. Video depositions, telehealth recording, proctoring - server-side recording without cloud vendor lock-in.\n\nSee [src/webrtc/samples/media-recorder/](src/webrtc/samples/media-recorder/).\n\n### Stream any video file to a browser\n\nFeed an MP4 in, get a real-time WebRTC stream out. Includes a simple data channel for control messages alongside the media stream.\n\nSee [src/webrtc/samples/file-streamer/](src/webrtc/samples/file-streamer/).\n\n### Run your own TURN relay\n\nProduction-grade RFC 5766 TURN server with channel binding and TCP support. Stop paying for hosted TURN. ~30% of real-world WebRTC connections need relay through symmetric NATs; this handles them.\n\nSee [src/turn/samples/turnserver/](src/turn/samples/turnserver/).\n\n### HTTP that outperforms Go\n\n72,000 req/s with keep-alive on a single-core micro VM. Built on the same libuv + llhttp that powers Node.js, minus the runtime, GC, and language bridge.\n\n| Server | Req/sec | Latency |\n| ------ | ------: | ------: |\n| Raw libuv+llhttp | 96,088 | 1.04ms |\n| **icey** | **72,209** | **1.43ms** |\n| Go 1.25 net/http | 53,878 | 2.31ms |\n| Node.js v20 | 45,514 | 3.56ms |\n\nicey delivers **75% of raw libuv throughput** while providing a complete HTTP stack (connection management, header construction, WebSocket upgrade, streaming responses). It outperforms Go's `net/http` by 34% and Node.js by 59%. All three share the same foundation (libuv for async IO, llhttp for HTTP parsing); the difference is pure runtime overhead.\n\nSee [src/http/perf/](src/http/perf/) for the cross-stack methodology, and [src/http/bench/](src/http/bench/) for the reportable HTTP microbenchmarks.\n\n## Docs Start Here\n\nIf you just want the right page:\n\n- Run icey-server: [docs/run/index.md](docs/run/index.md)\n- Install icey-server: [docs/run/install.md](docs/run/install.md)\n- Deploy to production: [docs/operate/deploy.md](docs/operate/deploy.md)\n- Build and link your first program: [docs/build/getting-started.md](docs/build/getting-started.md)\n- Full library build and install: [docs/build/installation.md](docs/build/installation.md)\n- Module map and dependency picture: [docs/modules.md](docs/modules.md)\n- HTTP and WebSocket: [docs/modules/http.md](docs/modules/http.md)\n- TURN relay: [docs/modules/turn.md](docs/modules/turn.md)\n- WebRTC media flows: [docs/modules/webrtc.md](docs/modules/webrtc.md)\n- Full docs landing page: [docs/index.md](docs/index.md)\n\n## Quick Start\n\n### Requirements\n\n| Platform | Compiler |\n|----------|----------|\n| Linux | GCC 12+ or Clang 15+ |\n| macOS | AppleClang 15+ (Xcode 15+) |\n| Windows | MSVC 2022 (Visual Studio 17+) |\n\nCMake 3.21+ and pkg-config (Linux/macOS) required. icey fetches its core bundled third-party code automatically:\n\n| Dependency | Version |\n|------------|---------|\n| libuv | 1.50 |\n| llhttp | 9.2.1 |\n| nlohmann/json | 3.11.3 |\n| zlib | 1.3.1 |\n\nSystem dependencies such as OpenSSL 3.x, FFmpeg 5+/6+/7+, and OpenCV 3.0+ are auto-detected when present. `libdatachannel` is fetched automatically when building the `webrtc` module.\n\n### Build from source\n\n```bash\ngit clone https://github.com/nilstate/icey.git\ncd icey\ncmake -B build -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTS=ON\ncmake --build build --parallel $(nproc)\nctest --test-dir build --output-on-failure\n```\n\n### CMake FetchContent\n\n```cmake\ninclude(FetchContent)\nFetchContent_Declare(icey\n  GIT_REPOSITORY https://github.com/nilstate/icey.git\n  GIT_TAG 2.4.5\n)\nFetchContent_MakeAvailable(icey)\ntarget_link_libraries(myapp PRIVATE icey::base icey::net icey::http)\n```\n\n### find_package\n\nAfter installing (`cmake --install build`):\n\n```cmake\nfind_package(icey REQUIRED)\ntarget_link_libraries(myapp PRIVATE icey::base icey::net icey::http)\n```\n\n### Package Managers\n\nPublic registry submission is not live yet, but the repo now carries local package-manager support:\n\n```bash\n# Conan\nconan create packaging/conan --build=missing -s compiler.cppstd=20\n# or: make package-conan\n\n# vcpkg overlay port\nICEY_VCPKG_SOURCE_PATH=$PWD vcpkg install icey --overlay-ports=$PWD/packaging/vcpkg\n# or: make package-vcpkg\n\n# Arch package / AUR seed\ncd packaging/arch \u0026\u0026 makepkg --force --cleanbuild --syncdeps\n# or: make package-arch\n\n# Homebrew tap-local formulae\nbrew install --formula ./packaging/homebrew/Formula/libdatachannel.rb\nbrew install --formula ./packaging/homebrew/Formula/icey.rb\n# or: make package-homebrew\n\n# Debian source package / Launchpad PPA seed\nmake package-debian-source\n```\n\nThe Conan recipe lives at `packaging/conan/conanfile.py`, the `vcpkg` overlay port lives at `packaging/vcpkg/icey/`, the Arch packaging files live at `packaging/arch/`, the Homebrew tap formulae live at `packaging/homebrew/Formula/`, and the Debian / PPA seed lives at `packaging/debian/debian/`.\n\nFor the release/tag/archive-pin flow behind those package managers, use [`docs/releasing.md`](docs/releasing.md).\n\n## Code Examples\n\n### Media pipeline\n\nCamera to encoder to network:\n\n```cpp\nPacketStream stream;\nstream.attachSource(videoCapture);\nstream.attach(new av::MultiplexPacketEncoder(opts), 5);\nstream.attach(socket, 10);\nstream.start();\n```\n\n### HTTP server\n\n```cpp\nhttp::Server srv{ \"127.0.0.1\", 1337 };\nsrv.Connection += [](http::ServerConnection::Ptr conn) {\n    conn-\u003ePayload += [](http::ServerConnection\u0026 conn, const MutableBuffer\u0026 buffer) {\n        conn.send(bufferCast\u003cconst char*\u003e(buffer), buffer.size());\n        conn.close();\n    };\n};\nsrv.start();\n```\n\n### WebRTC peer session\n\n```cpp\nwrtc::PeerSession::Config config;\nconfig.rtcConfig.iceServers.emplace_back(\"stun:stun.l.google.com:19302\");\nconfig.media.videoCodec = av::VideoCodec(\"H264\", \"libx264\", 1280, 720, 30);\n\nwrtc::SympleSignaller signaller(client);\nwrtc::PeerSession session(signaller, config);\n\nsession.IncomingCall += [\u0026](const std::string\u0026 peerId) {\n    session.accept();\n};\n\nsession.StateChanged += [\u0026](wrtc::PeerSession::State state) {\n    if (state == wrtc::PeerSession::State::Active)\n        startStreaming(session);\n};\n```\n\n## Modules\n\n16 modules. Include only what you need; dependencies resolve automatically.\n\n| Module | What it does |\n|--------|-------------|\n| **base** | Event loop (libuv), signals, streams, logging, filesystem, timers |\n| **crypto** | Hashing, HMAC, RSA, X509 (OpenSSL 3.x) |\n| **net** | TCP, SSL/TLS, UDP sockets, DNS |\n| **http** | HTTP server/client, WebSocket, cookies, streaming, keep-alive |\n| **json** | JSON serialisation (nlohmann/json) |\n| **av** | FFmpeg capture, encode, decode, record, stream (FFmpeg 5/6/7) |\n| **speech** | Audio intelligence primitives for decoded media streams |\n| **vision** | Video intelligence primitives for sampled decoded frames |\n| **symple** | Real-time messaging, presence, rooms, WebRTC call signalling |\n| **stun** | RFC 5389 STUN for NAT traversal |\n| **turn** | RFC 5766 TURN relay server |\n| **webrtc** | WebRTC via libdatachannel: media bridge, peer sessions, codec negotiation |\n| **archo** | ZIP/archive handling |\n| **graft** | Native plugin ABI and shared-library loading |\n| **pacm** | Package manager for plugin distribution |\n| **sched** | Task scheduler for deferred/periodic jobs |\n\n## Contributors\n\n* Kam Low ([@auscaster](https://github.com/auscaster)) - Creator and primary developer\n* Sergey Parfenyuk ([@sparfenyuk](https://github.com/sparfenyuk)) - macOS compile fixes, type corrections, buffer handling\n* Yury Shubin ([@yuryshubin](https://github.com/yuryshubin)) - iOS build toolchain and platform fixes\n* Norm Ovenseri ([@normano](https://github.com/normano)) - Apple/FFmpeg builds, AVFoundation support, verbose logging\n* Igor Lutsyk ([@lutsykigor](https://github.com/lutsykigor)) - WebRTC/WebSocket fixes, OpenCV+WebRTC sample app, Firefox compatibility\n* Kryton ([@Malesio](https://github.com/Malesio)) - Segfault fixes and Valgrind cleanup\n* Vinci Xu ([@VinciShark](https://github.com/VinciShark)) - Windows documentation, testing and updates\n* Michael Fig ([@michael-fig](https://github.com/michael-fig)) - Compiler flags for building without FFmpeg\n* Stanislav Kapulkin ([@kapulkin](https://github.com/kapulkin)) - WebRTC modernisation and macOS compile definitions\n* Thomas Reichhart ([@blackforest-tom](https://github.com/blackforest-tom)) - FFmpeg constant updates and ARM build fixes\n* Artem Suprunov ([@artemiuzzz](https://github.com/artemiuzzz)) - WebRTC null pointer fix and library path resolution\n* Hyunuk Kim ([@surinkim](https://github.com/surinkim)) - Windows `std::codecvt` unicode conversion fix\n* Cameron Smith ([@cksmith](https://github.com/cksmith)) - Git line ending normalisation\n* Damian Zelim ([@ZelimDamian](https://github.com/ZelimDamian)) - OS X compiler flag fixes\n* Alexey ([@deilos](https://github.com/deilos)) - Cross-platform FFmpeg build script fixes\n\n## Contributing\n\nPRs welcome. See the [contributing guide](docs/contributing.md) for code style, tests, and workflow.\n","funding_links":[],"categories":["C++","Multimedia","Libraries"],"sub_categories":["C/C++"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnilstate%2Ficey","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnilstate%2Ficey","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnilstate%2Ficey/lists"}