From 3eedd9afaf462f6c56f8d9c8a43cb5878e691bfb Mon Sep 17 00:00:00 2001 From: harry Date: Wed, 4 Nov 2026 18:03:03 +0900 Subject: [PATCH] chore(release): 0.18.1 Publish emberwave-core and emberwave-cli on crates.io, so a Rust project takes the library with `cargo add emberwave-core` and the command line decoder installs with `cargo install emberwave-cli`. The code is that of 0.18.0; the patch release carries the packaging. - core and cli are publishable, with keywords, categories, the README and a copy of LICENSE in each package; ffi and web stay unpublished, as C, Swift and the browser take release assets. - README.md and README.ko.md name the two commands; CONTRIBUTING's release rule gains the publish step. - Version 0.18.1 in Cargo.toml and the C API's version constants, header regenerated. Claude-Session: https://claude.ai/code/session_019fJGoCTvP5e7n599q3ZQ42 --- ARCHITECTURE.md | 2 +- CHANGELOG.md | 4 ++++ CONTRIBUTING.md | 2 +- Cargo.lock | 8 ++++---- Cargo.toml | 4 ++-- README.ko.md | 2 ++ README.md | 2 ++ crates/emberwave-cli/Cargo.toml | 4 +++- crates/emberwave-cli/LICENSE | 21 +++++++++++++++++++++ crates/emberwave-core/Cargo.toml | 4 +++- crates/emberwave-core/LICENSE | 21 +++++++++++++++++++++ crates/emberwave-ffi/README.md | 2 +- crates/emberwave-ffi/include/emberwave.h | 4 ++-- crates/emberwave-ffi/src/lib.rs | 4 ++-- 14 files changed, 69 insertions(+), 15 deletions(-) create mode 100644 crates/emberwave-cli/LICENSE create mode 100644 crates/emberwave-core/LICENSE diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 0d1dd93..73c5f0f 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -1,6 +1,6 @@ # Architecture -> **Status (v0.18.0).** The bitstream format is documented below and implemented by `emberwave_core::bitstream`, with a slow CPU reference decoder in `emberwave_core::cpu`, the wgpu/WGSL decoder in `emberwave_core::gpu` and the colour conversion in `emberwave_core::color`. The encoder runs on the CPU (`emberwave_core::encode`) and on the GPU (`emberwave_core::gpu`). `emberwave-cli` decodes and encodes files with them, `emberwave-web` plays them in a browser, also packet by packet as a stream arrives, and `emberwave-ffi` offers the decoder and the GPU encoder to C, also as an XCFramework for iPhone, iPad and Mac apps, and hands Metal clients the decoded picture in a texture, or its planes in three, also into the client's own textures and on its own queue without waiting, where calls take turns at its command buffers; it runs on a client's own Vulkan device and images as well, shares textures and fences with Direct3D 12 and 11 devices on Windows, and encodes a host's pictures straight from its textures, in RGB as captures hold them too; on Metal the planes are stored straight into the textures, and on Apple silicon the frames are written where the shaders read them. A decoder can keep the last frame's detail in the blocks a frame drawn in part lacks, where the picture is still. Decode and encode times are in `BENCHMARKS.md`. The decision log at the end is kept up to date. +> **Status (v0.18.1).** The bitstream format is documented below and implemented by `emberwave_core::bitstream`, with a slow CPU reference decoder in `emberwave_core::cpu`, the wgpu/WGSL decoder in `emberwave_core::gpu` and the colour conversion in `emberwave_core::color`. The encoder runs on the CPU (`emberwave_core::encode`) and on the GPU (`emberwave_core::gpu`). `emberwave-cli` decodes and encodes files with them, `emberwave-web` plays them in a browser, also packet by packet as a stream arrives, and `emberwave-ffi` offers the decoder and the GPU encoder to C, also as an XCFramework for iPhone, iPad and Mac apps, and hands Metal clients the decoded picture in a texture, or its planes in three, also into the client's own textures and on its own queue without waiting, where calls take turns at its command buffers; it runs on a client's own Vulkan device and images as well, shares textures and fences with Direct3D 12 and 11 devices on Windows, and encodes a host's pictures straight from its textures, in RGB as captures hold them too; on Metal the planes are stored straight into the textures, and on Apple silicon the frames are written where the shaders read them. A decoder can keep the last frame's detail in the blocks a frame drawn in part lacks, where the picture is still. Decode and encode times are in `BENCHMARKS.md`. The decision log at the end is kept up to date. ## Overview diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b867f9..bdafbb1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ All notable changes to emberwave. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and versions follow [Semantic Versioning](https://semver.org/). +## [0.18.1] - 2026-11-04 + +`emberwave-core` and `emberwave-cli` are on crates.io: `cargo add emberwave-core` for the library, `cargo install emberwave-cli` for the command line decoder. The code is that of 0.18.0. + ## [0.18.0] - 2026-10-31 What a client can ask: how much of a frame has arrived, and which GPU a context runs on, in Rust, through the C API and in the browser player. Nothing breaks. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 35c91a3..343836e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -73,7 +73,7 @@ After a deliberate change to what the encoder writes, `scripts/gen_encoder_vecto - **No "fix later" comments.** Open an issue instead. - **New dependencies** need a reason in the pull request. - **The C API's structs.** A struct the C API takes or fills in through a pointer starts with `struct_size` (decision D69). A member is added at the end, only, and its zero is its default; the struct's `FIRST_SIZE` stays the size it had before. The calls read and write a struct through `read_struct` and `write_struct`, never by dereferencing the pointer. -- **A release** changes the version in `Cargo.toml` and `EMBERWAVE_VERSION_MAJOR`, `_MINOR`, `_PATCH` and `EMBERWAVE_VERSION` in `crates/emberwave-ffi/src/lib.rs` together, as the build fails otherwise, and regenerates the header. +- **A release** changes the version in `Cargo.toml` and `EMBERWAVE_VERSION_MAJOR`, `_MINOR`, `_PATCH` and `EMBERWAVE_VERSION` in `crates/emberwave-ffi/src/lib.rs` together, as the build fails otherwise, and regenerates the header. Once its tag's release is out, `cargo publish -p emberwave-core` and then `cargo publish -p emberwave-cli` put the two crates on crates.io; `emberwave-ffi` and `emberwave-web` are not published. `LICENSE` is copied into both crates, so a change to it goes into the copies too. ## Commits and pull requests diff --git a/Cargo.lock b/Cargo.lock index 0cbc37f..2e6c22e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -288,7 +288,7 @@ dependencies = [ [[package]] name = "emberwave-cli" -version = "0.18.0" +version = "0.18.1" dependencies = [ "clap", "emberwave-core", @@ -299,7 +299,7 @@ dependencies = [ [[package]] name = "emberwave-core" -version = "0.18.0" +version = "0.18.1" dependencies = [ "bytemuck", "naga", @@ -311,7 +311,7 @@ dependencies = [ [[package]] name = "emberwave-ffi" -version = "0.18.0" +version = "0.18.1" dependencies = [ "ash", "cbindgen", @@ -325,7 +325,7 @@ dependencies = [ [[package]] name = "emberwave-web" -version = "0.18.0" +version = "0.18.1" dependencies = [ "emberwave-core", "wasm-bindgen", diff --git a/Cargo.toml b/Cargo.toml index bb51df1..afb24a0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ members = [ ] [workspace.package] -version = "0.18.0" +version = "0.18.1" edition = "2024" license = "MIT" repository = "https://github.com/with-developer/emberwave" @@ -17,7 +17,7 @@ rust-version = "1.87" publish = false [workspace.dependencies] -emberwave-core = { path = "crates/emberwave-core", version = "0.18.0" } +emberwave-core = { path = "crates/emberwave-core", version = "0.18.1" } thiserror = "2" proptest = "1" # Native backends only: GLES would need EGL and the browser backend is for the diff --git a/README.ko.md b/README.ko.md index 433646b..b4542d9 100644 --- a/README.ko.md +++ b/README.ko.md @@ -67,6 +67,8 @@ target/release/emberwave-cli decode testdata/gradient_200x120_420.pwv1 --out-dir 처음 빌드할 때는 몇 분이 걸립니다. 마지막 명령은 사용 중인 어댑터와 프레임별 시간을 출력하고, 색 그러데이션 그림 `out/gradient_200x120_420_000000.png`부터 `000002.png`까지를 만듭니다. `testdata/`의 `.pwv1` 파일은 업스트림 인코더로 만든 작은 스트림입니다. +Rust가 있다면 명령줄 디코더를 [crates.io](https://crates.io/crates/emberwave-cli)에서 `cargo install emberwave-cli`로 설치할 수도 있습니다. Rust 프로젝트에서 라이브러리를 쓰려면 `cargo add emberwave-core`를 실행하세요([문서](https://docs.rs/emberwave-core)). + Rust가 없다면 [릴리스](https://github.com/with-developer/emberwave/releases)에서 Linux(x86_64), macOS(Apple silicon), Windows(x86_64)용 `emberwave-cli`를 내려받아 `testdata/`의 `.pwv1` 파일을 디코딩해 보면 됩니다. macOS 바이너리는 서명이 없으므로, 내려받은 뒤 `xattr -d com.apple.quarantine emberwave-cli`를 한 번 실행하세요. ## 사용법 diff --git a/README.md b/README.md index 484c38f..29960a6 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,8 @@ target/release/emberwave-cli decode testdata/gradient_200x120_420.pwv1 --out-dir The first build takes a few minutes. The last command prints the adapter it uses and the time of each frame, and leaves `out/gradient_200x120_420_000000.png` to `000002.png`: a colour gradient. The `.pwv1` files in `testdata/` are small streams made by upstream's encoder. +With Rust, the command line decoder also installs from [crates.io](https://crates.io/crates/emberwave-cli) with `cargo install emberwave-cli`, and a Rust project takes the library with `cargo add emberwave-core` ([documentation](https://docs.rs/emberwave-core)). + Without Rust, take `emberwave-cli` for Linux (x86_64), macOS (Apple Silicon) or Windows (x86_64) from the [releases](https://github.com/with-developer/emberwave/releases) and decode a `.pwv1` file from `testdata/` with it. The macOS binary is not signed, so run `xattr -d com.apple.quarantine emberwave-cli` once after downloading it. ## Usage diff --git a/crates/emberwave-cli/Cargo.toml b/crates/emberwave-cli/Cargo.toml index b001355..5226f3f 100644 --- a/crates/emberwave-cli/Cargo.toml +++ b/crates/emberwave-cli/Cargo.toml @@ -6,7 +6,9 @@ edition.workspace = true license.workspace = true repository.workspace = true rust-version.workspace = true -publish.workspace = true +readme = "../../README.md" +keywords = ["pyrowave", "video", "codec", "wavelet", "wgpu"] +categories = ["multimedia::video", "command-line-utilities"] [dependencies] emberwave-core.workspace = true diff --git a/crates/emberwave-cli/LICENSE b/crates/emberwave-cli/LICENSE new file mode 100644 index 0000000..b697bbe --- /dev/null +++ b/crates/emberwave-cli/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 emberwave contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/crates/emberwave-core/Cargo.toml b/crates/emberwave-core/Cargo.toml index f74b560..98c0e97 100644 --- a/crates/emberwave-core/Cargo.toml +++ b/crates/emberwave-core/Cargo.toml @@ -6,7 +6,9 @@ edition.workspace = true license.workspace = true repository.workspace = true rust-version.workspace = true -publish.workspace = true +readme = "../../README.md" +keywords = ["pyrowave", "video", "codec", "wavelet", "wgpu"] +categories = ["multimedia::video", "multimedia::encoding", "graphics"] [features] default = ["gpu"] diff --git a/crates/emberwave-core/LICENSE b/crates/emberwave-core/LICENSE new file mode 100644 index 0000000..b697bbe --- /dev/null +++ b/crates/emberwave-core/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 emberwave contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/crates/emberwave-ffi/README.md b/crates/emberwave-ffi/README.md index 8d345c8..1528bf4 100644 --- a/crates/emberwave-ffi/README.md +++ b/crates/emberwave-ffi/README.md @@ -81,7 +81,7 @@ A Swift package names the XCFramework as a binary target. From a release, it tak // In the app's Package.swift, with the version of the release: .binaryTarget( name: "Emberwave", - url: "https://github.com/with-developer/emberwave/releases/download/v0.18.0/Emberwave.xcframework.zip", + url: "https://github.com/with-developer/emberwave/releases/download/v0.18.1/Emberwave.xcframework.zip", checksum: "..." // the release's SHA256SUMS line for Emberwave.xcframework.zip ), .target( diff --git a/crates/emberwave-ffi/include/emberwave.h b/crates/emberwave-ffi/include/emberwave.h index 438d818..b92a945 100644 --- a/crates/emberwave-ffi/include/emberwave.h +++ b/crates/emberwave-ffi/include/emberwave.h @@ -48,13 +48,13 @@ #define EMBERWAVE_VERSION_MINOR 18 // The patch version of emberwave that this header belongs to. -#define EMBERWAVE_VERSION_PATCH 0 +#define EMBERWAVE_VERSION_PATCH 1 // The version this header belongs to as one number, major times 10000 plus // minor times 100 plus patch: 1600 for 0.16.0. `emberwave_version_number()` // gives the library's, which differs when a program runs with another // library than the one it was built for. -#define EMBERWAVE_VERSION 1800 +#define EMBERWAVE_VERSION 1801 // 4:2:0: the chroma planes have half the width and height of the luma plane, // whose width and height are even. diff --git a/crates/emberwave-ffi/src/lib.rs b/crates/emberwave-ffi/src/lib.rs index 9a8a2e8..3847e22 100644 --- a/crates/emberwave-ffi/src/lib.rs +++ b/crates/emberwave-ffi/src/lib.rs @@ -94,12 +94,12 @@ pub const EMBERWAVE_VERSION_MAJOR: u32 = 0; /// The minor version of emberwave that this header belongs to. pub const EMBERWAVE_VERSION_MINOR: u32 = 18; /// The patch version of emberwave that this header belongs to. -pub const EMBERWAVE_VERSION_PATCH: u32 = 0; +pub const EMBERWAVE_VERSION_PATCH: u32 = 1; /// The version this header belongs to as one number, major times 10000 plus /// minor times 100 plus patch: 1600 for 0.16.0. `emberwave_version_number()` /// gives the library's, which differs when a program runs with another /// library than the one it was built for. -pub const EMBERWAVE_VERSION: u32 = 1800; +pub const EMBERWAVE_VERSION: u32 = 1801; /// The library's version as `EMBERWAVE_VERSION` numbers it, from the crate's. const VERSION_NUMBER: u32 = decimal(env!("CARGO_PKG_VERSION_MAJOR")) * 10000