diff --git a/Cargo.toml b/Cargo.toml index a002b0c78..bca75c839 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,69 +1,74 @@ [workspace] members = [ + "crates/aac", + "crates/amf0", + "crates/av1", "crates/batching", "crates/batching/examples", "crates/bootstrap", "crates/bootstrap/derive", "crates/bootstrap/examples", "crates/bootstrap/telemetry", + "crates/bytes-util", "crates/context", + "crates/expgolomb", "crates/ffmpeg", + "crates/flv", + "crates/future-ext", "crates/h3-webtransport", + "crates/h264", + "crates/h265", "crates/http", "crates/http/examples", "crates/metrics", "crates/metrics/derive", "crates/metrics/examples", + "crates/mp4", "crates/postcompile", "crates/pprof", "crates/pprof/examples", + "crates/rtmp", "crates/settings", "crates/settings/examples", "crates/signal", - "crates/workspace-hack", - "crates/aac", - "crates/amf0", - "crates/av1", - "crates/expgolomb", - "crates/flv", - "crates/h264", - "crates/h265", - "crates/mp4", - "crates/rtmp", "crates/transmuxer", + "crates/workspace-hack", "dev-tools/xtask", - "crates/future-ext", - "crates/bytes-util", ] resolver = "2" [workspace.dependencies] -scuffle-workspace-hack = { path = "crates/workspace-hack", version = "0.1.0" } +scuffle-aac = { path = "crates/aac", version = "0.0.1" } +scuffle-amf0 = { path = "crates/amf0", version = "0.0.1" } +scuffle-av1 = { path = "crates/av1", version = "0.0.1" } +scuffle-batching = { path = "crates/batching", version = "0.0.4" } scuffle-bootstrap = { path = "crates/bootstrap", version = "0.0.2" } scuffle-bootstrap-derive = { path = "crates/bootstrap/derive", version = "0.0.2" } scuffle-bootstrap-telemetry = { path = "crates/bootstrap/telemetry", version = "0.0.3" } -scuffle-image-processor-proto = { path = "apps/image-processor/proto", version = "0.0.2" } -scuffle-image-processor = { path = "apps/image-processor", version = "0.0.2" } +scuffle-bytes-util = { path = "crates/bytes-util", version = "0.0.1" } scuffle-context = { path = "crates/context", version = "0.0.2" } -scuffle-settings = { path = "crates/settings", version = "0.0.2" } -scuffle-signal = { path = "crates/signal", version = "0.0.2" } -scuffle-http = { path = "crates/http", version = "0.0.4" } -scuffle-metrics = { path = "crates/metrics", version = "0.0.4" } -scuffle-pprof = { path = "crates/pprof", version = "0.0.2" } -scuffle-batching = { path = "crates/batching", version = "0.0.4" } -postcompile = { path = "crates/postcompile", version = "0.0.5" } +scuffle-expgolomb = { path = "crates/expgolomb", version = "0.0.1" } scuffle-ffmpeg = { path = "crates/ffmpeg", version = "0.0.2" } +scuffle-flv = { path = "crates/flv", version = "0.0.1" } +scuffle-future-ext = { path = "crates/future-ext", version = "0.0.1" } scuffle-h3-webtransport = { path = "crates/h3-webtransport", version = "0.0.2" } +scuffle-http = { path = "crates/http", version = "0.0.4" } +scuffle-metrics = { path = "crates/metrics", version = "0.0.4" } scuffle-metrics-derive = { path = "crates/metrics/derive", version = "0.0.2" } -scuffle-ffmpeg-sys = { path = "crates/ffmpeg-sys", version = "7.1.0" } -scuffle-future-ext = { path = "crates/future-ext", version = "0.0.1" } -scuffle-bytes-util = { path = "crates/bytes-util", version = "0.0.1" } -scuffle-expgolomb = { path = "crates/expgolomb", version = "0.0.1" } -scuffle-amf0 = { path = "crates/amf0", version = "0.0.1" } -scuffle-av1 = { path = "crates/av1", version = "0.0.1" } -scuffle-flv = { path = "crates/flv", version = "0.0.1" } +postcompile = { path = "crates/postcompile", version = "0.0.5" } +scuffle-pprof = { path = "crates/pprof", version = "0.0.2" } +scuffle-settings = { path = "crates/settings", version = "0.0.2" } +scuffle-signal = { path = "crates/signal", version = "0.0.2" } +scuffle-workspace-hack = { path = "crates/workspace-hack", version = "0.1.0" } + +# To be renamed: +# scuffle-h264 = { path = "crates/h264", version = "0.0.1" } +# scuffle-h265 = { path = "crates/h265", version = "0.0.1" } +# scuffle-mp4 = { path = "crates/mp4", version = "0.0.1" } +# scuffle-rtmp = { path = "crates/rtmp", version = "0.0.1" } +# scuffle-transmuxer = { path = "crates/transmuxer", version = "0.0.1" } [profile.release-debug] inherits = "release" diff --git a/README.md b/README.md index 04bd0eabc..68f572606 100644 --- a/README.md +++ b/README.md @@ -36,30 +36,41 @@ Welcome to **Scuffle**—a next-generation **open-source cloud provider**! 🚀 We're on a mission to revolutionize **video streaming solutions** with cutting-edge tools and libraries. Dive in and explore what we have to offer! 🔗 [Visit our website](https://scuffle.cloud) to learn more. - ## 🛠️ Crates This repository houses a collection of crates, purpose-built libraries designed to simplify development and enhance functionality: - ⚡ **[scuffle-batching](./crates/batching)**: Optimized batching and dataloading for external services. - 🚀 **[scuffle-bootstrap](./crates/bootstrap)**: A utility crate for creating binaries. - - 🔧 **[scuffle-bootstrap-derive](./crates/bootstrap/derive)**: Derive macros for `scuffle-bootstrap`. - - 🔭 **[scuffle-bootstrap-telemetry](./crates/bootstrap/telemetry)**: Telemetry utilities for `scuffle-bootstrap`. + - 🔧 **[scuffle-bootstrap-derive](./crates/bootstrap/derive)**: Derive macros for `scuffle-bootstrap`. + - 🔭 **[scuffle-bootstrap-telemetry](./crates/bootstrap/telemetry)**: Telemetry utilities for `scuffle-bootstrap`. +- 📦 **[scuffle-bytes-util](./crates/bytes-util)**: Some helpful utilities for working with bits and bytes. - 🧭 **[scuffle-context](./crates/context)**: Go-like context utilities for Rust. -- 🎞️ **[scuffle-ffmpeg](./crates/ffmpeg)**: A safe Rust wrapper around FFmpeg C-bindings. +- ⌛ **[scuffle-future-ext](./crates/future-ext)**: Extensions for working with futures. - 📡 **[scuffle-h3-webtransport](./crates/h3-webtransport)**: Enhanced fork of the [h3-webtransport](https://crates.io/crates/h3-webtransport) crate tailored for Scuffle. - 🦈 **[scuffle-http](./crates/http)**: A high-performance HTTP server supporting HTTP/1.1, HTTP/2, and HTTP/3. - 📊 **[scuffle-metrics](./crates/metrics)**: Helper crate to instrument your code with metrics. - - 🔧 **[scuffle-metrics-derive](./crates/metrics/derive)**: Derive macros for `scuffle-metrics`. + - 🔧 **[scuffle-metrics-derive](./crates/metrics/derive)**: Derive macros for `scuffle-metrics`. +- 📦 **[postcompile](./crates/postcompile)**: A macro for compiling Rust code at runtime. Useful for snapshot testing. - 📈 **[scuffle-pprof](./crates/pprof)**: Helper crate for adding pprof support to your application. - ⚙️ **[scuffle-settings](./crates/settings)**: Tools for managing configuration from environment variables or config files. - 📶 **[scuffle-signal](./crates/signal)**: Ergonomic async signal handling. -- 📦 **[postcompile](./crates/postcompile)**: A macro for compiling Rust code at runtime. Useful for snapshot testing. -## 📦 Apps +### 🎥 Multimedia Crates + +Apart from utility crates, we also offer a range of multimedia crates to encode, decode, and transmux media files and streams: -- 📸 **[scuffle-image-processor](./apps/image-processor)**: A general purpose image processor. - - 🔧 **[scuffle-image-processor-proto](./apps/image-processor/proto)**: Protocol buffers for `scuffle-image-processor`. +- 🔉 **[scuffle-aac](./crates/aac)**: A crate for decoding AAC audio headers. +- 🗃️ **[scuffle-amf0](./crates/amf0)**: A pure-rust implementation of AMF0 encoder and decoder. +- 🎥 **[scuffle-av1](./crates/av1)**: A crate for decoding and encoding AV1 video headers. +- 🧮 **[scuffle-expgolomb](./crates/expgolomb)**: A set of helper functions to encode and decode exponential-golomb values. +- 🎞️ **[scuffle-ffmpeg](./crates/ffmpeg)**: A safe Rust wrapper around FFmpeg C-bindings. +- 🎥 **[scuffle-flv](./crates/flv)**: A pure Rust implementation of the FLV format, allowing for demuxing of FLV files or streams. + + + + + --- diff --git a/codecov.yml b/codecov.yml index d513377bc..ba0144d85 100644 --- a/codecov.yml +++ b/codecov.yml @@ -17,14 +17,26 @@ comment: layout: "header, diff, files, components" behavior: default require_changes: false - require_head: no - require_base: no + require_head: false + require_base: false ignore: - "dev-tools/**" component_management: individual_components: + - component_id: scuffle-aac + name: scuffle-aac + paths: + - crates/aac/** + - component_id: scuffle-amf0 + name: scuffle-amf0 + paths: + - crates/amf0/** + - component_id: scuffle-av1 + name: scuffle-av1 + paths: + - crates/av1/** - component_id: scuffle-batching name: scuffle-batching paths: @@ -33,18 +45,42 @@ component_management: name: scuffle-bootstrap paths: - crates/bootstrap/** + - component_id: scuffle-bytes-util + name: scuffle-bytes-util + paths: + - crates/bytes-util/** - component_id: scuffle-context name: scuffle-context paths: - crates/context/** + - component_id: scuffle-expgolomb + name: scuffle-expgolomb + paths: + - crates/expgolomb/** - component_id: scuffle-ffmpeg name: scuffle-ffmpeg paths: - crates/ffmpeg/** + - component_id: scuffle-flv + name: scuffle-flv + paths: + - crates/flv/** + - component_id: scuffle-future-ext + name: scuffle-future-ext + paths: + - crates/future-ext/** - component_id: scuffle-h3-webtransport name: scuffle-h3-webtransport paths: - crates/h3-webtransport/** + # - component_id: scuffle-h264 + # name: scuffle-h264 + # paths: + # - crates/h264/** + # - component_id: scuffle-h265 + # name: scuffle-h265 + # paths: + # - crates/h265/** - component_id: scuffle-http name: scuffle-http paths: @@ -53,10 +89,22 @@ component_management: name: scuffle-metrics paths: - crates/metrics/** + # - component_id: scuffle-mp4 + # name: scuffle-mp4 + # paths: + # - crates/mp4/** + - component_id: postcompile + name: postcompile + paths: + - crates/postcompile/** - component_id: scuffle-pprof name: scuffle-pprof paths: - crates/pprof/** + # - component_id: scuffle-rtmp + # name: scuffle-rtmp + # paths: + # - crates/rtmp/** - component_id: scuffle-settings name: scuffle-settings paths: @@ -65,11 +113,7 @@ component_management: name: scuffle-signal paths: - crates/signal/** - - component_id: postcompile - name: postcompile - paths: - - crates/postcompile/** - - component_id: scuffle-image-processor - name: scuffle-image-processor - paths: - - crates/image-processor/** + # - component_id: scuffle-transmuxer + # name: scuffle-transmuxer + # paths: + # - crates/transmuxer/** diff --git a/crates/flv/Cargo.toml b/crates/flv/Cargo.toml index f60afccd3..b46970485 100644 --- a/crates/flv/Cargo.toml +++ b/crates/flv/Cargo.toml @@ -20,9 +20,11 @@ num-traits = "0.2" num-derive = "0.4" thiserror = "2.0" +# scuffle-h264.workspace = true +# scuffle-h265.workspace = true h264 = { path = "../h264" } h265 = { path = "../h265" } -scuffle-aac = { path = "../aac" } +scuffle-aac.workspace = true scuffle-bytes-util.workspace = true scuffle-av1.workspace = true scuffle-amf0.workspace = true diff --git a/crates/http/Cargo.toml b/crates/http/Cargo.toml index 73fc215d8..65e933883 100644 --- a/crates/http/Cargo.toml +++ b/crates/http/Cargo.toml @@ -25,7 +25,7 @@ itoa = { version = "1" } smallvec = { version = "1" } spin = { version = "0.9" } async-trait = { version = "0.1" } -scuffle-future-ext = { path = "../future-ext" } +scuffle-future-ext.workspace = true # For extra services features tower-service = { version = "0.3", optional = true } axum-core = { version = "0.4", optional = true } diff --git a/crates/mp4/Cargo.toml b/crates/mp4/Cargo.toml index 5fabccc2d..141d7633a 100644 --- a/crates/mp4/Cargo.toml +++ b/crates/mp4/Cargo.toml @@ -10,10 +10,13 @@ bytes = "1.5" fixed = "1.24" paste = "1.0" + +# scuffle-h264.workspace = true +# scuffle-h265.workspace = true h264 = { path = "../h264" } h265 = { path = "../h265" } scuffle-av1.workspace = true -scuffle-aac = { path = "../aac" } +scuffle-aac.workspace = true scuffle-bytes-util.workspace = true scuffle-workspace-hack.workspace = true diff --git a/crates/transmuxer/Cargo.toml b/crates/transmuxer/Cargo.toml index 6a96851a3..ba9f951f2 100644 --- a/crates/transmuxer/Cargo.toml +++ b/crates/transmuxer/Cargo.toml @@ -8,10 +8,14 @@ license = "MIT OR Apache-2.0" byteorder = "1.5" bytes = "1.5" + +# scuffle-h264.workspace = true +# scuffle-h265.workspace = true +# scuffle-mp4.workspace = true h264 = { path = "../h264" } h265 = { path = "../h265" } -scuffle-aac = { path = "../aac" } mp4 = { path = "../mp4" } +scuffle-aac.workspace = true scuffle-av1.workspace = true scuffle-flv.workspace = true scuffle-amf0.workspace = true