From 4176571b061f4419b976e9003d384dde9d2b9d27 Mon Sep 17 00:00:00 2001 From: jprochazk Date: Tue, 3 Sep 2024 11:56:58 +0200 Subject: [PATCH 01/61] temp --- .vscode/settings.json | 1 + Cargo.lock | 118 +- crates/store/re_video/Cargo.toml | 4 + crates/store/re_video/src/decode/av1.rs | 92 ++ crates/store/re_video/src/decode/mod.rs | 19 + crates/store/re_video/src/demux/mod.rs | 123 ++ crates/store/re_video/src/{ => demux}/mp4.rs | 2 + crates/store/re_video/src/lib.rs | 122 +- .../src/renderer/video/decoder/native.rs | 4 +- .../re_renderer/src/renderer/video/mod.rs | 4 +- pixi.lock | 1146 +++++++++++++---- pixi.toml | 1 + rust-toolchain | 2 +- 13 files changed, 1222 insertions(+), 416 deletions(-) create mode 100644 crates/store/re_video/src/decode/av1.rs create mode 100644 crates/store/re_video/src/decode/mod.rs create mode 100644 crates/store/re_video/src/demux/mod.rs rename crates/store/re_video/src/{ => demux}/mp4.rs (99%) diff --git a/.vscode/settings.json b/.vscode/settings.json index f92aa692cba5..405429e46566 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -59,6 +59,7 @@ "python.analysis.extraPaths": [ "rerun_py/rerun_sdk" ], + "python.terminal.activateEnvironment": false, "ruff.format.args": [ "--config=rerun_py/pyproject.toml" ], diff --git a/Cargo.lock b/Cargo.lock index 8fd958eeca93..2009048130e8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -538,6 +538,12 @@ dependencies = [ "zbus", ] +[[package]] +name = "assert_matches" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" + [[package]] name = "async-broadcast" version = "0.5.1" @@ -757,6 +763,26 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1181e1e0d1fce796a03db1ae795d67167da795f9cf4a39c37589e85ef57f26d3" +[[package]] +name = "atomig" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eaf2a17b11f7923d0abe0e07377c7f0f1255a8267f05c8a9cba8dc039acc821" +dependencies = [ + "atomig-macro", +] + +[[package]] +name = "atomig-macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a10c8c98ca4c65e4bdd6f1506beb768671f8dce3f5df4dd7d14632b6ecc6f43" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "atspi" version = "0.19.0" @@ -811,6 +837,20 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "av-data" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75b98a3525d00f920df9a2d44cc99b9cc5b7dc70d7fbb612cd755270dbe6552" +dependencies = [ + "byte-slice-cast", + "bytes", + "num-derive", + "num-rational", + "num-traits", + "thiserror", +] + [[package]] name = "az" version = "1.2.1" @@ -945,6 +985,12 @@ version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" +[[package]] +name = "byte-slice-cast" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" + [[package]] name = "bytecount" version = "0.6.7" @@ -1665,6 +1711,16 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" +[[package]] +name = "dav1d" +version = "0.10.3" +dependencies = [ + "av-data", + "bitflags 2.6.0", + "rav1d", + "static_assertions", +] + [[package]] name = "deranged" version = "0.3.11" @@ -3501,6 +3557,15 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "nasm-rs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12fcfa1bd49e0342ec1d07ed2be83b59963e7acbeb9310e1bb2c07b69dadd959" +dependencies = [ + "jobserver", +] + [[package]] name = "natord" version = "1.0.9" @@ -4081,9 +4146,9 @@ checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -4107,9 +4172,9 @@ dependencies = [ [[package]] name = "paste" -version = "1.0.12" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pathdiff" @@ -4635,6 +4700,34 @@ dependencies = [ "rand", ] +[[package]] +name = "rav1d" +version = "1.0.0" +dependencies = [ + "assert_matches", + "atomig", + "bitflags 2.6.0", + "cc", + "cfg-if", + "libc", + "nasm-rs", + "parking_lot", + "paste", + "raw-cpuid", + "strum", + "to_method", + "zerocopy", +] + +[[package]] +name = "raw-cpuid" +version = "11.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb9ee317cfe3fbd54b36a511efc1edd42e216903c9cd575e686dd68a2ba90d8d" +dependencies = [ + "bitflags 2.6.0", +] + [[package]] name = "raw-window-handle" version = "0.5.2" @@ -5742,6 +5835,8 @@ dependencies = [ name = "re_video" version = "0.19.0-alpha.1+dev" dependencies = [ + "crossbeam", + "dav1d", "mp4", "ordered-float", ] @@ -7182,6 +7277,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +[[package]] +name = "to_method" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c4ceeeca15c8384bbc3e011dbd8fccb7f068a440b752b7d9b32ceb0ca0e2e8" + [[package]] name = "tobj" version = "4.0.0" @@ -8514,18 +8615,19 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.31" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c4061bedbb353041c12f413700357bec76df2c7e2ca8e4df8bac24c6bf68e3d" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ + "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.31" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3c129550b3e6de3fd0ba67ba5c81818f9805e58b8d7fee80a3a59d2c9fc601a" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", diff --git a/crates/store/re_video/Cargo.toml b/crates/store/re_video/Cargo.toml index 24b0072ab5f3..9525741fa944 100644 --- a/crates/store/re_video/Cargo.toml +++ b/crates/store/re_video/Cargo.toml @@ -26,5 +26,9 @@ features = ["all"] [features] [dependencies] +crossbeam.workspace = true mp4.workspace = true ordered-float.workspace = true + +# If this package fails to build, install `nasm` locally, or build through `pixi`. +dav1d = { path = "/home/jan/rerun-io/dav1d-rs", package = "dav1d" } diff --git a/crates/store/re_video/src/decode/av1.rs b/crates/store/re_video/src/decode/av1.rs new file mode 100644 index 000000000000..ae595a86ff77 --- /dev/null +++ b/crates/store/re_video/src/decode/av1.rs @@ -0,0 +1,92 @@ +//! AV1 support. + +use crate::TimeMs; + +use super::PixelFormat; +use super::{Chunk, Frame}; +use crossbeam::channel::{unbounded, Receiver, Sender}; +use dav1d::PixelLayout; +use dav1d::PlanarImageComponent; + +pub struct Decoder { + thread: std::thread::JoinHandle<()>, + sample_tx: Sender, +} + +impl Decoder { + pub fn new(on_output: impl Fn(Frame) + Send + Sync + 'static) -> Self { + let (sample_tx, sample_rx) = unbounded(); + + let thread = std::thread::Builder::new() + .name("av1_decoder".into()) + .spawn(move || decoder_thread(sample_rx, Box::new(on_output))) + .expect("failed to spawn decoder thread"); + + Self { thread, sample_tx } + } +} + +fn decoder_thread(sample_rx: Receiver, on_output: Box) { + let mut settings = dav1d::Settings::new(); + settings.set_n_threads(1); + settings.set_strict_std_compliance(false); + settings.set_max_frame_delay(1); + let mut decoder = + dav1d::Decoder::with_settings(&settings).expect("failed to initialize dav1d::Decoder"); + + while let Ok(chunk) = sample_rx.recv() { + match decoder.send_data( + chunk.data, + None, + Some(time_to_i64(chunk.timestamp)), + Some(time_to_i64(chunk.duration)), + ) { + Ok(()) => {} + Err(err) if err.is_again() => { + // Not enough data yet + continue; + } + Err(err) => { + // Something went wrong + panic!("Failed to decode frame: {err}"); + } + }; + + loop { + match decoder.get_picture() { + Ok(picture) => { + let width = picture.width() as usize; + let height = picture.height() as usize; + + match picture.pixel_layout() { + // Monochrome + PixelLayout::I400 => todo!(), + // 4:2:0 planar + PixelLayout::I420 => todo!(), + // 4:2:2 planar + PixelLayout::I422 => todo!(), + // 4:4:4 planar + PixelLayout::I444 => todo!(), + } + } + Err(err) if err.is_again() => { + // Not enough data yet + break; + } + Err(err) => { + panic!("Failed to decode frame: {err}"); + } + } + } + } +} + +/// We need to convert between `TimeMs` and `i64` because `dav1d` uses `i64` for timestamps. +fn time_to_i64(time: TimeMs) -> i64 { + // multiply by 1000 to lose less precision + (time.as_f64() * 1000.0) as i64 +} + +fn i64_to_time(i64: i64) -> TimeMs { + TimeMs::new(i64 as f64 / 1000.0) +} diff --git a/crates/store/re_video/src/decode/mod.rs b/crates/store/re_video/src/decode/mod.rs new file mode 100644 index 000000000000..455f0294dd84 --- /dev/null +++ b/crates/store/re_video/src/decode/mod.rs @@ -0,0 +1,19 @@ +//! Video frame decoding. + +pub mod av1; + +use crate::TimeMs; + +pub struct Chunk { + pub data: Vec, + pub timestamp: TimeMs, + pub duration: TimeMs, +} + +pub struct Frame {} + +pub enum PixelFormat { + NV12, + YUY2, + RGB, +} diff --git a/crates/store/re_video/src/demux/mod.rs b/crates/store/re_video/src/demux/mod.rs new file mode 100644 index 000000000000..8827d1b1a54c --- /dev/null +++ b/crates/store/re_video/src/demux/mod.rs @@ -0,0 +1,123 @@ +//! Video demultiplexing. +//! +//! Parses a video file into a raw [`VideoData`] struct, which contains basic metadata and a list of [`Segment`]s. + +pub mod mp4; + +use crate::TimeMs; + +/// Decoded video data. +#[derive(Clone)] +pub struct VideoData { + pub config: Config, + + /// Duration of the video, in milliseconds. + pub duration: TimeMs, + + /// We split video into segments, each beginning with a key frame, + /// followed by any number of delta frames. + pub segments: Vec, + + /// This array stores all data used by samples. + pub data: Vec, +} + +/// A segment of a video. +#[derive(Clone)] +pub struct Segment { + /// Time of the first sample in this segment, in milliseconds. + pub timestamp: TimeMs, + + /// List of samples contained in this segment. + /// At least one sample per segment is guaranteed, + /// and the first sample is always a key frame. + pub samples: Vec, +} + +/// A single sample in a video. +#[derive(Debug, Clone)] +pub struct Sample { + /// Time at which this sample appears, in milliseconds. + pub timestamp: TimeMs, + + /// Duration of the sample, in milliseconds. + pub duration: TimeMs, + + /// Offset into [`VideoData::data`] + pub byte_offset: u32, + + /// Length of sample starting at [`Sample::byte_offset`]. + pub byte_length: u32, +} + +/// Configuration of a video. +#[derive(Debug, Clone)] +pub struct Config { + /// String used to identify the codec and some of its configuration. + pub codec: String, + + /// Codec-specific configuration. + pub description: Vec, + + /// Natural height of the video. + pub coded_height: u16, + + /// Natural width of the video. + pub coded_width: u16, +} + +/// Errors that can occur when loading a video. +#[derive(Debug)] +pub enum VideoLoadError { + ParseMp4(::mp4::Error), + NoVideoTrack, + InvalidConfigFormat, + InvalidSamples, + UnsupportedMediaType(String), + UnknownMediaType, + UnsupportedCodec(String), +} + +impl std::fmt::Display for VideoLoadError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::ParseMp4(err) => write!(f, "failed to parse video: {err}"), + Self::NoVideoTrack => write!(f, "video file has no video tracks"), + Self::InvalidConfigFormat => write!(f, "video file track config is invalid"), + Self::InvalidSamples => write!(f, "video file has invalid sample entries"), + Self::UnsupportedMediaType(type_) => { + write!(f, "unsupported media type {type_:?}") + } + Self::UnknownMediaType => write!(f, "unknown media type"), + Self::UnsupportedCodec(codec) => write!(f, "unsupported codec {codec:?}"), + } + } +} + +impl std::error::Error for VideoLoadError {} + +impl From<::mp4::Error> for VideoLoadError { + fn from(value: ::mp4::Error) -> Self { + Self::ParseMp4(value) + } +} + +impl std::fmt::Debug for VideoData { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("Video") + .field("config", &self.config) + .field("duration", &self.duration) + .field("segments", &self.segments) + .field("data", &self.data.len()) + .finish() + } +} + +impl std::fmt::Debug for Segment { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("Segment") + .field("timestamp", &self.timestamp) + .field("samples", &self.samples.len()) + .finish() + } +} diff --git a/crates/store/re_video/src/mp4.rs b/crates/store/re_video/src/demux/mp4.rs similarity index 99% rename from crates/store/re_video/src/mp4.rs rename to crates/store/re_video/src/demux/mp4.rs index b3806121765c..fa30c10b2637 100644 --- a/crates/store/re_video/src/mp4.rs +++ b/crates/store/re_video/src/demux/mp4.rs @@ -1,3 +1,5 @@ +//! MP4 support. + #![allow(clippy::map_err_ignore)] use crate::TimeMs; diff --git a/crates/store/re_video/src/lib.rs b/crates/store/re_video/src/lib.rs index 204fa42fb1f4..25cc904a8184 100644 --- a/crates/store/re_video/src/lib.rs +++ b/crates/store/re_video/src/lib.rs @@ -1,70 +1,10 @@ //! Video decoding library. -//! -//! The entry point is [`load_mp4`], which produces an instance of [`VideoData`]. -mod mp4; -pub use mp4::load_mp4; -use ordered_float::OrderedFloat; - -/// Decoded video data. -#[derive(Clone)] -pub struct VideoData { - pub config: Config, - - /// Duration of the video, in milliseconds. - pub duration: TimeMs, - - /// We split video into segments, each beginning with a key frame, - /// followed by any number of delta frames. - pub segments: Vec, - - /// This array stores all data used by samples. - pub data: Vec, -} - -/// A segment of a video. -#[derive(Clone)] -pub struct Segment { - /// Time of the first sample in this segment, in milliseconds. - pub timestamp: TimeMs, - - /// List of samples contained in this segment. - /// At least one sample per segment is guaranteed, - /// and the first sample is always a key frame. - pub samples: Vec, -} +pub mod decode; -/// A single sample in a video. -#[derive(Debug, Clone)] -pub struct Sample { - /// Time at which this sample appears, in milliseconds. - pub timestamp: TimeMs, +pub mod demux; - /// Duration of the sample, in milliseconds. - pub duration: TimeMs, - - /// Offset into [`VideoData::data`] - pub byte_offset: u32, - - /// Length of sample starting at [`Sample::byte_offset`]. - pub byte_length: u32, -} - -/// Configuration of a video. -#[derive(Debug, Clone)] -pub struct Config { - /// String used to identify the codec and some of its configuration. - pub codec: String, - - /// Codec-specific configuration. - pub description: Vec, - - /// Natural height of the video. - pub coded_height: u16, - - /// Natural width of the video. - pub coded_width: u16, -} +use ordered_float::OrderedFloat; #[derive(Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] pub struct TimeMs(OrderedFloat); @@ -96,59 +36,3 @@ impl std::ops::Sub for TimeMs { Self(self.0 - rhs.0) } } - -/// Errors that can occur when loading a video. -#[derive(Debug)] -pub enum VideoLoadError { - ParseMp4(::mp4::Error), - NoVideoTrack, - InvalidConfigFormat, - InvalidSamples, - UnsupportedMediaType(String), - UnknownMediaType, - UnsupportedCodec(String), -} - -impl std::fmt::Display for VideoLoadError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Self::ParseMp4(err) => write!(f, "failed to parse video: {err}"), - Self::NoVideoTrack => write!(f, "video file has no video tracks"), - Self::InvalidConfigFormat => write!(f, "video file track config is invalid"), - Self::InvalidSamples => write!(f, "video file has invalid sample entries"), - Self::UnsupportedMediaType(type_) => { - write!(f, "unsupported media type {type_:?}") - } - Self::UnknownMediaType => write!(f, "unknown media type"), - Self::UnsupportedCodec(codec) => write!(f, "unsupported codec {codec:?}"), - } - } -} - -impl std::error::Error for VideoLoadError {} - -impl From<::mp4::Error> for VideoLoadError { - fn from(value: ::mp4::Error) -> Self { - Self::ParseMp4(value) - } -} - -impl std::fmt::Debug for VideoData { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("Video") - .field("config", &self.config) - .field("duration", &self.duration) - .field("segments", &self.segments) - .field("data", &self.data.len()) - .finish() - } -} - -impl std::fmt::Debug for Segment { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("Segment") - .field("timestamp", &self.timestamp) - .field("samples", &self.samples.len()) - .finish() - } -} diff --git a/crates/viewer/re_renderer/src/renderer/video/decoder/native.rs b/crates/viewer/re_renderer/src/renderer/video/decoder/native.rs index a587c9b786b6..7fca964fd2d8 100644 --- a/crates/viewer/re_renderer/src/renderer/video/decoder/native.rs +++ b/crates/viewer/re_renderer/src/renderer/video/decoder/native.rs @@ -12,12 +12,12 @@ use re_video::TimeMs; use super::alloc_video_frame_texture; pub struct VideoDecoder { - data: re_video::VideoData, + data: re_video::demux::VideoData, zeroed_texture: GpuTexture2D, } impl VideoDecoder { - pub fn new(render_context: &RenderContext, data: re_video::VideoData) -> Option { + pub fn new(render_context: &RenderContext, data: re_video::demux::VideoData) -> Option { re_log::warn_once!("Video playback not yet available in the native viewer, try the web viewer instead. See https://github.com/rerun-io/rerun/issues/7298 for more information."); let device = render_context.device.clone(); diff --git a/crates/viewer/re_renderer/src/renderer/video/mod.rs b/crates/viewer/re_renderer/src/renderer/video/mod.rs index 62a08a9608d9..6b8aef089f8b 100644 --- a/crates/viewer/re_renderer/src/renderer/video/mod.rs +++ b/crates/viewer/re_renderer/src/renderer/video/mod.rs @@ -2,8 +2,8 @@ mod decoder; use crate::resource_managers::GpuTexture2D; use crate::RenderContext; +use re_video::demux::{mp4, VideoLoadError}; use re_video::TimeMs; -use re_video::VideoLoadError; /// A video file. /// @@ -23,7 +23,7 @@ impl Video { data: &[u8], ) -> Result { let data = match media_type { - Some("video/mp4") => re_video::load_mp4(data)?, + Some("video/mp4") => mp4::load_mp4(data)?, Some(media_type) => { return Err(VideoError::Load(VideoLoadError::UnsupportedMediaType( media_type.to_owned(), diff --git a/pixi.lock b/pixi.lock index c676c993324d..7bc523e0d341 100644 --- a/pixi.lock +++ b/pixi.lock @@ -125,6 +125,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.0.5-py311h459d7ec_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.8.0-py311h459d7ec_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nasm-2.16.03-h4bc722e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.11.1-h924138e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.12.2-hb753e55_0.conda @@ -349,6 +350,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.0.5-py311hcd402e7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mypy-1.8.0-py311hcd402e7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nasm-2.16.03-h68df207_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-h0425590_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ninja-1.11.1-hdd96247_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.12.2-hc1f8a26_0.conda @@ -562,6 +564,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/multidict-6.0.5-py311h5547dcb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/mypy-1.8.0-py311he705e18_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/nasm-2.16.03-hfdf4475_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h5846eda_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.11.1-hb8565cd_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/nodejs-20.12.2-hfc0f20e_0.conda @@ -772,6 +775,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.0.5-py311he2be06e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-1.8.0-py311h05b510d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nasm-2.16.03-h99b78c6_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-hb89a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.11.1-hffc8910_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-20.12.2-h3b52c9b_0.conda @@ -958,6 +962,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/multidict-6.0.5-py311ha68e1ae_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mypy-1.8.0-py311ha68e1ae_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/nasm-2.16.03-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.11.1-h91493d7_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-20.12.2-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.4-py311h0b4df5a_0.conda @@ -1172,6 +1177,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.0.5-py311h459d7ec_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.8.0-py311h459d7ec_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nasm-2.16.03-h4bc722e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.11.1-h924138e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.12.2-hb753e55_0.conda @@ -1382,6 +1388,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.0.5-py311hcd402e7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mypy-1.8.0-py311hcd402e7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nasm-2.16.03-h68df207_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-h0425590_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ninja-1.11.1-hdd96247_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.12.2-hc1f8a26_0.conda @@ -1583,6 +1590,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/multidict-6.0.5-py311h5547dcb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/mypy-1.8.0-py311he705e18_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/nasm-2.16.03-hfdf4475_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h5846eda_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.11.1-hb8565cd_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/nodejs-20.12.2-hfc0f20e_0.conda @@ -1780,6 +1788,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.0.5-py311he2be06e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-1.8.0-py311h05b510d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nasm-2.16.03-h99b78c6_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-hb89a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.11.1-hffc8910_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-20.12.2-h3b52c9b_0.conda @@ -1969,6 +1978,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/multidict-6.0.5-py311ha68e1ae_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mypy-1.8.0-py311ha68e1ae_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/nasm-2.16.03-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.11.1-h91493d7_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-20.12.2-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.4-py311h0b4df5a_0.conda @@ -6079,6 +6089,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.3.0-hf1915f5_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.3.0-hca2cd23_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nasm-2.16.03-h4bc722e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nettle-3.9.1-h7ab15ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.11.1-h924138e_0.conda @@ -6428,6 +6439,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.0.5-py311hcd402e7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mypy-1.8.0-py311hcd402e7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nasm-2.16.03-h68df207_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-h0425590_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nettle-3.9.1-h9d1147b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ninja-1.11.1-hdd96247_0.conda @@ -6743,6 +6755,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/multidict-6.0.5-py311h5547dcb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/mypy-1.8.0-py311he705e18_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/nasm-2.16.03-hfdf4475_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h5846eda_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/nettle-3.9.1-h8e11ae5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.11.1-hb8565cd_0.conda @@ -7038,6 +7051,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.0.5-py311he2be06e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-1.8.0-py311h05b510d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nasm-2.16.03-h99b78c6_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-hb89a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nettle-3.9.1-h40ed0f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.11.1-hffc8910_0.conda @@ -7315,6 +7329,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/multidict-6.0.5-py311ha68e1ae_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mypy-1.8.0-py311ha68e1ae_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/nasm-2.16.03-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.11.1-h91493d7_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-20.12.2-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.4-py311h0b4df5a_0.conda @@ -7660,6 +7675,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.3.0-h70512c7_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.3.0-ha479ceb_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nasm-2.16.03-h4bc722e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nettle-3.9.1-h7ab15ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.11.1-h924138e_0.conda @@ -8198,6 +8214,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.0.5-py311hcd402e7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mypy-1.8.0-py311hcd402e7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nasm-2.16.03-h68df207_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-h0425590_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nettle-3.9.1-h9d1147b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ninja-1.11.1-hdd96247_0.conda @@ -8689,6 +8706,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/multidict-6.0.5-py311h5547dcb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/mypy-1.8.0-py311he705e18_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/nasm-2.16.03-hfdf4475_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h5846eda_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/nettle-3.9.1-h8e11ae5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.11.1-hb8565cd_0.conda @@ -9169,6 +9187,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.0.5-py311he2be06e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-1.8.0-py311h05b510d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nasm-2.16.03-h99b78c6_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-hb89a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nettle-3.9.1-h40ed0f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.11.1-hffc8910_0.conda @@ -9615,6 +9634,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/multidict-6.0.5-py311ha68e1ae_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mypy-1.8.0-py311ha68e1ae_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/nasm-2.16.03-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.11.1-h91493d7_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-20.12.2-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.4-py311h0b4df5a_0.conda @@ -10134,6 +10154,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.3.0-h70512c7_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.3.0-ha479ceb_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nasm-2.16.03-h4bc722e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nettle-3.9.1-h7ab15ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.11.1-h924138e_0.conda @@ -10502,6 +10523,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.0.5-py311hcd402e7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mypy-1.8.0-py311hcd402e7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nasm-2.16.03-h68df207_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-h0425590_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nettle-3.9.1-h9d1147b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ninja-1.11.1-hdd96247_0.conda @@ -10834,6 +10856,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/multidict-6.0.5-py311h5547dcb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/mypy-1.8.0-py311he705e18_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/nasm-2.16.03-hfdf4475_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h5846eda_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/nettle-3.9.1-h8e11ae5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.11.1-hb8565cd_0.conda @@ -11147,6 +11170,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.0.5-py311he2be06e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-1.8.0-py311h05b510d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nasm-2.16.03-h99b78c6_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-hb89a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nettle-3.9.1-h40ed0f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.11.1-hffc8910_0.conda @@ -11426,6 +11450,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/multidict-6.0.5-py311ha68e1ae_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mypy-1.8.0-py311ha68e1ae_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/nasm-2.16.03-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.11.1-h91493d7_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-20.12.2-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.4-py311h0b4df5a_0.conda @@ -11957,8 +11982,8 @@ packages: requires_dist: - idna>=2.8 - sniffio>=1.1 - - exceptiongroup>=1.0.2 ; python_version < '3.11' - - typing-extensions>=4.1 ; python_version < '3.11' + - exceptiongroup>=1.0.2 ; python_full_version < '3.11' + - typing-extensions>=4.1 ; python_full_version < '3.11' - packaging ; extra == 'doc' - sphinx>=7 ; extra == 'doc' - sphinx-rtd-theme ; extra == 'doc' @@ -11971,7 +11996,7 @@ packages: - pytest>=7.0 ; extra == 'test' - pytest-mock>=3.6.1 ; extra == 'test' - trustme ; extra == 'test' - - uvloop>=0.17 ; (platform_python_implementation == 'CPython' and platform_system != 'Windows') and extra == 'test' + - uvloop>=0.17 ; platform_python_implementation == 'CPython' and platform_system != 'Windows' and extra == 'test' - trio>=0.23 ; extra == 'trio' requires_python: '>=3.8' - kind: pypi @@ -11980,15 +12005,15 @@ packages: url: https://files.pythonhosted.org/packages/1a/5a/7b024920cca385eb9b56bc63edf0a647de208346bfac5b339b544733d53a/anywidget-0.9.13-py3-none-any.whl sha256: 43d1658f1043b8c95cd350b2f5deccb123fd37810a36f656d6163aefe8163705 requires_dist: - - importlib-metadata ; python_version < '3.8' + - importlib-metadata ; python_full_version < '3.8' - ipywidgets>=7.6.0 - psygnal>=0.8.1 - typing-extensions>=4.2.0 - comm>=0.1.0 ; extra == 'dev' - watchfiles>=0.18.0 ; extra == 'dev' - - ipython<8.13 ; python_version < '3.9' and extra == 'test' - - msgspec ; python_version > '3.7' and extra == 'test' - - mypy==1.10.0 ; python_version > '3.7' and extra == 'test' + - ipython<8.13 ; python_full_version < '3.9' and extra == 'test' + - msgspec ; python_full_version >= '3.8' and extra == 'test' + - mypy==1.10.0 ; python_full_version >= '3.8' and extra == 'test' - pydantic ; extra == 'test' - pytest ; extra == 'test' - pytest-cov ; extra == 'test' @@ -12100,7 +12125,7 @@ packages: sha256: c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea requires_dist: - argon2-cffi-bindings - - typing-extensions ; python_version < '3.8' + - typing-extensions ; python_full_version < '3.8' - argon2-cffi[tests,typing] ; extra == 'dev' - tox>4 ; extra == 'dev' - furo ; extra == 'docs' @@ -12179,6 +12204,21 @@ packages: - tqdm - trimesh editable: true +- kind: pypi + name: arkit-scenes + version: 0.1.0 + path: examples/python/arkit_scenes + sha256: 1ea1defa403966ebbc7e54ff7b92f65fdb6c98ee3e242d8af0be46023ed87961 + requires_dist: + - matplotlib + - numpy + - opencv-python + - pandas + - rerun-sdk + - scipy + - tqdm + - trimesh + editable: true - kind: pypi name: arrow version: 1.3.0 @@ -12207,19 +12247,19 @@ packages: sha256: 051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24 requires_dist: - six>=1.12.0 - - typing ; python_version < '3.5' - - astroid<2,>=1 ; python_version < '3' and extra == 'astroid' - - astroid<4,>=2 ; python_version >= '3' and extra == 'astroid' + - typing ; python_full_version < '3.5' + - astroid<2,>=1 ; python_full_version < '3' and extra == 'astroid' + - astroid<4,>=2 ; python_full_version >= '3' and extra == 'astroid' - pytest ; extra == 'test' - - astroid<2,>=1 ; python_version < '3' and extra == 'test' - - astroid<4,>=2 ; python_version >= '3' and extra == 'test' + - astroid<2,>=1 ; python_full_version < '3' and extra == 'test' + - astroid<4,>=2 ; python_full_version >= '3' and extra == 'test' - kind: pypi name: async-lru version: 2.0.4 url: https://files.pythonhosted.org/packages/fa/9f/3c3503693386c4b0f245eaf5ca6198e3b28879ca0a40bde6b0e319793453/async_lru-2.0.4-py3-none-any.whl sha256: ff02944ce3c288c5be660c42dbcca0742b32c3b279d6dceda655190240b99224 requires_dist: - - typing-extensions>=4.0.0 ; python_version < '3.11' + - typing-extensions>=4.0.0 ; python_full_version < '3.11' requires_python: '>=3.8' - kind: pypi name: attrs @@ -12227,7 +12267,7 @@ packages: url: https://files.pythonhosted.org/packages/e0/44/827b2a91a5816512fcaf3cc4ebc465ccd5d598c45cefa6703fcf4a79018f/attrs-23.2.0-py3-none-any.whl sha256: 99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1 requires_dist: - - importlib-metadata ; python_version < '3.8' + - importlib-metadata ; python_full_version < '3.8' - attrs[tests] ; extra == 'cov' - coverage[toml]>=5.3 ; extra == 'cov' - attrs[tests] ; extra == 'dev' @@ -12241,8 +12281,8 @@ packages: - zope-interface ; extra == 'docs' - attrs[tests-no-zope] ; extra == 'tests' - zope-interface ; extra == 'tests' - - mypy>=1.6 ; (platform_python_implementation == 'CPython' and python_version >= '3.8') and extra == 'tests-mypy' - - pytest-mypy-plugins ; (platform_python_implementation == 'CPython' and python_version >= '3.8') and extra == 'tests-mypy' + - mypy>=1.6 ; python_full_version >= '3.8' and platform_python_implementation == 'CPython' and extra == 'tests-mypy' + - pytest-mypy-plugins ; python_full_version >= '3.8' and platform_python_implementation == 'CPython' and extra == 'tests-mypy' - attrs[tests-mypy] ; extra == 'tests-no-zope' - cloudpickle ; platform_python_implementation == 'CPython' and extra == 'tests-no-zope' - hypothesis ; extra == 'tests-no-zope' @@ -14518,7 +14558,7 @@ packages: url: https://files.pythonhosted.org/packages/27/45/377f7e32a5c93d94cd56542349b34efab5ca3f9e2fd5a68c5e93169aa32d/Babel-2.15.0-py3-none-any.whl sha256: 08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb requires_dist: - - pytz>=2015.7 ; python_version < '3.9' + - pytz>=2015.7 ; python_full_version < '3.9' - pytest>=6.0 ; extra == 'dev' - pytest-cov ; extra == 'dev' - freezegun~=1.0 ; extra == 'dev' @@ -14562,8 +14602,22 @@ packages: requires_dist: - grpclib - stringcase - - dataclasses ; python_version < '3.7' - - backports-datetime-fromisoformat ; python_version < '3.7' + - dataclasses ; python_full_version < '3.7' + - backports-datetime-fromisoformat ; python_full_version < '3.7' + - black ; extra == 'compiler' + - jinja2 ; extra == 'compiler' + - protobuf ; extra == 'compiler' + requires_python: '>=3.6' +- kind: pypi + name: betterproto + version: 1.2.5 + url: https://files.pythonhosted.org/packages/ff/2e/abfed7a721928e14aeb900182ff695be474c4ee5f07ef0874cc5ecd5b0b1/betterproto-1.2.5.tar.gz + sha256: 74a3ab34646054f674d236d1229ba8182dc2eae86feb249b8590ef496ce9803d + requires_dist: + - grpclib + - stringcase + - dataclasses ; python_full_version < '3.7' + - backports-datetime-fromisoformat ; python_full_version < '3.7' - black ; extra == 'compiler' - jinja2 ; extra == 'compiler' - protobuf ; extra == 'compiler' @@ -14756,11 +14810,11 @@ packages: - packaging>=22.0 - pathspec>=0.9.0 - platformdirs>=2 - - tomli>=1.1.0 ; python_version < '3.11' - - typing-extensions>=4.0.1 ; python_version < '3.11' + - tomli>=1.1.0 ; python_full_version < '3.11' + - typing-extensions>=4.0.1 ; python_full_version < '3.11' - colorama>=0.4.3 ; extra == 'colorama' - - aiohttp!=3.9.0,>=3.7.4 ; (sys_platform == 'win32' and implementation_name == 'pypy') and extra == 'd' - - aiohttp>=3.7.4 ; (sys_platform != 'win32' or implementation_name != 'pypy') and extra == 'd' + - aiohttp!=3.9.0,>=3.7.4 ; implementation_name == 'pypy' and sys_platform == 'win32' and extra == 'd' + - aiohttp>=3.7.4 ; (implementation_name != 'pypy' and extra == 'd') or (sys_platform != 'win32' and extra == 'd') - ipython>=7.8.0 ; extra == 'jupyter' - tokenize-rt>=3.2.0 ; extra == 'jupyter' - uvloop>=0.15.2 ; extra == 'uvloop' @@ -14776,11 +14830,11 @@ packages: - packaging>=22.0 - pathspec>=0.9.0 - platformdirs>=2 - - tomli>=1.1.0 ; python_version < '3.11' - - typing-extensions>=4.0.1 ; python_version < '3.11' + - tomli>=1.1.0 ; python_full_version < '3.11' + - typing-extensions>=4.0.1 ; python_full_version < '3.11' - colorama>=0.4.3 ; extra == 'colorama' - - aiohttp!=3.9.0,>=3.7.4 ; (sys_platform == 'win32' and implementation_name == 'pypy') and extra == 'd' - - aiohttp>=3.7.4 ; (sys_platform != 'win32' or implementation_name != 'pypy') and extra == 'd' + - aiohttp!=3.9.0,>=3.7.4 ; implementation_name == 'pypy' and sys_platform == 'win32' and extra == 'd' + - aiohttp>=3.7.4 ; (implementation_name != 'pypy' and extra == 'd') or (sys_platform != 'win32' and extra == 'd') - ipython>=7.8.0 ; extra == 'jupyter' - tokenize-rt>=3.2.0 ; extra == 'jupyter' - uvloop>=0.15.2 ; extra == 'uvloop' @@ -14796,11 +14850,11 @@ packages: - packaging>=22.0 - pathspec>=0.9.0 - platformdirs>=2 - - tomli>=1.1.0 ; python_version < '3.11' - - typing-extensions>=4.0.1 ; python_version < '3.11' + - tomli>=1.1.0 ; python_full_version < '3.11' + - typing-extensions>=4.0.1 ; python_full_version < '3.11' - colorama>=0.4.3 ; extra == 'colorama' - - aiohttp!=3.9.0,>=3.7.4 ; (sys_platform == 'win32' and implementation_name == 'pypy') and extra == 'd' - - aiohttp>=3.7.4 ; (sys_platform != 'win32' or implementation_name != 'pypy') and extra == 'd' + - aiohttp!=3.9.0,>=3.7.4 ; implementation_name == 'pypy' and sys_platform == 'win32' and extra == 'd' + - aiohttp>=3.7.4 ; (implementation_name != 'pypy' and extra == 'd') or (sys_platform != 'win32' and extra == 'd') - ipython>=7.8.0 ; extra == 'jupyter' - tokenize-rt>=3.2.0 ; extra == 'jupyter' - uvloop>=0.15.2 ; extra == 'uvloop' @@ -14816,11 +14870,11 @@ packages: - packaging>=22.0 - pathspec>=0.9.0 - platformdirs>=2 - - tomli>=1.1.0 ; python_version < '3.11' - - typing-extensions>=4.0.1 ; python_version < '3.11' + - tomli>=1.1.0 ; python_full_version < '3.11' + - typing-extensions>=4.0.1 ; python_full_version < '3.11' - colorama>=0.4.3 ; extra == 'colorama' - - aiohttp!=3.9.0,>=3.7.4 ; (sys_platform == 'win32' and implementation_name == 'pypy') and extra == 'd' - - aiohttp>=3.7.4 ; (sys_platform != 'win32' or implementation_name != 'pypy') and extra == 'd' + - aiohttp!=3.9.0,>=3.7.4 ; implementation_name == 'pypy' and sys_platform == 'win32' and extra == 'd' + - aiohttp>=3.7.4 ; (implementation_name != 'pypy' and extra == 'd') or (sys_platform != 'win32' and extra == 'd') - ipython>=7.8.0 ; extra == 'jupyter' - tokenize-rt>=3.2.0 ; extra == 'jupyter' - uvloop>=0.15.2 ; extra == 'uvloop' @@ -14836,11 +14890,11 @@ packages: - packaging>=22.0 - pathspec>=0.9.0 - platformdirs>=2 - - tomli>=1.1.0 ; python_version < '3.11' - - typing-extensions>=4.0.1 ; python_version < '3.11' + - tomli>=1.1.0 ; python_full_version < '3.11' + - typing-extensions>=4.0.1 ; python_full_version < '3.11' - colorama>=0.4.3 ; extra == 'colorama' - - aiohttp!=3.9.0,>=3.7.4 ; (sys_platform == 'win32' and implementation_name == 'pypy') and extra == 'd' - - aiohttp>=3.7.4 ; (sys_platform != 'win32' or implementation_name != 'pypy') and extra == 'd' + - aiohttp!=3.9.0,>=3.7.4 ; implementation_name == 'pypy' and sys_platform == 'win32' and extra == 'd' + - aiohttp>=3.7.4 ; (implementation_name != 'pypy' and extra == 'd') or (sys_platform != 'win32' and extra == 'd') - ipython>=7.8.0 ; extra == 'jupyter' - tokenize-rt>=3.2.0 ; extra == 'jupyter' - uvloop>=0.15.2 ; extra == 'uvloop' @@ -14864,6 +14918,26 @@ packages: - numpy - rerun-sdk editable: true +- kind: pypi + name: blueprint + version: 0.1.0 + path: examples/python/blueprint + sha256: d9a358e5994ec1e9144942903e46148b16825344cddc19e7188b285f59bc61c1 + requires_dist: + - numpy + - rerun-sdk + editable: true +- kind: pypi + name: blueprint-stocks + version: 0.1.0 + path: examples/python/blueprint_stocks + sha256: 7c8b6805f08610837014175d9d0212815a91c3197756cdbbce836a2f15e40eea + requires_dist: + - humanize + - rerun-sdk + - yfinance + requires_python: '>=3.8' + editable: true - kind: pypi name: blueprint-stocks version: 0.1.0 @@ -16958,7 +17032,7 @@ packages: sha256: ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 requires_dist: - colorama ; platform_system == 'Windows' - - importlib-metadata ; python_version < '3.8' + - importlib-metadata ; python_full_version < '3.8' requires_python: '>=3.7' - kind: pypi name: clock @@ -16969,6 +17043,15 @@ packages: - numpy - rerun-sdk editable: true +- kind: pypi + name: clock + version: 0.1.0 + path: examples/python/clock + sha256: 1ae48a7222b2fc2bd9942a31bb48fefb34225a946859ad95c25ad00bfb754cd7 + requires_dist: + - numpy + - rerun-sdk + editable: true - kind: conda name: cmake version: 3.27.6 @@ -17331,6 +17414,22 @@ packages: - pytest-xdist ; extra == 'test-no-images' - wurlitzer ; extra == 'test-no-images' requires_python: '>=3.9' +- kind: pypi + name: controlnet + version: 0.1.0 + path: examples/python/controlnet + sha256: 8ae055c0b8b0dd7757e4e666f6163172859044d4090830aecbec3460cdb318ee + requires_dist: + - accelerate + - diffusers==0.27.2 + - numpy + - opencv-python + - pillow + - rerun-sdk + - torch==2.2.2 + - transformers + requires_python: '>=3.10' + editable: true - kind: pypi name: controlnet version: 0.1.0 @@ -17719,6 +17818,21 @@ packages: sha256: 4c62dc41109689d03e4b35de0a2bcbdeeb81047badc607c4415d5c753bd683af requires_dist: - matplotlib +- kind: pypi + name: detect-and-track-objects + version: 0.1.0 + path: examples/python/detect_and_track_objects + sha256: 2c2d3d8b61d6a0bf44051fd7052e3087fd4762b9c434586078ea3d179940cba1 + requires_dist: + - numpy + - opencv-contrib-python>4.6 + - pillow + - requests<3,>=2.31 + - rerun-sdk + - timm==0.9.11 + - torch==2.2.2 + - transformers + editable: true - kind: pypi name: detect-and-track-objects version: 0.1.0 @@ -17734,6 +17848,19 @@ packages: - torch==2.2.2 - transformers editable: true +- kind: pypi + name: dicom-mri + version: 0.1.0 + path: examples/python/dicom_mri + sha256: 98cb91dc5758ae59e3cd0fb797f86f40fcf627f63e659365806f59feed4618d8 + requires_dist: + - dicom-numpy==0.6.2 + - numpy + - pydicom==2.3.0 + - requests<3,>=2.31 + - rerun-sdk + - types-requests<3,>=2.31 + editable: true - kind: pypi name: dicom-mri version: 0.1.0 @@ -17853,6 +17980,16 @@ packages: - rerun-sdk - scipy editable: true +- kind: pypi + name: dna + version: 0.1.0 + path: examples/python/dna + sha256: 15dd8b0ce0ee55262916ea9bc8fb93c72c2012cb01a78e6d24a526d92537eab4 + requires_dist: + - numpy + - rerun-sdk + - scipy + editable: true - kind: conda name: double-conversion version: 3.3.0 @@ -18003,7 +18140,7 @@ packages: - coverage ; extra == 'tests' - coverage-enable-subprocess ; extra == 'tests' - littleutils ; extra == 'tests' - - rich ; python_version >= '3.11' and extra == 'tests' + - rich ; python_full_version >= '3.11' and extra == 'tests' requires_python: '>=3.5' - kind: conda name: expat @@ -18097,6 +18234,21 @@ packages: - tqdm requires_python: <3.12 editable: true +- kind: pypi + name: face-tracking + version: 0.1.0 + path: examples/python/face_tracking + sha256: b8725fe4d36c11aad2c6c936ba2b57c7f65a856aa179badca5d041db63119d55 + requires_dist: + - mediapipe==0.10.11 ; sys_platform != 'darwin' + - mediapipe==0.10.9 ; sys_platform == 'darwin' + - numpy + - opencv-python>4.6 + - requests + - rerun-sdk + - tqdm + requires_python: <3.12 + editable: true - kind: pypi name: fastjsonschema version: 2.20.0 @@ -18440,7 +18592,7 @@ packages: - pytest-timeout>=2.2 ; extra == 'testing' - pytest>=7.4.3 ; extra == 'testing' - virtualenv>=20.26.2 ; extra == 'testing' - - typing-extensions>=4.8 ; python_version < '3.11' and extra == 'typing' + - typing-extensions>=4.8 ; python_full_version < '3.11' and extra == 'typing' requires_python: '>=3.8' - kind: pypi name: fire @@ -18450,7 +18602,16 @@ packages: requires_dist: - six - termcolor - - enum34 ; python_version < '3.4' + - enum34 ; python_full_version < '3.4' +- kind: pypi + name: fire + version: 0.6.0 + url: https://files.pythonhosted.org/packages/1b/1b/84c63f592ecdfbb3d77d22a8d93c9b92791e4fa35677ad71a7d6449100f8/fire-0.6.0.tar.gz + sha256: 54ec5b996ecdd3c0309c800324a0703d6da512241bc73b553db959d98de0aa66 + requires_dist: + - six + - termcolor + - enum34 ; python_full_version < '3.4' - kind: pypi name: flatbuffers version: 24.3.25 @@ -18739,7 +18900,7 @@ packages: - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' - - unicodedata2>=15.1.0 ; python_version <= '3.12' and extra == 'all' + - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'all' - xattr ; sys_platform == 'darwin' and extra == 'all' - lz4>=1.7.4.2 ; extra == 'graphite' - pycairo ; extra == 'interpolatable' @@ -18752,7 +18913,7 @@ packages: - sympy ; extra == 'symfont' - xattr ; sys_platform == 'darwin' and extra == 'type1' - fs<3,>=2.2.0 ; extra == 'ufo' - - unicodedata2>=15.1.0 ; python_version <= '3.12' and extra == 'unicode' + - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'unicode' - zopfli>=0.1.4 ; extra == 'woff' - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' @@ -18776,7 +18937,7 @@ packages: - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' - - unicodedata2>=15.1.0 ; python_version <= '3.12' and extra == 'all' + - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'all' - xattr ; sys_platform == 'darwin' and extra == 'all' - lz4>=1.7.4.2 ; extra == 'graphite' - pycairo ; extra == 'interpolatable' @@ -18789,7 +18950,7 @@ packages: - sympy ; extra == 'symfont' - xattr ; sys_platform == 'darwin' and extra == 'type1' - fs<3,>=2.2.0 ; extra == 'ufo' - - unicodedata2>=15.1.0 ; python_version <= '3.12' and extra == 'unicode' + - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'unicode' - zopfli>=0.1.4 ; extra == 'woff' - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' @@ -18813,7 +18974,7 @@ packages: - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' - - unicodedata2>=15.1.0 ; python_version <= '3.12' and extra == 'all' + - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'all' - xattr ; sys_platform == 'darwin' and extra == 'all' - lz4>=1.7.4.2 ; extra == 'graphite' - pycairo ; extra == 'interpolatable' @@ -18826,7 +18987,7 @@ packages: - sympy ; extra == 'symfont' - xattr ; sys_platform == 'darwin' and extra == 'type1' - fs<3,>=2.2.0 ; extra == 'ufo' - - unicodedata2>=15.1.0 ; python_version <= '3.12' and extra == 'unicode' + - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'unicode' - zopfli>=0.1.4 ; extra == 'woff' - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' @@ -18850,7 +19011,7 @@ packages: - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' - - unicodedata2>=15.1.0 ; python_version <= '3.12' and extra == 'all' + - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'all' - xattr ; sys_platform == 'darwin' and extra == 'all' - lz4>=1.7.4.2 ; extra == 'graphite' - pycairo ; extra == 'interpolatable' @@ -18863,7 +19024,7 @@ packages: - sympy ; extra == 'symfont' - xattr ; sys_platform == 'darwin' and extra == 'type1' - fs<3,>=2.2.0 ; extra == 'ufo' - - unicodedata2>=15.1.0 ; python_version <= '3.12' and extra == 'unicode' + - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'unicode' - zopfli>=0.1.4 ; extra == 'woff' - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' @@ -18887,7 +19048,7 @@ packages: - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' - - unicodedata2>=15.1.0 ; python_version <= '3.12' and extra == 'all' + - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'all' - xattr ; sys_platform == 'darwin' and extra == 'all' - lz4>=1.7.4.2 ; extra == 'graphite' - pycairo ; extra == 'interpolatable' @@ -18900,7 +19061,7 @@ packages: - sympy ; extra == 'symfont' - xattr ; sys_platform == 'darwin' and extra == 'type1' - fs<3,>=2.2.0 ; extra == 'ufo' - - unicodedata2>=15.1.0 ; python_version <= '3.12' and extra == 'unicode' + - unicodedata2>=15.1.0 ; python_full_version < '3.13' and extra == 'unicode' - zopfli>=0.1.4 ; extra == 'woff' - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' @@ -18911,7 +19072,7 @@ packages: url: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl sha256: 3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014 requires_dist: - - cached-property>=1.3.0 ; python_version < '3.8' + - cached-property>=1.3.0 ; python_full_version < '3.8' requires_python: '>=2.7,!=3.0,!=3.1,!=3.2,!=3.3,!=3.4,<4' - kind: conda name: freeglut @@ -19451,6 +19612,21 @@ packages: purls: [] size: 31511 timestamp: 1721141544805 +- kind: pypi + name: gesture-detection + version: 0.1.0 + path: examples/python/gesture_detection + sha256: 36dfc4cc822ee47f7aa29ba951bab8a94e96b9fd737daa324a441e6962a620bd + requires_dist: + - mediapipe==0.10.11 ; sys_platform != 'darwin' + - mediapipe==0.10.9 ; sys_platform == 'darwin' + - numpy + - opencv-python>4.9 + - requests<3,>=2.31 + - rerun-sdk + - tqdm + requires_python: <3.12 + editable: true - kind: pypi name: gesture-detection version: 0.1.0 @@ -19967,8 +20143,8 @@ packages: - requests<3.0.0.dev0,>=2.18.0 - grpcio<2.0.dev0,>=1.33.2 ; extra == 'grpc' - grpcio-status<2.0.dev0,>=1.33.2 ; extra == 'grpc' - - grpcio<2.0.dev0,>=1.49.1 ; python_version >= '3.11' and extra == 'grpc' - - grpcio-status<2.0.dev0,>=1.49.1 ; python_version >= '3.11' and extra == 'grpc' + - grpcio<2.0.dev0,>=1.49.1 ; python_full_version >= '3.11' and extra == 'grpc' + - grpcio-status<2.0.dev0,>=1.49.1 ; python_full_version >= '3.11' and extra == 'grpc' - grpcio-gcp<1.0.dev0,>=0.2.2 ; extra == 'grpcgcp' - grpcio-gcp<1.0.dev0,>=0.2.2 ; extra == 'grpcio-gcp' requires_python: '>=3.7' @@ -19998,7 +20174,7 @@ packages: requires_dist: - google-api-core!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.0,<3.0.0.dev0,>=1.31.6 - google-auth<3.0.dev0,>=1.25.0 - - importlib-metadata>1.0.0 ; python_version < '3.8' + - importlib-metadata>1.0.0 ; python_full_version < '3.8' - grpcio<2.0.dev0,>=1.38.0 ; extra == 'grpc' - grpcio-status<2.0.dev0,>=1.38.0 ; extra == 'grpc' requires_python: '>=3.7' @@ -20169,6 +20345,16 @@ packages: - multidict - protobuf>=3.20.0 ; extra == 'protobuf' requires_python: '>=3.7' +- kind: pypi + name: grpclib + version: 0.4.7 + url: https://files.pythonhosted.org/packages/79/b9/55936e462a5925190d7427e880b3033601d1effd13809b483d13a926061a/grpclib-0.4.7.tar.gz + sha256: 2988ef57c02b22b7a2e8e961792c41ccf97efc2ace91ae7a5b0de03c363823c3 + requires_dist: + - h2<5,>=3.1.0 + - multidict + - protobuf>=3.20.0 ; extra == 'protobuf' + requires_python: '>=3.7' - kind: conda name: gxx version: 12.4.0 @@ -20277,7 +20463,7 @@ packages: url: https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl sha256: e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761 requires_dist: - - typing-extensions ; python_version < '3.8' + - typing-extensions ; python_full_version < '3.8' requires_python: '>=3.7' - kind: pypi name: h2 @@ -20538,7 +20724,7 @@ packages: - packaging>=23.2 - pathspec>=0.10.1 - pluggy>=1.0.0 - - tomli>=1.2.2 ; python_version < '3.11' + - tomli>=1.2.2 ; python_full_version < '3.11' - trove-classifiers requires_python: '>=3.8' - kind: conda @@ -20934,6 +21120,20 @@ packages: - types-tqdm ; extra == 'typing' - types-urllib3 ; extra == 'typing' requires_python: '>=3.8.0' +- kind: pypi + name: human-pose-tracking + version: 0.1.0 + path: examples/python/human_pose_tracking + sha256: 8a80b67528d3f6d0c82671dc5c36cf551faa4b879f4434f0d386d8ef85666e86 + requires_dist: + - mediapipe==0.10.11 ; sys_platform != 'darwin' + - mediapipe==0.10.9 ; sys_platform == 'darwin' + - numpy + - opencv-python>4.6 + - requests<3,>=2.31 + - rerun-sdk + requires_python: <3.12 + editable: true - kind: pypi name: human-pose-tracking version: 0.1.0 @@ -20971,7 +21171,7 @@ packages: sha256: e6b14c37ecb73e89c77d78cdb4c2cc8f3fb59a885c5b3f819ff4ed80f25af1b4 requires_dist: - idna>=2.5 - - typing ; python_version < '3.5' + - typing ; python_full_version < '3.5' requires_python: '>=2.6,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*' - kind: conda name: icu @@ -21303,7 +21503,7 @@ packages: sha256: 15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f requires_dist: - zipp>=0.5 - - typing-extensions>=3.6.4 ; python_version < '3.8' + - typing-extensions>=3.6.4 ; python_full_version < '3.8' - sphinx>=3.5 ; extra == 'doc' - jaraco-packaging>=9.3 ; extra == 'doc' - rst-linker>=1.9 ; extra == 'doc' @@ -21322,7 +21522,7 @@ packages: - flufl-flake8 ; extra == 'test' - pytest-perf>=0.9.2 ; extra == 'test' - jaraco-test>=5.4 ; extra == 'test' - - importlib-resources>=1.3 ; python_version < '3.9' and extra == 'test' + - importlib-resources>=1.3 ; python_full_version < '3.9' and extra == 'test' requires_python: '>=3.8' - kind: pypi name: importlib-metadata @@ -21331,7 +21531,7 @@ packages: sha256: 3cd29f739ed65973840b068e3132135ce954c254d48b5b640484467ef7ab3c8c requires_dist: - zipp>=0.5 - - typing-extensions>=3.6.4 ; python_version < '3.8' + - typing-extensions>=3.6.4 ; python_full_version < '3.8' - sphinx>=3.5 ; extra == 'doc' - jaraco-packaging>=9.3 ; extra == 'doc' - rst-linker>=1.9 ; extra == 'doc' @@ -21349,7 +21549,7 @@ packages: - flufl-flake8 ; extra == 'test' - pytest-perf>=0.9.2 ; extra == 'test' - jaraco-test>=5.4 ; extra == 'test' - - importlib-resources>=1.3 ; python_version < '3.9' and extra == 'test' + - importlib-resources>=1.3 ; python_full_version < '3.9' and extra == 'test' - pytest-ruff>=0.2.1 ; sys_platform != 'cygwin' and extra == 'test' requires_python: '>=3.8' - kind: pypi @@ -21361,6 +21561,15 @@ packages: - numpy - rerun-sdk editable: true +- kind: pypi + name: incremental-logging + version: 0.1.0 + path: examples/python/incremental_logging + sha256: c1efe33868c31fe5a07ab5f6e60d28f856735a9e0b221ff96abd2e711d60e894 + requires_dist: + - numpy + - rerun-sdk + editable: true - kind: conda name: iniconfig version: 2.0.0 @@ -21446,9 +21655,9 @@ packages: - pygments>=2.4.0 - stack-data - traitlets>=5.13.0 - - exceptiongroup ; python_version < '3.11' - - typing-extensions>=4.6 ; python_version < '3.12' - - pexpect>4.3 ; sys_platform != 'win32' and sys_platform != 'emscripten' + - exceptiongroup ; python_full_version < '3.11' + - typing-extensions>=4.6 ; python_full_version < '3.12' + - pexpect>4.3 ; sys_platform != 'emscripten' and sys_platform != 'win32' - colorama ; sys_platform == 'win32' - ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole] ; extra == 'all' - ipython[test,test-extra] ; extra == 'all' @@ -21464,7 +21673,7 @@ packages: - sphinx>=1.3 ; extra == 'doc' - sphinxcontrib-jquery ; extra == 'doc' - typing-extensions ; extra == 'doc' - - tomli ; python_version < '3.11' and extra == 'doc' + - tomli ; python_full_version < '3.11' and extra == 'doc' - ipykernel ; extra == 'kernel' - matplotlib ; extra == 'matplotlib' - nbconvert ; extra == 'nbconvert' @@ -21537,7 +21746,7 @@ packages: url: https://files.pythonhosted.org/packages/d2/40/11b7bc1898cf1dcb87ccbe09b39f5088634ac78bb25f3383ff541c2b40aa/jaraco.context-5.3.0-py3-none-any.whl sha256: 3e16388f7da43d384a1a7cd3452e72e14732ac9fe459678773a3608a812bf266 requires_dist: - - backports-tarfile ; python_version < '3.12' + - backports-tarfile ; python_full_version < '3.12' - sphinx>=3.5 ; extra == 'docs' - jaraco-packaging>=9.3 ; extra == 'docs' - rst-linker>=1.9 ; extra == 'docs' @@ -21667,10 +21876,10 @@ packages: - numpy>=1.22 - opt-einsum - scipy>=1.9 - - importlib-metadata>=4.6 ; python_version < '3.10' - - numpy>=1.23.2 ; python_version >= '3.11' - - numpy>=1.26.0 ; python_version >= '3.12' - - scipy>=1.11.1 ; python_version >= '3.12' + - importlib-metadata>=4.6 ; python_full_version < '3.10' + - numpy>=1.23.2 ; python_full_version >= '3.11' + - numpy>=1.26.0 ; python_full_version >= '3.12' + - scipy>=1.11.1 ; python_full_version >= '3.12' - jaxlib==0.4.29 ; extra == 'ci' - jaxlib==0.4.30 ; extra == 'cuda' - jax-cuda12-plugin[with-cuda]<=0.4.30,>=0.4.30 ; extra == 'cuda' @@ -21694,7 +21903,7 @@ packages: - scipy>=1.9 - numpy>=1.22 - ml-dtypes>=0.2.0 - - scipy>=1.11.1 ; python_version >= '3.12' + - scipy>=1.11.1 ; python_full_version >= '3.12' requires_python: '>=3.9' - kind: pypi name: jaxlib @@ -21705,7 +21914,7 @@ packages: - scipy>=1.9 - numpy>=1.22 - ml-dtypes>=0.2.0 - - scipy>=1.11.1 ; python_version >= '3.12' + - scipy>=1.11.1 ; python_full_version >= '3.12' requires_python: '>=3.9' - kind: pypi name: jedi @@ -21761,7 +21970,7 @@ packages: - trio ; extra == 'test' - async-timeout ; extra == 'test' - trio ; extra == 'trio' - - async-generator ; extra == 'trio' and python_version == '3.6' + - async-generator ; python_full_version == '3.6.*' and extra == 'trio' requires_python: '>=3.7' - kind: pypi name: jinja2 @@ -21815,9 +22024,9 @@ packages: sha256: fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566 requires_dist: - attrs>=22.2.0 - - importlib-resources>=1.4.0 ; python_version < '3.9' + - importlib-resources>=1.4.0 ; python_full_version < '3.9' - jsonschema-specifications>=2023.3.6 - - pkgutil-resolve-name>=1.3.10 ; python_version < '3.9' + - pkgutil-resolve-name>=1.3.10 ; python_full_version < '3.9' - referencing>=0.28.4 - rpds-py>=0.7.1 - fqdn ; extra == 'format' @@ -21843,7 +22052,7 @@ packages: url: https://files.pythonhosted.org/packages/ee/07/44bd408781594c4d0a027666ef27fab1e441b109dc3b76b4f836f8fd04fe/jsonschema_specifications-2023.12.1-py3-none-any.whl sha256: 87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c requires_dist: - - importlib-resources>=1.4.0 ; python_version < '3.9' + - importlib-resources>=1.4.0 ; python_full_version < '3.9' - referencing>=0.31.0 requires_python: '>=3.8' - kind: pypi @@ -21864,7 +22073,7 @@ packages: url: https://files.pythonhosted.org/packages/cf/d3/c4bb02580bc0db807edb9a29b2d0c56031be1ef0d804336deb2699a470f6/jupyter_client-8.6.2-py3-none-any.whl sha256: 50cbc5c66fd1b8f65ecb66bc490ab73217993632809b6e505687de18e9dea39f requires_dist: - - importlib-metadata>=4.8.3 ; python_version < '3.10' + - importlib-metadata>=4.8.3 ; python_full_version < '3.10' - jupyter-core!=5.0.*,>=4.12 - python-dateutil>=2.8.2 - pyzmq>=23.0 @@ -21912,7 +22121,7 @@ packages: sha256: 4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409 requires_dist: - platformdirs>=2.5 - - pywin32>=300 ; sys_platform == 'win32' and platform_python_implementation != 'PyPy' + - pywin32>=300 ; platform_python_implementation != 'PyPy' and sys_platform == 'win32' - traitlets>=5.3 - myst-parser ; extra == 'docs' - pydata-sphinx-theme ; extra == 'docs' @@ -21959,7 +22168,7 @@ packages: sha256: 45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da requires_dist: - jupyter-server>=1.1.2 - - importlib-metadata>=4.8.3 ; python_version < '3.10' + - importlib-metadata>=4.8.3 ; python_full_version < '3.10' requires_python: '>=3.8' - kind: pypi name: jupyter-server @@ -22056,8 +22265,8 @@ packages: requires_dist: - async-lru>=1.0.0 - httpx>=0.25.0 - - importlib-metadata>=4.8.3 ; python_version < '3.10' - - importlib-resources>=1.4 ; python_version < '3.9' + - importlib-metadata>=4.8.3 ; python_full_version < '3.10' + - importlib-resources>=1.4 ; python_full_version < '3.9' - ipykernel>=6.5.0 - jinja2>=3.0.3 - jupyter-core @@ -22066,7 +22275,7 @@ packages: - jupyterlab-server<3,>=2.27.1 - notebook-shim>=0.2 - packaging - - tomli>=1.2.2 ; python_version < '3.11' + - tomli>=1.2.2 ; python_full_version < '3.11' - tornado>=6.2.0 - traitlets - build ; extra == 'dev' @@ -22119,8 +22328,8 @@ packages: requires_dist: - async-lru>=1.0.0 - httpx>=0.25.0 - - importlib-metadata>=4.8.3 ; python_version < '3.10' - - importlib-resources>=1.4 ; python_version < '3.9' + - importlib-metadata>=4.8.3 ; python_full_version < '3.10' + - importlib-resources>=1.4 ; python_full_version < '3.9' - ipykernel>=6.5.0 - jinja2>=3.0.3 - jupyter-core @@ -22130,7 +22339,7 @@ packages: - notebook-shim>=0.2 - packaging - setuptools>=40.1.0 - - tomli>=1.2.2 ; python_version < '3.11' + - tomli>=1.2.2 ; python_full_version < '3.11' - tornado>=6.2.0 - traitlets - build ; extra == 'dev' @@ -22188,7 +22397,7 @@ packages: sha256: e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4 requires_dist: - babel>=2.10 - - importlib-metadata>=4.8.3 ; python_version < '3.10' + - importlib-metadata>=4.8.3 ; python_full_version < '3.10' - jinja2>=3.0.3 - json5>=0.9.0 - jsonschema>=4.18.0 @@ -22273,8 +22482,8 @@ packages: - jaraco-classes - jaraco-functools - jaraco-context - - importlib-metadata>=4.11.4 ; python_version < '3.12' - - importlib-resources ; python_version < '3.9' + - importlib-metadata>=4.11.4 ; python_full_version < '3.12' + - importlib-resources ; python_full_version < '3.9' - secretstorage>=3.2 ; sys_platform == 'linux' - jeepney>=0.4.2 ; sys_platform == 'linux' - pywin32-ctypes>=0.2.0 ; sys_platform == 'win32' @@ -22344,7 +22553,7 @@ packages: url: https://files.pythonhosted.org/packages/17/ba/17a706b232308e65f57deeccae503c268292e6a091313f6ce833a23093ea/kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl sha256: 040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e requires_dist: - - typing-extensions ; python_version < '3.8' + - typing-extensions ; python_full_version < '3.8' requires_python: '>=3.7' - kind: pypi name: kiwisolver @@ -22352,7 +22561,7 @@ packages: url: https://files.pythonhosted.org/packages/1e/37/d3c2d4ba2719059a0f12730947bbe1ad5ee8bff89e8c35319dcb2c9ddb4c/kiwisolver-1.4.5-cp311-cp311-win_amd64.whl sha256: 6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355 requires_dist: - - typing-extensions ; python_version < '3.8' + - typing-extensions ; python_full_version < '3.8' requires_python: '>=3.7' - kind: pypi name: kiwisolver @@ -22360,7 +22569,7 @@ packages: url: https://files.pythonhosted.org/packages/4a/fe/23d7fa78f7c66086d196406beb1fb2eaf629dd7adc01c3453033303d17fa/kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl sha256: fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797 requires_dist: - - typing-extensions ; python_version < '3.8' + - typing-extensions ; python_full_version < '3.8' requires_python: '>=3.7' - kind: pypi name: kiwisolver @@ -22368,7 +22577,7 @@ packages: url: https://files.pythonhosted.org/packages/8d/26/b4569d1f29751fca22ee915b4ebfef5974f4ef239b3335fc072882bd62d9/kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl sha256: 76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437 requires_dist: - - typing-extensions ; python_version < '3.8' + - typing-extensions ; python_full_version < '3.8' requires_python: '>=3.7' - kind: pypi name: kiwisolver @@ -22376,7 +22585,7 @@ packages: url: https://files.pythonhosted.org/packages/a6/94/695922e71288855fc7cace3bdb52edda9d7e50edba77abb0c9d7abb51e96/kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl sha256: 8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90 requires_dist: - - typing-extensions ; python_version < '3.8' + - typing-extensions ; python_full_version < '3.8' requires_python: '>=3.7' - kind: conda name: krb5 @@ -22555,6 +22764,27 @@ packages: - pyproj ; extra == 'pyproj' - requests ; extra == 'requests' requires_python: '>=3.7' +- kind: pypi + name: laspy + version: 2.4.1 + url: https://files.pythonhosted.org/packages/7a/68/c864ea8e55c1fc3f1259375a0a31c60a06618cda4e14572c7d0e0aada6c2/laspy-2.4.1.tar.gz + sha256: 13caecc7325cb2242cb25394984d21b3b5f796c88bcb44bc2ed2d3cf1b972ac4 + requires_dist: + - numpy + - pytest ; extra == 'dev' + - coverage ; extra == 'dev' + - sphinx ; extra == 'dev' + - sphinx-rtd-theme ; extra == 'dev' + - nox ; extra == 'dev' + - black==22.3.0 ; extra == 'dev' + - pytest-benchmark ; extra == 'dev' + - m2r2 ; extra == 'dev' + - rangehttpserver ; extra == 'dev' + - laszip<0.3.0,>=0.2.1 ; extra == 'laszip' + - lazrs<0.6.0,>=0.5.0 ; extra == 'lazrs' + - pyproj ; extra == 'pyproj' + - requests ; extra == 'requests' + requires_python: '>=3.7' - kind: pypi name: lazy-loader version: '0.4' @@ -22562,7 +22792,7 @@ packages: sha256: 342aa8e14d543a154047afb4ba8ef17f5563baad3fc610d7b15b213b0f119efc requires_dist: - packaging - - importlib-metadata ; python_version < '3.8' + - importlib-metadata ; python_full_version < '3.8' - changelist==0.5 ; extra == 'dev' - pre-commit==3.7.0 ; extra == 'lint' - pytest>=7.4 ; extra == 'test' @@ -31925,6 +32155,18 @@ packages: - requests - rerun-sdk editable: true +- kind: pypi + name: lidar + version: 0.1.0 + path: examples/python/lidar + sha256: 10fe6d7b3a80959f913aada12c01bfecd6cd9854beaf6a8843a7ecd2215cd4bd + requires_dist: + - matplotlib + - numpy + - nuscenes-devkit + - requests + - rerun-sdk + editable: true - kind: pypi name: live-camera-edge-detection version: 0.1.0 @@ -31934,6 +32176,24 @@ packages: - opencv-python - rerun-sdk editable: true +- kind: pypi + name: live-camera-edge-detection + version: 0.1.0 + path: examples/python/live_camera_edge_detection + sha256: f1edef43efce87f55726e3b5d6a2f813667968f8e8185873a74b9dc61c0f040f + requires_dist: + - opencv-python + - rerun-sdk + editable: true +- kind: pypi + name: live-scrolling-plot + version: 0.1.0 + path: examples/python/live_scrolling_plot + sha256: 1debab1814169399bb2ed23af2cd97a4693e7a4d4ee55e74bcb8804bf421e8fc + requires_dist: + - numpy + - rerun-sdk + editable: true - kind: pypi name: live-scrolling-plot version: 0.1.0 @@ -31955,6 +32215,18 @@ packages: - umap-learn requires_python: <3.12 editable: true +- kind: pypi + name: llm-embedding-ner + version: 0.1.0 + path: examples/python/llm_embedding_ner + sha256: 6f5925cbe333d529421ef9a5114f85317bdd8b4200c1e9ff6798dff5e3a7f16f + requires_dist: + - rerun-sdk + - torch + - transformers + - umap-learn + requires_python: <3.12 + editable: true - kind: conda name: llvm-openmp version: 18.1.8 @@ -32075,6 +32347,14 @@ packages: requires_dist: - rerun-sdk editable: true +- kind: pypi + name: log-file + version: 0.1.0 + path: examples/python/log_file + sha256: fb6af8faeaac3e8d16da4ab40e26a73dd0e63483f34aa36298c32f7e39324fd3 + requires_dist: + - rerun-sdk + editable: true - kind: pypi name: lxml version: 5.2.2 @@ -32493,7 +32773,7 @@ packages: - pillow>=8 - pyparsing>=2.3.1 - python-dateutil>=2.7 - - importlib-resources>=3.2.0 ; python_version < '3.10' + - importlib-resources>=3.2.0 ; python_full_version < '3.10' - meson-python>=0.13.1 ; extra == 'dev' - numpy>=1.25 ; extra == 'dev' - pybind11>=2.6 ; extra == 'dev' @@ -32515,7 +32795,7 @@ packages: - pillow>=8 - pyparsing>=2.3.1 - python-dateutil>=2.7 - - importlib-resources>=3.2.0 ; python_version < '3.10' + - importlib-resources>=3.2.0 ; python_full_version < '3.10' - meson-python>=0.13.1 ; extra == 'dev' - numpy>=1.25 ; extra == 'dev' - pybind11>=2.6 ; extra == 'dev' @@ -32537,7 +32817,7 @@ packages: - pillow>=8 - pyparsing>=2.3.1 - python-dateutil>=2.7 - - importlib-resources>=3.2.0 ; python_version < '3.10' + - importlib-resources>=3.2.0 ; python_full_version < '3.10' - meson-python>=0.13.1 ; extra == 'dev' - numpy>=1.25 ; extra == 'dev' - pybind11>=2.6 ; extra == 'dev' @@ -32559,7 +32839,7 @@ packages: - pillow>=8 - pyparsing>=2.3.1 - python-dateutil>=2.7 - - importlib-resources>=3.2.0 ; python_version < '3.10' + - importlib-resources>=3.2.0 ; python_full_version < '3.10' - meson-python>=0.13.1 ; extra == 'dev' - numpy>=1.25 ; extra == 'dev' - pybind11>=2.6 ; extra == 'dev' @@ -32581,7 +32861,7 @@ packages: - pillow>=8 - pyparsing>=2.3.1 - python-dateutil>=2.7 - - importlib-resources>=3.2.0 ; python_version < '3.10' + - importlib-resources>=3.2.0 ; python_full_version < '3.10' - meson-python>=0.13.1 ; extra == 'dev' - numpy>=1.25 ; extra == 'dev' - pybind11>=2.6 ; extra == 'dev' @@ -32603,7 +32883,7 @@ packages: - pillow>=8 - pyparsing>=2.3.1 - python-dateutil>=2.7 - - importlib-resources>=3.2.0 ; python_version < '3.10' + - importlib-resources>=3.2.0 ; python_full_version < '3.10' - meson-python>=0.13.1 ; extra == 'dev' - numpy>=1.25 ; extra == 'dev' - pybind11>=2.6 ; extra == 'dev' @@ -32625,7 +32905,7 @@ packages: - pillow>=8 - pyparsing>=2.3.1 - python-dateutil>=2.7 - - importlib-resources>=3.2.0 ; python_version < '3.10' + - importlib-resources>=3.2.0 ; python_full_version < '3.10' - meson-python>=0.13.1 ; extra == 'dev' - numpy>=1.25 ; extra == 'dev' - pybind11>=2.6 ; extra == 'dev' @@ -32647,7 +32927,7 @@ packages: - pillow>=8 - pyparsing>=2.3.1 - python-dateutil>=2.7 - - importlib-resources>=3.2.0 ; python_version < '3.10' + - importlib-resources>=3.2.0 ; python_full_version < '3.10' - meson-python>=0.13.1 ; extra == 'dev' - numpy>=1.25 ; extra == 'dev' - pybind11>=2.6 ; extra == 'dev' @@ -32669,7 +32949,7 @@ packages: - pillow>=8 - pyparsing>=2.3.1 - python-dateutil>=2.7 - - importlib-resources>=3.2.0 ; python_version < '3.10' + - importlib-resources>=3.2.0 ; python_full_version < '3.10' - meson-python>=0.13.1 ; extra == 'dev' - numpy>=1.25 ; extra == 'dev' - pybind11>=2.6 ; extra == 'dev' @@ -32691,7 +32971,7 @@ packages: - pillow>=8 - pyparsing>=2.3.1 - python-dateutil>=2.7 - - importlib-resources>=3.2.0 ; python_version < '3.10' + - importlib-resources>=3.2.0 ; python_full_version < '3.10' - meson-python>=0.13.1 ; extra == 'dev' - numpy>=1.25 ; extra == 'dev' - pybind11>=2.6 ; extra == 'dev' @@ -32913,6 +33193,25 @@ packages: - scikit-image - scikit-learn requires_python: '>=3.5' +- kind: pypi + name: mesh-to-sdf + version: 0.0.15 + url: git+https://github.com/marian42/mesh_to_sdf.git@c9f26e6399f7fd8deb40c7fba02c7e74aca6c657 + requires_dist: + - pyopengl + - pyrender + - scikit-image + - scikit-learn + requires_python: '>=3.5' +- kind: pypi + name: minimal + version: 0.1.0 + path: examples/python/minimal + sha256: 871c1ec39ceb3af42679653369402d66672d4bb9850a727b27db05c16653c8dd + requires_dist: + - numpy + - rerun-sdk + editable: true - kind: pypi name: minimal version: 0.1.0 @@ -32931,6 +33230,15 @@ packages: - numpy - rerun-sdk editable: true +- kind: pypi + name: minimal-options + version: 0.1.0 + path: examples/python/minimal_options + sha256: 84d5a8787772da382454f2f3b44d54027a606bff043872dab559cc4604ac82f0 + requires_dist: + - numpy + - rerun-sdk + editable: true - kind: pypi name: mistune version: 3.0.2 @@ -32978,9 +33286,9 @@ packages: sha256: e1e2f4237b459a63c97c2c9f449baa637d7e4c20addff6a9bac486f22432f3b6 requires_dist: - numpy>1.20 - - numpy>=1.21.2 ; python_version >= '3.10' - - numpy>=1.23.3 ; python_version >= '3.11' - - numpy>=1.26.0 ; python_version >= '3.12' + - numpy>=1.21.2 ; python_full_version >= '3.10' + - numpy>=1.23.3 ; python_full_version >= '3.11' + - numpy>=1.26.0 ; python_full_version >= '3.12' - absl-py ; extra == 'dev' - pytest ; extra == 'dev' - pytest-xdist ; extra == 'dev' @@ -32994,9 +33302,9 @@ packages: sha256: 75b4faf99d0711b81f393db36d210b4255fd419f6f790bc6c1b461f95ffb7a9e requires_dist: - numpy>1.20 - - numpy>=1.21.2 ; python_version >= '3.10' - - numpy>=1.23.3 ; python_version >= '3.11' - - numpy>=1.26.0 ; python_version >= '3.12' + - numpy>=1.21.2 ; python_full_version >= '3.10' + - numpy>=1.23.3 ; python_full_version >= '3.11' + - numpy>=1.26.0 ; python_full_version >= '3.12' - absl-py ; extra == 'dev' - pytest ; extra == 'dev' - pytest-xdist ; extra == 'dev' @@ -33165,6 +33473,14 @@ packages: requires_dist: - rerun-sdk editable: true +- kind: pypi + name: multiprocess-logging + version: 0.1.0 + path: examples/python/multiprocess_logging + sha256: 90ae836d45110662ac53e73a092a5298ab67d89873eed81d1773dba601a62eb2 + requires_dist: + - rerun-sdk + editable: true - kind: pypi name: multitasking version: 0.0.11 @@ -33179,6 +33495,15 @@ packages: - numpy - rerun-sdk editable: true +- kind: pypi + name: multithreading + version: 0.1.0 + path: examples/python/multithreading + sha256: 85b43cb06183386edd0a8820c0c9eb50398c197fd0da8ba5050f2cf2b24bc23e + requires_dist: + - numpy + - rerun-sdk + editable: true - kind: conda name: mypy version: 1.8.0 @@ -33389,6 +33714,89 @@ packages: purls: [] size: 1537884 timestamp: 1709910705541 +- kind: conda + name: nasm + version: 2.16.03 + build: h4bc722e_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/nasm-2.16.03-h4bc722e_1.conda + sha256: d01bfa655ad08d33dc5830a5166c7b664143df24fab59d41df15f076c58000b6 + md5: 35f8ab79609d5bc56d6d040f12dacf3a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 1221519 + timestamp: 1721652638250 +- kind: conda + name: nasm + version: 2.16.03 + build: h68df207_1 + build_number: 1 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/nasm-2.16.03-h68df207_1.conda + sha256: af354688ee0ab41bd6d538b5c12fc392825da0e9549d5b4256ec13704b177bbd + md5: 277a1d8aa07160de3d02302364fd4dde + depends: + - libgcc-ng >=12 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 1332204 + timestamp: 1721654126314 +- kind: conda + name: nasm + version: 2.16.03 + build: h99b78c6_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/nasm-2.16.03-h99b78c6_1.conda + sha256: a1d8b8f6be3ccf94d8f29920a61fa83e4a94da84e8f0bdec4a5937092d56e59d + md5: c306196adb43e1300e1470dd65694ec5 + depends: + - __osx >=11.0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 385586 + timestamp: 1721652965778 +- kind: conda + name: nasm + version: 2.16.03 + build: hfd05255_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/nasm-2.16.03-hfd05255_1.conda + sha256: cce00ed17e684bf84c8cc592de578fedfb93b2d2357256c41c262b67ceacf6e7 + md5: ead716d50b01f09d327c781c05b25882 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.40.33810 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 450395 + timestamp: 1721653214123 +- kind: conda + name: nasm + version: 2.16.03 + build: hfdf4475_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/nasm-2.16.03-hfdf4475_1.conda + sha256: 67e4730cee8b72abdcd587e3407dad7eb5fb97b07754c673cb20583d2e528ac0 + md5: aa906b48511f43e9496d9afb0660b7df + depends: + - __osx >=10.13 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 377182 + timestamp: 1721652783302 - kind: pypi name: nbclient version: 0.10.0 @@ -33428,7 +33836,7 @@ packages: - beautifulsoup4 - bleach!=5.0.0 - defusedxml - - importlib-metadata>=3.6 ; python_version < '3.10' + - importlib-metadata>=3.6 ; python_full_version < '3.10' - jinja2>=3.0 - jupyter-core>=4.7 - jupyterlab-pygments @@ -33926,7 +34334,7 @@ packages: - sphinx>=1.3.6 ; extra == 'docs' - sphinxcontrib-github-alt ; extra == 'docs' - sphinxcontrib-spelling ; extra == 'docs' - - importlib-resources>=5.0 ; python_version < '3.10' and extra == 'test' + - importlib-resources>=5.0 ; python_full_version < '3.10' and extra == 'test' - ipykernel ; extra == 'test' - jupyter-server[test]<3,>=2.4.0 ; extra == 'test' - jupyterlab-server[test]<3,>=2.27.1 ; extra == 'test' @@ -33957,10 +34365,10 @@ packages: requires_dist: - argcomplete<4.0,>=1.9.4 - colorlog<7.0.0,>=2.6.1 - - importlib-metadata ; python_version < '3.8' + - importlib-metadata ; python_full_version < '3.8' - packaging>=20.9 - - tomli>=1 ; python_version < '3.11' - - typing-extensions>=3.7.4 ; python_version < '3.8' + - tomli>=1 ; python_full_version < '3.11' + - typing-extensions>=3.7.4 ; python_full_version < '3.8' - virtualenv>=20.14.1 - jinja2 ; extra == 'tox-to-nox' - tox ; extra == 'tox-to-nox' @@ -34144,6 +34552,18 @@ packages: - requests - rerun-sdk editable: true +- kind: pypi + name: nuscenes-dataset + version: 0.1.0 + path: examples/python/nuscenes_dataset + sha256: 78903b7670fac2b4c27637efc9aa6f63b7b70502ce3d5f88e4353aef5607cf40 + requires_dist: + - matplotlib + - numpy + - nuscenes-devkit + - requests + - rerun-sdk + editable: true - kind: pypi name: nuscenes-devkit version: 1.1.9 @@ -34165,6 +34585,16 @@ packages: - tqdm - pycocotools>=2.0.1 requires_python: '>=3.6' +- kind: pypi + name: nv12 + version: 0.1.0 + path: examples/python/nv12 + sha256: c8ca97c5d8c04037cd5eb9a65be7b1e7d667c11d4dba3ee9aad5956ccf926dc4 + requires_dist: + - numpy + - opencv-python + - rerun-sdk>=0.10 + editable: true - kind: pypi name: nv12 version: 0.1.0 @@ -34255,6 +34685,19 @@ packages: url: https://files.pythonhosted.org/packages/da/d3/8057f0587683ed2fcd4dbfbdfdfa807b9160b809976099d36b8f60d08f03/nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl sha256: dc21cf308ca5691e7c04d962e213f8a4aa9bbfa23d95412f452254c2caeb09e5 requires_python: '>=3' +- kind: pypi + name: objectron + version: 0.1.0 + path: examples/python/objectron + sha256: b2be2b675353b4238e7778b1cef8351950832c32b5e5c34415601c030a421a27 + requires_dist: + - betterproto[compiler] + - numpy + - opencv-python>4.6 + - requests<3,>=2.31 + - rerun-sdk + - scipy + editable: true - kind: pypi name: objectron version: 0.1.0 @@ -34298,6 +34741,20 @@ packages: - tqdm requires_python: '>=3.10' editable: true +- kind: pypi + name: open-photogrammetry-format + version: 0.1.0 + path: examples/python/open_photogrammetry_format + sha256: 1bf1ac24e064bb75c7f5672b761e519b8b941354a6d9c44d824643ff64f15e80 + requires_dist: + - numpy + - pillow + - pyopf + - requests + - rerun-sdk + - tqdm + requires_python: '>=3.10' + editable: true - kind: conda name: opencv version: 4.10.0 @@ -34400,16 +34857,16 @@ packages: url: https://files.pythonhosted.org/packages/09/94/d077c4c976c2d7a88812fd55396e92edae0e0c708689dbd8c8f508920e47/opencv_contrib_python-4.10.0.84-cp37-abi3-macosx_12_0_x86_64.whl sha256: dea80d4db73b8acccf9e16b5744bf3654f47b22745074263f0a6c10de26c5ef5 requires_dist: - - numpy>=1.13.3 ; python_version < '3.7' - - numpy>=1.21.0 ; python_version <= '3.9' and platform_system == 'Darwin' and platform_machine == 'arm64' - - numpy>=1.21.2 ; python_version >= '3.10' - - numpy>=1.21.4 ; python_version >= '3.10' and platform_system == 'Darwin' - - numpy>=1.23.5 ; python_version >= '3.11' - - numpy>=1.26.0 ; python_version >= '3.12' - - numpy>=1.19.3 ; python_version >= '3.6' and platform_system == 'Linux' and platform_machine == 'aarch64' - - numpy>=1.17.0 ; python_version >= '3.7' - - numpy>=1.17.3 ; python_version >= '3.8' - - numpy>=1.19.3 ; python_version >= '3.9' + - numpy>=1.13.3 ; python_full_version < '3.7' + - numpy>=1.21.0 ; python_full_version < '3.10' and platform_machine == 'arm64' and platform_system == 'Darwin' + - numpy>=1.21.2 ; python_full_version >= '3.10' + - numpy>=1.21.4 ; python_full_version >= '3.10' and platform_system == 'Darwin' + - numpy>=1.23.5 ; python_full_version >= '3.11' + - numpy>=1.26.0 ; python_full_version >= '3.12' + - numpy>=1.19.3 ; python_full_version >= '3.6' and platform_machine == 'aarch64' and platform_system == 'Linux' + - numpy>=1.17.0 ; python_full_version >= '3.7' + - numpy>=1.17.3 ; python_full_version >= '3.8' + - numpy>=1.19.3 ; python_full_version >= '3.9' requires_python: '>=3.6' - kind: pypi name: opencv-contrib-python @@ -34417,16 +34874,16 @@ packages: url: https://files.pythonhosted.org/packages/92/64/c1194510eaed272d86b53a08c790ca6ed1c450f06d401c49c8145fc46d40/opencv_contrib_python-4.10.0.84-cp37-abi3-macosx_11_0_arm64.whl sha256: ee4b0919026d8c533aeb69b16c6ec4a891a2f6844efaa14121bf68838753209c requires_dist: - - numpy>=1.13.3 ; python_version < '3.7' - - numpy>=1.21.0 ; python_version <= '3.9' and platform_system == 'Darwin' and platform_machine == 'arm64' - - numpy>=1.21.2 ; python_version >= '3.10' - - numpy>=1.21.4 ; python_version >= '3.10' and platform_system == 'Darwin' - - numpy>=1.23.5 ; python_version >= '3.11' - - numpy>=1.26.0 ; python_version >= '3.12' - - numpy>=1.19.3 ; python_version >= '3.6' and platform_system == 'Linux' and platform_machine == 'aarch64' - - numpy>=1.17.0 ; python_version >= '3.7' - - numpy>=1.17.3 ; python_version >= '3.8' - - numpy>=1.19.3 ; python_version >= '3.9' + - numpy>=1.13.3 ; python_full_version < '3.7' + - numpy>=1.21.0 ; python_full_version < '3.10' and platform_machine == 'arm64' and platform_system == 'Darwin' + - numpy>=1.21.2 ; python_full_version >= '3.10' + - numpy>=1.21.4 ; python_full_version >= '3.10' and platform_system == 'Darwin' + - numpy>=1.23.5 ; python_full_version >= '3.11' + - numpy>=1.26.0 ; python_full_version >= '3.12' + - numpy>=1.19.3 ; python_full_version >= '3.6' and platform_machine == 'aarch64' and platform_system == 'Linux' + - numpy>=1.17.0 ; python_full_version >= '3.7' + - numpy>=1.17.3 ; python_full_version >= '3.8' + - numpy>=1.19.3 ; python_full_version >= '3.9' requires_python: '>=3.6' - kind: pypi name: opencv-contrib-python @@ -34434,16 +34891,16 @@ packages: url: https://files.pythonhosted.org/packages/a7/9e/7110d2c5d543ab03b9581dbb1f8e2429863e44e0c9b4960b766f230c1279/opencv_contrib_python-4.10.0.84-cp37-abi3-win_amd64.whl sha256: 47ec3160dae75f70e099b286d1a2e086d20dac8b06e759f60eaf867e6bdecba7 requires_dist: - - numpy>=1.13.3 ; python_version < '3.7' - - numpy>=1.21.0 ; python_version <= '3.9' and platform_system == 'Darwin' and platform_machine == 'arm64' - - numpy>=1.21.2 ; python_version >= '3.10' - - numpy>=1.21.4 ; python_version >= '3.10' and platform_system == 'Darwin' - - numpy>=1.23.5 ; python_version >= '3.11' - - numpy>=1.26.0 ; python_version >= '3.12' - - numpy>=1.19.3 ; python_version >= '3.6' and platform_system == 'Linux' and platform_machine == 'aarch64' - - numpy>=1.17.0 ; python_version >= '3.7' - - numpy>=1.17.3 ; python_version >= '3.8' - - numpy>=1.19.3 ; python_version >= '3.9' + - numpy>=1.13.3 ; python_full_version < '3.7' + - numpy>=1.21.0 ; python_full_version < '3.10' and platform_machine == 'arm64' and platform_system == 'Darwin' + - numpy>=1.21.2 ; python_full_version >= '3.10' + - numpy>=1.21.4 ; python_full_version >= '3.10' and platform_system == 'Darwin' + - numpy>=1.23.5 ; python_full_version >= '3.11' + - numpy>=1.26.0 ; python_full_version >= '3.12' + - numpy>=1.19.3 ; python_full_version >= '3.6' and platform_machine == 'aarch64' and platform_system == 'Linux' + - numpy>=1.17.0 ; python_full_version >= '3.7' + - numpy>=1.17.3 ; python_full_version >= '3.8' + - numpy>=1.19.3 ; python_full_version >= '3.9' requires_python: '>=3.6' - kind: pypi name: opencv-contrib-python @@ -34451,16 +34908,16 @@ packages: url: https://files.pythonhosted.org/packages/b0/e0/8f5d065ebb2e5941d289c5f653f944318f9e418bc5167bc6a346ab5e0f6a/opencv_contrib_python-4.10.0.84-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl sha256: a261223db41f6e512d76deaf21c8fcfb4fbbcbc2de62ca7f74a05f2c9ee489ef requires_dist: - - numpy>=1.13.3 ; python_version < '3.7' - - numpy>=1.21.0 ; python_version <= '3.9' and platform_system == 'Darwin' and platform_machine == 'arm64' - - numpy>=1.21.2 ; python_version >= '3.10' - - numpy>=1.21.4 ; python_version >= '3.10' and platform_system == 'Darwin' - - numpy>=1.23.5 ; python_version >= '3.11' - - numpy>=1.26.0 ; python_version >= '3.12' - - numpy>=1.19.3 ; python_version >= '3.6' and platform_system == 'Linux' and platform_machine == 'aarch64' - - numpy>=1.17.0 ; python_version >= '3.7' - - numpy>=1.17.3 ; python_version >= '3.8' - - numpy>=1.19.3 ; python_version >= '3.9' + - numpy>=1.13.3 ; python_full_version < '3.7' + - numpy>=1.21.0 ; python_full_version < '3.10' and platform_machine == 'arm64' and platform_system == 'Darwin' + - numpy>=1.21.2 ; python_full_version >= '3.10' + - numpy>=1.21.4 ; python_full_version >= '3.10' and platform_system == 'Darwin' + - numpy>=1.23.5 ; python_full_version >= '3.11' + - numpy>=1.26.0 ; python_full_version >= '3.12' + - numpy>=1.19.3 ; python_full_version >= '3.6' and platform_machine == 'aarch64' and platform_system == 'Linux' + - numpy>=1.17.0 ; python_full_version >= '3.7' + - numpy>=1.17.3 ; python_full_version >= '3.8' + - numpy>=1.19.3 ; python_full_version >= '3.9' requires_python: '>=3.6' - kind: pypi name: opencv-contrib-python @@ -34468,16 +34925,16 @@ packages: url: https://files.pythonhosted.org/packages/f8/76/f76fe74b864f3cfa737173ca12e8890aad8369e980006fb8a0b6cd14c6c7/opencv_contrib_python-4.10.0.84-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl sha256: 040575b69e4f3aa761676bace4e3d1b8485fbfaf77ef77b266ab6bda5a3b5e9b requires_dist: - - numpy>=1.13.3 ; python_version < '3.7' - - numpy>=1.21.0 ; python_version <= '3.9' and platform_system == 'Darwin' and platform_machine == 'arm64' - - numpy>=1.21.2 ; python_version >= '3.10' - - numpy>=1.21.4 ; python_version >= '3.10' and platform_system == 'Darwin' - - numpy>=1.23.5 ; python_version >= '3.11' - - numpy>=1.26.0 ; python_version >= '3.12' - - numpy>=1.19.3 ; python_version >= '3.6' and platform_system == 'Linux' and platform_machine == 'aarch64' - - numpy>=1.17.0 ; python_version >= '3.7' - - numpy>=1.17.3 ; python_version >= '3.8' - - numpy>=1.19.3 ; python_version >= '3.9' + - numpy>=1.13.3 ; python_full_version < '3.7' + - numpy>=1.21.0 ; python_full_version < '3.10' and platform_machine == 'arm64' and platform_system == 'Darwin' + - numpy>=1.21.2 ; python_full_version >= '3.10' + - numpy>=1.21.4 ; python_full_version >= '3.10' and platform_system == 'Darwin' + - numpy>=1.23.5 ; python_full_version >= '3.11' + - numpy>=1.26.0 ; python_full_version >= '3.12' + - numpy>=1.19.3 ; python_full_version >= '3.6' and platform_machine == 'aarch64' and platform_system == 'Linux' + - numpy>=1.17.0 ; python_full_version >= '3.7' + - numpy>=1.17.3 ; python_full_version >= '3.8' + - numpy>=1.19.3 ; python_full_version >= '3.9' requires_python: '>=3.6' - kind: conda name: openexr @@ -34887,7 +35344,7 @@ packages: url: https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl sha256: c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49 requires_dist: - - typing ; python_version < '3.5' + - typing ; python_full_version < '3.5' requires_python: '>=3.6' - kind: conda name: p11-kit @@ -34984,9 +35441,9 @@ packages: url: https://files.pythonhosted.org/packages/16/c6/75231fd47afd6b3f89011e7077f1a3958441264aca7ae9ff596e3276a5d0/pandas-2.2.2-cp311-cp311-macosx_11_0_arm64.whl sha256: 8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151 requires_dist: - - numpy>=1.22.4 ; python_version < '3.11' - - numpy>=1.23.2 ; python_version == '3.11' - - numpy>=1.26.0 ; python_version >= '3.12' + - numpy>=1.22.4 ; python_full_version < '3.11' + - numpy>=1.23.2 ; python_full_version == '3.11.*' + - numpy>=1.26.0 ; python_full_version >= '3.12' - python-dateutil>=2.8.2 - pytz>=2020.1 - tzdata>=2022.7 @@ -35076,9 +35533,9 @@ packages: url: https://files.pythonhosted.org/packages/1b/70/61704497903d43043e288017cb2b82155c0d41e15f5c17807920877b45c2/pandas-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl sha256: 696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288 requires_dist: - - numpy>=1.22.4 ; python_version < '3.11' - - numpy>=1.23.2 ; python_version == '3.11' - - numpy>=1.26.0 ; python_version >= '3.12' + - numpy>=1.22.4 ; python_full_version < '3.11' + - numpy>=1.23.2 ; python_full_version == '3.11.*' + - numpy>=1.26.0 ; python_full_version >= '3.12' - python-dateutil>=2.8.2 - pytz>=2020.1 - tzdata>=2022.7 @@ -35168,9 +35625,9 @@ packages: url: https://files.pythonhosted.org/packages/97/2d/7b54f80b93379ff94afb3bd9b0cd1d17b48183a0d6f98045bc01ce1e06a7/pandas-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl sha256: 58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b requires_dist: - - numpy>=1.22.4 ; python_version < '3.11' - - numpy>=1.23.2 ; python_version == '3.11' - - numpy>=1.26.0 ; python_version >= '3.12' + - numpy>=1.22.4 ; python_full_version < '3.11' + - numpy>=1.23.2 ; python_full_version == '3.11.*' + - numpy>=1.26.0 ; python_full_version >= '3.12' - python-dateutil>=2.8.2 - pytz>=2020.1 - tzdata>=2022.7 @@ -35260,9 +35717,9 @@ packages: url: https://files.pythonhosted.org/packages/ab/63/966db1321a0ad55df1d1fe51505d2cdae191b84c907974873817b0a6e849/pandas-2.2.2-cp311-cp311-win_amd64.whl sha256: 873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24 requires_dist: - - numpy>=1.22.4 ; python_version < '3.11' - - numpy>=1.23.2 ; python_version == '3.11' - - numpy>=1.26.0 ; python_version >= '3.12' + - numpy>=1.22.4 ; python_full_version < '3.11' + - numpy>=1.23.2 ; python_full_version == '3.11.*' + - numpy>=1.26.0 ; python_full_version >= '3.12' - python-dateutil>=2.8.2 - pytz>=2020.1 - tzdata>=2022.7 @@ -35352,9 +35809,9 @@ packages: url: https://files.pythonhosted.org/packages/fc/a5/4d82be566f069d7a9a702dcdf6f9106df0e0b042e738043c0cc7ddd7e3f6/pandas-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl sha256: 6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee requires_dist: - - numpy>=1.22.4 ; python_version < '3.11' - - numpy>=1.23.2 ; python_version == '3.11' - - numpy>=1.26.0 ; python_version >= '3.12' + - numpy>=1.22.4 ; python_full_version < '3.11' + - numpy>=1.23.2 ; python_full_version == '3.11.*' + - numpy>=1.26.0 ; python_full_version >= '3.12' - python-dateutil>=2.8.2 - pytz>=2020.1 - tzdata>=2022.7 @@ -35757,7 +36214,7 @@ packages: - pytest ; extra == 'tests' - pytest-cov ; extra == 'tests' - pytest-timeout ; extra == 'tests' - - typing-extensions ; python_version < '3.10' and extra == 'typing' + - typing-extensions ; python_full_version < '3.10' and extra == 'typing' - defusedxml ; extra == 'xmp' requires_python: '>=3.8' - kind: pypi @@ -35784,7 +36241,7 @@ packages: - pytest ; extra == 'tests' - pytest-cov ; extra == 'tests' - pytest-timeout ; extra == 'tests' - - typing-extensions ; python_version < '3.10' and extra == 'typing' + - typing-extensions ; python_full_version < '3.10' and extra == 'typing' - defusedxml ; extra == 'xmp' requires_python: '>=3.8' - kind: pypi @@ -35811,7 +36268,7 @@ packages: - pytest ; extra == 'tests' - pytest-cov ; extra == 'tests' - pytest-timeout ; extra == 'tests' - - typing-extensions ; python_version < '3.10' and extra == 'typing' + - typing-extensions ; python_full_version < '3.10' and extra == 'typing' - defusedxml ; extra == 'xmp' requires_python: '>=3.8' - kind: pypi @@ -35838,7 +36295,7 @@ packages: - pytest ; extra == 'tests' - pytest-cov ; extra == 'tests' - pytest-timeout ; extra == 'tests' - - typing-extensions ; python_version < '3.10' and extra == 'typing' + - typing-extensions ; python_full_version < '3.10' and extra == 'typing' - defusedxml ; extra == 'xmp' requires_python: '>=3.8' - kind: pypi @@ -35865,7 +36322,7 @@ packages: - pytest ; extra == 'tests' - pytest-cov ; extra == 'tests' - pytest-timeout ; extra == 'tests' - - typing-extensions ; python_version < '3.10' and extra == 'typing' + - typing-extensions ; python_full_version < '3.10' and extra == 'typing' - defusedxml ; extra == 'xmp' requires_python: '>=3.8' - kind: conda @@ -35992,6 +36449,15 @@ packages: - numpy - rerun-sdk editable: true +- kind: pypi + name: plots + version: 0.1.0 + path: examples/python/plots + sha256: 398c85932db816f766e2d703568060efe4520a6e734f91d69387bbdd143b3f97 + requires_dist: + - numpy + - rerun-sdk + editable: true - kind: conda name: pluggy version: 1.5.0 @@ -36154,9 +36620,9 @@ packages: url: https://files.pythonhosted.org/packages/0b/37/f8da2fbd29690b3557cca414c1949f92162981920699cd62095a984983bf/psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl sha256: c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0 requires_dist: - - ipaddress ; python_version < '3.0' and extra == 'test' - - mock ; python_version < '3.0' and extra == 'test' - - enum34 ; python_version <= '3.4' and extra == 'test' + - ipaddress ; python_full_version < '3' and extra == 'test' + - mock ; python_full_version < '3' and extra == 'test' + - enum34 ; python_full_version < '3.5' and extra == 'test' - pywin32 ; sys_platform == 'win32' and extra == 'test' - wmi ; sys_platform == 'win32' and extra == 'test' requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*' @@ -36166,9 +36632,9 @@ packages: url: https://files.pythonhosted.org/packages/19/74/f59e7e0d392bc1070e9a70e2f9190d652487ac115bb16e2eff6b22ad1d24/psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl sha256: 5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd requires_dist: - - ipaddress ; python_version < '3.0' and extra == 'test' - - mock ; python_version < '3.0' and extra == 'test' - - enum34 ; python_version <= '3.4' and extra == 'test' + - ipaddress ; python_full_version < '3' and extra == 'test' + - mock ; python_full_version < '3' and extra == 'test' + - enum34 ; python_full_version < '3.5' and extra == 'test' - pywin32 ; sys_platform == 'win32' and extra == 'test' - wmi ; sys_platform == 'win32' and extra == 'test' requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*' @@ -36178,9 +36644,9 @@ packages: url: https://files.pythonhosted.org/packages/73/44/561092313ae925f3acfaace6f9ddc4f6a9c748704317bad9c8c8f8a36a79/psutil-6.0.0-cp37-abi3-win_amd64.whl sha256: 33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3 requires_dist: - - ipaddress ; python_version < '3.0' and extra == 'test' - - mock ; python_version < '3.0' and extra == 'test' - - enum34 ; python_version <= '3.4' and extra == 'test' + - ipaddress ; python_full_version < '3' and extra == 'test' + - mock ; python_full_version < '3' and extra == 'test' + - enum34 ; python_full_version < '3.5' and extra == 'test' - pywin32 ; sys_platform == 'win32' and extra == 'test' - wmi ; sys_platform == 'win32' and extra == 'test' requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*' @@ -36190,9 +36656,9 @@ packages: url: https://files.pythonhosted.org/packages/7c/06/63872a64c312a24fb9b4af123ee7007a306617da63ff13bcc1432386ead7/psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl sha256: ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0 requires_dist: - - ipaddress ; python_version < '3.0' and extra == 'test' - - mock ; python_version < '3.0' and extra == 'test' - - enum34 ; python_version <= '3.4' and extra == 'test' + - ipaddress ; python_full_version < '3' and extra == 'test' + - mock ; python_full_version < '3' and extra == 'test' + - enum34 ; python_full_version < '3.5' and extra == 'test' - pywin32 ; sys_platform == 'win32' and extra == 'test' - wmi ; sys_platform == 'win32' and extra == 'test' requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*' @@ -36202,9 +36668,9 @@ packages: url: https://files.pythonhosted.org/packages/cd/5f/60038e277ff0a9cc8f0c9ea3d0c5eb6ee1d2470ea3f9389d776432888e47/psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl sha256: e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132 requires_dist: - - ipaddress ; python_version < '3.0' and extra == 'test' - - mock ; python_version < '3.0' and extra == 'test' - - enum34 ; python_version <= '3.4' and extra == 'test' + - ipaddress ; python_full_version < '3' and extra == 'test' + - mock ; python_full_version < '3' and extra == 'test' + - enum34 ; python_full_version < '3.5' and extra == 'test' - pywin32 ; sys_platform == 'win32' and extra == 'test' - wmi ; sys_platform == 'win32' and extra == 'test' requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*' @@ -37176,7 +37642,17 @@ packages: requires_dist: - dataclasses-json>=0.0.25 - deprecated - - dataclasses ; python_version >= '3.6' and python_version < '3.7' + - dataclasses ; python_full_version == '3.6.*' + requires_python: '>=3.6' +- kind: pypi + name: pygltflib + version: 1.16.2 + url: https://files.pythonhosted.org/packages/38/d7/0b8e35cb3ff69dd981e358e72e0a5632f847d4bd61876be04518cb4e075a/pygltflib-1.16.2.tar.gz + sha256: 4f9481f5841b0b8fb7b271b0414b394b503405260a6ee0cf2c330a5420d19b64 + requires_dist: + - dataclasses-json>=0.0.25 + - deprecated + - dataclasses ; python_full_version == '3.6.*' requires_python: '>=3.6' - kind: pypi name: pygments @@ -37192,7 +37668,7 @@ packages: url: https://files.pythonhosted.org/packages/2b/4f/e04a8067c7c96c364cef7ef73906504e2f40d690811c021e1a1901473a19/PyJWT-2.8.0-py3-none-any.whl sha256: 59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320 requires_dist: - - typing-extensions ; python_version <= '3.7' + - typing-extensions ; python_full_version < '3.8' - cryptography>=3.4.0 ; extra == 'crypto' - sphinx<5.0.0,>=4.5.0 ; extra == 'dev' - sphinx-rtd-theme ; extra == 'dev' @@ -37266,7 +37742,7 @@ packages: - numba>=0.51.2 - llvmlite>=0.30 - joblib>=0.11 - - importlib-metadata>=4.8.1 ; python_version < '3.8' + - importlib-metadata>=4.8.1 ; python_full_version < '3.8' - kind: pypi name: pyopengl version: 3.1.0 @@ -37981,6 +38457,17 @@ packages: - pytest-cov>=3.0.0 ; extra == 'test' - pytest-qt ; extra == 'test' requires_python: '>=3.7' +- kind: pypi + name: raw-mesh + version: 0.1.0 + path: examples/python/raw_mesh + sha256: 9006b1b7ca8bd9c90ba0bf0d7a00641b7dd13a6de76a2828f79ec5b853a4ef98 + requires_dist: + - numpy + - requests<3,>=2.31 + - rerun-sdk + - trimesh==3.15.2 + editable: true - kind: pypi name: raw-mesh version: 0.1.0 @@ -38359,6 +38846,18 @@ packages: url: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl sha256: 2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9 requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*' +- kind: pypi + name: rgbd + version: 0.1.0 + path: examples/python/rgbd + sha256: b2ef153b0bedd672c3e0ce89b7be1f64f4344b2b75d71748899faea270383fa2 + requires_dist: + - numpy + - opencv-python>4.6 + - requests<3,>=2.31 + - rerun-sdk + - tqdm + editable: true - kind: pypi name: rgbd version: 0.1.0 @@ -38436,7 +38935,7 @@ packages: - ipywidgets>=7.5.1,<9 ; extra == 'jupyter' - markdown-it-py>=2.2.0 - pygments>=2.13.0,<3.0.0 - - typing-extensions>=4.0.0,<5.0 ; python_version < '3.9' + - typing-extensions>=4.0.0,<5.0 ; python_full_version < '3.9' requires_python: '>=3.7.0' - kind: pypi name: rpds-py @@ -38477,6 +38976,15 @@ packages: - numpy - rerun-sdk editable: true +- kind: pypi + name: rrt-star + version: 0.1.0 + path: examples/python/rrt_star + sha256: 41993fc9e48ad077ad59ee5918ccc59c86628fd3d8ea4d36bd0706e9880ce6df + requires_dist: + - numpy + - rerun-sdk + editable: true - kind: pypi name: rsa version: '4.9' @@ -38844,7 +39352,7 @@ packages: - pooch>=1.6.0 ; extra == 'data' - pre-commit ; extra == 'developer' - ipython ; extra == 'developer' - - tomli ; python_version < '3.11' and extra == 'developer' + - tomli ; python_full_version < '3.11' and extra == 'developer' - sphinx>=7.3 ; extra == 'docs' - sphinx-gallery>=0.14 ; extra == 'docs' - numpydoc>=1.7 ; extra == 'docs' @@ -38911,7 +39419,7 @@ packages: - pooch>=1.6.0 ; extra == 'data' - pre-commit ; extra == 'developer' - ipython ; extra == 'developer' - - tomli ; python_version < '3.11' and extra == 'developer' + - tomli ; python_full_version < '3.11' and extra == 'developer' - sphinx>=7.3 ; extra == 'docs' - sphinx-gallery>=0.14 ; extra == 'docs' - numpydoc>=1.7 ; extra == 'docs' @@ -38978,7 +39486,7 @@ packages: - pooch>=1.6.0 ; extra == 'data' - pre-commit ; extra == 'developer' - ipython ; extra == 'developer' - - tomli ; python_version < '3.11' and extra == 'developer' + - tomli ; python_full_version < '3.11' and extra == 'developer' - sphinx>=7.3 ; extra == 'docs' - sphinx-gallery>=0.14 ; extra == 'docs' - numpydoc>=1.7 ; extra == 'docs' @@ -39045,7 +39553,7 @@ packages: - pooch>=1.6.0 ; extra == 'data' - pre-commit ; extra == 'developer' - ipython ; extra == 'developer' - - tomli ; python_version < '3.11' and extra == 'developer' + - tomli ; python_full_version < '3.11' and extra == 'developer' - sphinx>=7.3 ; extra == 'docs' - sphinx-gallery>=0.14 ; extra == 'docs' - numpydoc>=1.7 ; extra == 'docs' @@ -39112,7 +39620,7 @@ packages: - pooch>=1.6.0 ; extra == 'data' - pre-commit ; extra == 'developer' - ipython ; extra == 'developer' - - tomli ; python_version < '3.11' and extra == 'developer' + - tomli ; python_full_version < '3.11' and extra == 'developer' - sphinx>=7.3 ; extra == 'docs' - sphinx-gallery>=0.14 ; extra == 'docs' - numpydoc>=1.7 ; extra == 'docs' @@ -39690,6 +40198,35 @@ packages: - isort ; extra == 'dev' - black ; extra == 'dev' - mypy ; extra == 'dev' +- kind: pypi + name: segment-anything + version: '1.0' + url: git+https://github.com/facebookresearch/segment-anything.git@6fdee8f2727f4506cfbbe553e23b895e27956588 + requires_dist: + - matplotlib ; extra == 'all' + - pycocotools ; extra == 'all' + - opencv-python ; extra == 'all' + - onnx ; extra == 'all' + - onnxruntime ; extra == 'all' + - flake8 ; extra == 'dev' + - isort ; extra == 'dev' + - black ; extra == 'dev' + - mypy ; extra == 'dev' +- kind: pypi + name: segment-anything-model + version: 0.1.0 + path: examples/python/segment_anything_model + sha256: 85bc241bedf212c63a39d0251a9dcc0fb3a435087a024d4eafd7f49342a75926 + requires_dist: + - numpy + - opencv-python + - requests<3,>=2.31 + - rerun-sdk + - segment-anything @ git+https://github.com/facebookresearch/segment-anything.git + - torch==2.2.2 + - torchvision + - tqdm + editable: true - kind: pypi name: segment-anything-model version: 0.1.0 @@ -39787,7 +40324,7 @@ packages: - pyproject-hooks!=1.1 ; extra == 'test' - jaraco-test ; extra == 'test' - pytest-ruff<0.4 ; platform_system == 'Windows' and extra == 'test' - - jaraco-develop>=7.21 ; (python_version >= '3.9' and sys_platform != 'cygwin') and extra == 'test' + - jaraco-develop>=7.21 ; python_full_version >= '3.9' and sys_platform != 'cygwin' and extra == 'test' - pytest-ruff>=0.2.1 ; sys_platform != 'cygwin' and extra == 'test' - pytest-perf ; sys_platform != 'cygwin' and extra == 'test' - pytest-ruff>=0.3.2 ; sys_platform != 'cygwin' and extra == 'test' @@ -39804,9 +40341,9 @@ packages: - jaraco-text>=3.7 ; extra == 'core' - wheel>=0.43.0 ; extra == 'core' - platformdirs>=2.6.2 ; extra == 'core' - - importlib-metadata>=6 ; python_version < '3.10' and extra == 'core' - - tomli>=2.0.1 ; python_version < '3.11' and extra == 'core' - - importlib-resources>=5.10.2 ; python_version < '3.9' and extra == 'core' + - importlib-metadata>=6 ; python_full_version < '3.10' and extra == 'core' + - tomli>=2.0.1 ; python_full_version < '3.11' and extra == 'core' + - importlib-resources>=5.10.2 ; python_full_version < '3.9' and extra == 'core' - sphinx>=3.5 ; extra == 'doc' - jaraco-packaging>=9.3 ; extra == 'doc' - rst-linker>=1.9 ; extra == 'doc' @@ -39845,7 +40382,7 @@ packages: - pyproject-hooks!=1.1 ; extra == 'test' - jaraco-test ; extra == 'test' - pytest-ruff<0.4 ; platform_system == 'Windows' and extra == 'test' - - jaraco-develop>=7.21 ; (python_version >= '3.9' and sys_platform != 'cygwin') and extra == 'test' + - jaraco-develop>=7.21 ; python_full_version >= '3.9' and sys_platform != 'cygwin' and extra == 'test' - pytest-ruff>=0.2.1 ; sys_platform != 'cygwin' and extra == 'test' - pytest-perf ; sys_platform != 'cygwin' and extra == 'test' - pytest-ruff>=0.3.2 ; sys_platform != 'cygwin' and extra == 'test' @@ -39967,12 +40504,33 @@ packages: requires_dist: - rerun-sdk editable: true +- kind: pypi + name: shared-recording + version: 0.1.0 + path: examples/python/shared_recording + sha256: 6f605379e813578a2304663522ed82ab2fd6486cee725b969abd533b5ac8072f + requires_dist: + - rerun-sdk + editable: true - kind: pypi name: shellingham version: 1.5.4 url: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl sha256: 7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686 requires_python: '>=3.7' +- kind: pypi + name: signed-distance-fields + version: 0.1.0 + path: examples/python/signed_distance_fields + sha256: 32880a8a3883c6aa03c709fe9138ba6b939633562ff98ca27fc22afc3d69f08a + requires_dist: + - mesh-to-sdf @ git+https://github.com/marian42/mesh_to_sdf.git + - numpy + - requests<3,>=2.31 + - rerun-sdk + - scikit-learn>=1.1.3 + - trimesh==3.15.2 + editable: true - kind: pypi name: signed-distance-fields version: 0.1.0 @@ -40211,11 +40769,31 @@ packages: requires_dist: - rerun-sdk editable: true +- kind: pypi + name: stdio + version: 0.1.0 + path: examples/python/stdio + sha256: 15fb60d3e1c8b7b2d1a4dfcc223bddb267451e8ef7534d42f663d116166d92e2 + requires_dist: + - rerun-sdk + editable: true - kind: pypi name: stringcase version: 1.2.0 url: https://files.pythonhosted.org/packages/f3/1f/1241aa3d66e8dc1612427b17885f5fcd9c9ee3079fc0d28e9a3aeeb36fa3/stringcase-1.2.0.tar.gz sha256: 48a06980661908efe8d9d34eab2b6c13aefa2163b3ced26972902e3bdfd87008 +- kind: pypi + name: structure-from-motion + version: 0.1.0 + path: examples/python/structure_from_motion + sha256: b20b79aa7bb2b4225b37d3cb28872a70dc7e9ab2ca9ab138b90d60fc8d7b4c15 + requires_dist: + - numpy + - opencv-python>4.6 + - requests<3,>=2.31 + - rerun-sdk + - tqdm + editable: true - kind: pypi name: structure-from-motion version: 0.1.0 @@ -40888,18 +41466,18 @@ packages: - networkx - jinja2 - fsspec - - nvidia-cuda-nvrtc-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cuda-runtime-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cuda-cupti-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cudnn-cu12==8.9.2.26 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cublas-cu12==12.1.3.1 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cufft-cu12==11.0.2.54 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-curand-cu12==10.3.2.106 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cusolver-cu12==11.4.5.107 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cusparse-cu12==12.1.0.106 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-nccl-cu12==2.19.3 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-nvtx-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - triton==2.2.0 ; platform_system == 'Linux' and platform_machine == 'x86_64' and python_version < '3.12' + - nvidia-cuda-nvrtc-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cuda-runtime-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cuda-cupti-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cudnn-cu12==8.9.2.26 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cublas-cu12==12.1.3.1 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cufft-cu12==11.0.2.54 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-curand-cu12==10.3.2.106 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cusolver-cu12==11.4.5.107 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cusparse-cu12==12.1.0.106 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nccl-cu12==2.19.3 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nvtx-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - triton==2.2.0 ; python_full_version < '3.12' and platform_machine == 'x86_64' and platform_system == 'Linux' - opt-einsum>=3.3 ; extra == 'opt-einsum' - optree>=0.9.1 ; extra == 'optree' requires_python: '>=3.8.0' @@ -40915,18 +41493,18 @@ packages: - networkx - jinja2 - fsspec - - nvidia-cuda-nvrtc-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cuda-runtime-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cuda-cupti-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cudnn-cu12==8.9.2.26 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cublas-cu12==12.1.3.1 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cufft-cu12==11.0.2.54 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-curand-cu12==10.3.2.106 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cusolver-cu12==11.4.5.107 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cusparse-cu12==12.1.0.106 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-nccl-cu12==2.19.3 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-nvtx-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - triton==2.2.0 ; platform_system == 'Linux' and platform_machine == 'x86_64' and python_version < '3.12' + - nvidia-cuda-nvrtc-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cuda-runtime-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cuda-cupti-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cudnn-cu12==8.9.2.26 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cublas-cu12==12.1.3.1 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cufft-cu12==11.0.2.54 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-curand-cu12==10.3.2.106 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cusolver-cu12==11.4.5.107 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cusparse-cu12==12.1.0.106 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nccl-cu12==2.19.3 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nvtx-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - triton==2.2.0 ; python_full_version < '3.12' and platform_machine == 'x86_64' and platform_system == 'Linux' - opt-einsum>=3.3 ; extra == 'opt-einsum' - optree>=0.9.1 ; extra == 'optree' requires_python: '>=3.8.0' @@ -40942,18 +41520,18 @@ packages: - networkx - jinja2 - fsspec - - nvidia-cuda-nvrtc-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cuda-runtime-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cuda-cupti-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cudnn-cu12==8.9.2.26 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cublas-cu12==12.1.3.1 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cufft-cu12==11.0.2.54 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-curand-cu12==10.3.2.106 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cusolver-cu12==11.4.5.107 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cusparse-cu12==12.1.0.106 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-nccl-cu12==2.19.3 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-nvtx-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - triton==2.2.0 ; platform_system == 'Linux' and platform_machine == 'x86_64' and python_version < '3.12' + - nvidia-cuda-nvrtc-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cuda-runtime-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cuda-cupti-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cudnn-cu12==8.9.2.26 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cublas-cu12==12.1.3.1 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cufft-cu12==11.0.2.54 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-curand-cu12==10.3.2.106 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cusolver-cu12==11.4.5.107 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cusparse-cu12==12.1.0.106 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nccl-cu12==2.19.3 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nvtx-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - triton==2.2.0 ; python_full_version < '3.12' and platform_machine == 'x86_64' and platform_system == 'Linux' - opt-einsum>=3.3 ; extra == 'opt-einsum' - optree>=0.9.1 ; extra == 'optree' requires_python: '>=3.8.0' @@ -40969,18 +41547,18 @@ packages: - networkx - jinja2 - fsspec - - nvidia-cuda-nvrtc-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cuda-runtime-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cuda-cupti-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cudnn-cu12==8.9.2.26 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cublas-cu12==12.1.3.1 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cufft-cu12==11.0.2.54 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-curand-cu12==10.3.2.106 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cusolver-cu12==11.4.5.107 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cusparse-cu12==12.1.0.106 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-nccl-cu12==2.19.3 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-nvtx-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - triton==2.2.0 ; platform_system == 'Linux' and platform_machine == 'x86_64' and python_version < '3.12' + - nvidia-cuda-nvrtc-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cuda-runtime-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cuda-cupti-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cudnn-cu12==8.9.2.26 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cublas-cu12==12.1.3.1 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cufft-cu12==11.0.2.54 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-curand-cu12==10.3.2.106 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cusolver-cu12==11.4.5.107 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cusparse-cu12==12.1.0.106 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nccl-cu12==2.19.3 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nvtx-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - triton==2.2.0 ; python_full_version < '3.12' and platform_machine == 'x86_64' and platform_system == 'Linux' - opt-einsum>=3.3 ; extra == 'opt-einsum' - optree>=0.9.1 ; extra == 'optree' requires_python: '>=3.8.0' @@ -40996,18 +41574,18 @@ packages: - networkx - jinja2 - fsspec - - nvidia-cuda-nvrtc-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cuda-runtime-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cuda-cupti-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cudnn-cu12==8.9.2.26 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cublas-cu12==12.1.3.1 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cufft-cu12==11.0.2.54 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-curand-cu12==10.3.2.106 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cusolver-cu12==11.4.5.107 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-cusparse-cu12==12.1.0.106 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-nccl-cu12==2.19.3 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - nvidia-nvtx-cu12==12.1.105 ; platform_system == 'Linux' and platform_machine == 'x86_64' - - triton==2.2.0 ; platform_system == 'Linux' and platform_machine == 'x86_64' and python_version < '3.12' + - nvidia-cuda-nvrtc-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cuda-runtime-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cuda-cupti-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cudnn-cu12==8.9.2.26 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cublas-cu12==12.1.3.1 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cufft-cu12==11.0.2.54 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-curand-cu12==10.3.2.106 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cusolver-cu12==11.4.5.107 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-cusparse-cu12==12.1.0.106 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nccl-cu12==2.19.3 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - nvidia-nvtx-cu12==12.1.105 ; platform_machine == 'x86_64' and platform_system == 'Linux' + - triton==2.2.0 ; python_full_version < '3.12' and platform_machine == 'x86_64' and platform_system == 'Linux' - opt-einsum>=3.3 ; extra == 'opt-einsum' - optree>=0.9.1 ; extra == 'optree' requires_python: '>=3.8.0' @@ -41972,7 +42550,7 @@ packages: requires_dist: - mypy-extensions>=0.3.0 - typing-extensions>=3.7.4 - - typing>=3.7.4 ; python_version < '3.5' + - typing>=3.7.4 ; python_full_version < '3.5' - kind: conda name: typing_extensions version: 4.12.2 @@ -42430,7 +43008,7 @@ packages: requires_dist: - distlib<1,>=0.3.7 - filelock<4,>=3.12.2 - - importlib-metadata>=6.6 ; python_version < '3.8' + - importlib-metadata>=6.6 ; python_full_version < '3.8' - platformdirs<5,>=3.9.1 - furo>=2023.7.26 ; extra == 'docs' - proselint>=0.13 ; extra == 'docs' @@ -42444,7 +43022,7 @@ packages: - flaky>=3.7 ; extra == 'test' - packaging>=23.1 ; extra == 'test' - pytest-env>=0.8.2 ; extra == 'test' - - pytest-freezer>=0.4.8 ; (platform_python_implementation == 'PyPy' or (platform_python_implementation == 'CPython' and sys_platform == 'win32' and python_version >= '3.13')) and extra == 'test' + - pytest-freezer>=0.4.8 ; (python_full_version >= '3.13' and platform_python_implementation == 'CPython' and sys_platform == 'win32' and extra == 'test') or (platform_python_implementation == 'PyPy' and extra == 'test') - pytest-mock>=3.11.1 ; extra == 'test' - pytest-randomly>=3.12 ; extra == 'test' - pytest-timeout>=2.1 ; extra == 'test' @@ -42541,7 +43119,7 @@ packages: url: https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl sha256: 3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859 requires_dist: - - backports-functools-lru-cache>=1.2.1 ; python_version < '3.2' + - backports-functools-lru-cache>=1.2.1 ; python_full_version < '3.2' - kind: pypi name: webcolors version: 24.6.0 @@ -43641,7 +44219,7 @@ packages: - big-o ; extra == 'test' - pytest-ignore-flaky ; extra == 'test' - jaraco-test ; extra == 'test' - - importlib-resources ; python_version < '3.9' and extra == 'test' + - importlib-resources ; python_full_version < '3.9' and extra == 'test' requires_python: '>=3.8' - kind: conda name: zlib diff --git a/pixi.toml b/pixi.toml index 0172c085f5db..23a304332d64 100644 --- a/pixi.toml +++ b/pixi.toml @@ -421,6 +421,7 @@ gitignore-parser = ">=0.1.9" gitpython = ">=3.1.40" jinja2 = ">=3.1.3,<3.2" # For `update_pr_bodies.py`, `generate_pr_summary.py`, `build_screenshot_compare.py` and other utilities that build websites. mypy = "1.8.0" +nasm = ">=2.16" ninja = "1.11.1" numpy = ">=1.23,<2" prettier = "3.2.5.*" diff --git a/rust-toolchain b/rust-toolchain index 871f562485d6..9fdafb7a67a2 100644 --- a/rust-toolchain +++ b/rust-toolchain @@ -5,6 +5,6 @@ # to the user in the error, instead of "error: invalid channel name '[toolchain]'". [toolchain] -channel = "1.76.0" +channel = "1.79.0" components = ["rustfmt", "clippy"] targets = ["wasm32-unknown-unknown"] From 2e648ebe59bd7f0334659fb5a4532ad934acfa0a Mon Sep 17 00:00:00 2001 From: jprochazk Date: Thu, 5 Sep 2024 15:38:00 +0200 Subject: [PATCH 02/61] temp --- Cargo.lock | 2 + .../re_data_loader/src/loader_archetype.rs | 2 +- crates/store/re_types/src/image.rs | 1 + crates/store/re_video/Cargo.toml | 7 + crates/store/re_video/examples/frames.rs | 105 +++++ crates/store/re_video/src/decode/av1.rs | 370 +++++++++++++++--- crates/store/re_video/src/decode/mod.rs | 13 +- crates/store/re_video/src/demux/mod.rs | 30 +- crates/store/re_video/src/demux/mp4.rs | 51 +-- .../src/renderer/video/decoder/web.rs | 5 +- 10 files changed, 506 insertions(+), 80 deletions(-) create mode 100644 crates/store/re_video/examples/frames.rs diff --git a/Cargo.lock b/Cargo.lock index 2009048130e8..23d04bc2f3b3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5837,8 +5837,10 @@ version = "0.19.0-alpha.1+dev" dependencies = [ "crossbeam", "dav1d", + "indicatif", "mp4", "ordered-float", + "parking_lot", ] [[package]] diff --git a/crates/store/re_data_loader/src/loader_archetype.rs b/crates/store/re_data_loader/src/loader_archetype.rs index cc13e83017ea..0d5a59994e69 100644 --- a/crates/store/re_data_loader/src/loader_archetype.rs +++ b/crates/store/re_data_loader/src/loader_archetype.rs @@ -260,7 +260,7 @@ fn load_video( let media_type = MediaType::guess_from_path(filepath); let duration_s = match media_type.as_ref().map(|v| v.as_str()) { - Some("video/mp4") => re_video::load_mp4(&contents) + Some("video/mp4") => re_video::demux::mp4::load_mp4(&contents) .ok() .map(|v| v.duration.as_f64() / 1_000.0), _ => None, diff --git a/crates/store/re_types/src/image.rs b/crates/store/re_types/src/image.rs index a15a15e6a411..28fe9854970f 100644 --- a/crates/store/re_types/src/image.rs +++ b/crates/store/re_types/src/image.rs @@ -258,6 +258,7 @@ fn test_find_non_empty_dim_indices() { // ---------------------------------------------------------------------------- +// TODO(jan): there is a duplicate of this function in `crates/store/re_video/src/decode/av1.rs` /// Returns sRGB from YUV color. /// /// This conversion mirrors the function of the same name in `crates/viewer/re_renderer/shader/decodings.wgsl` diff --git a/crates/store/re_video/Cargo.toml b/crates/store/re_video/Cargo.toml index 9525741fa944..573cd0905e46 100644 --- a/crates/store/re_video/Cargo.toml +++ b/crates/store/re_video/Cargo.toml @@ -29,6 +29,13 @@ features = ["all"] crossbeam.workspace = true mp4.workspace = true ordered-float.workspace = true +parking_lot.workspace = true # If this package fails to build, install `nasm` locally, or build through `pixi`. dav1d = { path = "/home/jan/rerun-io/dav1d-rs", package = "dav1d" } + +[dev-dependencies] +indicatif.workspace = true + +[[example]] +name = "frames" diff --git a/crates/store/re_video/examples/frames.rs b/crates/store/re_video/examples/frames.rs new file mode 100644 index 000000000000..eaa0c17bcd7a --- /dev/null +++ b/crates/store/re_video/examples/frames.rs @@ -0,0 +1,105 @@ +use indicatif::ProgressBar; +use parking_lot::Mutex; +use re_video::demux::mp4::load_mp4; +use std::fs::File; +use std::fs::OpenOptions; +use std::io::Write as _; +use std::path::Path; +use std::path::PathBuf; +use std::sync::Arc; +use std::time::Duration; +use std::time::Instant; + +fn main() { + // frames + let args: Vec<_> = std::env::args().collect(); + let video_path = match args.get(1) { + Some(path) => path, + None => { + println!("Usage: frames "); + return; + } + }; + let output_dir = PathBuf::new().join(Path::new(video_path).with_extension("")); + + println!("Decoding {video_path}"); + + let video = std::fs::read(video_path).expect("failed to read video"); + let video = load_mp4(&video).expect("failed to load video"); + + println!("{}", video.segments.len()); + + let progress = ProgressBar::new( + video + .segments + .iter() + .map(|v| v.samples.len() as u64) + .sum::(), + ) + .with_message("Decoding video"); + progress.enable_steady_tick(Duration::from_millis(100)); + + let frames = Arc::new(Mutex::new(Vec::new())); + let decoder = re_video::decode::av1::Decoder::new({ + let frames = frames.clone(); + let progress = progress.clone(); + move |frame| { + progress.inc(1); + frames.lock().push(frame); + } + }); + + let start = Instant::now(); + for segment in &video.segments { + for sample in &segment.samples { + let data = video.get(sample).to_owned(); + decoder.decode(re_video::decode::Chunk { + data, + timestamp: sample.timestamp, + duration: sample.duration, + }); + } + } + + drop(decoder); + let end = Instant::now(); + progress.finish(); + + let frames = frames.lock(); + + println!( + "Decoded {} frames in {:.2}ms", + frames.len(), + end.duration_since(start).as_secs_f64() * 1000.0 + ); + + println!("Writing frames to {}", output_dir.display()); + std::fs::create_dir_all(&output_dir).expect("failed to create output directory"); + + let width = num_digits(frames.len()); + for (i, frame) in frames.iter().enumerate() { + let mut file = OpenOptions::new() + .write(true) + .create(true) + .open(output_dir.join(format!("{:0width$}.ppm", i, width = width))) + .expect("failed to open file"); + write_binary_ppm(&mut file, frame.width, frame.height, &frame.data); + } +} + +fn num_digits(n: usize) -> usize { + (n as f64).log10().floor() as usize + 1 +} + +fn write_binary_ppm(file: &mut File, width: u32, height: u32, rgba: &[u8]) { + let header = format!("P6\n{} {}\n255\n", width, height); + + let mut data = Vec::with_capacity(header.len() + width as usize * height as usize * 3); + data.extend_from_slice(header.as_bytes()); + + for rgba in rgba.chunks(4) { + data.extend_from_slice(&[rgba[0], rgba[1], rgba[2]]); + } + + file.write_all(&data).expect("failed to write frame data"); +} diff --git a/crates/store/re_video/src/decode/av1.rs b/crates/store/re_video/src/decode/av1.rs index ae595a86ff77..06fc3d4b23d8 100644 --- a/crates/store/re_video/src/decode/av1.rs +++ b/crates/store/re_video/src/decode/av1.rs @@ -1,87 +1,363 @@ //! AV1 support. -use crate::TimeMs; - use super::PixelFormat; use super::{Chunk, Frame}; +use crate::TimeMs; +use crossbeam::channel::bounded; +use crossbeam::channel::RecvError; use crossbeam::channel::{unbounded, Receiver, Sender}; +use crossbeam::select; +use crossbeam::sync::Parker; +use crossbeam::sync::Unparker; use dav1d::PixelLayout; use dav1d::PlanarImageComponent; +use std::time::Duration; pub struct Decoder { - thread: std::thread::JoinHandle<()>, - sample_tx: Sender, + _thread: std::thread::JoinHandle<()>, + unparker: Unparker, + command_tx: Sender, + flush_rx: Receiver<()>, + reset_tx: Sender<()>, } impl Decoder { pub fn new(on_output: impl Fn(Frame) + Send + Sync + 'static) -> Self { - let (sample_tx, sample_rx) = unbounded(); + let (command_tx, command_rx) = unbounded(); + let (flush_tx, flush_rx) = bounded(1); + let (reset_tx, reset_rx) = bounded(1); + let parker = Parker::new(); + let unparker = parker.unparker().clone(); let thread = std::thread::Builder::new() .name("av1_decoder".into()) - .spawn(move || decoder_thread(sample_rx, Box::new(on_output))) + .spawn(move || decoder_thread(&command_rx, &reset_rx, &flush_tx, &parker, &on_output)) .expect("failed to spawn decoder thread"); - Self { thread, sample_tx } + Self { + _thread: thread, + unparker, + command_tx, + reset_tx, + flush_rx, + } + } + + /// Submits a single frame for decoding. + pub fn decode(&self, chunk: Chunk) { + self.command_tx.send(Command::Chunk(chunk)).ok(); + self.unparker.unpark(); + } + + /// Resets the decoder. + /// + /// This does not block, all chunks sent to `decode` before this point will be discarded. + pub fn reset(&self) { + // Ask the decoder to reset its internal state. + self.reset_tx.send(()).ok(); + self.unparker.unpark(); + } + + /// Blocks until all pending frames have been decoded. + pub fn flush(&self) { + // Ask the decoder to notify us once all pending frames have been decoded. + self.command_tx.send(Command::Flush).ok(); + self.unparker.unpark(); + self.flush_rx.recv().ok(); } } -fn decoder_thread(sample_rx: Receiver, on_output: Box) { +impl Drop for Decoder { + fn drop(&mut self) { + self.flush(); + } +} + +enum Command { + Chunk(Chunk), + Flush, +} + +type OutputCallback = dyn Fn(Frame) + Send + Sync; + +fn decoder_thread( + command_rx: &Receiver, + reset_rx: &Receiver<()>, + flush_tx: &Sender<()>, + parker: &Parker, + on_output: &OutputCallback, +) { let mut settings = dav1d::Settings::new(); - settings.set_n_threads(1); settings.set_strict_std_compliance(false); settings.set_max_frame_delay(1); + let mut decoder = dav1d::Decoder::with_settings(&settings).expect("failed to initialize dav1d::Decoder"); - while let Ok(chunk) = sample_rx.recv() { - match decoder.send_data( - chunk.data, - None, - Some(time_to_i64(chunk.timestamp)), - Some(time_to_i64(chunk.duration)), - ) { - Ok(()) => {} + loop { + select! { + recv(reset_rx) -> reset => { + match reset { + Ok(_) => { + // Reset the decoder. + decoder.flush(); + drain_decoded_frames(&mut decoder); + continue; + } + Err(RecvError) => { + // Channel disconnected, this only happens if the decoder is dropped. + decoder.flush(); + output_frames(&mut decoder, on_output); + break; + } + } + } + + recv(command_rx) -> command => { + match command { + Ok(Command::Chunk(chunk)) => { + submit_chunk(&mut decoder, chunk); + output_frames(&mut decoder, on_output); + continue; + } + + Ok(Command::Flush) => { + // All pending frames must have already been decoded, because data sent + // through a channel is received in the order it was sent. + output_frames(&mut decoder, on_output); + flush_tx.try_send(()).ok(); + continue; + } + + Err(RecvError) => { + // Channel disconnected, this only happens if the decoder is dropped. + decoder.flush(); + output_frames(&mut decoder, on_output); + break; + } + } + } + + default => { + // No samples left in the queue + parker.park_timeout(Duration::from_millis(100)); + continue; + } + } + } +} + +fn submit_chunk(decoder: &mut dav1d::Decoder, chunk: Chunk) { + // always attempt to send pending data first + // this does nothing if there is no pending data, + // and is required if a call to `send_data` previously + // returned `EAGAIN` + match decoder.send_pending_data() { + Ok(()) => {} + Err(err) if err.is_again() => {} + Err(err) => { + // Something went wrong + panic!("Failed to decode frame: {err}"); + } + } + + match decoder.send_data( + chunk.data, + None, + Some(time_to_i64(chunk.timestamp)), + Some(time_to_i64(chunk.duration)), + ) { + Ok(()) => {} + Err(err) if err.is_again() => {} + Err(err) => { + // Something went wrong + panic!("Failed to decode frame: {err}"); + } + }; +} + +fn drain_decoded_frames(decoder: &mut dav1d::Decoder) { + while let Ok(picture) = decoder.get_picture() { + let _ = picture; + } +} + +fn output_frames(decoder: &mut dav1d::Decoder, on_output: &OutputCallback) { + loop { + match decoder.get_picture() { + Ok(picture) => { + let data = match picture.pixel_layout() { + PixelLayout::I400 => i400_to_rgba(&picture), + PixelLayout::I420 => i420_to_rgba(&picture), + PixelLayout::I422 => i422_to_rgba(&picture), + PixelLayout::I444 => i444_to_rgba(&picture), + }; + let width = picture.width(); + let height = picture.height(); + let timestamp = i64_to_time(picture.timestamp().unwrap_or(0)); + let duration = i64_to_time(picture.duration()); + + on_output(Frame { + data, + width, + height, + format: PixelFormat::Rgba8Unorm, + timestamp, + duration, + }); + } Err(err) if err.is_again() => { // Not enough data yet - continue; + break; } Err(err) => { - // Something went wrong panic!("Failed to decode frame: {err}"); } - }; - - loop { - match decoder.get_picture() { - Ok(picture) => { - let width = picture.width() as usize; - let height = picture.height() as usize; - - match picture.pixel_layout() { - // Monochrome - PixelLayout::I400 => todo!(), - // 4:2:0 planar - PixelLayout::I420 => todo!(), - // 4:2:2 planar - PixelLayout::I422 => todo!(), - // 4:4:4 planar - PixelLayout::I444 => todo!(), - } - } - Err(err) if err.is_again() => { - // Not enough data yet - break; - } - Err(err) => { - panic!("Failed to decode frame: {err}"); - } - } } } } -/// We need to convert between `TimeMs` and `i64` because `dav1d` uses `i64` for timestamps. +// TODO(jan): support other parameters? +// What do these even do: +// - matrix_coefficients +// - color_range +// - color_primaries +// - transfer_characteristics + +fn rgba_from_yuv(y: u8, u: u8, v: u8) -> [u8; 4] { + let (y, u, v) = (f32::from(y), f32::from(u), f32::from(v)); + + // Adjust for color range + let y = (y - 16.0) / 219.0; + let u = (u - 128.0) / 224.0; + let v = (v - 128.0) / 224.0; + + // BT.601 coefficients + let r = y + 1.402 * v; + let g = y - 0.344136 * u - 0.714136 * v; + let b = y + 1.772 * u; + + [ + (r.clamp(0.0, 1.0) * 255.0) as u8, + (g.clamp(0.0, 1.0) * 255.0) as u8, + (b.clamp(0.0, 1.0) * 255.0) as u8, + 255, // Alpha channel, fully opaque + ] +} + +fn i400_to_rgba(picture: &dav1d::Picture) -> Vec { + let width = picture.width() as usize; + let height = picture.height() as usize; + let y_plane = picture.plane(PlanarImageComponent::Y); + let y_stride = picture.stride(PlanarImageComponent::Y) as usize; + + let mut rgba = Vec::with_capacity(width * height * 4); + + for y in 0..height { + for x in 0..width { + let y_value = y_plane[y * y_stride + x]; + let rgba_pixel = rgba_from_yuv(y_value, 128, 128); + + let offset = y * width * 4 + x * 4; + rgba[offset] = rgba_pixel[0]; + rgba[offset + 1] = rgba_pixel[1]; + rgba[offset + 2] = rgba_pixel[2]; + rgba[offset + 3] = rgba_pixel[3]; + } + } + + rgba +} + +fn i420_to_rgba(picture: &dav1d::Picture) -> Vec { + let width = picture.width() as usize; + let height = picture.height() as usize; + let y_plane = picture.plane(PlanarImageComponent::Y); + let u_plane = picture.plane(PlanarImageComponent::U); + let v_plane = picture.plane(PlanarImageComponent::V); + let y_stride = picture.stride(PlanarImageComponent::Y) as usize; + let uv_stride = picture.stride(PlanarImageComponent::U) as usize; + + let mut rgba = vec![0u8; width * height * 4]; + + for y in 0..height { + for x in 0..width { + let y_value = y_plane[y * y_stride + x]; + let u_value = u_plane[(y / 2) * uv_stride + (x / 2)]; + let v_value = v_plane[(y / 2) * uv_stride + (x / 2)]; + let rgba_pixel = rgba_from_yuv(y_value, u_value, v_value); + + let offset = y * width * 4 + x * 4; + rgba[offset] = rgba_pixel[0]; + rgba[offset + 1] = rgba_pixel[1]; + rgba[offset + 2] = rgba_pixel[2]; + rgba[offset + 3] = rgba_pixel[3]; + } + } + + rgba +} + +fn i422_to_rgba(picture: &dav1d::Picture) -> Vec { + let width = picture.width() as usize; + let height = picture.height() as usize; + let y_plane = picture.plane(PlanarImageComponent::Y); + let u_plane = picture.plane(PlanarImageComponent::U); + let v_plane = picture.plane(PlanarImageComponent::V); + let y_stride = picture.stride(PlanarImageComponent::Y) as usize; + let uv_stride = picture.stride(PlanarImageComponent::U) as usize; + + let mut rgba = vec![0u8; width * height * 4]; + + for y in 0..height { + for x in 0..width { + let y_value = y_plane[y * y_stride + x]; + let u_value = u_plane[y * uv_stride + (x / 2)]; + let v_value = v_plane[y * uv_stride + (x / 2)]; + let rgba_pixel = rgba_from_yuv(y_value, u_value, v_value); + + let offset = y * width * 4 + x * 4; + rgba[offset] = rgba_pixel[0]; + rgba[offset + 1] = rgba_pixel[1]; + rgba[offset + 2] = rgba_pixel[2]; + rgba[offset + 3] = rgba_pixel[3]; + } + } + + rgba +} + +fn i444_to_rgba(picture: &dav1d::Picture) -> Vec { + let width = picture.width() as usize; + let height = picture.height() as usize; + let y_plane = picture.plane(PlanarImageComponent::Y); + let u_plane = picture.plane(PlanarImageComponent::U); + let v_plane = picture.plane(PlanarImageComponent::V); + let y_stride = picture.stride(PlanarImageComponent::Y) as usize; + let u_stride = picture.stride(PlanarImageComponent::U) as usize; + let v_stride = picture.stride(PlanarImageComponent::V) as usize; + + let mut rgba = vec![0u8; width * height * 4]; + + for y in 0..height { + for x in 0..width { + let y_value = y_plane[y * y_stride + x]; + let u_value = u_plane[y * u_stride + x]; + let v_value = v_plane[y * v_stride + x]; + let rgba_pixel = rgba_from_yuv(y_value, u_value, v_value); + + let offset = y * width * 4 + x * 4; + rgba[offset] = rgba_pixel[0]; + rgba[offset + 1] = rgba_pixel[1]; + rgba[offset + 2] = rgba_pixel[2]; + rgba[offset + 3] = rgba_pixel[3]; + } + } + + rgba +} + +// We need to convert between `TimeMs` and `i64` because `dav1d` uses `i64` for timestamps. fn time_to_i64(time: TimeMs) -> i64 { // multiply by 1000 to lose less precision (time.as_f64() * 1000.0) as i64 diff --git a/crates/store/re_video/src/decode/mod.rs b/crates/store/re_video/src/decode/mod.rs index 455f0294dd84..7853d93bc7fc 100644 --- a/crates/store/re_video/src/decode/mod.rs +++ b/crates/store/re_video/src/decode/mod.rs @@ -10,10 +10,15 @@ pub struct Chunk { pub duration: TimeMs, } -pub struct Frame {} +pub struct Frame { + pub data: Vec, + pub width: u32, + pub height: u32, + pub format: PixelFormat, + pub timestamp: TimeMs, + pub duration: TimeMs, +} pub enum PixelFormat { - NV12, - YUY2, - RGB, + Rgba8Unorm, } diff --git a/crates/store/re_video/src/demux/mod.rs b/crates/store/re_video/src/demux/mod.rs index 8827d1b1a54c..8f2e700408f6 100644 --- a/crates/store/re_video/src/demux/mod.rs +++ b/crates/store/re_video/src/demux/mod.rs @@ -22,6 +22,13 @@ pub struct VideoData { pub data: Vec, } +impl VideoData { + pub fn get(&self, sample: &Sample) -> &[u8] { + &self.data + [sample.byte_offset as usize..sample.byte_offset as usize + sample.byte_length as usize] + } +} + /// A segment of a video. #[derive(Clone)] pub struct Segment { @@ -53,8 +60,11 @@ pub struct Sample { /// Configuration of a video. #[derive(Debug, Clone)] pub struct Config { + /// `FourCC` code identifying the codec. + pub codec: Codec, + /// String used to identify the codec and some of its configuration. - pub codec: String, + pub codec_string: String, /// Codec-specific configuration. pub description: Vec, @@ -66,6 +76,24 @@ pub struct Config { pub coded_width: u16, } +#[derive(Debug, Clone, Copy)] +pub enum Codec { + /// AV1 + Av01, + + /// H.264 + Avc1, + + /// H.265 + Hevc, + + /// VP8 + Vp08, + + /// VP9 + Vp09, +} + /// Errors that can occur when loading a video. #[derive(Debug)] pub enum VideoLoadError { diff --git a/crates/store/re_video/src/demux/mp4.rs b/crates/store/re_video/src/demux/mp4.rs index fa30c10b2637..9c9f53eab05e 100644 --- a/crates/store/re_video/src/demux/mp4.rs +++ b/crates/store/re_video/src/demux/mp4.rs @@ -4,6 +4,7 @@ use crate::TimeMs; +use super::Codec; use super::{Config, Sample, Segment, VideoData, VideoLoadError}; use ::mp4; @@ -18,37 +19,41 @@ pub fn load_mp4(bytes: &[u8]) -> Result { .find(|t| t.kind == TrackKind::Video) .ok_or_else(|| VideoLoadError::NoVideoTrack)?; - let (codec, description); - if let Some(::mp4::Av01Box { av1c, av1c_raw, .. }) = - &video_track.trak(&mp4).mdia.minf.stbl.stsd.av01 - { - let profile = av1c.profile; - let level = av1c.level; - let tier = if av1c.tier == 0 { "M" } else { "H" }; - let bit_depth = av1c.bit_depth; - - codec = format!("av01.{profile}.{level:02}{tier}.{bit_depth:02}"); - description = av1c_raw.clone(); - } else { - // TODO(jan): support h.264, h.265, vp8, vp9 - let stsd = &video_track.trak(&mp4).mdia.minf.stbl.stsd; - let codec_name = if stsd.avc1.is_some() { - "avc" - } else if stsd.hev1.is_some() { - "hevc" - } else if stsd.vp09.is_some() { - "vp9" + let (codec, codec_string, description) = + if let Some(::mp4::Av01Box { av1c, av1c_raw, .. }) = + &video_track.trak(&mp4).mdia.minf.stbl.stsd.av01 + { + let profile = av1c.profile; + let level = av1c.level; + let tier = if av1c.tier == 0 { "M" } else { "H" }; + let bit_depth = av1c.bit_depth; + + ( + Codec::Av01, + format!("av01.{profile}.{level:02}{tier}.{bit_depth:02}"), + av1c_raw.clone(), + ) } else { - "unknown" + // TODO(jan): support h.264, h.265, vp8, vp9 + let stsd = &video_track.trak(&mp4).mdia.minf.stbl.stsd; + let codec_name = if stsd.avc1.is_some() { + "avc" + } else if stsd.hev1.is_some() { + "hevc" + } else if stsd.vp09.is_some() { + "vp9" + } else { + "unknown" + }; + return Err(VideoLoadError::UnsupportedCodec(codec_name.into())); }; - return Err(VideoLoadError::UnsupportedCodec(codec_name.into())); - } let coded_height = video_track.height; let coded_width = video_track.width; let config = Config { codec, + codec_string, description, coded_height, coded_width, diff --git a/crates/viewer/re_renderer/src/renderer/video/decoder/web.rs b/crates/viewer/re_renderer/src/renderer/video/decoder/web.rs index c25bd788a4fe..af809ba1bc8c 100644 --- a/crates/viewer/re_renderer/src/renderer/video/decoder/web.rs +++ b/crates/viewer/re_renderer/src/renderer/video/decoder/web.rs @@ -255,10 +255,7 @@ impl VideoDecoder { /// Enqueue the given sample. fn enqueue(&self, sample: &re_video::Sample, is_key: bool) { - let data = Uint8Array::from( - &self.data.data[sample.byte_offset as usize - ..sample.byte_offset as usize + sample.byte_length as usize], - ); + let data = Uint8Array::from(&self.data.get(sample)); let type_ = if is_key { EncodedVideoChunkType::Key } else { From a6a1f6fbeef1968e32b7c116cdf4174bac9da0a7 Mon Sep 17 00:00:00 2001 From: jprochazk Date: Mon, 9 Sep 2024 10:56:17 +0200 Subject: [PATCH 03/61] temp --- crates/store/re_video/examples/frames.rs | 34 ++- crates/store/re_video/src/decode/av1.rs | 45 +++- crates/store/re_video/src/demux/mod.rs | 11 +- crates/store/re_video/src/demux/mp4.rs | 16 +- .../src/renderer/video/decoder/native.rs | 193 +++++++++++++++++- 5 files changed, 257 insertions(+), 42 deletions(-) diff --git a/crates/store/re_video/examples/frames.rs b/crates/store/re_video/examples/frames.rs index eaa0c17bcd7a..363bb4eb78b9 100644 --- a/crates/store/re_video/examples/frames.rs +++ b/crates/store/re_video/examples/frames.rs @@ -27,16 +27,14 @@ fn main() { let video = std::fs::read(video_path).expect("failed to read video"); let video = load_mp4(&video).expect("failed to load video"); - println!("{}", video.segments.len()); - - let progress = ProgressBar::new( - video - .segments - .iter() - .map(|v| v.samples.len() as u64) - .sum::(), - ) - .with_message("Decoding video"); + println!( + "{} {}x{}", + video.segments.len(), + video.config.coded_width, + video.config.coded_height + ); + + let progress = ProgressBar::new(video.samples.len() as u64).with_message("Decoding video"); progress.enable_steady_tick(Duration::from_millis(100)); let frames = Arc::new(Mutex::new(Vec::new())); @@ -50,15 +48,13 @@ fn main() { }); let start = Instant::now(); - for segment in &video.segments { - for sample in &segment.samples { - let data = video.get(sample).to_owned(); - decoder.decode(re_video::decode::Chunk { - data, - timestamp: sample.timestamp, - duration: sample.duration, - }); - } + for sample in &video.samples { + let data = video.get(sample).to_owned(); + decoder.decode(re_video::decode::Chunk { + data, + timestamp: sample.timestamp, + duration: sample.duration, + }); } drop(decoder); diff --git a/crates/store/re_video/src/decode/av1.rs b/crates/store/re_video/src/decode/av1.rs index 06fc3d4b23d8..458fa76e163a 100644 --- a/crates/store/re_video/src/decode/av1.rs +++ b/crates/store/re_video/src/decode/av1.rs @@ -5,6 +5,7 @@ use super::{Chunk, Frame}; use crate::TimeMs; use crossbeam::channel::bounded; use crossbeam::channel::RecvError; +use crossbeam::channel::TryRecvError; use crossbeam::channel::{unbounded, Receiver, Sender}; use crossbeam::select; use crossbeam::sync::Parker; @@ -17,21 +18,19 @@ pub struct Decoder { _thread: std::thread::JoinHandle<()>, unparker: Unparker, command_tx: Sender, - flush_rx: Receiver<()>, reset_tx: Sender<()>, } impl Decoder { pub fn new(on_output: impl Fn(Frame) + Send + Sync + 'static) -> Self { let (command_tx, command_rx) = unbounded(); - let (flush_tx, flush_rx) = bounded(1); let (reset_tx, reset_rx) = bounded(1); let parker = Parker::new(); let unparker = parker.unparker().clone(); let thread = std::thread::Builder::new() .name("av1_decoder".into()) - .spawn(move || decoder_thread(&command_rx, &reset_rx, &flush_tx, &parker, &on_output)) + .spawn(move || decoder_thread(&command_rx, &reset_rx, &parker, &on_output)) .expect("failed to spawn decoder thread"); Self { @@ -39,7 +38,6 @@ impl Decoder { unparker, command_tx, reset_tx, - flush_rx, } } @@ -54,16 +52,20 @@ impl Decoder { /// This does not block, all chunks sent to `decode` before this point will be discarded. pub fn reset(&self) { // Ask the decoder to reset its internal state. + let (tx, rx) = crossbeam::channel::bounded(0); + self.command_tx.send(Command::Reset(tx)).ok(); self.reset_tx.send(()).ok(); self.unparker.unpark(); + rx.recv().ok(); } /// Blocks until all pending frames have been decoded. pub fn flush(&self) { // Ask the decoder to notify us once all pending frames have been decoded. - self.command_tx.send(Command::Flush).ok(); + let (tx, rx) = crossbeam::channel::bounded(0); + self.command_tx.send(Command::Flush(tx)).ok(); self.unparker.unpark(); - self.flush_rx.recv().ok(); + rx.recv().ok(); } } @@ -75,7 +77,8 @@ impl Drop for Decoder { enum Command { Chunk(Chunk), - Flush, + Flush(Sender<()>), + Reset(Sender<()>), } type OutputCallback = dyn Fn(Frame) + Send + Sync; @@ -83,7 +86,6 @@ type OutputCallback = dyn Fn(Frame) + Send + Sync; fn decoder_thread( command_rx: &Receiver, reset_rx: &Receiver<()>, - flush_tx: &Sender<()>, parker: &Parker, on_output: &OutputCallback, ) { @@ -102,6 +104,24 @@ fn decoder_thread( // Reset the decoder. decoder.flush(); drain_decoded_frames(&mut decoder); + loop { + match command_rx.try_recv() { + // Discard chunks + Ok(Command::Chunk(_)) => {} + Ok(Command::Reset(done)) => { + done.try_send(()).ok(); + break; + } + Ok(Command::Flush(done)) => { + done.try_send(()).ok(); + // We have not hit a `Reset` yet + break; + } + Err(TryRecvError::Empty | TryRecvError::Disconnected) => { + break; + } + } + } continue; } Err(RecvError) => { @@ -121,11 +141,16 @@ fn decoder_thread( continue; } - Ok(Command::Flush) => { + Ok(Command::Flush(done)) => { // All pending frames must have already been decoded, because data sent // through a channel is received in the order it was sent. output_frames(&mut decoder, on_output); - flush_tx.try_send(()).ok(); + done.try_send(()).ok(); + continue; + } + + Ok(Command::Reset(done)) => { + done.try_send(()).ok(); continue; } diff --git a/crates/store/re_video/src/demux/mod.rs b/crates/store/re_video/src/demux/mod.rs index 8f2e700408f6..cf37193b604e 100644 --- a/crates/store/re_video/src/demux/mod.rs +++ b/crates/store/re_video/src/demux/mod.rs @@ -18,6 +18,9 @@ pub struct VideoData { /// followed by any number of delta frames. pub segments: Vec, + /// List of samples contained in this video. + pub samples: Vec, + /// This array stores all data used by samples. pub data: Vec, } @@ -35,10 +38,8 @@ pub struct Segment { /// Time of the first sample in this segment, in milliseconds. pub timestamp: TimeMs, - /// List of samples contained in this segment. - /// At least one sample per segment is guaranteed, - /// and the first sample is always a key frame. - pub samples: Vec, + pub start: usize, + pub len: usize, } /// A single sample in a video. @@ -145,7 +146,7 @@ impl std::fmt::Debug for Segment { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("Segment") .field("timestamp", &self.timestamp) - .field("samples", &self.samples.len()) + .field("samples", &self.len) .finish() } } diff --git a/crates/store/re_video/src/demux/mp4.rs b/crates/store/re_video/src/demux/mp4.rs index 9c9f53eab05e..f7f18f570be0 100644 --- a/crates/store/re_video/src/demux/mp4.rs +++ b/crates/store/re_video/src/demux/mp4.rs @@ -61,16 +61,20 @@ pub fn load_mp4(bytes: &[u8]) -> Result { let duration = TimeMs::new(video_track.duration_ms()); let mut samples = Vec::::new(); + let mut segment_start = 0; let mut segments = Vec::::new(); let data = video_track.data.clone(); for sample in &video_track.samples { if sample.is_sync && !samples.is_empty() { + let start = segment_start; + let len = samples.len() - segment_start; segments.push(Segment { timestamp: samples[0].timestamp, - samples, + start, + len, }); - samples = Vec::new(); + segment_start = samples.len(); } let timestamp = TimeMs::new(sample.timestamp_ms()); @@ -88,16 +92,20 @@ pub fn load_mp4(bytes: &[u8]) -> Result { } if !samples.is_empty() { + let start = segment_start; + let len = samples.len() - segment_start; segments.push(Segment { timestamp: samples[0].timestamp, - samples, + start, + len, }); } Ok(VideoData { config, - data, duration, segments, + samples, + data, }) } diff --git a/crates/viewer/re_renderer/src/renderer/video/decoder/native.rs b/crates/viewer/re_renderer/src/renderer/video/decoder/native.rs index 7fca964fd2d8..64f7d4a9e362 100644 --- a/crates/viewer/re_renderer/src/renderer/video/decoder/native.rs +++ b/crates/viewer/re_renderer/src/renderer/video/decoder/native.rs @@ -1,5 +1,7 @@ #![allow(dead_code, unused_variables, clippy::unnecessary_wraps)] +use std::sync::Arc; + use crate::resource_managers::GpuTexture2D; use crate::RenderContext; @@ -7,29 +9,61 @@ use crate::RenderContext; #[allow(unused_imports)] use super::latest_at_idx; +use parking_lot::Mutex; +use re_video::decode::Frame; use re_video::TimeMs; use super::alloc_video_frame_texture; pub struct VideoDecoder { data: re_video::demux::VideoData, + queue: Arc, + texture: GpuTexture2D, zeroed_texture: GpuTexture2D, + + frames: Arc>>, + last_used_frame_timestamp: TimeMs, + current_segment_idx: usize, + current_sample_idx: usize, } impl VideoDecoder { pub fn new(render_context: &RenderContext, data: re_video::demux::VideoData) -> Option { - re_log::warn_once!("Video playback not yet available in the native viewer, try the web viewer instead. See https://github.com/rerun-io/rerun/issues/7298 for more information."); + let frames = Arc::new(Mutex::new(Vec::new())); + + // TEMP: assuming `av1`, because `re_video` demuxer will panic if it's not + let decoder = re_video::decode::av1::Decoder::new({ + let frames = frames.clone(); + move |frame: re_video::decode::av1::Frame| { + frames.lock().push(frame); + } + }); + + let queue = render_context.queue.clone(); - let device = render_context.device.clone(); + let texture = super::alloc_video_frame_texture( + &render_context.device, + &render_context.gpu_resources.textures, + data.config.coded_width as u32, + data.config.coded_height as u32, + ); let zeroed_texture = alloc_video_frame_texture( - &device, + &render_context.device, &render_context.gpu_resources.textures, data.config.coded_width as u32, data.config.coded_height as u32, ); + Some(Self { data, + queue, + texture, zeroed_texture, + + frames, + last_used_frame_timestamp: TimeMs::new(f64::MAX), + current_segment_idx: usize::MAX, + current_sample_idx: usize::MAX, }) } @@ -46,6 +80,157 @@ impl VideoDecoder { } pub fn frame_at(&mut self, timestamp: TimeMs) -> GpuTexture2D { - self.zeroed_texture.clone() + if timestamp < TimeMs::ZERO { + return self.zeroed_texture.clone(); + } + + let Some(requested_segment_idx) = + latest_at_idx(&self.data.segments, |segment| segment.timestamp, ×tamp) + else { + // This should only happen if the video is completely empty. + return self.zeroed_texture.clone(); + }; + + let Some(requested_sample_idx) = latest_at_idx( + &self.data.segments[requested_segment_idx].samples, + |sample| sample.timestamp, + ×tamp, + ) else { + // This should never happen, because segments are never empty. + return self.zeroed_texture.clone(); + }; + + // Enqueue segments as needed. We maintain a buffer of 2 segments, so we can + // always smoothly transition to the next segment. + // We can always start decoding from any segment, because segments always begin + // with a keyframe. + // Backward seeks or seeks across many segments trigger a reset of the decoder, + // because decoding all the samples between the previous sample and the requested + // one would mean decoding and immediately discarding more frames than we otherwise + // need to. + if requested_segment_idx != self.current_segment_idx { + let segment_distance = + requested_segment_idx as isize - self.current_segment_idx as isize; + if segment_distance == 1 { + // forward seek to next segment - queue up the one _after_ requested + self.enqueue_all(requested_segment_idx + 1); + } else { + // forward seek by N>1 OR backward seek across segments - reset + self.reset(); + self.enqueue_all(requested_segment_idx); + self.enqueue_all(requested_segment_idx + 1); + } + } else if requested_sample_idx != self.current_sample_idx { + // special case: handle seeking backwards within a single segment + // this is super inefficient, but it's the only way to handle it + // while maintaining a buffer of 2 segments + let sample_distance = requested_sample_idx as isize - self.current_sample_idx as isize; + if sample_distance < 0 { + self.reset(); + self.enqueue_all(requested_segment_idx); + self.enqueue_all(requested_segment_idx + 1); + } + } + + self.current_segment_idx = requested_segment_idx; + self.current_sample_idx = requested_sample_idx; + + let mut frames = self.frames.lock(); + + let Some(frame_idx) = latest_at_idx(&frames, |(t, _)| *t, ×tamp) else { + // no buffered frames - texture will be blank + // not return a zeroed texture, because we may just be behind on decoding + // and showing an old frame is better than showing a blank frame, + // because it causes "black flashes" to appear + return self.texture.clone(); + }; + + // drain up-to (but not including) the frame idx, clearing out any frames + // before it. this lets the video decoder output more frames. + drop(frames.drain(0..frame_idx)); + + // after draining all old frames, the next frame will be at index 0 + let frame_idx = 0; + let (_, frame) = &frames[frame_idx]; + + // https://w3c.github.io/webcodecs/#output-videoframes 1. 1. states: + // Let timestamp and duration be the timestamp and duration from the EncodedVideoChunk associated with output. + // we always provide both, so they should always be available + let frame_timestamp_ms = frame.timestamp().map(TimeMs::new).unwrap_or_default(); + let frame_duration_ms = frame.duration().map(TimeMs::new).unwrap_or_default(); + + // This handles the case when we have a buffered frame that's older than the requested timestamp. + // We don't want to show this frame to the user, because it's not actually the one they requested. + if timestamp - frame_timestamp_ms > frame_duration_ms { + return self.texture.clone(); + } + + if self.last_used_frame_timestamp != frame_timestamp_ms { + copy_video_frame_to_texture(&self.queue, frame, &self.texture.texture); + self.last_used_frame_timestamp = frame_timestamp_ms; + } + + self.texture.clone() + } + + /// Enqueue all samples in the given segment. + /// + /// Does nothing if the index is out of bounds. + fn enqueue_all(&self, segment_idx: usize) { + let Some(segment) = self.data.segments.get(segment_idx) else { + return; + }; + + self.enqueue(&segment.samples[0], true); + for sample in &segment.samples[1..] { + self.enqueue(sample, false); + } + } + + /// Enqueue the given sample. + fn enqueue(&self, sample: &re_video::Sample, is_key: bool) { + let data = Uint8Array::from(&self.data.get(sample)); + let type_ = if is_key { + EncodedVideoChunkType::Key + } else { + EncodedVideoChunkType::Delta + }; + let chunk = EncodedVideoChunkInit::new(&data, sample.timestamp.as_f64(), type_); + chunk.set_duration(sample.duration.as_f64()); + let Some(chunk) = EncodedVideoChunk::new(&chunk) + .inspect_err(|err| { + re_log::error!("failed to create video chunk: {}", js_error_to_string(err)); + }) + .ok() + else { + return; + }; + + if let Err(err) = self.decoder.decode(&chunk) { + re_log::error!("Failed to decode video chunk: {}", js_error_to_string(&err)); + } + } + + /// Reset the video decoder and discard all frames. + fn reset(&mut self) { + if let Err(err) = self.decoder.reset() { + re_log::error!( + "Failed to reset video decoder: {}", + js_error_to_string(&err) + ); + } + + if let Err(err) = self + .decoder + .configure(&js_video_decoder_config(&self.data.config)) + { + re_log::error!( + "Failed to configure video decoder: {}", + js_error_to_string(&err) + ); + } + + let mut frames = self.frames.lock(); + drop(frames.drain(..)); } } From a4ecab1a53db5ca7767a97eae9b559698878eb81 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Tue, 1 Oct 2024 14:54:37 +0200 Subject: [PATCH 04/61] Use rav1d from our GitHub --- Cargo.lock | 2 ++ crates/store/re_video/Cargo.toml | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 23d04bc2f3b3..5e006794df92 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1714,6 +1714,7 @@ checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" [[package]] name = "dav1d" version = "0.10.3" +source = "git+https://github.com/rerun-io/rav1d-rs#ffb30df91a4fcf0af4e6cf44a9a373265aba02c1" dependencies = [ "av-data", "bitflags 2.6.0", @@ -4703,6 +4704,7 @@ dependencies = [ [[package]] name = "rav1d" version = "1.0.0" +source = "git+https://github.com/rerun-io/rav1d-rs#ffb30df91a4fcf0af4e6cf44a9a373265aba02c1" dependencies = [ "assert_matches", "atomig", diff --git a/crates/store/re_video/Cargo.toml b/crates/store/re_video/Cargo.toml index 573cd0905e46..3a7c09159849 100644 --- a/crates/store/re_video/Cargo.toml +++ b/crates/store/re_video/Cargo.toml @@ -32,7 +32,8 @@ ordered-float.workspace = true parking_lot.workspace = true # If this package fails to build, install `nasm` locally, or build through `pixi`. -dav1d = { path = "/home/jan/rerun-io/dav1d-rs", package = "dav1d" } +# dav1d = { path = "/home/jan/rerun-io/dav1d-rs", package = "dav1d" } +dav1d = { git = "https://github.com/rerun-io/rav1d-rs" } [dev-dependencies] indicatif.workspace = true From 308df1c53aeb72f4748cd632d18438a0300cc196 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Tue, 1 Oct 2024 16:13:35 +0200 Subject: [PATCH 05/61] Work on getting it to compile --- .vscode/settings.json | 1 - crates/store/re_video/Cargo.toml | 1 - crates/store/re_video/src/lib.rs | 1 + .../src/renderer/video/decoder/native.rs | 236 --- .../src/renderer/video/decoder/web.rs | 388 ----- .../re_renderer/src/renderer/video/mod.rs | 78 - .../re_renderer/src/video/decoder/native.rs | 209 ++- crates/viewer/re_renderer/src/video/mod.rs | 4 - pixi.lock | 1378 +++++++++++------ pixi.toml | 1 - 10 files changed, 1069 insertions(+), 1228 deletions(-) delete mode 100644 crates/viewer/re_renderer/src/renderer/video/decoder/native.rs delete mode 100644 crates/viewer/re_renderer/src/renderer/video/decoder/web.rs delete mode 100644 crates/viewer/re_renderer/src/renderer/video/mod.rs diff --git a/.vscode/settings.json b/.vscode/settings.json index 405429e46566..f92aa692cba5 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -59,7 +59,6 @@ "python.analysis.extraPaths": [ "rerun_py/rerun_sdk" ], - "python.terminal.activateEnvironment": false, "ruff.format.args": [ "--config=rerun_py/pyproject.toml" ], diff --git a/crates/store/re_video/Cargo.toml b/crates/store/re_video/Cargo.toml index 0ccf7c00bad0..7224e07cf9cb 100644 --- a/crates/store/re_video/Cargo.toml +++ b/crates/store/re_video/Cargo.toml @@ -34,7 +34,6 @@ re_mp4.workspace = true thiserror.workspace = true # If this package fails to build, install `nasm` locally, or build through `pixi`. -# dav1d = { path = "/home/jan/rerun-io/dav1d-rs", package = "dav1d" } dav1d = { git = "https://github.com/rerun-io/rav1d-rs" } # dav1d = { path = "../../../../rav1d-rs", package = "dav1d" } diff --git a/crates/store/re_video/src/lib.rs b/crates/store/re_video/src/lib.rs index 6f8a62932f9a..25a1beedd467 100644 --- a/crates/store/re_video/src/lib.rs +++ b/crates/store/re_video/src/lib.rs @@ -3,6 +3,7 @@ pub mod decode; pub mod demux; +pub use decode::{av1, Frame}; pub use demux::{VideoData, VideoLoadError}; pub use re_mp4::{TrackId, TrackKind}; diff --git a/crates/viewer/re_renderer/src/renderer/video/decoder/native.rs b/crates/viewer/re_renderer/src/renderer/video/decoder/native.rs deleted file mode 100644 index 64f7d4a9e362..000000000000 --- a/crates/viewer/re_renderer/src/renderer/video/decoder/native.rs +++ /dev/null @@ -1,236 +0,0 @@ -#![allow(dead_code, unused_variables, clippy::unnecessary_wraps)] - -use std::sync::Arc; - -use crate::resource_managers::GpuTexture2D; -use crate::RenderContext; - -// TODO(#7298): remove `allow` once we have native video decoding -#[allow(unused_imports)] -use super::latest_at_idx; - -use parking_lot::Mutex; -use re_video::decode::Frame; -use re_video::TimeMs; - -use super::alloc_video_frame_texture; - -pub struct VideoDecoder { - data: re_video::demux::VideoData, - queue: Arc, - texture: GpuTexture2D, - zeroed_texture: GpuTexture2D, - - frames: Arc>>, - last_used_frame_timestamp: TimeMs, - current_segment_idx: usize, - current_sample_idx: usize, -} - -impl VideoDecoder { - pub fn new(render_context: &RenderContext, data: re_video::demux::VideoData) -> Option { - let frames = Arc::new(Mutex::new(Vec::new())); - - // TEMP: assuming `av1`, because `re_video` demuxer will panic if it's not - let decoder = re_video::decode::av1::Decoder::new({ - let frames = frames.clone(); - move |frame: re_video::decode::av1::Frame| { - frames.lock().push(frame); - } - }); - - let queue = render_context.queue.clone(); - - let texture = super::alloc_video_frame_texture( - &render_context.device, - &render_context.gpu_resources.textures, - data.config.coded_width as u32, - data.config.coded_height as u32, - ); - let zeroed_texture = alloc_video_frame_texture( - &render_context.device, - &render_context.gpu_resources.textures, - data.config.coded_width as u32, - data.config.coded_height as u32, - ); - - Some(Self { - data, - queue, - texture, - zeroed_texture, - - frames, - last_used_frame_timestamp: TimeMs::new(f64::MAX), - current_segment_idx: usize::MAX, - current_sample_idx: usize::MAX, - }) - } - - pub fn duration_ms(&self) -> f64 { - self.data.duration.as_f64() - } - - pub fn width(&self) -> u32 { - self.data.config.coded_width as u32 - } - - pub fn height(&self) -> u32 { - self.data.config.coded_height as u32 - } - - pub fn frame_at(&mut self, timestamp: TimeMs) -> GpuTexture2D { - if timestamp < TimeMs::ZERO { - return self.zeroed_texture.clone(); - } - - let Some(requested_segment_idx) = - latest_at_idx(&self.data.segments, |segment| segment.timestamp, ×tamp) - else { - // This should only happen if the video is completely empty. - return self.zeroed_texture.clone(); - }; - - let Some(requested_sample_idx) = latest_at_idx( - &self.data.segments[requested_segment_idx].samples, - |sample| sample.timestamp, - ×tamp, - ) else { - // This should never happen, because segments are never empty. - return self.zeroed_texture.clone(); - }; - - // Enqueue segments as needed. We maintain a buffer of 2 segments, so we can - // always smoothly transition to the next segment. - // We can always start decoding from any segment, because segments always begin - // with a keyframe. - // Backward seeks or seeks across many segments trigger a reset of the decoder, - // because decoding all the samples between the previous sample and the requested - // one would mean decoding and immediately discarding more frames than we otherwise - // need to. - if requested_segment_idx != self.current_segment_idx { - let segment_distance = - requested_segment_idx as isize - self.current_segment_idx as isize; - if segment_distance == 1 { - // forward seek to next segment - queue up the one _after_ requested - self.enqueue_all(requested_segment_idx + 1); - } else { - // forward seek by N>1 OR backward seek across segments - reset - self.reset(); - self.enqueue_all(requested_segment_idx); - self.enqueue_all(requested_segment_idx + 1); - } - } else if requested_sample_idx != self.current_sample_idx { - // special case: handle seeking backwards within a single segment - // this is super inefficient, but it's the only way to handle it - // while maintaining a buffer of 2 segments - let sample_distance = requested_sample_idx as isize - self.current_sample_idx as isize; - if sample_distance < 0 { - self.reset(); - self.enqueue_all(requested_segment_idx); - self.enqueue_all(requested_segment_idx + 1); - } - } - - self.current_segment_idx = requested_segment_idx; - self.current_sample_idx = requested_sample_idx; - - let mut frames = self.frames.lock(); - - let Some(frame_idx) = latest_at_idx(&frames, |(t, _)| *t, ×tamp) else { - // no buffered frames - texture will be blank - // not return a zeroed texture, because we may just be behind on decoding - // and showing an old frame is better than showing a blank frame, - // because it causes "black flashes" to appear - return self.texture.clone(); - }; - - // drain up-to (but not including) the frame idx, clearing out any frames - // before it. this lets the video decoder output more frames. - drop(frames.drain(0..frame_idx)); - - // after draining all old frames, the next frame will be at index 0 - let frame_idx = 0; - let (_, frame) = &frames[frame_idx]; - - // https://w3c.github.io/webcodecs/#output-videoframes 1. 1. states: - // Let timestamp and duration be the timestamp and duration from the EncodedVideoChunk associated with output. - // we always provide both, so they should always be available - let frame_timestamp_ms = frame.timestamp().map(TimeMs::new).unwrap_or_default(); - let frame_duration_ms = frame.duration().map(TimeMs::new).unwrap_or_default(); - - // This handles the case when we have a buffered frame that's older than the requested timestamp. - // We don't want to show this frame to the user, because it's not actually the one they requested. - if timestamp - frame_timestamp_ms > frame_duration_ms { - return self.texture.clone(); - } - - if self.last_used_frame_timestamp != frame_timestamp_ms { - copy_video_frame_to_texture(&self.queue, frame, &self.texture.texture); - self.last_used_frame_timestamp = frame_timestamp_ms; - } - - self.texture.clone() - } - - /// Enqueue all samples in the given segment. - /// - /// Does nothing if the index is out of bounds. - fn enqueue_all(&self, segment_idx: usize) { - let Some(segment) = self.data.segments.get(segment_idx) else { - return; - }; - - self.enqueue(&segment.samples[0], true); - for sample in &segment.samples[1..] { - self.enqueue(sample, false); - } - } - - /// Enqueue the given sample. - fn enqueue(&self, sample: &re_video::Sample, is_key: bool) { - let data = Uint8Array::from(&self.data.get(sample)); - let type_ = if is_key { - EncodedVideoChunkType::Key - } else { - EncodedVideoChunkType::Delta - }; - let chunk = EncodedVideoChunkInit::new(&data, sample.timestamp.as_f64(), type_); - chunk.set_duration(sample.duration.as_f64()); - let Some(chunk) = EncodedVideoChunk::new(&chunk) - .inspect_err(|err| { - re_log::error!("failed to create video chunk: {}", js_error_to_string(err)); - }) - .ok() - else { - return; - }; - - if let Err(err) = self.decoder.decode(&chunk) { - re_log::error!("Failed to decode video chunk: {}", js_error_to_string(&err)); - } - } - - /// Reset the video decoder and discard all frames. - fn reset(&mut self) { - if let Err(err) = self.decoder.reset() { - re_log::error!( - "Failed to reset video decoder: {}", - js_error_to_string(&err) - ); - } - - if let Err(err) = self - .decoder - .configure(&js_video_decoder_config(&self.data.config)) - { - re_log::error!( - "Failed to configure video decoder: {}", - js_error_to_string(&err) - ); - } - - let mut frames = self.frames.lock(); - drop(frames.drain(..)); - } -} diff --git a/crates/viewer/re_renderer/src/renderer/video/decoder/web.rs b/crates/viewer/re_renderer/src/renderer/video/decoder/web.rs deleted file mode 100644 index af809ba1bc8c..000000000000 --- a/crates/viewer/re_renderer/src/renderer/video/decoder/web.rs +++ /dev/null @@ -1,388 +0,0 @@ -// TODO(emilk): proper error handling: pass errors to caller instead of logging them` - -use super::latest_at_idx; -use crate::resource_managers::GpuTexture2D; -use crate::RenderContext; -use js_sys::Function; -use js_sys::Uint8Array; -use parking_lot::Mutex; -use re_video::TimeMs; -use re_video::VideoData; -use std::ops::Deref; -use std::sync::Arc; -use wasm_bindgen::closure::Closure; -use wasm_bindgen::JsCast as _; -use web_sys::EncodedVideoChunk; -use web_sys::EncodedVideoChunkInit; -use web_sys::EncodedVideoChunkType; -use web_sys::VideoDecoderConfig; -use web_sys::VideoDecoderInit; - -#[derive(Clone)] -#[repr(transparent)] -struct VideoFrame(web_sys::VideoFrame); - -impl Drop for VideoFrame { - fn drop(&mut self) { - self.0.close(); - } -} - -impl Deref for VideoFrame { - type Target = web_sys::VideoFrame; - - #[inline] - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -pub struct VideoDecoder { - data: re_video::VideoData, - queue: Arc, - texture: GpuTexture2D, - zeroed_texture: GpuTexture2D, - - decoder: web_sys::VideoDecoder, - - frames: Arc>>, - last_used_frame_timestamp: TimeMs, - current_segment_idx: usize, - current_sample_idx: usize, -} - -// SAFETY: There is no way to access the same JS object from different OS threads -// in a way that could result in a data race. - -#[allow(unsafe_code)] -// Clippy did not recognize a safety comment on these impls no matter what I tried: -#[allow(clippy::undocumented_unsafe_blocks)] -unsafe impl Send for VideoDecoder {} - -#[allow(unsafe_code)] -#[allow(clippy::undocumented_unsafe_blocks)] -unsafe impl Sync for VideoDecoder {} - -#[allow(unsafe_code)] -#[allow(clippy::undocumented_unsafe_blocks)] -unsafe impl Send for VideoFrame {} - -#[allow(unsafe_code)] -#[allow(clippy::undocumented_unsafe_blocks)] -unsafe impl Sync for VideoFrame {} - -impl Drop for VideoDecoder { - fn drop(&mut self) { - if let Err(err) = self.decoder.close() { - re_log::warn!( - "Error when closing video decoder: {}", - js_error_to_string(&err) - ); - } - } -} - -impl VideoDecoder { - pub fn new(render_context: &RenderContext, data: VideoData) -> Option { - let frames = Arc::new(Mutex::new(Vec::with_capacity(16))); - - let decoder = init_video_decoder({ - let frames = frames.clone(); - move |frame: web_sys::VideoFrame| { - frames.lock().push(( - TimeMs::new(frame.timestamp().unwrap_or(0.0)), - VideoFrame(frame), - )); - } - })?; - - let queue = render_context.queue.clone(); - - // NOTE: both textures are assumed to be rgba8unorm - let texture = super::alloc_video_frame_texture( - &render_context.device, - &render_context.gpu_resources.textures, - data.config.coded_width as u32, - data.config.coded_height as u32, - ); - let zeroed_texture = super::alloc_video_frame_texture( - &render_context.device, - &render_context.gpu_resources.textures, - data.config.coded_width as u32, - data.config.coded_height as u32, - ); - - let mut this = Self { - data, - queue, - texture, - zeroed_texture, - - decoder, - - frames, - last_used_frame_timestamp: TimeMs::new(f64::MAX), - current_segment_idx: usize::MAX, - current_sample_idx: usize::MAX, - }; - - // immediately enqueue some frames, assuming playback at start - this.reset(); - let _ = this.frame_at(TimeMs::new(0.0)); - - Some(this) - } - - pub fn duration_ms(&self) -> f64 { - self.data.duration.as_f64() - } - - pub fn width(&self) -> u32 { - self.data.config.coded_width as u32 - } - - pub fn height(&self) -> u32 { - self.data.config.coded_height as u32 - } - - pub fn frame_at(&mut self, timestamp: TimeMs) -> GpuTexture2D { - if timestamp < TimeMs::ZERO { - return self.zeroed_texture.clone(); - } - - let Some(requested_segment_idx) = - latest_at_idx(&self.data.segments, |segment| segment.timestamp, ×tamp) - else { - // This should only happen if the video is completely empty. - return self.zeroed_texture.clone(); - }; - - let Some(requested_sample_idx) = latest_at_idx( - &self.data.segments[requested_segment_idx].samples, - |sample| sample.timestamp, - ×tamp, - ) else { - // This should never happen, because segments are never empty. - return self.zeroed_texture.clone(); - }; - - // Enqueue segments as needed. We maintain a buffer of 2 segments, so we can - // always smoothly transition to the next segment. - // We can always start decoding from any segment, because segments always begin - // with a keyframe. - // Backward seeks or seeks across many segments trigger a reset of the decoder, - // because decoding all the samples between the previous sample and the requested - // one would mean decoding and immediately discarding more frames than we otherwise - // need to. - if requested_segment_idx != self.current_segment_idx { - let segment_distance = - requested_segment_idx as isize - self.current_segment_idx as isize; - if segment_distance == 1 { - // forward seek to next segment - queue up the one _after_ requested - self.enqueue_all(requested_segment_idx + 1); - } else { - // forward seek by N>1 OR backward seek across segments - reset - self.reset(); - self.enqueue_all(requested_segment_idx); - self.enqueue_all(requested_segment_idx + 1); - } - } else if requested_sample_idx != self.current_sample_idx { - // special case: handle seeking backwards within a single segment - // this is super inefficient, but it's the only way to handle it - // while maintaining a buffer of 2 segments - let sample_distance = requested_sample_idx as isize - self.current_sample_idx as isize; - if sample_distance < 0 { - self.reset(); - self.enqueue_all(requested_segment_idx); - self.enqueue_all(requested_segment_idx + 1); - } - } - - self.current_segment_idx = requested_segment_idx; - self.current_sample_idx = requested_sample_idx; - - let mut frames = self.frames.lock(); - - let Some(frame_idx) = latest_at_idx(&frames, |(t, _)| *t, ×tamp) else { - // no buffered frames - texture will be blank - // not return a zeroed texture, because we may just be behind on decoding - // and showing an old frame is better than showing a blank frame, - // because it causes "black flashes" to appear - return self.texture.clone(); - }; - - // drain up-to (but not including) the frame idx, clearing out any frames - // before it. this lets the video decoder output more frames. - drop(frames.drain(0..frame_idx)); - - // after draining all old frames, the next frame will be at index 0 - let frame_idx = 0; - let (_, frame) = &frames[frame_idx]; - - // https://w3c.github.io/webcodecs/#output-videoframes 1. 1. states: - // Let timestamp and duration be the timestamp and duration from the EncodedVideoChunk associated with output. - // we always provide both, so they should always be available - let frame_timestamp_ms = frame.timestamp().map(TimeMs::new).unwrap_or_default(); - let frame_duration_ms = frame.duration().map(TimeMs::new).unwrap_or_default(); - - // This handles the case when we have a buffered frame that's older than the requested timestamp. - // We don't want to show this frame to the user, because it's not actually the one they requested. - if timestamp - frame_timestamp_ms > frame_duration_ms { - return self.texture.clone(); - } - - if self.last_used_frame_timestamp != frame_timestamp_ms { - copy_video_frame_to_texture(&self.queue, frame, &self.texture.texture); - self.last_used_frame_timestamp = frame_timestamp_ms; - } - - self.texture.clone() - } - - /// Enqueue all samples in the given segment. - /// - /// Does nothing if the index is out of bounds. - fn enqueue_all(&self, segment_idx: usize) { - let Some(segment) = self.data.segments.get(segment_idx) else { - return; - }; - - self.enqueue(&segment.samples[0], true); - for sample in &segment.samples[1..] { - self.enqueue(sample, false); - } - } - - /// Enqueue the given sample. - fn enqueue(&self, sample: &re_video::Sample, is_key: bool) { - let data = Uint8Array::from(&self.data.get(sample)); - let type_ = if is_key { - EncodedVideoChunkType::Key - } else { - EncodedVideoChunkType::Delta - }; - let chunk = EncodedVideoChunkInit::new(&data, sample.timestamp.as_f64(), type_); - chunk.set_duration(sample.duration.as_f64()); - let Some(chunk) = EncodedVideoChunk::new(&chunk) - .inspect_err(|err| { - re_log::error!("failed to create video chunk: {}", js_error_to_string(err)); - }) - .ok() - else { - return; - }; - - if let Err(err) = self.decoder.decode(&chunk) { - re_log::error!("Failed to decode video chunk: {}", js_error_to_string(&err)); - } - } - - /// Reset the video decoder and discard all frames. - fn reset(&mut self) { - if let Err(err) = self.decoder.reset() { - re_log::error!( - "Failed to reset video decoder: {}", - js_error_to_string(&err) - ); - } - - if let Err(err) = self - .decoder - .configure(&js_video_decoder_config(&self.data.config)) - { - re_log::error!( - "Failed to configure video decoder: {}", - js_error_to_string(&err) - ); - } - - let mut frames = self.frames.lock(); - drop(frames.drain(..)); - } -} - -fn copy_video_frame_to_texture( - queue: &wgpu::Queue, - frame: &web_sys::VideoFrame, - texture: &wgpu::Texture, -) { - let size = wgpu::Extent3d { - width: frame.display_width(), - height: frame.display_height(), - depth_or_array_layers: 1, - }; - let source = { - // TODO(jan): Remove this unsafe code when https://github.com/gfx-rs/wgpu/pull/6170 ships. - // SAFETY: Depends on the fact that `wgpu` passes the object through as-is, - // and doesn't actually inspect it in any way. The browser then does its own - // typecheck that doesn't care what kind of image source wgpu gave it. - #[allow(unsafe_code)] - let frame = unsafe { - std::mem::transmute::( - frame.clone().expect("Failed to clone the video frame"), - ) - }; - wgpu_types::ImageCopyExternalImage { - source: wgpu_types::ExternalImageSource::HTMLVideoElement(frame), - origin: wgpu_types::Origin2d { x: 0, y: 0 }, - flip_y: false, - } - }; - let dest = wgpu::ImageCopyTextureTagged { - texture, - mip_level: 0, - origin: wgpu::Origin3d { x: 0, y: 0, z: 0 }, - aspect: wgpu::TextureAspect::All, - color_space: wgpu::PredefinedColorSpace::Srgb, - premultiplied_alpha: false, - }; - queue.copy_external_image_to_texture(&source, dest, size); -} - -fn init_video_decoder( - on_output: impl Fn(web_sys::VideoFrame) + 'static, -) -> Option { - let on_output = Closure::wrap(Box::new(on_output) as Box); - let on_error = Closure::wrap(Box::new(|err: js_sys::Error| { - let err = std::string::ToString::to_string(&err.to_string()); - - re_log::error!("failed to decode video: {err}"); - }) as Box); - - let Ok(on_output) = on_output.into_js_value().dyn_into::() else { - unreachable!() - }; - let Ok(on_error) = on_error.into_js_value().dyn_into::() else { - unreachable!() - }; - let decoder = web_sys::VideoDecoder::new(&VideoDecoderInit::new(&on_error, &on_output)) - .inspect_err(|err| { - re_log::error!("failed to create VideoDecoder: {}", js_error_to_string(err)); - }) - .ok()?; - - Some(decoder) -} - -fn js_video_decoder_config(config: &re_video::Config) -> VideoDecoderConfig { - let js = VideoDecoderConfig::new(&config.codec); - js.set_coded_width(config.coded_width as u32); - js.set_coded_height(config.coded_height as u32); - let description = Uint8Array::new_with_length(config.description.len() as u32); - description.copy_from(&config.description[..]); - js.set_description(&description); - js.set_optimize_for_latency(true); - js -} - -fn js_error_to_string(v: &wasm_bindgen::JsValue) -> String { - if let Some(v) = v.as_string() { - return v; - } - - if let Some(v) = v.dyn_ref::() { - return std::string::ToString::to_string(&v.to_string()); - } - - format!("{v:#?}") -} diff --git a/crates/viewer/re_renderer/src/renderer/video/mod.rs b/crates/viewer/re_renderer/src/renderer/video/mod.rs deleted file mode 100644 index 6b8aef089f8b..000000000000 --- a/crates/viewer/re_renderer/src/renderer/video/mod.rs +++ /dev/null @@ -1,78 +0,0 @@ -mod decoder; - -use crate::resource_managers::GpuTexture2D; -use crate::RenderContext; -use re_video::demux::{mp4, VideoLoadError}; -use re_video::TimeMs; - -/// A video file. -/// -/// Supports asynchronously decoding video into GPU textures via [`Video::frame_at`]. -pub struct Video { - decoder: decoder::VideoDecoder, -} - -impl Video { - /// Loads a video from the given data. - /// - /// Currently supports the following media types: - /// - `video/mp4` - pub fn load( - render_context: &RenderContext, - media_type: Option<&str>, - data: &[u8], - ) -> Result { - let data = match media_type { - Some("video/mp4") => mp4::load_mp4(data)?, - Some(media_type) => { - return Err(VideoError::Load(VideoLoadError::UnsupportedMediaType( - media_type.to_owned(), - ))) - } - None => return Err(VideoError::Load(VideoLoadError::UnknownMediaType)), - }; - let decoder = - decoder::VideoDecoder::new(render_context, data).ok_or_else(|| VideoError::Init)?; - - Ok(Self { decoder }) - } - - /// Duration of the video in milliseconds. - pub fn duration_ms(&self) -> f64 { - self.decoder.duration_ms() - } - - /// Natural width of the video. - pub fn width(&self) -> u32 { - self.decoder.width() - } - - /// Natural height of the video. - pub fn height(&self) -> u32 { - self.decoder.height() - } - - /// Returns a texture with the latest frame at the given timestamp. - /// - /// If the timestamp is negative, a zeroed texture is returned. - /// - /// This API is _asynchronous_, meaning that the decoder may not yet have decoded the frame - /// at the given timestamp. If the frame is not yet available, the returned texture will be - /// empty. - /// - /// This takes `&mut self` because the decoder maintains a buffer of decoded frames, - /// which requires mutation. It is also not thread-safe by default. - pub fn frame_at(&mut self, timestamp_s: f64) -> GpuTexture2D { - re_tracing::profile_function!(); - self.decoder.frame_at(TimeMs::new(timestamp_s * 1e3)) - } -} - -#[derive(thiserror::Error, Debug)] -pub enum VideoError { - #[error("{0}")] - Load(#[from] VideoLoadError), - - #[error("failed to initialize video decoder")] - Init, -} diff --git a/crates/viewer/re_renderer/src/video/decoder/native.rs b/crates/viewer/re_renderer/src/video/decoder/native.rs index 87abc6c87917..1135cfd909a6 100644 --- a/crates/viewer/re_renderer/src/video/decoder/native.rs +++ b/crates/viewer/re_renderer/src/video/decoder/native.rs @@ -4,19 +4,32 @@ use std::sync::Arc; use crate::{ resource_managers::GpuTexture2D, - video::{DecodeHardwareAcceleration, DecodingError, FrameDecodingResult}, - RenderContext, + video::{DecodeHardwareAcceleration, DecodingError, VideoFrameTexture}, }; +use crate::{video::FrameDecodingResult, RenderContext}; // TODO(#7298): remove `allow` once we have native video decoding #[allow(unused_imports)] use super::latest_at_idx; +use parking_lot::Mutex; +use re_video::TimeMs; +use re_video::{decode::Frame, Time}; + use super::alloc_video_frame_texture; +/// Native AV1 decoder pub struct VideoDecoder { data: Arc, + queue: Arc, + texture: GpuTexture2D, zeroed_texture: GpuTexture2D, + decoder: re_video::decode::av1::Decoder, + + frames: Arc>>, + last_used_frame_timestamp: TimeMs, + current_segment_idx: usize, + current_sample_idx: usize, } impl VideoDecoder { @@ -24,26 +37,202 @@ impl VideoDecoder { render_context: &RenderContext, data: Arc, _hw_acceleration: DecodeHardwareAcceleration, - ) -> Result { - let device = render_context.device.clone(); + ) -> Option { + let frames = Arc::new(Mutex::new(Vec::new())); + + // TEMP: assuming `av1`, because `re_video` demuxer will panic if it's not + let decoder = re_video::decode::av1::Decoder::new({ + let frames = frames.clone(); + move |frame: re_video::decode::Frame| { + frames.lock().push(frame); + } + }); + + let queue = render_context.queue.clone(); + + let texture = super::alloc_video_frame_texture( + &render_context.device, + &render_context.gpu_resources.textures, + data.config.coded_width as u32, + data.config.coded_height as u32, + ); let zeroed_texture = alloc_video_frame_texture( - &device, + &render_context.device, &render_context.gpu_resources.textures, data.config.coded_width as u32, data.config.coded_height as u32, ); - Ok(Self { + + Some(Self { data, + queue, + texture, zeroed_texture, + decoder, + + frames, + last_used_frame_timestamp: TimeMs::new(f64::MAX), + current_segment_idx: usize::MAX, + current_sample_idx: usize::MAX, }) } - #[allow(clippy::unused_self)] + pub fn duration_ms(&self) -> f64 { + self.data.duration_sec() + } + + pub fn width(&self) -> u32 { + self.data.config.coded_width as u32 + } + + pub fn height(&self) -> u32 { + self.data.config.coded_height as u32 + } + pub fn frame_at( &mut self, - _render_ctx: &RenderContext, - _presentation_timestamp_s: f64, + render_ctx: &RenderContext, + presentation_timestamp_s: f64, ) -> FrameDecodingResult { - Err(DecodingError::NoNativeSupport) + if presentation_timestamp_s < 0.0 { + return Err(DecodingError::NegativeTimestamp); + } + let presentation_timestamp = Time::from_secs(presentation_timestamp_s, self.data.timescale); + + let Some(requested_segment_idx) = latest_at_idx( + &self.data.segments, + |segment| segment.start, + &presentation_timestamp, + ) else { + return Err(DecodingError::EmptyVideo); + }; + + let Some(requested_sample_idx) = latest_at_idx( + &self.data.samples, + |sample| sample.decode_timestamp, + &presentation_timestamp, + ) else { + return Err(DecodingError::EmptyVideo); + }; + + // Enqueue segments as needed. We maintain a buffer of 2 segments, so we can + // always smoothly transition to the next segment. + // We can always start decoding from any segment, because segments always begin + // with a keyframe. + // Backward seeks or seeks across many segments trigger a reset of the decoder, + // because decoding all the samples between the previous sample and the requested + // one would mean decoding and immediately discarding more frames than we otherwise + // need to. + if requested_segment_idx != self.current_segment_idx { + let segment_distance = + requested_segment_idx as isize - self.current_segment_idx as isize; + if segment_distance == 1 { + // forward seek to next segment - queue up the one _after_ requested + self.enqueue_all(requested_segment_idx + 1); + } else { + // forward seek by N>1 OR backward seek across segments - reset + self.reset(); + self.enqueue_all(requested_segment_idx); + self.enqueue_all(requested_segment_idx + 1); + } + } else if requested_sample_idx != self.current_sample_idx { + // special case: handle seeking backwards within a single segment + // this is super inefficient, but it's the only way to handle it + // while maintaining a buffer of 2 segments + let sample_distance = requested_sample_idx as isize - self.current_sample_idx as isize; + if sample_distance < 0 { + self.reset(); + self.enqueue_all(requested_segment_idx); + self.enqueue_all(requested_segment_idx + 1); + } + } + + self.current_segment_idx = requested_segment_idx; + self.current_sample_idx = requested_sample_idx; + + let mut frames = self.frames.lock(); + + let Some(frame_idx) = + latest_at_idx(&frames, |frame| frame.timestamp, &presentation_timestamp) + else { + // No buffered frames - texture will be blank. + + // Don't return a zeroed texture, because we may just be behind on decoding + // and showing an old frame is better than showing a blank frame, + // because it causes "black flashes" to appear + return Ok(VideoFrameTexture::Pending(self.texture.clone())); + }; + + // drain up-to (but not including) the frame idx, clearing out any frames + // before it. this lets the video decoder output more frames. + drop(frames.drain(0..frame_idx)); + + // after draining all old frames, the next frame will be at index 0 + let frame_idx = 0; + let frame = &frames[frame_idx]; + + // https://w3c.github.io/webcodecs/#output-videoframes 1. 1. states: + // Let timestamp and duration be the timestamp and duration from the EncodedVideoChunk associated with output. + // we always provide both, so they should always be available + let frame_timestamp_ms = frame.timestamp().map(TimeMs::new).unwrap_or_default(); + let frame_duration_ms = frame.duration().map(TimeMs::new).unwrap_or_default(); + + // This handles the case when we have a buffered frame that's older than the requested timestamp. + // We don't want to show this frame to the user, because it's not actually the one they requested, + // so instead return the last decoded frame. + if presentation_timestamp - frame_timestamp_ms > frame_duration_ms { + return Ok(VideoFrameTexture::Pending(self.texture.clone())); + } + + if self.last_used_frame_timestamp != frame_timestamp_ms { + copy_video_frame_to_texture(&self.queue, frame, &self.texture.texture); + self.last_used_frame_timestamp = frame_timestamp_ms; + } + + self.texture.clone() + } + + /// Enqueue all samples in the given segment. + /// + /// Does nothing if the index is out of bounds. + fn enqueue_all(&self, segment_idx: usize) { + let Some(segment) = self.data.segments.get(segment_idx) else { + return; + }; + + self.enqueue(&segment.samples[0], true); + for sample in &segment.samples[1..] { + self.enqueue(sample, false); + } + } + + /// Enqueue the given sample. + fn enqueue(&self, sample: &re_video::Sample, is_key: bool) { + let data = Uint8Array::from(&self.data.get(sample)); + let type_ = if is_key { + EncodedVideoChunkType::Key + } else { + EncodedVideoChunkType::Delta + }; + let chunk = EncodedVideoChunkInit::new(&data, sample.timestamp.as_f64(), type_); + chunk.set_duration(sample.duration.as_f64()); + let Some(chunk) = EncodedVideoChunk::new(&chunk) + .inspect_err(|err| { + re_log::error!("failed to create video chunk: {}", js_error_to_string(err)); + }) + .ok() + else { + return; + }; + + self.decoder.decode(&chunk); + } + + /// Reset the video decoder and discard all frames. + fn reset(&mut self) { + self.decoder.reset(); + + let mut frames = self.frames.lock(); + drop(frames.drain(..)); } } diff --git a/crates/viewer/re_renderer/src/video/mod.rs b/crates/viewer/re_renderer/src/video/mod.rs index 8363ba38c444..9abf6312e229 100644 --- a/crates/viewer/re_renderer/src/video/mod.rs +++ b/crates/viewer/re_renderer/src/video/mod.rs @@ -12,10 +12,6 @@ use crate::{resource_managers::GpuTexture2D, RenderContext}; // TODO(jan, andreas): These errors are for the most part specific to the web decoder right now. #[derive(thiserror::Error, Debug, Clone)] pub enum DecodingError { - // TODO(#7298): Native support. - #[error("Video playback not yet available in the native viewer. Try the web viewer instead.")] - NoNativeSupport, - #[error("Failed to create VideoDecoder: {0}")] DecoderSetupFailure(String), diff --git a/pixi.lock b/pixi.lock index dcbc47865ea1..fbb3ad31d6f6 100644 --- a/pixi.lock +++ b/pixi.lock @@ -125,7 +125,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.0.5-py311h459d7ec_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.8.0-py311h459d7ec_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nasm-2.16.03-h4bc722e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.11.1-h924138e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.12.2-hb753e55_0.conda @@ -350,7 +349,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.0.5-py311hcd402e7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mypy-1.8.0-py311hcd402e7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nasm-2.16.03-h68df207_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-h0425590_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ninja-1.11.1-hdd96247_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.12.2-hc1f8a26_0.conda @@ -564,7 +562,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/multidict-6.0.5-py311h5547dcb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/mypy-1.8.0-py311he705e18_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/nasm-2.16.03-hfdf4475_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h5846eda_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.11.1-hb8565cd_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/nodejs-20.12.2-hfc0f20e_0.conda @@ -775,7 +772,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.0.5-py311he2be06e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-1.8.0-py311h05b510d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nasm-2.16.03-h99b78c6_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-hb89a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.11.1-hffc8910_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-20.12.2-h3b52c9b_0.conda @@ -962,7 +958,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/multidict-6.0.5-py311ha68e1ae_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mypy-1.8.0-py311ha68e1ae_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/nasm-2.16.03-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.11.1-h91493d7_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-20.12.2-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.4-py311h0b4df5a_0.conda @@ -1177,7 +1172,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.0.5-py311h459d7ec_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.8.0-py311h459d7ec_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nasm-2.16.03-h4bc722e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.11.1-h924138e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.12.2-hb753e55_0.conda @@ -1385,7 +1379,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.0.5-py311hcd402e7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mypy-1.8.0-py311hcd402e7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nasm-2.16.03-h68df207_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-h0425590_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ninja-1.11.1-hdd96247_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.12.2-hc1f8a26_0.conda @@ -1584,7 +1577,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/multidict-6.0.5-py311h5547dcb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/mypy-1.8.0-py311he705e18_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/nasm-2.16.03-hfdf4475_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h5846eda_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.11.1-hb8565cd_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/nodejs-20.12.2-hfc0f20e_0.conda @@ -1779,7 +1771,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.0.5-py311he2be06e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-1.8.0-py311h05b510d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nasm-2.16.03-h99b78c6_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-hb89a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.11.1-hffc8910_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-20.12.2-h3b52c9b_0.conda @@ -1966,7 +1957,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/multidict-6.0.5-py311ha68e1ae_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mypy-1.8.0-py311ha68e1ae_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/nasm-2.16.03-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.11.1-h91493d7_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-20.12.2-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.4-py311h0b4df5a_0.conda @@ -6084,7 +6074,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.3.0-hf1915f5_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.3.0-hca2cd23_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nasm-2.16.03-h4bc722e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nettle-3.9.1-h7ab15ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.11.1-h924138e_0.conda @@ -6431,7 +6420,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.0.5-py311hcd402e7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mypy-1.8.0-py311hcd402e7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nasm-2.16.03-h68df207_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-h0425590_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nettle-3.9.1-h9d1147b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ninja-1.11.1-hdd96247_0.conda @@ -6744,7 +6732,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/multidict-6.0.5-py311h5547dcb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/mypy-1.8.0-py311he705e18_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/nasm-2.16.03-hfdf4475_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h5846eda_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/nettle-3.9.1-h8e11ae5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.11.1-hb8565cd_0.conda @@ -7037,7 +7024,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.0.5-py311he2be06e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-1.8.0-py311h05b510d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nasm-2.16.03-h99b78c6_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-hb89a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nettle-3.9.1-h40ed0f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.11.1-hffc8910_0.conda @@ -7312,7 +7298,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/multidict-6.0.5-py311ha68e1ae_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mypy-1.8.0-py311ha68e1ae_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/nasm-2.16.03-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.11.1-h91493d7_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-20.12.2-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.4-py311h0b4df5a_0.conda @@ -7655,7 +7640,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.3.0-h70512c7_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.3.0-ha479ceb_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nasm-2.16.03-h4bc722e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nettle-3.9.1-h7ab15ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.11.1-h924138e_0.conda @@ -8193,7 +8177,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.0.5-py311hcd402e7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mypy-1.8.0-py311hcd402e7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nasm-2.16.03-h68df207_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-h0425590_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nettle-3.9.1-h9d1147b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ninja-1.11.1-hdd96247_0.conda @@ -8684,7 +8667,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/multidict-6.0.5-py311h5547dcb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/mypy-1.8.0-py311he705e18_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/nasm-2.16.03-hfdf4475_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h5846eda_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/nettle-3.9.1-h8e11ae5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.11.1-hb8565cd_0.conda @@ -9164,7 +9146,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.0.5-py311he2be06e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-1.8.0-py311h05b510d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nasm-2.16.03-h99b78c6_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-hb89a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nettle-3.9.1-h40ed0f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.11.1-hffc8910_0.conda @@ -9307,7 +9288,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/57/e1/085edea6187a127ca8ea053eb01f4e1792d778b4d192c74d32eb6730fed6/jupyter_server-2.14.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/07/2d/2b32cdbe8d2a602f697a649798554e4f072115438e92249624e532e8aca6/jupyter_server_terminals-0.5.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7a/9b/cbf48a399c78e749c23aa33d51ac97c8f35154846b470907db8d2a40e437/jupyter_ui_poll-1.0.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b2/6c/49339cfcda05c7fcd5ba49b23373259366b508715b356674c79d26633152/jupyterlab-4.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f6/b2/ba6fba3f52f785ba9740a7954e0d4477828f7395ee9f2f4707db5835a833/jupyterlab-4.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/09/2032e7d15c544a0e3cd831c51d77a8ca57f7555b2e1b2922142eddb02a84/jupyterlab_server-2.27.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/65/f6/659ca44182c86f57977e946047c339c717745fda9f43b7ac47f274e86553/jupyterlab_widgets-3.0.11-py3-none-any.whl @@ -9610,7 +9591,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/multidict-6.0.5-py311ha68e1ae_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mypy-1.8.0-py311ha68e1ae_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/nasm-2.16.03-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.11.1-h91493d7_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-20.12.2-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.4-py311h0b4df5a_0.conda @@ -10129,7 +10109,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.3.0-h70512c7_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.3.0-ha479ceb_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nasm-2.16.03-h4bc722e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nettle-3.9.1-h7ab15ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.11.1-h924138e_0.conda @@ -10497,7 +10476,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.0.5-py311hcd402e7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mypy-1.8.0-py311hcd402e7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nasm-2.16.03-h68df207_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-h0425590_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nettle-3.9.1-h9d1147b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ninja-1.11.1-hdd96247_0.conda @@ -10829,7 +10807,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/multidict-6.0.5-py311h5547dcb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/mypy-1.8.0-py311he705e18_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/nasm-2.16.03-hfdf4475_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h5846eda_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/nettle-3.9.1-h8e11ae5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.11.1-hb8565cd_0.conda @@ -11142,7 +11119,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.0.5-py311he2be06e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-1.8.0-py311h05b510d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nasm-2.16.03-h99b78c6_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-hb89a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nettle-3.9.1-h40ed0f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.11.1-hffc8910_0.conda @@ -11421,7 +11397,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/multidict-6.0.5-py311ha68e1ae_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mypy-1.8.0-py311ha68e1ae_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/nasm-2.16.03-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.11.1-h91493d7_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-20.12.2-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.4-py311h0b4df5a_0.conda @@ -12098,8 +12073,8 @@ packages: - kind: pypi name: argon2-cffi-bindings version: 21.2.0 - url: https://files.pythonhosted.org/packages/b3/02/f7f7bb6b6af6031edb11037639c697b912e1dea2db94d436e681aea2f495/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d + url: https://files.pythonhosted.org/packages/37/2c/e34e47c7dee97ba6f01a6203e0383e15b60fb85d78ac9a15cd066f6fe28b/argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl + sha256: b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f requires_dist: - cffi>=1.0.1 - pytest ; extra == 'dev' @@ -12111,8 +12086,8 @@ packages: - kind: pypi name: argon2-cffi-bindings version: 21.2.0 - url: https://files.pythonhosted.org/packages/37/2c/e34e47c7dee97ba6f01a6203e0383e15b60fb85d78ac9a15cd066f6fe28b/argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl - sha256: b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f + url: https://files.pythonhosted.org/packages/5a/e4/bf8034d25edaa495da3c8a3405627d2e35758e44ff6eaa7948092646fdcc/argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl + sha256: e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93 requires_dist: - cffi>=1.0.1 - pytest ; extra == 'dev' @@ -12124,8 +12099,8 @@ packages: - kind: pypi name: argon2-cffi-bindings version: 21.2.0 - url: https://files.pythonhosted.org/packages/5a/e4/bf8034d25edaa495da3c8a3405627d2e35758e44ff6eaa7948092646fdcc/argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl - sha256: e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93 + url: https://files.pythonhosted.org/packages/b3/02/f7f7bb6b6af6031edb11037639c697b912e1dea2db94d436e681aea2f495/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d requires_dist: - cffi>=1.0.1 - pytest ; extra == 'dev' @@ -12162,6 +12137,21 @@ packages: - tqdm - trimesh editable: true +- kind: pypi + name: arkit-scenes + version: 0.1.0 + path: examples/python/arkit_scenes + sha256: 1ea1defa403966ebbc7e54ff7b92f65fdb6c98ee3e242d8af0be46023ed87961 + requires_dist: + - matplotlib + - numpy + - opencv-python + - pandas + - rerun-sdk + - scipy + - tqdm + - trimesh + editable: true - kind: pypi name: arrow version: 1.3.0 @@ -14551,6 +14541,20 @@ packages: - jinja2 ; extra == 'compiler' - protobuf ; extra == 'compiler' requires_python: '>=3.6' +- kind: pypi + name: betterproto + version: 1.2.5 + url: https://files.pythonhosted.org/packages/ff/2e/abfed7a721928e14aeb900182ff695be474c4ee5f07ef0874cc5ecd5b0b1/betterproto-1.2.5.tar.gz + sha256: 74a3ab34646054f674d236d1229ba8182dc2eae86feb249b8590ef496ce9803d + requires_dist: + - grpclib + - stringcase + - dataclasses ; python_version < '3.7' + - backports-datetime-fromisoformat ; python_version < '3.7' + - black ; extra == 'compiler' + - jinja2 ; extra == 'compiler' + - protobuf ; extra == 'compiler' + requires_python: '>=3.6' - kind: conda name: binaryen version: '117' @@ -14847,6 +14851,26 @@ packages: - numpy - rerun-sdk editable: true +- kind: pypi + name: blueprint + version: 0.1.0 + path: examples/python/blueprint + sha256: d9a358e5994ec1e9144942903e46148b16825344cddc19e7188b285f59bc61c1 + requires_dist: + - numpy + - rerun-sdk + editable: true +- kind: pypi + name: blueprint-stocks + version: 0.1.0 + path: examples/python/blueprint_stocks + sha256: 7c8b6805f08610837014175d9d0212815a91c3197756cdbbce836a2f15e40eea + requires_dist: + - humanize + - rerun-sdk + - yfinance + requires_python: '>=3.8' + editable: true - kind: pypi name: blueprint-stocks version: 0.1.0 @@ -15517,54 +15541,54 @@ packages: - kind: pypi name: cffi version: 1.16.0 - url: https://files.pythonhosted.org/packages/b5/23/ea84dd4985649fcc179ba3a6c9390412e924d20b0244dc71a6545788f5a2/cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936 + url: https://files.pythonhosted.org/packages/18/6c/0406611f3d5aadf4c5b08f6c095d874aed8dfc2d3a19892707d72536d5dc/cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl + sha256: 1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417 requires_dist: - pycparser requires_python: '>=3.8' - kind: pypi name: cffi version: 1.16.0 - url: https://files.pythonhosted.org/packages/95/c8/ce05a6cba2bec12d4b28285e66c53cc88dd7385b102dea7231da3b74cfef/cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl - sha256: b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404 + url: https://files.pythonhosted.org/packages/5a/c7/694814b3757878b29da39bc2f0cf9d20295f4c1e0a0bde7971708d5f23f8/cffi-1.16.0-cp311-cp311-win_amd64.whl + sha256: db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba requires_dist: - pycparser requires_python: '>=3.8' - kind: pypi name: cffi version: 1.16.0 - url: https://files.pythonhosted.org/packages/5a/c7/694814b3757878b29da39bc2f0cf9d20295f4c1e0a0bde7971708d5f23f8/cffi-1.16.0-cp311-cp311-win_amd64.whl - sha256: db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba + url: https://files.pythonhosted.org/packages/95/c8/ce05a6cba2bec12d4b28285e66c53cc88dd7385b102dea7231da3b74cfef/cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404 requires_dist: - pycparser requires_python: '>=3.8' - kind: pypi name: cffi version: 1.16.0 - url: https://files.pythonhosted.org/packages/18/6c/0406611f3d5aadf4c5b08f6c095d874aed8dfc2d3a19892707d72536d5dc/cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl - sha256: 1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417 + url: https://files.pythonhosted.org/packages/9b/89/a31c81e36bbb793581d8bba4406a8aac4ba84b2559301c44eef81f4cf5df/cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e requires_dist: - pycparser requires_python: '>=3.8' - kind: pypi name: cffi version: 1.16.0 - url: https://files.pythonhosted.org/packages/9b/89/a31c81e36bbb793581d8bba4406a8aac4ba84b2559301c44eef81f4cf5df/cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e + url: https://files.pythonhosted.org/packages/b5/23/ea84dd4985649fcc179ba3a6c9390412e924d20b0244dc71a6545788f5a2/cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936 requires_dist: - pycparser requires_python: '>=3.8' - kind: pypi name: charset-normalizer version: 3.3.2 - url: https://files.pythonhosted.org/packages/e4/a6/7ee57823d46331ddc37dd00749c95b0edec2c79b15fc0d6e6efb532e89ac/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f + url: https://files.pythonhosted.org/packages/3e/33/21a875a61057165e92227466e54ee076b73af1e21fe1b31f1e292251aa1e/charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96 requires_python: '>=3.7.0' - kind: pypi name: charset-normalizer version: 3.3.2 - url: https://files.pythonhosted.org/packages/3e/33/21a875a61057165e92227466e54ee076b73af1e21fe1b31f1e292251aa1e/charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96 + url: https://files.pythonhosted.org/packages/40/26/f35951c45070edc957ba40a5b1db3cf60a9dbb1b350c2d5bef03e01e61de/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8 requires_python: '>=3.7.0' - kind: pypi name: charset-normalizer @@ -15581,8 +15605,8 @@ packages: - kind: pypi name: charset-normalizer version: 3.3.2 - url: https://files.pythonhosted.org/packages/40/26/f35951c45070edc957ba40a5b1db3cf60a9dbb1b350c2d5bef03e01e61de/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8 + url: https://files.pythonhosted.org/packages/e4/a6/7ee57823d46331ddc37dd00749c95b0edec2c79b15fc0d6e6efb532e89ac/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f requires_python: '>=3.7.0' - kind: conda name: clang @@ -16952,6 +16976,15 @@ packages: - numpy - rerun-sdk editable: true +- kind: pypi + name: clock + version: 0.1.0 + path: examples/python/clock + sha256: 1ae48a7222b2fc2bd9942a31bb48fefb34225a946859ad95c25ad00bfb754cd7 + requires_dist: + - numpy + - rerun-sdk + editable: true - kind: conda name: cmake version: 3.27.6 @@ -17184,8 +17217,8 @@ packages: - kind: pypi name: contourpy version: 1.2.1 - url: https://files.pythonhosted.org/packages/98/72/ae1e8518a2fe75980598a2716e392c7642b70b6a5605fc925426007b0f49/contourpy-1.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 6150ffa5c767bc6332df27157d95442c379b7dce3a38dff89c0f39b63275696f + url: https://files.pythonhosted.org/packages/33/0e/51ff72fac17e2500baf30b6b2a24be423a8d27e1625e5de99f585b852d74/contourpy-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 6022cecf8f44e36af10bd9118ca71f371078b4c168b6e0fab43d4a889985dbb5 requires_dist: - numpy>=1.20 - furo ; extra == 'docs' @@ -17208,8 +17241,8 @@ packages: - kind: pypi name: contourpy version: 1.2.1 - url: https://files.pythonhosted.org/packages/d6/4f/76d0dd0bca417691918484c26c74dd9dd44fbf528bbfeb30d754886e2c54/contourpy-1.2.1-cp311-cp311-win_amd64.whl - sha256: 2855c8b0b55958265e8b5888d6a615ba02883b225f2227461aa9127c578a4922 + url: https://files.pythonhosted.org/packages/98/72/ae1e8518a2fe75980598a2716e392c7642b70b6a5605fc925426007b0f49/contourpy-1.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 6150ffa5c767bc6332df27157d95442c379b7dce3a38dff89c0f39b63275696f requires_dist: - numpy>=1.20 - furo ; extra == 'docs' @@ -17232,8 +17265,8 @@ packages: - kind: pypi name: contourpy version: 1.2.1 - url: https://files.pythonhosted.org/packages/33/0e/51ff72fac17e2500baf30b6b2a24be423a8d27e1625e5de99f585b852d74/contourpy-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 6022cecf8f44e36af10bd9118ca71f371078b4c168b6e0fab43d4a889985dbb5 + url: https://files.pythonhosted.org/packages/9f/6b/8a1ca4b81d426c104fe42b3cfad9488eaaef0a03fcf98eaecc22b628a013/contourpy-1.2.1-cp311-cp311-macosx_11_0_arm64.whl + sha256: ef5adb9a3b1d0c645ff694f9bca7702ec2c70f4d734f9922ea34de02294fdf72 requires_dist: - numpy>=1.20 - furo ; extra == 'docs' @@ -17256,8 +17289,8 @@ packages: - kind: pypi name: contourpy version: 1.2.1 - url: https://files.pythonhosted.org/packages/ee/c0/9bd123d676eb61750e116a2cd915b06483fc406143cfc36c7f263f0f5368/contourpy-1.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: d4492d82b3bc7fbb7e3610747b159869468079fe149ec5c4d771fa1f614a14df + url: https://files.pythonhosted.org/packages/d6/4f/76d0dd0bca417691918484c26c74dd9dd44fbf528bbfeb30d754886e2c54/contourpy-1.2.1-cp311-cp311-win_amd64.whl + sha256: 2855c8b0b55958265e8b5888d6a615ba02883b225f2227461aa9127c578a4922 requires_dist: - numpy>=1.20 - furo ; extra == 'docs' @@ -17280,8 +17313,8 @@ packages: - kind: pypi name: contourpy version: 1.2.1 - url: https://files.pythonhosted.org/packages/9f/6b/8a1ca4b81d426c104fe42b3cfad9488eaaef0a03fcf98eaecc22b628a013/contourpy-1.2.1-cp311-cp311-macosx_11_0_arm64.whl - sha256: ef5adb9a3b1d0c645ff694f9bca7702ec2c70f4d734f9922ea34de02294fdf72 + url: https://files.pythonhosted.org/packages/ee/c0/9bd123d676eb61750e116a2cd915b06483fc406143cfc36c7f263f0f5368/contourpy-1.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: d4492d82b3bc7fbb7e3610747b159869468079fe149ec5c4d771fa1f614a14df requires_dist: - numpy>=1.20 - furo ; extra == 'docs' @@ -17317,11 +17350,27 @@ packages: - rerun-sdk requires_python: '>=3.10' editable: true +- kind: pypi + name: controlnet + version: 0.1.0 + path: examples/python/controlnet + sha256: 8ae055c0b8b0dd7757e4e666f6163172859044d4090830aecbec3460cdb318ee + requires_dist: + - accelerate + - opencv-python + - pillow + - diffusers==0.27.2 + - numpy + - torch==2.2.2 + - transformers + - rerun-sdk + requires_python: '>=3.10' + editable: true - kind: pypi name: cryptography version: 38.0.4 - url: https://files.pythonhosted.org/packages/a2/8f/6c52b1f9d650863e8f67edbe062c04f1c8455579eaace1593d8fe469319a/cryptography-38.0.4-cp36-abi3-manylinux_2_28_aarch64.whl - sha256: bfe6472507986613dc6cc00b3d492b2f7564b02b3b3682d25ca7f40fa3fd321b + url: https://files.pythonhosted.org/packages/26/f8/a81170a816679fca9ccd907b801992acfc03c33f952440421c921af2cc57/cryptography-38.0.4-cp36-abi3-manylinux_2_28_x86_64.whl + sha256: ce127dd0a6a0811c251a6cddd014d292728484e530d80e872ad9806cfb1c5b3c requires_dist: - cffi>=1.12 - sphinx!=1.8.0,!=3.1.0,!=3.1.1,>=1.6.5 ; extra == 'docs' @@ -17376,8 +17425,8 @@ packages: - kind: pypi name: cryptography version: 38.0.4 - url: https://files.pythonhosted.org/packages/c0/eb/f52b165db2abd662cda0a76efb7579a291fed1a7979cf41146cdc19e0d7a/cryptography-38.0.4-cp36-abi3-win_amd64.whl - sha256: 8e45653fb97eb2f20b8c96f9cd2b3a0654d742b47d638cf2897afbd97f80fa6d + url: https://files.pythonhosted.org/packages/75/7a/2ea7dd2202638cf1053aaa8fbbaddded0b78c78832b3d03cafa0416a6c84/cryptography-38.0.4-cp36-abi3-macosx_10_10_universal2.whl + sha256: 2fa36a7b2cc0998a3a4d5af26ccb6273f3df133d61da2ba13b3286261e7efb70 requires_dist: - cffi>=1.12 - sphinx!=1.8.0,!=3.1.0,!=3.1.1,>=1.6.5 ; extra == 'docs' @@ -17404,8 +17453,8 @@ packages: - kind: pypi name: cryptography version: 38.0.4 - url: https://files.pythonhosted.org/packages/75/7a/2ea7dd2202638cf1053aaa8fbbaddded0b78c78832b3d03cafa0416a6c84/cryptography-38.0.4-cp36-abi3-macosx_10_10_universal2.whl - sha256: 2fa36a7b2cc0998a3a4d5af26ccb6273f3df133d61da2ba13b3286261e7efb70 + url: https://files.pythonhosted.org/packages/a2/8f/6c52b1f9d650863e8f67edbe062c04f1c8455579eaace1593d8fe469319a/cryptography-38.0.4-cp36-abi3-manylinux_2_28_aarch64.whl + sha256: bfe6472507986613dc6cc00b3d492b2f7564b02b3b3682d25ca7f40fa3fd321b requires_dist: - cffi>=1.12 - sphinx!=1.8.0,!=3.1.0,!=3.1.1,>=1.6.5 ; extra == 'docs' @@ -17432,8 +17481,8 @@ packages: - kind: pypi name: cryptography version: 38.0.4 - url: https://files.pythonhosted.org/packages/26/f8/a81170a816679fca9ccd907b801992acfc03c33f952440421c921af2cc57/cryptography-38.0.4-cp36-abi3-manylinux_2_28_x86_64.whl - sha256: ce127dd0a6a0811c251a6cddd014d292728484e530d80e872ad9806cfb1c5b3c + url: https://files.pythonhosted.org/packages/c0/eb/f52b165db2abd662cda0a76efb7579a291fed1a7979cf41146cdc19e0d7a/cryptography-38.0.4-cp36-abi3-win_amd64.whl + sha256: 8e45653fb97eb2f20b8c96f9cd2b3a0654d742b47d638cf2897afbd97f80fa6d requires_dist: - cffi>=1.12 - sphinx!=1.8.0,!=3.1.0,!=3.1.1,>=1.6.5 ; extra == 'docs' @@ -17633,12 +17682,6 @@ packages: purls: [] size: 618596 timestamp: 1640112124844 -- kind: pypi - name: debugpy - version: 1.8.2 - url: https://files.pythonhosted.org/packages/b4/32/dd0707c8557f99496811763c5333ea87bcec1eb233c1efa324c9a8082bff/debugpy-1.8.2-py2.py3-none-any.whl - sha256: 16e16df3a98a35c63c3ab1e4d19be4cbc7fdda92d9ddc059294f18910928e0ca - requires_python: '>=3.8' - kind: pypi name: debugpy version: 1.8.2 @@ -17657,6 +17700,12 @@ packages: url: https://files.pythonhosted.org/packages/4f/d6/04ae52227ab7c1d43b729d5ae75ebd592df56c55d4e4dfa30ba173096b0f/debugpy-1.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl sha256: acdf39855f65c48ac9667b2801234fc64d46778021efac2de7e50907ab90c634 requires_python: '>=3.8' +- kind: pypi + name: debugpy + version: 1.8.2 + url: https://files.pythonhosted.org/packages/b4/32/dd0707c8557f99496811763c5333ea87bcec1eb233c1efa324c9a8082bff/debugpy-1.8.2-py2.py3-none-any.whl + sha256: 16e16df3a98a35c63c3ab1e4d19be4cbc7fdda92d9ddc059294f18910928e0ca + requires_python: '>=3.8' - kind: pypi name: decorator version: 5.1.1 @@ -17704,6 +17753,34 @@ packages: - torch==2.2.2 - transformers editable: true +- kind: pypi + name: detect-and-track-objects + version: 0.1.0 + path: examples/python/detect_and_track_objects + sha256: 2c2d3d8b61d6a0bf44051fd7052e3087fd4762b9c434586078ea3d179940cba1 + requires_dist: + - numpy + - opencv-contrib-python>4.6 + - pillow + - requests>=2.31,<3 + - rerun-sdk + - timm==0.9.11 + - torch==2.2.2 + - transformers + editable: true +- kind: pypi + name: dicom-mri + version: 0.1.0 + path: examples/python/dicom_mri + sha256: 98cb91dc5758ae59e3cd0fb797f86f40fcf627f63e659365806f59feed4618d8 + requires_dist: + - dicom-numpy==0.6.2 + - numpy + - pydicom==2.3.0 + - requests>=2.31,<3 + - rerun-sdk + - types-requests>=2.31,<3 + editable: true - kind: pypi name: dicom-mri version: 0.1.0 @@ -17823,6 +17900,16 @@ packages: - rerun-sdk - scipy editable: true +- kind: pypi + name: dna + version: 0.1.0 + path: examples/python/dna + sha256: 15dd8b0ce0ee55262916ea9bc8fb93c72c2012cb01a78e6d24a526d92537eab4 + requires_dist: + - numpy + - rerun-sdk + - scipy + editable: true - kind: conda name: double-conversion version: 3.3.0 @@ -17957,6 +18044,18 @@ packages: - rerun-sdk - tqdm editable: true +- kind: pypi + name: drone-lidar + version: 0.1.0 + path: examples/python/drone_lidar + sha256: 4de8d4135d07f9b0389eeb8a3616a5a9941a868b4d876cc91d8b5351c3b8984d + requires_dist: + - laspy + - numpy + - requests + - rerun-sdk + - tqdm + editable: true - kind: conda name: exceptiongroup version: 1.2.2 @@ -18079,6 +18178,21 @@ packages: - tqdm requires_python: <3.12 editable: true +- kind: pypi + name: face-tracking + version: 0.1.0 + path: examples/python/face_tracking + sha256: b8725fe4d36c11aad2c6c936ba2b57c7f65a856aa179badca5d041db63119d55 + requires_dist: + - mediapipe==0.10.11 ; sys_platform != 'darwin' + - mediapipe==0.10.9 ; sys_platform == 'darwin' + - numpy + - opencv-python>4.6 + - requests + - rerun-sdk + - tqdm + requires_python: <3.12 + editable: true - kind: pypi name: fastjsonschema version: 2.20.0 @@ -18433,6 +18547,15 @@ packages: - six - termcolor - enum34 ; python_version < '3.4' +- kind: pypi + name: fire + version: 0.6.0 + url: https://files.pythonhosted.org/packages/1b/1b/84c63f592ecdfbb3d77d22a8d93c9b92791e4fa35677ad71a7d6449100f8/fire-0.6.0.tar.gz + sha256: 54ec5b996ecdd3c0309c800324a0703d6da512241bc73b553db959d98de0aa66 + requires_dist: + - six + - termcolor + - enum34 ; python_version < '3.4' - kind: pypi name: flatbuffers version: 24.3.25 @@ -18705,8 +18828,8 @@ packages: - kind: pypi name: fonttools version: 4.53.1 - url: https://files.pythonhosted.org/packages/e1/67/fff766817e17d67208f8a1e72de15066149485acb5e4ff0816b11fd5fca3/fonttools-4.53.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: c6e7170d675d12eac12ad1a981d90f118c06cf680b42a2d74c6c931e54b50719 + url: https://files.pythonhosted.org/packages/8b/6a/206391c869ab22d1374e2575cad7cab36b93b9e3d37f48f4696eed2c6e9e/fonttools-4.53.1-cp311-cp311-macosx_10_9_universal2.whl + sha256: da33440b1413bad53a8674393c5d29ce64d8c1a15ef8a77c642ffd900d07bfe1 requires_dist: - fs<3,>=2.2.0 ; extra == 'all' - lxml>=4.0 ; extra == 'all' @@ -18742,8 +18865,8 @@ packages: - kind: pypi name: fonttools version: 4.53.1 - url: https://files.pythonhosted.org/packages/c8/e1/059700c154bd7170d1c37061239836d2e51ff608f47075450f06dd3c292a/fonttools-4.53.1-cp311-cp311-win_amd64.whl - sha256: d4d0096cb1ac7a77b3b41cd78c9b6bc4a400550e21dc7a92f2b5ab53ed74eb02 + url: https://files.pythonhosted.org/packages/a4/22/0a0ad59d9367997fd74a00ad2e88d10559122e09f105e94d34c155aecc0a/fonttools-4.53.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: bee32ea8765e859670c4447b0817514ca79054463b6b79784b08a8df3a4d78e3 requires_dist: - fs<3,>=2.2.0 ; extra == 'all' - lxml>=4.0 ; extra == 'all' @@ -18779,8 +18902,8 @@ packages: - kind: pypi name: fonttools version: 4.53.1 - url: https://files.pythonhosted.org/packages/8b/6a/206391c869ab22d1374e2575cad7cab36b93b9e3d37f48f4696eed2c6e9e/fonttools-4.53.1-cp311-cp311-macosx_10_9_universal2.whl - sha256: da33440b1413bad53a8674393c5d29ce64d8c1a15ef8a77c642ffd900d07bfe1 + url: https://files.pythonhosted.org/packages/c8/e1/059700c154bd7170d1c37061239836d2e51ff608f47075450f06dd3c292a/fonttools-4.53.1-cp311-cp311-win_amd64.whl + sha256: d4d0096cb1ac7a77b3b41cd78c9b6bc4a400550e21dc7a92f2b5ab53ed74eb02 requires_dist: - fs<3,>=2.2.0 ; extra == 'all' - lxml>=4.0 ; extra == 'all' @@ -18816,8 +18939,8 @@ packages: - kind: pypi name: fonttools version: 4.53.1 - url: https://files.pythonhosted.org/packages/a4/22/0a0ad59d9367997fd74a00ad2e88d10559122e09f105e94d34c155aecc0a/fonttools-4.53.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: bee32ea8765e859670c4447b0817514ca79054463b6b79784b08a8df3a4d78e3 + url: https://files.pythonhosted.org/packages/e1/67/fff766817e17d67208f8a1e72de15066149485acb5e4ff0816b11fd5fca3/fonttools-4.53.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: c6e7170d675d12eac12ad1a981d90f118c06cf680b42a2d74c6c931e54b50719 requires_dist: - fs<3,>=2.2.0 ; extra == 'all' - lxml>=4.0 ; extra == 'all' @@ -19047,26 +19170,26 @@ packages: - kind: pypi name: freetype-py version: 2.4.0 - url: https://files.pythonhosted.org/packages/85/45/f0200e64029aa0474ba4dc3e325d32c023c6607d6d8e5bc278aa27c570d3/freetype_py-2.4.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: c9a3abc277f5f6d21575c0093c0c6139c161bf05b91aa6258505ab27c5001c5e + url: https://files.pythonhosted.org/packages/5f/34/76cfe866e482745ea8c9956b0be6198fd72d08d2be77b71596afdb8cd89f/freetype_py-2.4.0-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl + sha256: ce931f581d5038c4fea1f3d314254e0264e92441a5fdaef6817fe77b7bb888d3 requires_python: '>=3.7' - kind: pypi name: freetype-py version: 2.4.0 - url: https://files.pythonhosted.org/packages/b4/f5/4b8bb492464247236bd3dabd7734b3ea49adc63cf2e53160e830ebccb39d/freetype_py-2.4.0-py3-none-win_amd64.whl - sha256: a2620788d4f0c00bd75fee2dfca61635ab0da856131598c96e2355d5257f70e5 + url: https://files.pythonhosted.org/packages/7c/77/faec42d1ffac2b970f606860a5bb083d606f1c673a5c57ab26382c8efec1/freetype_py-2.4.0-py3-none-macosx_10_9_universal2.whl + sha256: 3e0f5a91bc812f42d98a92137e86bac4ed037a29e43dafdb76d716d5732189e8 requires_python: '>=3.7' - kind: pypi name: freetype-py version: 2.4.0 - url: https://files.pythonhosted.org/packages/7c/77/faec42d1ffac2b970f606860a5bb083d606f1c673a5c57ab26382c8efec1/freetype_py-2.4.0-py3-none-macosx_10_9_universal2.whl - sha256: 3e0f5a91bc812f42d98a92137e86bac4ed037a29e43dafdb76d716d5732189e8 + url: https://files.pythonhosted.org/packages/85/45/f0200e64029aa0474ba4dc3e325d32c023c6607d6d8e5bc278aa27c570d3/freetype_py-2.4.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: c9a3abc277f5f6d21575c0093c0c6139c161bf05b91aa6258505ab27c5001c5e requires_python: '>=3.7' - kind: pypi name: freetype-py version: 2.4.0 - url: https://files.pythonhosted.org/packages/5f/34/76cfe866e482745ea8c9956b0be6198fd72d08d2be77b71596afdb8cd89f/freetype_py-2.4.0-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl - sha256: ce931f581d5038c4fea1f3d314254e0264e92441a5fdaef6817fe77b7bb888d3 + url: https://files.pythonhosted.org/packages/b4/f5/4b8bb492464247236bd3dabd7734b3ea49adc63cf2e53160e830ebccb39d/freetype_py-2.4.0-py3-none-win_amd64.whl + sha256: a2620788d4f0c00bd75fee2dfca61635ab0da856131598c96e2355d5257f70e5 requires_python: '>=3.7' - kind: conda name: fribidi @@ -19448,6 +19571,21 @@ packages: - tqdm requires_python: <3.12 editable: true +- kind: pypi + name: gesture-detection + version: 0.1.0 + path: examples/python/gesture_detection + sha256: 36dfc4cc822ee47f7aa29ba951bab8a94e96b9fd737daa324a441e6962a620bd + requires_dist: + - mediapipe==0.10.11 ; sys_platform != 'darwin' + - mediapipe==0.10.9 ; sys_platform == 'darwin' + - numpy + - opencv-python>4.9 + - requests>=2.31,<3 + - rerun-sdk + - tqdm + requires_python: <3.12 + editable: true - kind: conda name: gettext version: 0.22.5 @@ -20011,40 +20149,40 @@ packages: - kind: pypi name: google-crc32c version: 1.5.0 - url: https://files.pythonhosted.org/packages/fc/76/3ef124b893aa280e45e95d2346160f1d1d5c0ffc89d3f6e446c83116fb91/google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 7c42c70cd1d362284289c6273adda4c6af8039a8ae12dc451dcd61cdabb8ab57 + url: https://files.pythonhosted.org/packages/41/3f/8141b03ad127fc569c3efda2bfe31d64665e02e2b8b7fbf7b25ea914c27a/google_crc32c-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 1034d91442ead5a95b5aaef90dbfaca8633b0247d1e41621d1e9f9db88c36298 requires_dist: - pytest ; extra == 'testing' requires_python: '>=3.7' - kind: pypi name: google-crc32c version: 1.5.0 - url: https://files.pythonhosted.org/packages/41/3f/8141b03ad127fc569c3efda2bfe31d64665e02e2b8b7fbf7b25ea914c27a/google_crc32c-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 1034d91442ead5a95b5aaef90dbfaca8633b0247d1e41621d1e9f9db88c36298 + url: https://files.pythonhosted.org/packages/69/0f/7f89ae2b22c55273110a44a7ed55a2948bc213fb58983093fbefcdfd2d13/google_crc32c-1.5.0-cp311-cp311-macosx_10_9_universal2.whl + sha256: cae0274952c079886567f3f4f685bcaf5708f0a23a5f5216fdab71f81a6c0273 requires_dist: - pytest ; extra == 'testing' requires_python: '>=3.7' - kind: pypi name: google-crc32c version: 1.5.0 - url: https://files.pythonhosted.org/packages/ce/8b/02bf4765c487901c8660290ade9929d65a6151c367ba32e75d136ef2d0eb/google_crc32c-1.5.0-cp311-cp311-win_amd64.whl - sha256: ba1eb1843304b1e5537e1fca632fa894d6f6deca8d6389636ee5b4797affb968 + url: https://files.pythonhosted.org/packages/72/92/2a2fa23db7d0b0382accbdf09768c28f7c07fc8c354cdcf2f44a47f4314e/google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 77e2fd3057c9d78e225fa0a2160f96b64a824de17840351b26825b0848022906 requires_dist: - pytest ; extra == 'testing' requires_python: '>=3.7' - kind: pypi name: google-crc32c version: 1.5.0 - url: https://files.pythonhosted.org/packages/69/0f/7f89ae2b22c55273110a44a7ed55a2948bc213fb58983093fbefcdfd2d13/google_crc32c-1.5.0-cp311-cp311-macosx_10_9_universal2.whl - sha256: cae0274952c079886567f3f4f685bcaf5708f0a23a5f5216fdab71f81a6c0273 + url: https://files.pythonhosted.org/packages/ce/8b/02bf4765c487901c8660290ade9929d65a6151c367ba32e75d136ef2d0eb/google_crc32c-1.5.0-cp311-cp311-win_amd64.whl + sha256: ba1eb1843304b1e5537e1fca632fa894d6f6deca8d6389636ee5b4797affb968 requires_dist: - pytest ; extra == 'testing' requires_python: '>=3.7' - kind: pypi name: google-crc32c version: 1.5.0 - url: https://files.pythonhosted.org/packages/72/92/2a2fa23db7d0b0382accbdf09768c28f7c07fc8c354cdcf2f44a47f4314e/google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 77e2fd3057c9d78e225fa0a2160f96b64a824de17840351b26825b0848022906 + url: https://files.pythonhosted.org/packages/fc/76/3ef124b893aa280e45e95d2346160f1d1d5c0ffc89d3f6e446c83116fb91/google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 7c42c70cd1d362284289c6273adda4c6af8039a8ae12dc451dcd61cdabb8ab57 requires_dist: - pytest ; extra == 'testing' requires_python: '>=3.7' @@ -20162,6 +20300,16 @@ packages: - multidict - protobuf>=3.20.0 ; extra == 'protobuf' requires_python: '>=3.7' +- kind: pypi + name: grpclib + version: 0.4.7 + url: https://files.pythonhosted.org/packages/79/b9/55936e462a5925190d7427e880b3033601d1effd13809b483d13a926061a/grpclib-0.4.7.tar.gz + sha256: 2988ef57c02b22b7a2e8e961792c41ccf97efc2ace91ae7a5b0de03c363823c3 + requires_dist: + - h2<5,>=3.1.0 + - multidict + - protobuf>=3.20.0 ; extra == 'protobuf' + requires_python: '>=3.7' - kind: conda name: gxx version: 12.4.0 @@ -20941,6 +21089,20 @@ packages: - rerun-sdk requires_python: <3.12 editable: true +- kind: pypi + name: human-pose-tracking + version: 0.1.0 + path: examples/python/human_pose_tracking + sha256: 8a80b67528d3f6d0c82671dc5c36cf551faa4b879f4434f0d386d8ef85666e86 + requires_dist: + - mediapipe==0.10.11 ; sys_platform != 'darwin' + - mediapipe==0.10.9 ; sys_platform == 'darwin' + - numpy + - opencv-python>4.6 + - requests>=2.31,<3 + - rerun-sdk + requires_python: <3.12 + editable: true - kind: pypi name: humanize version: 4.10.0 @@ -21354,6 +21516,15 @@ packages: - numpy - rerun-sdk editable: true +- kind: pypi + name: incremental-logging + version: 0.1.0 + path: examples/python/incremental_logging + sha256: c1efe33868c31fe5a07ab5f6e60d28f856735a9e0b221ff96abd2e711d60e894 + requires_dist: + - numpy + - rerun-sdk + editable: true - kind: conda name: iniconfig version: 2.0.0 @@ -21681,8 +21852,8 @@ packages: - kind: pypi name: jaxlib version: 0.4.30 - url: https://files.pythonhosted.org/packages/bb/1a/8f45ea28a5ca67e4d23ebd70fc78ea94be6fa20323f983c7607c32c6f9a5/jaxlib-0.4.30-cp311-cp311-win_amd64.whl - sha256: 3a2e2c11c179f8851a72249ba1ae40ae817dfaee9877d23b3b8f7c6b7a012f76 + url: https://files.pythonhosted.org/packages/a6/a3/951da3d1487b2f8995a2a14cc7e9496c9a7c93aa1f1d0b33e833e24dee92/jaxlib-0.4.30-cp311-cp311-manylinux2014_x86_64.whl + sha256: 16b2ab18ea90d2e15941bcf45de37afc2f289a029129c88c8d7aba0404dd0043 requires_dist: - scipy>=1.9 - numpy>=1.22 @@ -21692,8 +21863,8 @@ packages: - kind: pypi name: jaxlib version: 0.4.30 - url: https://files.pythonhosted.org/packages/a6/a3/951da3d1487b2f8995a2a14cc7e9496c9a7c93aa1f1d0b33e833e24dee92/jaxlib-0.4.30-cp311-cp311-manylinux2014_x86_64.whl - sha256: 16b2ab18ea90d2e15941bcf45de37afc2f289a029129c88c8d7aba0404dd0043 + url: https://files.pythonhosted.org/packages/bb/1a/8f45ea28a5ca67e4d23ebd70fc78ea94be6fa20323f983c7607c32c6f9a5/jaxlib-0.4.30-cp311-cp311-win_amd64.whl + sha256: 3a2e2c11c179f8851a72249ba1ae40ae817dfaee9877d23b3b8f7c6b7a012f76 requires_dist: - scipy>=1.9 - numpy>=1.22 @@ -22334,8 +22505,8 @@ packages: - kind: pypi name: kiwisolver version: 1.4.5 - url: https://files.pythonhosted.org/packages/8d/26/b4569d1f29751fca22ee915b4ebfef5974f4ef239b3335fc072882bd62d9/kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437 + url: https://files.pythonhosted.org/packages/17/ba/17a706b232308e65f57deeccae503c268292e6a091313f6ce833a23093ea/kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e requires_dist: - typing-extensions ; python_version < '3.8' requires_python: '>=3.7' @@ -22350,24 +22521,24 @@ packages: - kind: pypi name: kiwisolver version: 1.4.5 - url: https://files.pythonhosted.org/packages/a6/94/695922e71288855fc7cace3bdb52edda9d7e50edba77abb0c9d7abb51e96/kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90 + url: https://files.pythonhosted.org/packages/4a/fe/23d7fa78f7c66086d196406beb1fb2eaf629dd7adc01c3453033303d17fa/kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl + sha256: fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797 requires_dist: - typing-extensions ; python_version < '3.8' requires_python: '>=3.7' - kind: pypi name: kiwisolver version: 1.4.5 - url: https://files.pythonhosted.org/packages/17/ba/17a706b232308e65f57deeccae503c268292e6a091313f6ce833a23093ea/kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e + url: https://files.pythonhosted.org/packages/8d/26/b4569d1f29751fca22ee915b4ebfef5974f4ef239b3335fc072882bd62d9/kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437 requires_dist: - typing-extensions ; python_version < '3.8' requires_python: '>=3.7' - kind: pypi name: kiwisolver version: 1.4.5 - url: https://files.pythonhosted.org/packages/4a/fe/23d7fa78f7c66086d196406beb1fb2eaf629dd7adc01c3453033303d17fa/kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl - sha256: fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797 + url: https://files.pythonhosted.org/packages/a6/94/695922e71288855fc7cace3bdb52edda9d7e50edba77abb0c9d7abb51e96/kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90 requires_dist: - typing-extensions ; python_version < '3.8' requires_python: '>=3.7' @@ -22548,6 +22719,27 @@ packages: - pyproj ; extra == 'pyproj' - requests ; extra == 'requests' requires_python: '>=3.7' +- kind: pypi + name: laspy + version: 2.4.1 + url: https://files.pythonhosted.org/packages/7a/68/c864ea8e55c1fc3f1259375a0a31c60a06618cda4e14572c7d0e0aada6c2/laspy-2.4.1.tar.gz + sha256: 13caecc7325cb2242cb25394984d21b3b5f796c88bcb44bc2ed2d3cf1b972ac4 + requires_dist: + - numpy + - pytest ; extra == 'dev' + - coverage ; extra == 'dev' + - sphinx ; extra == 'dev' + - sphinx-rtd-theme ; extra == 'dev' + - nox ; extra == 'dev' + - black==22.3.0 ; extra == 'dev' + - pytest-benchmark ; extra == 'dev' + - m2r2 ; extra == 'dev' + - rangehttpserver ; extra == 'dev' + - laszip<0.3.0,>=0.2.1 ; extra == 'laszip' + - lazrs<0.6.0,>=0.5.0 ; extra == 'lazrs' + - pyproj ; extra == 'pyproj' + - requests ; extra == 'requests' + requires_python: '>=3.7' - kind: pypi name: lazy-loader version: '0.4' @@ -31918,6 +32110,18 @@ packages: - requests - rerun-sdk editable: true +- kind: pypi + name: lidar + version: 0.1.0 + path: examples/python/lidar + sha256: 10fe6d7b3a80959f913aada12c01bfecd6cd9854beaf6a8843a7ecd2215cd4bd + requires_dist: + - matplotlib + - numpy + - nuscenes-devkit + - requests + - rerun-sdk + editable: true - kind: pypi name: live-camera-edge-detection version: 0.1.0 @@ -31927,6 +32131,24 @@ packages: - opencv-python - rerun-sdk editable: true +- kind: pypi + name: live-camera-edge-detection + version: 0.1.0 + path: examples/python/live_camera_edge_detection + sha256: f1edef43efce87f55726e3b5d6a2f813667968f8e8185873a74b9dc61c0f040f + requires_dist: + - opencv-python + - rerun-sdk + editable: true +- kind: pypi + name: live-scrolling-plot + version: 0.1.0 + path: examples/python/live_scrolling_plot + sha256: 1debab1814169399bb2ed23af2cd97a4693e7a4d4ee55e74bcb8804bf421e8fc + requires_dist: + - numpy + - rerun-sdk + editable: true - kind: pypi name: live-scrolling-plot version: 0.1.0 @@ -31948,6 +32170,18 @@ packages: - umap-learn requires_python: <3.12 editable: true +- kind: pypi + name: llm-embedding-ner + version: 0.1.0 + path: examples/python/llm_embedding_ner + sha256: 6f5925cbe333d529421ef9a5114f85317bdd8b4200c1e9ff6798dff5e3a7f16f + requires_dist: + - rerun-sdk + - torch + - transformers + - umap-learn + requires_python: <3.12 + editable: true - kind: conda name: llvm-openmp version: 18.1.8 @@ -32030,12 +32264,6 @@ packages: purls: [] size: 22221159 timestamp: 1701379965425 -- kind: pypi - name: llvmlite - version: 0.43.0 - url: https://files.pythonhosted.org/packages/2f/b2/4429433eb2dc8379e2cb582502dca074c23837f8fd009907f78a24de4c25/llvmlite-0.43.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: c1da416ab53e4f7f3bc8d4eeba36d801cc1894b9fbfbf2022b29b6bad34a7df2 - requires_python: '>=3.9' - kind: pypi name: llvmlite version: 0.43.0 @@ -32045,8 +32273,8 @@ packages: - kind: pypi name: llvmlite version: 0.43.0 - url: https://files.pythonhosted.org/packages/95/8c/de3276d773ab6ce3ad676df5fab5aac19696b2956319d65d7dd88fb10f19/llvmlite-0.43.0-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 3e8d0618cb9bfe40ac38a9633f2493d4d4e9fcc2f438d39a4e854f39cc0f5f98 + url: https://files.pythonhosted.org/packages/2f/b2/4429433eb2dc8379e2cb582502dca074c23837f8fd009907f78a24de4c25/llvmlite-0.43.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: c1da416ab53e4f7f3bc8d4eeba36d801cc1894b9fbfbf2022b29b6bad34a7df2 requires_python: '>=3.9' - kind: pypi name: llvmlite @@ -32054,6 +32282,12 @@ packages: url: https://files.pythonhosted.org/packages/6b/99/5d00a7d671b1ba1751fc9f19d3b36f3300774c6eebe2bcdb5f6191763eb4/llvmlite-0.43.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl sha256: 977525a1e5f4059316b183fb4fd34fa858c9eade31f165427a3977c95e3ee749 requires_python: '>=3.9' +- kind: pypi + name: llvmlite + version: 0.43.0 + url: https://files.pythonhosted.org/packages/95/8c/de3276d773ab6ce3ad676df5fab5aac19696b2956319d65d7dd88fb10f19/llvmlite-0.43.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 3e8d0618cb9bfe40ac38a9633f2493d4d4e9fcc2f438d39a4e854f39cc0f5f98 + requires_python: '>=3.9' - kind: pypi name: llvmlite version: 0.43.0 @@ -32068,11 +32302,19 @@ packages: requires_dist: - rerun-sdk editable: true +- kind: pypi + name: log-file + version: 0.1.0 + path: examples/python/log_file + sha256: fb6af8faeaac3e8d16da4ab40e26a73dd0e63483f34aa36298c32f7e39324fd3 + requires_dist: + - rerun-sdk + editable: true - kind: pypi name: lxml version: 5.2.2 - url: https://files.pythonhosted.org/packages/4e/56/c35969591789763657eb16c2fa79c924823b97da5536da8b89e11582da89/lxml-5.2.2-cp311-cp311-manylinux_2_28_aarch64.whl - sha256: 2eb2227ce1ff998faf0cd7fe85bbf086aa41dfc5af3b1d80867ecfe75fb68df3 + url: https://files.pythonhosted.org/packages/04/19/d6aa2d980f220a04c91d4de538d2fea1a65535e7b0a4aec0998ce46e3667/lxml-5.2.2-cp311-cp311-win_amd64.whl + sha256: 49095a38eb333aaf44c06052fd2ec3b8f23e19747ca7ec6f6c954ffea6dbf7be requires_dist: - cssselect>=0.7 ; extra == 'cssselect' - html5lib ; extra == 'html5' @@ -32083,8 +32325,8 @@ packages: - kind: pypi name: lxml version: 5.2.2 - url: https://files.pythonhosted.org/packages/04/19/d6aa2d980f220a04c91d4de538d2fea1a65535e7b0a4aec0998ce46e3667/lxml-5.2.2-cp311-cp311-win_amd64.whl - sha256: 49095a38eb333aaf44c06052fd2ec3b8f23e19747ca7ec6f6c954ffea6dbf7be + url: https://files.pythonhosted.org/packages/4e/42/3bfe92749715c819763d2205370ecc7f586b44e277f38839e27cce7d6bb8/lxml-5.2.2-cp311-cp311-macosx_10_9_x86_64.whl + sha256: b0b3f2df149efb242cee2ffdeb6674b7f30d23c9a7af26595099afaf46ef4e88 requires_dist: - cssselect>=0.7 ; extra == 'cssselect' - html5lib ; extra == 'html5' @@ -32095,8 +32337,8 @@ packages: - kind: pypi name: lxml version: 5.2.2 - url: https://files.pythonhosted.org/packages/4e/42/3bfe92749715c819763d2205370ecc7f586b44e277f38839e27cce7d6bb8/lxml-5.2.2-cp311-cp311-macosx_10_9_x86_64.whl - sha256: b0b3f2df149efb242cee2ffdeb6674b7f30d23c9a7af26595099afaf46ef4e88 + url: https://files.pythonhosted.org/packages/4e/56/c35969591789763657eb16c2fa79c924823b97da5536da8b89e11582da89/lxml-5.2.2-cp311-cp311-manylinux_2_28_aarch64.whl + sha256: 2eb2227ce1ff998faf0cd7fe85bbf086aa41dfc5af3b1d80867ecfe75fb68df3 requires_dist: - cssselect>=0.7 ; extra == 'cssselect' - html5lib ; extra == 'html5' @@ -32324,32 +32566,32 @@ packages: - kind: pypi name: markupsafe version: 2.1.5 - url: https://files.pythonhosted.org/packages/1c/cf/35fe557e53709e93feb65575c93927942087e9b97213eabc3fe9d5b25a55/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced + url: https://files.pythonhosted.org/packages/11/e7/291e55127bb2ae67c64d66cef01432b5933859dfb7d6949daa721b89d0b3/MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl + sha256: 629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f requires_python: '>=3.7' - kind: pypi name: markupsafe version: 2.1.5 - url: https://files.pythonhosted.org/packages/97/18/c30da5e7a0e7f4603abfc6780574131221d9148f323752c2755d48abad30/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5 + url: https://files.pythonhosted.org/packages/1c/cf/35fe557e53709e93feb65575c93927942087e9b97213eabc3fe9d5b25a55/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced requires_python: '>=3.7' - kind: pypi name: markupsafe version: 2.1.5 - url: https://files.pythonhosted.org/packages/b7/a2/c78a06a9ec6d04b3445a949615c4c7ed86a0b2eb68e44e7541b9d57067cc/MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl - sha256: 2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617 + url: https://files.pythonhosted.org/packages/6b/cb/aed7a284c00dfa7c0682d14df85ad4955a350a21d2e3b06d8240497359bf/MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2 requires_python: '>=3.7' - kind: pypi name: markupsafe version: 2.1.5 - url: https://files.pythonhosted.org/packages/6b/cb/aed7a284c00dfa7c0682d14df85ad4955a350a21d2e3b06d8240497359bf/MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2 + url: https://files.pythonhosted.org/packages/97/18/c30da5e7a0e7f4603abfc6780574131221d9148f323752c2755d48abad30/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5 requires_python: '>=3.7' - kind: pypi name: markupsafe version: 2.1.5 - url: https://files.pythonhosted.org/packages/11/e7/291e55127bb2ae67c64d66cef01432b5933859dfb7d6949daa721b89d0b3/MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl - sha256: 629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f + url: https://files.pythonhosted.org/packages/b7/a2/c78a06a9ec6d04b3445a949615c4c7ed86a0b2eb68e44e7541b9d57067cc/MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl + sha256: 2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617 requires_python: '>=3.7' - kind: conda name: markupsafe @@ -32474,8 +32716,8 @@ packages: - kind: pypi name: matplotlib version: 3.9.1.post1 - url: https://files.pythonhosted.org/packages/c3/2b/1c9e695967edb54f0cfb1ea5d41f5482344cf245489f8a47aa427825f264/matplotlib-3.9.1.post1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 4b49fee26d64aefa9f061b575f0f7b5fc4663e51f87375c7239efa3d30d908fa + url: https://files.pythonhosted.org/packages/0a/d4/c0812c410de88e8646727a7c000741331875ae556018725ae169d206f0a2/matplotlib-3.9.1.post1-cp311-cp311-win_amd64.whl + sha256: c44edab5b849e0fc1f1c9d6e13eaa35ef65925f7be45be891d9784709ad95561 requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -32496,8 +32738,8 @@ packages: - kind: pypi name: matplotlib version: 3.9.1.post1 - url: https://files.pythonhosted.org/packages/a5/8b/90fae9c1b34ef3252003c26b15e8cb26b83701e34e5acf6430919c2c5c89/matplotlib-3.9.1.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 89eb7e89e2b57856533c5c98f018aa3254fa3789fcd86d5f80077b9034a54c9a + url: https://files.pythonhosted.org/packages/41/dc/1f51d34daebbfe172b78fa5b5be467554b973ef30b80ed2f6200b34d3223/matplotlib-3.9.1.post1-cp311-cp311-macosx_10_12_x86_64.whl + sha256: b08b46058fe2a31ecb81ef6aa3611f41d871f6a8280e9057cb4016cb3d8e894a requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -32518,8 +32760,8 @@ packages: - kind: pypi name: matplotlib version: 3.9.1.post1 - url: https://files.pythonhosted.org/packages/0a/d4/c0812c410de88e8646727a7c000741331875ae556018725ae169d206f0a2/matplotlib-3.9.1.post1-cp311-cp311-win_amd64.whl - sha256: c44edab5b849e0fc1f1c9d6e13eaa35ef65925f7be45be891d9784709ad95561 + url: https://files.pythonhosted.org/packages/43/ef/3fadf6545a0c609c7720477b2bfa2e578f99c106e3bd1aaf591e006c3434/matplotlib-3.9.1.post1-cp311-cp311-macosx_11_0_arm64.whl + sha256: 22b344e84fcc574f561b5731f89a7625db8ef80cdbb0026a8ea855a33e3429d1 requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -32540,8 +32782,8 @@ packages: - kind: pypi name: matplotlib version: 3.9.1.post1 - url: https://files.pythonhosted.org/packages/41/dc/1f51d34daebbfe172b78fa5b5be467554b973ef30b80ed2f6200b34d3223/matplotlib-3.9.1.post1-cp311-cp311-macosx_10_12_x86_64.whl - sha256: b08b46058fe2a31ecb81ef6aa3611f41d871f6a8280e9057cb4016cb3d8e894a + url: https://files.pythonhosted.org/packages/a5/8b/90fae9c1b34ef3252003c26b15e8cb26b83701e34e5acf6430919c2c5c89/matplotlib-3.9.1.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 89eb7e89e2b57856533c5c98f018aa3254fa3789fcd86d5f80077b9034a54c9a requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -32562,8 +32804,8 @@ packages: - kind: pypi name: matplotlib version: 3.9.1.post1 - url: https://files.pythonhosted.org/packages/43/ef/3fadf6545a0c609c7720477b2bfa2e578f99c106e3bd1aaf591e006c3434/matplotlib-3.9.1.post1-cp311-cp311-macosx_11_0_arm64.whl - sha256: 22b344e84fcc574f561b5731f89a7625db8ef80cdbb0026a8ea855a33e3429d1 + url: https://files.pythonhosted.org/packages/c3/2b/1c9e695967edb54f0cfb1ea5d41f5482344cf245489f8a47aa427825f264/matplotlib-3.9.1.post1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 4b49fee26d64aefa9f061b575f0f7b5fc4663e51f87375c7239efa3d30d908fa requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -32584,8 +32826,8 @@ packages: - kind: pypi name: matplotlib version: 3.9.2 - url: https://files.pythonhosted.org/packages/e6/9a/5991972a560db3ab621312a7ca5efec339ae2122f25901c0846865c4b72f/matplotlib-3.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: d719465db13267bcef19ea8954a971db03b9f48b4647e3860e4bc8e6ed86610f + url: https://files.pythonhosted.org/packages/01/75/6c7ce560e95714a10fcbb3367d1304975a1a3e620f72af28921b796403f3/matplotlib-3.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 8912ef7c2362f7193b5819d17dae8629b34a95c58603d781329712ada83f9447 requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -32606,8 +32848,8 @@ packages: - kind: pypi name: matplotlib version: 3.9.2 - url: https://files.pythonhosted.org/packages/8b/ce/15b0bb2fb29b3d46211d8ca740b96b5232499fc49200b58b8d571292c9a6/matplotlib-3.9.2-cp311-cp311-win_amd64.whl - sha256: ae82a14dab96fbfad7965403c643cafe6515e386de723e498cf3eeb1e0b70cc7 + url: https://files.pythonhosted.org/packages/28/ba/8be09886eb56ac04a218a1dc3fa728a5c4cac60b019b4f1687885166da00/matplotlib-3.9.2-cp311-cp311-macosx_11_0_arm64.whl + sha256: c797dac8bb9c7a3fd3382b16fe8f215b4cf0f22adccea36f1545a6d7be310b41 requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -32650,8 +32892,8 @@ packages: - kind: pypi name: matplotlib version: 3.9.2 - url: https://files.pythonhosted.org/packages/01/75/6c7ce560e95714a10fcbb3367d1304975a1a3e620f72af28921b796403f3/matplotlib-3.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 8912ef7c2362f7193b5819d17dae8629b34a95c58603d781329712ada83f9447 + url: https://files.pythonhosted.org/packages/8b/ce/15b0bb2fb29b3d46211d8ca740b96b5232499fc49200b58b8d571292c9a6/matplotlib-3.9.2-cp311-cp311-win_amd64.whl + sha256: ae82a14dab96fbfad7965403c643cafe6515e386de723e498cf3eeb1e0b70cc7 requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -32672,8 +32914,8 @@ packages: - kind: pypi name: matplotlib version: 3.9.2 - url: https://files.pythonhosted.org/packages/28/ba/8be09886eb56ac04a218a1dc3fa728a5c4cac60b019b4f1687885166da00/matplotlib-3.9.2-cp311-cp311-macosx_11_0_arm64.whl - sha256: c797dac8bb9c7a3fd3382b16fe8f215b4cf0f22adccea36f1545a6d7be310b41 + url: https://files.pythonhosted.org/packages/e6/9a/5991972a560db3ab621312a7ca5efec339ae2122f25901c0846865c4b72f/matplotlib-3.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: d719465db13267bcef19ea8954a971db03b9f48b4647e3860e4bc8e6ed86610f requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -32811,8 +33053,8 @@ packages: - kind: pypi name: mediapipe version: 0.10.9 - url: https://files.pythonhosted.org/packages/c1/71/38b16b1e4504ff92dff875d455c19e62125fccd73d5ce7e06b560f77fd26/mediapipe-0.10.9-cp311-cp311-macosx_11_0_x86_64.whl - sha256: b7dde54b82732479b9b856c9230b9f7b3da55b0913dde5254a7489e20c2e3c6e + url: https://files.pythonhosted.org/packages/a3/3a/f309c6bdebe596cc8c960542e167331cb01ef130ec38f3da46a499718889/mediapipe-0.10.9-cp311-cp311-macosx_11_0_universal2.whl + sha256: 8733735f582e6e6a05bf9b15c48b03a6387a0795793a2530aa1189eecfd33780 requires_dist: - absl-py - attrs>=19.1.0 @@ -32825,8 +33067,8 @@ packages: - kind: pypi name: mediapipe version: 0.10.9 - url: https://files.pythonhosted.org/packages/a3/3a/f309c6bdebe596cc8c960542e167331cb01ef130ec38f3da46a499718889/mediapipe-0.10.9-cp311-cp311-macosx_11_0_universal2.whl - sha256: 8733735f582e6e6a05bf9b15c48b03a6387a0795793a2530aa1189eecfd33780 + url: https://files.pythonhosted.org/packages/c1/71/38b16b1e4504ff92dff875d455c19e62125fccd73d5ce7e06b560f77fd26/mediapipe-0.10.9-cp311-cp311-macosx_11_0_x86_64.whl + sha256: b7dde54b82732479b9b856c9230b9f7b3da55b0913dde5254a7489e20c2e3c6e requires_dist: - absl-py - attrs>=19.1.0 @@ -32906,6 +33148,25 @@ packages: - scikit-image - scikit-learn requires_python: '>=3.5' +- kind: pypi + name: mesh-to-sdf + version: 0.0.15 + url: git+https://github.com/marian42/mesh_to_sdf.git@c9f26e6399f7fd8deb40c7fba02c7e74aca6c657 + requires_dist: + - pyopengl + - pyrender + - scikit-image + - scikit-learn + requires_python: '>=3.5' +- kind: pypi + name: minimal + version: 0.1.0 + path: examples/python/minimal + sha256: 871c1ec39ceb3af42679653369402d66672d4bb9850a727b27db05c16653c8dd + requires_dist: + - numpy + - rerun-sdk + editable: true - kind: pypi name: minimal version: 0.1.0 @@ -32924,6 +33185,15 @@ packages: - numpy - rerun-sdk editable: true +- kind: pypi + name: minimal-options + version: 0.1.0 + path: examples/python/minimal_options + sha256: 84d5a8787772da382454f2f3b44d54027a606bff043872dab559cc4604ac82f0 + requires_dist: + - numpy + - rerun-sdk + editable: true - kind: pypi name: mistune version: 3.0.2 @@ -32967,8 +33237,8 @@ packages: - kind: pypi name: ml-dtypes version: 0.4.0 - url: https://files.pythonhosted.org/packages/f0/36/290745178e5776f7416818abc1334c1b19afb93c7c87fd1bef3cc99f84ca/ml_dtypes-0.4.0-cp311-cp311-win_amd64.whl - sha256: 75b4faf99d0711b81f393db36d210b4255fd419f6f790bc6c1b461f95ffb7a9e + url: https://files.pythonhosted.org/packages/84/17/a936d3dfad84d028ba8539a93167274b7dcd7985e0d9df487e94a62f9428/ml_dtypes-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: e1e2f4237b459a63c97c2c9f449baa637d7e4c20addff6a9bac486f22432f3b6 requires_dist: - numpy>1.20 - numpy>=1.21.2 ; python_version >= '3.10' @@ -32983,8 +33253,8 @@ packages: - kind: pypi name: ml-dtypes version: 0.4.0 - url: https://files.pythonhosted.org/packages/84/17/a936d3dfad84d028ba8539a93167274b7dcd7985e0d9df487e94a62f9428/ml_dtypes-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: e1e2f4237b459a63c97c2c9f449baa637d7e4c20addff6a9bac486f22432f3b6 + url: https://files.pythonhosted.org/packages/f0/36/290745178e5776f7416818abc1334c1b19afb93c7c87fd1bef3cc99f84ca/ml_dtypes-0.4.0-cp311-cp311-win_amd64.whl + sha256: 75b4faf99d0711b81f393db36d210b4255fd419f6f790bc6c1b461f95ffb7a9e requires_dist: - numpy>1.20 - numpy>=1.21.2 ; python_version >= '3.10' @@ -33031,32 +33301,32 @@ packages: - kind: pypi name: multidict version: 6.0.5 - url: https://files.pythonhosted.org/packages/3f/e1/7fdd0f39565df3af87d6c2903fb66a7d529fbd0a8a066045d7a5b6ad1145/multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3 + url: https://files.pythonhosted.org/packages/02/c1/b15ecceb6ffa5081ed2ed450aea58d65b0e0358001f2b426705f9f41f4c2/multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl + sha256: 612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd requires_python: '>=3.7' - kind: pypi name: multidict version: 6.0.5 - url: https://files.pythonhosted.org/packages/52/ec/be54a3ad110f386d5bd7a9a42a4ff36b3cd723ebe597f41073a73ffa16b8/multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed + url: https://files.pythonhosted.org/packages/21/db/3403263f158b0bc7b0d4653766d71cb39498973f2042eead27b2e9758782/multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e requires_python: '>=3.7' - kind: pypi name: multidict version: 6.0.5 - url: https://files.pythonhosted.org/packages/88/aa/ea217cb18325aa05cb3e3111c19715f1e97c50a4a900cbc20e54648de5f5/multidict-6.0.5-cp311-cp311-win_amd64.whl - sha256: 2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea + url: https://files.pythonhosted.org/packages/3f/e1/7fdd0f39565df3af87d6c2903fb66a7d529fbd0a8a066045d7a5b6ad1145/multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3 requires_python: '>=3.7' - kind: pypi name: multidict version: 6.0.5 - url: https://files.pythonhosted.org/packages/21/db/3403263f158b0bc7b0d4653766d71cb39498973f2042eead27b2e9758782/multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e + url: https://files.pythonhosted.org/packages/52/ec/be54a3ad110f386d5bd7a9a42a4ff36b3cd723ebe597f41073a73ffa16b8/multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed requires_python: '>=3.7' - kind: pypi name: multidict version: 6.0.5 - url: https://files.pythonhosted.org/packages/02/c1/b15ecceb6ffa5081ed2ed450aea58d65b0e0358001f2b426705f9f41f4c2/multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl - sha256: 612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd + url: https://files.pythonhosted.org/packages/88/aa/ea217cb18325aa05cb3e3111c19715f1e97c50a4a900cbc20e54648de5f5/multidict-6.0.5-cp311-cp311-win_amd64.whl + sha256: 2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea requires_python: '>=3.7' - kind: conda name: multidict @@ -33158,6 +33428,14 @@ packages: requires_dist: - rerun-sdk editable: true +- kind: pypi + name: multiprocess-logging + version: 0.1.0 + path: examples/python/multiprocess_logging + sha256: 90ae836d45110662ac53e73a092a5298ab67d89873eed81d1773dba601a62eb2 + requires_dist: + - rerun-sdk + editable: true - kind: pypi name: multitasking version: 0.0.11 @@ -33172,6 +33450,15 @@ packages: - numpy - rerun-sdk editable: true +- kind: pypi + name: multithreading + version: 0.1.0 + path: examples/python/multithreading + sha256: 85b43cb06183386edd0a8820c0c9eb50398c197fd0da8ba5050f2cf2b24bc23e + requires_dist: + - numpy + - rerun-sdk + editable: true - kind: conda name: mypy version: 1.8.0 @@ -33382,89 +33669,6 @@ packages: purls: [] size: 1537884 timestamp: 1709910705541 -- kind: conda - name: nasm - version: 2.16.03 - build: h4bc722e_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/nasm-2.16.03-h4bc722e_1.conda - sha256: d01bfa655ad08d33dc5830a5166c7b664143df24fab59d41df15f076c58000b6 - md5: 35f8ab79609d5bc56d6d040f12dacf3a - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc-ng >=12 - license: BSD-2-Clause - license_family: BSD - purls: [] - size: 1221519 - timestamp: 1721652638250 -- kind: conda - name: nasm - version: 2.16.03 - build: h68df207_1 - build_number: 1 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/nasm-2.16.03-h68df207_1.conda - sha256: af354688ee0ab41bd6d538b5c12fc392825da0e9549d5b4256ec13704b177bbd - md5: 277a1d8aa07160de3d02302364fd4dde - depends: - - libgcc-ng >=12 - license: BSD-2-Clause - license_family: BSD - purls: [] - size: 1332204 - timestamp: 1721654126314 -- kind: conda - name: nasm - version: 2.16.03 - build: h99b78c6_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/nasm-2.16.03-h99b78c6_1.conda - sha256: a1d8b8f6be3ccf94d8f29920a61fa83e4a94da84e8f0bdec4a5937092d56e59d - md5: c306196adb43e1300e1470dd65694ec5 - depends: - - __osx >=11.0 - license: BSD-2-Clause - license_family: BSD - purls: [] - size: 385586 - timestamp: 1721652965778 -- kind: conda - name: nasm - version: 2.16.03 - build: hfd05255_1 - build_number: 1 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/nasm-2.16.03-hfd05255_1.conda - sha256: cce00ed17e684bf84c8cc592de578fedfb93b2d2357256c41c262b67ceacf6e7 - md5: ead716d50b01f09d327c781c05b25882 - depends: - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.40.33810 - license: BSD-2-Clause - license_family: BSD - purls: [] - size: 450395 - timestamp: 1721653214123 -- kind: conda - name: nasm - version: 2.16.03 - build: hfdf4475_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/nasm-2.16.03-hfdf4475_1.conda - sha256: 67e4730cee8b72abdcd587e3407dad7eb5fb97b07754c673cb20583d2e528ac0 - md5: aa906b48511f43e9496d9afb0660b7df - depends: - - __osx >=10.13 - license: BSD-2-Clause - license_family: BSD - purls: [] - size: 377182 - timestamp: 1721652783302 - kind: pypi name: nbclient version: 0.10.0 @@ -34028,8 +34232,8 @@ packages: - kind: pypi name: numba version: 0.60.0 - url: https://files.pythonhosted.org/packages/f9/4c/8889ac94c0b33dca80bed11564b8c6d9ea14d7f094e674c58e5c5b05859b/numba-0.60.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl - sha256: 5f4fde652ea604ea3c86508a3fb31556a6157b2c76c8b51b1d45eb40c8598703 + url: https://files.pythonhosted.org/packages/57/03/2b4245b05b71c0cee667e6a0b51606dfa7f4157c9093d71c6b208385a611/numba-0.60.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + sha256: 4142d7ac0210cc86432b818338a2bc368dc773a2f5cf1e32ff7c5b378bd63ee8 requires_dist: - llvmlite<0.44,>=0.43.0.dev0 - numpy<2.1,>=1.22 @@ -34055,8 +34259,8 @@ packages: - kind: pypi name: numba version: 0.60.0 - url: https://files.pythonhosted.org/packages/57/03/2b4245b05b71c0cee667e6a0b51606dfa7f4157c9093d71c6b208385a611/numba-0.60.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - sha256: 4142d7ac0210cc86432b818338a2bc368dc773a2f5cf1e32ff7c5b378bd63ee8 + url: https://files.pythonhosted.org/packages/9a/51/a4dc2c01ce7a850b8e56ff6d5381d047a5daea83d12bad08aa071d34b2ee/numba-0.60.0-cp311-cp311-macosx_11_0_arm64.whl + sha256: 3fb02b344a2a80efa6f677aa5c40cd5dd452e1b35f8d1c2af0dfd9ada9978e4b requires_dist: - llvmlite<0.44,>=0.43.0.dev0 - numpy<2.1,>=1.22 @@ -34064,8 +34268,8 @@ packages: - kind: pypi name: numba version: 0.60.0 - url: https://files.pythonhosted.org/packages/9a/51/a4dc2c01ce7a850b8e56ff6d5381d047a5daea83d12bad08aa071d34b2ee/numba-0.60.0-cp311-cp311-macosx_11_0_arm64.whl - sha256: 3fb02b344a2a80efa6f677aa5c40cd5dd452e1b35f8d1c2af0dfd9ada9978e4b + url: https://files.pythonhosted.org/packages/f9/4c/8889ac94c0b33dca80bed11564b8c6d9ea14d7f094e674c58e5c5b05859b/numba-0.60.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl + sha256: 5f4fde652ea604ea3c86508a3fb31556a6157b2c76c8b51b1d45eb40c8598703 requires_dist: - llvmlite<0.44,>=0.43.0.dev0 - numpy<2.1,>=1.22 @@ -34203,6 +34407,18 @@ packages: - requests - rerun-sdk editable: true +- kind: pypi + name: nuscenes-dataset + version: 0.1.0 + path: examples/python/nuscenes_dataset + sha256: 78903b7670fac2b4c27637efc9aa6f63b7b70502ce3d5f88e4353aef5607cf40 + requires_dist: + - matplotlib + - numpy + - nuscenes-devkit + - requests + - rerun-sdk + editable: true - kind: pypi name: nuscenes-devkit version: 1.1.9 @@ -34234,6 +34450,16 @@ packages: - opencv-python - numpy editable: true +- kind: pypi + name: nv12 + version: 0.1.0 + path: examples/python/nv12 + sha256: c8ca97c5d8c04037cd5eb9a65be7b1e7d667c11d4dba3ee9aad5956ccf926dc4 + requires_dist: + - rerun-sdk>=0.10 + - opencv-python + - numpy + editable: true - kind: pypi name: nvidia-cublas-cu12 version: 12.1.3.1 @@ -34327,6 +34553,19 @@ packages: - rerun-sdk - scipy editable: true +- kind: pypi + name: objectron + version: 0.1.0 + path: examples/python/objectron + sha256: b2be2b675353b4238e7778b1cef8351950832c32b5e5c34415601c030a421a27 + requires_dist: + - betterproto[compiler] + - numpy + - opencv-python>4.6 + - requests>=2.31,<3 + - rerun-sdk + - scipy + editable: true - kind: conda name: ocl-icd version: 2.3.2 @@ -34357,6 +34596,20 @@ packages: - tqdm requires_python: '>=3.10' editable: true +- kind: pypi + name: open-photogrammetry-format + version: 0.1.0 + path: examples/python/open_photogrammetry_format + sha256: 1bf1ac24e064bb75c7f5672b761e519b8b941354a6d9c44d824643ff64f15e80 + requires_dist: + - numpy + - pillow + - pyopf + - requests + - rerun-sdk + - tqdm + requires_python: '>=3.10' + editable: true - kind: conda name: opencv version: 4.10.0 @@ -34456,8 +34709,8 @@ packages: - kind: pypi name: opencv-contrib-python version: 4.10.0.84 - url: https://files.pythonhosted.org/packages/f8/76/f76fe74b864f3cfa737173ca12e8890aad8369e980006fb8a0b6cd14c6c7/opencv_contrib_python-4.10.0.84-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 040575b69e4f3aa761676bace4e3d1b8485fbfaf77ef77b266ab6bda5a3b5e9b + url: https://files.pythonhosted.org/packages/09/94/d077c4c976c2d7a88812fd55396e92edae0e0c708689dbd8c8f508920e47/opencv_contrib_python-4.10.0.84-cp37-abi3-macosx_12_0_x86_64.whl + sha256: dea80d4db73b8acccf9e16b5744bf3654f47b22745074263f0a6c10de26c5ef5 requires_dist: - numpy>=1.13.3 ; python_version < '3.7' - numpy>=1.21.0 ; python_version <= '3.9' and platform_system == 'Darwin' and platform_machine == 'arm64' @@ -34473,8 +34726,8 @@ packages: - kind: pypi name: opencv-contrib-python version: 4.10.0.84 - url: https://files.pythonhosted.org/packages/a7/9e/7110d2c5d543ab03b9581dbb1f8e2429863e44e0c9b4960b766f230c1279/opencv_contrib_python-4.10.0.84-cp37-abi3-win_amd64.whl - sha256: 47ec3160dae75f70e099b286d1a2e086d20dac8b06e759f60eaf867e6bdecba7 + url: https://files.pythonhosted.org/packages/92/64/c1194510eaed272d86b53a08c790ca6ed1c450f06d401c49c8145fc46d40/opencv_contrib_python-4.10.0.84-cp37-abi3-macosx_11_0_arm64.whl + sha256: ee4b0919026d8c533aeb69b16c6ec4a891a2f6844efaa14121bf68838753209c requires_dist: - numpy>=1.13.3 ; python_version < '3.7' - numpy>=1.21.0 ; python_version <= '3.9' and platform_system == 'Darwin' and platform_machine == 'arm64' @@ -34490,8 +34743,8 @@ packages: - kind: pypi name: opencv-contrib-python version: 4.10.0.84 - url: https://files.pythonhosted.org/packages/09/94/d077c4c976c2d7a88812fd55396e92edae0e0c708689dbd8c8f508920e47/opencv_contrib_python-4.10.0.84-cp37-abi3-macosx_12_0_x86_64.whl - sha256: dea80d4db73b8acccf9e16b5744bf3654f47b22745074263f0a6c10de26c5ef5 + url: https://files.pythonhosted.org/packages/a7/9e/7110d2c5d543ab03b9581dbb1f8e2429863e44e0c9b4960b766f230c1279/opencv_contrib_python-4.10.0.84-cp37-abi3-win_amd64.whl + sha256: 47ec3160dae75f70e099b286d1a2e086d20dac8b06e759f60eaf867e6bdecba7 requires_dist: - numpy>=1.13.3 ; python_version < '3.7' - numpy>=1.21.0 ; python_version <= '3.9' and platform_system == 'Darwin' and platform_machine == 'arm64' @@ -34524,8 +34777,8 @@ packages: - kind: pypi name: opencv-contrib-python version: 4.10.0.84 - url: https://files.pythonhosted.org/packages/92/64/c1194510eaed272d86b53a08c790ca6ed1c450f06d401c49c8145fc46d40/opencv_contrib_python-4.10.0.84-cp37-abi3-macosx_11_0_arm64.whl - sha256: ee4b0919026d8c533aeb69b16c6ec4a891a2f6844efaa14121bf68838753209c + url: https://files.pythonhosted.org/packages/f8/76/f76fe74b864f3cfa737173ca12e8890aad8369e980006fb8a0b6cd14c6c7/opencv_contrib_python-4.10.0.84-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 040575b69e4f3aa761676bace4e3d1b8485fbfaf77ef77b266ab6bda5a3b5e9b requires_dist: - numpy>=1.13.3 ; python_version < '3.7' - numpy>=1.21.0 ; python_version <= '3.9' and platform_system == 'Darwin' and platform_machine == 'arm64' @@ -35040,8 +35293,8 @@ packages: - kind: pypi name: pandas version: 2.2.2 - url: https://files.pythonhosted.org/packages/97/2d/7b54f80b93379ff94afb3bd9b0cd1d17b48183a0d6f98045bc01ce1e06a7/pandas-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b + url: https://files.pythonhosted.org/packages/16/c6/75231fd47afd6b3f89011e7077f1a3958441264aca7ae9ff596e3276a5d0/pandas-2.2.2-cp311-cp311-macosx_11_0_arm64.whl + sha256: 8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151 requires_dist: - numpy>=1.22.4 ; python_version < '3.11' - numpy>=1.23.2 ; python_version == '3.11' @@ -35132,8 +35385,8 @@ packages: - kind: pypi name: pandas version: 2.2.2 - url: https://files.pythonhosted.org/packages/ab/63/966db1321a0ad55df1d1fe51505d2cdae191b84c907974873817b0a6e849/pandas-2.2.2-cp311-cp311-win_amd64.whl - sha256: 873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24 + url: https://files.pythonhosted.org/packages/1b/70/61704497903d43043e288017cb2b82155c0d41e15f5c17807920877b45c2/pandas-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288 requires_dist: - numpy>=1.22.4 ; python_version < '3.11' - numpy>=1.23.2 ; python_version == '3.11' @@ -35224,8 +35477,8 @@ packages: - kind: pypi name: pandas version: 2.2.2 - url: https://files.pythonhosted.org/packages/1b/70/61704497903d43043e288017cb2b82155c0d41e15f5c17807920877b45c2/pandas-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288 + url: https://files.pythonhosted.org/packages/97/2d/7b54f80b93379ff94afb3bd9b0cd1d17b48183a0d6f98045bc01ce1e06a7/pandas-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b requires_dist: - numpy>=1.22.4 ; python_version < '3.11' - numpy>=1.23.2 ; python_version == '3.11' @@ -35316,8 +35569,8 @@ packages: - kind: pypi name: pandas version: 2.2.2 - url: https://files.pythonhosted.org/packages/fc/a5/4d82be566f069d7a9a702dcdf6f9106df0e0b042e738043c0cc7ddd7e3f6/pandas-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee + url: https://files.pythonhosted.org/packages/ab/63/966db1321a0ad55df1d1fe51505d2cdae191b84c907974873817b0a6e849/pandas-2.2.2-cp311-cp311-win_amd64.whl + sha256: 873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24 requires_dist: - numpy>=1.22.4 ; python_version < '3.11' - numpy>=1.23.2 ; python_version == '3.11' @@ -35408,8 +35661,8 @@ packages: - kind: pypi name: pandas version: 2.2.2 - url: https://files.pythonhosted.org/packages/16/c6/75231fd47afd6b3f89011e7077f1a3958441264aca7ae9ff596e3276a5d0/pandas-2.2.2-cp311-cp311-macosx_11_0_arm64.whl - sha256: 8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151 + url: https://files.pythonhosted.org/packages/fc/a5/4d82be566f069d7a9a702dcdf6f9106df0e0b042e738043c0cc7ddd7e3f6/pandas-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee requires_dist: - numpy>=1.22.4 ; python_version < '3.11' - numpy>=1.23.2 ; python_version == '3.11' @@ -35675,8 +35928,8 @@ packages: - kind: pypi name: pillow version: 10.0.0 - url: https://files.pythonhosted.org/packages/79/53/3a7277ae95bfe86b8b4db0ed1d08c4924aa2dfbfe51b8fe0e310b160a9c6/Pillow-10.0.0-cp311-cp311-manylinux_2_28_aarch64.whl - sha256: c1fbe7621c167ecaa38ad29643d77a9ce7311583761abf7836e1510c580bf3dd + url: https://files.pythonhosted.org/packages/16/89/818fa238e37a47a29bb8495ca2cafdd514599a89f19ada7916348a74b5f9/Pillow-10.0.0-cp311-cp311-manylinux_2_28_x86_64.whl + sha256: cd25d2a9d2b36fcb318882481367956d2cf91329f6892fe5d385c346c0649629 requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -35699,8 +35952,8 @@ packages: - kind: pypi name: pillow version: 10.0.0 - url: https://files.pythonhosted.org/packages/7a/54/f6a14d95cba8ff082c550d836c9e5c23f1641d2ac291c23efe0494219b8c/Pillow-10.0.0-cp311-cp311-macosx_10_10_x86_64.whl - sha256: 9fb218c8a12e51d7ead2a7c9e101a04982237d4855716af2e9499306728fb485 + url: https://files.pythonhosted.org/packages/66/d4/054e491f0880bf0119ee79cdc03264e01d5732e06c454da8c69b83a7c8f2/Pillow-10.0.0-cp311-cp311-win_amd64.whl + sha256: 3a82c40d706d9aa9734289740ce26460a11aeec2d9c79b7af87bb35f0073c12f requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -35723,8 +35976,8 @@ packages: - kind: pypi name: pillow version: 10.0.0 - url: https://files.pythonhosted.org/packages/66/d4/054e491f0880bf0119ee79cdc03264e01d5732e06c454da8c69b83a7c8f2/Pillow-10.0.0-cp311-cp311-win_amd64.whl - sha256: 3a82c40d706d9aa9734289740ce26460a11aeec2d9c79b7af87bb35f0073c12f + url: https://files.pythonhosted.org/packages/79/53/3a7277ae95bfe86b8b4db0ed1d08c4924aa2dfbfe51b8fe0e310b160a9c6/Pillow-10.0.0-cp311-cp311-manylinux_2_28_aarch64.whl + sha256: c1fbe7621c167ecaa38ad29643d77a9ce7311583761abf7836e1510c580bf3dd requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -35747,8 +36000,8 @@ packages: - kind: pypi name: pillow version: 10.0.0 - url: https://files.pythonhosted.org/packages/b7/ad/71982d18fd28ed1f93c31b8648f980ebdbdbcf7d8c9c9b4af59290914ce9/Pillow-10.0.0-cp311-cp311-macosx_11_0_arm64.whl - sha256: d35e3c8d9b1268cbf5d3670285feb3528f6680420eafe35cccc686b73c1e330f + url: https://files.pythonhosted.org/packages/7a/54/f6a14d95cba8ff082c550d836c9e5c23f1641d2ac291c23efe0494219b8c/Pillow-10.0.0-cp311-cp311-macosx_10_10_x86_64.whl + sha256: 9fb218c8a12e51d7ead2a7c9e101a04982237d4855716af2e9499306728fb485 requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -35771,8 +36024,8 @@ packages: - kind: pypi name: pillow version: 10.0.0 - url: https://files.pythonhosted.org/packages/16/89/818fa238e37a47a29bb8495ca2cafdd514599a89f19ada7916348a74b5f9/Pillow-10.0.0-cp311-cp311-manylinux_2_28_x86_64.whl - sha256: cd25d2a9d2b36fcb318882481367956d2cf91329f6892fe5d385c346c0649629 + url: https://files.pythonhosted.org/packages/b7/ad/71982d18fd28ed1f93c31b8648f980ebdbdbcf7d8c9c9b4af59290914ce9/Pillow-10.0.0-cp311-cp311-macosx_11_0_arm64.whl + sha256: d35e3c8d9b1268cbf5d3670285feb3528f6680420eafe35cccc686b73c1e330f requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -35795,8 +36048,8 @@ packages: - kind: pypi name: pillow version: 10.4.0 - url: https://files.pythonhosted.org/packages/a9/83/6523837906d1da2b269dee787e31df3b0acb12e3d08f024965a3e7f64665/pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl - sha256: bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe + url: https://files.pythonhosted.org/packages/a7/62/c9449f9c3043c37f73e7487ec4ef0c03eb9c9afc91a92b977a67b3c0bbc5/pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl + sha256: 0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -35822,8 +36075,8 @@ packages: - kind: pypi name: pillow version: 10.4.0 - url: https://files.pythonhosted.org/packages/ba/e5/8c68ff608a4203085158cff5cc2a3c534ec384536d9438c405ed6370d080/pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl - sha256: 76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319 + url: https://files.pythonhosted.org/packages/a9/83/6523837906d1da2b269dee787e31df3b0acb12e3d08f024965a3e7f64665/pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl + sha256: bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -35849,8 +36102,8 @@ packages: - kind: pypi name: pillow version: 10.4.0 - url: https://files.pythonhosted.org/packages/c1/d0/5866318eec2b801cdb8c82abf190c8343d8a1cd8bf5a0c17444a6f268291/pillow-10.4.0-cp311-cp311-win_amd64.whl - sha256: cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91 + url: https://files.pythonhosted.org/packages/ba/e5/8c68ff608a4203085158cff5cc2a3c534ec384536d9438c405ed6370d080/pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl + sha256: 76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319 requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -35876,8 +36129,8 @@ packages: - kind: pypi name: pillow version: 10.4.0 - url: https://files.pythonhosted.org/packages/a7/62/c9449f9c3043c37f73e7487ec4ef0c03eb9c9afc91a92b977a67b3c0bbc5/pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl - sha256: 0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c + url: https://files.pythonhosted.org/packages/c1/d0/5866318eec2b801cdb8c82abf190c8343d8a1cd8bf5a0c17444a6f268291/pillow-10.4.0-cp311-cp311-win_amd64.whl + sha256: cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91 requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -36051,6 +36304,15 @@ packages: - numpy - rerun-sdk editable: true +- kind: pypi + name: plots + version: 0.1.0 + path: examples/python/plots + sha256: 398c85932db816f766e2d703568060efe4520a6e734f91d69387bbdd143b3f97 + requires_dist: + - numpy + - rerun-sdk + editable: true - kind: conda name: pluggy version: 1.5.0 @@ -36186,8 +36448,8 @@ packages: - kind: pypi name: protobuf version: 5.27.2 - url: https://files.pythonhosted.org/packages/cd/c7/a534268f9c3780be1ba50f5ed96243fa9cf6224a445de662c34e91ce0e61/protobuf-5.27.2-cp38-abi3-manylinux2014_aarch64.whl - sha256: 176c12b1f1c880bf7a76d9f7c75822b6a2bc3db2d28baa4d300e8ce4cde7409b + url: https://files.pythonhosted.org/packages/27/e4/8dc4546be46873f8950cb44cdfe19b79d66d26e53c4ee5e3440406257fcd/protobuf-5.27.2-cp38-abi3-manylinux2014_x86_64.whl + sha256: b848dbe1d57ed7c191dfc4ea64b8b004a3f9ece4bf4d0d80a367b76df20bf36e requires_python: '>=3.8' - kind: pypi name: protobuf @@ -36204,14 +36466,14 @@ packages: - kind: pypi name: protobuf version: 5.27.2 - url: https://files.pythonhosted.org/packages/27/e4/8dc4546be46873f8950cb44cdfe19b79d66d26e53c4ee5e3440406257fcd/protobuf-5.27.2-cp38-abi3-manylinux2014_x86_64.whl - sha256: b848dbe1d57ed7c191dfc4ea64b8b004a3f9ece4bf4d0d80a367b76df20bf36e + url: https://files.pythonhosted.org/packages/cd/c7/a534268f9c3780be1ba50f5ed96243fa9cf6224a445de662c34e91ce0e61/protobuf-5.27.2-cp38-abi3-manylinux2014_aarch64.whl + sha256: 176c12b1f1c880bf7a76d9f7c75822b6a2bc3db2d28baa4d300e8ce4cde7409b requires_python: '>=3.8' - kind: pypi name: psutil version: 6.0.0 - url: https://files.pythonhosted.org/packages/cd/5f/60038e277ff0a9cc8f0c9ea3d0c5eb6ee1d2470ea3f9389d776432888e47/psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132 + url: https://files.pythonhosted.org/packages/0b/37/f8da2fbd29690b3557cca414c1949f92162981920699cd62095a984983bf/psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl + sha256: c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0 requires_dist: - ipaddress ; python_version < '3.0' and extra == 'test' - mock ; python_version < '3.0' and extra == 'test' @@ -36246,8 +36508,8 @@ packages: - kind: pypi name: psutil version: 6.0.0 - url: https://files.pythonhosted.org/packages/0b/37/f8da2fbd29690b3557cca414c1949f92162981920699cd62095a984983bf/psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl - sha256: c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0 + url: https://files.pythonhosted.org/packages/7c/06/63872a64c312a24fb9b4af123ee7007a306617da63ff13bcc1432386ead7/psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl + sha256: ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0 requires_dist: - ipaddress ; python_version < '3.0' and extra == 'test' - mock ; python_version < '3.0' and extra == 'test' @@ -36258,8 +36520,8 @@ packages: - kind: pypi name: psutil version: 6.0.0 - url: https://files.pythonhosted.org/packages/7c/06/63872a64c312a24fb9b4af123ee7007a306617da63ff13bcc1432386ead7/psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl - sha256: ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0 + url: https://files.pythonhosted.org/packages/cd/5f/60038e277ff0a9cc8f0c9ea3d0c5eb6ee1d2470ea3f9389d776432888e47/psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132 requires_dist: - ipaddress ; python_version < '3.0' and extra == 'test' - mock ; python_version < '3.0' and extra == 'test' @@ -36364,8 +36626,8 @@ packages: - kind: pypi name: psygnal version: 0.11.1 - url: https://files.pythonhosted.org/packages/84/6f/868f1d7d22c76b96e0c8a75f8eb196deaff83916ad2da7bd78d1d0f6a5df/psygnal-0.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 24e69ea57ee39e3677298f38a18828af87cdc0bf0aa64685d44259e608bae3ec + url: https://files.pythonhosted.org/packages/25/92/6dcab17c3bb91fa3f250ebdbb66de55332436da836c4c547c26e3942877e/psygnal-0.11.1-cp311-cp311-macosx_10_16_x86_64.whl + sha256: 8f77317cbd11fbed5bfdd40ea41b4e551ee0cf37881cdbc325b67322af577485 requires_dist: - ipython ; extra == 'dev' - mypy ; extra == 'dev' @@ -36401,8 +36663,8 @@ packages: - kind: pypi name: psygnal version: 0.11.1 - url: https://files.pythonhosted.org/packages/25/92/6dcab17c3bb91fa3f250ebdbb66de55332436da836c4c547c26e3942877e/psygnal-0.11.1-cp311-cp311-macosx_10_16_x86_64.whl - sha256: 8f77317cbd11fbed5bfdd40ea41b4e551ee0cf37881cdbc325b67322af577485 + url: https://files.pythonhosted.org/packages/68/76/d5c5bf5a932ec2dcdc4a23565815a1cc5fd96b03b26ff3f647cdff5ea62c/psygnal-0.11.1-py3-none-any.whl + sha256: 04255fe28828060a80320f8fda937c47bc0c21ca14f55a13eb7c494b165ea395 requires_dist: - ipython ; extra == 'dev' - mypy ; extra == 'dev' @@ -36438,8 +36700,8 @@ packages: - kind: pypi name: psygnal version: 0.11.1 - url: https://files.pythonhosted.org/packages/68/76/d5c5bf5a932ec2dcdc4a23565815a1cc5fd96b03b26ff3f647cdff5ea62c/psygnal-0.11.1-py3-none-any.whl - sha256: 04255fe28828060a80320f8fda937c47bc0c21ca14f55a13eb7c494b165ea395 + url: https://files.pythonhosted.org/packages/84/6f/868f1d7d22c76b96e0c8a75f8eb196deaff83916ad2da7bd78d1d0f6a5df/psygnal-0.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 24e69ea57ee39e3677298f38a18828af87cdc0bf0aa64685d44259e608bae3ec requires_dist: - ipython ; extra == 'dev' - mypy ; extra == 'dev' @@ -36738,8 +37000,8 @@ packages: - kind: pypi name: pyarrow version: 17.0.0 - url: https://files.pythonhosted.org/packages/d8/81/69b6606093363f55a2a574c018901c40952d4e902e670656d18213c71ad7/pyarrow-17.0.0-cp311-cp311-manylinux_2_28_aarch64.whl - sha256: dc5c31c37409dfbc5d014047817cb4ccd8c1ea25d19576acf1a001fe07f5b420 + url: https://files.pythonhosted.org/packages/30/d1/63a7c248432c71c7d3ee803e706590a0b81ce1a8d2b2ae49677774b813bb/pyarrow-17.0.0-cp311-cp311-win_amd64.whl + sha256: a27532c38f3de9eb3e90ecab63dfda948a8ca859a66e3a47f5f42d1e403c4d03 requires_dist: - numpy>=1.16.6 - pytest ; extra == 'test' @@ -36751,8 +37013,8 @@ packages: - kind: pypi name: pyarrow version: 17.0.0 - url: https://files.pythonhosted.org/packages/30/d1/63a7c248432c71c7d3ee803e706590a0b81ce1a8d2b2ae49677774b813bb/pyarrow-17.0.0-cp311-cp311-win_amd64.whl - sha256: a27532c38f3de9eb3e90ecab63dfda948a8ca859a66e3a47f5f42d1e403c4d03 + url: https://files.pythonhosted.org/packages/4c/21/9ca93b84b92ef927814cb7ba37f0774a484c849d58f0b692b16af8eebcfb/pyarrow-17.0.0-cp311-cp311-manylinux_2_28_x86_64.whl + sha256: e3343cb1e88bc2ea605986d4b94948716edc7a8d14afd4e2c097232f729758b4 requires_dist: - numpy>=1.16.6 - pytest ; extra == 'test' @@ -36777,8 +37039,8 @@ packages: - kind: pypi name: pyarrow version: 17.0.0 - url: https://files.pythonhosted.org/packages/f9/46/ce89f87c2936f5bb9d879473b9663ce7a4b1f4359acc2f0eb39865eaa1af/pyarrow-17.0.0-cp311-cp311-macosx_10_15_x86_64.whl - sha256: 1c8856e2ef09eb87ecf937104aacfa0708f22dfeb039c363ec99735190ffb977 + url: https://files.pythonhosted.org/packages/d8/81/69b6606093363f55a2a574c018901c40952d4e902e670656d18213c71ad7/pyarrow-17.0.0-cp311-cp311-manylinux_2_28_aarch64.whl + sha256: dc5c31c37409dfbc5d014047817cb4ccd8c1ea25d19576acf1a001fe07f5b420 requires_dist: - numpy>=1.16.6 - pytest ; extra == 'test' @@ -36790,8 +37052,8 @@ packages: - kind: pypi name: pyarrow version: 17.0.0 - url: https://files.pythonhosted.org/packages/4c/21/9ca93b84b92ef927814cb7ba37f0774a484c849d58f0b692b16af8eebcfb/pyarrow-17.0.0-cp311-cp311-manylinux_2_28_x86_64.whl - sha256: e3343cb1e88bc2ea605986d4b94948716edc7a8d14afd4e2c097232f729758b4 + url: https://files.pythonhosted.org/packages/f9/46/ce89f87c2936f5bb9d879473b9663ce7a4b1f4359acc2f0eb39865eaa1af/pyarrow-17.0.0-cp311-cp311-macosx_10_15_x86_64.whl + sha256: 1c8856e2ef09eb87ecf937104aacfa0708f22dfeb039c363ec99735190ffb977 requires_dist: - numpy>=1.16.6 - pytest ; extra == 'test' @@ -37155,8 +37417,8 @@ packages: - kind: pypi name: pycocotools version: 2.0.8 - url: https://files.pythonhosted.org/packages/d5/9c/09cd808743338db170915deb35fa020b792d583238afe55f27c011f91c3c/pycocotools-2.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 6a07f57f991e379959c0f4a1b9ea35d875876433b7f45c6d8fe6b718e58834bc + url: https://files.pythonhosted.org/packages/2e/f5/dfa78dc72e47dfe1ada7b37fedcb338454750470358a6dfcfdfda35fa337/pycocotools-2.0.8-cp311-cp311-win_amd64.whl + sha256: e680e27e58b840c105fa09a3bb1d91706038c5c8d7b7bf09c2e5ecbd1b05ad7f requires_dist: - matplotlib>=2.1.0 - numpy @@ -37164,8 +37426,8 @@ packages: - kind: pypi name: pycocotools version: 2.0.8 - url: https://files.pythonhosted.org/packages/2e/f5/dfa78dc72e47dfe1ada7b37fedcb338454750470358a6dfcfdfda35fa337/pycocotools-2.0.8-cp311-cp311-win_amd64.whl - sha256: e680e27e58b840c105fa09a3bb1d91706038c5c8d7b7bf09c2e5ecbd1b05ad7f + url: https://files.pythonhosted.org/packages/6b/56/9eedccfd1cfdaf6553d527bed0b2b5572550567a5786a8beb098027a3e5e/pycocotools-2.0.8-cp311-cp311-macosx_10_9_universal2.whl + sha256: 92bf788e6936fc52b57ccaaa78ecdaeac81872eebbfc45b6fe16ae18b85709bd requires_dist: - matplotlib>=2.1.0 - numpy @@ -37173,8 +37435,8 @@ packages: - kind: pypi name: pycocotools version: 2.0.8 - url: https://files.pythonhosted.org/packages/6b/56/9eedccfd1cfdaf6553d527bed0b2b5572550567a5786a8beb098027a3e5e/pycocotools-2.0.8-cp311-cp311-macosx_10_9_universal2.whl - sha256: 92bf788e6936fc52b57ccaaa78ecdaeac81872eebbfc45b6fe16ae18b85709bd + url: https://files.pythonhosted.org/packages/8b/d4/7279d072c0255d07c541326f6058effb1b08190f49695bf2c22aae666878/pycocotools-2.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 5968a1e5421719af9eb7ccee4c540bfb18b1fc95d30d9a48571d0aaeb159a1ae requires_dist: - matplotlib>=2.1.0 - numpy @@ -37182,8 +37444,8 @@ packages: - kind: pypi name: pycocotools version: 2.0.8 - url: https://files.pythonhosted.org/packages/8b/d4/7279d072c0255d07c541326f6058effb1b08190f49695bf2c22aae666878/pycocotools-2.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 5968a1e5421719af9eb7ccee4c540bfb18b1fc95d30d9a48571d0aaeb159a1ae + url: https://files.pythonhosted.org/packages/d5/9c/09cd808743338db170915deb35fa020b792d583238afe55f27c011f91c3c/pycocotools-2.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 6a07f57f991e379959c0f4a1b9ea35d875876433b7f45c6d8fe6b718e58834bc requires_dist: - matplotlib>=2.1.0 - numpy @@ -37237,6 +37499,16 @@ packages: - deprecated - dataclasses ; python_version >= '3.6' and python_version < '3.7' requires_python: '>=3.6' +- kind: pypi + name: pygltflib + version: 1.16.2 + url: https://files.pythonhosted.org/packages/38/d7/0b8e35cb3ff69dd981e358e72e0a5632f847d4bd61876be04518cb4e075a/pygltflib-1.16.2.tar.gz + sha256: 4f9481f5841b0b8fb7b271b0414b394b503405260a6ee0cf2c330a5420d19b64 + requires_dist: + - dataclasses-json>=0.0.25 + - deprecated + - dataclasses ; python_version >= '3.6' and python_version < '3.7' + requires_python: '>=3.6' - kind: pypi name: pygments version: 2.18.0 @@ -37281,8 +37553,8 @@ packages: - kind: pypi name: pynacl version: 1.5.0 - url: https://files.pythonhosted.org/packages/ce/75/0b8ede18506041c0bf23ac4d8e2971b4161cd6ce630b177d0a08eb0d8857/PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl - sha256: 401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1 + url: https://files.pythonhosted.org/packages/5e/22/d3db169895faaf3e2eda892f005f433a62db2decbcfbc2f61e6517adfa87/PyNaCl-1.5.0-cp36-abi3-win_amd64.whl + sha256: 20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93 requires_dist: - cffi>=1.4.1 - sphinx>=1.6.5 ; extra == 'docs' @@ -37293,8 +37565,8 @@ packages: - kind: pypi name: pynacl version: 1.5.0 - url: https://files.pythonhosted.org/packages/5e/22/d3db169895faaf3e2eda892f005f433a62db2decbcfbc2f61e6517adfa87/PyNaCl-1.5.0-cp36-abi3-win_amd64.whl - sha256: 20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93 + url: https://files.pythonhosted.org/packages/ce/75/0b8ede18506041c0bf23ac4d8e2971b4161cd6ce630b177d0a08eb0d8857/PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl + sha256: 401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1 requires_dist: - cffi>=1.4.1 - sphinx>=1.6.5 ; extra == 'docs' @@ -37360,40 +37632,40 @@ packages: - kind: pypi name: pyproj version: 3.6.0 - url: https://files.pythonhosted.org/packages/82/ea/208144cd3fb42a3bf70630a1300c32a9dc1705b777d6c2fb1ebd1517fad5/pyproj-3.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 08dfc5c9533c78a97afae9d53b99b810a4a8f97c3be9eb2b8f323b726c736403 + url: https://files.pythonhosted.org/packages/1a/07/2f1975c98c840eb4fa54fb95c3070c4255bdf41fd6866e05cffff41b4f4e/pyproj-3.6.0-cp311-cp311-macosx_11_0_arm64.whl + sha256: ba5e7c8ddd6ed5a3f9fcf95ea80ba44c931913723de2ece841c94bb38b200c4a requires_dist: - certifi requires_python: '>=3.9' - kind: pypi name: pyproj version: 3.6.0 - url: https://files.pythonhosted.org/packages/c8/5a/215a1894e50167d91b471d8fc413ca30034c48e5d3dfac78d12df4c840d5/pyproj-3.6.0-cp311-cp311-win_amd64.whl - sha256: 8fbac2eb9a0e425d7d6b7c6f4ebacd675cf3bdef0c59887057b8b4b0374e7c12 + url: https://files.pythonhosted.org/packages/1b/d7/df8483715560c7a4f060774171c5ef75360d73da6b7a1b7768037885a6b4/pyproj-3.6.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 00fab048596c17572fa8980014ef117dbb2a445e6f7ba3b9ddfcc683efc598e7 requires_dist: - certifi requires_python: '>=3.9' - kind: pypi name: pyproj version: 3.6.0 - url: https://files.pythonhosted.org/packages/1b/d7/df8483715560c7a4f060774171c5ef75360d73da6b7a1b7768037885a6b4/pyproj-3.6.0-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 00fab048596c17572fa8980014ef117dbb2a445e6f7ba3b9ddfcc683efc598e7 + url: https://files.pythonhosted.org/packages/81/eb/3e31e15fdee9d54bdbc575b6384bd7e54f63590fcb4d5c247ad38a81eb44/pyproj-3.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: dfe392dfc0eba2248dc08c976a72f52ff9da2bddfddfd9ff5dcf18e8e88200c7 requires_dist: - certifi requires_python: '>=3.9' - kind: pypi name: pyproj version: 3.6.0 - url: https://files.pythonhosted.org/packages/81/eb/3e31e15fdee9d54bdbc575b6384bd7e54f63590fcb4d5c247ad38a81eb44/pyproj-3.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: dfe392dfc0eba2248dc08c976a72f52ff9da2bddfddfd9ff5dcf18e8e88200c7 + url: https://files.pythonhosted.org/packages/82/ea/208144cd3fb42a3bf70630a1300c32a9dc1705b777d6c2fb1ebd1517fad5/pyproj-3.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 08dfc5c9533c78a97afae9d53b99b810a4a8f97c3be9eb2b8f323b726c736403 requires_dist: - certifi requires_python: '>=3.9' - kind: pypi name: pyproj version: 3.6.0 - url: https://files.pythonhosted.org/packages/1a/07/2f1975c98c840eb4fa54fb95c3070c4255bdf41fd6866e05cffff41b4f4e/pyproj-3.6.0-cp311-cp311-macosx_11_0_arm64.whl - sha256: ba5e7c8ddd6ed5a3f9fcf95ea80ba44c931913723de2ece841c94bb38b200c4a + url: https://files.pythonhosted.org/packages/c8/5a/215a1894e50167d91b471d8fc413ca30034c48e5d3dfac78d12df4c840d5/pyproj-3.6.0-cp311-cp311-win_amd64.whl + sha256: 8fbac2eb9a0e425d7d6b7c6f4ebacd675cf3bdef0c59887057b8b4b0374e7c12 requires_dist: - certifi requires_python: '>=3.9' @@ -37761,41 +38033,33 @@ packages: - kind: pypi name: pyyaml version: 6.0.1 - url: https://files.pythonhosted.org/packages/5e/94/7d5ee059dfb92ca9e62f4057dcdec9ac08a9e42679644854dc01177f8145/PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d + url: https://files.pythonhosted.org/packages/28/09/55f715ddbf95a054b764b547f617e22f1d5e45d83905660e9a088078fe67/PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl + sha256: f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab requires_python: '>=3.6' - kind: pypi name: pyyaml version: 6.0.1 - url: https://files.pythonhosted.org/packages/b3/34/65bb4b2d7908044963ebf614fe0fdb080773fc7030d7e39c8d3eddcd4257/PyYAML-6.0.1-cp311-cp311-win_amd64.whl - sha256: bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34 + url: https://files.pythonhosted.org/packages/5e/94/7d5ee059dfb92ca9e62f4057dcdec9ac08a9e42679644854dc01177f8145/PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d requires_python: '>=3.6' - kind: pypi name: pyyaml version: 6.0.1 - url: https://files.pythonhosted.org/packages/ec/0d/26fb23e8863e0aeaac0c64e03fd27367ad2ae3f3cccf3798ee98ce160368/PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007 + url: https://files.pythonhosted.org/packages/7b/5e/efd033ab7199a0b2044dab3b9f7a4f6670e6a52c089de572e928d2873b06/PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673 requires_python: '>=3.6' - kind: pypi name: pyyaml version: 6.0.1 - url: https://files.pythonhosted.org/packages/7b/5e/efd033ab7199a0b2044dab3b9f7a4f6670e6a52c089de572e928d2873b06/PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673 + url: https://files.pythonhosted.org/packages/b3/34/65bb4b2d7908044963ebf614fe0fdb080773fc7030d7e39c8d3eddcd4257/PyYAML-6.0.1-cp311-cp311-win_amd64.whl + sha256: bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34 requires_python: '>=3.6' - kind: pypi name: pyyaml version: 6.0.1 - url: https://files.pythonhosted.org/packages/28/09/55f715ddbf95a054b764b547f617e22f1d5e45d83905660e9a088078fe67/PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl - sha256: f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab + url: https://files.pythonhosted.org/packages/ec/0d/26fb23e8863e0aeaac0c64e03fd27367ad2ae3f3cccf3798ee98ce160368/PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007 requires_python: '>=3.6' -- kind: pypi - name: pyzmq - version: 26.0.3 - url: https://files.pythonhosted.org/packages/e5/b5/625e45790a1b091f54d5d47fd267d051cabdec4f01144f6b2fcb7306515b/pyzmq-26.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: e222562dc0f38571c8b1ffdae9d7adb866363134299264a1958d077800b193b7 - requires_dist: - - cffi ; implementation_name == 'pypy' - requires_python: '>=3.7' - kind: pypi name: pyzmq version: 26.0.3 @@ -37820,6 +38084,14 @@ packages: requires_dist: - cffi ; implementation_name == 'pypy' requires_python: '>=3.7' +- kind: pypi + name: pyzmq + version: 26.0.3 + url: https://files.pythonhosted.org/packages/e5/b5/625e45790a1b091f54d5d47fd267d051cabdec4f01144f6b2fcb7306515b/pyzmq-26.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: e222562dc0f38571c8b1ffdae9d7adb866363134299264a1958d077800b193b7 + requires_dist: + - cffi ; implementation_name == 'pypy' + requires_python: '>=3.7' - kind: conda name: qt6-main version: 6.7.2 @@ -38051,6 +38323,17 @@ packages: - rerun-sdk - trimesh==3.15.2 editable: true +- kind: pypi + name: raw-mesh + version: 0.1.0 + path: examples/python/raw_mesh + sha256: 9006b1b7ca8bd9c90ba0bf0d7a00641b7dd13a6de76a2828f79ec5b853a4ef98 + requires_dist: + - numpy + - requests>=2.31,<3 + - rerun-sdk + - trimesh==3.15.2 + editable: true - kind: conda name: rdma-core version: '52.0' @@ -38244,32 +38527,32 @@ packages: - kind: pypi name: regex version: 2024.5.15 - url: https://files.pythonhosted.org/packages/7d/ba/cbbcdad38b40f1fa36eee1a130051d8e3cd2bd40d3a2a7bce4cf6ff82190/regex-2024.5.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 10002e86e6068d9e1c91eae8295ef690f02f913c57db120b58fdd35a6bb1af35 + url: https://files.pythonhosted.org/packages/2b/8b/1801c93783cc86bc72ed96f836ee81ea1e42c9f7bbf193aece9878c3fae5/regex-2024.5.15-cp311-cp311-macosx_10_9_x86_64.whl + sha256: c6a2b494a76983df8e3d3feea9b9ffdd558b247e60b92f877f93a1ff43d26656 requires_python: '>=3.8' - kind: pypi name: regex version: 2024.5.15 - url: https://files.pythonhosted.org/packages/ef/9b/0aa55fc101c803869c13b389b718b15810592d2df35b1af15ff5b6f48e16/regex-2024.5.15-cp311-cp311-win_amd64.whl - sha256: 9e717956dcfd656f5055cc70996ee2cc82ac5149517fc8e1b60261b907740201 + url: https://files.pythonhosted.org/packages/39/29/8158a6e69e97b9c72fab0b46fe4d57c789d07ef91fe4afde23721e7cac61/regex-2024.5.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 3e507ff1e74373c4d3038195fdd2af30d297b4f0950eeda6f515ae3d84a1770f requires_python: '>=3.8' - kind: pypi name: regex version: 2024.5.15 - url: https://files.pythonhosted.org/packages/2b/8b/1801c93783cc86bc72ed96f836ee81ea1e42c9f7bbf193aece9878c3fae5/regex-2024.5.15-cp311-cp311-macosx_10_9_x86_64.whl - sha256: c6a2b494a76983df8e3d3feea9b9ffdd558b247e60b92f877f93a1ff43d26656 + url: https://files.pythonhosted.org/packages/7d/ba/cbbcdad38b40f1fa36eee1a130051d8e3cd2bd40d3a2a7bce4cf6ff82190/regex-2024.5.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 10002e86e6068d9e1c91eae8295ef690f02f913c57db120b58fdd35a6bb1af35 requires_python: '>=3.8' - kind: pypi name: regex version: 2024.5.15 - url: https://files.pythonhosted.org/packages/39/29/8158a6e69e97b9c72fab0b46fe4d57c789d07ef91fe4afde23721e7cac61/regex-2024.5.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 3e507ff1e74373c4d3038195fdd2af30d297b4f0950eeda6f515ae3d84a1770f + url: https://files.pythonhosted.org/packages/c3/43/29ef9c42ae1e764a98510af1c610bf9f4b90a97a04fabe9396d6b73b0cc4/regex-2024.5.15-cp311-cp311-macosx_11_0_arm64.whl + sha256: a32b96f15c8ab2e7d27655969a23895eb799de3665fa94349f3b2fbfd547236f requires_python: '>=3.8' - kind: pypi name: regex version: 2024.5.15 - url: https://files.pythonhosted.org/packages/c3/43/29ef9c42ae1e764a98510af1c610bf9f4b90a97a04fabe9396d6b73b0cc4/regex-2024.5.15-cp311-cp311-macosx_11_0_arm64.whl - sha256: a32b96f15c8ab2e7d27655969a23895eb799de3665fa94349f3b2fbfd547236f + url: https://files.pythonhosted.org/packages/ef/9b/0aa55fc101c803869c13b389b718b15810592d2df35b1af15ff5b6f48e16/regex-2024.5.15-cp311-cp311-win_amd64.whl + sha256: 9e717956dcfd656f5055cc70996ee2cc82ac5149517fc8e1b60261b907740201 requires_python: '>=3.8' - kind: pypi name: requests @@ -38310,8 +38593,8 @@ packages: - kind: pypi name: rerun-sdk version: 0.17.0 - url: https://files.pythonhosted.org/packages/b7/c5/d47ba7b774bc563aa3c07ba500dd304ea24b31fe438e10ea9ad5e10ffe17/rerun_sdk-0.17.0-cp38-abi3-macosx_11_0_arm64.whl - sha256: 8b0a8a6feab3f8e679801d158216a71d88a81480021587719330f50d083c4d26 + url: https://files.pythonhosted.org/packages/30/5f/ce02381b9d7e1e14f60c421c76dce12b7d823690181784780b30266017b1/rerun_sdk-0.17.0-cp38-abi3-macosx_10_12_x86_64.whl + sha256: abd34f746eada83b8bb0bc50007183151981d7ccf18306f3d42165819a3f6fcb requires_dist: - attrs>=23.1.0 - numpy>=1.23,<2 @@ -38324,8 +38607,8 @@ packages: - kind: pypi name: rerun-sdk version: 0.17.0 - url: https://files.pythonhosted.org/packages/8c/28/92423fe9673b738c180fb5b6b8ea4203fe4b02c1d20b06b7fae79d11cc24/rerun_sdk-0.17.0-cp38-abi3-win_amd64.whl - sha256: 34e5595a326cbdddfebdf00b08e877358c564fce74cc8c6d617fc89ef3a6aa70 + url: https://files.pythonhosted.org/packages/87/0a/b5fe1ffea700eeaa8d28817a92ad3cb4a7d56dc4af45de76ea412cfc5cd5/rerun_sdk-0.17.0-cp38-abi3-manylinux_2_31_aarch64.whl + sha256: ad55807abafb01e527846742e087819aac8e103f1ec15aadc563a4038bb44e1d requires_dist: - attrs>=23.1.0 - numpy>=1.23,<2 @@ -38338,8 +38621,8 @@ packages: - kind: pypi name: rerun-sdk version: 0.17.0 - url: https://files.pythonhosted.org/packages/30/5f/ce02381b9d7e1e14f60c421c76dce12b7d823690181784780b30266017b1/rerun_sdk-0.17.0-cp38-abi3-macosx_10_12_x86_64.whl - sha256: abd34f746eada83b8bb0bc50007183151981d7ccf18306f3d42165819a3f6fcb + url: https://files.pythonhosted.org/packages/8c/28/92423fe9673b738c180fb5b6b8ea4203fe4b02c1d20b06b7fae79d11cc24/rerun_sdk-0.17.0-cp38-abi3-win_amd64.whl + sha256: 34e5595a326cbdddfebdf00b08e877358c564fce74cc8c6d617fc89ef3a6aa70 requires_dist: - attrs>=23.1.0 - numpy>=1.23,<2 @@ -38352,8 +38635,8 @@ packages: - kind: pypi name: rerun-sdk version: 0.17.0 - url: https://files.pythonhosted.org/packages/d9/74/6c1ff0c8dbe6da09ceb5ea838a72382fa3131ef6bb9377a30003299743fa/rerun_sdk-0.17.0-cp38-abi3-manylinux_2_31_x86_64.whl - sha256: 9d41f1f475270b1e0d50ddb8cb62e0d828988f0c371ac8457af25c8be5aa1dc0 + url: https://files.pythonhosted.org/packages/b7/c5/d47ba7b774bc563aa3c07ba500dd304ea24b31fe438e10ea9ad5e10ffe17/rerun_sdk-0.17.0-cp38-abi3-macosx_11_0_arm64.whl + sha256: 8b0a8a6feab3f8e679801d158216a71d88a81480021587719330f50d083c4d26 requires_dist: - attrs>=23.1.0 - numpy>=1.23,<2 @@ -38366,8 +38649,8 @@ packages: - kind: pypi name: rerun-sdk version: 0.17.0 - url: https://files.pythonhosted.org/packages/87/0a/b5fe1ffea700eeaa8d28817a92ad3cb4a7d56dc4af45de76ea412cfc5cd5/rerun_sdk-0.17.0-cp38-abi3-manylinux_2_31_aarch64.whl - sha256: ad55807abafb01e527846742e087819aac8e103f1ec15aadc563a4038bb44e1d + url: https://files.pythonhosted.org/packages/d9/74/6c1ff0c8dbe6da09ceb5ea838a72382fa3131ef6bb9377a30003299743fa/rerun_sdk-0.17.0-cp38-abi3-manylinux_2_31_x86_64.whl + sha256: 9d41f1f475270b1e0d50ddb8cb62e0d828988f0c371ac8457af25c8be5aa1dc0 requires_dist: - attrs>=23.1.0 - numpy>=1.23,<2 @@ -38418,6 +38701,18 @@ packages: - rerun-sdk - tqdm editable: true +- kind: pypi + name: rgbd + version: 0.1.0 + path: examples/python/rgbd + sha256: b2ef153b0bedd672c3e0ce89b7be1f64f4344b2b75d71748899faea270383fa2 + requires_dist: + - numpy + - opencv-python>4.6 + - requests>=2.31,<3 + - rerun-sdk + - tqdm + editable: true - kind: conda name: rhash version: 1.4.4 @@ -38494,26 +38789,26 @@ packages: - kind: pypi name: rpds-py version: 0.19.1 - url: https://files.pythonhosted.org/packages/d0/b4/3e58dd849bbc85b51523bad48da9e1f8d09f5f791124ba0593ae6fc02f47/rpds_py-0.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 3837c63dd6918a24de6c526277910e3766d8c2b1627c500b155f3eecad8fad65 + url: https://files.pythonhosted.org/packages/2c/98/3baa188d20f3228589bc5fc516982888d10f26769f54980facbc54150443/rpds_py-0.19.1-cp311-none-win_amd64.whl + sha256: c149a652aeac4902ecff2dd93c3b2681c608bd5208c793c4a99404b3e1afc87c requires_python: '>=3.8' - kind: pypi name: rpds-py version: 0.19.1 - url: https://files.pythonhosted.org/packages/2c/98/3baa188d20f3228589bc5fc516982888d10f26769f54980facbc54150443/rpds_py-0.19.1-cp311-none-win_amd64.whl - sha256: c149a652aeac4902ecff2dd93c3b2681c608bd5208c793c4a99404b3e1afc87c + url: https://files.pythonhosted.org/packages/36/b8/f269fed9aee00fbe96f24e016be76ba685794bc75d3fd30bd88953b474d0/rpds_py-0.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: c34f751bf67cab69638564eee34023909380ba3e0d8ee7f6fe473079bf93f09b requires_python: '>=3.8' - kind: pypi name: rpds-py version: 0.19.1 - url: https://files.pythonhosted.org/packages/e8/75/3280074a72a2098e422e371b5a9ea554e1eb6a0b282dff299928d47c1617/rpds_py-0.19.1-cp311-cp311-macosx_10_12_x86_64.whl - sha256: 902cf4739458852fe917104365ec0efbea7d29a15e4276c96a8d33e6ed8ec137 + url: https://files.pythonhosted.org/packages/d0/b4/3e58dd849bbc85b51523bad48da9e1f8d09f5f791124ba0593ae6fc02f47/rpds_py-0.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 3837c63dd6918a24de6c526277910e3766d8c2b1627c500b155f3eecad8fad65 requires_python: '>=3.8' - kind: pypi name: rpds-py version: 0.19.1 - url: https://files.pythonhosted.org/packages/36/b8/f269fed9aee00fbe96f24e016be76ba685794bc75d3fd30bd88953b474d0/rpds_py-0.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: c34f751bf67cab69638564eee34023909380ba3e0d8ee7f6fe473079bf93f09b + url: https://files.pythonhosted.org/packages/e8/75/3280074a72a2098e422e371b5a9ea554e1eb6a0b282dff299928d47c1617/rpds_py-0.19.1-cp311-cp311-macosx_10_12_x86_64.whl + sha256: 902cf4739458852fe917104365ec0efbea7d29a15e4276c96a8d33e6ed8ec137 requires_python: '>=3.8' - kind: pypi name: rrt-star @@ -38524,6 +38819,15 @@ packages: - numpy - rerun-sdk editable: true +- kind: pypi + name: rrt-star + version: 0.1.0 + path: examples/python/rrt_star + sha256: 41993fc9e48ad077ad59ee5918ccc59c86628fd3d8ea4d36bd0706e9880ce6df + requires_dist: + - numpy + - rerun-sdk + editable: true - kind: pypi name: rsa version: '4.9' @@ -38667,8 +38971,8 @@ packages: - kind: pypi name: safetensors version: 0.4.3 - url: https://files.pythonhosted.org/packages/85/f8/13934886b30f4429a480ee24be217cefc279f1d40e1cf0250b327404ab82/safetensors-0.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: e9afd5358719f1b2cf425fad638fc3c887997d6782da317096877e5b15b2ce93 + url: https://files.pythonhosted.org/packages/82/61/d4812330b32600972e92ef09a59dc54f9ab8ae570fdca28d8bdfc5577756/safetensors-0.4.3-cp311-cp311-macosx_11_0_arm64.whl + sha256: 7c4fa560ebd4522adddb71dcd25d09bf211b5634003f015a4b815b7647d62ebe requires_dist: - numpy>=1.21.6 ; extra == 'numpy' - safetensors[numpy] ; extra == 'torch' @@ -38707,8 +39011,8 @@ packages: - kind: pypi name: safetensors version: 0.4.3 - url: https://files.pythonhosted.org/packages/cb/f6/19f268662be898ff2a23ac06f8dd0d2956b2ecd204c96e1ee07ba292c119/safetensors-0.4.3-cp311-none-win_amd64.whl - sha256: 840b7ac0eff5633e1d053cc9db12fdf56b566e9403b4950b2dc85393d9b88d67 + url: https://files.pythonhosted.org/packages/85/f8/13934886b30f4429a480ee24be217cefc279f1d40e1cf0250b327404ab82/safetensors-0.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: e9afd5358719f1b2cf425fad638fc3c887997d6782da317096877e5b15b2ce93 requires_dist: - numpy>=1.21.6 ; extra == 'numpy' - safetensors[numpy] ; extra == 'torch' @@ -38787,8 +39091,8 @@ packages: - kind: pypi name: safetensors version: 0.4.3 - url: https://files.pythonhosted.org/packages/d5/85/1e7d2804cbf82204cde462d16f1cb0ff5814b03f559fb46ceaa6b7020db4/safetensors-0.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 0bf4f9d6323d9f86eef5567eabd88f070691cf031d4c0df27a40d3b4aaee755b + url: https://files.pythonhosted.org/packages/cb/f6/19f268662be898ff2a23ac06f8dd0d2956b2ecd204c96e1ee07ba292c119/safetensors-0.4.3-cp311-none-win_amd64.whl + sha256: 840b7ac0eff5633e1d053cc9db12fdf56b566e9403b4950b2dc85393d9b88d67 requires_dist: - numpy>=1.21.6 ; extra == 'numpy' - safetensors[numpy] ; extra == 'torch' @@ -38827,8 +39131,8 @@ packages: - kind: pypi name: safetensors version: 0.4.3 - url: https://files.pythonhosted.org/packages/82/61/d4812330b32600972e92ef09a59dc54f9ab8ae570fdca28d8bdfc5577756/safetensors-0.4.3-cp311-cp311-macosx_11_0_arm64.whl - sha256: 7c4fa560ebd4522adddb71dcd25d09bf211b5634003f015a4b815b7647d62ebe + url: https://files.pythonhosted.org/packages/d5/85/1e7d2804cbf82204cde462d16f1cb0ff5814b03f559fb46ceaa6b7020db4/safetensors-0.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 0bf4f9d6323d9f86eef5567eabd88f070691cf031d4c0df27a40d3b4aaee755b requires_dist: - numpy>=1.21.6 ; extra == 'numpy' - safetensors[numpy] ; extra == 'torch' @@ -38867,8 +39171,8 @@ packages: - kind: pypi name: scikit-image version: 0.24.0 - url: https://files.pythonhosted.org/packages/b8/2e/3a949995f8fc2a65b15a4964373e26c5601cb2ea68f36b115571663e7a38/scikit_image-0.24.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 59c98cc695005faf2b79904e4663796c977af22586ddf1b12d6af2fa22842dc2 + url: https://files.pythonhosted.org/packages/3c/f6/be8b16d8ab6ebf19057877c2aec905cbd438dd92ca64b8efe9e9af008fa3/scikit_image-0.24.0-cp311-cp311-macosx_12_0_arm64.whl + sha256: 190ebde80b4470fe8838764b9b15f232a964f1a20391663e31008d76f0c696f7 requires_dist: - numpy>=1.23 - scipy>=1.9 @@ -39135,8 +39439,8 @@ packages: - kind: pypi name: scikit-image version: 0.24.0 - url: https://files.pythonhosted.org/packages/3c/f6/be8b16d8ab6ebf19057877c2aec905cbd438dd92ca64b8efe9e9af008fa3/scikit_image-0.24.0-cp311-cp311-macosx_12_0_arm64.whl - sha256: 190ebde80b4470fe8838764b9b15f232a964f1a20391663e31008d76f0c696f7 + url: https://files.pythonhosted.org/packages/b8/2e/3a949995f8fc2a65b15a4964373e26c5601cb2ea68f36b115571663e7a38/scikit_image-0.24.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 59c98cc695005faf2b79904e4663796c977af22586ddf1b12d6af2fa22842dc2 requires_dist: - numpy>=1.23 - scipy>=1.9 @@ -39202,8 +39506,8 @@ packages: - kind: pypi name: scikit-learn version: 1.5.1 - url: https://files.pythonhosted.org/packages/c1/f8/fd3fa610cac686952d8c78b8b44cf5263c6c03885bd8e5d5819c684b44e8/scikit_learn-1.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 909144d50f367a513cee6090873ae582dba019cb3fca063b38054fa42704c3a4 + url: https://files.pythonhosted.org/packages/03/86/ab9f95e338c5ef5b4e79463ee91e55aae553213835e59bf038bc0cc21bf8/scikit_learn-1.5.1-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 154297ee43c0b83af12464adeab378dee2d0a700ccd03979e2b821e7dd7cc1c2 requires_dist: - numpy>=1.19.5 - scipy>=1.6.0 @@ -39263,8 +39567,8 @@ packages: - kind: pypi name: scikit-learn version: 1.5.1 - url: https://files.pythonhosted.org/packages/5d/55/0403bf2031250ac982c8053397889fbc5a3a2b3798b913dae4f51c3af6a4/scikit_learn-1.5.1-cp311-cp311-win_amd64.whl - sha256: 9a07f90846313a7639af6a019d849ff72baadfa4c74c778821ae0fad07b7275b + url: https://files.pythonhosted.org/packages/32/63/ed228892adad313aab0d0f9261241e7bf1efe36730a2788ad424bcad00ca/scikit_learn-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 689b6f74b2c880276e365fe84fe4f1befd6a774f016339c65655eaff12e10cbf requires_dist: - numpy>=1.19.5 - scipy>=1.6.0 @@ -39324,8 +39628,8 @@ packages: - kind: pypi name: scikit-learn version: 1.5.1 - url: https://files.pythonhosted.org/packages/03/86/ab9f95e338c5ef5b4e79463ee91e55aae553213835e59bf038bc0cc21bf8/scikit_learn-1.5.1-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 154297ee43c0b83af12464adeab378dee2d0a700ccd03979e2b821e7dd7cc1c2 + url: https://files.pythonhosted.org/packages/5d/55/0403bf2031250ac982c8053397889fbc5a3a2b3798b913dae4f51c3af6a4/scikit_learn-1.5.1-cp311-cp311-win_amd64.whl + sha256: 9a07f90846313a7639af6a019d849ff72baadfa4c74c778821ae0fad07b7275b requires_dist: - numpy>=1.19.5 - scipy>=1.6.0 @@ -39385,8 +39689,8 @@ packages: - kind: pypi name: scikit-learn version: 1.5.1 - url: https://files.pythonhosted.org/packages/32/63/ed228892adad313aab0d0f9261241e7bf1efe36730a2788ad424bcad00ca/scikit_learn-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 689b6f74b2c880276e365fe84fe4f1befd6a774f016339c65655eaff12e10cbf + url: https://files.pythonhosted.org/packages/7d/d7/fb80c63062b60b1fa5dcb2d4dd3a4e83bd8c68cdc83cf6ff8c016228f184/scikit_learn-1.5.1-cp311-cp311-macosx_12_0_arm64.whl + sha256: b5e865e9bd59396220de49cb4a57b17016256637c61b4c5cc81aaf16bc123bbe requires_dist: - numpy>=1.19.5 - scipy>=1.6.0 @@ -39446,8 +39750,8 @@ packages: - kind: pypi name: scikit-learn version: 1.5.1 - url: https://files.pythonhosted.org/packages/7d/d7/fb80c63062b60b1fa5dcb2d4dd3a4e83bd8c68cdc83cf6ff8c016228f184/scikit_learn-1.5.1-cp311-cp311-macosx_12_0_arm64.whl - sha256: b5e865e9bd59396220de49cb4a57b17016256637c61b4c5cc81aaf16bc123bbe + url: https://files.pythonhosted.org/packages/c1/f8/fd3fa610cac686952d8c78b8b44cf5263c6c03885bd8e5d5819c684b44e8/scikit_learn-1.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 909144d50f367a513cee6090873ae582dba019cb3fca063b38054fa42704c3a4 requires_dist: - numpy>=1.19.5 - scipy>=1.6.0 @@ -39507,8 +39811,8 @@ packages: - kind: pypi name: scipy version: 1.14.0 - url: https://files.pythonhosted.org/packages/6c/bb/f44e22697740893ffa84239ca3766bdb908c1c7135ebb272d5bd4bdc33e2/scipy-1.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 9eee2989868e274aae26125345584254d97c56194c072ed96cb433f32f692ed8 + url: https://files.pythonhosted.org/packages/10/55/d6096721c0f0d7e7369da9660a854c14e6379ab7aba603ea5d492d77fa23/scipy-1.14.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 6d056a8709ccda6cf36cdd2eac597d13bc03dba38360f418560a93050c76a16e requires_dist: - numpy<2.3,>=1.23.5 - pytest ; extra == 'test' @@ -39549,8 +39853,8 @@ packages: - kind: pypi name: scipy version: 1.14.0 - url: https://files.pythonhosted.org/packages/91/1d/0484130df7e33e044da88a091827d6441b77f907075bf7bbe145857d6590/scipy-1.14.0-cp311-cp311-win_amd64.whl - sha256: 5b083c8940028bb7e0b4172acafda6df762da1927b9091f9611b0bcd8676f2bc + url: https://files.pythonhosted.org/packages/56/95/1a3a04b5facab8287325ad2335dbb6b78b98d73690c832099c9c498f7a4d/scipy-1.14.0-cp311-cp311-macosx_12_0_arm64.whl + sha256: f0a50da861a7ec4573b7c716b2ebdcdf142b66b756a0d392c236ae568b3a93fb requires_dist: - numpy<2.3,>=1.23.5 - pytest ; extra == 'test' @@ -39591,8 +39895,8 @@ packages: - kind: pypi name: scipy version: 1.14.0 - url: https://files.pythonhosted.org/packages/10/55/d6096721c0f0d7e7369da9660a854c14e6379ab7aba603ea5d492d77fa23/scipy-1.14.0-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 6d056a8709ccda6cf36cdd2eac597d13bc03dba38360f418560a93050c76a16e + url: https://files.pythonhosted.org/packages/6c/bb/f44e22697740893ffa84239ca3766bdb908c1c7135ebb272d5bd4bdc33e2/scipy-1.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 9eee2989868e274aae26125345584254d97c56194c072ed96cb433f32f692ed8 requires_dist: - numpy<2.3,>=1.23.5 - pytest ; extra == 'test' @@ -39675,8 +39979,8 @@ packages: - kind: pypi name: scipy version: 1.14.0 - url: https://files.pythonhosted.org/packages/56/95/1a3a04b5facab8287325ad2335dbb6b78b98d73690c832099c9c498f7a4d/scipy-1.14.0-cp311-cp311-macosx_12_0_arm64.whl - sha256: f0a50da861a7ec4573b7c716b2ebdcdf142b66b756a0d392c236ae568b3a93fb + url: https://files.pythonhosted.org/packages/91/1d/0484130df7e33e044da88a091827d6441b77f907075bf7bbe145857d6590/scipy-1.14.0-cp311-cp311-win_amd64.whl + sha256: 5b083c8940028bb7e0b4172acafda6df762da1927b9091f9611b0bcd8676f2bc requires_dist: - numpy<2.3,>=1.23.5 - pytest ; extra == 'test' @@ -39726,7 +40030,7 @@ packages: - kind: pypi name: segment-anything version: '1.0' - url: git+https://github.com/facebookresearch/segment-anything.git@dca509fe793f601edb92606367a655c15ac00fdf + url: git+https://github.com/facebookresearch/segment-anything.git@526fd066dea338ba2ca08886853bd37ffd6a8aec requires_dist: - matplotlib ; extra == 'all' - pycocotools ; extra == 'all' @@ -39740,7 +40044,7 @@ packages: - kind: pypi name: segment-anything version: '1.0' - url: git+https://github.com/facebookresearch/segment-anything.git@526fd066dea338ba2ca08886853bd37ffd6a8aec + url: git+https://github.com/facebookresearch/segment-anything.git@dca509fe793f601edb92606367a655c15ac00fdf requires_dist: - matplotlib ; extra == 'all' - pycocotools ; extra == 'all' @@ -39766,6 +40070,21 @@ packages: - torchvision - tqdm editable: true +- kind: pypi + name: segment-anything-model + version: 0.1.0 + path: examples/python/segment_anything_model + sha256: 85bc241bedf212c63a39d0251a9dcc0fb3a435087a024d4eafd7f49342a75926 + requires_dist: + - segment-anything @ git+https://github.com/facebookresearch/segment-anything.git + - numpy + - opencv-python + - requests>=2.31,<3 + - rerun-sdk + - torch==2.2.2 + - torchvision + - tqdm + editable: true - kind: conda name: semver version: 2.13.0 @@ -39948,8 +40267,8 @@ packages: - kind: pypi name: shapely version: 2.0.5 - url: https://files.pythonhosted.org/packages/7e/4e/4e83b9f3d7f0ce523c92bdf3dfe0292738d8ad2b589971390d6205bc843e/shapely-2.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 0f8e71bb9a46814019f6644c4e2560a09d44b80100e46e371578f35eaaa9da1c + url: https://files.pythonhosted.org/packages/29/3d/0d3ab80860cda6afbce9736fa1f091f452092d344fdd4e3c65e5fe7b1111/shapely-2.0.5-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 5bbfb048a74cf273db9091ff3155d373020852805a37dfc846ab71dde4be93ec requires_dist: - numpy<3,>=1.14 - numpydoc==1.1.* ; extra == 'docs' @@ -39963,8 +40282,8 @@ packages: - kind: pypi name: shapely version: 2.0.5 - url: https://files.pythonhosted.org/packages/ec/1b/092fff53cbeced411eed2717592e31cadd3e52f0ebaba5f2df3f34913f96/shapely-2.0.5-cp311-cp311-win_amd64.whl - sha256: 6c6b78c0007a34ce7144f98b7418800e0a6a5d9a762f2244b00ea560525290c9 + url: https://files.pythonhosted.org/packages/7e/4e/4e83b9f3d7f0ce523c92bdf3dfe0292738d8ad2b589971390d6205bc843e/shapely-2.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 0f8e71bb9a46814019f6644c4e2560a09d44b80100e46e371578f35eaaa9da1c requires_dist: - numpy<3,>=1.14 - numpydoc==1.1.* ; extra == 'docs' @@ -39978,8 +40297,8 @@ packages: - kind: pypi name: shapely version: 2.0.5 - url: https://files.pythonhosted.org/packages/29/3d/0d3ab80860cda6afbce9736fa1f091f452092d344fdd4e3c65e5fe7b1111/shapely-2.0.5-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 5bbfb048a74cf273db9091ff3155d373020852805a37dfc846ab71dde4be93ec + url: https://files.pythonhosted.org/packages/80/68/6b51b7587547f6bbd0965cf957505a0ebec93510e840572a983003b3a0a9/shapely-2.0.5-cp311-cp311-macosx_11_0_arm64.whl + sha256: 93be600cbe2fbaa86c8eb70656369f2f7104cd231f0d6585c7d0aa555d6878b8 requires_dist: - numpy<3,>=1.14 - numpydoc==1.1.* ; extra == 'docs' @@ -39993,8 +40312,8 @@ packages: - kind: pypi name: shapely version: 2.0.5 - url: https://files.pythonhosted.org/packages/ed/a8/c8b0f1a165e161247caf0fc265d61de3c4ea27d7c313c7ebfb1c4f6ddea4/shapely-2.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: d5251c28a29012e92de01d2e84f11637eb1d48184ee8f22e2df6c8c578d26760 + url: https://files.pythonhosted.org/packages/ec/1b/092fff53cbeced411eed2717592e31cadd3e52f0ebaba5f2df3f34913f96/shapely-2.0.5-cp311-cp311-win_amd64.whl + sha256: 6c6b78c0007a34ce7144f98b7418800e0a6a5d9a762f2244b00ea560525290c9 requires_dist: - numpy<3,>=1.14 - numpydoc==1.1.* ; extra == 'docs' @@ -40008,8 +40327,8 @@ packages: - kind: pypi name: shapely version: 2.0.5 - url: https://files.pythonhosted.org/packages/80/68/6b51b7587547f6bbd0965cf957505a0ebec93510e840572a983003b3a0a9/shapely-2.0.5-cp311-cp311-macosx_11_0_arm64.whl - sha256: 93be600cbe2fbaa86c8eb70656369f2f7104cd231f0d6585c7d0aa555d6878b8 + url: https://files.pythonhosted.org/packages/ed/a8/c8b0f1a165e161247caf0fc265d61de3c4ea27d7c313c7ebfb1c4f6ddea4/shapely-2.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: d5251c28a29012e92de01d2e84f11637eb1d48184ee8f22e2df6c8c578d26760 requires_dist: - numpy<3,>=1.14 - numpydoc==1.1.* ; extra == 'docs' @@ -40028,6 +40347,14 @@ packages: requires_dist: - rerun-sdk editable: true +- kind: pypi + name: shared-recording + version: 0.1.0 + path: examples/python/shared_recording + sha256: 6f605379e813578a2304663522ed82ab2fd6486cee725b969abd533b5ac8072f + requires_dist: + - rerun-sdk + editable: true - kind: pypi name: shellingham version: 1.5.4 @@ -40047,6 +40374,19 @@ packages: - scikit-learn>=1.1.3 - trimesh==3.15.2 editable: true +- kind: pypi + name: signed-distance-fields + version: 0.1.0 + path: examples/python/signed_distance_fields + sha256: 32880a8a3883c6aa03c709fe9138ba6b939633562ff98ca27fc22afc3d69f08a + requires_dist: + - mesh-to-sdf @ git+https://github.com/marian42/mesh_to_sdf.git + - numpy + - requests>=2.31,<3 + - rerun-sdk + - scikit-learn>=1.1.3 + - trimesh==3.15.2 + editable: true - kind: conda name: sigtool version: 0.1.3 @@ -40080,32 +40420,32 @@ packages: - kind: pypi name: simplejson version: 3.19.2 - url: https://files.pythonhosted.org/packages/a0/d8/f9e822563d5ccf9e199719a64db221f942c9a04cce17140c4b4fe51a25fc/simplejson-3.19.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: ef7938a78447174e2616be223f496ddccdbf7854f7bf2ce716dbccd958cc7d13 + url: https://files.pythonhosted.org/packages/53/a0/4430915cac272de9af75287f566cd1f06dffb69b3e9fa24b3c16b066470b/simplejson-3.19.2-cp311-cp311-macosx_11_0_arm64.whl + sha256: 08889f2f597ae965284d7b52a5c3928653a9406d88c93e3161180f0abc2433ba requires_python: '>=2.5,!=3.0.*,!=3.1.*,!=3.2.*' - kind: pypi name: simplejson version: 3.19.2 - url: https://files.pythonhosted.org/packages/b6/8e/3e12d122dfdf549a8d12eaf39954ee39f2027060aa38b63430f8ab3244e7/simplejson-3.19.2-cp311-cp311-win_amd64.whl - sha256: 9300aee2a8b5992d0f4293d88deb59c218989833e3396c824b69ba330d04a589 + url: https://files.pythonhosted.org/packages/70/c1/816573ae91aebf06a0fefd8ea30ca43127aa58e68684d2ddfe17c8457afb/simplejson-3.19.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 4d36081c0b1c12ea0ed62c202046dca11438bee48dd5240b7c8de8da62c620e9 requires_python: '>=2.5,!=3.0.*,!=3.1.*,!=3.2.*' - kind: pypi name: simplejson version: 3.19.2 - url: https://files.pythonhosted.org/packages/bc/eb/2bd4a6ec98329158f6855520596e9f2e521e2239e292d43fe1c58cf83a9b/simplejson-3.19.2-cp311-cp311-macosx_10_9_x86_64.whl - sha256: adcb3332979cbc941b8fff07181f06d2b608625edc0a4d8bc3ffc0be414ad0c4 + url: https://files.pythonhosted.org/packages/a0/d8/f9e822563d5ccf9e199719a64db221f942c9a04cce17140c4b4fe51a25fc/simplejson-3.19.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: ef7938a78447174e2616be223f496ddccdbf7854f7bf2ce716dbccd958cc7d13 requires_python: '>=2.5,!=3.0.*,!=3.1.*,!=3.2.*' - kind: pypi name: simplejson version: 3.19.2 - url: https://files.pythonhosted.org/packages/70/c1/816573ae91aebf06a0fefd8ea30ca43127aa58e68684d2ddfe17c8457afb/simplejson-3.19.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 4d36081c0b1c12ea0ed62c202046dca11438bee48dd5240b7c8de8da62c620e9 + url: https://files.pythonhosted.org/packages/b6/8e/3e12d122dfdf549a8d12eaf39954ee39f2027060aa38b63430f8ab3244e7/simplejson-3.19.2-cp311-cp311-win_amd64.whl + sha256: 9300aee2a8b5992d0f4293d88deb59c218989833e3396c824b69ba330d04a589 requires_python: '>=2.5,!=3.0.*,!=3.1.*,!=3.2.*' - kind: pypi name: simplejson version: 3.19.2 - url: https://files.pythonhosted.org/packages/53/a0/4430915cac272de9af75287f566cd1f06dffb69b3e9fa24b3c16b066470b/simplejson-3.19.2-cp311-cp311-macosx_11_0_arm64.whl - sha256: 08889f2f597ae965284d7b52a5c3928653a9406d88c93e3161180f0abc2433ba + url: https://files.pythonhosted.org/packages/bc/eb/2bd4a6ec98329158f6855520596e9f2e521e2239e292d43fe1c58cf83a9b/simplejson-3.19.2-cp311-cp311-macosx_10_9_x86_64.whl + sha256: adcb3332979cbc941b8fff07181f06d2b608625edc0a4d8bc3ffc0be414ad0c4 requires_python: '>=2.5,!=3.0.*,!=3.1.*,!=3.2.*' - kind: pypi name: six @@ -40220,8 +40560,8 @@ packages: - kind: pypi name: sounddevice version: 0.4.7 - url: https://files.pythonhosted.org/packages/d4/09/bfdd393f1bb1b90b4a6849b84972b7059c95e36818cc489922228d58cc63/sounddevice-0.4.7-py3-none-win_amd64.whl - sha256: 0c8b3543da1496f282b66a7bc54b755577ba638b1af06c146d4ac7f39d86b548 + url: https://files.pythonhosted.org/packages/1c/9c/d8de668a462b7a326d9f697dfa2adb6fbde07cc468cc7cdcf51cbe975d56/sounddevice-0.4.7-py3-none-macosx_10_6_x86_64.macosx_10_6_universal2.whl + sha256: d6ddfd341ad7412b14ca001f2c4dbf5fa2503bdc9eb15ad2c3105f6c260b698a requires_dist: - cffi>=1.0 - numpy ; extra == 'numpy' @@ -40229,8 +40569,8 @@ packages: - kind: pypi name: sounddevice version: 0.4.7 - url: https://files.pythonhosted.org/packages/1c/9c/d8de668a462b7a326d9f697dfa2adb6fbde07cc468cc7cdcf51cbe975d56/sounddevice-0.4.7-py3-none-macosx_10_6_x86_64.macosx_10_6_universal2.whl - sha256: d6ddfd341ad7412b14ca001f2c4dbf5fa2503bdc9eb15ad2c3105f6c260b698a + url: https://files.pythonhosted.org/packages/46/ea/e9196f01ec3c5ad537e1bb83fe08da3bacfbdfee8a872c461e491f489801/sounddevice-0.4.7-py3-none-any.whl + sha256: 1c3f18bfa4d9a257f5715f2ab83f2c0eb412a09f3e6a9fa73720886ca88f6bc7 requires_dist: - cffi>=1.0 - numpy ; extra == 'numpy' @@ -40238,8 +40578,8 @@ packages: - kind: pypi name: sounddevice version: 0.4.7 - url: https://files.pythonhosted.org/packages/46/ea/e9196f01ec3c5ad537e1bb83fe08da3bacfbdfee8a872c461e491f489801/sounddevice-0.4.7-py3-none-any.whl - sha256: 1c3f18bfa4d9a257f5715f2ab83f2c0eb412a09f3e6a9fa73720886ca88f6bc7 + url: https://files.pythonhosted.org/packages/d4/09/bfdd393f1bb1b90b4a6849b84972b7059c95e36818cc489922228d58cc63/sounddevice-0.4.7-py3-none-win_amd64.whl + sha256: 0c8b3543da1496f282b66a7bc54b755577ba638b1af06c146d4ac7f39d86b548 requires_dist: - cffi>=1.0 - numpy ; extra == 'numpy' @@ -40272,6 +40612,14 @@ packages: requires_dist: - rerun-sdk editable: true +- kind: pypi + name: stdio + version: 0.1.0 + path: examples/python/stdio + sha256: 15fb60d3e1c8b7b2d1a4dfcc223bddb267451e8ef7534d42f663d116166d92e2 + requires_dist: + - rerun-sdk + editable: true - kind: pypi name: stringcase version: 1.2.0 @@ -40289,6 +40637,18 @@ packages: - rerun-sdk - tqdm editable: true +- kind: pypi + name: structure-from-motion + version: 0.1.0 + path: examples/python/structure_from_motion + sha256: b20b79aa7bb2b4225b37d3cb28872a70dc7e9ab2ca9ab138b90d60fc8d7b4c15 + requires_dist: + - opencv-python>4.6 + - numpy + - requests>=2.31,<3 + - rerun-sdk + - tqdm + editable: true - kind: conda name: svt-av1 version: 2.1.2 @@ -40846,8 +41206,8 @@ packages: - kind: pypi name: tokenizers version: 0.19.1 - url: https://files.pythonhosted.org/packages/c8/d6/6e1d728d765eb4102767f071bf7f6439ab10d7f4a975c9217db65715207a/tokenizers-0.19.1-cp311-cp311-macosx_10_12_x86_64.whl - sha256: 5c88d1481f1882c2e53e6bb06491e474e420d9ac7bdff172610c4f9ad3898059 + url: https://files.pythonhosted.org/packages/90/79/d17a0f491d10817cd30f1121a07aa09c8e97a81114b116e473baf1577f09/tokenizers-0.19.1-cp311-cp311-macosx_11_0_arm64.whl + sha256: ddf672ed719b4ed82b51499100f5417d7d9f6fb05a65e232249268f35de5ed14 requires_dist: - huggingface-hub>=0.16.4,<1.0 - pytest ; extra == 'testing' @@ -40882,8 +41242,8 @@ packages: - kind: pypi name: tokenizers version: 0.19.1 - url: https://files.pythonhosted.org/packages/90/79/d17a0f491d10817cd30f1121a07aa09c8e97a81114b116e473baf1577f09/tokenizers-0.19.1-cp311-cp311-macosx_11_0_arm64.whl - sha256: ddf672ed719b4ed82b51499100f5417d7d9f6fb05a65e232249268f35de5ed14 + url: https://files.pythonhosted.org/packages/c8/d6/6e1d728d765eb4102767f071bf7f6439ab10d7f4a975c9217db65715207a/tokenizers-0.19.1-cp311-cp311-macosx_10_12_x86_64.whl + sha256: 5c88d1481f1882c2e53e6bb06491e474e420d9ac7bdff172610c4f9ad3898059 requires_dist: - huggingface-hub>=0.16.4,<1.0 - pytest ; extra == 'testing' @@ -40940,8 +41300,8 @@ packages: - kind: pypi name: torch version: 2.2.2 - url: https://files.pythonhosted.org/packages/c3/33/d7a6123231bd4d04c7005dde8507235772f3bc4622a25f3a88c016415d49/torch-2.2.2-cp311-cp311-manylinux1_x86_64.whl - sha256: ad4c03b786e074f46606f4151c0a1e3740268bcf29fbd2fdf6666d66341c1dcb + url: https://files.pythonhosted.org/packages/02/af/81abea3d73fddfde26afd1ce52a4ddfa389cd2b684c89d6c4d0d5d8d0dfa/torch-2.2.2-cp311-cp311-manylinux2014_aarch64.whl + sha256: 32827fa1fbe5da8851686256b4cd94cc7b11be962862c2293811c94eea9457bf requires_dist: - filelock - typing-extensions>=4.8.0 @@ -41048,8 +41408,8 @@ packages: - kind: pypi name: torch version: 2.2.2 - url: https://files.pythonhosted.org/packages/02/af/81abea3d73fddfde26afd1ce52a4ddfa389cd2b684c89d6c4d0d5d8d0dfa/torch-2.2.2-cp311-cp311-manylinux2014_aarch64.whl - sha256: 32827fa1fbe5da8851686256b4cd94cc7b11be962862c2293811c94eea9457bf + url: https://files.pythonhosted.org/packages/c3/33/d7a6123231bd4d04c7005dde8507235772f3bc4622a25f3a88c016415d49/torch-2.2.2-cp311-cp311-manylinux1_x86_64.whl + sha256: ad4c03b786e074f46606f4151c0a1e3740268bcf29fbd2fdf6666d66341c1dcb requires_dist: - filelock - typing-extensions>=4.8.0 @@ -41075,8 +41435,8 @@ packages: - kind: pypi name: torchvision version: 0.17.2 - url: https://files.pythonhosted.org/packages/56/8d/a153903bfd610450258ee7ac5d292d6b8f382aec14f49404845d8ba6207d/torchvision-0.17.2-cp311-cp311-manylinux2014_aarch64.whl - sha256: 833fd2e4216ced924c8aca0525733fe727f9a1af66dfad7c5be7257e97c39678 + url: https://files.pythonhosted.org/packages/36/15/c48f74f8f8d382677ef016b65f09969028a1549b8a518c18894deb95b544/torchvision-0.17.2-cp311-cp311-macosx_11_0_arm64.whl + sha256: e031004a1bc432c980a7bd642f6c189a3efc316e423fc30b5569837166a4e28d requires_dist: - numpy - torch==2.2.2 @@ -41086,8 +41446,8 @@ packages: - kind: pypi name: torchvision version: 0.17.2 - url: https://files.pythonhosted.org/packages/c6/75/d869f600fc33df8b8ca99943e165a4ca23b73c68dc1942098fde0a6b46f3/torchvision-0.17.2-cp311-cp311-win_amd64.whl - sha256: 6835897df852fad1015e6a106c167c83848114cbcc7d86112384a973404e4431 + url: https://files.pythonhosted.org/packages/46/95/179dd1bf8fd6bd689f0907f4baed557d2b12d2cf3d7ed1a8ecefe0a63d83/torchvision-0.17.2-cp311-cp311-macosx_10_13_x86_64.whl + sha256: 9b83e55ee7d0a1704f52b9c0ac87388e7a6d1d98a6bde7b0b35f9ab54d7bda54 requires_dist: - numpy - torch==2.2.2 @@ -41097,8 +41457,8 @@ packages: - kind: pypi name: torchvision version: 0.17.2 - url: https://files.pythonhosted.org/packages/46/95/179dd1bf8fd6bd689f0907f4baed557d2b12d2cf3d7ed1a8ecefe0a63d83/torchvision-0.17.2-cp311-cp311-macosx_10_13_x86_64.whl - sha256: 9b83e55ee7d0a1704f52b9c0ac87388e7a6d1d98a6bde7b0b35f9ab54d7bda54 + url: https://files.pythonhosted.org/packages/56/8d/a153903bfd610450258ee7ac5d292d6b8f382aec14f49404845d8ba6207d/torchvision-0.17.2-cp311-cp311-manylinux2014_aarch64.whl + sha256: 833fd2e4216ced924c8aca0525733fe727f9a1af66dfad7c5be7257e97c39678 requires_dist: - numpy - torch==2.2.2 @@ -41119,8 +41479,8 @@ packages: - kind: pypi name: torchvision version: 0.17.2 - url: https://files.pythonhosted.org/packages/36/15/c48f74f8f8d382677ef016b65f09969028a1549b8a518c18894deb95b544/torchvision-0.17.2-cp311-cp311-macosx_11_0_arm64.whl - sha256: e031004a1bc432c980a7bd642f6c189a3efc316e423fc30b5569837166a4e28d + url: https://files.pythonhosted.org/packages/c6/75/d869f600fc33df8b8ca99943e165a4ca23b73c68dc1942098fde0a6b46f3/torchvision-0.17.2-cp311-cp311-win_amd64.whl + sha256: 6835897df852fad1015e6a106c167c83848114cbcc7d86112384a973404e4431 requires_dist: - numpy - torch==2.2.2 @@ -41130,32 +41490,32 @@ packages: - kind: pypi name: tornado version: 6.4.1 - url: https://files.pythonhosted.org/packages/13/cf/786b8f1e6fe1c7c675e79657448178ad65e41c1c9765ef82e7f6f765c4c5/tornado-6.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4 + url: https://files.pythonhosted.org/packages/00/d9/c33be3c1a7564f7d42d87a8d186371a75fd142097076767a5c27da941fef/tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl + sha256: 163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8 requires_python: '>=3.8' - kind: pypi name: tornado version: 6.4.1 - url: https://files.pythonhosted.org/packages/d9/2f/3f2f05e84a7aff787a96d5fb06821323feb370fe0baed4db6ea7b1088f32/tornado-6.4.1-cp38-abi3-win_amd64.whl - sha256: b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7 + url: https://files.pythonhosted.org/packages/13/cf/786b8f1e6fe1c7c675e79657448178ad65e41c1c9765ef82e7f6f765c4c5/tornado-6.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4 requires_python: '>=3.8' - kind: pypi name: tornado version: 6.4.1 - url: https://files.pythonhosted.org/packages/2e/0f/721e113a2fac2f1d7d124b3279a1da4c77622e104084f56119875019ffab/tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl - sha256: 6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14 + url: https://files.pythonhosted.org/packages/22/d4/54f9d12668b58336bd30defe0307e6c61589a3e687b05c366f804b7faaf0/tornado-6.4.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3 requires_python: '>=3.8' - kind: pypi name: tornado version: 6.4.1 - url: https://files.pythonhosted.org/packages/22/d4/54f9d12668b58336bd30defe0307e6c61589a3e687b05c366f804b7faaf0/tornado-6.4.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3 + url: https://files.pythonhosted.org/packages/2e/0f/721e113a2fac2f1d7d124b3279a1da4c77622e104084f56119875019ffab/tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl + sha256: 6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14 requires_python: '>=3.8' - kind: pypi name: tornado version: 6.4.1 - url: https://files.pythonhosted.org/packages/00/d9/c33be3c1a7564f7d42d87a8d186371a75fd142097076767a5c27da941fef/tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl - sha256: 163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8 + url: https://files.pythonhosted.org/packages/d9/2f/3f2f05e84a7aff787a96d5fb06821323feb370fe0baed4db6ea7b1088f32/tornado-6.4.1-cp38-abi3-win_amd64.whl + sha256: b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7 requires_python: '>=3.8' - kind: pypi name: tqdm @@ -42378,8 +42738,8 @@ packages: - kind: pypi name: uv version: 0.2.26 - url: https://files.pythonhosted.org/packages/93/22/f39356b5519e2ff7dad7cc2a45146fd144659cae48ef5c6ce054d655b7cc/uv-0.2.26-py3-none-manylinux_2_28_aarch64.whl - sha256: c1ba6064f8bff59e3e6a7c59cf27ce4cffc6bf2eed1777134522b65c562f9206 + url: https://files.pythonhosted.org/packages/0f/b6/cbb68a3b7faf7afa406d38b6d94065f759cac1b13a0a15dffa5bf7d7b60f/uv-0.2.26-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 65120080bbd2f2ce47e92f6065e223f2f416feb3a323ea9574d3e993b7ebde9f requires_python: '>=3.8' - kind: pypi name: uv @@ -42390,8 +42750,8 @@ packages: - kind: pypi name: uv version: 0.2.26 - url: https://files.pythonhosted.org/packages/ee/d1/d0311b79198f5f07809edcb6b71f38f8e8e0d848194ff0f5bfcd1cd941fe/uv-0.2.26-py3-none-win_amd64.whl - sha256: 05949e0135d5093d555f17ca6701e5939547d8a656bec003b7986e3540533348 + url: https://files.pythonhosted.org/packages/93/22/f39356b5519e2ff7dad7cc2a45146fd144659cae48ef5c6ce054d655b7cc/uv-0.2.26-py3-none-manylinux_2_28_aarch64.whl + sha256: c1ba6064f8bff59e3e6a7c59cf27ce4cffc6bf2eed1777134522b65c562f9206 requires_python: '>=3.8' - kind: pypi name: uv @@ -42402,50 +42762,50 @@ packages: - kind: pypi name: uv version: 0.2.26 - url: https://files.pythonhosted.org/packages/0f/b6/cbb68a3b7faf7afa406d38b6d94065f759cac1b13a0a15dffa5bf7d7b60f/uv-0.2.26-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 65120080bbd2f2ce47e92f6065e223f2f416feb3a323ea9574d3e993b7ebde9f + url: https://files.pythonhosted.org/packages/ee/d1/d0311b79198f5f07809edcb6b71f38f8e8e0d848194ff0f5bfcd1cd941fe/uv-0.2.26-py3-none-win_amd64.whl + sha256: 05949e0135d5093d555f17ca6701e5939547d8a656bec003b7986e3540533348 requires_python: '>=3.8' - kind: pypi name: uv version: 0.2.27 - url: https://files.pythonhosted.org/packages/db/a7/b4a48f4cd49fab545c6e5bb743e3569aff0869625bb22bd233d958fd15a5/uv-0.2.27-py3-none-manylinux_2_28_aarch64.whl - sha256: d33d54d8119bb5dd52c52f3d78efd61064ae650d0105b65b471eb0de48f5c4ba + url: https://files.pythonhosted.org/packages/be/53/b3e7e74acc2cf91861abfaabf11255df26d82871e1d3fcfec1c3c9b6dcd0/uv-0.2.27-py3-none-macosx_11_0_arm64.whl + sha256: 8a44fc58726f353645c64ccde00338e73fa97aa42bbeb3bd6a8269c0b9386954 requires_python: '>=3.8' - kind: pypi name: uv version: 0.2.27 - url: https://files.pythonhosted.org/packages/be/53/b3e7e74acc2cf91861abfaabf11255df26d82871e1d3fcfec1c3c9b6dcd0/uv-0.2.27-py3-none-macosx_11_0_arm64.whl - sha256: 8a44fc58726f353645c64ccde00338e73fa97aa42bbeb3bd6a8269c0b9386954 + url: https://files.pythonhosted.org/packages/ce/c8/553675aaa47659254efe2f081763d3075908726fa9b23b4a345105402e8e/uv-0.2.27-py3-none-macosx_10_12_x86_64.whl + sha256: f0ee3caf45a0be203e6edff62caa9e7cdc3863172e15869c24fc41847c83e5e5 requires_python: '>=3.8' - kind: pypi name: uv version: 0.2.27 - url: https://files.pythonhosted.org/packages/ed/1d/74d7009e57a85c6baedfb7bdf51481523b4a931eddb106c89f287dc278c8/uv-0.2.27-py3-none-win_amd64.whl - sha256: 7921c9eb9feb3b7a9cb6f4afab58718a5a07752d834c2de72b7d294bff963789 + url: https://files.pythonhosted.org/packages/d2/e1/7a440859152966a948fdde0375f70dd3f52b05e1a1783f26641238f17e2b/uv-0.2.27-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: a6bfe663a8c08b95b58c37811de37cc6da51abf18fe0e982006a56b4eb34a5e4 requires_python: '>=3.8' - kind: pypi name: uv version: 0.2.27 - url: https://files.pythonhosted.org/packages/ce/c8/553675aaa47659254efe2f081763d3075908726fa9b23b4a345105402e8e/uv-0.2.27-py3-none-macosx_10_12_x86_64.whl - sha256: f0ee3caf45a0be203e6edff62caa9e7cdc3863172e15869c24fc41847c83e5e5 + url: https://files.pythonhosted.org/packages/db/a7/b4a48f4cd49fab545c6e5bb743e3569aff0869625bb22bd233d958fd15a5/uv-0.2.27-py3-none-manylinux_2_28_aarch64.whl + sha256: d33d54d8119bb5dd52c52f3d78efd61064ae650d0105b65b471eb0de48f5c4ba requires_python: '>=3.8' - kind: pypi name: uv version: 0.2.27 - url: https://files.pythonhosted.org/packages/d2/e1/7a440859152966a948fdde0375f70dd3f52b05e1a1783f26641238f17e2b/uv-0.2.27-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: a6bfe663a8c08b95b58c37811de37cc6da51abf18fe0e982006a56b4eb34a5e4 + url: https://files.pythonhosted.org/packages/ed/1d/74d7009e57a85c6baedfb7bdf51481523b4a931eddb106c89f287dc278c8/uv-0.2.27-py3-none-win_amd64.whl + sha256: 7921c9eb9feb3b7a9cb6f4afab58718a5a07752d834c2de72b7d294bff963789 requires_python: '>=3.8' - kind: pypi name: uv version: 0.2.28 - url: https://files.pythonhosted.org/packages/80/d2/b8206aa8b4de05388cae473f87a06e6be80cfcc6ba6dd8313a4be9647252/uv-0.2.28-py3-none-manylinux_2_28_aarch64.whl - sha256: 894a9929f8deb9c15cf84c98fb89e8e2c3dcf6e9fd6da8c81e7b9a22c86d661e + url: https://files.pythonhosted.org/packages/69/68/34dc06721be38c4d90c717a34d8d0f7441d83d8f0efb2126a7026204e7dc/uv-0.2.28-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 8fc4185ee3bc644e38421a82a942fa5c7864d6eeaa04fd59e1ae577e2e5b76ea requires_python: '>=3.8' - kind: pypi name: uv version: 0.2.28 - url: https://files.pythonhosted.org/packages/69/68/34dc06721be38c4d90c717a34d8d0f7441d83d8f0efb2126a7026204e7dc/uv-0.2.28-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 8fc4185ee3bc644e38421a82a942fa5c7864d6eeaa04fd59e1ae577e2e5b76ea + url: https://files.pythonhosted.org/packages/80/d2/b8206aa8b4de05388cae473f87a06e6be80cfcc6ba6dd8313a4be9647252/uv-0.2.28-py3-none-manylinux_2_28_aarch64.whl + sha256: 894a9929f8deb9c15cf84c98fb89e8e2c3dcf6e9fd6da8c81e7b9a22c86d661e requires_python: '>=3.8' - kind: conda name: vc @@ -42661,32 +43021,32 @@ packages: - kind: pypi name: wrapt version: 1.16.0 - url: https://files.pythonhosted.org/packages/7f/a7/f1212ba098f3de0fd244e2de0f8791ad2539c03bef6c05a9fcb03e45b089/wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389 + url: https://files.pythonhosted.org/packages/0f/16/ea627d7817394db04518f62934a5de59874b587b792300991b3c347ff5e0/wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl + sha256: 75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d requires_python: '>=3.6' - kind: pypi name: wrapt version: 1.16.0 - url: https://files.pythonhosted.org/packages/fd/03/c188ac517f402775b90d6f312955a5e53b866c964b32119f2ed76315697e/wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09 + url: https://files.pythonhosted.org/packages/6e/52/2da48b35193e39ac53cfb141467d9f259851522d0e8c87153f0ba4205fb1/wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1 requires_python: '>=3.6' - kind: pypi name: wrapt version: 1.16.0 - url: https://files.pythonhosted.org/packages/cf/c3/0084351951d9579ae83a3d9e38c140371e4c6b038136909235079f2e6e78/wrapt-1.16.0-cp311-cp311-win_amd64.whl - sha256: aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89 + url: https://files.pythonhosted.org/packages/7f/a7/f1212ba098f3de0fd244e2de0f8791ad2539c03bef6c05a9fcb03e45b089/wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389 requires_python: '>=3.6' - kind: pypi name: wrapt version: 1.16.0 - url: https://files.pythonhosted.org/packages/0f/16/ea627d7817394db04518f62934a5de59874b587b792300991b3c347ff5e0/wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl - sha256: 75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d + url: https://files.pythonhosted.org/packages/cf/c3/0084351951d9579ae83a3d9e38c140371e4c6b038136909235079f2e6e78/wrapt-1.16.0-cp311-cp311-win_amd64.whl + sha256: aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89 requires_python: '>=3.6' - kind: pypi name: wrapt version: 1.16.0 - url: https://files.pythonhosted.org/packages/6e/52/2da48b35193e39ac53cfb141467d9f259851522d0e8c87153f0ba4205fb1/wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1 + url: https://files.pythonhosted.org/packages/fd/03/c188ac517f402775b90d6f312955a5e53b866c964b32119f2ed76315697e/wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09 requires_python: '>=3.6' - kind: conda name: x264 @@ -43803,8 +44163,8 @@ packages: - kind: pypi name: zstandard version: 0.23.0 - url: https://files.pythonhosted.org/packages/9e/40/f67e7d2c25a0e2dc1744dd781110b0b60306657f8696cafb7ad7579469bd/zstandard-0.23.0-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 34895a41273ad33347b2fc70e1bff4240556de3c46c6ea430a7ed91f9042aa4e + url: https://files.pythonhosted.org/packages/76/3f/dbafccf19cfeca25bbabf6f2dd81796b7218f768ec400f043edc767015a6/zstandard-0.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: fd30d9c67d13d891f2360b2a120186729c111238ac63b43dbd37a5a40670b8ca requires_dist: - cffi>=1.11 ; platform_python_implementation == 'PyPy' - cffi>=1.11 ; extra == 'cffi' @@ -43812,8 +44172,8 @@ packages: - kind: pypi name: zstandard version: 0.23.0 - url: https://files.pythonhosted.org/packages/be/a2/4272175d47c623ff78196f3c10e9dc7045c1b9caf3735bf041e65271eca4/zstandard-0.23.0-cp311-cp311-win_amd64.whl - sha256: 62136da96a973bd2557f06ddd4e8e807f9e13cbb0bfb9cc06cfe6d98ea90dfe0 + url: https://files.pythonhosted.org/packages/9e/40/f67e7d2c25a0e2dc1744dd781110b0b60306657f8696cafb7ad7579469bd/zstandard-0.23.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 34895a41273ad33347b2fc70e1bff4240556de3c46c6ea430a7ed91f9042aa4e requires_dist: - cffi>=1.11 ; platform_python_implementation == 'PyPy' - cffi>=1.11 ; extra == 'cffi' @@ -43821,8 +44181,8 @@ packages: - kind: pypi name: zstandard version: 0.23.0 - url: https://files.pythonhosted.org/packages/e8/46/66d5b55f4d737dd6ab75851b224abf0afe5774976fe511a54d2eb9063a41/zstandard-0.23.0-cp311-cp311-macosx_11_0_arm64.whl - sha256: 77ea385f7dd5b5676d7fd943292ffa18fbf5c72ba98f7d09fc1fb9e819b34c23 + url: https://files.pythonhosted.org/packages/be/a2/4272175d47c623ff78196f3c10e9dc7045c1b9caf3735bf041e65271eca4/zstandard-0.23.0-cp311-cp311-win_amd64.whl + sha256: 62136da96a973bd2557f06ddd4e8e807f9e13cbb0bfb9cc06cfe6d98ea90dfe0 requires_dist: - cffi>=1.11 ; platform_python_implementation == 'PyPy' - cffi>=1.11 ; extra == 'cffi' @@ -43830,8 +44190,8 @@ packages: - kind: pypi name: zstandard version: 0.23.0 - url: https://files.pythonhosted.org/packages/76/3f/dbafccf19cfeca25bbabf6f2dd81796b7218f768ec400f043edc767015a6/zstandard-0.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: fd30d9c67d13d891f2360b2a120186729c111238ac63b43dbd37a5a40670b8ca + url: https://files.pythonhosted.org/packages/e8/46/66d5b55f4d737dd6ab75851b224abf0afe5774976fe511a54d2eb9063a41/zstandard-0.23.0-cp311-cp311-macosx_11_0_arm64.whl + sha256: 77ea385f7dd5b5676d7fd943292ffa18fbf5c72ba98f7d09fc1fb9e819b34c23 requires_dist: - cffi>=1.11 ; platform_python_implementation == 'PyPy' - cffi>=1.11 ; extra == 'cffi' diff --git a/pixi.toml b/pixi.toml index 1ed775f7f2c8..704f967f286f 100644 --- a/pixi.toml +++ b/pixi.toml @@ -420,7 +420,6 @@ gitignore-parser = ">=0.1.9" gitpython = ">=3.1.40" jinja2 = ">=3.1.3,<3.2" # For `update_pr_bodies.py`, `generate_pr_summary.py`, `build_screenshot_compare.py` and other utilities that build websites. mypy = "1.8.0" -nasm = ">=2.16" ninja = "1.11.1" numpy = ">=1.23,<2" prettier = "3.2.5.*" From 0b2c27ced73e4b485bc3345ee3e83cfbede8e99b Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Tue, 1 Oct 2024 16:47:30 +0200 Subject: [PATCH 06/61] Almost got it to compile! --- crates/store/re_video/src/decode/av1.rs | 14 +- crates/store/re_video/src/decode/mod.rs | 10 +- crates/store/re_video/src/demux/mod.rs | 4 +- crates/store/re_video/src/lib.rs | 20 ++- .../re_renderer/src/video/decoder/native.rs | 138 ++++++++++++------ .../re_renderer/src/video/decoder/web.rs | 2 +- 6 files changed, 123 insertions(+), 65 deletions(-) diff --git a/crates/store/re_video/src/decode/av1.rs b/crates/store/re_video/src/decode/av1.rs index cd0fa225ca42..96b76d068a7b 100644 --- a/crates/store/re_video/src/decode/av1.rs +++ b/crates/store/re_video/src/decode/av1.rs @@ -9,7 +9,9 @@ use crossbeam::{ }; use dav1d::{PixelLayout, PlanarImageComponent}; -use super::{Chunk, Frame, PixelFormat, TimeMs}; +use crate::Time; + +use super::{Chunk, Frame, PixelFormat}; pub struct Decoder { _thread: std::thread::JoinHandle<()>, @@ -379,12 +381,10 @@ fn i444_to_rgba(picture: &dav1d::Picture) -> Vec { rgba } -// We need to convert between `TimeMs` and `i64` because `dav1d` uses `i64` for timestamps. -fn time_to_i64(time: TimeMs) -> i64 { - // multiply by 1000 to lose less precision - (time.as_f64() * 1000.0) as i64 +fn time_to_i64(time: Time) -> i64 { + time.0 as _ // TODO: what is the timescale of dav1d? } -fn i64_to_time(i64: i64) -> TimeMs { - TimeMs::new(i64 as f64 / 1000.0) +fn i64_to_time(i64: i64) -> Time { + Time::new(i64 as _) // TODO: what is the timescale of dav1d? } diff --git a/crates/store/re_video/src/decode/mod.rs b/crates/store/re_video/src/decode/mod.rs index 7853d93bc7fc..a3a777097f80 100644 --- a/crates/store/re_video/src/decode/mod.rs +++ b/crates/store/re_video/src/decode/mod.rs @@ -2,12 +2,12 @@ pub mod av1; -use crate::TimeMs; +use crate::Time; pub struct Chunk { pub data: Vec, - pub timestamp: TimeMs, - pub duration: TimeMs, + pub timestamp: Time, + pub duration: Time, } pub struct Frame { @@ -15,8 +15,8 @@ pub struct Frame { pub width: u32, pub height: u32, pub format: PixelFormat, - pub timestamp: TimeMs, - pub duration: TimeMs, + pub timestamp: Time, + pub duration: Time, } pub enum PixelFormat { diff --git a/crates/store/re_video/src/demux/mod.rs b/crates/store/re_video/src/demux/mod.rs index f3930d7e74a7..4dc30a41be0d 100644 --- a/crates/store/re_video/src/demux/mod.rs +++ b/crates/store/re_video/src/demux/mod.rs @@ -156,11 +156,13 @@ impl Segment { #[derive(Debug, Clone)] pub struct Sample { /// Time at which this sample appears in the decoded bitstream, in time units. + /// + /// `decode_timestamp <= composition_timestamp` pub decode_timestamp: Time, /// Time at which this sample appears in the frame stream, in time units. /// - /// `composition >= decode` + /// `decode_timestamp <= composition_timestamp` pub composition_timestamp: Time, /// Duration of the sample, in time units. diff --git a/crates/store/re_video/src/lib.rs b/crates/store/re_video/src/lib.rs index 25a1beedd467..c5de8280f8b2 100644 --- a/crates/store/re_video/src/lib.rs +++ b/crates/store/re_video/src/lib.rs @@ -1,10 +1,10 @@ //! Video decoding library. -pub mod decode; -pub mod demux; +mod decode; +mod demux; -pub use decode::{av1, Frame}; -pub use demux::{VideoData, VideoLoadError}; +pub use decode::{av1, Chunk, Frame, PixelFormat}; +pub use demux::{Sample, VideoData, VideoLoadError}; pub use re_mp4::{TrackId, TrackKind}; use ordered_float::OrderedFloat; @@ -26,10 +26,11 @@ impl TimeMs { /// A value in time units. #[derive(Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub struct Time(u64); +pub struct Time(u64); // TODO: i64 impl Time { pub const ZERO: Self = Self(0); + pub const MAX: Self = Self(u64::MAX); /// Create a new value in _time units_. /// @@ -83,6 +84,15 @@ impl Time { } } +impl std::ops::Sub for Time { + type Output = Self; + + #[inline] + fn sub(self, rhs: Self) -> Self::Output { + Self(self.0.saturating_sub(rhs.0)) + } +} + /// The number of time units per second. #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] pub struct Timescale(u64); diff --git a/crates/viewer/re_renderer/src/video/decoder/native.rs b/crates/viewer/re_renderer/src/video/decoder/native.rs index 1135cfd909a6..73bbfa929873 100644 --- a/crates/viewer/re_renderer/src/video/decoder/native.rs +++ b/crates/viewer/re_renderer/src/video/decoder/native.rs @@ -13,8 +13,7 @@ use crate::{video::FrameDecodingResult, RenderContext}; use super::latest_at_idx; use parking_lot::Mutex; -use re_video::TimeMs; -use re_video::{decode::Frame, Time}; +use re_video::{Frame, Time}; use super::alloc_video_frame_texture; @@ -24,10 +23,10 @@ pub struct VideoDecoder { queue: Arc, texture: GpuTexture2D, zeroed_texture: GpuTexture2D, - decoder: re_video::decode::av1::Decoder, + decoder: re_video::av1::Decoder, frames: Arc>>, - last_used_frame_timestamp: TimeMs, + last_used_frame_timestamp: Time, current_segment_idx: usize, current_sample_idx: usize, } @@ -37,13 +36,14 @@ impl VideoDecoder { render_context: &RenderContext, data: Arc, _hw_acceleration: DecodeHardwareAcceleration, - ) -> Option { + ) -> Result { let frames = Arc::new(Mutex::new(Vec::new())); + // TODO: check that data is av1, and return error elsewise // TEMP: assuming `av1`, because `re_video` demuxer will panic if it's not - let decoder = re_video::decode::av1::Decoder::new({ + let decoder = re_video::av1::Decoder::new({ let frames = frames.clone(); - move |frame: re_video::decode::Frame| { + move |frame: re_video::Frame| { frames.lock().push(frame); } }); @@ -63,7 +63,7 @@ impl VideoDecoder { data.config.coded_height as u32, ); - Some(Self { + Ok(Self { data, queue, texture, @@ -71,7 +71,7 @@ impl VideoDecoder { decoder, frames, - last_used_frame_timestamp: TimeMs::new(f64::MAX), + last_used_frame_timestamp: Time::MAX, current_segment_idx: usize::MAX, current_sample_idx: usize::MAX, }) @@ -128,12 +128,12 @@ impl VideoDecoder { requested_segment_idx as isize - self.current_segment_idx as isize; if segment_distance == 1 { // forward seek to next segment - queue up the one _after_ requested - self.enqueue_all(requested_segment_idx + 1); + self.enqueue_segment(requested_segment_idx + 1); } else { // forward seek by N>1 OR backward seek across segments - reset self.reset(); - self.enqueue_all(requested_segment_idx); - self.enqueue_all(requested_segment_idx + 1); + self.enqueue_segment(requested_segment_idx); + self.enqueue_segment(requested_segment_idx + 1); } } else if requested_sample_idx != self.current_sample_idx { // special case: handle seeking backwards within a single segment @@ -142,8 +142,8 @@ impl VideoDecoder { let sample_distance = requested_sample_idx as isize - self.current_sample_idx as isize; if sample_distance < 0 { self.reset(); - self.enqueue_all(requested_segment_idx); - self.enqueue_all(requested_segment_idx + 1); + self.enqueue_segment(requested_segment_idx); + self.enqueue_segment(requested_segment_idx + 1); } } @@ -171,61 +171,54 @@ impl VideoDecoder { let frame_idx = 0; let frame = &frames[frame_idx]; - // https://w3c.github.io/webcodecs/#output-videoframes 1. 1. states: - // Let timestamp and duration be the timestamp and duration from the EncodedVideoChunk associated with output. - // we always provide both, so they should always be available - let frame_timestamp_ms = frame.timestamp().map(TimeMs::new).unwrap_or_default(); - let frame_duration_ms = frame.duration().map(TimeMs::new).unwrap_or_default(); - // This handles the case when we have a buffered frame that's older than the requested timestamp. // We don't want to show this frame to the user, because it's not actually the one they requested, // so instead return the last decoded frame. - if presentation_timestamp - frame_timestamp_ms > frame_duration_ms { + if presentation_timestamp - frame.timestamp > frame.duration { return Ok(VideoFrameTexture::Pending(self.texture.clone())); } - if self.last_used_frame_timestamp != frame_timestamp_ms { + if self.last_used_frame_timestamp != frame.timestamp { + self.last_used_frame_timestamp = frame.timestamp; copy_video_frame_to_texture(&self.queue, frame, &self.texture.texture); - self.last_used_frame_timestamp = frame_timestamp_ms; } - self.texture.clone() + Ok(VideoFrameTexture::Ready(self.texture.clone())) } /// Enqueue all samples in the given segment. /// /// Does nothing if the index is out of bounds. - fn enqueue_all(&self, segment_idx: usize) { + fn enqueue_segment(&self, segment_idx: usize) -> Result<(), DecodingError> { let Some(segment) = self.data.segments.get(segment_idx) else { - return; + return Ok(()); }; - self.enqueue(&segment.samples[0], true); - for sample in &segment.samples[1..] { - self.enqueue(sample, false); + let samples = &self.data.samples[segment.range()]; + + // The first sample in a segment is always a key frame: + self.enqueue_sample(&samples[0], true)?; + for sample in &samples[1..] { + self.enqueue_sample(sample, false)?; } + + Ok(()) } /// Enqueue the given sample. - fn enqueue(&self, sample: &re_video::Sample, is_key: bool) { - let data = Uint8Array::from(&self.data.get(sample)); - let type_ = if is_key { - EncodedVideoChunkType::Key - } else { - EncodedVideoChunkType::Delta - }; - let chunk = EncodedVideoChunkInit::new(&data, sample.timestamp.as_f64(), type_); - chunk.set_duration(sample.duration.as_f64()); - let Some(chunk) = EncodedVideoChunk::new(&chunk) - .inspect_err(|err| { - re_log::error!("failed to create video chunk: {}", js_error_to_string(err)); - }) - .ok() - else { - return; + fn enqueue_sample(&self, sample: &re_video::Sample, is_key: bool) -> Result<(), DecodingError> { + let data = &self.data.data[sample.byte_offset as usize + ..sample.byte_offset as usize + sample.byte_length as usize]; // TODO: range check + + let chunk = re_video::Chunk { + data: data.to_vec(), + timestamp: sample.decode_timestamp, + duration: sample.duration, }; - self.decoder.decode(&chunk); + self.decoder.decode(chunk); + + Ok(()) } /// Reset the video decoder and discard all frames. @@ -236,3 +229,56 @@ impl VideoDecoder { drop(frames.drain(..)); } } + +fn copy_video_frame_to_texture( + queue: &Queue, + frame: &Frame, + texture: &wgpu::Texture, +) -> Result { + let size = wgpu::Extent3d { + width: frame.display_width(), + height: frame.display_height(), + depth_or_array_layers: 1, + }; + let source = { + // TODO(jan): The wgpu version we're using doesn't support `VideoFrame` yet. + // This got fixed in https://github.com/gfx-rs/wgpu/pull/6170 but hasn't shipped yet. + // So instead, we just pretend this is a `HtmlVideoElement` instead. + // SAFETY: Depends on the fact that `wgpu` passes the object through as-is, + // and doesn't actually inspect it in any way. The browser then does its own + // typecheck that doesn't care what kind of image source wgpu gave it. + #[allow(unsafe_code)] + let frame = unsafe { + std::mem::transmute::( + frame.clone().expect("Failed to clone the video frame"), + ) + }; + // Fake width & height to work around wgpu validating this as if it was a `HtmlVideoElement`. + // Since it thinks this is a `HtmlVideoElement`, it will want to call `videoWidth` and `videoHeight` + // on it to validate the size. + // We simply redirect `displayWidth`/`displayHeight` to `videoWidth`/`videoHeight` to make it work! + let display_width = js_sys::Reflect::get(&frame, &"displayWidth".into()) + .expect("Failed to get displayWidth property from VideoFrame."); + js_sys::Reflect::set(&frame, &"videoWidth".into(), &display_width) + .expect("Failed to set videoWidth property."); + let display_height = js_sys::Reflect::get(&frame, &"displayHeight".into()) + .expect("Failed to get displayHeight property from VideoFrame."); + js_sys::Reflect::set(&frame, &"videoHeight".into(), &display_height) + .expect("Failed to set videoHeight property."); + + wgpu_types::ImageCopyExternalImage { + source: wgpu_types::ExternalImageSource::HTMLVideoElement(frame), + origin: wgpu_types::Origin2d { x: 0, y: 0 }, + flip_y: false, + } + }; + let dest = wgpu::ImageCopyTextureTagged { + texture, + mip_level: 0, + origin: wgpu::Origin3d { x: 0, y: 0, z: 0 }, + aspect: wgpu::TextureAspect::All, + color_space: wgpu::PredefinedColorSpace::Srgb, + premultiplied_alpha: false, + }; + queue.copy_external_image_to_texture(&source, dest, size); +} diff --git a/crates/viewer/re_renderer/src/video/decoder/web.rs b/crates/viewer/re_renderer/src/video/decoder/web.rs index 9bfa280385e1..e74f8fc98f7c 100644 --- a/crates/viewer/re_renderer/src/video/decoder/web.rs +++ b/crates/viewer/re_renderer/src/video/decoder/web.rs @@ -150,7 +150,7 @@ impl VideoDecoder { decoder_output, hw_acceleration, - last_used_frame_timestamp: Time::new(u64::MAX), + last_used_frame_timestamp: Time::MAX, current_segment_idx: usize::MAX, current_sample_idx: usize::MAX, From 1bd8b56297ed56133033193df7f69ede62d2201d Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Tue, 1 Oct 2024 22:32:29 +0200 Subject: [PATCH 07/61] Get it compiling --- .../re_renderer/src/video/decoder/native.rs | 90 +++++++++---------- 1 file changed, 40 insertions(+), 50 deletions(-) diff --git a/crates/viewer/re_renderer/src/video/decoder/native.rs b/crates/viewer/re_renderer/src/video/decoder/native.rs index 73bbfa929873..16ff16e87175 100644 --- a/crates/viewer/re_renderer/src/video/decoder/native.rs +++ b/crates/viewer/re_renderer/src/video/decoder/native.rs @@ -94,6 +94,8 @@ impl VideoDecoder { render_ctx: &RenderContext, presentation_timestamp_s: f64, ) -> FrameDecodingResult { + re_tracing::profile_function!(); + if presentation_timestamp_s < 0.0 { return Err(DecodingError::NegativeTimestamp); } @@ -128,12 +130,12 @@ impl VideoDecoder { requested_segment_idx as isize - self.current_segment_idx as isize; if segment_distance == 1 { // forward seek to next segment - queue up the one _after_ requested - self.enqueue_segment(requested_segment_idx + 1); + self.enqueue_segment(requested_segment_idx + 1)?; } else { // forward seek by N>1 OR backward seek across segments - reset self.reset(); - self.enqueue_segment(requested_segment_idx); - self.enqueue_segment(requested_segment_idx + 1); + self.enqueue_segment(requested_segment_idx)?; + self.enqueue_segment(requested_segment_idx + 1)?; } } else if requested_sample_idx != self.current_sample_idx { // special case: handle seeking backwards within a single segment @@ -142,8 +144,8 @@ impl VideoDecoder { let sample_distance = requested_sample_idx as isize - self.current_sample_idx as isize; if sample_distance < 0 { self.reset(); - self.enqueue_segment(requested_segment_idx); - self.enqueue_segment(requested_segment_idx + 1); + self.enqueue_segment(requested_segment_idx)?; + self.enqueue_segment(requested_segment_idx + 1)?; } } @@ -180,7 +182,7 @@ impl VideoDecoder { if self.last_used_frame_timestamp != frame.timestamp { self.last_used_frame_timestamp = frame.timestamp; - copy_video_frame_to_texture(&self.queue, frame, &self.texture.texture); + copy_video_frame_to_texture(&self.queue, frame, &self.texture.texture)? } Ok(VideoFrameTexture::Ready(self.texture.clone())) @@ -231,54 +233,42 @@ impl VideoDecoder { } fn copy_video_frame_to_texture( - queue: &Queue, + queue: &wgpu::Queue, frame: &Frame, texture: &wgpu::Texture, -) -> Result { +) -> Result<(), DecodingError> { let size = wgpu::Extent3d { - width: frame.display_width(), - height: frame.display_height(), + width: frame.width, + height: frame.height, depth_or_array_layers: 1, }; - let source = { - // TODO(jan): The wgpu version we're using doesn't support `VideoFrame` yet. - // This got fixed in https://github.com/gfx-rs/wgpu/pull/6170 but hasn't shipped yet. - // So instead, we just pretend this is a `HtmlVideoElement` instead. - // SAFETY: Depends on the fact that `wgpu` passes the object through as-is, - // and doesn't actually inspect it in any way. The browser then does its own - // typecheck that doesn't care what kind of image source wgpu gave it. - #[allow(unsafe_code)] - let frame = unsafe { - std::mem::transmute::( - frame.clone().expect("Failed to clone the video frame"), - ) - }; - // Fake width & height to work around wgpu validating this as if it was a `HtmlVideoElement`. - // Since it thinks this is a `HtmlVideoElement`, it will want to call `videoWidth` and `videoHeight` - // on it to validate the size. - // We simply redirect `displayWidth`/`displayHeight` to `videoWidth`/`videoHeight` to make it work! - let display_width = js_sys::Reflect::get(&frame, &"displayWidth".into()) - .expect("Failed to get displayWidth property from VideoFrame."); - js_sys::Reflect::set(&frame, &"videoWidth".into(), &display_width) - .expect("Failed to set videoWidth property."); - let display_height = js_sys::Reflect::get(&frame, &"displayHeight".into()) - .expect("Failed to get displayHeight property from VideoFrame."); - js_sys::Reflect::set(&frame, &"videoHeight".into(), &display_height) - .expect("Failed to set videoHeight property."); - - wgpu_types::ImageCopyExternalImage { - source: wgpu_types::ExternalImageSource::HTMLVideoElement(frame), - origin: wgpu_types::Origin2d { x: 0, y: 0 }, - flip_y: false, - } - }; - let dest = wgpu::ImageCopyTextureTagged { - texture, - mip_level: 0, - origin: wgpu::Origin3d { x: 0, y: 0, z: 0 }, - aspect: wgpu::TextureAspect::All, - color_space: wgpu::PredefinedColorSpace::Srgb, - premultiplied_alpha: false, + + let format = match frame.format { + re_video::PixelFormat::Rgba8Unorm => wgpu::TextureFormat::Rgba8Unorm, }; - queue.copy_external_image_to_texture(&source, dest, size); + + let width_blocks = frame.width / format.block_dimensions().0; + let block_size = format + .block_copy_size(Some(wgpu::TextureAspect::All)) + .unwrap(); // TODO + let bytes_per_row_unaligned = width_blocks * block_size; + + re_tracing::profile_scope!("write_texture"); + queue.write_texture( + wgpu::ImageCopyTexture { + texture, + mip_level: 0, + origin: wgpu::Origin3d::ZERO, + aspect: wgpu::TextureAspect::All, + }, + &frame.data, + wgpu::ImageDataLayout { + offset: 0, + bytes_per_row: Some(bytes_per_row_unaligned), + rows_per_image: None, + }, + size, + ); + + Ok(()) } From c5d40f03192ac5a9f8977419a5805dfa33ec8aaf Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Tue, 1 Oct 2024 22:32:37 +0200 Subject: [PATCH 08/61] Add profiling scopes --- Cargo.lock | 1 + crates/store/re_video/Cargo.toml | 2 ++ crates/store/re_video/src/decode/av1.rs | 12 ++++++++++++ 3 files changed, 15 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index beb0c9f5e722..f51f48fb569a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5930,6 +5930,7 @@ dependencies = [ "ordered-float", "parking_lot", "re_mp4", + "re_tracing", "thiserror", ] diff --git a/crates/store/re_video/Cargo.toml b/crates/store/re_video/Cargo.toml index 7224e07cf9cb..e36d0ef4f5d9 100644 --- a/crates/store/re_video/Cargo.toml +++ b/crates/store/re_video/Cargo.toml @@ -26,6 +26,8 @@ features = ["all"] [features] [dependencies] +re_tracing.workspace = true + crossbeam.workspace = true itertools.workspace = true ordered-float.workspace = true diff --git a/crates/store/re_video/src/decode/av1.rs b/crates/store/re_video/src/decode/av1.rs index 96b76d068a7b..86287923b244 100644 --- a/crates/store/re_video/src/decode/av1.rs +++ b/crates/store/re_video/src/decode/av1.rs @@ -50,6 +50,7 @@ impl Decoder { /// /// This does not block, all chunks sent to `decode` before this point will be discarded. pub fn reset(&self) { + re_tracing::profile_function!(); // Ask the decoder to reset its internal state. let (tx, rx) = crossbeam::channel::bounded(0); self.command_tx.send(Command::Reset(tx)).ok(); @@ -60,6 +61,7 @@ impl Decoder { /// Blocks until all pending frames have been decoded. pub fn flush(&self) { + re_tracing::profile_function!(); // Ask the decoder to notify us once all pending frames have been decoded. let (tx, rx) = crossbeam::channel::bounded(0); self.command_tx.send(Command::Flush(tx)).ok(); @@ -172,6 +174,8 @@ fn decoder_thread( } fn submit_chunk(decoder: &mut dav1d::Decoder, chunk: Chunk) { + re_tracing::profile_function!(); + // always attempt to send pending data first // this does nothing if there is no pending data, // and is required if a call to `send_data` previously @@ -270,6 +274,8 @@ fn rgba_from_yuv(y: u8, u: u8, v: u8) -> [u8; 4] { } fn i400_to_rgba(picture: &dav1d::Picture) -> Vec { + re_tracing::profile_function!(); + let width = picture.width() as usize; let height = picture.height() as usize; let y_plane = picture.plane(PlanarImageComponent::Y); @@ -294,6 +300,8 @@ fn i400_to_rgba(picture: &dav1d::Picture) -> Vec { } fn i420_to_rgba(picture: &dav1d::Picture) -> Vec { + re_tracing::profile_function!(); + let width = picture.width() as usize; let height = picture.height() as usize; let y_plane = picture.plane(PlanarImageComponent::Y); @@ -323,6 +331,8 @@ fn i420_to_rgba(picture: &dav1d::Picture) -> Vec { } fn i422_to_rgba(picture: &dav1d::Picture) -> Vec { + re_tracing::profile_function!(); + let width = picture.width() as usize; let height = picture.height() as usize; let y_plane = picture.plane(PlanarImageComponent::Y); @@ -352,6 +362,8 @@ fn i422_to_rgba(picture: &dav1d::Picture) -> Vec { } fn i444_to_rgba(picture: &dav1d::Picture) -> Vec { + re_tracing::profile_function!(); + let width = picture.width() as usize; let height = picture.height() as usize; let y_plane = picture.plane(PlanarImageComponent::Y); From ae6656a2dfdb732376b54792e5c3befcdc78fd20 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Tue, 1 Oct 2024 23:05:32 +0200 Subject: [PATCH 09/61] IT WORKS! --- Cargo.lock | 1 + crates/store/re_video/Cargo.toml | 1 + crates/store/re_video/src/decode/av1.rs | 11 +++++++---- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f51f48fb569a..e5abf50609c3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5929,6 +5929,7 @@ dependencies = [ "itertools 0.13.0", "ordered-float", "parking_lot", + "re_log", "re_mp4", "re_tracing", "thiserror", diff --git a/crates/store/re_video/Cargo.toml b/crates/store/re_video/Cargo.toml index e36d0ef4f5d9..f01e8f44608e 100644 --- a/crates/store/re_video/Cargo.toml +++ b/crates/store/re_video/Cargo.toml @@ -26,6 +26,7 @@ features = ["all"] [features] [dependencies] +re_log.workspace = true re_tracing.workspace = true crossbeam.workspace = true diff --git a/crates/store/re_video/src/decode/av1.rs b/crates/store/re_video/src/decode/av1.rs index 86287923b244..ce563f1030a5 100644 --- a/crates/store/re_video/src/decode/av1.rs +++ b/crates/store/re_video/src/decode/av1.rs @@ -29,7 +29,10 @@ impl Decoder { let thread = std::thread::Builder::new() .name("av1_decoder".into()) - .spawn(move || decoder_thread(&command_rx, &reset_rx, &parker, &on_output)) + .spawn(move || { + decoder_thread(&command_rx, &reset_rx, &parker, &on_output); + re_log::debug!("Closing decoder thread"); + }) .expect("failed to spawn decoder thread"); Self { @@ -185,7 +188,7 @@ fn submit_chunk(decoder: &mut dav1d::Decoder, chunk: Chunk) { Err(err) if err.is_again() => {} Err(err) => { // Something went wrong - panic!("Failed to decode frame: {err}"); + panic!("Failed to decode frame: {err}"); // TODO: handle errors } } @@ -199,7 +202,7 @@ fn submit_chunk(decoder: &mut dav1d::Decoder, chunk: Chunk) { Err(err) if err.is_again() => {} Err(err) => { // Something went wrong - panic!("Failed to decode frame: {err}"); + panic!("Failed to decode frame: {err}"); // TODO: handle errors } }; } @@ -239,7 +242,7 @@ fn output_frames(decoder: &mut dav1d::Decoder, on_output: &OutputCallback) { break; } Err(err) => { - panic!("Failed to decode frame: {err}"); + panic!("Failed to decode frame: {err}"); // TODO: handle errors } } } From ab17e38a48e13e57691eaae352595c140db74cb8 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Wed, 2 Oct 2024 07:18:56 +0200 Subject: [PATCH 10/61] Add a bunch of log statements and profile scopes --- crates/store/re_video/src/decode/av1.rs | 6 ++++++ .../viewer/re_renderer/src/video/decoder/native.rs | 14 +++++++++++++- .../src/visualizers/videos.rs | 2 ++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/crates/store/re_video/src/decode/av1.rs b/crates/store/re_video/src/decode/av1.rs index ce563f1030a5..067262e62e57 100644 --- a/crates/store/re_video/src/decode/av1.rs +++ b/crates/store/re_video/src/decode/av1.rs @@ -106,6 +106,7 @@ fn decoder_thread( match reset { Ok(_) => { // Reset the decoder. + re_log::debug!("Received reset"); decoder.flush(); drain_decoded_frames(&mut decoder); loop { @@ -129,6 +130,7 @@ fn decoder_thread( continue; } Err(RecvError) => { + re_log::debug!("RecvError"); // Channel disconnected, this only happens if the decoder is dropped. decoder.flush(); output_frames(&mut decoder, on_output); @@ -146,6 +148,7 @@ fn decoder_thread( } Ok(Command::Flush(done)) => { + re_log::debug!("Command::Flush"); // All pending frames must have already been decoded, because data sent // through a channel is received in the order it was sent. output_frames(&mut decoder, on_output); @@ -154,11 +157,13 @@ fn decoder_thread( } Ok(Command::Reset(done)) => { + re_log::debug!("Command::Reset"); done.try_send(()).ok(); continue; } Err(RecvError) => { + re_log::debug!("RecvError"); // Channel disconnected, this only happens if the decoder is dropped. decoder.flush(); output_frames(&mut decoder, on_output); @@ -178,6 +183,7 @@ fn decoder_thread( fn submit_chunk(decoder: &mut dav1d::Decoder, chunk: Chunk) { re_tracing::profile_function!(); + re_log::debug!("submit_chunk {:?}", chunk.timestamp); // always attempt to send pending data first // this does nothing if there is no pending data, diff --git a/crates/viewer/re_renderer/src/video/decoder/native.rs b/crates/viewer/re_renderer/src/video/decoder/native.rs index 16ff16e87175..03a18f00c40b 100644 --- a/crates/viewer/re_renderer/src/video/decoder/native.rs +++ b/crates/viewer/re_renderer/src/video/decoder/native.rs @@ -37,6 +37,9 @@ impl VideoDecoder { data: Arc, _hw_acceleration: DecodeHardwareAcceleration, ) -> Result { + re_tracing::profile_function!(); + + re_log::debug!("Initializing native video decoder…"); let frames = Arc::new(Mutex::new(Vec::new())); // TODO: check that data is av1, and return error elsewise @@ -44,6 +47,7 @@ impl VideoDecoder { let decoder = re_video::av1::Decoder::new({ let frames = frames.clone(); move |frame: re_video::Frame| { + re_log::debug!("Decoded frame at {:?}", frame.timestamp); frames.lock().push(frame); } }); @@ -154,6 +158,14 @@ impl VideoDecoder { let mut frames = self.frames.lock(); + if !frames.is_empty() { + re_log::debug_once!( + "Looking for frame timestamp {presentation_timestamp:?} among frames {:?} - {:?}", + frames.first().unwrap().timestamp, + frames.last().unwrap().timestamp + ); + } + let Some(frame_idx) = latest_at_idx(&frames, |frame| frame.timestamp, &presentation_timestamp) else { @@ -182,7 +194,7 @@ impl VideoDecoder { if self.last_used_frame_timestamp != frame.timestamp { self.last_used_frame_timestamp = frame.timestamp; - copy_video_frame_to_texture(&self.queue, frame, &self.texture.texture)? + copy_video_frame_to_texture(&self.queue, frame, &self.texture.texture)?; } Ok(VideoFrameTexture::Ready(self.texture.clone())) diff --git a/crates/viewer/re_space_view_spatial/src/visualizers/videos.rs b/crates/viewer/re_space_view_spatial/src/visualizers/videos.rs index ddd8cf6fdc17..e8588315f0bd 100644 --- a/crates/viewer/re_space_view_spatial/src/visualizers/videos.rs +++ b/crates/viewer/re_space_view_spatial/src/visualizers/videos.rs @@ -153,6 +153,8 @@ impl VideoFrameReferenceVisualizer { entity_path: &EntityPath, view_id: SpaceViewId, ) { + re_tracing::profile_function!(); + let Some(render_ctx) = ctx.viewer_ctx.render_ctx else { return; }; From 0b86e60fc388ef0a4f5048ab5e4afb105b27d5de Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Wed, 2 Oct 2024 07:19:11 +0200 Subject: [PATCH 11/61] Always optimize wpgu and re_video --- Cargo.toml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index 6efba51665b9..9de2396e62fc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -307,6 +307,10 @@ zip = { version = "0.6", default-features = false } # Our dev profile has some optimizations turned on, as well as debug assertions. [profile.dev] opt-level = 1 # Make debug builds run faster +[profile.dev.package.re_video] +opt-level = 2 # Speed up CPU-side chroma-upsampling (TODO(#7298): move to GPU) +[profile.dev.package.wgpu] +opt-level = 2 # Speed up copying video textures # panic = "abort" leads to better optimizations and smaller binaries (and is the default in Wasm anyways), # but it also means backtraces don't work with the `backtrace` library (https://github.com/rust-lang/backtrace-rs/issues/397). From d5dee3cd6beeddbe4b0c09e1ca5f02f9bfb938c5 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Wed, 2 Oct 2024 18:31:24 +0200 Subject: [PATCH 12/61] Range-check input data --- crates/viewer/re_renderer/src/video/decoder/native.rs | 10 ++++++++-- crates/viewer/re_renderer/src/video/mod.rs | 10 +++++++--- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/crates/viewer/re_renderer/src/video/decoder/native.rs b/crates/viewer/re_renderer/src/video/decoder/native.rs index 03a18f00c40b..a31bd0128685 100644 --- a/crates/viewer/re_renderer/src/video/decoder/native.rs +++ b/crates/viewer/re_renderer/src/video/decoder/native.rs @@ -221,8 +221,14 @@ impl VideoDecoder { /// Enqueue the given sample. fn enqueue_sample(&self, sample: &re_video::Sample, is_key: bool) -> Result<(), DecodingError> { - let data = &self.data.data[sample.byte_offset as usize - ..sample.byte_offset as usize + sample.byte_length as usize]; // TODO: range check + let byte_offset = sample.byte_offset as usize; + let byte_length = sample.byte_length as usize; + + if self.data.data.len() < byte_offset + byte_length { + return Err(DecodingError::BadData); + } + + let data = &self.data.data[byte_offset..byte_offset + byte_length]; let chunk = re_video::Chunk { data: data.to_vec(), diff --git a/crates/viewer/re_renderer/src/video/mod.rs b/crates/viewer/re_renderer/src/video/mod.rs index 9abf6312e229..2fff12b724eb 100644 --- a/crates/viewer/re_renderer/src/video/mod.rs +++ b/crates/viewer/re_renderer/src/video/mod.rs @@ -27,20 +27,24 @@ pub enum DecodingError { #[error("Failed to configure the video decoder: {0}")] ConfigureFailure(String), - // e.g. unsupported codec + /// e.g. unsupported codec #[error("Failed to create video chunk: {0}")] CreateChunk(String), - // e.g. unsupported codec + /// e.g. unsupported codec #[error("Failed to decode video chunk: {0}")] DecodeChunk(String), - // e.g. unsupported codec + /// e.g. unsupported codec #[error("Failed to decode video: {0}")] Decoding(String), #[error("The timestamp passed was negative.")] NegativeTimestamp, + + /// e.g. bad mp4, or bug in mp4 parse + #[error("Bad data.")] + BadData, } pub type FrameDecodingResult = Result; From b197cc34ce9df833c1f83478dbeaecd2ae252bd5 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Thu, 3 Oct 2024 09:44:38 +0200 Subject: [PATCH 13/61] Add `nasm` to pixi --- pixi.lock | 1726 +++++++++++++++++++++-------------------------------- pixi.toml | 1 + 2 files changed, 684 insertions(+), 1043 deletions(-) diff --git a/pixi.lock b/pixi.lock index fbb3ad31d6f6..a1bfc3ada35c 100644 --- a/pixi.lock +++ b/pixi.lock @@ -125,6 +125,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.0.5-py311h459d7ec_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.8.0-py311h459d7ec_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nasm-2.16.03-h4bc722e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.11.1-h924138e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.12.2-hb753e55_0.conda @@ -349,6 +350,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.0.5-py311hcd402e7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mypy-1.8.0-py311hcd402e7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nasm-2.16.03-h68df207_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-h0425590_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ninja-1.11.1-hdd96247_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.12.2-hc1f8a26_0.conda @@ -562,6 +564,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/multidict-6.0.5-py311h5547dcb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/mypy-1.8.0-py311he705e18_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/nasm-2.16.03-hfdf4475_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h5846eda_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.11.1-hb8565cd_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/nodejs-20.12.2-hfc0f20e_0.conda @@ -772,6 +775,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.0.5-py311he2be06e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-1.8.0-py311h05b510d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nasm-2.16.03-h99b78c6_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-hb89a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.11.1-hffc8910_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-20.12.2-h3b52c9b_0.conda @@ -958,6 +962,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/multidict-6.0.5-py311ha68e1ae_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mypy-1.8.0-py311ha68e1ae_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/nasm-2.16.03-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.11.1-h91493d7_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-20.12.2-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.4-py311h0b4df5a_0.conda @@ -1172,6 +1177,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.0.5-py311h459d7ec_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.8.0-py311h459d7ec_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nasm-2.16.03-h4bc722e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.11.1-h924138e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.12.2-hb753e55_0.conda @@ -1379,6 +1385,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.0.5-py311hcd402e7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mypy-1.8.0-py311hcd402e7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nasm-2.16.03-h68df207_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-h0425590_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ninja-1.11.1-hdd96247_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-20.12.2-hc1f8a26_0.conda @@ -1577,6 +1584,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/multidict-6.0.5-py311h5547dcb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/mypy-1.8.0-py311he705e18_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/nasm-2.16.03-hfdf4475_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h5846eda_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.11.1-hb8565cd_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/nodejs-20.12.2-hfc0f20e_0.conda @@ -1771,6 +1779,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.0.5-py311he2be06e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-1.8.0-py311h05b510d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nasm-2.16.03-h99b78c6_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-hb89a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.11.1-hffc8910_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-20.12.2-h3b52c9b_0.conda @@ -1957,6 +1966,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/multidict-6.0.5-py311ha68e1ae_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mypy-1.8.0-py311ha68e1ae_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/nasm-2.16.03-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.11.1-h91493d7_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-20.12.2-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.4-py311h0b4df5a_0.conda @@ -6074,6 +6084,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.3.0-hf1915f5_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.3.0-hca2cd23_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nasm-2.16.03-h4bc722e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nettle-3.9.1-h7ab15ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.11.1-h924138e_0.conda @@ -6420,6 +6431,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.0.5-py311hcd402e7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mypy-1.8.0-py311hcd402e7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nasm-2.16.03-h68df207_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-h0425590_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nettle-3.9.1-h9d1147b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ninja-1.11.1-hdd96247_0.conda @@ -6732,6 +6744,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/multidict-6.0.5-py311h5547dcb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/mypy-1.8.0-py311he705e18_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/nasm-2.16.03-hfdf4475_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h5846eda_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/nettle-3.9.1-h8e11ae5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.11.1-hb8565cd_0.conda @@ -7024,6 +7037,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.0.5-py311he2be06e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-1.8.0-py311h05b510d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nasm-2.16.03-h99b78c6_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-hb89a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nettle-3.9.1-h40ed0f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.11.1-hffc8910_0.conda @@ -7298,6 +7312,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/multidict-6.0.5-py311ha68e1ae_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mypy-1.8.0-py311ha68e1ae_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/nasm-2.16.03-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.11.1-h91493d7_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-20.12.2-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.4-py311h0b4df5a_0.conda @@ -7640,6 +7655,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.3.0-h70512c7_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.3.0-ha479ceb_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nasm-2.16.03-h4bc722e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nettle-3.9.1-h7ab15ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.11.1-h924138e_0.conda @@ -8177,6 +8193,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.0.5-py311hcd402e7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mypy-1.8.0-py311hcd402e7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nasm-2.16.03-h68df207_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-h0425590_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nettle-3.9.1-h9d1147b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ninja-1.11.1-hdd96247_0.conda @@ -8667,6 +8684,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/multidict-6.0.5-py311h5547dcb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/mypy-1.8.0-py311he705e18_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/nasm-2.16.03-hfdf4475_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h5846eda_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/nettle-3.9.1-h8e11ae5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.11.1-hb8565cd_0.conda @@ -9146,6 +9164,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.0.5-py311he2be06e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-1.8.0-py311h05b510d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nasm-2.16.03-h99b78c6_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-hb89a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nettle-3.9.1-h40ed0f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.11.1-hffc8910_0.conda @@ -9591,6 +9610,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/multidict-6.0.5-py311ha68e1ae_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mypy-1.8.0-py311ha68e1ae_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/nasm-2.16.03-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.11.1-h91493d7_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-20.12.2-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.4-py311h0b4df5a_0.conda @@ -10109,6 +10129,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.3.0-h70512c7_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.3.0-ha479ceb_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nasm-2.16.03-h4bc722e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nettle-3.9.1-h7ab15ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.11.1-h924138e_0.conda @@ -10476,6 +10497,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.0.5-py311hcd402e7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mypy-1.8.0-py311hcd402e7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nasm-2.16.03-h68df207_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-h0425590_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nettle-3.9.1-h9d1147b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ninja-1.11.1-hdd96247_0.conda @@ -10807,6 +10829,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/multidict-6.0.5-py311h5547dcb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/mypy-1.8.0-py311he705e18_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/nasm-2.16.03-hfdf4475_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h5846eda_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/nettle-3.9.1-h8e11ae5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.11.1-hb8565cd_0.conda @@ -11119,6 +11142,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.0.5-py311he2be06e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-1.8.0-py311h05b510d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nasm-2.16.03-h99b78c6_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-hb89a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nettle-3.9.1-h40ed0f5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.11.1-hffc8910_0.conda @@ -11397,6 +11421,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/multidict-6.0.5-py311ha68e1ae_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mypy-1.8.0-py311ha68e1ae_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/nasm-2.16.03-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.11.1-h91493d7_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-20.12.2-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.4-py311h0b4df5a_0.conda @@ -12086,8 +12111,8 @@ packages: - kind: pypi name: argon2-cffi-bindings version: 21.2.0 - url: https://files.pythonhosted.org/packages/5a/e4/bf8034d25edaa495da3c8a3405627d2e35758e44ff6eaa7948092646fdcc/argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl - sha256: e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93 + url: https://files.pythonhosted.org/packages/b3/02/f7f7bb6b6af6031edb11037639c697b912e1dea2db94d436e681aea2f495/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d requires_dist: - cffi>=1.0.1 - pytest ; extra == 'dev' @@ -12099,8 +12124,8 @@ packages: - kind: pypi name: argon2-cffi-bindings version: 21.2.0 - url: https://files.pythonhosted.org/packages/b3/02/f7f7bb6b6af6031edb11037639c697b912e1dea2db94d436e681aea2f495/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d + url: https://files.pythonhosted.org/packages/ec/f7/378254e6dd7ae6f31fe40c8649eea7d4832a42243acaf0f1fff9083b2bed/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae requires_dist: - cffi>=1.0.1 - pytest ; extra == 'dev' @@ -12112,8 +12137,8 @@ packages: - kind: pypi name: argon2-cffi-bindings version: 21.2.0 - url: https://files.pythonhosted.org/packages/ec/f7/378254e6dd7ae6f31fe40c8649eea7d4832a42243acaf0f1fff9083b2bed/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae + url: https://files.pythonhosted.org/packages/5a/e4/bf8034d25edaa495da3c8a3405627d2e35758e44ff6eaa7948092646fdcc/argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl + sha256: e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93 requires_dist: - cffi>=1.0.1 - pytest ; extra == 'dev' @@ -12137,21 +12162,6 @@ packages: - tqdm - trimesh editable: true -- kind: pypi - name: arkit-scenes - version: 0.1.0 - path: examples/python/arkit_scenes - sha256: 1ea1defa403966ebbc7e54ff7b92f65fdb6c98ee3e242d8af0be46023ed87961 - requires_dist: - - matplotlib - - numpy - - opencv-python - - pandas - - rerun-sdk - - scipy - - tqdm - - trimesh - editable: true - kind: pypi name: arrow version: 1.3.0 @@ -14541,20 +14551,6 @@ packages: - jinja2 ; extra == 'compiler' - protobuf ; extra == 'compiler' requires_python: '>=3.6' -- kind: pypi - name: betterproto - version: 1.2.5 - url: https://files.pythonhosted.org/packages/ff/2e/abfed7a721928e14aeb900182ff695be474c4ee5f07ef0874cc5ecd5b0b1/betterproto-1.2.5.tar.gz - sha256: 74a3ab34646054f674d236d1229ba8182dc2eae86feb249b8590ef496ce9803d - requires_dist: - - grpclib - - stringcase - - dataclasses ; python_version < '3.7' - - backports-datetime-fromisoformat ; python_version < '3.7' - - black ; extra == 'compiler' - - jinja2 ; extra == 'compiler' - - protobuf ; extra == 'compiler' - requires_python: '>=3.6' - kind: conda name: binaryen version: '117' @@ -14735,8 +14731,8 @@ packages: - kind: pypi name: black version: 24.4.2 - url: https://files.pythonhosted.org/packages/0f/89/294c9a6b6c75a08da55e9d05321d0707e9418735e3062b12ef0f54c33474/black-24.4.2-py3-none-any.whl - sha256: d36ed1124bb81b32f8614555b34cc4259c3fbc7eec17870e8ff8ded335b58d8c + url: https://files.pythonhosted.org/packages/74/ce/e8eec1a77edbfa982bee3b5460dcdd4fe0e4e3165fc15d8ec44d04da7776/black-24.4.2-cp311-cp311-win_amd64.whl + sha256: 7e122b1c4fb252fd85df3ca93578732b4749d9be076593076ef4d07a0233c3e1 requires_dist: - click>=8.0.0 - mypy-extensions>=0.4.3 @@ -14755,8 +14751,8 @@ packages: - kind: pypi name: black version: 24.4.2 - url: https://files.pythonhosted.org/packages/74/ce/e8eec1a77edbfa982bee3b5460dcdd4fe0e4e3165fc15d8ec44d04da7776/black-24.4.2-cp311-cp311-win_amd64.whl - sha256: 7e122b1c4fb252fd85df3ca93578732b4749d9be076593076ef4d07a0233c3e1 + url: https://files.pythonhosted.org/packages/0f/89/294c9a6b6c75a08da55e9d05321d0707e9418735e3062b12ef0f54c33474/black-24.4.2-py3-none-any.whl + sha256: d36ed1124bb81b32f8614555b34cc4259c3fbc7eec17870e8ff8ded335b58d8c requires_dist: - click>=8.0.0 - mypy-extensions>=0.4.3 @@ -14775,8 +14771,8 @@ packages: - kind: pypi name: black version: 24.4.2 - url: https://files.pythonhosted.org/packages/9b/f7/591d601c3046ceb65b97291dfe87fa25124cffac3d97aaaba89d0f0d7bdf/black-24.4.2-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 257d724c2c9b1660f353b36c802ccece186a30accc7742c176d29c146df6e474 + url: https://files.pythonhosted.org/packages/c5/48/34176b522e8cff4620a5d96c2e323ff2413f574870eb25efa8025885e028/black-24.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: e151054aa00bad1f4e1f04919542885f89f5f7d086b8a59e5000e6c616896ffb requires_dist: - click>=8.0.0 - mypy-extensions>=0.4.3 @@ -14795,8 +14791,8 @@ packages: - kind: pypi name: black version: 24.4.2 - url: https://files.pythonhosted.org/packages/c5/48/34176b522e8cff4620a5d96c2e323ff2413f574870eb25efa8025885e028/black-24.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: e151054aa00bad1f4e1f04919542885f89f5f7d086b8a59e5000e6c616896ffb + url: https://files.pythonhosted.org/packages/9b/f7/591d601c3046ceb65b97291dfe87fa25124cffac3d97aaaba89d0f0d7bdf/black-24.4.2-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 257d724c2c9b1660f353b36c802ccece186a30accc7742c176d29c146df6e474 requires_dist: - click>=8.0.0 - mypy-extensions>=0.4.3 @@ -14851,26 +14847,6 @@ packages: - numpy - rerun-sdk editable: true -- kind: pypi - name: blueprint - version: 0.1.0 - path: examples/python/blueprint - sha256: d9a358e5994ec1e9144942903e46148b16825344cddc19e7188b285f59bc61c1 - requires_dist: - - numpy - - rerun-sdk - editable: true -- kind: pypi - name: blueprint-stocks - version: 0.1.0 - path: examples/python/blueprint_stocks - sha256: 7c8b6805f08610837014175d9d0212815a91c3197756cdbbce836a2f15e40eea - requires_dist: - - humanize - - rerun-sdk - - yfinance - requires_python: '>=3.8' - editable: true - kind: pypi name: blueprint-stocks version: 0.1.0 @@ -15541,8 +15517,8 @@ packages: - kind: pypi name: cffi version: 1.16.0 - url: https://files.pythonhosted.org/packages/18/6c/0406611f3d5aadf4c5b08f6c095d874aed8dfc2d3a19892707d72536d5dc/cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl - sha256: 1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417 + url: https://files.pythonhosted.org/packages/9b/89/a31c81e36bbb793581d8bba4406a8aac4ba84b2559301c44eef81f4cf5df/cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e requires_dist: - pycparser requires_python: '>=3.8' @@ -15557,16 +15533,16 @@ packages: - kind: pypi name: cffi version: 1.16.0 - url: https://files.pythonhosted.org/packages/95/c8/ce05a6cba2bec12d4b28285e66c53cc88dd7385b102dea7231da3b74cfef/cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl - sha256: b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404 + url: https://files.pythonhosted.org/packages/18/6c/0406611f3d5aadf4c5b08f6c095d874aed8dfc2d3a19892707d72536d5dc/cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl + sha256: 1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417 requires_dist: - pycparser requires_python: '>=3.8' - kind: pypi name: cffi version: 1.16.0 - url: https://files.pythonhosted.org/packages/9b/89/a31c81e36bbb793581d8bba4406a8aac4ba84b2559301c44eef81f4cf5df/cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e + url: https://files.pythonhosted.org/packages/95/c8/ce05a6cba2bec12d4b28285e66c53cc88dd7385b102dea7231da3b74cfef/cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404 requires_dist: - pycparser requires_python: '>=3.8' @@ -15578,12 +15554,6 @@ packages: requires_dist: - pycparser requires_python: '>=3.8' -- kind: pypi - name: charset-normalizer - version: 3.3.2 - url: https://files.pythonhosted.org/packages/3e/33/21a875a61057165e92227466e54ee076b73af1e21fe1b31f1e292251aa1e/charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96 - requires_python: '>=3.7.0' - kind: pypi name: charset-normalizer version: 3.3.2 @@ -15602,6 +15572,12 @@ packages: url: https://files.pythonhosted.org/packages/dd/51/68b61b90b24ca35495956b718f35a9756ef7d3dd4b3c1508056fa98d1a1b/charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl sha256: 549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e requires_python: '>=3.7.0' +- kind: pypi + name: charset-normalizer + version: 3.3.2 + url: https://files.pythonhosted.org/packages/3e/33/21a875a61057165e92227466e54ee076b73af1e21fe1b31f1e292251aa1e/charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96 + requires_python: '>=3.7.0' - kind: pypi name: charset-normalizer version: 3.3.2 @@ -16976,15 +16952,6 @@ packages: - numpy - rerun-sdk editable: true -- kind: pypi - name: clock - version: 0.1.0 - path: examples/python/clock - sha256: 1ae48a7222b2fc2bd9942a31bb48fefb34225a946859ad95c25ad00bfb754cd7 - requires_dist: - - numpy - - rerun-sdk - editable: true - kind: conda name: cmake version: 3.27.6 @@ -17217,8 +17184,8 @@ packages: - kind: pypi name: contourpy version: 1.2.1 - url: https://files.pythonhosted.org/packages/33/0e/51ff72fac17e2500baf30b6b2a24be423a8d27e1625e5de99f585b852d74/contourpy-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 6022cecf8f44e36af10bd9118ca71f371078b4c168b6e0fab43d4a889985dbb5 + url: https://files.pythonhosted.org/packages/d6/4f/76d0dd0bca417691918484c26c74dd9dd44fbf528bbfeb30d754886e2c54/contourpy-1.2.1-cp311-cp311-win_amd64.whl + sha256: 2855c8b0b55958265e8b5888d6a615ba02883b225f2227461aa9127c578a4922 requires_dist: - numpy>=1.20 - furo ; extra == 'docs' @@ -17265,8 +17232,8 @@ packages: - kind: pypi name: contourpy version: 1.2.1 - url: https://files.pythonhosted.org/packages/9f/6b/8a1ca4b81d426c104fe42b3cfad9488eaaef0a03fcf98eaecc22b628a013/contourpy-1.2.1-cp311-cp311-macosx_11_0_arm64.whl - sha256: ef5adb9a3b1d0c645ff694f9bca7702ec2c70f4d734f9922ea34de02294fdf72 + url: https://files.pythonhosted.org/packages/ee/c0/9bd123d676eb61750e116a2cd915b06483fc406143cfc36c7f263f0f5368/contourpy-1.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: d4492d82b3bc7fbb7e3610747b159869468079fe149ec5c4d771fa1f614a14df requires_dist: - numpy>=1.20 - furo ; extra == 'docs' @@ -17289,8 +17256,8 @@ packages: - kind: pypi name: contourpy version: 1.2.1 - url: https://files.pythonhosted.org/packages/d6/4f/76d0dd0bca417691918484c26c74dd9dd44fbf528bbfeb30d754886e2c54/contourpy-1.2.1-cp311-cp311-win_amd64.whl - sha256: 2855c8b0b55958265e8b5888d6a615ba02883b225f2227461aa9127c578a4922 + url: https://files.pythonhosted.org/packages/33/0e/51ff72fac17e2500baf30b6b2a24be423a8d27e1625e5de99f585b852d74/contourpy-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 6022cecf8f44e36af10bd9118ca71f371078b4c168b6e0fab43d4a889985dbb5 requires_dist: - numpy>=1.20 - furo ; extra == 'docs' @@ -17313,8 +17280,8 @@ packages: - kind: pypi name: contourpy version: 1.2.1 - url: https://files.pythonhosted.org/packages/ee/c0/9bd123d676eb61750e116a2cd915b06483fc406143cfc36c7f263f0f5368/contourpy-1.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: d4492d82b3bc7fbb7e3610747b159869468079fe149ec5c4d771fa1f614a14df + url: https://files.pythonhosted.org/packages/9f/6b/8a1ca4b81d426c104fe42b3cfad9488eaaef0a03fcf98eaecc22b628a013/contourpy-1.2.1-cp311-cp311-macosx_11_0_arm64.whl + sha256: ef5adb9a3b1d0c645ff694f9bca7702ec2c70f4d734f9922ea34de02294fdf72 requires_dist: - numpy>=1.20 - furo ; extra == 'docs' @@ -17350,22 +17317,6 @@ packages: - rerun-sdk requires_python: '>=3.10' editable: true -- kind: pypi - name: controlnet - version: 0.1.0 - path: examples/python/controlnet - sha256: 8ae055c0b8b0dd7757e4e666f6163172859044d4090830aecbec3460cdb318ee - requires_dist: - - accelerate - - opencv-python - - pillow - - diffusers==0.27.2 - - numpy - - torch==2.2.2 - - transformers - - rerun-sdk - requires_python: '>=3.10' - editable: true - kind: pypi name: cryptography version: 38.0.4 @@ -17397,8 +17348,8 @@ packages: - kind: pypi name: cryptography version: 38.0.4 - url: https://files.pythonhosted.org/packages/52/1b/49ebc2b59e9126f1f378ae910e98704d54a3f48b78e2d6d6c8cfe6fbe06f/cryptography-38.0.4-cp36-abi3-macosx_10_10_x86_64.whl - sha256: 1f13ddda26a04c06eb57119caf27a524ccae20533729f4b1e4a69b54e07035eb + url: https://files.pythonhosted.org/packages/c0/eb/f52b165db2abd662cda0a76efb7579a291fed1a7979cf41146cdc19e0d7a/cryptography-38.0.4-cp36-abi3-win_amd64.whl + sha256: 8e45653fb97eb2f20b8c96f9cd2b3a0654d742b47d638cf2897afbd97f80fa6d requires_dist: - cffi>=1.12 - sphinx!=1.8.0,!=3.1.0,!=3.1.1,>=1.6.5 ; extra == 'docs' @@ -17453,8 +17404,8 @@ packages: - kind: pypi name: cryptography version: 38.0.4 - url: https://files.pythonhosted.org/packages/a2/8f/6c52b1f9d650863e8f67edbe062c04f1c8455579eaace1593d8fe469319a/cryptography-38.0.4-cp36-abi3-manylinux_2_28_aarch64.whl - sha256: bfe6472507986613dc6cc00b3d492b2f7564b02b3b3682d25ca7f40fa3fd321b + url: https://files.pythonhosted.org/packages/52/1b/49ebc2b59e9126f1f378ae910e98704d54a3f48b78e2d6d6c8cfe6fbe06f/cryptography-38.0.4-cp36-abi3-macosx_10_10_x86_64.whl + sha256: 1f13ddda26a04c06eb57119caf27a524ccae20533729f4b1e4a69b54e07035eb requires_dist: - cffi>=1.12 - sphinx!=1.8.0,!=3.1.0,!=3.1.1,>=1.6.5 ; extra == 'docs' @@ -17481,8 +17432,8 @@ packages: - kind: pypi name: cryptography version: 38.0.4 - url: https://files.pythonhosted.org/packages/c0/eb/f52b165db2abd662cda0a76efb7579a291fed1a7979cf41146cdc19e0d7a/cryptography-38.0.4-cp36-abi3-win_amd64.whl - sha256: 8e45653fb97eb2f20b8c96f9cd2b3a0654d742b47d638cf2897afbd97f80fa6d + url: https://files.pythonhosted.org/packages/a2/8f/6c52b1f9d650863e8f67edbe062c04f1c8455579eaace1593d8fe469319a/cryptography-38.0.4-cp36-abi3-manylinux_2_28_aarch64.whl + sha256: bfe6472507986613dc6cc00b3d492b2f7564b02b3b3682d25ca7f40fa3fd321b requires_dist: - cffi>=1.12 - sphinx!=1.8.0,!=3.1.0,!=3.1.1,>=1.6.5 ; extra == 'docs' @@ -17691,8 +17642,8 @@ packages: - kind: pypi name: debugpy version: 1.8.2 - url: https://files.pythonhosted.org/packages/2b/ba/d06289b7c6194117fcecc88c24dee405b1c14b8e318e7bdf513eb78c3278/debugpy-1.8.2-cp311-cp311-macosx_11_0_universal2.whl - sha256: 8a13417ccd5978a642e91fb79b871baded925d4fadd4dfafec1928196292aa0a + url: https://files.pythonhosted.org/packages/b4/32/dd0707c8557f99496811763c5333ea87bcec1eb233c1efa324c9a8082bff/debugpy-1.8.2-py2.py3-none-any.whl + sha256: 16e16df3a98a35c63c3ab1e4d19be4cbc7fdda92d9ddc059294f18910928e0ca requires_python: '>=3.8' - kind: pypi name: debugpy @@ -17703,8 +17654,8 @@ packages: - kind: pypi name: debugpy version: 1.8.2 - url: https://files.pythonhosted.org/packages/b4/32/dd0707c8557f99496811763c5333ea87bcec1eb233c1efa324c9a8082bff/debugpy-1.8.2-py2.py3-none-any.whl - sha256: 16e16df3a98a35c63c3ab1e4d19be4cbc7fdda92d9ddc059294f18910928e0ca + url: https://files.pythonhosted.org/packages/2b/ba/d06289b7c6194117fcecc88c24dee405b1c14b8e318e7bdf513eb78c3278/debugpy-1.8.2-cp311-cp311-macosx_11_0_universal2.whl + sha256: 8a13417ccd5978a642e91fb79b871baded925d4fadd4dfafec1928196292aa0a requires_python: '>=3.8' - kind: pypi name: decorator @@ -17753,34 +17704,6 @@ packages: - torch==2.2.2 - transformers editable: true -- kind: pypi - name: detect-and-track-objects - version: 0.1.0 - path: examples/python/detect_and_track_objects - sha256: 2c2d3d8b61d6a0bf44051fd7052e3087fd4762b9c434586078ea3d179940cba1 - requires_dist: - - numpy - - opencv-contrib-python>4.6 - - pillow - - requests>=2.31,<3 - - rerun-sdk - - timm==0.9.11 - - torch==2.2.2 - - transformers - editable: true -- kind: pypi - name: dicom-mri - version: 0.1.0 - path: examples/python/dicom_mri - sha256: 98cb91dc5758ae59e3cd0fb797f86f40fcf627f63e659365806f59feed4618d8 - requires_dist: - - dicom-numpy==0.6.2 - - numpy - - pydicom==2.3.0 - - requests>=2.31,<3 - - rerun-sdk - - types-requests>=2.31,<3 - editable: true - kind: pypi name: dicom-mri version: 0.1.0 @@ -17900,16 +17823,6 @@ packages: - rerun-sdk - scipy editable: true -- kind: pypi - name: dna - version: 0.1.0 - path: examples/python/dna - sha256: 15dd8b0ce0ee55262916ea9bc8fb93c72c2012cb01a78e6d24a526d92537eab4 - requires_dist: - - numpy - - rerun-sdk - - scipy - editable: true - kind: conda name: double-conversion version: 3.3.0 @@ -18044,18 +17957,6 @@ packages: - rerun-sdk - tqdm editable: true -- kind: pypi - name: drone-lidar - version: 0.1.0 - path: examples/python/drone_lidar - sha256: 4de8d4135d07f9b0389eeb8a3616a5a9941a868b4d876cc91d8b5351c3b8984d - requires_dist: - - laspy - - numpy - - requests - - rerun-sdk - - tqdm - editable: true - kind: conda name: exceptiongroup version: 1.2.2 @@ -18178,21 +18079,6 @@ packages: - tqdm requires_python: <3.12 editable: true -- kind: pypi - name: face-tracking - version: 0.1.0 - path: examples/python/face_tracking - sha256: b8725fe4d36c11aad2c6c936ba2b57c7f65a856aa179badca5d041db63119d55 - requires_dist: - - mediapipe==0.10.11 ; sys_platform != 'darwin' - - mediapipe==0.10.9 ; sys_platform == 'darwin' - - numpy - - opencv-python>4.6 - - requests - - rerun-sdk - - tqdm - requires_python: <3.12 - editable: true - kind: pypi name: fastjsonschema version: 2.20.0 @@ -18547,15 +18433,6 @@ packages: - six - termcolor - enum34 ; python_version < '3.4' -- kind: pypi - name: fire - version: 0.6.0 - url: https://files.pythonhosted.org/packages/1b/1b/84c63f592ecdfbb3d77d22a8d93c9b92791e4fa35677ad71a7d6449100f8/fire-0.6.0.tar.gz - sha256: 54ec5b996ecdd3c0309c800324a0703d6da512241bc73b553db959d98de0aa66 - requires_dist: - - six - - termcolor - - enum34 ; python_version < '3.4' - kind: pypi name: flatbuffers version: 24.3.25 @@ -18828,8 +18705,8 @@ packages: - kind: pypi name: fonttools version: 4.53.1 - url: https://files.pythonhosted.org/packages/8b/6a/206391c869ab22d1374e2575cad7cab36b93b9e3d37f48f4696eed2c6e9e/fonttools-4.53.1-cp311-cp311-macosx_10_9_universal2.whl - sha256: da33440b1413bad53a8674393c5d29ce64d8c1a15ef8a77c642ffd900d07bfe1 + url: https://files.pythonhosted.org/packages/c8/e1/059700c154bd7170d1c37061239836d2e51ff608f47075450f06dd3c292a/fonttools-4.53.1-cp311-cp311-win_amd64.whl + sha256: d4d0096cb1ac7a77b3b41cd78c9b6bc4a400550e21dc7a92f2b5ab53ed74eb02 requires_dist: - fs<3,>=2.2.0 ; extra == 'all' - lxml>=4.0 ; extra == 'all' @@ -18865,8 +18742,8 @@ packages: - kind: pypi name: fonttools version: 4.53.1 - url: https://files.pythonhosted.org/packages/a4/22/0a0ad59d9367997fd74a00ad2e88d10559122e09f105e94d34c155aecc0a/fonttools-4.53.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: bee32ea8765e859670c4447b0817514ca79054463b6b79784b08a8df3a4d78e3 + url: https://files.pythonhosted.org/packages/e1/67/fff766817e17d67208f8a1e72de15066149485acb5e4ff0816b11fd5fca3/fonttools-4.53.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: c6e7170d675d12eac12ad1a981d90f118c06cf680b42a2d74c6c931e54b50719 requires_dist: - fs<3,>=2.2.0 ; extra == 'all' - lxml>=4.0 ; extra == 'all' @@ -18902,8 +18779,8 @@ packages: - kind: pypi name: fonttools version: 4.53.1 - url: https://files.pythonhosted.org/packages/c8/e1/059700c154bd7170d1c37061239836d2e51ff608f47075450f06dd3c292a/fonttools-4.53.1-cp311-cp311-win_amd64.whl - sha256: d4d0096cb1ac7a77b3b41cd78c9b6bc4a400550e21dc7a92f2b5ab53ed74eb02 + url: https://files.pythonhosted.org/packages/a4/22/0a0ad59d9367997fd74a00ad2e88d10559122e09f105e94d34c155aecc0a/fonttools-4.53.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: bee32ea8765e859670c4447b0817514ca79054463b6b79784b08a8df3a4d78e3 requires_dist: - fs<3,>=2.2.0 ; extra == 'all' - lxml>=4.0 ; extra == 'all' @@ -18939,8 +18816,8 @@ packages: - kind: pypi name: fonttools version: 4.53.1 - url: https://files.pythonhosted.org/packages/e1/67/fff766817e17d67208f8a1e72de15066149485acb5e4ff0816b11fd5fca3/fonttools-4.53.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: c6e7170d675d12eac12ad1a981d90f118c06cf680b42a2d74c6c931e54b50719 + url: https://files.pythonhosted.org/packages/8b/6a/206391c869ab22d1374e2575cad7cab36b93b9e3d37f48f4696eed2c6e9e/fonttools-4.53.1-cp311-cp311-macosx_10_9_universal2.whl + sha256: da33440b1413bad53a8674393c5d29ce64d8c1a15ef8a77c642ffd900d07bfe1 requires_dist: - fs<3,>=2.2.0 ; extra == 'all' - lxml>=4.0 ; extra == 'all' @@ -19170,26 +19047,26 @@ packages: - kind: pypi name: freetype-py version: 2.4.0 - url: https://files.pythonhosted.org/packages/5f/34/76cfe866e482745ea8c9956b0be6198fd72d08d2be77b71596afdb8cd89f/freetype_py-2.4.0-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl - sha256: ce931f581d5038c4fea1f3d314254e0264e92441a5fdaef6817fe77b7bb888d3 + url: https://files.pythonhosted.org/packages/b4/f5/4b8bb492464247236bd3dabd7734b3ea49adc63cf2e53160e830ebccb39d/freetype_py-2.4.0-py3-none-win_amd64.whl + sha256: a2620788d4f0c00bd75fee2dfca61635ab0da856131598c96e2355d5257f70e5 requires_python: '>=3.7' - kind: pypi name: freetype-py version: 2.4.0 - url: https://files.pythonhosted.org/packages/7c/77/faec42d1ffac2b970f606860a5bb083d606f1c673a5c57ab26382c8efec1/freetype_py-2.4.0-py3-none-macosx_10_9_universal2.whl - sha256: 3e0f5a91bc812f42d98a92137e86bac4ed037a29e43dafdb76d716d5732189e8 + url: https://files.pythonhosted.org/packages/85/45/f0200e64029aa0474ba4dc3e325d32c023c6607d6d8e5bc278aa27c570d3/freetype_py-2.4.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: c9a3abc277f5f6d21575c0093c0c6139c161bf05b91aa6258505ab27c5001c5e requires_python: '>=3.7' - kind: pypi name: freetype-py version: 2.4.0 - url: https://files.pythonhosted.org/packages/85/45/f0200e64029aa0474ba4dc3e325d32c023c6607d6d8e5bc278aa27c570d3/freetype_py-2.4.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: c9a3abc277f5f6d21575c0093c0c6139c161bf05b91aa6258505ab27c5001c5e + url: https://files.pythonhosted.org/packages/5f/34/76cfe866e482745ea8c9956b0be6198fd72d08d2be77b71596afdb8cd89f/freetype_py-2.4.0-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl + sha256: ce931f581d5038c4fea1f3d314254e0264e92441a5fdaef6817fe77b7bb888d3 requires_python: '>=3.7' - kind: pypi name: freetype-py version: 2.4.0 - url: https://files.pythonhosted.org/packages/b4/f5/4b8bb492464247236bd3dabd7734b3ea49adc63cf2e53160e830ebccb39d/freetype_py-2.4.0-py3-none-win_amd64.whl - sha256: a2620788d4f0c00bd75fee2dfca61635ab0da856131598c96e2355d5257f70e5 + url: https://files.pythonhosted.org/packages/7c/77/faec42d1ffac2b970f606860a5bb083d606f1c673a5c57ab26382c8efec1/freetype_py-2.4.0-py3-none-macosx_10_9_universal2.whl + sha256: 3e0f5a91bc812f42d98a92137e86bac4ed037a29e43dafdb76d716d5732189e8 requires_python: '>=3.7' - kind: conda name: fribidi @@ -19571,21 +19448,6 @@ packages: - tqdm requires_python: <3.12 editable: true -- kind: pypi - name: gesture-detection - version: 0.1.0 - path: examples/python/gesture_detection - sha256: 36dfc4cc822ee47f7aa29ba951bab8a94e96b9fd737daa324a441e6962a620bd - requires_dist: - - mediapipe==0.10.11 ; sys_platform != 'darwin' - - mediapipe==0.10.9 ; sys_platform == 'darwin' - - numpy - - opencv-python>4.9 - - requests>=2.31,<3 - - rerun-sdk - - tqdm - requires_python: <3.12 - editable: true - kind: conda name: gettext version: 0.22.5 @@ -20149,32 +20011,32 @@ packages: - kind: pypi name: google-crc32c version: 1.5.0 - url: https://files.pythonhosted.org/packages/41/3f/8141b03ad127fc569c3efda2bfe31d64665e02e2b8b7fbf7b25ea914c27a/google_crc32c-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 1034d91442ead5a95b5aaef90dbfaca8633b0247d1e41621d1e9f9db88c36298 + url: https://files.pythonhosted.org/packages/72/92/2a2fa23db7d0b0382accbdf09768c28f7c07fc8c354cdcf2f44a47f4314e/google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 77e2fd3057c9d78e225fa0a2160f96b64a824de17840351b26825b0848022906 requires_dist: - pytest ; extra == 'testing' requires_python: '>=3.7' - kind: pypi name: google-crc32c version: 1.5.0 - url: https://files.pythonhosted.org/packages/69/0f/7f89ae2b22c55273110a44a7ed55a2948bc213fb58983093fbefcdfd2d13/google_crc32c-1.5.0-cp311-cp311-macosx_10_9_universal2.whl - sha256: cae0274952c079886567f3f4f685bcaf5708f0a23a5f5216fdab71f81a6c0273 + url: https://files.pythonhosted.org/packages/ce/8b/02bf4765c487901c8660290ade9929d65a6151c367ba32e75d136ef2d0eb/google_crc32c-1.5.0-cp311-cp311-win_amd64.whl + sha256: ba1eb1843304b1e5537e1fca632fa894d6f6deca8d6389636ee5b4797affb968 requires_dist: - pytest ; extra == 'testing' requires_python: '>=3.7' - kind: pypi name: google-crc32c version: 1.5.0 - url: https://files.pythonhosted.org/packages/72/92/2a2fa23db7d0b0382accbdf09768c28f7c07fc8c354cdcf2f44a47f4314e/google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 77e2fd3057c9d78e225fa0a2160f96b64a824de17840351b26825b0848022906 + url: https://files.pythonhosted.org/packages/69/0f/7f89ae2b22c55273110a44a7ed55a2948bc213fb58983093fbefcdfd2d13/google_crc32c-1.5.0-cp311-cp311-macosx_10_9_universal2.whl + sha256: cae0274952c079886567f3f4f685bcaf5708f0a23a5f5216fdab71f81a6c0273 requires_dist: - pytest ; extra == 'testing' requires_python: '>=3.7' - kind: pypi name: google-crc32c version: 1.5.0 - url: https://files.pythonhosted.org/packages/ce/8b/02bf4765c487901c8660290ade9929d65a6151c367ba32e75d136ef2d0eb/google_crc32c-1.5.0-cp311-cp311-win_amd64.whl - sha256: ba1eb1843304b1e5537e1fca632fa894d6f6deca8d6389636ee5b4797affb968 + url: https://files.pythonhosted.org/packages/41/3f/8141b03ad127fc569c3efda2bfe31d64665e02e2b8b7fbf7b25ea914c27a/google_crc32c-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 1034d91442ead5a95b5aaef90dbfaca8633b0247d1e41621d1e9f9db88c36298 requires_dist: - pytest ; extra == 'testing' requires_python: '>=3.7' @@ -20300,16 +20162,6 @@ packages: - multidict - protobuf>=3.20.0 ; extra == 'protobuf' requires_python: '>=3.7' -- kind: pypi - name: grpclib - version: 0.4.7 - url: https://files.pythonhosted.org/packages/79/b9/55936e462a5925190d7427e880b3033601d1effd13809b483d13a926061a/grpclib-0.4.7.tar.gz - sha256: 2988ef57c02b22b7a2e8e961792c41ccf97efc2ace91ae7a5b0de03c363823c3 - requires_dist: - - h2<5,>=3.1.0 - - multidict - - protobuf>=3.20.0 ; extra == 'protobuf' - requires_python: '>=3.7' - kind: conda name: gxx version: 12.4.0 @@ -21089,20 +20941,6 @@ packages: - rerun-sdk requires_python: <3.12 editable: true -- kind: pypi - name: human-pose-tracking - version: 0.1.0 - path: examples/python/human_pose_tracking - sha256: 8a80b67528d3f6d0c82671dc5c36cf551faa4b879f4434f0d386d8ef85666e86 - requires_dist: - - mediapipe==0.10.11 ; sys_platform != 'darwin' - - mediapipe==0.10.9 ; sys_platform == 'darwin' - - numpy - - opencv-python>4.6 - - requests>=2.31,<3 - - rerun-sdk - requires_python: <3.12 - editable: true - kind: pypi name: humanize version: 4.10.0 @@ -21516,15 +21354,6 @@ packages: - numpy - rerun-sdk editable: true -- kind: pypi - name: incremental-logging - version: 0.1.0 - path: examples/python/incremental_logging - sha256: c1efe33868c31fe5a07ab5f6e60d28f856735a9e0b221ff96abd2e711d60e894 - requires_dist: - - numpy - - rerun-sdk - editable: true - kind: conda name: iniconfig version: 2.0.0 @@ -21852,8 +21681,8 @@ packages: - kind: pypi name: jaxlib version: 0.4.30 - url: https://files.pythonhosted.org/packages/a6/a3/951da3d1487b2f8995a2a14cc7e9496c9a7c93aa1f1d0b33e833e24dee92/jaxlib-0.4.30-cp311-cp311-manylinux2014_x86_64.whl - sha256: 16b2ab18ea90d2e15941bcf45de37afc2f289a029129c88c8d7aba0404dd0043 + url: https://files.pythonhosted.org/packages/bb/1a/8f45ea28a5ca67e4d23ebd70fc78ea94be6fa20323f983c7607c32c6f9a5/jaxlib-0.4.30-cp311-cp311-win_amd64.whl + sha256: 3a2e2c11c179f8851a72249ba1ae40ae817dfaee9877d23b3b8f7c6b7a012f76 requires_dist: - scipy>=1.9 - numpy>=1.22 @@ -21863,8 +21692,8 @@ packages: - kind: pypi name: jaxlib version: 0.4.30 - url: https://files.pythonhosted.org/packages/bb/1a/8f45ea28a5ca67e4d23ebd70fc78ea94be6fa20323f983c7607c32c6f9a5/jaxlib-0.4.30-cp311-cp311-win_amd64.whl - sha256: 3a2e2c11c179f8851a72249ba1ae40ae817dfaee9877d23b3b8f7c6b7a012f76 + url: https://files.pythonhosted.org/packages/a6/a3/951da3d1487b2f8995a2a14cc7e9496c9a7c93aa1f1d0b33e833e24dee92/jaxlib-0.4.30-cp311-cp311-manylinux2014_x86_64.whl + sha256: 16b2ab18ea90d2e15941bcf45de37afc2f289a029129c88c8d7aba0404dd0043 requires_dist: - scipy>=1.9 - numpy>=1.22 @@ -22505,40 +22334,40 @@ packages: - kind: pypi name: kiwisolver version: 1.4.5 - url: https://files.pythonhosted.org/packages/17/ba/17a706b232308e65f57deeccae503c268292e6a091313f6ce833a23093ea/kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e + url: https://files.pythonhosted.org/packages/1e/37/d3c2d4ba2719059a0f12730947bbe1ad5ee8bff89e8c35319dcb2c9ddb4c/kiwisolver-1.4.5-cp311-cp311-win_amd64.whl + sha256: 6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355 requires_dist: - typing-extensions ; python_version < '3.8' requires_python: '>=3.7' - kind: pypi name: kiwisolver version: 1.4.5 - url: https://files.pythonhosted.org/packages/1e/37/d3c2d4ba2719059a0f12730947bbe1ad5ee8bff89e8c35319dcb2c9ddb4c/kiwisolver-1.4.5-cp311-cp311-win_amd64.whl - sha256: 6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355 + url: https://files.pythonhosted.org/packages/8d/26/b4569d1f29751fca22ee915b4ebfef5974f4ef239b3335fc072882bd62d9/kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437 requires_dist: - typing-extensions ; python_version < '3.8' requires_python: '>=3.7' - kind: pypi name: kiwisolver version: 1.4.5 - url: https://files.pythonhosted.org/packages/4a/fe/23d7fa78f7c66086d196406beb1fb2eaf629dd7adc01c3453033303d17fa/kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl - sha256: fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797 + url: https://files.pythonhosted.org/packages/17/ba/17a706b232308e65f57deeccae503c268292e6a091313f6ce833a23093ea/kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e requires_dist: - typing-extensions ; python_version < '3.8' requires_python: '>=3.7' - kind: pypi name: kiwisolver version: 1.4.5 - url: https://files.pythonhosted.org/packages/8d/26/b4569d1f29751fca22ee915b4ebfef5974f4ef239b3335fc072882bd62d9/kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437 + url: https://files.pythonhosted.org/packages/a6/94/695922e71288855fc7cace3bdb52edda9d7e50edba77abb0c9d7abb51e96/kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90 requires_dist: - typing-extensions ; python_version < '3.8' requires_python: '>=3.7' - kind: pypi name: kiwisolver version: 1.4.5 - url: https://files.pythonhosted.org/packages/a6/94/695922e71288855fc7cace3bdb52edda9d7e50edba77abb0c9d7abb51e96/kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90 + url: https://files.pythonhosted.org/packages/4a/fe/23d7fa78f7c66086d196406beb1fb2eaf629dd7adc01c3453033303d17fa/kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl + sha256: fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797 requires_dist: - typing-extensions ; python_version < '3.8' requires_python: '>=3.7' @@ -22719,27 +22548,6 @@ packages: - pyproj ; extra == 'pyproj' - requests ; extra == 'requests' requires_python: '>=3.7' -- kind: pypi - name: laspy - version: 2.4.1 - url: https://files.pythonhosted.org/packages/7a/68/c864ea8e55c1fc3f1259375a0a31c60a06618cda4e14572c7d0e0aada6c2/laspy-2.4.1.tar.gz - sha256: 13caecc7325cb2242cb25394984d21b3b5f796c88bcb44bc2ed2d3cf1b972ac4 - requires_dist: - - numpy - - pytest ; extra == 'dev' - - coverage ; extra == 'dev' - - sphinx ; extra == 'dev' - - sphinx-rtd-theme ; extra == 'dev' - - nox ; extra == 'dev' - - black==22.3.0 ; extra == 'dev' - - pytest-benchmark ; extra == 'dev' - - m2r2 ; extra == 'dev' - - rangehttpserver ; extra == 'dev' - - laszip<0.3.0,>=0.2.1 ; extra == 'laszip' - - lazrs<0.6.0,>=0.5.0 ; extra == 'lazrs' - - pyproj ; extra == 'pyproj' - - requests ; extra == 'requests' - requires_python: '>=3.7' - kind: pypi name: lazy-loader version: '0.4' @@ -32110,27 +31918,6 @@ packages: - requests - rerun-sdk editable: true -- kind: pypi - name: lidar - version: 0.1.0 - path: examples/python/lidar - sha256: 10fe6d7b3a80959f913aada12c01bfecd6cd9854beaf6a8843a7ecd2215cd4bd - requires_dist: - - matplotlib - - numpy - - nuscenes-devkit - - requests - - rerun-sdk - editable: true -- kind: pypi - name: live-camera-edge-detection - version: 0.1.0 - path: examples/python/live_camera_edge_detection - sha256: f1edef43efce87f55726e3b5d6a2f813667968f8e8185873a74b9dc61c0f040f - requires_dist: - - opencv-python - - rerun-sdk - editable: true - kind: pypi name: live-camera-edge-detection version: 0.1.0 @@ -32149,27 +31936,6 @@ packages: - numpy - rerun-sdk editable: true -- kind: pypi - name: live-scrolling-plot - version: 0.1.0 - path: examples/python/live_scrolling_plot - sha256: 1debab1814169399bb2ed23af2cd97a4693e7a4d4ee55e74bcb8804bf421e8fc - requires_dist: - - numpy - - rerun-sdk - editable: true -- kind: pypi - name: llm-embedding-ner - version: 0.1.0 - path: examples/python/llm_embedding_ner - sha256: 6f5925cbe333d529421ef9a5114f85317bdd8b4200c1e9ff6798dff5e3a7f16f - requires_dist: - - rerun-sdk - - torch - - transformers - - umap-learn - requires_python: <3.12 - editable: true - kind: pypi name: llm-embedding-ner version: 0.1.0 @@ -32302,14 +32068,6 @@ packages: requires_dist: - rerun-sdk editable: true -- kind: pypi - name: log-file - version: 0.1.0 - path: examples/python/log_file - sha256: fb6af8faeaac3e8d16da4ab40e26a73dd0e63483f34aa36298c32f7e39324fd3 - requires_dist: - - rerun-sdk - editable: true - kind: pypi name: lxml version: 5.2.2 @@ -32325,8 +32083,8 @@ packages: - kind: pypi name: lxml version: 5.2.2 - url: https://files.pythonhosted.org/packages/4e/42/3bfe92749715c819763d2205370ecc7f586b44e277f38839e27cce7d6bb8/lxml-5.2.2-cp311-cp311-macosx_10_9_x86_64.whl - sha256: b0b3f2df149efb242cee2ffdeb6674b7f30d23c9a7af26595099afaf46ef4e88 + url: https://files.pythonhosted.org/packages/4e/56/c35969591789763657eb16c2fa79c924823b97da5536da8b89e11582da89/lxml-5.2.2-cp311-cp311-manylinux_2_28_aarch64.whl + sha256: 2eb2227ce1ff998faf0cd7fe85bbf086aa41dfc5af3b1d80867ecfe75fb68df3 requires_dist: - cssselect>=0.7 ; extra == 'cssselect' - html5lib ; extra == 'html5' @@ -32337,8 +32095,8 @@ packages: - kind: pypi name: lxml version: 5.2.2 - url: https://files.pythonhosted.org/packages/4e/56/c35969591789763657eb16c2fa79c924823b97da5536da8b89e11582da89/lxml-5.2.2-cp311-cp311-manylinux_2_28_aarch64.whl - sha256: 2eb2227ce1ff998faf0cd7fe85bbf086aa41dfc5af3b1d80867ecfe75fb68df3 + url: https://files.pythonhosted.org/packages/ad/b7/0dc82afed00c4c189cfd0b83464f9a431c66de8e73d911063956a147276a/lxml-5.2.2-cp311-cp311-manylinux_2_28_x86_64.whl + sha256: eb00b549b13bd6d884c863554566095bf6fa9c3cecb2e7b399c4bc7904cb33b5 requires_dist: - cssselect>=0.7 ; extra == 'cssselect' - html5lib ; extra == 'html5' @@ -32349,8 +32107,8 @@ packages: - kind: pypi name: lxml version: 5.2.2 - url: https://files.pythonhosted.org/packages/ad/b7/0dc82afed00c4c189cfd0b83464f9a431c66de8e73d911063956a147276a/lxml-5.2.2-cp311-cp311-manylinux_2_28_x86_64.whl - sha256: eb00b549b13bd6d884c863554566095bf6fa9c3cecb2e7b399c4bc7904cb33b5 + url: https://files.pythonhosted.org/packages/4e/42/3bfe92749715c819763d2205370ecc7f586b44e277f38839e27cce7d6bb8/lxml-5.2.2-cp311-cp311-macosx_10_9_x86_64.whl + sha256: b0b3f2df149efb242cee2ffdeb6674b7f30d23c9a7af26595099afaf46ef4e88 requires_dist: - cssselect>=0.7 ; extra == 'cssselect' - html5lib ; extra == 'html5' @@ -32563,6 +32321,12 @@ packages: - pytest-cov ; extra == 'testing' - pytest-regressions ; extra == 'testing' requires_python: '>=3.8' +- kind: pypi + name: markupsafe + version: 2.1.5 + url: https://files.pythonhosted.org/packages/97/18/c30da5e7a0e7f4603abfc6780574131221d9148f323752c2755d48abad30/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5 + requires_python: '>=3.7' - kind: pypi name: markupsafe version: 2.1.5 @@ -32581,12 +32345,6 @@ packages: url: https://files.pythonhosted.org/packages/6b/cb/aed7a284c00dfa7c0682d14df85ad4955a350a21d2e3b06d8240497359bf/MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl sha256: 5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2 requires_python: '>=3.7' -- kind: pypi - name: markupsafe - version: 2.1.5 - url: https://files.pythonhosted.org/packages/97/18/c30da5e7a0e7f4603abfc6780574131221d9148f323752c2755d48abad30/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5 - requires_python: '>=3.7' - kind: pypi name: markupsafe version: 2.1.5 @@ -32716,8 +32474,8 @@ packages: - kind: pypi name: matplotlib version: 3.9.1.post1 - url: https://files.pythonhosted.org/packages/0a/d4/c0812c410de88e8646727a7c000741331875ae556018725ae169d206f0a2/matplotlib-3.9.1.post1-cp311-cp311-win_amd64.whl - sha256: c44edab5b849e0fc1f1c9d6e13eaa35ef65925f7be45be891d9784709ad95561 + url: https://files.pythonhosted.org/packages/a5/8b/90fae9c1b34ef3252003c26b15e8cb26b83701e34e5acf6430919c2c5c89/matplotlib-3.9.1.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 89eb7e89e2b57856533c5c98f018aa3254fa3789fcd86d5f80077b9034a54c9a requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -32738,8 +32496,8 @@ packages: - kind: pypi name: matplotlib version: 3.9.1.post1 - url: https://files.pythonhosted.org/packages/41/dc/1f51d34daebbfe172b78fa5b5be467554b973ef30b80ed2f6200b34d3223/matplotlib-3.9.1.post1-cp311-cp311-macosx_10_12_x86_64.whl - sha256: b08b46058fe2a31ecb81ef6aa3611f41d871f6a8280e9057cb4016cb3d8e894a + url: https://files.pythonhosted.org/packages/43/ef/3fadf6545a0c609c7720477b2bfa2e578f99c106e3bd1aaf591e006c3434/matplotlib-3.9.1.post1-cp311-cp311-macosx_11_0_arm64.whl + sha256: 22b344e84fcc574f561b5731f89a7625db8ef80cdbb0026a8ea855a33e3429d1 requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -32760,8 +32518,8 @@ packages: - kind: pypi name: matplotlib version: 3.9.1.post1 - url: https://files.pythonhosted.org/packages/43/ef/3fadf6545a0c609c7720477b2bfa2e578f99c106e3bd1aaf591e006c3434/matplotlib-3.9.1.post1-cp311-cp311-macosx_11_0_arm64.whl - sha256: 22b344e84fcc574f561b5731f89a7625db8ef80cdbb0026a8ea855a33e3429d1 + url: https://files.pythonhosted.org/packages/c3/2b/1c9e695967edb54f0cfb1ea5d41f5482344cf245489f8a47aa427825f264/matplotlib-3.9.1.post1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 4b49fee26d64aefa9f061b575f0f7b5fc4663e51f87375c7239efa3d30d908fa requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -32782,8 +32540,8 @@ packages: - kind: pypi name: matplotlib version: 3.9.1.post1 - url: https://files.pythonhosted.org/packages/a5/8b/90fae9c1b34ef3252003c26b15e8cb26b83701e34e5acf6430919c2c5c89/matplotlib-3.9.1.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 89eb7e89e2b57856533c5c98f018aa3254fa3789fcd86d5f80077b9034a54c9a + url: https://files.pythonhosted.org/packages/41/dc/1f51d34daebbfe172b78fa5b5be467554b973ef30b80ed2f6200b34d3223/matplotlib-3.9.1.post1-cp311-cp311-macosx_10_12_x86_64.whl + sha256: b08b46058fe2a31ecb81ef6aa3611f41d871f6a8280e9057cb4016cb3d8e894a requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -32804,8 +32562,8 @@ packages: - kind: pypi name: matplotlib version: 3.9.1.post1 - url: https://files.pythonhosted.org/packages/c3/2b/1c9e695967edb54f0cfb1ea5d41f5482344cf245489f8a47aa427825f264/matplotlib-3.9.1.post1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 4b49fee26d64aefa9f061b575f0f7b5fc4663e51f87375c7239efa3d30d908fa + url: https://files.pythonhosted.org/packages/0a/d4/c0812c410de88e8646727a7c000741331875ae556018725ae169d206f0a2/matplotlib-3.9.1.post1-cp311-cp311-win_amd64.whl + sha256: c44edab5b849e0fc1f1c9d6e13eaa35ef65925f7be45be891d9784709ad95561 requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -32826,8 +32584,8 @@ packages: - kind: pypi name: matplotlib version: 3.9.2 - url: https://files.pythonhosted.org/packages/01/75/6c7ce560e95714a10fcbb3367d1304975a1a3e620f72af28921b796403f3/matplotlib-3.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 8912ef7c2362f7193b5819d17dae8629b34a95c58603d781329712ada83f9447 + url: https://files.pythonhosted.org/packages/8b/ce/15b0bb2fb29b3d46211d8ca740b96b5232499fc49200b58b8d571292c9a6/matplotlib-3.9.2-cp311-cp311-win_amd64.whl + sha256: ae82a14dab96fbfad7965403c643cafe6515e386de723e498cf3eeb1e0b70cc7 requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -32848,8 +32606,8 @@ packages: - kind: pypi name: matplotlib version: 3.9.2 - url: https://files.pythonhosted.org/packages/28/ba/8be09886eb56ac04a218a1dc3fa728a5c4cac60b019b4f1687885166da00/matplotlib-3.9.2-cp311-cp311-macosx_11_0_arm64.whl - sha256: c797dac8bb9c7a3fd3382b16fe8f215b4cf0f22adccea36f1545a6d7be310b41 + url: https://files.pythonhosted.org/packages/e6/9a/5991972a560db3ab621312a7ca5efec339ae2122f25901c0846865c4b72f/matplotlib-3.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: d719465db13267bcef19ea8954a971db03b9f48b4647e3860e4bc8e6ed86610f requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -32870,8 +32628,8 @@ packages: - kind: pypi name: matplotlib version: 3.9.2 - url: https://files.pythonhosted.org/packages/77/c2/f9d7fe80a8fcce9bb128d1381c6fe41a8d286d7e18395e273002e8e0fa34/matplotlib-3.9.2-cp311-cp311-macosx_10_12_x86_64.whl - sha256: d8dd059447824eec055e829258ab092b56bb0579fc3164fa09c64f3acd478772 + url: https://files.pythonhosted.org/packages/01/75/6c7ce560e95714a10fcbb3367d1304975a1a3e620f72af28921b796403f3/matplotlib-3.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 8912ef7c2362f7193b5819d17dae8629b34a95c58603d781329712ada83f9447 requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -32892,8 +32650,8 @@ packages: - kind: pypi name: matplotlib version: 3.9.2 - url: https://files.pythonhosted.org/packages/8b/ce/15b0bb2fb29b3d46211d8ca740b96b5232499fc49200b58b8d571292c9a6/matplotlib-3.9.2-cp311-cp311-win_amd64.whl - sha256: ae82a14dab96fbfad7965403c643cafe6515e386de723e498cf3eeb1e0b70cc7 + url: https://files.pythonhosted.org/packages/77/c2/f9d7fe80a8fcce9bb128d1381c6fe41a8d286d7e18395e273002e8e0fa34/matplotlib-3.9.2-cp311-cp311-macosx_10_12_x86_64.whl + sha256: d8dd059447824eec055e829258ab092b56bb0579fc3164fa09c64f3acd478772 requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -32914,8 +32672,8 @@ packages: - kind: pypi name: matplotlib version: 3.9.2 - url: https://files.pythonhosted.org/packages/e6/9a/5991972a560db3ab621312a7ca5efec339ae2122f25901c0846865c4b72f/matplotlib-3.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: d719465db13267bcef19ea8954a971db03b9f48b4647e3860e4bc8e6ed86610f + url: https://files.pythonhosted.org/packages/28/ba/8be09886eb56ac04a218a1dc3fa728a5c4cac60b019b4f1687885166da00/matplotlib-3.9.2-cp311-cp311-macosx_11_0_arm64.whl + sha256: c797dac8bb9c7a3fd3382b16fe8f215b4cf0f22adccea36f1545a6d7be310b41 requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -33053,8 +32811,8 @@ packages: - kind: pypi name: mediapipe version: 0.10.9 - url: https://files.pythonhosted.org/packages/a3/3a/f309c6bdebe596cc8c960542e167331cb01ef130ec38f3da46a499718889/mediapipe-0.10.9-cp311-cp311-macosx_11_0_universal2.whl - sha256: 8733735f582e6e6a05bf9b15c48b03a6387a0795793a2530aa1189eecfd33780 + url: https://files.pythonhosted.org/packages/c1/71/38b16b1e4504ff92dff875d455c19e62125fccd73d5ce7e06b560f77fd26/mediapipe-0.10.9-cp311-cp311-macosx_11_0_x86_64.whl + sha256: b7dde54b82732479b9b856c9230b9f7b3da55b0913dde5254a7489e20c2e3c6e requires_dist: - absl-py - attrs>=19.1.0 @@ -33067,8 +32825,8 @@ packages: - kind: pypi name: mediapipe version: 0.10.9 - url: https://files.pythonhosted.org/packages/c1/71/38b16b1e4504ff92dff875d455c19e62125fccd73d5ce7e06b560f77fd26/mediapipe-0.10.9-cp311-cp311-macosx_11_0_x86_64.whl - sha256: b7dde54b82732479b9b856c9230b9f7b3da55b0913dde5254a7489e20c2e3c6e + url: https://files.pythonhosted.org/packages/a3/3a/f309c6bdebe596cc8c960542e167331cb01ef130ec38f3da46a499718889/mediapipe-0.10.9-cp311-cp311-macosx_11_0_universal2.whl + sha256: 8733735f582e6e6a05bf9b15c48b03a6387a0795793a2530aa1189eecfd33780 requires_dist: - absl-py - attrs>=19.1.0 @@ -33148,16 +32906,6 @@ packages: - scikit-image - scikit-learn requires_python: '>=3.5' -- kind: pypi - name: mesh-to-sdf - version: 0.0.15 - url: git+https://github.com/marian42/mesh_to_sdf.git@c9f26e6399f7fd8deb40c7fba02c7e74aca6c657 - requires_dist: - - pyopengl - - pyrender - - scikit-image - - scikit-learn - requires_python: '>=3.5' - kind: pypi name: minimal version: 0.1.0 @@ -33167,24 +32915,6 @@ packages: - numpy - rerun-sdk editable: true -- kind: pypi - name: minimal - version: 0.1.0 - path: examples/python/minimal - sha256: 871c1ec39ceb3af42679653369402d66672d4bb9850a727b27db05c16653c8dd - requires_dist: - - numpy - - rerun-sdk - editable: true -- kind: pypi - name: minimal-options - version: 0.1.0 - path: examples/python/minimal_options - sha256: 84d5a8787772da382454f2f3b44d54027a606bff043872dab559cc4604ac82f0 - requires_dist: - - numpy - - rerun-sdk - editable: true - kind: pypi name: minimal-options version: 0.1.0 @@ -33237,8 +32967,8 @@ packages: - kind: pypi name: ml-dtypes version: 0.4.0 - url: https://files.pythonhosted.org/packages/84/17/a936d3dfad84d028ba8539a93167274b7dcd7985e0d9df487e94a62f9428/ml_dtypes-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: e1e2f4237b459a63c97c2c9f449baa637d7e4c20addff6a9bac486f22432f3b6 + url: https://files.pythonhosted.org/packages/f0/36/290745178e5776f7416818abc1334c1b19afb93c7c87fd1bef3cc99f84ca/ml_dtypes-0.4.0-cp311-cp311-win_amd64.whl + sha256: 75b4faf99d0711b81f393db36d210b4255fd419f6f790bc6c1b461f95ffb7a9e requires_dist: - numpy>1.20 - numpy>=1.21.2 ; python_version >= '3.10' @@ -33253,8 +32983,8 @@ packages: - kind: pypi name: ml-dtypes version: 0.4.0 - url: https://files.pythonhosted.org/packages/f0/36/290745178e5776f7416818abc1334c1b19afb93c7c87fd1bef3cc99f84ca/ml_dtypes-0.4.0-cp311-cp311-win_amd64.whl - sha256: 75b4faf99d0711b81f393db36d210b4255fd419f6f790bc6c1b461f95ffb7a9e + url: https://files.pythonhosted.org/packages/84/17/a936d3dfad84d028ba8539a93167274b7dcd7985e0d9df487e94a62f9428/ml_dtypes-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: e1e2f4237b459a63c97c2c9f449baa637d7e4c20addff6a9bac486f22432f3b6 requires_dist: - numpy>1.20 - numpy>=1.21.2 ; python_version >= '3.10' @@ -33301,14 +33031,14 @@ packages: - kind: pypi name: multidict version: 6.0.5 - url: https://files.pythonhosted.org/packages/02/c1/b15ecceb6ffa5081ed2ed450aea58d65b0e0358001f2b426705f9f41f4c2/multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl - sha256: 612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd + url: https://files.pythonhosted.org/packages/52/ec/be54a3ad110f386d5bd7a9a42a4ff36b3cd723ebe597f41073a73ffa16b8/multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed requires_python: '>=3.7' - kind: pypi name: multidict version: 6.0.5 - url: https://files.pythonhosted.org/packages/21/db/3403263f158b0bc7b0d4653766d71cb39498973f2042eead27b2e9758782/multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e + url: https://files.pythonhosted.org/packages/02/c1/b15ecceb6ffa5081ed2ed450aea58d65b0e0358001f2b426705f9f41f4c2/multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl + sha256: 612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd requires_python: '>=3.7' - kind: pypi name: multidict @@ -33319,8 +33049,8 @@ packages: - kind: pypi name: multidict version: 6.0.5 - url: https://files.pythonhosted.org/packages/52/ec/be54a3ad110f386d5bd7a9a42a4ff36b3cd723ebe597f41073a73ffa16b8/multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed + url: https://files.pythonhosted.org/packages/21/db/3403263f158b0bc7b0d4653766d71cb39498973f2042eead27b2e9758782/multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e requires_python: '>=3.7' - kind: pypi name: multidict @@ -33428,14 +33158,6 @@ packages: requires_dist: - rerun-sdk editable: true -- kind: pypi - name: multiprocess-logging - version: 0.1.0 - path: examples/python/multiprocess_logging - sha256: 90ae836d45110662ac53e73a092a5298ab67d89873eed81d1773dba601a62eb2 - requires_dist: - - rerun-sdk - editable: true - kind: pypi name: multitasking version: 0.0.11 @@ -33450,15 +33172,6 @@ packages: - numpy - rerun-sdk editable: true -- kind: pypi - name: multithreading - version: 0.1.0 - path: examples/python/multithreading - sha256: 85b43cb06183386edd0a8820c0c9eb50398c197fd0da8ba5050f2cf2b24bc23e - requires_dist: - - numpy - - rerun-sdk - editable: true - kind: conda name: mypy version: 1.8.0 @@ -33669,6 +33382,89 @@ packages: purls: [] size: 1537884 timestamp: 1709910705541 +- kind: conda + name: nasm + version: 2.16.03 + build: h4bc722e_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/nasm-2.16.03-h4bc722e_1.conda + sha256: d01bfa655ad08d33dc5830a5166c7b664143df24fab59d41df15f076c58000b6 + md5: 35f8ab79609d5bc56d6d040f12dacf3a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 1221519 + timestamp: 1721652638250 +- kind: conda + name: nasm + version: 2.16.03 + build: h68df207_1 + build_number: 1 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/nasm-2.16.03-h68df207_1.conda + sha256: af354688ee0ab41bd6d538b5c12fc392825da0e9549d5b4256ec13704b177bbd + md5: 277a1d8aa07160de3d02302364fd4dde + depends: + - libgcc-ng >=12 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 1332204 + timestamp: 1721654126314 +- kind: conda + name: nasm + version: 2.16.03 + build: h99b78c6_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/nasm-2.16.03-h99b78c6_1.conda + sha256: a1d8b8f6be3ccf94d8f29920a61fa83e4a94da84e8f0bdec4a5937092d56e59d + md5: c306196adb43e1300e1470dd65694ec5 + depends: + - __osx >=11.0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 385586 + timestamp: 1721652965778 +- kind: conda + name: nasm + version: 2.16.03 + build: hfd05255_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/nasm-2.16.03-hfd05255_1.conda + sha256: cce00ed17e684bf84c8cc592de578fedfb93b2d2357256c41c262b67ceacf6e7 + md5: ead716d50b01f09d327c781c05b25882 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.40.33810 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 450395 + timestamp: 1721653214123 +- kind: conda + name: nasm + version: 2.16.03 + build: hfdf4475_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/nasm-2.16.03-hfdf4475_1.conda + sha256: 67e4730cee8b72abdcd587e3407dad7eb5fb97b07754c673cb20583d2e528ac0 + md5: aa906b48511f43e9496d9afb0660b7df + depends: + - __osx >=10.13 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 377182 + timestamp: 1721652783302 - kind: pypi name: nbclient version: 0.10.0 @@ -34232,8 +34028,8 @@ packages: - kind: pypi name: numba version: 0.60.0 - url: https://files.pythonhosted.org/packages/57/03/2b4245b05b71c0cee667e6a0b51606dfa7f4157c9093d71c6b208385a611/numba-0.60.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - sha256: 4142d7ac0210cc86432b818338a2bc368dc773a2f5cf1e32ff7c5b378bd63ee8 + url: https://files.pythonhosted.org/packages/79/89/2d924ca60dbf949f18a6fec223a2445f5f428d9a5f97a6b29c2122319015/numba-0.60.0-cp311-cp311-win_amd64.whl + sha256: cac02c041e9b5bc8cf8f2034ff6f0dbafccd1ae9590dc146b3a02a45e53af4e2 requires_dist: - llvmlite<0.44,>=0.43.0.dev0 - numpy<2.1,>=1.22 @@ -34241,8 +34037,8 @@ packages: - kind: pypi name: numba version: 0.60.0 - url: https://files.pythonhosted.org/packages/79/89/2d924ca60dbf949f18a6fec223a2445f5f428d9a5f97a6b29c2122319015/numba-0.60.0-cp311-cp311-win_amd64.whl - sha256: cac02c041e9b5bc8cf8f2034ff6f0dbafccd1ae9590dc146b3a02a45e53af4e2 + url: https://files.pythonhosted.org/packages/f9/4c/8889ac94c0b33dca80bed11564b8c6d9ea14d7f094e674c58e5c5b05859b/numba-0.60.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl + sha256: 5f4fde652ea604ea3c86508a3fb31556a6157b2c76c8b51b1d45eb40c8598703 requires_dist: - llvmlite<0.44,>=0.43.0.dev0 - numpy<2.1,>=1.22 @@ -34250,8 +34046,8 @@ packages: - kind: pypi name: numba version: 0.60.0 - url: https://files.pythonhosted.org/packages/98/ad/df18d492a8f00d29a30db307904b9b296e37507034eedb523876f3a2e13e/numba-0.60.0-cp311-cp311-macosx_10_9_x86_64.whl - sha256: a17b70fc9e380ee29c42717e8cc0bfaa5556c416d94f9aa96ba13acb41bdece8 + url: https://files.pythonhosted.org/packages/57/03/2b4245b05b71c0cee667e6a0b51606dfa7f4157c9093d71c6b208385a611/numba-0.60.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + sha256: 4142d7ac0210cc86432b818338a2bc368dc773a2f5cf1e32ff7c5b378bd63ee8 requires_dist: - llvmlite<0.44,>=0.43.0.dev0 - numpy<2.1,>=1.22 @@ -34259,8 +34055,8 @@ packages: - kind: pypi name: numba version: 0.60.0 - url: https://files.pythonhosted.org/packages/9a/51/a4dc2c01ce7a850b8e56ff6d5381d047a5daea83d12bad08aa071d34b2ee/numba-0.60.0-cp311-cp311-macosx_11_0_arm64.whl - sha256: 3fb02b344a2a80efa6f677aa5c40cd5dd452e1b35f8d1c2af0dfd9ada9978e4b + url: https://files.pythonhosted.org/packages/98/ad/df18d492a8f00d29a30db307904b9b296e37507034eedb523876f3a2e13e/numba-0.60.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: a17b70fc9e380ee29c42717e8cc0bfaa5556c416d94f9aa96ba13acb41bdece8 requires_dist: - llvmlite<0.44,>=0.43.0.dev0 - numpy<2.1,>=1.22 @@ -34268,8 +34064,8 @@ packages: - kind: pypi name: numba version: 0.60.0 - url: https://files.pythonhosted.org/packages/f9/4c/8889ac94c0b33dca80bed11564b8c6d9ea14d7f094e674c58e5c5b05859b/numba-0.60.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl - sha256: 5f4fde652ea604ea3c86508a3fb31556a6157b2c76c8b51b1d45eb40c8598703 + url: https://files.pythonhosted.org/packages/9a/51/a4dc2c01ce7a850b8e56ff6d5381d047a5daea83d12bad08aa071d34b2ee/numba-0.60.0-cp311-cp311-macosx_11_0_arm64.whl + sha256: 3fb02b344a2a80efa6f677aa5c40cd5dd452e1b35f8d1c2af0dfd9ada9978e4b requires_dist: - llvmlite<0.44,>=0.43.0.dev0 - numpy<2.1,>=1.22 @@ -34407,18 +34203,6 @@ packages: - requests - rerun-sdk editable: true -- kind: pypi - name: nuscenes-dataset - version: 0.1.0 - path: examples/python/nuscenes_dataset - sha256: 78903b7670fac2b4c27637efc9aa6f63b7b70502ce3d5f88e4353aef5607cf40 - requires_dist: - - matplotlib - - numpy - - nuscenes-devkit - - requests - - rerun-sdk - editable: true - kind: pypi name: nuscenes-devkit version: 1.1.9 @@ -34450,16 +34234,6 @@ packages: - opencv-python - numpy editable: true -- kind: pypi - name: nv12 - version: 0.1.0 - path: examples/python/nv12 - sha256: c8ca97c5d8c04037cd5eb9a65be7b1e7d667c11d4dba3ee9aad5956ccf926dc4 - requires_dist: - - rerun-sdk>=0.10 - - opencv-python - - numpy - editable: true - kind: pypi name: nvidia-cublas-cu12 version: 12.1.3.1 @@ -34553,19 +34327,6 @@ packages: - rerun-sdk - scipy editable: true -- kind: pypi - name: objectron - version: 0.1.0 - path: examples/python/objectron - sha256: b2be2b675353b4238e7778b1cef8351950832c32b5e5c34415601c030a421a27 - requires_dist: - - betterproto[compiler] - - numpy - - opencv-python>4.6 - - requests>=2.31,<3 - - rerun-sdk - - scipy - editable: true - kind: conda name: ocl-icd version: 2.3.2 @@ -34596,20 +34357,6 @@ packages: - tqdm requires_python: '>=3.10' editable: true -- kind: pypi - name: open-photogrammetry-format - version: 0.1.0 - path: examples/python/open_photogrammetry_format - sha256: 1bf1ac24e064bb75c7f5672b761e519b8b941354a6d9c44d824643ff64f15e80 - requires_dist: - - numpy - - pillow - - pyopf - - requests - - rerun-sdk - - tqdm - requires_python: '>=3.10' - editable: true - kind: conda name: opencv version: 4.10.0 @@ -34709,8 +34456,8 @@ packages: - kind: pypi name: opencv-contrib-python version: 4.10.0.84 - url: https://files.pythonhosted.org/packages/09/94/d077c4c976c2d7a88812fd55396e92edae0e0c708689dbd8c8f508920e47/opencv_contrib_python-4.10.0.84-cp37-abi3-macosx_12_0_x86_64.whl - sha256: dea80d4db73b8acccf9e16b5744bf3654f47b22745074263f0a6c10de26c5ef5 + url: https://files.pythonhosted.org/packages/a7/9e/7110d2c5d543ab03b9581dbb1f8e2429863e44e0c9b4960b766f230c1279/opencv_contrib_python-4.10.0.84-cp37-abi3-win_amd64.whl + sha256: 47ec3160dae75f70e099b286d1a2e086d20dac8b06e759f60eaf867e6bdecba7 requires_dist: - numpy>=1.13.3 ; python_version < '3.7' - numpy>=1.21.0 ; python_version <= '3.9' and platform_system == 'Darwin' and platform_machine == 'arm64' @@ -34726,8 +34473,8 @@ packages: - kind: pypi name: opencv-contrib-python version: 4.10.0.84 - url: https://files.pythonhosted.org/packages/92/64/c1194510eaed272d86b53a08c790ca6ed1c450f06d401c49c8145fc46d40/opencv_contrib_python-4.10.0.84-cp37-abi3-macosx_11_0_arm64.whl - sha256: ee4b0919026d8c533aeb69b16c6ec4a891a2f6844efaa14121bf68838753209c + url: https://files.pythonhosted.org/packages/f8/76/f76fe74b864f3cfa737173ca12e8890aad8369e980006fb8a0b6cd14c6c7/opencv_contrib_python-4.10.0.84-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 040575b69e4f3aa761676bace4e3d1b8485fbfaf77ef77b266ab6bda5a3b5e9b requires_dist: - numpy>=1.13.3 ; python_version < '3.7' - numpy>=1.21.0 ; python_version <= '3.9' and platform_system == 'Darwin' and platform_machine == 'arm64' @@ -34743,8 +34490,8 @@ packages: - kind: pypi name: opencv-contrib-python version: 4.10.0.84 - url: https://files.pythonhosted.org/packages/a7/9e/7110d2c5d543ab03b9581dbb1f8e2429863e44e0c9b4960b766f230c1279/opencv_contrib_python-4.10.0.84-cp37-abi3-win_amd64.whl - sha256: 47ec3160dae75f70e099b286d1a2e086d20dac8b06e759f60eaf867e6bdecba7 + url: https://files.pythonhosted.org/packages/b0/e0/8f5d065ebb2e5941d289c5f653f944318f9e418bc5167bc6a346ab5e0f6a/opencv_contrib_python-4.10.0.84-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: a261223db41f6e512d76deaf21c8fcfb4fbbcbc2de62ca7f74a05f2c9ee489ef requires_dist: - numpy>=1.13.3 ; python_version < '3.7' - numpy>=1.21.0 ; python_version <= '3.9' and platform_system == 'Darwin' and platform_machine == 'arm64' @@ -34760,8 +34507,8 @@ packages: - kind: pypi name: opencv-contrib-python version: 4.10.0.84 - url: https://files.pythonhosted.org/packages/b0/e0/8f5d065ebb2e5941d289c5f653f944318f9e418bc5167bc6a346ab5e0f6a/opencv_contrib_python-4.10.0.84-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: a261223db41f6e512d76deaf21c8fcfb4fbbcbc2de62ca7f74a05f2c9ee489ef + url: https://files.pythonhosted.org/packages/09/94/d077c4c976c2d7a88812fd55396e92edae0e0c708689dbd8c8f508920e47/opencv_contrib_python-4.10.0.84-cp37-abi3-macosx_12_0_x86_64.whl + sha256: dea80d4db73b8acccf9e16b5744bf3654f47b22745074263f0a6c10de26c5ef5 requires_dist: - numpy>=1.13.3 ; python_version < '3.7' - numpy>=1.21.0 ; python_version <= '3.9' and platform_system == 'Darwin' and platform_machine == 'arm64' @@ -34777,8 +34524,8 @@ packages: - kind: pypi name: opencv-contrib-python version: 4.10.0.84 - url: https://files.pythonhosted.org/packages/f8/76/f76fe74b864f3cfa737173ca12e8890aad8369e980006fb8a0b6cd14c6c7/opencv_contrib_python-4.10.0.84-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 040575b69e4f3aa761676bace4e3d1b8485fbfaf77ef77b266ab6bda5a3b5e9b + url: https://files.pythonhosted.org/packages/92/64/c1194510eaed272d86b53a08c790ca6ed1c450f06d401c49c8145fc46d40/opencv_contrib_python-4.10.0.84-cp37-abi3-macosx_11_0_arm64.whl + sha256: ee4b0919026d8c533aeb69b16c6ec4a891a2f6844efaa14121bf68838753209c requires_dist: - numpy>=1.13.3 ; python_version < '3.7' - numpy>=1.21.0 ; python_version <= '3.9' and platform_system == 'Darwin' and platform_machine == 'arm64' @@ -35293,192 +35040,8 @@ packages: - kind: pypi name: pandas version: 2.2.2 - url: https://files.pythonhosted.org/packages/16/c6/75231fd47afd6b3f89011e7077f1a3958441264aca7ae9ff596e3276a5d0/pandas-2.2.2-cp311-cp311-macosx_11_0_arm64.whl - sha256: 8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151 - requires_dist: - - numpy>=1.22.4 ; python_version < '3.11' - - numpy>=1.23.2 ; python_version == '3.11' - - numpy>=1.26.0 ; python_version >= '3.12' - - python-dateutil>=2.8.2 - - pytz>=2020.1 - - tzdata>=2022.7 - - hypothesis>=6.46.1 ; extra == 'test' - - pytest>=7.3.2 ; extra == 'test' - - pytest-xdist>=2.2.0 ; extra == 'test' - - pyarrow>=10.0.1 ; extra == 'pyarrow' - - bottleneck>=1.3.6 ; extra == 'performance' - - numba>=0.56.4 ; extra == 'performance' - - numexpr>=2.8.4 ; extra == 'performance' - - scipy>=1.10.0 ; extra == 'computation' - - xarray>=2022.12.0 ; extra == 'computation' - - fsspec>=2022.11.0 ; extra == 'fss' - - s3fs>=2022.11.0 ; extra == 'aws' - - gcsfs>=2022.11.0 ; extra == 'gcp' - - pandas-gbq>=0.19.0 ; extra == 'gcp' - - odfpy>=1.4.1 ; extra == 'excel' - - openpyxl>=3.1.0 ; extra == 'excel' - - python-calamine>=0.1.7 ; extra == 'excel' - - pyxlsb>=1.0.10 ; extra == 'excel' - - xlrd>=2.0.1 ; extra == 'excel' - - xlsxwriter>=3.0.5 ; extra == 'excel' - - pyarrow>=10.0.1 ; extra == 'parquet' - - pyarrow>=10.0.1 ; extra == 'feather' - - tables>=3.8.0 ; extra == 'hdf5' - - pyreadstat>=1.2.0 ; extra == 'spss' - - sqlalchemy>=2.0.0 ; extra == 'postgresql' - - psycopg2>=2.9.6 ; extra == 'postgresql' - - adbc-driver-postgresql>=0.8.0 ; extra == 'postgresql' - - sqlalchemy>=2.0.0 ; extra == 'mysql' - - pymysql>=1.0.2 ; extra == 'mysql' - - sqlalchemy>=2.0.0 ; extra == 'sql-other' - - adbc-driver-postgresql>=0.8.0 ; extra == 'sql-other' - - adbc-driver-sqlite>=0.8.0 ; extra == 'sql-other' - - beautifulsoup4>=4.11.2 ; extra == 'html' - - html5lib>=1.1 ; extra == 'html' - - lxml>=4.9.2 ; extra == 'html' - - lxml>=4.9.2 ; extra == 'xml' - - matplotlib>=3.6.3 ; extra == 'plot' - - jinja2>=3.1.2 ; extra == 'output-formatting' - - tabulate>=0.9.0 ; extra == 'output-formatting' - - pyqt5>=5.15.9 ; extra == 'clipboard' - - qtpy>=2.3.0 ; extra == 'clipboard' - - zstandard>=0.19.0 ; extra == 'compression' - - dataframe-api-compat>=0.1.7 ; extra == 'consortium-standard' - - adbc-driver-postgresql>=0.8.0 ; extra == 'all' - - adbc-driver-sqlite>=0.8.0 ; extra == 'all' - - beautifulsoup4>=4.11.2 ; extra == 'all' - - bottleneck>=1.3.6 ; extra == 'all' - - dataframe-api-compat>=0.1.7 ; extra == 'all' - - fastparquet>=2022.12.0 ; extra == 'all' - - fsspec>=2022.11.0 ; extra == 'all' - - gcsfs>=2022.11.0 ; extra == 'all' - - html5lib>=1.1 ; extra == 'all' - - hypothesis>=6.46.1 ; extra == 'all' - - jinja2>=3.1.2 ; extra == 'all' - - lxml>=4.9.2 ; extra == 'all' - - matplotlib>=3.6.3 ; extra == 'all' - - numba>=0.56.4 ; extra == 'all' - - numexpr>=2.8.4 ; extra == 'all' - - odfpy>=1.4.1 ; extra == 'all' - - openpyxl>=3.1.0 ; extra == 'all' - - pandas-gbq>=0.19.0 ; extra == 'all' - - psycopg2>=2.9.6 ; extra == 'all' - - pyarrow>=10.0.1 ; extra == 'all' - - pymysql>=1.0.2 ; extra == 'all' - - pyqt5>=5.15.9 ; extra == 'all' - - pyreadstat>=1.2.0 ; extra == 'all' - - pytest>=7.3.2 ; extra == 'all' - - pytest-xdist>=2.2.0 ; extra == 'all' - - python-calamine>=0.1.7 ; extra == 'all' - - pyxlsb>=1.0.10 ; extra == 'all' - - qtpy>=2.3.0 ; extra == 'all' - - scipy>=1.10.0 ; extra == 'all' - - s3fs>=2022.11.0 ; extra == 'all' - - sqlalchemy>=2.0.0 ; extra == 'all' - - tables>=3.8.0 ; extra == 'all' - - tabulate>=0.9.0 ; extra == 'all' - - xarray>=2022.12.0 ; extra == 'all' - - xlrd>=2.0.1 ; extra == 'all' - - xlsxwriter>=3.0.5 ; extra == 'all' - - zstandard>=0.19.0 ; extra == 'all' - requires_python: '>=3.9' -- kind: pypi - name: pandas - version: 2.2.2 - url: https://files.pythonhosted.org/packages/1b/70/61704497903d43043e288017cb2b82155c0d41e15f5c17807920877b45c2/pandas-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288 - requires_dist: - - numpy>=1.22.4 ; python_version < '3.11' - - numpy>=1.23.2 ; python_version == '3.11' - - numpy>=1.26.0 ; python_version >= '3.12' - - python-dateutil>=2.8.2 - - pytz>=2020.1 - - tzdata>=2022.7 - - hypothesis>=6.46.1 ; extra == 'test' - - pytest>=7.3.2 ; extra == 'test' - - pytest-xdist>=2.2.0 ; extra == 'test' - - pyarrow>=10.0.1 ; extra == 'pyarrow' - - bottleneck>=1.3.6 ; extra == 'performance' - - numba>=0.56.4 ; extra == 'performance' - - numexpr>=2.8.4 ; extra == 'performance' - - scipy>=1.10.0 ; extra == 'computation' - - xarray>=2022.12.0 ; extra == 'computation' - - fsspec>=2022.11.0 ; extra == 'fss' - - s3fs>=2022.11.0 ; extra == 'aws' - - gcsfs>=2022.11.0 ; extra == 'gcp' - - pandas-gbq>=0.19.0 ; extra == 'gcp' - - odfpy>=1.4.1 ; extra == 'excel' - - openpyxl>=3.1.0 ; extra == 'excel' - - python-calamine>=0.1.7 ; extra == 'excel' - - pyxlsb>=1.0.10 ; extra == 'excel' - - xlrd>=2.0.1 ; extra == 'excel' - - xlsxwriter>=3.0.5 ; extra == 'excel' - - pyarrow>=10.0.1 ; extra == 'parquet' - - pyarrow>=10.0.1 ; extra == 'feather' - - tables>=3.8.0 ; extra == 'hdf5' - - pyreadstat>=1.2.0 ; extra == 'spss' - - sqlalchemy>=2.0.0 ; extra == 'postgresql' - - psycopg2>=2.9.6 ; extra == 'postgresql' - - adbc-driver-postgresql>=0.8.0 ; extra == 'postgresql' - - sqlalchemy>=2.0.0 ; extra == 'mysql' - - pymysql>=1.0.2 ; extra == 'mysql' - - sqlalchemy>=2.0.0 ; extra == 'sql-other' - - adbc-driver-postgresql>=0.8.0 ; extra == 'sql-other' - - adbc-driver-sqlite>=0.8.0 ; extra == 'sql-other' - - beautifulsoup4>=4.11.2 ; extra == 'html' - - html5lib>=1.1 ; extra == 'html' - - lxml>=4.9.2 ; extra == 'html' - - lxml>=4.9.2 ; extra == 'xml' - - matplotlib>=3.6.3 ; extra == 'plot' - - jinja2>=3.1.2 ; extra == 'output-formatting' - - tabulate>=0.9.0 ; extra == 'output-formatting' - - pyqt5>=5.15.9 ; extra == 'clipboard' - - qtpy>=2.3.0 ; extra == 'clipboard' - - zstandard>=0.19.0 ; extra == 'compression' - - dataframe-api-compat>=0.1.7 ; extra == 'consortium-standard' - - adbc-driver-postgresql>=0.8.0 ; extra == 'all' - - adbc-driver-sqlite>=0.8.0 ; extra == 'all' - - beautifulsoup4>=4.11.2 ; extra == 'all' - - bottleneck>=1.3.6 ; extra == 'all' - - dataframe-api-compat>=0.1.7 ; extra == 'all' - - fastparquet>=2022.12.0 ; extra == 'all' - - fsspec>=2022.11.0 ; extra == 'all' - - gcsfs>=2022.11.0 ; extra == 'all' - - html5lib>=1.1 ; extra == 'all' - - hypothesis>=6.46.1 ; extra == 'all' - - jinja2>=3.1.2 ; extra == 'all' - - lxml>=4.9.2 ; extra == 'all' - - matplotlib>=3.6.3 ; extra == 'all' - - numba>=0.56.4 ; extra == 'all' - - numexpr>=2.8.4 ; extra == 'all' - - odfpy>=1.4.1 ; extra == 'all' - - openpyxl>=3.1.0 ; extra == 'all' - - pandas-gbq>=0.19.0 ; extra == 'all' - - psycopg2>=2.9.6 ; extra == 'all' - - pyarrow>=10.0.1 ; extra == 'all' - - pymysql>=1.0.2 ; extra == 'all' - - pyqt5>=5.15.9 ; extra == 'all' - - pyreadstat>=1.2.0 ; extra == 'all' - - pytest>=7.3.2 ; extra == 'all' - - pytest-xdist>=2.2.0 ; extra == 'all' - - python-calamine>=0.1.7 ; extra == 'all' - - pyxlsb>=1.0.10 ; extra == 'all' - - qtpy>=2.3.0 ; extra == 'all' - - scipy>=1.10.0 ; extra == 'all' - - s3fs>=2022.11.0 ; extra == 'all' - - sqlalchemy>=2.0.0 ; extra == 'all' - - tables>=3.8.0 ; extra == 'all' - - tabulate>=0.9.0 ; extra == 'all' - - xarray>=2022.12.0 ; extra == 'all' - - xlrd>=2.0.1 ; extra == 'all' - - xlsxwriter>=3.0.5 ; extra == 'all' - - zstandard>=0.19.0 ; extra == 'all' - requires_python: '>=3.9' -- kind: pypi - name: pandas - version: 2.2.2 - url: https://files.pythonhosted.org/packages/97/2d/7b54f80b93379ff94afb3bd9b0cd1d17b48183a0d6f98045bc01ce1e06a7/pandas-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b + url: https://files.pythonhosted.org/packages/ab/63/966db1321a0ad55df1d1fe51505d2cdae191b84c907974873817b0a6e849/pandas-2.2.2-cp311-cp311-win_amd64.whl + sha256: 873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24 requires_dist: - numpy>=1.22.4 ; python_version < '3.11' - numpy>=1.23.2 ; python_version == '3.11' @@ -35569,8 +35132,8 @@ packages: - kind: pypi name: pandas version: 2.2.2 - url: https://files.pythonhosted.org/packages/ab/63/966db1321a0ad55df1d1fe51505d2cdae191b84c907974873817b0a6e849/pandas-2.2.2-cp311-cp311-win_amd64.whl - sha256: 873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24 + url: https://files.pythonhosted.org/packages/97/2d/7b54f80b93379ff94afb3bd9b0cd1d17b48183a0d6f98045bc01ce1e06a7/pandas-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b requires_dist: - numpy>=1.22.4 ; python_version < '3.11' - numpy>=1.23.2 ; python_version == '3.11' @@ -35750,6 +35313,190 @@ packages: - xlsxwriter>=3.0.5 ; extra == 'all' - zstandard>=0.19.0 ; extra == 'all' requires_python: '>=3.9' +- kind: pypi + name: pandas + version: 2.2.2 + url: https://files.pythonhosted.org/packages/1b/70/61704497903d43043e288017cb2b82155c0d41e15f5c17807920877b45c2/pandas-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288 + requires_dist: + - numpy>=1.22.4 ; python_version < '3.11' + - numpy>=1.23.2 ; python_version == '3.11' + - numpy>=1.26.0 ; python_version >= '3.12' + - python-dateutil>=2.8.2 + - pytz>=2020.1 + - tzdata>=2022.7 + - hypothesis>=6.46.1 ; extra == 'test' + - pytest>=7.3.2 ; extra == 'test' + - pytest-xdist>=2.2.0 ; extra == 'test' + - pyarrow>=10.0.1 ; extra == 'pyarrow' + - bottleneck>=1.3.6 ; extra == 'performance' + - numba>=0.56.4 ; extra == 'performance' + - numexpr>=2.8.4 ; extra == 'performance' + - scipy>=1.10.0 ; extra == 'computation' + - xarray>=2022.12.0 ; extra == 'computation' + - fsspec>=2022.11.0 ; extra == 'fss' + - s3fs>=2022.11.0 ; extra == 'aws' + - gcsfs>=2022.11.0 ; extra == 'gcp' + - pandas-gbq>=0.19.0 ; extra == 'gcp' + - odfpy>=1.4.1 ; extra == 'excel' + - openpyxl>=3.1.0 ; extra == 'excel' + - python-calamine>=0.1.7 ; extra == 'excel' + - pyxlsb>=1.0.10 ; extra == 'excel' + - xlrd>=2.0.1 ; extra == 'excel' + - xlsxwriter>=3.0.5 ; extra == 'excel' + - pyarrow>=10.0.1 ; extra == 'parquet' + - pyarrow>=10.0.1 ; extra == 'feather' + - tables>=3.8.0 ; extra == 'hdf5' + - pyreadstat>=1.2.0 ; extra == 'spss' + - sqlalchemy>=2.0.0 ; extra == 'postgresql' + - psycopg2>=2.9.6 ; extra == 'postgresql' + - adbc-driver-postgresql>=0.8.0 ; extra == 'postgresql' + - sqlalchemy>=2.0.0 ; extra == 'mysql' + - pymysql>=1.0.2 ; extra == 'mysql' + - sqlalchemy>=2.0.0 ; extra == 'sql-other' + - adbc-driver-postgresql>=0.8.0 ; extra == 'sql-other' + - adbc-driver-sqlite>=0.8.0 ; extra == 'sql-other' + - beautifulsoup4>=4.11.2 ; extra == 'html' + - html5lib>=1.1 ; extra == 'html' + - lxml>=4.9.2 ; extra == 'html' + - lxml>=4.9.2 ; extra == 'xml' + - matplotlib>=3.6.3 ; extra == 'plot' + - jinja2>=3.1.2 ; extra == 'output-formatting' + - tabulate>=0.9.0 ; extra == 'output-formatting' + - pyqt5>=5.15.9 ; extra == 'clipboard' + - qtpy>=2.3.0 ; extra == 'clipboard' + - zstandard>=0.19.0 ; extra == 'compression' + - dataframe-api-compat>=0.1.7 ; extra == 'consortium-standard' + - adbc-driver-postgresql>=0.8.0 ; extra == 'all' + - adbc-driver-sqlite>=0.8.0 ; extra == 'all' + - beautifulsoup4>=4.11.2 ; extra == 'all' + - bottleneck>=1.3.6 ; extra == 'all' + - dataframe-api-compat>=0.1.7 ; extra == 'all' + - fastparquet>=2022.12.0 ; extra == 'all' + - fsspec>=2022.11.0 ; extra == 'all' + - gcsfs>=2022.11.0 ; extra == 'all' + - html5lib>=1.1 ; extra == 'all' + - hypothesis>=6.46.1 ; extra == 'all' + - jinja2>=3.1.2 ; extra == 'all' + - lxml>=4.9.2 ; extra == 'all' + - matplotlib>=3.6.3 ; extra == 'all' + - numba>=0.56.4 ; extra == 'all' + - numexpr>=2.8.4 ; extra == 'all' + - odfpy>=1.4.1 ; extra == 'all' + - openpyxl>=3.1.0 ; extra == 'all' + - pandas-gbq>=0.19.0 ; extra == 'all' + - psycopg2>=2.9.6 ; extra == 'all' + - pyarrow>=10.0.1 ; extra == 'all' + - pymysql>=1.0.2 ; extra == 'all' + - pyqt5>=5.15.9 ; extra == 'all' + - pyreadstat>=1.2.0 ; extra == 'all' + - pytest>=7.3.2 ; extra == 'all' + - pytest-xdist>=2.2.0 ; extra == 'all' + - python-calamine>=0.1.7 ; extra == 'all' + - pyxlsb>=1.0.10 ; extra == 'all' + - qtpy>=2.3.0 ; extra == 'all' + - scipy>=1.10.0 ; extra == 'all' + - s3fs>=2022.11.0 ; extra == 'all' + - sqlalchemy>=2.0.0 ; extra == 'all' + - tables>=3.8.0 ; extra == 'all' + - tabulate>=0.9.0 ; extra == 'all' + - xarray>=2022.12.0 ; extra == 'all' + - xlrd>=2.0.1 ; extra == 'all' + - xlsxwriter>=3.0.5 ; extra == 'all' + - zstandard>=0.19.0 ; extra == 'all' + requires_python: '>=3.9' +- kind: pypi + name: pandas + version: 2.2.2 + url: https://files.pythonhosted.org/packages/16/c6/75231fd47afd6b3f89011e7077f1a3958441264aca7ae9ff596e3276a5d0/pandas-2.2.2-cp311-cp311-macosx_11_0_arm64.whl + sha256: 8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151 + requires_dist: + - numpy>=1.22.4 ; python_version < '3.11' + - numpy>=1.23.2 ; python_version == '3.11' + - numpy>=1.26.0 ; python_version >= '3.12' + - python-dateutil>=2.8.2 + - pytz>=2020.1 + - tzdata>=2022.7 + - hypothesis>=6.46.1 ; extra == 'test' + - pytest>=7.3.2 ; extra == 'test' + - pytest-xdist>=2.2.0 ; extra == 'test' + - pyarrow>=10.0.1 ; extra == 'pyarrow' + - bottleneck>=1.3.6 ; extra == 'performance' + - numba>=0.56.4 ; extra == 'performance' + - numexpr>=2.8.4 ; extra == 'performance' + - scipy>=1.10.0 ; extra == 'computation' + - xarray>=2022.12.0 ; extra == 'computation' + - fsspec>=2022.11.0 ; extra == 'fss' + - s3fs>=2022.11.0 ; extra == 'aws' + - gcsfs>=2022.11.0 ; extra == 'gcp' + - pandas-gbq>=0.19.0 ; extra == 'gcp' + - odfpy>=1.4.1 ; extra == 'excel' + - openpyxl>=3.1.0 ; extra == 'excel' + - python-calamine>=0.1.7 ; extra == 'excel' + - pyxlsb>=1.0.10 ; extra == 'excel' + - xlrd>=2.0.1 ; extra == 'excel' + - xlsxwriter>=3.0.5 ; extra == 'excel' + - pyarrow>=10.0.1 ; extra == 'parquet' + - pyarrow>=10.0.1 ; extra == 'feather' + - tables>=3.8.0 ; extra == 'hdf5' + - pyreadstat>=1.2.0 ; extra == 'spss' + - sqlalchemy>=2.0.0 ; extra == 'postgresql' + - psycopg2>=2.9.6 ; extra == 'postgresql' + - adbc-driver-postgresql>=0.8.0 ; extra == 'postgresql' + - sqlalchemy>=2.0.0 ; extra == 'mysql' + - pymysql>=1.0.2 ; extra == 'mysql' + - sqlalchemy>=2.0.0 ; extra == 'sql-other' + - adbc-driver-postgresql>=0.8.0 ; extra == 'sql-other' + - adbc-driver-sqlite>=0.8.0 ; extra == 'sql-other' + - beautifulsoup4>=4.11.2 ; extra == 'html' + - html5lib>=1.1 ; extra == 'html' + - lxml>=4.9.2 ; extra == 'html' + - lxml>=4.9.2 ; extra == 'xml' + - matplotlib>=3.6.3 ; extra == 'plot' + - jinja2>=3.1.2 ; extra == 'output-formatting' + - tabulate>=0.9.0 ; extra == 'output-formatting' + - pyqt5>=5.15.9 ; extra == 'clipboard' + - qtpy>=2.3.0 ; extra == 'clipboard' + - zstandard>=0.19.0 ; extra == 'compression' + - dataframe-api-compat>=0.1.7 ; extra == 'consortium-standard' + - adbc-driver-postgresql>=0.8.0 ; extra == 'all' + - adbc-driver-sqlite>=0.8.0 ; extra == 'all' + - beautifulsoup4>=4.11.2 ; extra == 'all' + - bottleneck>=1.3.6 ; extra == 'all' + - dataframe-api-compat>=0.1.7 ; extra == 'all' + - fastparquet>=2022.12.0 ; extra == 'all' + - fsspec>=2022.11.0 ; extra == 'all' + - gcsfs>=2022.11.0 ; extra == 'all' + - html5lib>=1.1 ; extra == 'all' + - hypothesis>=6.46.1 ; extra == 'all' + - jinja2>=3.1.2 ; extra == 'all' + - lxml>=4.9.2 ; extra == 'all' + - matplotlib>=3.6.3 ; extra == 'all' + - numba>=0.56.4 ; extra == 'all' + - numexpr>=2.8.4 ; extra == 'all' + - odfpy>=1.4.1 ; extra == 'all' + - openpyxl>=3.1.0 ; extra == 'all' + - pandas-gbq>=0.19.0 ; extra == 'all' + - psycopg2>=2.9.6 ; extra == 'all' + - pyarrow>=10.0.1 ; extra == 'all' + - pymysql>=1.0.2 ; extra == 'all' + - pyqt5>=5.15.9 ; extra == 'all' + - pyreadstat>=1.2.0 ; extra == 'all' + - pytest>=7.3.2 ; extra == 'all' + - pytest-xdist>=2.2.0 ; extra == 'all' + - python-calamine>=0.1.7 ; extra == 'all' + - pyxlsb>=1.0.10 ; extra == 'all' + - qtpy>=2.3.0 ; extra == 'all' + - scipy>=1.10.0 ; extra == 'all' + - s3fs>=2022.11.0 ; extra == 'all' + - sqlalchemy>=2.0.0 ; extra == 'all' + - tables>=3.8.0 ; extra == 'all' + - tabulate>=0.9.0 ; extra == 'all' + - xarray>=2022.12.0 ; extra == 'all' + - xlrd>=2.0.1 ; extra == 'all' + - xlsxwriter>=3.0.5 ; extra == 'all' + - zstandard>=0.19.0 ; extra == 'all' + requires_python: '>=3.9' - kind: pypi name: pandocfilters version: 1.5.1 @@ -35976,8 +35723,8 @@ packages: - kind: pypi name: pillow version: 10.0.0 - url: https://files.pythonhosted.org/packages/79/53/3a7277ae95bfe86b8b4db0ed1d08c4924aa2dfbfe51b8fe0e310b160a9c6/Pillow-10.0.0-cp311-cp311-manylinux_2_28_aarch64.whl - sha256: c1fbe7621c167ecaa38ad29643d77a9ce7311583761abf7836e1510c580bf3dd + url: https://files.pythonhosted.org/packages/b7/ad/71982d18fd28ed1f93c31b8648f980ebdbdbcf7d8c9c9b4af59290914ce9/Pillow-10.0.0-cp311-cp311-macosx_11_0_arm64.whl + sha256: d35e3c8d9b1268cbf5d3670285feb3528f6680420eafe35cccc686b73c1e330f requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -36024,8 +35771,8 @@ packages: - kind: pypi name: pillow version: 10.0.0 - url: https://files.pythonhosted.org/packages/b7/ad/71982d18fd28ed1f93c31b8648f980ebdbdbcf7d8c9c9b4af59290914ce9/Pillow-10.0.0-cp311-cp311-macosx_11_0_arm64.whl - sha256: d35e3c8d9b1268cbf5d3670285feb3528f6680420eafe35cccc686b73c1e330f + url: https://files.pythonhosted.org/packages/79/53/3a7277ae95bfe86b8b4db0ed1d08c4924aa2dfbfe51b8fe0e310b160a9c6/Pillow-10.0.0-cp311-cp311-manylinux_2_28_aarch64.whl + sha256: c1fbe7621c167ecaa38ad29643d77a9ce7311583761abf7836e1510c580bf3dd requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -36048,8 +35795,8 @@ packages: - kind: pypi name: pillow version: 10.4.0 - url: https://files.pythonhosted.org/packages/a7/62/c9449f9c3043c37f73e7487ec4ef0c03eb9c9afc91a92b977a67b3c0bbc5/pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl - sha256: 0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c + url: https://files.pythonhosted.org/packages/ba/e5/8c68ff608a4203085158cff5cc2a3c534ec384536d9438c405ed6370d080/pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl + sha256: 76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319 requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -36075,8 +35822,8 @@ packages: - kind: pypi name: pillow version: 10.4.0 - url: https://files.pythonhosted.org/packages/a9/83/6523837906d1da2b269dee787e31df3b0acb12e3d08f024965a3e7f64665/pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl - sha256: bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe + url: https://files.pythonhosted.org/packages/f4/5f/491dafc7bbf5a3cc1845dc0430872e8096eb9e2b6f8161509d124594ec2d/pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl + sha256: dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -36102,8 +35849,8 @@ packages: - kind: pypi name: pillow version: 10.4.0 - url: https://files.pythonhosted.org/packages/ba/e5/8c68ff608a4203085158cff5cc2a3c534ec384536d9438c405ed6370d080/pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl - sha256: 76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319 + url: https://files.pythonhosted.org/packages/a9/83/6523837906d1da2b269dee787e31df3b0acb12e3d08f024965a3e7f64665/pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl + sha256: bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -36129,8 +35876,8 @@ packages: - kind: pypi name: pillow version: 10.4.0 - url: https://files.pythonhosted.org/packages/c1/d0/5866318eec2b801cdb8c82abf190c8343d8a1cd8bf5a0c17444a6f268291/pillow-10.4.0-cp311-cp311-win_amd64.whl - sha256: cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91 + url: https://files.pythonhosted.org/packages/a7/62/c9449f9c3043c37f73e7487ec4ef0c03eb9c9afc91a92b977a67b3c0bbc5/pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl + sha256: 0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -36156,8 +35903,8 @@ packages: - kind: pypi name: pillow version: 10.4.0 - url: https://files.pythonhosted.org/packages/f4/5f/491dafc7bbf5a3cc1845dc0430872e8096eb9e2b6f8161509d124594ec2d/pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl - sha256: dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be + url: https://files.pythonhosted.org/packages/c1/d0/5866318eec2b801cdb8c82abf190c8343d8a1cd8bf5a0c17444a6f268291/pillow-10.4.0-cp311-cp311-win_amd64.whl + sha256: cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91 requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -36304,15 +36051,6 @@ packages: - numpy - rerun-sdk editable: true -- kind: pypi - name: plots - version: 0.1.0 - path: examples/python/plots - sha256: 398c85932db816f766e2d703568060efe4520a6e734f91d69387bbdd143b3f97 - requires_dist: - - numpy - - rerun-sdk - editable: true - kind: conda name: pluggy version: 1.5.0 @@ -36454,14 +36192,14 @@ packages: - kind: pypi name: protobuf version: 5.27.2 - url: https://files.pythonhosted.org/packages/75/44/6ae304790fad936bb4cf09907a05d669b7600458a02b6c960fdaaeeab06e/protobuf-5.27.2-cp38-abi3-macosx_10_9_universal2.whl - sha256: a109916aaac42bff84702fb5187f3edadbc7c97fc2c99c5ff81dd15dcce0d1e5 + url: https://files.pythonhosted.org/packages/b1/04/73b8fd7f34f3a2b2b64aa31a173b8aebbdb0c55523df4c027846bb44bc1e/protobuf-5.27.2-cp310-abi3-win_amd64.whl + sha256: 0e341109c609749d501986b835f667c6e1e24531096cff9d34ae411595e26505 requires_python: '>=3.8' - kind: pypi name: protobuf version: 5.27.2 - url: https://files.pythonhosted.org/packages/b1/04/73b8fd7f34f3a2b2b64aa31a173b8aebbdb0c55523df4c027846bb44bc1e/protobuf-5.27.2-cp310-abi3-win_amd64.whl - sha256: 0e341109c609749d501986b835f667c6e1e24531096cff9d34ae411595e26505 + url: https://files.pythonhosted.org/packages/75/44/6ae304790fad936bb4cf09907a05d669b7600458a02b6c960fdaaeeab06e/protobuf-5.27.2-cp38-abi3-macosx_10_9_universal2.whl + sha256: a109916aaac42bff84702fb5187f3edadbc7c97fc2c99c5ff81dd15dcce0d1e5 requires_python: '>=3.8' - kind: pypi name: protobuf @@ -36469,18 +36207,6 @@ packages: url: https://files.pythonhosted.org/packages/cd/c7/a534268f9c3780be1ba50f5ed96243fa9cf6224a445de662c34e91ce0e61/protobuf-5.27.2-cp38-abi3-manylinux2014_aarch64.whl sha256: 176c12b1f1c880bf7a76d9f7c75822b6a2bc3db2d28baa4d300e8ce4cde7409b requires_python: '>=3.8' -- kind: pypi - name: psutil - version: 6.0.0 - url: https://files.pythonhosted.org/packages/0b/37/f8da2fbd29690b3557cca414c1949f92162981920699cd62095a984983bf/psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl - sha256: c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0 - requires_dist: - - ipaddress ; python_version < '3.0' and extra == 'test' - - mock ; python_version < '3.0' and extra == 'test' - - enum34 ; python_version <= '3.4' and extra == 'test' - - pywin32 ; sys_platform == 'win32' and extra == 'test' - - wmi ; sys_platform == 'win32' and extra == 'test' - requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*' - kind: pypi name: psutil version: 6.0.0 @@ -36493,18 +36219,6 @@ packages: - pywin32 ; sys_platform == 'win32' and extra == 'test' - wmi ; sys_platform == 'win32' and extra == 'test' requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*' -- kind: pypi - name: psutil - version: 6.0.0 - url: https://files.pythonhosted.org/packages/73/44/561092313ae925f3acfaace6f9ddc4f6a9c748704317bad9c8c8f8a36a79/psutil-6.0.0-cp37-abi3-win_amd64.whl - sha256: 33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3 - requires_dist: - - ipaddress ; python_version < '3.0' and extra == 'test' - - mock ; python_version < '3.0' and extra == 'test' - - enum34 ; python_version <= '3.4' and extra == 'test' - - pywin32 ; sys_platform == 'win32' and extra == 'test' - - wmi ; sys_platform == 'win32' and extra == 'test' - requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*' - kind: pypi name: psutil version: 6.0.0 @@ -36529,6 +36243,30 @@ packages: - pywin32 ; sys_platform == 'win32' and extra == 'test' - wmi ; sys_platform == 'win32' and extra == 'test' requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*' +- kind: pypi + name: psutil + version: 6.0.0 + url: https://files.pythonhosted.org/packages/0b/37/f8da2fbd29690b3557cca414c1949f92162981920699cd62095a984983bf/psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl + sha256: c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0 + requires_dist: + - ipaddress ; python_version < '3.0' and extra == 'test' + - mock ; python_version < '3.0' and extra == 'test' + - enum34 ; python_version <= '3.4' and extra == 'test' + - pywin32 ; sys_platform == 'win32' and extra == 'test' + - wmi ; sys_platform == 'win32' and extra == 'test' + requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*' +- kind: pypi + name: psutil + version: 6.0.0 + url: https://files.pythonhosted.org/packages/73/44/561092313ae925f3acfaace6f9ddc4f6a9c748704317bad9c8c8f8a36a79/psutil-6.0.0-cp37-abi3-win_amd64.whl + sha256: 33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3 + requires_dist: + - ipaddress ; python_version < '3.0' and extra == 'test' + - mock ; python_version < '3.0' and extra == 'test' + - enum34 ; python_version <= '3.4' and extra == 'test' + - pywin32 ; sys_platform == 'win32' and extra == 'test' + - wmi ; sys_platform == 'win32' and extra == 'test' + requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*' - kind: conda name: psutil version: 6.0.0 @@ -36626,8 +36364,8 @@ packages: - kind: pypi name: psygnal version: 0.11.1 - url: https://files.pythonhosted.org/packages/25/92/6dcab17c3bb91fa3f250ebdbb66de55332436da836c4c547c26e3942877e/psygnal-0.11.1-cp311-cp311-macosx_10_16_x86_64.whl - sha256: 8f77317cbd11fbed5bfdd40ea41b4e551ee0cf37881cdbc325b67322af577485 + url: https://files.pythonhosted.org/packages/68/76/d5c5bf5a932ec2dcdc4a23565815a1cc5fd96b03b26ff3f647cdff5ea62c/psygnal-0.11.1-py3-none-any.whl + sha256: 04255fe28828060a80320f8fda937c47bc0c21ca14f55a13eb7c494b165ea395 requires_dist: - ipython ; extra == 'dev' - mypy ; extra == 'dev' @@ -36663,8 +36401,8 @@ packages: - kind: pypi name: psygnal version: 0.11.1 - url: https://files.pythonhosted.org/packages/68/76/d5c5bf5a932ec2dcdc4a23565815a1cc5fd96b03b26ff3f647cdff5ea62c/psygnal-0.11.1-py3-none-any.whl - sha256: 04255fe28828060a80320f8fda937c47bc0c21ca14f55a13eb7c494b165ea395 + url: https://files.pythonhosted.org/packages/25/92/6dcab17c3bb91fa3f250ebdbb66de55332436da836c4c547c26e3942877e/psygnal-0.11.1-cp311-cp311-macosx_10_16_x86_64.whl + sha256: 8f77317cbd11fbed5bfdd40ea41b4e551ee0cf37881cdbc325b67322af577485 requires_dist: - ipython ; extra == 'dev' - mypy ; extra == 'dev' @@ -37000,8 +36738,8 @@ packages: - kind: pypi name: pyarrow version: 17.0.0 - url: https://files.pythonhosted.org/packages/30/d1/63a7c248432c71c7d3ee803e706590a0b81ce1a8d2b2ae49677774b813bb/pyarrow-17.0.0-cp311-cp311-win_amd64.whl - sha256: a27532c38f3de9eb3e90ecab63dfda948a8ca859a66e3a47f5f42d1e403c4d03 + url: https://files.pythonhosted.org/packages/d8/81/69b6606093363f55a2a574c018901c40952d4e902e670656d18213c71ad7/pyarrow-17.0.0-cp311-cp311-manylinux_2_28_aarch64.whl + sha256: dc5c31c37409dfbc5d014047817cb4ccd8c1ea25d19576acf1a001fe07f5b420 requires_dist: - numpy>=1.16.6 - pytest ; extra == 'test' @@ -37013,8 +36751,8 @@ packages: - kind: pypi name: pyarrow version: 17.0.0 - url: https://files.pythonhosted.org/packages/4c/21/9ca93b84b92ef927814cb7ba37f0774a484c849d58f0b692b16af8eebcfb/pyarrow-17.0.0-cp311-cp311-manylinux_2_28_x86_64.whl - sha256: e3343cb1e88bc2ea605986d4b94948716edc7a8d14afd4e2c097232f729758b4 + url: https://files.pythonhosted.org/packages/f9/46/ce89f87c2936f5bb9d879473b9663ce7a4b1f4359acc2f0eb39865eaa1af/pyarrow-17.0.0-cp311-cp311-macosx_10_15_x86_64.whl + sha256: 1c8856e2ef09eb87ecf937104aacfa0708f22dfeb039c363ec99735190ffb977 requires_dist: - numpy>=1.16.6 - pytest ; extra == 'test' @@ -37039,8 +36777,8 @@ packages: - kind: pypi name: pyarrow version: 17.0.0 - url: https://files.pythonhosted.org/packages/d8/81/69b6606093363f55a2a574c018901c40952d4e902e670656d18213c71ad7/pyarrow-17.0.0-cp311-cp311-manylinux_2_28_aarch64.whl - sha256: dc5c31c37409dfbc5d014047817cb4ccd8c1ea25d19576acf1a001fe07f5b420 + url: https://files.pythonhosted.org/packages/30/d1/63a7c248432c71c7d3ee803e706590a0b81ce1a8d2b2ae49677774b813bb/pyarrow-17.0.0-cp311-cp311-win_amd64.whl + sha256: a27532c38f3de9eb3e90ecab63dfda948a8ca859a66e3a47f5f42d1e403c4d03 requires_dist: - numpy>=1.16.6 - pytest ; extra == 'test' @@ -37052,8 +36790,8 @@ packages: - kind: pypi name: pyarrow version: 17.0.0 - url: https://files.pythonhosted.org/packages/f9/46/ce89f87c2936f5bb9d879473b9663ce7a4b1f4359acc2f0eb39865eaa1af/pyarrow-17.0.0-cp311-cp311-macosx_10_15_x86_64.whl - sha256: 1c8856e2ef09eb87ecf937104aacfa0708f22dfeb039c363ec99735190ffb977 + url: https://files.pythonhosted.org/packages/4c/21/9ca93b84b92ef927814cb7ba37f0774a484c849d58f0b692b16af8eebcfb/pyarrow-17.0.0-cp311-cp311-manylinux_2_28_x86_64.whl + sha256: e3343cb1e88bc2ea605986d4b94948716edc7a8d14afd4e2c097232f729758b4 requires_dist: - numpy>=1.16.6 - pytest ; extra == 'test' @@ -37426,8 +37164,8 @@ packages: - kind: pypi name: pycocotools version: 2.0.8 - url: https://files.pythonhosted.org/packages/6b/56/9eedccfd1cfdaf6553d527bed0b2b5572550567a5786a8beb098027a3e5e/pycocotools-2.0.8-cp311-cp311-macosx_10_9_universal2.whl - sha256: 92bf788e6936fc52b57ccaaa78ecdaeac81872eebbfc45b6fe16ae18b85709bd + url: https://files.pythonhosted.org/packages/d5/9c/09cd808743338db170915deb35fa020b792d583238afe55f27c011f91c3c/pycocotools-2.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 6a07f57f991e379959c0f4a1b9ea35d875876433b7f45c6d8fe6b718e58834bc requires_dist: - matplotlib>=2.1.0 - numpy @@ -37444,8 +37182,8 @@ packages: - kind: pypi name: pycocotools version: 2.0.8 - url: https://files.pythonhosted.org/packages/d5/9c/09cd808743338db170915deb35fa020b792d583238afe55f27c011f91c3c/pycocotools-2.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 6a07f57f991e379959c0f4a1b9ea35d875876433b7f45c6d8fe6b718e58834bc + url: https://files.pythonhosted.org/packages/6b/56/9eedccfd1cfdaf6553d527bed0b2b5572550567a5786a8beb098027a3e5e/pycocotools-2.0.8-cp311-cp311-macosx_10_9_universal2.whl + sha256: 92bf788e6936fc52b57ccaaa78ecdaeac81872eebbfc45b6fe16ae18b85709bd requires_dist: - matplotlib>=2.1.0 - numpy @@ -37499,16 +37237,6 @@ packages: - deprecated - dataclasses ; python_version >= '3.6' and python_version < '3.7' requires_python: '>=3.6' -- kind: pypi - name: pygltflib - version: 1.16.2 - url: https://files.pythonhosted.org/packages/38/d7/0b8e35cb3ff69dd981e358e72e0a5632f847d4bd61876be04518cb4e075a/pygltflib-1.16.2.tar.gz - sha256: 4f9481f5841b0b8fb7b271b0414b394b503405260a6ee0cf2c330a5420d19b64 - requires_dist: - - dataclasses-json>=0.0.25 - - deprecated - - dataclasses ; python_version >= '3.6' and python_version < '3.7' - requires_python: '>=3.6' - kind: pypi name: pygments version: 2.18.0 @@ -37541,8 +37269,8 @@ packages: - kind: pypi name: pynacl version: 1.5.0 - url: https://files.pythonhosted.org/packages/59/bb/fddf10acd09637327a97ef89d2a9d621328850a72f1fdc8c08bdf72e385f/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl - sha256: 52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92 + url: https://files.pythonhosted.org/packages/ee/87/f1bb6a595f14a327e8285b9eb54d41fef76c585a0edef0a45f6fc95de125/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl + sha256: 0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d requires_dist: - cffi>=1.4.1 - sphinx>=1.6.5 ; extra == 'docs' @@ -37577,8 +37305,8 @@ packages: - kind: pypi name: pynacl version: 1.5.0 - url: https://files.pythonhosted.org/packages/ee/87/f1bb6a595f14a327e8285b9eb54d41fef76c585a0edef0a45f6fc95de125/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl - sha256: 0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d + url: https://files.pythonhosted.org/packages/59/bb/fddf10acd09637327a97ef89d2a9d621328850a72f1fdc8c08bdf72e385f/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl + sha256: 52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92 requires_dist: - cffi>=1.4.1 - sphinx>=1.6.5 ; extra == 'docs' @@ -37632,16 +37360,16 @@ packages: - kind: pypi name: pyproj version: 3.6.0 - url: https://files.pythonhosted.org/packages/1a/07/2f1975c98c840eb4fa54fb95c3070c4255bdf41fd6866e05cffff41b4f4e/pyproj-3.6.0-cp311-cp311-macosx_11_0_arm64.whl - sha256: ba5e7c8ddd6ed5a3f9fcf95ea80ba44c931913723de2ece841c94bb38b200c4a + url: https://files.pythonhosted.org/packages/c8/5a/215a1894e50167d91b471d8fc413ca30034c48e5d3dfac78d12df4c840d5/pyproj-3.6.0-cp311-cp311-win_amd64.whl + sha256: 8fbac2eb9a0e425d7d6b7c6f4ebacd675cf3bdef0c59887057b8b4b0374e7c12 requires_dist: - certifi requires_python: '>=3.9' - kind: pypi name: pyproj version: 3.6.0 - url: https://files.pythonhosted.org/packages/1b/d7/df8483715560c7a4f060774171c5ef75360d73da6b7a1b7768037885a6b4/pyproj-3.6.0-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 00fab048596c17572fa8980014ef117dbb2a445e6f7ba3b9ddfcc683efc598e7 + url: https://files.pythonhosted.org/packages/82/ea/208144cd3fb42a3bf70630a1300c32a9dc1705b777d6c2fb1ebd1517fad5/pyproj-3.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 08dfc5c9533c78a97afae9d53b99b810a4a8f97c3be9eb2b8f323b726c736403 requires_dist: - certifi requires_python: '>=3.9' @@ -37656,16 +37384,16 @@ packages: - kind: pypi name: pyproj version: 3.6.0 - url: https://files.pythonhosted.org/packages/82/ea/208144cd3fb42a3bf70630a1300c32a9dc1705b777d6c2fb1ebd1517fad5/pyproj-3.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 08dfc5c9533c78a97afae9d53b99b810a4a8f97c3be9eb2b8f323b726c736403 + url: https://files.pythonhosted.org/packages/1b/d7/df8483715560c7a4f060774171c5ef75360d73da6b7a1b7768037885a6b4/pyproj-3.6.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 00fab048596c17572fa8980014ef117dbb2a445e6f7ba3b9ddfcc683efc598e7 requires_dist: - certifi requires_python: '>=3.9' - kind: pypi name: pyproj version: 3.6.0 - url: https://files.pythonhosted.org/packages/c8/5a/215a1894e50167d91b471d8fc413ca30034c48e5d3dfac78d12df4c840d5/pyproj-3.6.0-cp311-cp311-win_amd64.whl - sha256: 8fbac2eb9a0e425d7d6b7c6f4ebacd675cf3bdef0c59887057b8b4b0374e7c12 + url: https://files.pythonhosted.org/packages/1a/07/2f1975c98c840eb4fa54fb95c3070c4255bdf41fd6866e05cffff41b4f4e/pyproj-3.6.0-cp311-cp311-macosx_11_0_arm64.whl + sha256: ba5e7c8ddd6ed5a3f9fcf95ea80ba44c931913723de2ece841c94bb38b200c4a requires_dist: - certifi requires_python: '>=3.9' @@ -38033,8 +37761,8 @@ packages: - kind: pypi name: pyyaml version: 6.0.1 - url: https://files.pythonhosted.org/packages/28/09/55f715ddbf95a054b764b547f617e22f1d5e45d83905660e9a088078fe67/PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl - sha256: f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab + url: https://files.pythonhosted.org/packages/b3/34/65bb4b2d7908044963ebf614fe0fdb080773fc7030d7e39c8d3eddcd4257/PyYAML-6.0.1-cp311-cp311-win_amd64.whl + sha256: bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34 requires_python: '>=3.6' - kind: pypi name: pyyaml @@ -38051,14 +37779,14 @@ packages: - kind: pypi name: pyyaml version: 6.0.1 - url: https://files.pythonhosted.org/packages/b3/34/65bb4b2d7908044963ebf614fe0fdb080773fc7030d7e39c8d3eddcd4257/PyYAML-6.0.1-cp311-cp311-win_amd64.whl - sha256: bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34 + url: https://files.pythonhosted.org/packages/ec/0d/26fb23e8863e0aeaac0c64e03fd27367ad2ae3f3cccf3798ee98ce160368/PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007 requires_python: '>=3.6' - kind: pypi name: pyyaml version: 6.0.1 - url: https://files.pythonhosted.org/packages/ec/0d/26fb23e8863e0aeaac0c64e03fd27367ad2ae3f3cccf3798ee98ce160368/PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007 + url: https://files.pythonhosted.org/packages/28/09/55f715ddbf95a054b764b547f617e22f1d5e45d83905660e9a088078fe67/PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl + sha256: f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab requires_python: '>=3.6' - kind: pypi name: pyzmq @@ -38071,8 +37799,8 @@ packages: - kind: pypi name: pyzmq version: 26.0.3 - url: https://files.pythonhosted.org/packages/4b/60/4e5170ffdf1720791752f09261a813efd5e59ec8ccf3e909d50d62a13b7d/pyzmq-26.0.3-cp311-cp311-macosx_10_15_universal2.whl - sha256: a72a84570f84c374b4c287183debc776dc319d3e8ce6b6a0041ce2e400de3f32 + url: https://files.pythonhosted.org/packages/e5/b5/625e45790a1b091f54d5d47fd267d051cabdec4f01144f6b2fcb7306515b/pyzmq-26.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: e222562dc0f38571c8b1ffdae9d7adb866363134299264a1958d077800b193b7 requires_dist: - cffi ; implementation_name == 'pypy' requires_python: '>=3.7' @@ -38087,8 +37815,8 @@ packages: - kind: pypi name: pyzmq version: 26.0.3 - url: https://files.pythonhosted.org/packages/e5/b5/625e45790a1b091f54d5d47fd267d051cabdec4f01144f6b2fcb7306515b/pyzmq-26.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: e222562dc0f38571c8b1ffdae9d7adb866363134299264a1958d077800b193b7 + url: https://files.pythonhosted.org/packages/4b/60/4e5170ffdf1720791752f09261a813efd5e59ec8ccf3e909d50d62a13b7d/pyzmq-26.0.3-cp311-cp311-macosx_10_15_universal2.whl + sha256: a72a84570f84c374b4c287183debc776dc319d3e8ce6b6a0041ce2e400de3f32 requires_dist: - cffi ; implementation_name == 'pypy' requires_python: '>=3.7' @@ -38323,17 +38051,6 @@ packages: - rerun-sdk - trimesh==3.15.2 editable: true -- kind: pypi - name: raw-mesh - version: 0.1.0 - path: examples/python/raw_mesh - sha256: 9006b1b7ca8bd9c90ba0bf0d7a00641b7dd13a6de76a2828f79ec5b853a4ef98 - requires_dist: - - numpy - - requests>=2.31,<3 - - rerun-sdk - - trimesh==3.15.2 - editable: true - kind: conda name: rdma-core version: '52.0' @@ -38527,32 +38244,32 @@ packages: - kind: pypi name: regex version: 2024.5.15 - url: https://files.pythonhosted.org/packages/2b/8b/1801c93783cc86bc72ed96f836ee81ea1e42c9f7bbf193aece9878c3fae5/regex-2024.5.15-cp311-cp311-macosx_10_9_x86_64.whl - sha256: c6a2b494a76983df8e3d3feea9b9ffdd558b247e60b92f877f93a1ff43d26656 + url: https://files.pythonhosted.org/packages/ef/9b/0aa55fc101c803869c13b389b718b15810592d2df35b1af15ff5b6f48e16/regex-2024.5.15-cp311-cp311-win_amd64.whl + sha256: 9e717956dcfd656f5055cc70996ee2cc82ac5149517fc8e1b60261b907740201 requires_python: '>=3.8' - kind: pypi name: regex version: 2024.5.15 - url: https://files.pythonhosted.org/packages/39/29/8158a6e69e97b9c72fab0b46fe4d57c789d07ef91fe4afde23721e7cac61/regex-2024.5.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 3e507ff1e74373c4d3038195fdd2af30d297b4f0950eeda6f515ae3d84a1770f + url: https://files.pythonhosted.org/packages/7d/ba/cbbcdad38b40f1fa36eee1a130051d8e3cd2bd40d3a2a7bce4cf6ff82190/regex-2024.5.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 10002e86e6068d9e1c91eae8295ef690f02f913c57db120b58fdd35a6bb1af35 requires_python: '>=3.8' - kind: pypi name: regex version: 2024.5.15 - url: https://files.pythonhosted.org/packages/7d/ba/cbbcdad38b40f1fa36eee1a130051d8e3cd2bd40d3a2a7bce4cf6ff82190/regex-2024.5.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 10002e86e6068d9e1c91eae8295ef690f02f913c57db120b58fdd35a6bb1af35 + url: https://files.pythonhosted.org/packages/39/29/8158a6e69e97b9c72fab0b46fe4d57c789d07ef91fe4afde23721e7cac61/regex-2024.5.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 3e507ff1e74373c4d3038195fdd2af30d297b4f0950eeda6f515ae3d84a1770f requires_python: '>=3.8' - kind: pypi name: regex version: 2024.5.15 - url: https://files.pythonhosted.org/packages/c3/43/29ef9c42ae1e764a98510af1c610bf9f4b90a97a04fabe9396d6b73b0cc4/regex-2024.5.15-cp311-cp311-macosx_11_0_arm64.whl - sha256: a32b96f15c8ab2e7d27655969a23895eb799de3665fa94349f3b2fbfd547236f + url: https://files.pythonhosted.org/packages/2b/8b/1801c93783cc86bc72ed96f836ee81ea1e42c9f7bbf193aece9878c3fae5/regex-2024.5.15-cp311-cp311-macosx_10_9_x86_64.whl + sha256: c6a2b494a76983df8e3d3feea9b9ffdd558b247e60b92f877f93a1ff43d26656 requires_python: '>=3.8' - kind: pypi name: regex version: 2024.5.15 - url: https://files.pythonhosted.org/packages/ef/9b/0aa55fc101c803869c13b389b718b15810592d2df35b1af15ff5b6f48e16/regex-2024.5.15-cp311-cp311-win_amd64.whl - sha256: 9e717956dcfd656f5055cc70996ee2cc82ac5149517fc8e1b60261b907740201 + url: https://files.pythonhosted.org/packages/c3/43/29ef9c42ae1e764a98510af1c610bf9f4b90a97a04fabe9396d6b73b0cc4/regex-2024.5.15-cp311-cp311-macosx_11_0_arm64.whl + sha256: a32b96f15c8ab2e7d27655969a23895eb799de3665fa94349f3b2fbfd547236f requires_python: '>=3.8' - kind: pypi name: requests @@ -38593,8 +38310,8 @@ packages: - kind: pypi name: rerun-sdk version: 0.17.0 - url: https://files.pythonhosted.org/packages/30/5f/ce02381b9d7e1e14f60c421c76dce12b7d823690181784780b30266017b1/rerun_sdk-0.17.0-cp38-abi3-macosx_10_12_x86_64.whl - sha256: abd34f746eada83b8bb0bc50007183151981d7ccf18306f3d42165819a3f6fcb + url: https://files.pythonhosted.org/packages/8c/28/92423fe9673b738c180fb5b6b8ea4203fe4b02c1d20b06b7fae79d11cc24/rerun_sdk-0.17.0-cp38-abi3-win_amd64.whl + sha256: 34e5595a326cbdddfebdf00b08e877358c564fce74cc8c6d617fc89ef3a6aa70 requires_dist: - attrs>=23.1.0 - numpy>=1.23,<2 @@ -38607,8 +38324,8 @@ packages: - kind: pypi name: rerun-sdk version: 0.17.0 - url: https://files.pythonhosted.org/packages/87/0a/b5fe1ffea700eeaa8d28817a92ad3cb4a7d56dc4af45de76ea412cfc5cd5/rerun_sdk-0.17.0-cp38-abi3-manylinux_2_31_aarch64.whl - sha256: ad55807abafb01e527846742e087819aac8e103f1ec15aadc563a4038bb44e1d + url: https://files.pythonhosted.org/packages/30/5f/ce02381b9d7e1e14f60c421c76dce12b7d823690181784780b30266017b1/rerun_sdk-0.17.0-cp38-abi3-macosx_10_12_x86_64.whl + sha256: abd34f746eada83b8bb0bc50007183151981d7ccf18306f3d42165819a3f6fcb requires_dist: - attrs>=23.1.0 - numpy>=1.23,<2 @@ -38621,8 +38338,8 @@ packages: - kind: pypi name: rerun-sdk version: 0.17.0 - url: https://files.pythonhosted.org/packages/8c/28/92423fe9673b738c180fb5b6b8ea4203fe4b02c1d20b06b7fae79d11cc24/rerun_sdk-0.17.0-cp38-abi3-win_amd64.whl - sha256: 34e5595a326cbdddfebdf00b08e877358c564fce74cc8c6d617fc89ef3a6aa70 + url: https://files.pythonhosted.org/packages/87/0a/b5fe1ffea700eeaa8d28817a92ad3cb4a7d56dc4af45de76ea412cfc5cd5/rerun_sdk-0.17.0-cp38-abi3-manylinux_2_31_aarch64.whl + sha256: ad55807abafb01e527846742e087819aac8e103f1ec15aadc563a4038bb44e1d requires_dist: - attrs>=23.1.0 - numpy>=1.23,<2 @@ -38635,8 +38352,8 @@ packages: - kind: pypi name: rerun-sdk version: 0.17.0 - url: https://files.pythonhosted.org/packages/b7/c5/d47ba7b774bc563aa3c07ba500dd304ea24b31fe438e10ea9ad5e10ffe17/rerun_sdk-0.17.0-cp38-abi3-macosx_11_0_arm64.whl - sha256: 8b0a8a6feab3f8e679801d158216a71d88a81480021587719330f50d083c4d26 + url: https://files.pythonhosted.org/packages/d9/74/6c1ff0c8dbe6da09ceb5ea838a72382fa3131ef6bb9377a30003299743fa/rerun_sdk-0.17.0-cp38-abi3-manylinux_2_31_x86_64.whl + sha256: 9d41f1f475270b1e0d50ddb8cb62e0d828988f0c371ac8457af25c8be5aa1dc0 requires_dist: - attrs>=23.1.0 - numpy>=1.23,<2 @@ -38649,8 +38366,8 @@ packages: - kind: pypi name: rerun-sdk version: 0.17.0 - url: https://files.pythonhosted.org/packages/d9/74/6c1ff0c8dbe6da09ceb5ea838a72382fa3131ef6bb9377a30003299743fa/rerun_sdk-0.17.0-cp38-abi3-manylinux_2_31_x86_64.whl - sha256: 9d41f1f475270b1e0d50ddb8cb62e0d828988f0c371ac8457af25c8be5aa1dc0 + url: https://files.pythonhosted.org/packages/b7/c5/d47ba7b774bc563aa3c07ba500dd304ea24b31fe438e10ea9ad5e10ffe17/rerun_sdk-0.17.0-cp38-abi3-macosx_11_0_arm64.whl + sha256: 8b0a8a6feab3f8e679801d158216a71d88a81480021587719330f50d083c4d26 requires_dist: - attrs>=23.1.0 - numpy>=1.23,<2 @@ -38701,18 +38418,6 @@ packages: - rerun-sdk - tqdm editable: true -- kind: pypi - name: rgbd - version: 0.1.0 - path: examples/python/rgbd - sha256: b2ef153b0bedd672c3e0ce89b7be1f64f4344b2b75d71748899faea270383fa2 - requires_dist: - - numpy - - opencv-python>4.6 - - requests>=2.31,<3 - - rerun-sdk - - tqdm - editable: true - kind: conda name: rhash version: 1.4.4 @@ -38795,14 +38500,14 @@ packages: - kind: pypi name: rpds-py version: 0.19.1 - url: https://files.pythonhosted.org/packages/36/b8/f269fed9aee00fbe96f24e016be76ba685794bc75d3fd30bd88953b474d0/rpds_py-0.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: c34f751bf67cab69638564eee34023909380ba3e0d8ee7f6fe473079bf93f09b + url: https://files.pythonhosted.org/packages/d0/b4/3e58dd849bbc85b51523bad48da9e1f8d09f5f791124ba0593ae6fc02f47/rpds_py-0.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 3837c63dd6918a24de6c526277910e3766d8c2b1627c500b155f3eecad8fad65 requires_python: '>=3.8' - kind: pypi name: rpds-py version: 0.19.1 - url: https://files.pythonhosted.org/packages/d0/b4/3e58dd849bbc85b51523bad48da9e1f8d09f5f791124ba0593ae6fc02f47/rpds_py-0.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 3837c63dd6918a24de6c526277910e3766d8c2b1627c500b155f3eecad8fad65 + url: https://files.pythonhosted.org/packages/36/b8/f269fed9aee00fbe96f24e016be76ba685794bc75d3fd30bd88953b474d0/rpds_py-0.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: c34f751bf67cab69638564eee34023909380ba3e0d8ee7f6fe473079bf93f09b requires_python: '>=3.8' - kind: pypi name: rpds-py @@ -38819,15 +38524,6 @@ packages: - numpy - rerun-sdk editable: true -- kind: pypi - name: rrt-star - version: 0.1.0 - path: examples/python/rrt_star - sha256: 41993fc9e48ad077ad59ee5918ccc59c86628fd3d8ea4d36bd0706e9880ce6df - requires_dist: - - numpy - - rerun-sdk - editable: true - kind: pypi name: rsa version: '4.9' @@ -38971,8 +38667,8 @@ packages: - kind: pypi name: safetensors version: 0.4.3 - url: https://files.pythonhosted.org/packages/82/61/d4812330b32600972e92ef09a59dc54f9ab8ae570fdca28d8bdfc5577756/safetensors-0.4.3-cp311-cp311-macosx_11_0_arm64.whl - sha256: 7c4fa560ebd4522adddb71dcd25d09bf211b5634003f015a4b815b7647d62ebe + url: https://files.pythonhosted.org/packages/cb/f6/19f268662be898ff2a23ac06f8dd0d2956b2ecd204c96e1ee07ba292c119/safetensors-0.4.3-cp311-none-win_amd64.whl + sha256: 840b7ac0eff5633e1d053cc9db12fdf56b566e9403b4950b2dc85393d9b88d67 requires_dist: - numpy>=1.21.6 ; extra == 'numpy' - safetensors[numpy] ; extra == 'torch' @@ -39051,8 +38747,8 @@ packages: - kind: pypi name: safetensors version: 0.4.3 - url: https://files.pythonhosted.org/packages/9f/d9/1bd2c06c1e7aff0c6db4affff5c0b8d6b2fa421ee0d2de94408d43e6aa7c/safetensors-0.4.3-cp311-cp311-macosx_10_12_x86_64.whl - sha256: 22f3b5d65e440cec0de8edaa672efa888030802e11c09b3d6203bff60ebff05a + url: https://files.pythonhosted.org/packages/d5/85/1e7d2804cbf82204cde462d16f1cb0ff5814b03f559fb46ceaa6b7020db4/safetensors-0.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 0bf4f9d6323d9f86eef5567eabd88f070691cf031d4c0df27a40d3b4aaee755b requires_dist: - numpy>=1.21.6 ; extra == 'numpy' - safetensors[numpy] ; extra == 'torch' @@ -39091,8 +38787,8 @@ packages: - kind: pypi name: safetensors version: 0.4.3 - url: https://files.pythonhosted.org/packages/cb/f6/19f268662be898ff2a23ac06f8dd0d2956b2ecd204c96e1ee07ba292c119/safetensors-0.4.3-cp311-none-win_amd64.whl - sha256: 840b7ac0eff5633e1d053cc9db12fdf56b566e9403b4950b2dc85393d9b88d67 + url: https://files.pythonhosted.org/packages/9f/d9/1bd2c06c1e7aff0c6db4affff5c0b8d6b2fa421ee0d2de94408d43e6aa7c/safetensors-0.4.3-cp311-cp311-macosx_10_12_x86_64.whl + sha256: 22f3b5d65e440cec0de8edaa672efa888030802e11c09b3d6203bff60ebff05a requires_dist: - numpy>=1.21.6 ; extra == 'numpy' - safetensors[numpy] ; extra == 'torch' @@ -39131,8 +38827,8 @@ packages: - kind: pypi name: safetensors version: 0.4.3 - url: https://files.pythonhosted.org/packages/d5/85/1e7d2804cbf82204cde462d16f1cb0ff5814b03f559fb46ceaa6b7020db4/safetensors-0.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 0bf4f9d6323d9f86eef5567eabd88f070691cf031d4c0df27a40d3b4aaee755b + url: https://files.pythonhosted.org/packages/82/61/d4812330b32600972e92ef09a59dc54f9ab8ae570fdca28d8bdfc5577756/safetensors-0.4.3-cp311-cp311-macosx_11_0_arm64.whl + sha256: 7c4fa560ebd4522adddb71dcd25d09bf211b5634003f015a4b815b7647d62ebe requires_dist: - numpy>=1.21.6 ; extra == 'numpy' - safetensors[numpy] ; extra == 'torch' @@ -39171,8 +38867,8 @@ packages: - kind: pypi name: scikit-image version: 0.24.0 - url: https://files.pythonhosted.org/packages/3c/f6/be8b16d8ab6ebf19057877c2aec905cbd438dd92ca64b8efe9e9af008fa3/scikit_image-0.24.0-cp311-cp311-macosx_12_0_arm64.whl - sha256: 190ebde80b4470fe8838764b9b15f232a964f1a20391663e31008d76f0c696f7 + url: https://files.pythonhosted.org/packages/50/b2/d5e97115733e2dc657e99868ae0237705b79d0c81f6ced21b8f0799a30d1/scikit_image-0.24.0-cp311-cp311-win_amd64.whl + sha256: dacf591ac0c272a111181afad4b788a27fe70d213cfddd631d151cbc34f8ca2c requires_dist: - numpy>=1.23 - scipy>=1.9 @@ -39238,8 +38934,8 @@ packages: - kind: pypi name: scikit-image version: 0.24.0 - url: https://files.pythonhosted.org/packages/50/b2/d5e97115733e2dc657e99868ae0237705b79d0c81f6ced21b8f0799a30d1/scikit_image-0.24.0-cp311-cp311-win_amd64.whl - sha256: dacf591ac0c272a111181afad4b788a27fe70d213cfddd631d151cbc34f8ca2c + url: https://files.pythonhosted.org/packages/b8/2e/3a949995f8fc2a65b15a4964373e26c5601cb2ea68f36b115571663e7a38/scikit_image-0.24.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 59c98cc695005faf2b79904e4663796c977af22586ddf1b12d6af2fa22842dc2 requires_dist: - numpy>=1.23 - scipy>=1.9 @@ -39305,8 +39001,8 @@ packages: - kind: pypi name: scikit-image version: 0.24.0 - url: https://files.pythonhosted.org/packages/90/e3/564beb0c78bf83018a146dfcdc959c99c10a0d136480b932a350c852adbc/scikit_image-0.24.0-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 272909e02a59cea3ed4aa03739bb88df2625daa809f633f40b5053cf09241831 + url: https://files.pythonhosted.org/packages/ad/96/138484302b8ec9a69cdf65e8d4ab47a640a3b1a8ea3c437e1da3e1a5a6b8/scikit_image-0.24.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: fa27b3a0dbad807b966b8db2d78da734cb812ca4787f7fbb143764800ce2fa9c requires_dist: - numpy>=1.23 - scipy>=1.9 @@ -39372,8 +39068,8 @@ packages: - kind: pypi name: scikit-image version: 0.24.0 - url: https://files.pythonhosted.org/packages/ad/96/138484302b8ec9a69cdf65e8d4ab47a640a3b1a8ea3c437e1da3e1a5a6b8/scikit_image-0.24.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: fa27b3a0dbad807b966b8db2d78da734cb812ca4787f7fbb143764800ce2fa9c + url: https://files.pythonhosted.org/packages/90/e3/564beb0c78bf83018a146dfcdc959c99c10a0d136480b932a350c852adbc/scikit_image-0.24.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 272909e02a59cea3ed4aa03739bb88df2625daa809f633f40b5053cf09241831 requires_dist: - numpy>=1.23 - scipy>=1.9 @@ -39439,8 +39135,8 @@ packages: - kind: pypi name: scikit-image version: 0.24.0 - url: https://files.pythonhosted.org/packages/b8/2e/3a949995f8fc2a65b15a4964373e26c5601cb2ea68f36b115571663e7a38/scikit_image-0.24.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 59c98cc695005faf2b79904e4663796c977af22586ddf1b12d6af2fa22842dc2 + url: https://files.pythonhosted.org/packages/3c/f6/be8b16d8ab6ebf19057877c2aec905cbd438dd92ca64b8efe9e9af008fa3/scikit_image-0.24.0-cp311-cp311-macosx_12_0_arm64.whl + sha256: 190ebde80b4470fe8838764b9b15f232a964f1a20391663e31008d76f0c696f7 requires_dist: - numpy>=1.23 - scipy>=1.9 @@ -39506,8 +39202,8 @@ packages: - kind: pypi name: scikit-learn version: 1.5.1 - url: https://files.pythonhosted.org/packages/03/86/ab9f95e338c5ef5b4e79463ee91e55aae553213835e59bf038bc0cc21bf8/scikit_learn-1.5.1-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 154297ee43c0b83af12464adeab378dee2d0a700ccd03979e2b821e7dd7cc1c2 + url: https://files.pythonhosted.org/packages/5d/55/0403bf2031250ac982c8053397889fbc5a3a2b3798b913dae4f51c3af6a4/scikit_learn-1.5.1-cp311-cp311-win_amd64.whl + sha256: 9a07f90846313a7639af6a019d849ff72baadfa4c74c778821ae0fad07b7275b requires_dist: - numpy>=1.19.5 - scipy>=1.6.0 @@ -39567,8 +39263,8 @@ packages: - kind: pypi name: scikit-learn version: 1.5.1 - url: https://files.pythonhosted.org/packages/32/63/ed228892adad313aab0d0f9261241e7bf1efe36730a2788ad424bcad00ca/scikit_learn-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 689b6f74b2c880276e365fe84fe4f1befd6a774f016339c65655eaff12e10cbf + url: https://files.pythonhosted.org/packages/c1/f8/fd3fa610cac686952d8c78b8b44cf5263c6c03885bd8e5d5819c684b44e8/scikit_learn-1.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 909144d50f367a513cee6090873ae582dba019cb3fca063b38054fa42704c3a4 requires_dist: - numpy>=1.19.5 - scipy>=1.6.0 @@ -39628,8 +39324,8 @@ packages: - kind: pypi name: scikit-learn version: 1.5.1 - url: https://files.pythonhosted.org/packages/5d/55/0403bf2031250ac982c8053397889fbc5a3a2b3798b913dae4f51c3af6a4/scikit_learn-1.5.1-cp311-cp311-win_amd64.whl - sha256: 9a07f90846313a7639af6a019d849ff72baadfa4c74c778821ae0fad07b7275b + url: https://files.pythonhosted.org/packages/32/63/ed228892adad313aab0d0f9261241e7bf1efe36730a2788ad424bcad00ca/scikit_learn-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 689b6f74b2c880276e365fe84fe4f1befd6a774f016339c65655eaff12e10cbf requires_dist: - numpy>=1.19.5 - scipy>=1.6.0 @@ -39689,8 +39385,8 @@ packages: - kind: pypi name: scikit-learn version: 1.5.1 - url: https://files.pythonhosted.org/packages/7d/d7/fb80c63062b60b1fa5dcb2d4dd3a4e83bd8c68cdc83cf6ff8c016228f184/scikit_learn-1.5.1-cp311-cp311-macosx_12_0_arm64.whl - sha256: b5e865e9bd59396220de49cb4a57b17016256637c61b4c5cc81aaf16bc123bbe + url: https://files.pythonhosted.org/packages/03/86/ab9f95e338c5ef5b4e79463ee91e55aae553213835e59bf038bc0cc21bf8/scikit_learn-1.5.1-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 154297ee43c0b83af12464adeab378dee2d0a700ccd03979e2b821e7dd7cc1c2 requires_dist: - numpy>=1.19.5 - scipy>=1.6.0 @@ -39750,8 +39446,8 @@ packages: - kind: pypi name: scikit-learn version: 1.5.1 - url: https://files.pythonhosted.org/packages/c1/f8/fd3fa610cac686952d8c78b8b44cf5263c6c03885bd8e5d5819c684b44e8/scikit_learn-1.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 909144d50f367a513cee6090873ae582dba019cb3fca063b38054fa42704c3a4 + url: https://files.pythonhosted.org/packages/7d/d7/fb80c63062b60b1fa5dcb2d4dd3a4e83bd8c68cdc83cf6ff8c016228f184/scikit_learn-1.5.1-cp311-cp311-macosx_12_0_arm64.whl + sha256: b5e865e9bd59396220de49cb4a57b17016256637c61b4c5cc81aaf16bc123bbe requires_dist: - numpy>=1.19.5 - scipy>=1.6.0 @@ -39811,8 +39507,8 @@ packages: - kind: pypi name: scipy version: 1.14.0 - url: https://files.pythonhosted.org/packages/10/55/d6096721c0f0d7e7369da9660a854c14e6379ab7aba603ea5d492d77fa23/scipy-1.14.0-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 6d056a8709ccda6cf36cdd2eac597d13bc03dba38360f418560a93050c76a16e + url: https://files.pythonhosted.org/packages/91/1d/0484130df7e33e044da88a091827d6441b77f907075bf7bbe145857d6590/scipy-1.14.0-cp311-cp311-win_amd64.whl + sha256: 5b083c8940028bb7e0b4172acafda6df762da1927b9091f9611b0bcd8676f2bc requires_dist: - numpy<2.3,>=1.23.5 - pytest ; extra == 'test' @@ -39853,8 +39549,8 @@ packages: - kind: pypi name: scipy version: 1.14.0 - url: https://files.pythonhosted.org/packages/56/95/1a3a04b5facab8287325ad2335dbb6b78b98d73690c832099c9c498f7a4d/scipy-1.14.0-cp311-cp311-macosx_12_0_arm64.whl - sha256: f0a50da861a7ec4573b7c716b2ebdcdf142b66b756a0d392c236ae568b3a93fb + url: https://files.pythonhosted.org/packages/6c/bb/f44e22697740893ffa84239ca3766bdb908c1c7135ebb272d5bd4bdc33e2/scipy-1.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 9eee2989868e274aae26125345584254d97c56194c072ed96cb433f32f692ed8 requires_dist: - numpy<2.3,>=1.23.5 - pytest ; extra == 'test' @@ -39895,8 +39591,8 @@ packages: - kind: pypi name: scipy version: 1.14.0 - url: https://files.pythonhosted.org/packages/6c/bb/f44e22697740893ffa84239ca3766bdb908c1c7135ebb272d5bd4bdc33e2/scipy-1.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 9eee2989868e274aae26125345584254d97c56194c072ed96cb433f32f692ed8 + url: https://files.pythonhosted.org/packages/89/bb/80c9c98d887c855710fd31fc5ae5574133e98203b3475b07579251803662/scipy-1.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 9e3154691b9f7ed73778d746da2df67a19d046a6c8087c8b385bc4cdb2cfca74 requires_dist: - numpy<2.3,>=1.23.5 - pytest ; extra == 'test' @@ -39937,8 +39633,8 @@ packages: - kind: pypi name: scipy version: 1.14.0 - url: https://files.pythonhosted.org/packages/89/bb/80c9c98d887c855710fd31fc5ae5574133e98203b3475b07579251803662/scipy-1.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 9e3154691b9f7ed73778d746da2df67a19d046a6c8087c8b385bc4cdb2cfca74 + url: https://files.pythonhosted.org/packages/10/55/d6096721c0f0d7e7369da9660a854c14e6379ab7aba603ea5d492d77fa23/scipy-1.14.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 6d056a8709ccda6cf36cdd2eac597d13bc03dba38360f418560a93050c76a16e requires_dist: - numpy<2.3,>=1.23.5 - pytest ; extra == 'test' @@ -39979,8 +39675,8 @@ packages: - kind: pypi name: scipy version: 1.14.0 - url: https://files.pythonhosted.org/packages/91/1d/0484130df7e33e044da88a091827d6441b77f907075bf7bbe145857d6590/scipy-1.14.0-cp311-cp311-win_amd64.whl - sha256: 5b083c8940028bb7e0b4172acafda6df762da1927b9091f9611b0bcd8676f2bc + url: https://files.pythonhosted.org/packages/56/95/1a3a04b5facab8287325ad2335dbb6b78b98d73690c832099c9c498f7a4d/scipy-1.14.0-cp311-cp311-macosx_12_0_arm64.whl + sha256: f0a50da861a7ec4573b7c716b2ebdcdf142b66b756a0d392c236ae568b3a93fb requires_dist: - numpy<2.3,>=1.23.5 - pytest ; extra == 'test' @@ -40030,7 +39726,7 @@ packages: - kind: pypi name: segment-anything version: '1.0' - url: git+https://github.com/facebookresearch/segment-anything.git@526fd066dea338ba2ca08886853bd37ffd6a8aec + url: git+https://github.com/facebookresearch/segment-anything.git@dca509fe793f601edb92606367a655c15ac00fdf requires_dist: - matplotlib ; extra == 'all' - pycocotools ; extra == 'all' @@ -40044,7 +39740,7 @@ packages: - kind: pypi name: segment-anything version: '1.0' - url: git+https://github.com/facebookresearch/segment-anything.git@dca509fe793f601edb92606367a655c15ac00fdf + url: git+https://github.com/facebookresearch/segment-anything.git@526fd066dea338ba2ca08886853bd37ffd6a8aec requires_dist: - matplotlib ; extra == 'all' - pycocotools ; extra == 'all' @@ -40070,21 +39766,6 @@ packages: - torchvision - tqdm editable: true -- kind: pypi - name: segment-anything-model - version: 0.1.0 - path: examples/python/segment_anything_model - sha256: 85bc241bedf212c63a39d0251a9dcc0fb3a435087a024d4eafd7f49342a75926 - requires_dist: - - segment-anything @ git+https://github.com/facebookresearch/segment-anything.git - - numpy - - opencv-python - - requests>=2.31,<3 - - rerun-sdk - - torch==2.2.2 - - torchvision - - tqdm - editable: true - kind: conda name: semver version: 2.13.0 @@ -40267,8 +39948,8 @@ packages: - kind: pypi name: shapely version: 2.0.5 - url: https://files.pythonhosted.org/packages/29/3d/0d3ab80860cda6afbce9736fa1f091f452092d344fdd4e3c65e5fe7b1111/shapely-2.0.5-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 5bbfb048a74cf273db9091ff3155d373020852805a37dfc846ab71dde4be93ec + url: https://files.pythonhosted.org/packages/ec/1b/092fff53cbeced411eed2717592e31cadd3e52f0ebaba5f2df3f34913f96/shapely-2.0.5-cp311-cp311-win_amd64.whl + sha256: 6c6b78c0007a34ce7144f98b7418800e0a6a5d9a762f2244b00ea560525290c9 requires_dist: - numpy<3,>=1.14 - numpydoc==1.1.* ; extra == 'docs' @@ -40297,8 +39978,8 @@ packages: - kind: pypi name: shapely version: 2.0.5 - url: https://files.pythonhosted.org/packages/80/68/6b51b7587547f6bbd0965cf957505a0ebec93510e840572a983003b3a0a9/shapely-2.0.5-cp311-cp311-macosx_11_0_arm64.whl - sha256: 93be600cbe2fbaa86c8eb70656369f2f7104cd231f0d6585c7d0aa555d6878b8 + url: https://files.pythonhosted.org/packages/ed/a8/c8b0f1a165e161247caf0fc265d61de3c4ea27d7c313c7ebfb1c4f6ddea4/shapely-2.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: d5251c28a29012e92de01d2e84f11637eb1d48184ee8f22e2df6c8c578d26760 requires_dist: - numpy<3,>=1.14 - numpydoc==1.1.* ; extra == 'docs' @@ -40312,8 +39993,8 @@ packages: - kind: pypi name: shapely version: 2.0.5 - url: https://files.pythonhosted.org/packages/ec/1b/092fff53cbeced411eed2717592e31cadd3e52f0ebaba5f2df3f34913f96/shapely-2.0.5-cp311-cp311-win_amd64.whl - sha256: 6c6b78c0007a34ce7144f98b7418800e0a6a5d9a762f2244b00ea560525290c9 + url: https://files.pythonhosted.org/packages/29/3d/0d3ab80860cda6afbce9736fa1f091f452092d344fdd4e3c65e5fe7b1111/shapely-2.0.5-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 5bbfb048a74cf273db9091ff3155d373020852805a37dfc846ab71dde4be93ec requires_dist: - numpy<3,>=1.14 - numpydoc==1.1.* ; extra == 'docs' @@ -40327,8 +40008,8 @@ packages: - kind: pypi name: shapely version: 2.0.5 - url: https://files.pythonhosted.org/packages/ed/a8/c8b0f1a165e161247caf0fc265d61de3c4ea27d7c313c7ebfb1c4f6ddea4/shapely-2.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: d5251c28a29012e92de01d2e84f11637eb1d48184ee8f22e2df6c8c578d26760 + url: https://files.pythonhosted.org/packages/80/68/6b51b7587547f6bbd0965cf957505a0ebec93510e840572a983003b3a0a9/shapely-2.0.5-cp311-cp311-macosx_11_0_arm64.whl + sha256: 93be600cbe2fbaa86c8eb70656369f2f7104cd231f0d6585c7d0aa555d6878b8 requires_dist: - numpy<3,>=1.14 - numpydoc==1.1.* ; extra == 'docs' @@ -40347,14 +40028,6 @@ packages: requires_dist: - rerun-sdk editable: true -- kind: pypi - name: shared-recording - version: 0.1.0 - path: examples/python/shared_recording - sha256: 6f605379e813578a2304663522ed82ab2fd6486cee725b969abd533b5ac8072f - requires_dist: - - rerun-sdk - editable: true - kind: pypi name: shellingham version: 1.5.4 @@ -40374,19 +40047,6 @@ packages: - scikit-learn>=1.1.3 - trimesh==3.15.2 editable: true -- kind: pypi - name: signed-distance-fields - version: 0.1.0 - path: examples/python/signed_distance_fields - sha256: 32880a8a3883c6aa03c709fe9138ba6b939633562ff98ca27fc22afc3d69f08a - requires_dist: - - mesh-to-sdf @ git+https://github.com/marian42/mesh_to_sdf.git - - numpy - - requests>=2.31,<3 - - rerun-sdk - - scikit-learn>=1.1.3 - - trimesh==3.15.2 - editable: true - kind: conda name: sigtool version: 0.1.3 @@ -40420,14 +40080,8 @@ packages: - kind: pypi name: simplejson version: 3.19.2 - url: https://files.pythonhosted.org/packages/53/a0/4430915cac272de9af75287f566cd1f06dffb69b3e9fa24b3c16b066470b/simplejson-3.19.2-cp311-cp311-macosx_11_0_arm64.whl - sha256: 08889f2f597ae965284d7b52a5c3928653a9406d88c93e3161180f0abc2433ba - requires_python: '>=2.5,!=3.0.*,!=3.1.*,!=3.2.*' -- kind: pypi - name: simplejson - version: 3.19.2 - url: https://files.pythonhosted.org/packages/70/c1/816573ae91aebf06a0fefd8ea30ca43127aa58e68684d2ddfe17c8457afb/simplejson-3.19.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 4d36081c0b1c12ea0ed62c202046dca11438bee48dd5240b7c8de8da62c620e9 + url: https://files.pythonhosted.org/packages/b6/8e/3e12d122dfdf549a8d12eaf39954ee39f2027060aa38b63430f8ab3244e7/simplejson-3.19.2-cp311-cp311-win_amd64.whl + sha256: 9300aee2a8b5992d0f4293d88deb59c218989833e3396c824b69ba330d04a589 requires_python: '>=2.5,!=3.0.*,!=3.1.*,!=3.2.*' - kind: pypi name: simplejson @@ -40438,8 +40092,8 @@ packages: - kind: pypi name: simplejson version: 3.19.2 - url: https://files.pythonhosted.org/packages/b6/8e/3e12d122dfdf549a8d12eaf39954ee39f2027060aa38b63430f8ab3244e7/simplejson-3.19.2-cp311-cp311-win_amd64.whl - sha256: 9300aee2a8b5992d0f4293d88deb59c218989833e3396c824b69ba330d04a589 + url: https://files.pythonhosted.org/packages/70/c1/816573ae91aebf06a0fefd8ea30ca43127aa58e68684d2ddfe17c8457afb/simplejson-3.19.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 4d36081c0b1c12ea0ed62c202046dca11438bee48dd5240b7c8de8da62c620e9 requires_python: '>=2.5,!=3.0.*,!=3.1.*,!=3.2.*' - kind: pypi name: simplejson @@ -40447,6 +40101,12 @@ packages: url: https://files.pythonhosted.org/packages/bc/eb/2bd4a6ec98329158f6855520596e9f2e521e2239e292d43fe1c58cf83a9b/simplejson-3.19.2-cp311-cp311-macosx_10_9_x86_64.whl sha256: adcb3332979cbc941b8fff07181f06d2b608625edc0a4d8bc3ffc0be414ad0c4 requires_python: '>=2.5,!=3.0.*,!=3.1.*,!=3.2.*' +- kind: pypi + name: simplejson + version: 3.19.2 + url: https://files.pythonhosted.org/packages/53/a0/4430915cac272de9af75287f566cd1f06dffb69b3e9fa24b3c16b066470b/simplejson-3.19.2-cp311-cp311-macosx_11_0_arm64.whl + sha256: 08889f2f597ae965284d7b52a5c3928653a9406d88c93e3161180f0abc2433ba + requires_python: '>=2.5,!=3.0.*,!=3.1.*,!=3.2.*' - kind: pypi name: six version: 1.16.0 @@ -40560,8 +40220,8 @@ packages: - kind: pypi name: sounddevice version: 0.4.7 - url: https://files.pythonhosted.org/packages/1c/9c/d8de668a462b7a326d9f697dfa2adb6fbde07cc468cc7cdcf51cbe975d56/sounddevice-0.4.7-py3-none-macosx_10_6_x86_64.macosx_10_6_universal2.whl - sha256: d6ddfd341ad7412b14ca001f2c4dbf5fa2503bdc9eb15ad2c3105f6c260b698a + url: https://files.pythonhosted.org/packages/d4/09/bfdd393f1bb1b90b4a6849b84972b7059c95e36818cc489922228d58cc63/sounddevice-0.4.7-py3-none-win_amd64.whl + sha256: 0c8b3543da1496f282b66a7bc54b755577ba638b1af06c146d4ac7f39d86b548 requires_dist: - cffi>=1.0 - numpy ; extra == 'numpy' @@ -40578,8 +40238,8 @@ packages: - kind: pypi name: sounddevice version: 0.4.7 - url: https://files.pythonhosted.org/packages/d4/09/bfdd393f1bb1b90b4a6849b84972b7059c95e36818cc489922228d58cc63/sounddevice-0.4.7-py3-none-win_amd64.whl - sha256: 0c8b3543da1496f282b66a7bc54b755577ba638b1af06c146d4ac7f39d86b548 + url: https://files.pythonhosted.org/packages/1c/9c/d8de668a462b7a326d9f697dfa2adb6fbde07cc468cc7cdcf51cbe975d56/sounddevice-0.4.7-py3-none-macosx_10_6_x86_64.macosx_10_6_universal2.whl + sha256: d6ddfd341ad7412b14ca001f2c4dbf5fa2503bdc9eb15ad2c3105f6c260b698a requires_dist: - cffi>=1.0 - numpy ; extra == 'numpy' @@ -40612,14 +40272,6 @@ packages: requires_dist: - rerun-sdk editable: true -- kind: pypi - name: stdio - version: 0.1.0 - path: examples/python/stdio - sha256: 15fb60d3e1c8b7b2d1a4dfcc223bddb267451e8ef7534d42f663d116166d92e2 - requires_dist: - - rerun-sdk - editable: true - kind: pypi name: stringcase version: 1.2.0 @@ -40637,18 +40289,6 @@ packages: - rerun-sdk - tqdm editable: true -- kind: pypi - name: structure-from-motion - version: 0.1.0 - path: examples/python/structure_from_motion - sha256: b20b79aa7bb2b4225b37d3cb28872a70dc7e9ab2ca9ab138b90d60fc8d7b4c15 - requires_dist: - - opencv-python>4.6 - - numpy - - requests>=2.31,<3 - - rerun-sdk - - tqdm - editable: true - kind: conda name: svt-av1 version: 2.1.2 @@ -41170,8 +40810,8 @@ packages: - kind: pypi name: tokenizers version: 0.19.1 - url: https://files.pythonhosted.org/packages/36/c6/537f22b57e6003904d35d07962dbde2f2e9bdd791d0241da976a4c7f8194/tokenizers-0.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: dfedf31824ca4915b511b03441784ff640378191918264268e6923da48104acc + url: https://files.pythonhosted.org/packages/65/8e/6d7d72b28f22c422cff8beae10ac3c2e4376b9be721ef8167b7eecd1da62/tokenizers-0.19.1-cp311-none-win_amd64.whl + sha256: ad57d59341710b94a7d9dbea13f5c1e7d76fd8d9bcd944a7a6ab0b0da6e0cc66 requires_dist: - huggingface-hub>=0.16.4,<1.0 - pytest ; extra == 'testing' @@ -41188,8 +40828,8 @@ packages: - kind: pypi name: tokenizers version: 0.19.1 - url: https://files.pythonhosted.org/packages/65/8e/6d7d72b28f22c422cff8beae10ac3c2e4376b9be721ef8167b7eecd1da62/tokenizers-0.19.1-cp311-none-win_amd64.whl - sha256: ad57d59341710b94a7d9dbea13f5c1e7d76fd8d9bcd944a7a6ab0b0da6e0cc66 + url: https://files.pythonhosted.org/packages/36/c6/537f22b57e6003904d35d07962dbde2f2e9bdd791d0241da976a4c7f8194/tokenizers-0.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: dfedf31824ca4915b511b03441784ff640378191918264268e6923da48104acc requires_dist: - huggingface-hub>=0.16.4,<1.0 - pytest ; extra == 'testing' @@ -41206,8 +40846,8 @@ packages: - kind: pypi name: tokenizers version: 0.19.1 - url: https://files.pythonhosted.org/packages/90/79/d17a0f491d10817cd30f1121a07aa09c8e97a81114b116e473baf1577f09/tokenizers-0.19.1-cp311-cp311-macosx_11_0_arm64.whl - sha256: ddf672ed719b4ed82b51499100f5417d7d9f6fb05a65e232249268f35de5ed14 + url: https://files.pythonhosted.org/packages/a7/03/fb50fc03f86016b227a967c8d474f90230c885c0d18f78acdfda7a96ce56/tokenizers-0.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: d16ff18907f4909dca9b076b9c2d899114dd6abceeb074eca0c93e2353f943aa requires_dist: - huggingface-hub>=0.16.4,<1.0 - pytest ; extra == 'testing' @@ -41224,8 +40864,8 @@ packages: - kind: pypi name: tokenizers version: 0.19.1 - url: https://files.pythonhosted.org/packages/a7/03/fb50fc03f86016b227a967c8d474f90230c885c0d18f78acdfda7a96ce56/tokenizers-0.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: d16ff18907f4909dca9b076b9c2d899114dd6abceeb074eca0c93e2353f943aa + url: https://files.pythonhosted.org/packages/c8/d6/6e1d728d765eb4102767f071bf7f6439ab10d7f4a975c9217db65715207a/tokenizers-0.19.1-cp311-cp311-macosx_10_12_x86_64.whl + sha256: 5c88d1481f1882c2e53e6bb06491e474e420d9ac7bdff172610c4f9ad3898059 requires_dist: - huggingface-hub>=0.16.4,<1.0 - pytest ; extra == 'testing' @@ -41242,8 +40882,8 @@ packages: - kind: pypi name: tokenizers version: 0.19.1 - url: https://files.pythonhosted.org/packages/c8/d6/6e1d728d765eb4102767f071bf7f6439ab10d7f4a975c9217db65715207a/tokenizers-0.19.1-cp311-cp311-macosx_10_12_x86_64.whl - sha256: 5c88d1481f1882c2e53e6bb06491e474e420d9ac7bdff172610c4f9ad3898059 + url: https://files.pythonhosted.org/packages/90/79/d17a0f491d10817cd30f1121a07aa09c8e97a81114b116e473baf1577f09/tokenizers-0.19.1-cp311-cp311-macosx_11_0_arm64.whl + sha256: ddf672ed719b4ed82b51499100f5417d7d9f6fb05a65e232249268f35de5ed14 requires_dist: - huggingface-hub>=0.16.4,<1.0 - pytest ; extra == 'testing' @@ -41300,8 +40940,8 @@ packages: - kind: pypi name: torch version: 2.2.2 - url: https://files.pythonhosted.org/packages/02/af/81abea3d73fddfde26afd1ce52a4ddfa389cd2b684c89d6c4d0d5d8d0dfa/torch-2.2.2-cp311-cp311-manylinux2014_aarch64.whl - sha256: 32827fa1fbe5da8851686256b4cd94cc7b11be962862c2293811c94eea9457bf + url: https://files.pythonhosted.org/packages/96/23/18b9c16c18a77755e7f15173821c7100f11e6b3b7717bea8d729bdeb92c0/torch-2.2.2-cp311-none-macosx_11_0_arm64.whl + sha256: 49aa4126ede714c5aeef7ae92969b4b0bbe67f19665106463c39f22e0a1860d1 requires_dist: - filelock - typing-extensions>=4.8.0 @@ -41327,8 +40967,8 @@ packages: - kind: pypi name: torch version: 2.2.2 - url: https://files.pythonhosted.org/packages/3f/14/e105b8ef6d324e789c1589e95cb0ab63f3e07c2216d68b1178b7c21b7d2a/torch-2.2.2-cp311-none-macosx_10_9_x86_64.whl - sha256: 95b9b44f3bcebd8b6cd8d37ec802048c872d9c567ba52c894bba90863a439059 + url: https://files.pythonhosted.org/packages/5c/01/5ab75f138bf32d7a69df61e4997e24eccad87cc009f5fb7e2a31af8a4036/torch-2.2.2-cp311-cp311-win_amd64.whl + sha256: f9ef0a648310435511e76905f9b89612e45ef2c8b023bee294f5e6f7e73a3e7c requires_dist: - filelock - typing-extensions>=4.8.0 @@ -41354,8 +40994,8 @@ packages: - kind: pypi name: torch version: 2.2.2 - url: https://files.pythonhosted.org/packages/5c/01/5ab75f138bf32d7a69df61e4997e24eccad87cc009f5fb7e2a31af8a4036/torch-2.2.2-cp311-cp311-win_amd64.whl - sha256: f9ef0a648310435511e76905f9b89612e45ef2c8b023bee294f5e6f7e73a3e7c + url: https://files.pythonhosted.org/packages/3f/14/e105b8ef6d324e789c1589e95cb0ab63f3e07c2216d68b1178b7c21b7d2a/torch-2.2.2-cp311-none-macosx_10_9_x86_64.whl + sha256: 95b9b44f3bcebd8b6cd8d37ec802048c872d9c567ba52c894bba90863a439059 requires_dist: - filelock - typing-extensions>=4.8.0 @@ -41381,8 +41021,8 @@ packages: - kind: pypi name: torch version: 2.2.2 - url: https://files.pythonhosted.org/packages/96/23/18b9c16c18a77755e7f15173821c7100f11e6b3b7717bea8d729bdeb92c0/torch-2.2.2-cp311-none-macosx_11_0_arm64.whl - sha256: 49aa4126ede714c5aeef7ae92969b4b0bbe67f19665106463c39f22e0a1860d1 + url: https://files.pythonhosted.org/packages/02/af/81abea3d73fddfde26afd1ce52a4ddfa389cd2b684c89d6c4d0d5d8d0dfa/torch-2.2.2-cp311-cp311-manylinux2014_aarch64.whl + sha256: 32827fa1fbe5da8851686256b4cd94cc7b11be962862c2293811c94eea9457bf requires_dist: - filelock - typing-extensions>=4.8.0 @@ -41435,8 +41075,8 @@ packages: - kind: pypi name: torchvision version: 0.17.2 - url: https://files.pythonhosted.org/packages/36/15/c48f74f8f8d382677ef016b65f09969028a1549b8a518c18894deb95b544/torchvision-0.17.2-cp311-cp311-macosx_11_0_arm64.whl - sha256: e031004a1bc432c980a7bd642f6c189a3efc316e423fc30b5569837166a4e28d + url: https://files.pythonhosted.org/packages/c6/75/d869f600fc33df8b8ca99943e165a4ca23b73c68dc1942098fde0a6b46f3/torchvision-0.17.2-cp311-cp311-win_amd64.whl + sha256: 6835897df852fad1015e6a106c167c83848114cbcc7d86112384a973404e4431 requires_dist: - numpy - torch==2.2.2 @@ -41446,8 +41086,8 @@ packages: - kind: pypi name: torchvision version: 0.17.2 - url: https://files.pythonhosted.org/packages/46/95/179dd1bf8fd6bd689f0907f4baed557d2b12d2cf3d7ed1a8ecefe0a63d83/torchvision-0.17.2-cp311-cp311-macosx_10_13_x86_64.whl - sha256: 9b83e55ee7d0a1704f52b9c0ac87388e7a6d1d98a6bde7b0b35f9ab54d7bda54 + url: https://files.pythonhosted.org/packages/56/8d/a153903bfd610450258ee7ac5d292d6b8f382aec14f49404845d8ba6207d/torchvision-0.17.2-cp311-cp311-manylinux2014_aarch64.whl + sha256: 833fd2e4216ced924c8aca0525733fe727f9a1af66dfad7c5be7257e97c39678 requires_dist: - numpy - torch==2.2.2 @@ -41457,8 +41097,8 @@ packages: - kind: pypi name: torchvision version: 0.17.2 - url: https://files.pythonhosted.org/packages/56/8d/a153903bfd610450258ee7ac5d292d6b8f382aec14f49404845d8ba6207d/torchvision-0.17.2-cp311-cp311-manylinux2014_aarch64.whl - sha256: 833fd2e4216ced924c8aca0525733fe727f9a1af66dfad7c5be7257e97c39678 + url: https://files.pythonhosted.org/packages/68/49/5e1c771294407bb25e6dbcf169aef5cffefcddf27b0176125a9b0af06a1e/torchvision-0.17.2-cp311-cp311-manylinux1_x86_64.whl + sha256: 3bbc24b7713e8f22766992562547d8b4b10001208d372fe599255af84bfd1a69 requires_dist: - numpy - torch==2.2.2 @@ -41468,8 +41108,8 @@ packages: - kind: pypi name: torchvision version: 0.17.2 - url: https://files.pythonhosted.org/packages/68/49/5e1c771294407bb25e6dbcf169aef5cffefcddf27b0176125a9b0af06a1e/torchvision-0.17.2-cp311-cp311-manylinux1_x86_64.whl - sha256: 3bbc24b7713e8f22766992562547d8b4b10001208d372fe599255af84bfd1a69 + url: https://files.pythonhosted.org/packages/46/95/179dd1bf8fd6bd689f0907f4baed557d2b12d2cf3d7ed1a8ecefe0a63d83/torchvision-0.17.2-cp311-cp311-macosx_10_13_x86_64.whl + sha256: 9b83e55ee7d0a1704f52b9c0ac87388e7a6d1d98a6bde7b0b35f9ab54d7bda54 requires_dist: - numpy - torch==2.2.2 @@ -41479,8 +41119,8 @@ packages: - kind: pypi name: torchvision version: 0.17.2 - url: https://files.pythonhosted.org/packages/c6/75/d869f600fc33df8b8ca99943e165a4ca23b73c68dc1942098fde0a6b46f3/torchvision-0.17.2-cp311-cp311-win_amd64.whl - sha256: 6835897df852fad1015e6a106c167c83848114cbcc7d86112384a973404e4431 + url: https://files.pythonhosted.org/packages/36/15/c48f74f8f8d382677ef016b65f09969028a1549b8a518c18894deb95b544/torchvision-0.17.2-cp311-cp311-macosx_11_0_arm64.whl + sha256: e031004a1bc432c980a7bd642f6c189a3efc316e423fc30b5569837166a4e28d requires_dist: - numpy - torch==2.2.2 @@ -41490,8 +41130,8 @@ packages: - kind: pypi name: tornado version: 6.4.1 - url: https://files.pythonhosted.org/packages/00/d9/c33be3c1a7564f7d42d87a8d186371a75fd142097076767a5c27da941fef/tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl - sha256: 163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8 + url: https://files.pythonhosted.org/packages/d9/2f/3f2f05e84a7aff787a96d5fb06821323feb370fe0baed4db6ea7b1088f32/tornado-6.4.1-cp38-abi3-win_amd64.whl + sha256: b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7 requires_python: '>=3.8' - kind: pypi name: tornado @@ -41514,8 +41154,8 @@ packages: - kind: pypi name: tornado version: 6.4.1 - url: https://files.pythonhosted.org/packages/d9/2f/3f2f05e84a7aff787a96d5fb06821323feb370fe0baed4db6ea7b1088f32/tornado-6.4.1-cp38-abi3-win_amd64.whl - sha256: b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7 + url: https://files.pythonhosted.org/packages/00/d9/c33be3c1a7564f7d42d87a8d186371a75fd142097076767a5c27da941fef/tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl + sha256: 163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8 requires_python: '>=3.8' - kind: pypi name: tqdm @@ -42744,32 +42384,38 @@ packages: - kind: pypi name: uv version: 0.2.26 - url: https://files.pythonhosted.org/packages/7a/30/24a74c0ca887d3a75821814d292e1001571d574c4c2b217a858b09ce8b88/uv-0.2.26-py3-none-macosx_10_12_x86_64.whl - sha256: fd3e850921f0d51d093aaeb76d190829eefdc0345439b8f6c06103a0463cc451 + url: https://files.pythonhosted.org/packages/ee/d1/d0311b79198f5f07809edcb6b71f38f8e8e0d848194ff0f5bfcd1cd941fe/uv-0.2.26-py3-none-win_amd64.whl + sha256: 05949e0135d5093d555f17ca6701e5939547d8a656bec003b7986e3540533348 requires_python: '>=3.8' - kind: pypi name: uv version: 0.2.26 - url: https://files.pythonhosted.org/packages/93/22/f39356b5519e2ff7dad7cc2a45146fd144659cae48ef5c6ce054d655b7cc/uv-0.2.26-py3-none-manylinux_2_28_aarch64.whl - sha256: c1ba6064f8bff59e3e6a7c59cf27ce4cffc6bf2eed1777134522b65c562f9206 + url: https://files.pythonhosted.org/packages/b3/2c/8d18a2e39015ad132bfa8d8ff31b8bad5cea6760db0534963d54944b13f1/uv-0.2.26-py3-none-macosx_11_0_arm64.whl + sha256: 3117aabd606cbe70a3a1589301ce14d578f3f62a46025b26e251b664b01b3728 requires_python: '>=3.8' - kind: pypi name: uv version: 0.2.26 - url: https://files.pythonhosted.org/packages/b3/2c/8d18a2e39015ad132bfa8d8ff31b8bad5cea6760db0534963d54944b13f1/uv-0.2.26-py3-none-macosx_11_0_arm64.whl - sha256: 3117aabd606cbe70a3a1589301ce14d578f3f62a46025b26e251b664b01b3728 + url: https://files.pythonhosted.org/packages/7a/30/24a74c0ca887d3a75821814d292e1001571d574c4c2b217a858b09ce8b88/uv-0.2.26-py3-none-macosx_10_12_x86_64.whl + sha256: fd3e850921f0d51d093aaeb76d190829eefdc0345439b8f6c06103a0463cc451 requires_python: '>=3.8' - kind: pypi name: uv version: 0.2.26 - url: https://files.pythonhosted.org/packages/ee/d1/d0311b79198f5f07809edcb6b71f38f8e8e0d848194ff0f5bfcd1cd941fe/uv-0.2.26-py3-none-win_amd64.whl - sha256: 05949e0135d5093d555f17ca6701e5939547d8a656bec003b7986e3540533348 + url: https://files.pythonhosted.org/packages/93/22/f39356b5519e2ff7dad7cc2a45146fd144659cae48ef5c6ce054d655b7cc/uv-0.2.26-py3-none-manylinux_2_28_aarch64.whl + sha256: c1ba6064f8bff59e3e6a7c59cf27ce4cffc6bf2eed1777134522b65c562f9206 requires_python: '>=3.8' - kind: pypi name: uv version: 0.2.27 - url: https://files.pythonhosted.org/packages/be/53/b3e7e74acc2cf91861abfaabf11255df26d82871e1d3fcfec1c3c9b6dcd0/uv-0.2.27-py3-none-macosx_11_0_arm64.whl - sha256: 8a44fc58726f353645c64ccde00338e73fa97aa42bbeb3bd6a8269c0b9386954 + url: https://files.pythonhosted.org/packages/db/a7/b4a48f4cd49fab545c6e5bb743e3569aff0869625bb22bd233d958fd15a5/uv-0.2.27-py3-none-manylinux_2_28_aarch64.whl + sha256: d33d54d8119bb5dd52c52f3d78efd61064ae650d0105b65b471eb0de48f5c4ba + requires_python: '>=3.8' +- kind: pypi + name: uv + version: 0.2.27 + url: https://files.pythonhosted.org/packages/ed/1d/74d7009e57a85c6baedfb7bdf51481523b4a931eddb106c89f287dc278c8/uv-0.2.27-py3-none-win_amd64.whl + sha256: 7921c9eb9feb3b7a9cb6f4afab58718a5a07752d834c2de72b7d294bff963789 requires_python: '>=3.8' - kind: pypi name: uv @@ -42786,14 +42432,14 @@ packages: - kind: pypi name: uv version: 0.2.27 - url: https://files.pythonhosted.org/packages/db/a7/b4a48f4cd49fab545c6e5bb743e3569aff0869625bb22bd233d958fd15a5/uv-0.2.27-py3-none-manylinux_2_28_aarch64.whl - sha256: d33d54d8119bb5dd52c52f3d78efd61064ae650d0105b65b471eb0de48f5c4ba + url: https://files.pythonhosted.org/packages/be/53/b3e7e74acc2cf91861abfaabf11255df26d82871e1d3fcfec1c3c9b6dcd0/uv-0.2.27-py3-none-macosx_11_0_arm64.whl + sha256: 8a44fc58726f353645c64ccde00338e73fa97aa42bbeb3bd6a8269c0b9386954 requires_python: '>=3.8' - kind: pypi name: uv - version: 0.2.27 - url: https://files.pythonhosted.org/packages/ed/1d/74d7009e57a85c6baedfb7bdf51481523b4a931eddb106c89f287dc278c8/uv-0.2.27-py3-none-win_amd64.whl - sha256: 7921c9eb9feb3b7a9cb6f4afab58718a5a07752d834c2de72b7d294bff963789 + version: 0.2.28 + url: https://files.pythonhosted.org/packages/80/d2/b8206aa8b4de05388cae473f87a06e6be80cfcc6ba6dd8313a4be9647252/uv-0.2.28-py3-none-manylinux_2_28_aarch64.whl + sha256: 894a9929f8deb9c15cf84c98fb89e8e2c3dcf6e9fd6da8c81e7b9a22c86d661e requires_python: '>=3.8' - kind: pypi name: uv @@ -42801,12 +42447,6 @@ packages: url: https://files.pythonhosted.org/packages/69/68/34dc06721be38c4d90c717a34d8d0f7441d83d8f0efb2126a7026204e7dc/uv-0.2.28-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl sha256: 8fc4185ee3bc644e38421a82a942fa5c7864d6eeaa04fd59e1ae577e2e5b76ea requires_python: '>=3.8' -- kind: pypi - name: uv - version: 0.2.28 - url: https://files.pythonhosted.org/packages/80/d2/b8206aa8b4de05388cae473f87a06e6be80cfcc6ba6dd8313a4be9647252/uv-0.2.28-py3-none-manylinux_2_28_aarch64.whl - sha256: 894a9929f8deb9c15cf84c98fb89e8e2c3dcf6e9fd6da8c81e7b9a22c86d661e - requires_python: '>=3.8' - kind: conda name: vc version: '14.3' @@ -43018,12 +42658,6 @@ packages: url: https://files.pythonhosted.org/packages/93/c1/68423f43bc95d873d745bef8030ecf47cd67f932f20b3f7080a02cff43ca/widgetsnbextension-4.0.11-py3-none-any.whl sha256: 55d4d6949d100e0d08b94948a42efc3ed6dfdc0e9468b2c4b128c9a2ce3a7a36 requires_python: '>=3.7' -- kind: pypi - name: wrapt - version: 1.16.0 - url: https://files.pythonhosted.org/packages/0f/16/ea627d7817394db04518f62934a5de59874b587b792300991b3c347ff5e0/wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl - sha256: 75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d - requires_python: '>=3.6' - kind: pypi name: wrapt version: 1.16.0 @@ -43033,14 +42667,14 @@ packages: - kind: pypi name: wrapt version: 1.16.0 - url: https://files.pythonhosted.org/packages/7f/a7/f1212ba098f3de0fd244e2de0f8791ad2539c03bef6c05a9fcb03e45b089/wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389 + url: https://files.pythonhosted.org/packages/cf/c3/0084351951d9579ae83a3d9e38c140371e4c6b038136909235079f2e6e78/wrapt-1.16.0-cp311-cp311-win_amd64.whl + sha256: aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89 requires_python: '>=3.6' - kind: pypi name: wrapt version: 1.16.0 - url: https://files.pythonhosted.org/packages/cf/c3/0084351951d9579ae83a3d9e38c140371e4c6b038136909235079f2e6e78/wrapt-1.16.0-cp311-cp311-win_amd64.whl - sha256: aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89 + url: https://files.pythonhosted.org/packages/0f/16/ea627d7817394db04518f62934a5de59874b587b792300991b3c347ff5e0/wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl + sha256: 75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d requires_python: '>=3.6' - kind: pypi name: wrapt @@ -43048,6 +42682,12 @@ packages: url: https://files.pythonhosted.org/packages/fd/03/c188ac517f402775b90d6f312955a5e53b866c964b32119f2ed76315697e/wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl sha256: 1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09 requires_python: '>=3.6' +- kind: pypi + name: wrapt + version: 1.16.0 + url: https://files.pythonhosted.org/packages/7f/a7/f1212ba098f3de0fd244e2de0f8791ad2539c03bef6c05a9fcb03e45b089/wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389 + requires_python: '>=3.6' - kind: conda name: x264 version: 1!164.3095 @@ -44154,8 +43794,8 @@ packages: - kind: pypi name: zstandard version: 0.23.0 - url: https://files.pythonhosted.org/packages/63/b6/677e65c095d8e12b66b8f862b069bcf1f1d781b9c9c6f12eb55000d57583/zstandard-0.23.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 983b6efd649723474f29ed42e1467f90a35a74793437d0bc64a5bf482bedfa0a + url: https://files.pythonhosted.org/packages/76/3f/dbafccf19cfeca25bbabf6f2dd81796b7218f768ec400f043edc767015a6/zstandard-0.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: fd30d9c67d13d891f2360b2a120186729c111238ac63b43dbd37a5a40670b8ca requires_dist: - cffi>=1.11 ; platform_python_implementation == 'PyPy' - cffi>=1.11 ; extra == 'cffi' @@ -44163,8 +43803,8 @@ packages: - kind: pypi name: zstandard version: 0.23.0 - url: https://files.pythonhosted.org/packages/76/3f/dbafccf19cfeca25bbabf6f2dd81796b7218f768ec400f043edc767015a6/zstandard-0.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: fd30d9c67d13d891f2360b2a120186729c111238ac63b43dbd37a5a40670b8ca + url: https://files.pythonhosted.org/packages/be/a2/4272175d47c623ff78196f3c10e9dc7045c1b9caf3735bf041e65271eca4/zstandard-0.23.0-cp311-cp311-win_amd64.whl + sha256: 62136da96a973bd2557f06ddd4e8e807f9e13cbb0bfb9cc06cfe6d98ea90dfe0 requires_dist: - cffi>=1.11 ; platform_python_implementation == 'PyPy' - cffi>=1.11 ; extra == 'cffi' @@ -44172,8 +43812,8 @@ packages: - kind: pypi name: zstandard version: 0.23.0 - url: https://files.pythonhosted.org/packages/9e/40/f67e7d2c25a0e2dc1744dd781110b0b60306657f8696cafb7ad7579469bd/zstandard-0.23.0-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 34895a41273ad33347b2fc70e1bff4240556de3c46c6ea430a7ed91f9042aa4e + url: https://files.pythonhosted.org/packages/e8/46/66d5b55f4d737dd6ab75851b224abf0afe5774976fe511a54d2eb9063a41/zstandard-0.23.0-cp311-cp311-macosx_11_0_arm64.whl + sha256: 77ea385f7dd5b5676d7fd943292ffa18fbf5c72ba98f7d09fc1fb9e819b34c23 requires_dist: - cffi>=1.11 ; platform_python_implementation == 'PyPy' - cffi>=1.11 ; extra == 'cffi' @@ -44181,8 +43821,8 @@ packages: - kind: pypi name: zstandard version: 0.23.0 - url: https://files.pythonhosted.org/packages/be/a2/4272175d47c623ff78196f3c10e9dc7045c1b9caf3735bf041e65271eca4/zstandard-0.23.0-cp311-cp311-win_amd64.whl - sha256: 62136da96a973bd2557f06ddd4e8e807f9e13cbb0bfb9cc06cfe6d98ea90dfe0 + url: https://files.pythonhosted.org/packages/9e/40/f67e7d2c25a0e2dc1744dd781110b0b60306657f8696cafb7ad7579469bd/zstandard-0.23.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 34895a41273ad33347b2fc70e1bff4240556de3c46c6ea430a7ed91f9042aa4e requires_dist: - cffi>=1.11 ; platform_python_implementation == 'PyPy' - cffi>=1.11 ; extra == 'cffi' @@ -44190,8 +43830,8 @@ packages: - kind: pypi name: zstandard version: 0.23.0 - url: https://files.pythonhosted.org/packages/e8/46/66d5b55f4d737dd6ab75851b224abf0afe5774976fe511a54d2eb9063a41/zstandard-0.23.0-cp311-cp311-macosx_11_0_arm64.whl - sha256: 77ea385f7dd5b5676d7fd943292ffa18fbf5c72ba98f7d09fc1fb9e819b34c23 + url: https://files.pythonhosted.org/packages/63/b6/677e65c095d8e12b66b8f862b069bcf1f1d781b9c9c6f12eb55000d57583/zstandard-0.23.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 983b6efd649723474f29ed42e1467f90a35a74793437d0bc64a5bf482bedfa0a requires_dist: - cffi>=1.11 ; platform_python_implementation == 'PyPy' - cffi>=1.11 ; extra == 'cffi' diff --git a/pixi.toml b/pixi.toml index 704f967f286f..b2ff17770030 100644 --- a/pixi.toml +++ b/pixi.toml @@ -420,6 +420,7 @@ gitignore-parser = ">=0.1.9" gitpython = ">=3.1.40" jinja2 = ">=3.1.3,<3.2" # For `update_pr_bodies.py`, `generate_pr_summary.py`, `build_screenshot_compare.py` and other utilities that build websites. mypy = "1.8.0" +nasm = ">=2.16" # Required by https://github.com/memorysafety/rav1d for native video support ninja = "1.11.1" numpy = ">=1.23,<2" prettier = "3.2.5.*" From d98b785bb2fefca8ded9efb4a5f37fe6b475903d Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Thu, 3 Oct 2024 16:02:50 +0200 Subject: [PATCH 14/61] Remove unused enum Codec --- crates/store/re_video/src/demux/mod.rs | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/crates/store/re_video/src/demux/mod.rs b/crates/store/re_video/src/demux/mod.rs index 4dc30a41be0d..d5b39e6135e0 100644 --- a/crates/store/re_video/src/demux/mod.rs +++ b/crates/store/re_video/src/demux/mod.rs @@ -191,24 +191,6 @@ pub struct Config { pub coded_width: u16, } -#[derive(Debug, Clone, Copy)] -pub enum Codec { - /// AV1 - Av01, - - /// H.264 - Avc1, - - /// H.265 - Hevc, - - /// VP8 - Vp08, - - /// VP9 - Vp09, -} - /// Errors that can occur when loading a video. #[derive(thiserror::Error, Debug)] pub enum VideoLoadError { From 72e6f211a2d39974390845bb9dafd4aca9e64a29 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Thu, 3 Oct 2024 16:26:58 +0200 Subject: [PATCH 15/61] Add the `video_av1` opt-in feature flag --- crates/store/re_video/Cargo.toml | 10 ++++-- crates/store/re_video/src/decode/mod.rs | 1 + crates/store/re_video/src/lib.rs | 5 ++- crates/top/rerun-cli/Cargo.toml | 4 +++ crates/top/rerun/Cargo.toml | 4 +++ crates/viewer/re_renderer/Cargo.toml | 4 +++ .../re_renderer/src/video/decoder/mod.rs | 33 +++++++++++-------- .../decoder/{native.rs => native_av1.rs} | 0 .../src/video/decoder/no_native_decoder.rs | 21 ++++++++++++ crates/viewer/re_renderer/src/video/mod.rs | 3 ++ crates/viewer/re_viewer/Cargo.toml | 5 +++ pixi.toml | 8 ++--- 12 files changed, 78 insertions(+), 20 deletions(-) rename crates/viewer/re_renderer/src/video/decoder/{native.rs => native_av1.rs} (100%) create mode 100644 crates/viewer/re_renderer/src/video/decoder/no_native_decoder.rs diff --git a/crates/store/re_video/Cargo.toml b/crates/store/re_video/Cargo.toml index f01e8f44608e..d5539678f237 100644 --- a/crates/store/re_video/Cargo.toml +++ b/crates/store/re_video/Cargo.toml @@ -24,6 +24,11 @@ no-default-features = true features = ["all"] [features] +default = [] + +## Opt-in to native AV1 decoding. +## You need to install [nasm](https://nasm.us/) to compile with this feature. +av1 = ["dep:dav1d"] [dependencies] re_log.workspace = true @@ -36,9 +41,10 @@ parking_lot.workspace = true re_mp4.workspace = true thiserror.workspace = true +# Native dependencies: +[target.'cfg(not(target_arch = "wasm32"))'.dependencies] # If this package fails to build, install `nasm` locally, or build through `pixi`. -dav1d = { git = "https://github.com/rerun-io/rav1d-rs" } -# dav1d = { path = "../../../../rav1d-rs", package = "dav1d" } +dav1d = { git = "https://github.com/rerun-io/rav1d-rs", optional = true } # TODO: clean up this fork. https://github.com/rerun-io/rerun/issues/7575 [dev-dependencies] indicatif.workspace = true diff --git a/crates/store/re_video/src/decode/mod.rs b/crates/store/re_video/src/decode/mod.rs index a3a777097f80..0bcca5079006 100644 --- a/crates/store/re_video/src/decode/mod.rs +++ b/crates/store/re_video/src/decode/mod.rs @@ -1,5 +1,6 @@ //! Video frame decoding. +#[cfg(feature = "av1")] pub mod av1; use crate::Time; diff --git a/crates/store/re_video/src/lib.rs b/crates/store/re_video/src/lib.rs index c5de8280f8b2..af38ce5ad630 100644 --- a/crates/store/re_video/src/lib.rs +++ b/crates/store/re_video/src/lib.rs @@ -3,10 +3,13 @@ mod decode; mod demux; -pub use decode::{av1, Chunk, Frame, PixelFormat}; +pub use decode::{Chunk, Frame, PixelFormat}; pub use demux::{Sample, VideoData, VideoLoadError}; pub use re_mp4::{TrackId, TrackKind}; +#[cfg(feature = "av1")] +pub use decode::av1; + use ordered_float::OrderedFloat; #[derive(Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] diff --git a/crates/top/rerun-cli/Cargo.toml b/crates/top/rerun-cli/Cargo.toml index 2125658ad719..aac1e268b54c 100644 --- a/crates/top/rerun-cli/Cargo.toml +++ b/crates/top/rerun-cli/Cargo.toml @@ -43,6 +43,10 @@ default = ["native_viewer", "web_viewer"] ## This adds a lot of extra dependencies, so only enable this feature if you need it! native_viewer = ["rerun/native_viewer"] +## Support for native AV1 video decoding. +## You need to install [nasm](https://nasm.us/) to compile with this feature. +video_av1 = ["rerun/video_av1"] + ## Support serving a web viewer over HTTP. ## ## Enabling this inflates the binary size quite a bit, since it embeds the viewer wasm. diff --git a/crates/top/rerun/Cargo.toml b/crates/top/rerun/Cargo.toml index ddb557ebc27b..af546f31a6c8 100644 --- a/crates/top/rerun/Cargo.toml +++ b/crates/top/rerun/Cargo.toml @@ -94,6 +94,10 @@ server = ["re_sdk_comms?/server"] ## Embed the Rerun SDK & built-in types and re-export all of their public symbols. sdk = ["dep:re_sdk", "dep:re_types"] +## Support for native AV1 video decoding. +## You need to install [nasm](https://nasm.us/) to compile with this feature. +video_av1 = ["re_viewer?/video_av1"] + ## Support serving a web viewer over HTTP. ## ## Enabling this inflates the binary size quite a bit, since it embeds the viewer wasm. diff --git a/crates/viewer/re_renderer/Cargo.toml b/crates/viewer/re_renderer/Cargo.toml index e03c8136c04f..267592f2437d 100644 --- a/crates/viewer/re_renderer/Cargo.toml +++ b/crates/viewer/re_renderer/Cargo.toml @@ -35,6 +35,10 @@ default = ["import-obj", "import-gltf", "import-stl"] ## Support for Arrow datatypes for end-to-end zero-copy. arrow = ["dep:arrow2"] +## Support for native AV1 video decoding. +## You need to install [nasm](https://nasm.us/) to compile with this feature. +video_av1 = ["re_video/av1"] + ## Support importing .obj files import-obj = ["dep:tobj"] diff --git a/crates/viewer/re_renderer/src/video/decoder/mod.rs b/crates/viewer/re_renderer/src/video/decoder/mod.rs index cfd27e9fd914..cde42027be50 100644 --- a/crates/viewer/re_renderer/src/video/decoder/mod.rs +++ b/crates/viewer/re_renderer/src/video/decoder/mod.rs @@ -2,7 +2,12 @@ mod web; #[cfg(not(target_arch = "wasm32"))] -mod native; +mod no_native_decoder; + +#[cfg(feature = "video_av1")] +#[cfg(not(target_arch = "wasm32"))] +mod native_av1; + use crate::{ resource_managers::GpuTexture2D, wgpu_resources::{GpuTexturePool, TextureDesc}, @@ -28,26 +33,27 @@ pub trait VideoDecoder: 'static + Send { ) -> FrameDecodingResult; } -#[cfg(target_arch = "wasm32")] -pub fn new_video_decoder( - render_context: &RenderContext, - data: Arc, - hw_acceleration: DecodeHardwareAcceleration, -) -> Result, DecodingError> { - let decoder = web::WebVideoDecoder::new(render_context, data, hw_acceleration)?; - Ok(Box::new(decoder)) -} - -#[cfg(not(target_arch = "wasm32"))] pub fn new_video_decoder( render_context: &RenderContext, data: Arc, _hw_acceleration: DecodeHardwareAcceleration, ) -> Result, DecodingError> { - let decoder = native::Av1VideoDecoder::new(render_context, data)?; + #![allow(unused, clippy::unnecessary_wraps, clippy::needless_pass_by_value)] // only for some feature flags + + cfg_if::cfg_if! { + if #[cfg(target_arch = "wasm32")] { + let decoder = web::WebVideoDecoder::new(render_context, data, hw_acceleration)?; + } else if #[cfg(feature = "video_av1")] { + let decoder = native_av1::Av1VideoDecoder::new(render_context, data)?; + } else { + let decoder = no_native_decoder::NoNativeVideoDecoder::default(); + } + }; + Ok(Box::new(decoder)) } +#[allow(unused)] // For some feature flags fn alloc_video_frame_texture( device: &wgpu::Device, pool: &GpuTexturePool, @@ -86,6 +92,7 @@ fn alloc_video_frame_texture( /// - The index of `needle` in `v`, if it exists /// - The index of the first element in `v` that is lesser than `needle`, if it exists /// - `None`, if `v` is empty OR `needle` is greater than all elements in `v` +#[allow(unused)] // For some feature flags fn latest_at_idx(v: &[T], key: impl Fn(&T) -> K, needle: &K) -> Option { if v.is_empty() { return None; diff --git a/crates/viewer/re_renderer/src/video/decoder/native.rs b/crates/viewer/re_renderer/src/video/decoder/native_av1.rs similarity index 100% rename from crates/viewer/re_renderer/src/video/decoder/native.rs rename to crates/viewer/re_renderer/src/video/decoder/native_av1.rs diff --git a/crates/viewer/re_renderer/src/video/decoder/no_native_decoder.rs b/crates/viewer/re_renderer/src/video/decoder/no_native_decoder.rs new file mode 100644 index 000000000000..10aa5f42fba5 --- /dev/null +++ b/crates/viewer/re_renderer/src/video/decoder/no_native_decoder.rs @@ -0,0 +1,21 @@ +use crate::{ + video::{DecodingError, FrameDecodingResult}, + RenderContext, +}; + +use super::VideoDecoder; + +/// A [`VideoDecoder`] that always fails with [`DecodingError::NoNativeSupport`] +#[derive(Default)] +pub struct NoNativeVideoDecoder {} + +impl VideoDecoder for NoNativeVideoDecoder { + #[allow(clippy::unused_self)] + fn frame_at( + &mut self, + _render_ctx: &RenderContext, + _presentation_timestamp_s: f64, + ) -> FrameDecodingResult { + Err(DecodingError::NoNativeSupport) + } +} diff --git a/crates/viewer/re_renderer/src/video/mod.rs b/crates/viewer/re_renderer/src/video/mod.rs index ec34f64139c3..73b7221d25ca 100644 --- a/crates/viewer/re_renderer/src/video/mod.rs +++ b/crates/viewer/re_renderer/src/video/mod.rs @@ -45,6 +45,9 @@ pub enum DecodingError { /// e.g. bad mp4, or bug in mp4 parse #[error("Bad data.")] BadData, + + #[error("No native video support. Try compiling rerun with the `video_av1` feature flag")] + NoNativeSupport, } pub type FrameDecodingResult = Result; diff --git a/crates/viewer/re_viewer/Cargo.toml b/crates/viewer/re_viewer/Cargo.toml index d6b5970ccc76..d3ab807f4f8f 100644 --- a/crates/viewer/re_viewer/Cargo.toml +++ b/crates/viewer/re_viewer/Cargo.toml @@ -36,6 +36,11 @@ default = ["analytics"] ## Enable telemetry using our analytics SDK. analytics = ["dep:re_analytics"] +## Support for native AV1 video decoding. +## You need to install [nasm](https://nasm.us/) to compile with this feature. +video_av1 = ["re_renderer/video_av1"] + + [dependencies] # Internal: re_blueprint_tree.workspace = true diff --git a/pixi.toml b/pixi.toml index b2ff17770030..e8f911af794b 100644 --- a/pixi.toml +++ b/pixi.toml @@ -122,18 +122,18 @@ man = "cargo --quiet run --package rerun-cli --all-features -- man > docs/conten # Compile and run the rerun viewer. # # You can also give an argument for what to view (e.g. an .rrd file). -rerun = "cargo run --package rerun-cli --no-default-features --features native_viewer --" +rerun = "cargo run --package rerun-cli --no-default-features --features native_viewer,video_av1 --" # Compile `rerun-cli` without the web-viewer. -rerun-build = "cargo build --package rerun-cli --no-default-features --features native_viewer" +rerun-build = "cargo build --package rerun-cli --no-default-features --features native_viewer,video_av1" # Compile `rerun-cli` without the web-viewer. -rerun-build-release = "cargo build --package rerun-cli --release --no-default-features --features native_viewer" +rerun-build-release = "cargo build --package rerun-cli --release --no-default-features --features native_viewer,video_av1" # Compile and run the rerun viewer with --release. # # You can also give an argument for what to view (e.g. an .rrd file). -rerun-release = "cargo run --package rerun-cli --no-default-features --features native_viewer --release --" +rerun-release = "cargo run --package rerun-cli --no-default-features --features native_viewer,video_av1 --release --" # Compile and run the web-viewer via rerun-cli. # From c5f93ef5ec834a68e4523c00dab201c2efd834ab Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Thu, 3 Oct 2024 16:31:38 +0200 Subject: [PATCH 16/61] Fix web build --- crates/store/re_video/src/lib.rs | 2 +- crates/viewer/re_renderer/src/video/decoder/mod.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/store/re_video/src/lib.rs b/crates/store/re_video/src/lib.rs index af38ce5ad630..68f35160e9d2 100644 --- a/crates/store/re_video/src/lib.rs +++ b/crates/store/re_video/src/lib.rs @@ -4,7 +4,7 @@ mod decode; mod demux; pub use decode::{Chunk, Frame, PixelFormat}; -pub use demux::{Sample, VideoData, VideoLoadError}; +pub use demux::{Config, Sample, VideoData, VideoLoadError}; pub use re_mp4::{TrackId, TrackKind}; #[cfg(feature = "av1")] diff --git a/crates/viewer/re_renderer/src/video/decoder/mod.rs b/crates/viewer/re_renderer/src/video/decoder/mod.rs index cde42027be50..cca89f431c89 100644 --- a/crates/viewer/re_renderer/src/video/decoder/mod.rs +++ b/crates/viewer/re_renderer/src/video/decoder/mod.rs @@ -36,7 +36,7 @@ pub trait VideoDecoder: 'static + Send { pub fn new_video_decoder( render_context: &RenderContext, data: Arc, - _hw_acceleration: DecodeHardwareAcceleration, + hw_acceleration: DecodeHardwareAcceleration, ) -> Result, DecodingError> { #![allow(unused, clippy::unnecessary_wraps, clippy::needless_pass_by_value)] // only for some feature flags From b53b6ef96182b5608ac44429bdddb444e2a81046 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Thu, 3 Oct 2024 16:34:38 +0200 Subject: [PATCH 17/61] Fix examples (I think) --- crates/store/re_video/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/store/re_video/src/lib.rs b/crates/store/re_video/src/lib.rs index 68f35160e9d2..42ba1727da22 100644 --- a/crates/store/re_video/src/lib.rs +++ b/crates/store/re_video/src/lib.rs @@ -1,7 +1,7 @@ //! Video decoding library. -mod decode; -mod demux; +pub mod decode; +pub mod demux; pub use decode::{Chunk, Frame, PixelFormat}; pub use demux::{Config, Sample, VideoData, VideoLoadError}; From fb5a7df9f51af9f1077f7bc77a5e2a5448691664 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Thu, 3 Oct 2024 17:04:38 +0200 Subject: [PATCH 18/61] Fix re_video example --- crates/store/re_video/examples/frames.rs | 23 ++++++++----------- crates/store/re_video/src/demux/mod.rs | 20 +++++++++++++++- .../src/video/decoder/native_av1.rs | 17 +------------- 3 files changed, 29 insertions(+), 31 deletions(-) diff --git a/crates/store/re_video/examples/frames.rs b/crates/store/re_video/examples/frames.rs index 363bb4eb78b9..620c83aa2870 100644 --- a/crates/store/re_video/examples/frames.rs +++ b/crates/store/re_video/examples/frames.rs @@ -1,3 +1,5 @@ +#![allow(clippy::unwrap_used)] + use indicatif::ProgressBar; use parking_lot::Mutex; use re_video::demux::mp4::load_mp4; @@ -13,12 +15,9 @@ use std::time::Instant; fn main() { // frames let args: Vec<_> = std::env::args().collect(); - let video_path = match args.get(1) { - Some(path) => path, - None => { - println!("Usage: frames "); - return; - } + let Some(video_path) = args.get(1) else { + println!("Usage: frames "); + return; }; let output_dir = PathBuf::new().join(Path::new(video_path).with_extension("")); @@ -49,12 +48,7 @@ fn main() { let start = Instant::now(); for sample in &video.samples { - let data = video.get(sample).to_owned(); - decoder.decode(re_video::decode::Chunk { - data, - timestamp: sample.timestamp, - duration: sample.duration, - }); + decoder.decode(video.get(sample).unwrap()); } drop(decoder); @@ -77,7 +71,8 @@ fn main() { let mut file = OpenOptions::new() .write(true) .create(true) - .open(output_dir.join(format!("{:0width$}.ppm", i, width = width))) + .truncate(true) + .open(output_dir.join(format!("{i:0width$}.ppm"))) .expect("failed to open file"); write_binary_ppm(&mut file, frame.width, frame.height, &frame.data); } @@ -88,7 +83,7 @@ fn num_digits(n: usize) -> usize { } fn write_binary_ppm(file: &mut File, width: u32, height: u32, rgba: &[u8]) { - let header = format!("P6\n{} {}\n255\n", width, height); + let header = format!("P6\n{width} {height}\n255\n"); let mut data = Vec::with_capacity(header.len() + width as usize * height as usize * 3); data.extend_from_slice(header.as_bytes()); diff --git a/crates/store/re_video/src/demux/mod.rs b/crates/store/re_video/src/demux/mod.rs index d5b39e6135e0..b240f2f80222 100644 --- a/crates/store/re_video/src/demux/mod.rs +++ b/crates/store/re_video/src/demux/mod.rs @@ -13,7 +13,7 @@ use itertools::Itertools as _; use super::{Time, Timescale}; -use crate::{TrackId, TrackKind}; +use crate::{Chunk, TrackId, TrackKind}; /// Decoded video data. #[derive(Clone)] @@ -130,6 +130,24 @@ impl VideoData { .sorted() }) } + + /// Returns `None` if the sample is invalid/out-of-range. + pub fn get(&self, sample: &Sample) -> Option { + let byte_offset = sample.byte_offset as usize; + let byte_length = sample.byte_length as usize; + + if self.data.len() < byte_offset + byte_length { + None + } else { + let data = &self.data[byte_offset..byte_offset + byte_length]; + + Some(Chunk { + data: data.to_vec(), + timestamp: sample.decode_timestamp, + duration: sample.duration, + }) + } + } } /// A segment of a video. diff --git a/crates/viewer/re_renderer/src/video/decoder/native_av1.rs b/crates/viewer/re_renderer/src/video/decoder/native_av1.rs index 348330011e60..d59245ecdfae 100644 --- a/crates/viewer/re_renderer/src/video/decoder/native_av1.rs +++ b/crates/viewer/re_renderer/src/video/decoder/native_av1.rs @@ -224,23 +224,8 @@ impl Av1VideoDecoder { /// Enqueue the given sample. fn enqueue_sample(&self, sample: &re_video::Sample, is_key: bool) -> Result<(), DecodingError> { - let byte_offset = sample.byte_offset as usize; - let byte_length = sample.byte_length as usize; - - if self.data.data.len() < byte_offset + byte_length { - return Err(DecodingError::BadData); - } - - let data = &self.data.data[byte_offset..byte_offset + byte_length]; - - let chunk = re_video::Chunk { - data: data.to_vec(), - timestamp: sample.decode_timestamp, - duration: sample.duration, - }; - + let chunk = self.data.get(sample).ok_or(DecodingError::BadData)?; self.decoder.decode(chunk); - Ok(()) } From ec5384aa7a70191f77bbdbd0a85087b6a7247f52 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 4 Oct 2024 03:22:07 +0200 Subject: [PATCH 19/61] Switch to https://github.com/rerun-io/rav1d --- Cargo.lock | 17 ++++------------- crates/store/re_video/Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2e1e1d40c240..4de86a7f615c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1711,17 +1711,6 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" -[[package]] -name = "dav1d" -version = "0.10.3" -source = "git+https://github.com/rerun-io/rav1d-rs#ffb30df91a4fcf0af4e6cf44a9a373265aba02c1" -dependencies = [ - "av-data", - "bitflags 2.6.0", - "rav1d", - "static_assertions", -] - [[package]] name = "deranged" version = "0.3.11" @@ -4735,10 +4724,11 @@ dependencies = [ [[package]] name = "rav1d" version = "1.0.0" -source = "git+https://github.com/rerun-io/rav1d-rs#ffb30df91a4fcf0af4e6cf44a9a373265aba02c1" +source = "git+https://github.com/rerun-io/rav1d?branch=emilk/dav1d-interface#c653a54999db41919d9992c67ed46f8f2393e934" dependencies = [ "assert_matches", "atomig", + "av-data", "bitflags 2.6.0", "cc", "cfg-if", @@ -4747,6 +4737,7 @@ dependencies = [ "parking_lot", "paste", "raw-cpuid", + "static_assertions", "strum", "to_method", "zerocopy", @@ -5952,11 +5943,11 @@ name = "re_video" version = "0.19.0-alpha.1+dev" dependencies = [ "crossbeam", - "dav1d", "indicatif", "itertools 0.13.0", "ordered-float", "parking_lot", + "rav1d", "re_log", "re_mp4", "re_tracing", diff --git a/crates/store/re_video/Cargo.toml b/crates/store/re_video/Cargo.toml index d5539678f237..36ac10d5df9c 100644 --- a/crates/store/re_video/Cargo.toml +++ b/crates/store/re_video/Cargo.toml @@ -44,7 +44,7 @@ thiserror.workspace = true # Native dependencies: [target.'cfg(not(target_arch = "wasm32"))'.dependencies] # If this package fails to build, install `nasm` locally, or build through `pixi`. -dav1d = { git = "https://github.com/rerun-io/rav1d-rs", optional = true } # TODO: clean up this fork. https://github.com/rerun-io/rerun/issues/7575 +dav1d = { git = "https://github.com/rerun-io/rav1d", branch = "emilk/dav1d-interface", package = "rav1d", optional = true } # TODO: publish this fork [dev-dependencies] indicatif.workspace = true From 9b19f3c15ce257611dd1dd1eb7d7f579e9b310fa Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 4 Oct 2024 03:39:57 +0200 Subject: [PATCH 20/61] Update rav1d and use it under its own name --- Cargo.lock | 2 +- crates/store/re_video/Cargo.toml | 4 ++-- crates/store/re_video/src/decode/av1.rs | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4de86a7f615c..8a512088757f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4724,7 +4724,7 @@ dependencies = [ [[package]] name = "rav1d" version = "1.0.0" -source = "git+https://github.com/rerun-io/rav1d?branch=emilk/dav1d-interface#c653a54999db41919d9992c67ed46f8f2393e934" +source = "git+https://github.com/rerun-io/rav1d?branch=emilk/dav1d-interface#6f12e3fe8eada6e362306ec853c8147a74d7475b" dependencies = [ "assert_matches", "atomig", diff --git a/crates/store/re_video/Cargo.toml b/crates/store/re_video/Cargo.toml index 36ac10d5df9c..362526154651 100644 --- a/crates/store/re_video/Cargo.toml +++ b/crates/store/re_video/Cargo.toml @@ -28,7 +28,7 @@ default = [] ## Opt-in to native AV1 decoding. ## You need to install [nasm](https://nasm.us/) to compile with this feature. -av1 = ["dep:dav1d"] +av1 = ["dep:rav1d"] [dependencies] re_log.workspace = true @@ -44,7 +44,7 @@ thiserror.workspace = true # Native dependencies: [target.'cfg(not(target_arch = "wasm32"))'.dependencies] # If this package fails to build, install `nasm` locally, or build through `pixi`. -dav1d = { git = "https://github.com/rerun-io/rav1d", branch = "emilk/dav1d-interface", package = "rav1d", optional = true } # TODO: publish this fork +rav1d = { git = "https://github.com/rerun-io/rav1d", branch = "emilk/dav1d-interface", optional = true } # TODO: publish this fork [dev-dependencies] indicatif.workspace = true diff --git a/crates/store/re_video/src/decode/av1.rs b/crates/store/re_video/src/decode/av1.rs index 067262e62e57..a994c7143f12 100644 --- a/crates/store/re_video/src/decode/av1.rs +++ b/crates/store/re_video/src/decode/av1.rs @@ -8,6 +8,7 @@ use crossbeam::{ sync::{Parker, Unparker}, }; use dav1d::{PixelLayout, PlanarImageComponent}; +use rav1d::dav1d; use crate::Time; From c5c9c1687b52b55e1dfb97f24f551861e177eb69 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 4 Oct 2024 03:56:55 +0200 Subject: [PATCH 21/61] refactor some code --- crates/store/re_video/src/decode/av1.rs | 69 +++++++++++++------------ 1 file changed, 37 insertions(+), 32 deletions(-) diff --git a/crates/store/re_video/src/decode/av1.rs b/crates/store/re_video/src/decode/av1.rs index a994c7143f12..f22ff8273412 100644 --- a/crates/store/re_video/src/decode/av1.rs +++ b/crates/store/re_video/src/decode/av1.rs @@ -23,6 +23,7 @@ pub struct Decoder { impl Decoder { pub fn new(on_output: impl Fn(Frame) + Send + Sync + 'static) -> Self { + re_tracing::profile_function!(); let (command_tx, command_rx) = unbounded(); let (reset_tx, reset_rx) = bounded(1); let parker = Parker::new(); @@ -46,6 +47,7 @@ impl Decoder { /// Submits a single frame for decoding. pub fn decode(&self, chunk: Chunk) { + re_tracing::profile_function!(); self.command_tx.send(Command::Chunk(chunk)).ok(); self.unparker.unpark(); } @@ -88,18 +90,23 @@ enum Command { type OutputCallback = dyn Fn(Frame) + Send + Sync; +fn create_decoder() -> Result { + re_tracing::profile_function!(); + + let mut settings = dav1d::Settings::new(); + settings.set_strict_std_compliance(false); + settings.set_max_frame_delay(1); + + dav1d::Decoder::with_settings(&settings) +} + fn decoder_thread( command_rx: &Receiver, reset_rx: &Receiver<()>, parker: &Parker, on_output: &OutputCallback, ) { - let mut settings = dav1d::Settings::new(); - settings.set_strict_std_compliance(false); - settings.set_max_frame_delay(1); - - let mut decoder = - dav1d::Decoder::with_settings(&settings).expect("failed to initialize dav1d::Decoder"); + let mut decoder = create_decoder().expect("failed to initialize dav1d::Decoder"); // TODO: error handling loop { select! { @@ -216,7 +223,7 @@ fn submit_chunk(decoder: &mut dav1d::Decoder, chunk: Chunk) { fn drain_decoded_frames(decoder: &mut dav1d::Decoder) { while let Ok(picture) = decoder.get_picture() { - let _ = picture; + _ = picture; } } @@ -224,25 +231,7 @@ fn output_frames(decoder: &mut dav1d::Decoder, on_output: &OutputCallback) { loop { match decoder.get_picture() { Ok(picture) => { - let data = match picture.pixel_layout() { - PixelLayout::I400 => i400_to_rgba(&picture), - PixelLayout::I420 => i420_to_rgba(&picture), - PixelLayout::I422 => i422_to_rgba(&picture), - PixelLayout::I444 => i444_to_rgba(&picture), - }; - let width = picture.width(); - let height = picture.height(); - let timestamp = i64_to_time(picture.timestamp().unwrap_or(0)); - let duration = i64_to_time(picture.duration()); - - on_output(Frame { - data, - width, - height, - format: PixelFormat::Rgba8Unorm, - timestamp, - duration, - }); + output_picture(picture, on_output); } Err(err) if err.is_again() => { // Not enough data yet @@ -255,12 +244,28 @@ fn output_frames(decoder: &mut dav1d::Decoder, on_output: &OutputCallback) { } } -// TODO(jan): support other parameters? -// What do these even do: -// - matrix_coefficients -// - color_range -// - color_primaries -// - transfer_characteristics +fn output_picture(picture: rav1d::Picture, on_output: &(dyn Fn(Frame) + Send + Sync)) { + // TODO(jan): support other parameters? + // What do these even do: + // - matrix_coefficients + // - color_range + // - color_primaries + // - transfer_characteristics + + on_output(Frame { + data: match picture.pixel_layout() { + PixelLayout::I400 => i400_to_rgba(&picture), + PixelLayout::I420 => i420_to_rgba(&picture), + PixelLayout::I422 => i422_to_rgba(&picture), + PixelLayout::I444 => i444_to_rgba(&picture), + }, + width: picture.width(), + height: picture.height(), + format: PixelFormat::Rgba8Unorm, + timestamp: i64_to_time(picture.timestamp().unwrap_or(0)), + duration: i64_to_time(picture.duration()), + }); +} fn rgba_from_yuv(y: u8, u: u8, v: u8) -> [u8; 4] { let (y, u, v) = (f32::from(y), f32::from(u), f32::from(v)); From 7d6f4cbed3ddedac2900d6cc0fbd588931ed90b3 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 4 Oct 2024 04:08:47 +0200 Subject: [PATCH 22/61] Start adding error handling --- crates/store/re_video/src/decode/av1.rs | 49 ++++++++++++++----- .../src/video/decoder/native_av1.rs | 13 +++-- 2 files changed, 46 insertions(+), 16 deletions(-) diff --git a/crates/store/re_video/src/decode/av1.rs b/crates/store/re_video/src/decode/av1.rs index f22ff8273412..cc3fcb6c0e8f 100644 --- a/crates/store/re_video/src/decode/av1.rs +++ b/crates/store/re_video/src/decode/av1.rs @@ -14,15 +14,33 @@ use crate::Time; use super::{Chunk, Frame, PixelFormat}; +#[derive(thiserror::Error, Debug)] +pub enum Error { + /// An error occrurred during initialization of the decoder. + /// + /// No further output will come. + #[error("Error initializing decoder: {0}")] + Initialization(dav1d::Error), + + #[error("Decoding error: {0}")] + Dav1d(dav1d::Error), +} + +pub type Result = std::result::Result; + pub struct Decoder { _thread: std::thread::JoinHandle<()>, unparker: Unparker, + + /// Normal command stream command_tx: Sender, + + /// Fast-track to reset and ignore all command in the normal command stream. reset_tx: Sender<()>, } impl Decoder { - pub fn new(on_output: impl Fn(Frame) + Send + Sync + 'static) -> Self { + pub fn new(on_output: impl Fn(Result) + Send + Sync + 'static) -> Self { re_tracing::profile_function!(); let (command_tx, command_rx) = unbounded(); let (reset_tx, reset_rx) = bounded(1); @@ -88,7 +106,7 @@ enum Command { Reset(Sender<()>), } -type OutputCallback = dyn Fn(Frame) + Send + Sync; +type OutputCallback = dyn Fn(Result) + Send + Sync; fn create_decoder() -> Result { re_tracing::profile_function!(); @@ -106,7 +124,13 @@ fn decoder_thread( parker: &Parker, on_output: &OutputCallback, ) { - let mut decoder = create_decoder().expect("failed to initialize dav1d::Decoder"); // TODO: error handling + let mut decoder = match create_decoder() { + Err(err) => { + on_output(Err(Error::Initialization(err))); + return; + } + Ok(decoder) => decoder, + }; loop { select! { @@ -150,7 +174,7 @@ fn decoder_thread( recv(command_rx) -> command => { match command { Ok(Command::Chunk(chunk)) => { - submit_chunk(&mut decoder, chunk); + submit_chunk(&mut decoder, chunk, on_output); output_frames(&mut decoder, on_output); continue; } @@ -189,7 +213,7 @@ fn decoder_thread( } } -fn submit_chunk(decoder: &mut dav1d::Decoder, chunk: Chunk) { +fn submit_chunk(decoder: &mut dav1d::Decoder, chunk: Chunk, on_output: &OutputCallback) { re_tracing::profile_function!(); re_log::debug!("submit_chunk {:?}", chunk.timestamp); @@ -201,8 +225,7 @@ fn submit_chunk(decoder: &mut dav1d::Decoder, chunk: Chunk) { Ok(()) => {} Err(err) if err.is_again() => {} Err(err) => { - // Something went wrong - panic!("Failed to decode frame: {err}"); // TODO: handle errors + on_output(Err(Error::Dav1d(err))); } } @@ -215,8 +238,7 @@ fn submit_chunk(decoder: &mut dav1d::Decoder, chunk: Chunk) { Ok(()) => {} Err(err) if err.is_again() => {} Err(err) => { - // Something went wrong - panic!("Failed to decode frame: {err}"); // TODO: handle errors + on_output(Err(Error::Dav1d(err))); } }; } @@ -238,13 +260,13 @@ fn output_frames(decoder: &mut dav1d::Decoder, on_output: &OutputCallback) { break; } Err(err) => { - panic!("Failed to decode frame: {err}"); // TODO: handle errors + on_output(Err(Error::Dav1d(err))); } } } } -fn output_picture(picture: rav1d::Picture, on_output: &(dyn Fn(Frame) + Send + Sync)) { +fn output_picture(picture: rav1d::Picture, on_output: &(dyn Fn(Result) + Send + Sync)) { // TODO(jan): support other parameters? // What do these even do: // - matrix_coefficients @@ -252,7 +274,7 @@ fn output_picture(picture: rav1d::Picture, on_output: &(dyn Fn(Frame) + Send + S // - color_primaries // - transfer_characteristics - on_output(Frame { + let frame = Frame { data: match picture.pixel_layout() { PixelLayout::I400 => i400_to_rgba(&picture), PixelLayout::I420 => i420_to_rgba(&picture), @@ -264,7 +286,8 @@ fn output_picture(picture: rav1d::Picture, on_output: &(dyn Fn(Frame) + Send + S format: PixelFormat::Rgba8Unorm, timestamp: i64_to_time(picture.timestamp().unwrap_or(0)), duration: i64_to_time(picture.duration()), - }); + }; + on_output(Ok(frame)); } fn rgba_from_yuv(y: u8, u: u8, v: u8) -> [u8; 4] { diff --git a/crates/viewer/re_renderer/src/video/decoder/native_av1.rs b/crates/viewer/re_renderer/src/video/decoder/native_av1.rs index d59245ecdfae..575446a7cfc9 100644 --- a/crates/viewer/re_renderer/src/video/decoder/native_av1.rs +++ b/crates/viewer/re_renderer/src/video/decoder/native_av1.rs @@ -156,9 +156,16 @@ impl Av1VideoDecoder { // TEMP: assuming `av1`, because `re_video` demuxer will panic if it's not let decoder = re_video::av1::Decoder::new({ let frames = frames.clone(); - move |frame: re_video::Frame| { - re_log::debug!("Decoded frame at {:?}", frame.timestamp); - frames.lock().push(frame); + move |frame: re_video::av1::Result| match frame { + Ok(frame) => { + re_log::debug!("Decoded frame at {:?}", frame.timestamp); + frames.lock().push(frame); + } + Err(err) => { + re_log::warn_once!("Failed to decode video: {err}"); + // TODO: store error and show user + // TODO: reset + } } }); From 6d71d63ced4fda9d7a7026610202a5799b063360 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 4 Oct 2024 04:16:52 +0200 Subject: [PATCH 23/61] Do not block on reset --- Cargo.toml | 2 ++ crates/store/re_video/src/decode/av1.rs | 25 +++++++++++++++---------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 5ca8ba385b96..ba79ae074a15 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -310,6 +310,8 @@ zip = { version = "0.6", default-features = false } opt-level = 1 # Make debug builds run faster [profile.dev.package.re_video] opt-level = 2 # Speed up CPU-side chroma-upsampling (TODO(#7298): move to GPU) +[profile.dev.package.rav1d] +opt-level = 2 # Speed up AV1 video decoding. TODO: doesn't work? [profile.dev.package.wgpu] opt-level = 2 # Speed up copying video textures diff --git a/crates/store/re_video/src/decode/av1.rs b/crates/store/re_video/src/decode/av1.rs index cc3fcb6c0e8f..cf8dd9b9bee7 100644 --- a/crates/store/re_video/src/decode/av1.rs +++ b/crates/store/re_video/src/decode/av1.rs @@ -80,7 +80,7 @@ impl Decoder { self.command_tx.send(Command::Reset(tx)).ok(); self.reset_tx.send(()).ok(); self.unparker.unpark(); - rx.recv().ok(); + _ = rx; // Do not block } /// Blocks until all pending frames have been decoded. @@ -96,6 +96,7 @@ impl Decoder { impl Drop for Decoder { fn drop(&mut self) { + re_tracing::profile_function!(); self.flush(); } } @@ -217,18 +218,22 @@ fn submit_chunk(decoder: &mut dav1d::Decoder, chunk: Chunk, on_output: &OutputCa re_tracing::profile_function!(); re_log::debug!("submit_chunk {:?}", chunk.timestamp); - // always attempt to send pending data first - // this does nothing if there is no pending data, - // and is required if a call to `send_data` previously - // returned `EAGAIN` - match decoder.send_pending_data() { - Ok(()) => {} - Err(err) if err.is_again() => {} - Err(err) => { - on_output(Err(Error::Dav1d(err))); + { + re_tracing::profile_scope!("send_pending_data"); + // always attempt to send pending data first + // this does nothing if there is no pending data, + // and is required if a call to `send_data` previously + // returned `EAGAIN` + match decoder.send_pending_data() { + Ok(()) => {} + Err(err) if err.is_again() => {} + Err(err) => { + on_output(Err(Error::Dav1d(err))); + } } } + re_tracing::profile_scope!("send_data"); match decoder.send_data( chunk.data, None, From ca2964a01b345759e1c099e6bea8e4b5a9261d84 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 4 Oct 2024 07:54:18 +0200 Subject: [PATCH 24/61] Proper error reporting and handling --- crates/store/re_video/src/decode/av1.rs | 5 +- crates/viewer/re_renderer/Cargo.toml | 2 +- .../src/allocator/cpu_write_gpu_read_belt.rs | 4 +- .../re_renderer/src/video/decoder/mod.rs | 6 +- .../src/video/decoder/native_av1.rs | 199 ++++++++++++------ .../re_renderer/src/video/decoder/web.rs | 12 +- crates/viewer/re_renderer/src/video/mod.rs | 3 +- 7 files changed, 153 insertions(+), 78 deletions(-) diff --git a/crates/store/re_video/src/decode/av1.rs b/crates/store/re_video/src/decode/av1.rs index cf8dd9b9bee7..00bcfe2ab0da 100644 --- a/crates/store/re_video/src/decode/av1.rs +++ b/crates/store/re_video/src/decode/av1.rs @@ -97,7 +97,9 @@ impl Decoder { impl Drop for Decoder { fn drop(&mut self) { re_tracing::profile_function!(); - self.flush(); + // TODO: maybe set a "close asap" flag instead? + self.reset(); // ignore enqueued commands + self.flush(); // wait for thread to stop } } @@ -216,7 +218,6 @@ fn decoder_thread( fn submit_chunk(decoder: &mut dav1d::Decoder, chunk: Chunk, on_output: &OutputCallback) { re_tracing::profile_function!(); - re_log::debug!("submit_chunk {:?}", chunk.timestamp); { re_tracing::profile_scope!("send_pending_data"); diff --git a/crates/viewer/re_renderer/Cargo.toml b/crates/viewer/re_renderer/Cargo.toml index 267592f2437d..3267d4f67e91 100644 --- a/crates/viewer/re_renderer/Cargo.toml +++ b/crates/viewer/re_renderer/Cargo.toml @@ -81,6 +81,7 @@ smallvec.workspace = true static_assertions.workspace = true thiserror.workspace = true type-map.workspace = true +web-time.workspace = true wgpu.workspace = true wgpu-core.workspace = true # Needed for error handling when wgpu-core implemented backend is used. wgpu-types.workspace = true @@ -104,7 +105,6 @@ getrandom = { workspace = true, features = [ ] } # getrandom needs the `js` feature to be enabled. It is dragged in indirectly. js-sys.workspace = true wasm-bindgen-futures.workspace = true -web-time.workspace = true web-sys = { workspace = true, features = [ "DomException", "EncodedVideoChunk", diff --git a/crates/viewer/re_renderer/src/allocator/cpu_write_gpu_read_belt.rs b/crates/viewer/re_renderer/src/allocator/cpu_write_gpu_read_belt.rs index 5c8e73118f2a..4652705d9b95 100644 --- a/crates/viewer/re_renderer/src/allocator/cpu_write_gpu_read_belt.rs +++ b/crates/viewer/re_renderer/src/allocator/cpu_write_gpu_read_belt.rs @@ -133,8 +133,8 @@ where // Mimalloc can't align types larger than 64 bytes now and will silently ignore it. // https://github.com/purpleprotocol/mimalloc_rust/issues/128 // Therefore, large alignments won't work with collect. - let pretend_mimalloc_aligns_correctly = false; - if std::mem::align_of::() <= 64 || pretend_mimalloc_aligns_correctly { + let pretend_mimalloc_aligns_correctly = false; // TODO(#5875): update mimalloc + if std::mem::align_of::() <= 32 || pretend_mimalloc_aligns_correctly { let vec: Vec = elements.collect(); #[allow(clippy::dbg_macro)] diff --git a/crates/viewer/re_renderer/src/video/decoder/mod.rs b/crates/viewer/re_renderer/src/video/decoder/mod.rs index cca89f431c89..be55d1f1e4e1 100644 --- a/crates/viewer/re_renderer/src/video/decoder/mod.rs +++ b/crates/viewer/re_renderer/src/video/decoder/mod.rs @@ -14,10 +14,14 @@ use crate::{ RenderContext, }; -use std::sync::Arc; +use std::{sync::Arc, time::Duration}; use super::{DecodeHardwareAcceleration, DecodingError, FrameDecodingResult}; +/// Delaying error reports (and showing last-good images meanwhile) allows us to skip over +/// transient errors without flickering. +pub const DECODING_ERROR_REPORTING_DELAY: Duration = Duration::from_millis(400); + /// Decode video to a texture. /// /// If you want to sample multiple points in a video simultaneously, use multiple decoders. diff --git a/crates/viewer/re_renderer/src/video/decoder/native_av1.rs b/crates/viewer/re_renderer/src/video/decoder/native_av1.rs index 575446a7cfc9..dd39ea2ba517 100644 --- a/crates/viewer/re_renderer/src/video/decoder/native_av1.rs +++ b/crates/viewer/re_renderer/src/video/decoder/native_av1.rs @@ -14,10 +14,35 @@ use crate::{ #[allow(unused_imports)] use super::latest_at_idx; -use parking_lot::Mutex; use re_video::{Frame, Time}; -use super::{alloc_video_frame_texture, VideoDecoder}; +use parking_lot::Mutex; +use web_time::Instant; + +use super::{alloc_video_frame_texture, VideoDecoder, DECODING_ERROR_REPORTING_DELAY}; + +struct DecoderOutput { + frames: Vec, + + last_decoding_error: Option, + + /// Whether we reset the decoder since the last time an error was reported. + reset_since_last_reported_error: bool, + + /// Time at which point `last_decoding_error` changed from `None` to `Some`. + time_when_entering_error_state: Instant, +} + +impl Default for DecoderOutput { + fn default() -> Self { + Self { + frames: Vec::new(), + last_decoding_error: None, + reset_since_last_reported_error: false, + time_when_entering_error_state: Instant::now(), + } + } +} /// Native AV1 decoder pub struct Av1VideoDecoder { @@ -27,12 +52,75 @@ pub struct Av1VideoDecoder { zeroed_texture: GpuTexture2D, decoder: re_video::av1::Decoder, - frames: Arc>>, + decoder_output: Arc>, + last_used_frame_timestamp: Time, current_segment_idx: usize, current_sample_idx: usize, } +impl Av1VideoDecoder { + pub fn new( + render_context: &RenderContext, + data: Arc, + ) -> Result { + re_tracing::profile_function!(); + + re_log::debug!("Initializing native video decoder…"); + let decoder_output = Arc::new(Mutex::new(DecoderOutput::default())); + + // TODO: check that data is av1, and return error elsewise + // TEMP: assuming `av1`, because `re_video` demuxer will panic if it's not + let decoder = re_video::av1::Decoder::new({ + let decoder_output = decoder_output.clone(); + move |frame: re_video::av1::Result| match frame { + Ok(frame) => { + re_log::trace!("Decoded frame at {:?}", frame.timestamp); + let mut output = decoder_output.lock(); + output.frames.push(frame); + // We successfully decoded a frame, reset the error state. + output.last_decoding_error = None; + } + Err(err) => { + let mut output = decoder_output.lock(); + if output.last_decoding_error.is_none() { + output.time_when_entering_error_state = Instant::now(); + } + output.last_decoding_error = Some(DecodingError::Decoding(err.to_string())); + output.reset_since_last_reported_error = false; + } + } + }); + + let queue = render_context.queue.clone(); + + let texture = super::alloc_video_frame_texture( + &render_context.device, + &render_context.gpu_resources.textures, + data.config.coded_width as u32, + data.config.coded_height as u32, + ); + let zeroed_texture = alloc_video_frame_texture( + &render_context.device, + &render_context.gpu_resources.textures, + data.config.coded_width as u32, + data.config.coded_height as u32, + ); + + Ok(Self { + data, + queue, + texture, + zeroed_texture, + decoder, + decoder_output, + last_used_frame_timestamp: Time::MAX, + current_segment_idx: usize::MAX, + current_sample_idx: usize::MAX, + }) + } +} + impl VideoDecoder for Av1VideoDecoder { fn frame_at( &mut self, @@ -62,7 +150,24 @@ impl VideoDecoder for Av1VideoDecoder { return Err(DecodingError::EmptyVideo); }; - // Enqueue segments as needed. We maintain a buffer of 2 segments, so we can + // Enqueue segments as needed. + // + // First, check for decoding errors that may have been set asynchronously and reset if it's a new error. + { + let decoder_output = self.decoder_output.lock(); + if decoder_output.last_decoding_error.is_some() + && !decoder_output.reset_since_last_reported_error + { + // For each new (!) error after entering the error state, we reset the decoder. + // This way, it might later recover from the error as we progress in the video. + // + // By resetting the current segment/sample indices, the frame enqueued code below + // is forced to reset the decoder. + self.current_segment_idx = usize::MAX; + self.current_sample_idx = usize::MAX; + } + }; + // We maintain a buffer of 2 segments, so we can // always smoothly transition to the next segment. // We can always start decoding from any segment, because segments always begin // with a keyframe. @@ -97,10 +202,11 @@ impl VideoDecoder for Av1VideoDecoder { self.current_segment_idx = requested_segment_idx; self.current_sample_idx = requested_sample_idx; - let mut frames = self.frames.lock(); + let mut decoder_output = self.decoder_output.lock(); + let frames = &mut decoder_output.frames; if !frames.is_empty() { - re_log::debug_once!( + re_log::trace_once!( "Looking for frame timestamp {presentation_timestamp:?} among frames {:?} - {:?}", frames.first().unwrap().timestamp, frames.last().unwrap().timestamp @@ -112,6 +218,23 @@ impl VideoDecoder for Av1VideoDecoder { else { // No buffered frames - texture will be blank. + // Might this be due to an error? + // + // We only care about decoding errors when we don't find the requested frame, + // since we want to keep playing the video fine even if parts of it are broken. + // That said, practically we reset the decoder and thus all frames upon error, + // so it doesn't make a lot of difference. + if let Some(last_decoding_error) = &decoder_output.last_decoding_error { + if decoder_output.time_when_entering_error_state.elapsed() + >= DECODING_ERROR_REPORTING_DELAY + { + // Report the error only if we have been in an error state for a certain amount of time. + // Don't immediately report the error, since we might immediately recover from it. + // Otherwise, this would cause aggressive flickering! + return Err(last_decoding_error.clone()); + } + } + // Don't return a zeroed texture, because we may just be behind on decoding // and showing an old frame is better than showing a blank frame, // because it causes "black flashes" to appear @@ -143,61 +266,6 @@ impl VideoDecoder for Av1VideoDecoder { } impl Av1VideoDecoder { - pub fn new( - render_context: &RenderContext, - data: Arc, - ) -> Result { - re_tracing::profile_function!(); - - re_log::debug!("Initializing native video decoder…"); - let frames = Arc::new(Mutex::new(Vec::new())); - - // TODO: check that data is av1, and return error elsewise - // TEMP: assuming `av1`, because `re_video` demuxer will panic if it's not - let decoder = re_video::av1::Decoder::new({ - let frames = frames.clone(); - move |frame: re_video::av1::Result| match frame { - Ok(frame) => { - re_log::debug!("Decoded frame at {:?}", frame.timestamp); - frames.lock().push(frame); - } - Err(err) => { - re_log::warn_once!("Failed to decode video: {err}"); - // TODO: store error and show user - // TODO: reset - } - } - }); - - let queue = render_context.queue.clone(); - - let texture = super::alloc_video_frame_texture( - &render_context.device, - &render_context.gpu_resources.textures, - data.config.coded_width as u32, - data.config.coded_height as u32, - ); - let zeroed_texture = alloc_video_frame_texture( - &render_context.device, - &render_context.gpu_resources.textures, - data.config.coded_width as u32, - data.config.coded_height as u32, - ); - - Ok(Self { - data, - queue, - texture, - zeroed_texture, - decoder, - - frames, - last_used_frame_timestamp: Time::MAX, - current_segment_idx: usize::MAX, - current_sample_idx: usize::MAX, - }) - } - pub fn duration_ms(&self) -> f64 { self.data.duration_sec() } @@ -238,10 +306,15 @@ impl Av1VideoDecoder { /// Reset the video decoder and discard all frames. fn reset(&mut self) { + re_log::debug!("Resetting AV1 decoder"); self.decoder.reset(); - let mut frames = self.frames.lock(); - drop(frames.drain(..)); + let mut decoder_output = self.decoder_output.lock(); + decoder_output.reset_since_last_reported_error = true; + decoder_output.frames.clear(); + + self.current_segment_idx = usize::MAX; + self.current_sample_idx = usize::MAX; } } diff --git a/crates/viewer/re_renderer/src/video/decoder/web.rs b/crates/viewer/re_renderer/src/video/decoder/web.rs index 33fdd92edd32..ca85bea8131d 100644 --- a/crates/viewer/re_renderer/src/video/decoder/web.rs +++ b/crates/viewer/re_renderer/src/video/decoder/web.rs @@ -16,7 +16,7 @@ use crate::{ DebugLabel, RenderContext, }; -use super::{latest_at_idx, VideoDecoder}; +use super::{latest_at_idx, VideoDecoder, DECODING_ERROR_REPORTING_DELAY}; #[derive(Clone)] #[repr(transparent)] @@ -58,10 +58,6 @@ struct DecoderOutput { time_when_entering_error_state: Instant, } -/// Delaying error reports (and showing last-good images meanwhile) allows us to skip over -/// transient errors without flickering. -const DECODING_ERROR_REPORTING_DELAY: Duration = Duration::from_millis(400); - pub struct WebVideoDecoder { data: Arc, queue: Arc, @@ -325,14 +321,14 @@ impl WebVideoDecoder { // since we want to keep playing the video fine even if parts of it are broken. // That said, practically we reset the decoder and thus all frames upon error, // so it doesn't make a lot of difference. - if let Some(last_decoding_error) = decoder_output.last_decoding_error.clone() { + if let Some(last_decoding_error) = &decoder_output.last_decoding_error { if decoder_output.time_when_entering_error_state.elapsed() >= DECODING_ERROR_REPORTING_DELAY { // Report the error only if we have been in an error state for a certain amount of time. // Don't immediately report the error, since we might immediately recover from it. // Otherwise, this would cause aggressive flickering! - return Err(last_decoding_error); + return Err(last_decoding_error.clone()); } } @@ -457,7 +453,7 @@ impl WebVideoDecoder { { let mut decoder_output = self.decoder_output.lock(); decoder_output.reset_since_last_reported_error = true; - drop(decoder_output.frames.drain(..)); + decoder_output.frames.clear(); } self.current_segment_idx = usize::MAX; diff --git a/crates/viewer/re_renderer/src/video/mod.rs b/crates/viewer/re_renderer/src/video/mod.rs index 73b7221d25ca..492dd28162a8 100644 --- a/crates/viewer/re_renderer/src/video/mod.rs +++ b/crates/viewer/re_renderer/src/video/mod.rs @@ -1,8 +1,9 @@ mod decoder; +use std::{collections::hash_map::Entry, sync::Arc}; + use ahash::HashMap; use parking_lot::Mutex; -use std::{collections::hash_map::Entry, sync::Arc}; use re_video::VideoLoadError; From 6a69b3d93369b7cca71dd084e2f9848ec8863187 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 4 Oct 2024 08:07:39 +0200 Subject: [PATCH 25/61] use i64 for Time --- crates/store/re_video/src/demux/mp4.rs | 8 ++++---- crates/store/re_video/src/lib.rs | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/crates/store/re_video/src/demux/mp4.rs b/crates/store/re_video/src/demux/mp4.rs index ab91d87e47a8..3361a2e70419 100644 --- a/crates/store/re_video/src/demux/mp4.rs +++ b/crates/store/re_video/src/demux/mp4.rs @@ -33,7 +33,7 @@ pub fn load_mp4(bytes: &[u8]) -> Result { }; let timescale = Timescale::new(track.timescale); - let duration = Time::new(track.duration); + let duration = Time::new(track.duration as i64); let mut samples = Vec::::new(); let mut segments = Vec::::new(); let mut segment_sample_start_index = 0; @@ -50,9 +50,9 @@ pub fn load_mp4(bytes: &[u8]) -> Result { segment_sample_start_index = samples.len(); } - let decode_timestamp = Time::new(sample.decode_timestamp); - let composition_timestamp = Time::new(sample.composition_timestamp); - let duration = Time::new(sample.duration); + let decode_timestamp = Time::new(sample.decode_timestamp as i64); + let composition_timestamp = Time::new(sample.composition_timestamp as i64); + let duration = Time::new(sample.duration as i64); let byte_offset = sample.offset as u32; let byte_length = sample.size as u32; diff --git a/crates/store/re_video/src/lib.rs b/crates/store/re_video/src/lib.rs index 42ba1727da22..aaf89b68eae9 100644 --- a/crates/store/re_video/src/lib.rs +++ b/crates/store/re_video/src/lib.rs @@ -29,11 +29,11 @@ impl TimeMs { /// A value in time units. #[derive(Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub struct Time(u64); // TODO: i64 +pub struct Time(i64); impl Time { pub const ZERO: Self = Self(0); - pub const MAX: Self = Self(u64::MAX); + pub const MAX: Self = Self(i64::MAX); /// Create a new value in _time units_. /// @@ -42,13 +42,13 @@ impl Time { /// This only exists for cases where you already have a value expressed in time units, /// such as those received from the `WebCodecs` APIs. #[inline] - pub fn new(v: u64) -> Self { + pub fn new(v: i64) -> Self { Self(v) } #[inline] pub fn from_secs(v: f64, timescale: Timescale) -> Self { - Self((v * timescale.0 as f64).round() as u64) + Self((v * timescale.0 as f64).round() as i64) } #[inline] From 25c1380304f6121314644bfd4076765e4570f4c3 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 4 Oct 2024 08:07:52 +0200 Subject: [PATCH 26/61] Fix unused warning --- crates/viewer/re_renderer/src/video/decoder/mod.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/viewer/re_renderer/src/video/decoder/mod.rs b/crates/viewer/re_renderer/src/video/decoder/mod.rs index be55d1f1e4e1..97277953af5f 100644 --- a/crates/viewer/re_renderer/src/video/decoder/mod.rs +++ b/crates/viewer/re_renderer/src/video/decoder/mod.rs @@ -20,6 +20,7 @@ use super::{DecodeHardwareAcceleration, DecodingError, FrameDecodingResult}; /// Delaying error reports (and showing last-good images meanwhile) allows us to skip over /// transient errors without flickering. +#[allow(unused)] pub const DECODING_ERROR_REPORTING_DELAY: Duration = Duration::from_millis(400); /// Decode video to a texture. From 9f94fc05f235d914ab4792d1b8aff51ec4344d30 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 4 Oct 2024 08:09:23 +0200 Subject: [PATCH 27/61] i64 for Time --- crates/store/re_video/src/decode/av1.rs | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/crates/store/re_video/src/decode/av1.rs b/crates/store/re_video/src/decode/av1.rs index 00bcfe2ab0da..29198ca975d2 100644 --- a/crates/store/re_video/src/decode/av1.rs +++ b/crates/store/re_video/src/decode/av1.rs @@ -238,8 +238,8 @@ fn submit_chunk(decoder: &mut dav1d::Decoder, chunk: Chunk, on_output: &OutputCa match decoder.send_data( chunk.data, None, - Some(time_to_i64(chunk.timestamp)), - Some(time_to_i64(chunk.duration)), + Some(chunk.timestamp.0), + Some(chunk.duration.0), ) { Ok(()) => {} Err(err) if err.is_again() => {} @@ -290,8 +290,8 @@ fn output_picture(picture: rav1d::Picture, on_output: &(dyn Fn(Result) + width: picture.width(), height: picture.height(), format: PixelFormat::Rgba8Unorm, - timestamp: i64_to_time(picture.timestamp().unwrap_or(0)), - duration: i64_to_time(picture.duration()), + timestamp: Time(picture.timestamp().unwrap_or(0)), + duration: Time(picture.duration()), }; on_output(Ok(frame)); } @@ -436,11 +436,3 @@ fn i444_to_rgba(picture: &dav1d::Picture) -> Vec { rgba } - -fn time_to_i64(time: Time) -> i64 { - time.0 as _ // TODO: what is the timescale of dav1d? -} - -fn i64_to_time(i64: i64) -> Time { - Time::new(i64 as _) // TODO: what is the timescale of dav1d? -} From d1cf5b7abcaf1d73f6b714dee66d011ead9a5cc4 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 4 Oct 2024 08:10:33 +0200 Subject: [PATCH 28/61] better TODOs --- crates/viewer/re_renderer/src/video/decoder/native_av1.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/crates/viewer/re_renderer/src/video/decoder/native_av1.rs b/crates/viewer/re_renderer/src/video/decoder/native_av1.rs index dd39ea2ba517..2b8e74e416d6 100644 --- a/crates/viewer/re_renderer/src/video/decoder/native_av1.rs +++ b/crates/viewer/re_renderer/src/video/decoder/native_av1.rs @@ -69,8 +69,7 @@ impl Av1VideoDecoder { re_log::debug!("Initializing native video decoder…"); let decoder_output = Arc::new(Mutex::new(DecoderOutput::default())); - // TODO: check that data is av1, and return error elsewise - // TEMP: assuming `av1`, because `re_video` demuxer will panic if it's not + // TODO: check that data.config.codec is av1, and return error elsewise let decoder = re_video::av1::Decoder::new({ let decoder_output = decoder_output.clone(); move |frame: re_video::av1::Result| match frame { @@ -336,7 +335,7 @@ fn copy_video_frame_to_texture( let width_blocks = frame.width / format.block_dimensions().0; let block_size = format .block_copy_size(Some(wgpu::TextureAspect::All)) - .unwrap(); // TODO + .unwrap(); // TODO: error handling let bytes_per_row_unaligned = width_blocks * block_size; re_tracing::profile_scope!("write_texture"); From 4768a38a513ae3d3ae9c4c716098bc01d763ef3b Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 4 Oct 2024 08:26:08 +0200 Subject: [PATCH 29/61] Update rav1d with crash fix --- Cargo.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 8a512088757f..2b13ab53449f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4724,7 +4724,7 @@ dependencies = [ [[package]] name = "rav1d" version = "1.0.0" -source = "git+https://github.com/rerun-io/rav1d?branch=emilk/dav1d-interface#6f12e3fe8eada6e362306ec853c8147a74d7475b" +source = "git+https://github.com/rerun-io/rav1d?branch=emilk/dav1d-interface#f5b659bd4b2bf10588cb95c4494044f19828e4e7" dependencies = [ "assert_matches", "atomig", From c4f38b5fcc807f79e1eb82e1fa5225a871c52269 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 4 Oct 2024 08:27:50 +0200 Subject: [PATCH 30/61] Return nice error message when trying to play something besides AV1 --- crates/store/re_video/src/demux/mod.rs | 8 ++++++++ crates/viewer/re_renderer/src/video/decoder/native_av1.rs | 7 ++++++- crates/viewer/re_renderer/src/video/mod.rs | 6 ++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/crates/store/re_video/src/demux/mod.rs b/crates/store/re_video/src/demux/mod.rs index b240f2f80222..b159bf3a3038 100644 --- a/crates/store/re_video/src/demux/mod.rs +++ b/crates/store/re_video/src/demux/mod.rs @@ -197,6 +197,8 @@ pub struct Sample { #[derive(Debug, Clone)] pub struct Config { /// String used to identify the codec and some of its configuration. + /// + /// e.g. "av01.0.05M.08" (AV1) pub codec: String, /// Codec-specific configuration. @@ -209,6 +211,12 @@ pub struct Config { pub coded_width: u16, } +impl Config { + pub fn is_av1(&self) -> bool { + self.codec.starts_with("av01") + } +} + /// Errors that can occur when loading a video. #[derive(thiserror::Error, Debug)] pub enum VideoLoadError { diff --git a/crates/viewer/re_renderer/src/video/decoder/native_av1.rs b/crates/viewer/re_renderer/src/video/decoder/native_av1.rs index 2b8e74e416d6..ae0889fa42dc 100644 --- a/crates/viewer/re_renderer/src/video/decoder/native_av1.rs +++ b/crates/viewer/re_renderer/src/video/decoder/native_av1.rs @@ -66,10 +66,15 @@ impl Av1VideoDecoder { ) -> Result { re_tracing::profile_function!(); + if !data.config.is_av1() { + return Err(DecodingError::UnsupportedCodec { + codec: data.config.codec.clone(), + }); + } + re_log::debug!("Initializing native video decoder…"); let decoder_output = Arc::new(Mutex::new(DecoderOutput::default())); - // TODO: check that data.config.codec is av1, and return error elsewise let decoder = re_video::av1::Decoder::new({ let decoder_output = decoder_output.clone(); move |frame: re_video::av1::Result| match frame { diff --git a/crates/viewer/re_renderer/src/video/mod.rs b/crates/viewer/re_renderer/src/video/mod.rs index 492dd28162a8..eada148cbe3c 100644 --- a/crates/viewer/re_renderer/src/video/mod.rs +++ b/crates/viewer/re_renderer/src/video/mod.rs @@ -47,8 +47,14 @@ pub enum DecodingError { #[error("Bad data.")] BadData, + #[cfg(not(target_arch = "wasm32"))] #[error("No native video support. Try compiling rerun with the `video_av1` feature flag")] NoNativeSupport, + + #[cfg(not(target_arch = "wasm32"))] + #[cfg(feature = "video_av1")] + #[error("Unsupported codec: {codec:?}. Only AV1 is currently supported on native.")] + UnsupportedCodec { codec: String }, } pub type FrameDecodingResult = Result; From 3cf2c227fd002901421b8bef74fb4f7c57cb0611 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 4 Oct 2024 08:29:17 +0200 Subject: [PATCH 31/61] Remove final TODO --- crates/viewer/re_renderer/src/video/decoder/native_av1.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/crates/viewer/re_renderer/src/video/decoder/native_av1.rs b/crates/viewer/re_renderer/src/video/decoder/native_av1.rs index ae0889fa42dc..d7f1d74eba2f 100644 --- a/crates/viewer/re_renderer/src/video/decoder/native_av1.rs +++ b/crates/viewer/re_renderer/src/video/decoder/native_av1.rs @@ -338,9 +338,12 @@ fn copy_video_frame_to_texture( }; let width_blocks = frame.width / format.block_dimensions().0; + + #[allow(clippy::unwrap_used)] // block_copy_size can only fail for weird comressed formats let block_size = format .block_copy_size(Some(wgpu::TextureAspect::All)) - .unwrap(); // TODO: error handling + .unwrap(); + let bytes_per_row_unaligned = width_blocks * block_size; re_tracing::profile_scope!("write_texture"); From 8704c8f03e4c8e888c6b8bcdfaf53d0d87496714 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 4 Oct 2024 08:30:36 +0200 Subject: [PATCH 32/61] Fix typo and include --- crates/viewer/re_renderer/src/video/decoder/native_av1.rs | 2 +- crates/viewer/re_renderer/src/video/decoder/web.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/viewer/re_renderer/src/video/decoder/native_av1.rs b/crates/viewer/re_renderer/src/video/decoder/native_av1.rs index d7f1d74eba2f..9b3d96a383af 100644 --- a/crates/viewer/re_renderer/src/video/decoder/native_av1.rs +++ b/crates/viewer/re_renderer/src/video/decoder/native_av1.rs @@ -339,7 +339,7 @@ fn copy_video_frame_to_texture( let width_blocks = frame.width / format.block_dimensions().0; - #[allow(clippy::unwrap_used)] // block_copy_size can only fail for weird comressed formats + #[allow(clippy::unwrap_used)] // block_copy_size can only fail for weird compressed formats let block_size = format .block_copy_size(Some(wgpu::TextureAspect::All)) .unwrap(); diff --git a/crates/viewer/re_renderer/src/video/decoder/web.rs b/crates/viewer/re_renderer/src/video/decoder/web.rs index ca85bea8131d..c2bba355cf54 100644 --- a/crates/viewer/re_renderer/src/video/decoder/web.rs +++ b/crates/viewer/re_renderer/src/video/decoder/web.rs @@ -1,4 +1,4 @@ -use std::{sync::Arc, time::Duration}; +use std::sync::Arc; use js_sys::{Function, Uint8Array}; use parking_lot::Mutex; From 56b1ac9aa77a525c3889507941d7f3cf3fa07665 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 4 Oct 2024 08:34:49 +0200 Subject: [PATCH 33/61] Fix clippy lint --- crates/store/re_video/src/decode/av1.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/store/re_video/src/decode/av1.rs b/crates/store/re_video/src/decode/av1.rs index 29198ca975d2..d233c5fa5a95 100644 --- a/crates/store/re_video/src/decode/av1.rs +++ b/crates/store/re_video/src/decode/av1.rs @@ -259,7 +259,7 @@ fn output_frames(decoder: &mut dav1d::Decoder, on_output: &OutputCallback) { loop { match decoder.get_picture() { Ok(picture) => { - output_picture(picture, on_output); + output_picture(&picture, on_output); } Err(err) if err.is_again() => { // Not enough data yet @@ -272,7 +272,7 @@ fn output_frames(decoder: &mut dav1d::Decoder, on_output: &OutputCallback) { } } -fn output_picture(picture: rav1d::Picture, on_output: &(dyn Fn(Result) + Send + Sync)) { +fn output_picture(picture: &rav1d::Picture, on_output: &(dyn Fn(Result) + Send + Sync)) { // TODO(jan): support other parameters? // What do these even do: // - matrix_coefficients From 0f04caab588da07013231277ac806aeb0f92c60a Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 4 Oct 2024 08:37:34 +0200 Subject: [PATCH 34/61] More clippy fixes --- crates/store/re_video/src/decode/av1.rs | 8 ++++---- crates/viewer/re_renderer/src/video/decoder/native_av1.rs | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/crates/store/re_video/src/decode/av1.rs b/crates/store/re_video/src/decode/av1.rs index d233c5fa5a95..0f8dd7839782 100644 --- a/crates/store/re_video/src/decode/av1.rs +++ b/crates/store/re_video/src/decode/av1.rs @@ -282,10 +282,10 @@ fn output_picture(picture: &rav1d::Picture, on_output: &(dyn Fn(Result) + let frame = Frame { data: match picture.pixel_layout() { - PixelLayout::I400 => i400_to_rgba(&picture), - PixelLayout::I420 => i420_to_rgba(&picture), - PixelLayout::I422 => i422_to_rgba(&picture), - PixelLayout::I444 => i444_to_rgba(&picture), + PixelLayout::I400 => i400_to_rgba(picture), + PixelLayout::I420 => i420_to_rgba(picture), + PixelLayout::I422 => i422_to_rgba(picture), + PixelLayout::I444 => i444_to_rgba(picture), }, width: picture.width(), height: picture.height(), diff --git a/crates/viewer/re_renderer/src/video/decoder/native_av1.rs b/crates/viewer/re_renderer/src/video/decoder/native_av1.rs index 9b3d96a383af..64494551652e 100644 --- a/crates/viewer/re_renderer/src/video/decoder/native_av1.rs +++ b/crates/viewer/re_renderer/src/video/decoder/native_av1.rs @@ -218,7 +218,7 @@ impl VideoDecoder for Av1VideoDecoder { } let Some(frame_idx) = - latest_at_idx(&frames, |frame| frame.timestamp, &presentation_timestamp) + latest_at_idx(frames, |frame| frame.timestamp, &presentation_timestamp) else { // No buffered frames - texture will be blank. From 4e2f67030616e526f338e9a8b35102bdd55cca8e Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 4 Oct 2024 08:37:57 +0200 Subject: [PATCH 35/61] Fix exaple --- crates/store/re_video/examples/frames.rs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/crates/store/re_video/examples/frames.rs b/crates/store/re_video/examples/frames.rs index 620c83aa2870..5fbb8c5cfab2 100644 --- a/crates/store/re_video/examples/frames.rs +++ b/crates/store/re_video/examples/frames.rs @@ -68,13 +68,15 @@ fn main() { let width = num_digits(frames.len()); for (i, frame) in frames.iter().enumerate() { - let mut file = OpenOptions::new() - .write(true) - .create(true) - .truncate(true) - .open(output_dir.join(format!("{i:0width$}.ppm"))) - .expect("failed to open file"); - write_binary_ppm(&mut file, frame.width, frame.height, &frame.data); + if let Ok(frame) = frame { + let mut file = OpenOptions::new() + .write(true) + .create(true) + .truncate(true) + .open(output_dir.join(format!("{i:0width$}.ppm"))) + .expect("failed to open file"); + write_binary_ppm(&mut file, frame.width, frame.height, &frame.data); + } } } From c692a7e63fa2fd978a4218d84c02d3314b86fd5b Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 4 Oct 2024 08:41:45 +0200 Subject: [PATCH 36/61] Add issue number to TODO --- crates/store/re_video/Cargo.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crates/store/re_video/Cargo.toml b/crates/store/re_video/Cargo.toml index 362526154651..21cab41fd279 100644 --- a/crates/store/re_video/Cargo.toml +++ b/crates/store/re_video/Cargo.toml @@ -44,7 +44,8 @@ thiserror.workspace = true # Native dependencies: [target.'cfg(not(target_arch = "wasm32"))'.dependencies] # If this package fails to build, install `nasm` locally, or build through `pixi`. -rav1d = { git = "https://github.com/rerun-io/rav1d", branch = "emilk/dav1d-interface", optional = true } # TODO: publish this fork +# See https://github.com/rerun-io/rav1d/pull/1 +rav1d = { git = "https://github.com/rerun-io/rav1d", branch = "emilk/dav1d-interface", optional = true } # TODO(#7588): publish this fork [dev-dependencies] indicatif.workspace = true From 975c37f4dd9f75638fdb55816380347446ffd049 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 4 Oct 2024 08:44:56 +0200 Subject: [PATCH 37/61] Add my name to TODO --- crates/store/re_video/src/decode/av1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/store/re_video/src/decode/av1.rs b/crates/store/re_video/src/decode/av1.rs index 0f8dd7839782..e334360e415c 100644 --- a/crates/store/re_video/src/decode/av1.rs +++ b/crates/store/re_video/src/decode/av1.rs @@ -97,7 +97,7 @@ impl Decoder { impl Drop for Decoder { fn drop(&mut self) { re_tracing::profile_function!(); - // TODO: maybe set a "close asap" flag instead? + // TODO(emilk): maybe set a "close asap" flag instead? self.reset(); // ignore enqueued commands self.flush(); // wait for thread to stop } From 9152936f8679c20255e4260a0e8ecbfb43472347 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 4 Oct 2024 08:46:43 +0200 Subject: [PATCH 38/61] Lint fixes --- Cargo.toml | 2 +- crates/store/re_video/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index ba79ae074a15..b0587649f866 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -311,7 +311,7 @@ opt-level = 1 # Make debug builds run faster [profile.dev.package.re_video] opt-level = 2 # Speed up CPU-side chroma-upsampling (TODO(#7298): move to GPU) [profile.dev.package.rav1d] -opt-level = 2 # Speed up AV1 video decoding. TODO: doesn't work? +opt-level = 2 # Speed up AV1 video decoding. TODO(emilk): this doesn't seem to work [profile.dev.package.wgpu] opt-level = 2 # Speed up copying video textures diff --git a/crates/store/re_video/Cargo.toml b/crates/store/re_video/Cargo.toml index 21cab41fd279..1d99fe3f8f79 100644 --- a/crates/store/re_video/Cargo.toml +++ b/crates/store/re_video/Cargo.toml @@ -45,7 +45,7 @@ thiserror.workspace = true [target.'cfg(not(target_arch = "wasm32"))'.dependencies] # If this package fails to build, install `nasm` locally, or build through `pixi`. # See https://github.com/rerun-io/rav1d/pull/1 -rav1d = { git = "https://github.com/rerun-io/rav1d", branch = "emilk/dav1d-interface", optional = true } # TODO(#7588): publish this fork +rav1d = { git = "https://github.com/rerun-io/rav1d", branch = "emilk/dav1d-interface", optional = true } # TODO(#7588): publish this fork [dev-dependencies] indicatif.workspace = true From 514cf30722da75a07803bac28c4ce103c15e0aa5 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 4 Oct 2024 09:54:16 +0200 Subject: [PATCH 39/61] Print name of video and chunk offset in case of crash in rav1d --- Cargo.lock | 8 ++++++++ Cargo.toml | 1 + crates/store/re_video/Cargo.toml | 1 + crates/store/re_video/src/decode/av1.rs | 12 ++++++++++-- crates/utils/re_crash_handler/Cargo.toml | 1 + crates/utils/re_crash_handler/src/lib.rs | 4 ++++ crates/viewer/re_data_ui/src/blob.rs | 2 ++ crates/viewer/re_renderer/src/video/decoder/mod.rs | 3 ++- .../re_renderer/src/video/decoder/native_av1.rs | 7 +++++-- crates/viewer/re_renderer/src/video/mod.rs | 4 ++++ .../re_space_view_spatial/src/visualizers/videos.rs | 2 ++ .../re_viewer_context/src/cache/video_cache.rs | 3 ++- 12 files changed, 42 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2b13ab53449f..780cd0b95099 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1831,6 +1831,12 @@ dependencies = [ "serde", ] +[[package]] +name = "econtext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18aade80d5e09429040243ce1143ddc08a92d7a22820ac512610410a4dd5214f" + [[package]] name = "eframe" version = "0.29.1" @@ -5016,6 +5022,7 @@ name = "re_crash_handler" version = "0.19.0-alpha.1+dev" dependencies = [ "backtrace", + "econtext", "itertools 0.13.0", "libc", "parking_lot", @@ -5943,6 +5950,7 @@ name = "re_video" version = "0.19.0-alpha.1+dev" dependencies = [ "crossbeam", + "econtext", "indicatif", "itertools 0.13.0", "ordered-float", diff --git a/Cargo.toml b/Cargo.toml index b0587649f866..9f32ae924f9f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -164,6 +164,7 @@ criterion = "0.5" crossbeam = "0.8" directories = "5" document-features = "0.2.8" +econtext = "0.2" # Prints error contexts on crashes ehttp = "0.5.0" enumset = "1.0.12" env_logger = { version = "0.10", default-features = false } diff --git a/crates/store/re_video/Cargo.toml b/crates/store/re_video/Cargo.toml index 1d99fe3f8f79..9c37011cc7fe 100644 --- a/crates/store/re_video/Cargo.toml +++ b/crates/store/re_video/Cargo.toml @@ -35,6 +35,7 @@ re_log.workspace = true re_tracing.workspace = true crossbeam.workspace = true +econtext.workspace = true itertools.workspace = true ordered-float.workspace = true parking_lot.workspace = true diff --git a/crates/store/re_video/src/decode/av1.rs b/crates/store/re_video/src/decode/av1.rs index e334360e415c..e930d4d6fa5b 100644 --- a/crates/store/re_video/src/decode/av1.rs +++ b/crates/store/re_video/src/decode/av1.rs @@ -40,7 +40,10 @@ pub struct Decoder { } impl Decoder { - pub fn new(on_output: impl Fn(Result) + Send + Sync + 'static) -> Self { + pub fn new( + debug_name: String, + on_output: impl Fn(Result) + Send + Sync + 'static, + ) -> Self { re_tracing::profile_function!(); let (command_tx, command_rx) = unbounded(); let (reset_tx, reset_rx) = bounded(1); @@ -50,6 +53,7 @@ impl Decoder { let thread = std::thread::Builder::new() .name("av1_decoder".into()) .spawn(move || { + econtext::econtext_data!("Video", debug_name); decoder_thread(&command_rx, &reset_rx, &parker, &on_output); re_log::debug!("Closing decoder thread"); }) @@ -218,6 +222,7 @@ fn decoder_thread( fn submit_chunk(decoder: &mut dav1d::Decoder, chunk: Chunk, on_output: &OutputCallback) { re_tracing::profile_function!(); + econtext::econtext_function_data!(format!("chunk timestamp: {:?}", chunk.timestamp)); { re_tracing::profile_scope!("send_pending_data"); @@ -257,7 +262,10 @@ fn drain_decoded_frames(decoder: &mut dav1d::Decoder) { fn output_frames(decoder: &mut dav1d::Decoder, on_output: &OutputCallback) { loop { - match decoder.get_picture() { + match { + econtext::econtext!("get_picture"); + decoder.get_picture() + } { Ok(picture) => { output_picture(&picture, on_output); } diff --git a/crates/utils/re_crash_handler/Cargo.toml b/crates/utils/re_crash_handler/Cargo.toml index 765ca6dcc891..4a31fce60b26 100644 --- a/crates/utils/re_crash_handler/Cargo.toml +++ b/crates/utils/re_crash_handler/Cargo.toml @@ -28,6 +28,7 @@ analytics = ["dep:re_analytics"] [dependencies] re_build_info.workspace = true +econtext.workspace = true itertools.workspace = true parking_lot.workspace = true diff --git a/crates/utils/re_crash_handler/src/lib.rs b/crates/utils/re_crash_handler/src/lib.rs index 52c99abb6fe0..2d6512b378e9 100644 --- a/crates/utils/re_crash_handler/src/lib.rs +++ b/crates/utils/re_crash_handler/src/lib.rs @@ -57,6 +57,8 @@ fn install_panic_hook(_build_info: BuildInfo) { (*previous_panic_hook)(panic_info); } + econtext::print_econtext(); // Print additional error context, if any + eprintln!( "\n\ Troubleshooting Rerun: https://www.rerun.io/docs/getting-started/troubleshooting \n\ @@ -164,6 +166,8 @@ fn install_signal_handler(build_info: BuildInfo) { write_to_stderr(&callstack); write_to_stderr("\n"); + econtext::print_econtext(); // Print additional error context, if any + // Let's print the important stuff _again_ so it is visible at the bottom of the users terminal: write_to_stderr("\n"); print_problem_and_links(signal_name); diff --git a/crates/viewer/re_data_ui/src/blob.rs b/crates/viewer/re_data_ui/src/blob.rs index 25b1290487a6..96ddbb86291b 100644 --- a/crates/viewer/re_data_ui/src/blob.rs +++ b/crates/viewer/re_data_ui/src/blob.rs @@ -115,7 +115,9 @@ pub fn blob_preview_and_save_ui( // Try to treat it as a video if treating it as image didn't work: else if let Some(blob_row_id) = blob_row_id { let video_result = ctx.cache.entry(|c: &mut re_viewer_context::VideoCache| { + let debug_name = entity_path.to_string(); c.entry( + debug_name, blob_row_id, blob, media_type.as_ref().map(|mt| mt.as_str()), diff --git a/crates/viewer/re_renderer/src/video/decoder/mod.rs b/crates/viewer/re_renderer/src/video/decoder/mod.rs index 97277953af5f..00dce49cb381 100644 --- a/crates/viewer/re_renderer/src/video/decoder/mod.rs +++ b/crates/viewer/re_renderer/src/video/decoder/mod.rs @@ -39,6 +39,7 @@ pub trait VideoDecoder: 'static + Send { } pub fn new_video_decoder( + debug_name: String, render_context: &RenderContext, data: Arc, hw_acceleration: DecodeHardwareAcceleration, @@ -49,7 +50,7 @@ pub fn new_video_decoder( if #[cfg(target_arch = "wasm32")] { let decoder = web::WebVideoDecoder::new(render_context, data, hw_acceleration)?; } else if #[cfg(feature = "video_av1")] { - let decoder = native_av1::Av1VideoDecoder::new(render_context, data)?; + let decoder = native_av1::Av1VideoDecoder::new(debug_name, render_context, data)?; } else { let decoder = no_native_decoder::NoNativeVideoDecoder::default(); } diff --git a/crates/viewer/re_renderer/src/video/decoder/native_av1.rs b/crates/viewer/re_renderer/src/video/decoder/native_av1.rs index 64494551652e..e232fb70e32b 100644 --- a/crates/viewer/re_renderer/src/video/decoder/native_av1.rs +++ b/crates/viewer/re_renderer/src/video/decoder/native_av1.rs @@ -61,6 +61,7 @@ pub struct Av1VideoDecoder { impl Av1VideoDecoder { pub fn new( + debug_name: String, render_context: &RenderContext, data: Arc, ) -> Result { @@ -75,7 +76,7 @@ impl Av1VideoDecoder { re_log::debug!("Initializing native video decoder…"); let decoder_output = Arc::new(Mutex::new(DecoderOutput::default())); - let decoder = re_video::av1::Decoder::new({ + let on_output = { let decoder_output = decoder_output.clone(); move |frame: re_video::av1::Result| match frame { Ok(frame) => { @@ -94,7 +95,9 @@ impl Av1VideoDecoder { output.reset_since_last_reported_error = false; } } - }); + }; + let full_debug_name = format!("{debug_name}, codec: {}", data.config.codec); + let decoder = re_video::av1::Decoder::new(full_debug_name, on_output); let queue = render_context.queue.clone(); diff --git a/crates/viewer/re_renderer/src/video/mod.rs b/crates/viewer/re_renderer/src/video/mod.rs index eada148cbe3c..e1550fcd4870 100644 --- a/crates/viewer/re_renderer/src/video/mod.rs +++ b/crates/viewer/re_renderer/src/video/mod.rs @@ -85,6 +85,7 @@ struct DecoderEntry { /// /// Supports asynchronously decoding video into GPU textures via [`Video::frame_at`]. pub struct Video { + debug_name: String, data: Arc, decoders: Mutex>, decode_hw_acceleration: DecodeHardwareAcceleration, @@ -144,6 +145,7 @@ impl Video { /// Currently supports the following media types: /// - `video/mp4` pub fn load( + debug_name: String, data: &[u8], media_type: Option<&str>, decode_hw_acceleration: DecodeHardwareAcceleration, @@ -152,6 +154,7 @@ impl Video { let decoders = Mutex::new(HashMap::default()); Ok(Self { + debug_name, data, decoders, decode_hw_acceleration, @@ -203,6 +206,7 @@ impl Video { Entry::Occupied(occupied_entry) => occupied_entry.into_mut(), Entry::Vacant(vacant_entry) => { let new_decoder = decoder::new_video_decoder( + self.debug_name.clone(), render_context, self.data.clone(), self.decode_hw_acceleration, diff --git a/crates/viewer/re_space_view_spatial/src/visualizers/videos.rs b/crates/viewer/re_space_view_spatial/src/visualizers/videos.rs index e8588315f0bd..183344f2fb64 100644 --- a/crates/viewer/re_space_view_spatial/src/visualizers/videos.rs +++ b/crates/viewer/re_space_view_spatial/src/visualizers/videos.rs @@ -408,7 +408,9 @@ fn latest_at_query_video_from_datastore( let media_type = results.component_instance::(0); Some(ctx.cache.entry(|c: &mut VideoCache| { + let debug_name = entity_path.to_string(); c.entry( + debug_name, blob_row_id, &blob, media_type.as_ref().map(|m| m.as_str()), diff --git a/crates/viewer/re_viewer_context/src/cache/video_cache.rs b/crates/viewer/re_viewer_context/src/cache/video_cache.rs index 8fcf9295387e..ac707dfdf7c0 100644 --- a/crates/viewer/re_viewer_context/src/cache/video_cache.rs +++ b/crates/viewer/re_viewer_context/src/cache/video_cache.rs @@ -37,6 +37,7 @@ impl VideoCache { /// so we don't need the instance id here. pub fn entry( &mut self, + debug_name: String, blob_row_id: RowId, video_data: &re_types::datatypes::Blob, media_type: Option<&str>, @@ -52,7 +53,7 @@ impl VideoCache { .or_default() .entry(inner_key) .or_insert_with(|| { - let video = Video::load(video_data, media_type, hw_acceleration); + let video = Video::load(debug_name, video_data, media_type, hw_acceleration); Entry { used_this_frame: AtomicBool::new(true), video: Arc::new(video), From 90420430a1a21d3a9dde59c474fe0019e3dbc115 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 4 Oct 2024 09:58:10 +0200 Subject: [PATCH 40/61] Log decode erros as they happen --- crates/viewer/re_renderer/src/video/decoder/native_av1.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/crates/viewer/re_renderer/src/video/decoder/native_av1.rs b/crates/viewer/re_renderer/src/video/decoder/native_av1.rs index e232fb70e32b..c0858df8cedf 100644 --- a/crates/viewer/re_renderer/src/video/decoder/native_av1.rs +++ b/crates/viewer/re_renderer/src/video/decoder/native_av1.rs @@ -66,6 +66,7 @@ impl Av1VideoDecoder { data: Arc, ) -> Result { re_tracing::profile_function!(); + let full_debug_name = format!("{debug_name}, codec: {}", data.config.codec); if !data.config.is_av1() { return Err(DecodingError::UnsupportedCodec { @@ -78,6 +79,7 @@ impl Av1VideoDecoder { let on_output = { let decoder_output = decoder_output.clone(); + let full_debug_name = full_debug_name.clone(); move |frame: re_video::av1::Result| match frame { Ok(frame) => { re_log::trace!("Decoded frame at {:?}", frame.timestamp); @@ -87,6 +89,7 @@ impl Av1VideoDecoder { output.last_decoding_error = None; } Err(err) => { + re_log::warn_once!("Error during decoding of {full_debug_name}: {err}"); let mut output = decoder_output.lock(); if output.last_decoding_error.is_none() { output.time_when_entering_error_state = Instant::now(); @@ -96,7 +99,6 @@ impl Av1VideoDecoder { } } }; - let full_debug_name = format!("{debug_name}, codec: {}", data.config.codec); let decoder = re_video::av1::Decoder::new(full_debug_name, on_output); let queue = render_context.queue.clone(); From 3f76d2c7d0f3692cf45aa848f9c7929929ed328d Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 4 Oct 2024 10:19:34 +0200 Subject: [PATCH 41/61] Do not block during shutdown of AV1 decoder --- crates/store/re_video/src/decode/av1.rs | 62 +++++++++++++++++-------- 1 file changed, 43 insertions(+), 19 deletions(-) diff --git a/crates/store/re_video/src/decode/av1.rs b/crates/store/re_video/src/decode/av1.rs index e930d4d6fa5b..b151cef827c7 100644 --- a/crates/store/re_video/src/decode/av1.rs +++ b/crates/store/re_video/src/decode/av1.rs @@ -1,9 +1,15 @@ //! AV1 support. -use std::time::Duration; +use std::{ + sync::{ + atomic::{AtomicBool, Ordering}, + Arc, + }, + time::Duration, +}; use crossbeam::{ - channel::{bounded, unbounded, Receiver, RecvError, Sender, TryRecvError}, + channel::{unbounded, Receiver, RecvError, Sender, TryRecvError}, select, sync::{Parker, Unparker}, }; @@ -32,6 +38,9 @@ pub struct Decoder { _thread: std::thread::JoinHandle<()>, unparker: Unparker, + /// Set when it is time to die + should_stop: Arc, + /// Normal command stream command_tx: Sender, @@ -46,22 +55,27 @@ impl Decoder { ) -> Self { re_tracing::profile_function!(); let (command_tx, command_rx) = unbounded(); - let (reset_tx, reset_rx) = bounded(1); + let (reset_tx, reset_rx) = unbounded(); let parker = Parker::new(); let unparker = parker.unparker().clone(); + let should_stop = Arc::new(AtomicBool::new(false)); let thread = std::thread::Builder::new() .name("av1_decoder".into()) - .spawn(move || { - econtext::econtext_data!("Video", debug_name); - decoder_thread(&command_rx, &reset_rx, &parker, &on_output); - re_log::debug!("Closing decoder thread"); + .spawn({ + let should_stop = should_stop.clone(); + move || { + econtext::econtext_data!("Video", debug_name.clone()); + decoder_thread(&should_stop, &command_rx, &reset_rx, &parker, &on_output); + re_log::debug!("Closing decoder thread for {debug_name}"); + } }) .expect("failed to spawn decoder thread"); Self { _thread: thread, unparker, + should_stop, command_tx, reset_tx, } @@ -101,9 +115,8 @@ impl Decoder { impl Drop for Decoder { fn drop(&mut self) { re_tracing::profile_function!(); - // TODO(emilk): maybe set a "close asap" flag instead? - self.reset(); // ignore enqueued commands - self.flush(); // wait for thread to stop + self.should_stop.store(true, Ordering::Release); + self.unparker.unpark(); } } @@ -126,6 +139,7 @@ fn create_decoder() -> Result { } fn decoder_thread( + should_stop: &AtomicBool, command_rx: &Receiver, reset_rx: &Receiver<()>, parker: &Parker, @@ -139,16 +153,19 @@ fn decoder_thread( Ok(decoder) => decoder, }; - loop { + while !should_stop.load(Ordering::Acquire) { select! { recv(reset_rx) -> reset => { + if should_stop.load(Ordering::Acquire) { + return; + } match reset { Ok(_) => { // Reset the decoder. re_log::debug!("Received reset"); decoder.flush(); drain_decoded_frames(&mut decoder); - loop { + while !should_stop.load(Ordering::Acquire) { match command_rx.try_recv() { // Discard chunks Ok(Command::Chunk(_)) => {} @@ -172,17 +189,20 @@ fn decoder_thread( re_log::debug!("RecvError"); // Channel disconnected, this only happens if the decoder is dropped. decoder.flush(); - output_frames(&mut decoder, on_output); + output_frames(should_stop, &mut decoder, on_output); break; } } } recv(command_rx) -> command => { + if should_stop.load(Ordering::Acquire) { + return; + } match command { Ok(Command::Chunk(chunk)) => { submit_chunk(&mut decoder, chunk, on_output); - output_frames(&mut decoder, on_output); + output_frames(should_stop, &mut decoder, on_output); continue; } @@ -190,7 +210,7 @@ fn decoder_thread( re_log::debug!("Command::Flush"); // All pending frames must have already been decoded, because data sent // through a channel is received in the order it was sent. - output_frames(&mut decoder, on_output); + output_frames(should_stop, &mut decoder, on_output); done.try_send(()).ok(); continue; } @@ -205,7 +225,7 @@ fn decoder_thread( re_log::debug!("RecvError"); // Channel disconnected, this only happens if the decoder is dropped. decoder.flush(); - output_frames(&mut decoder, on_output); + output_frames(should_stop, &mut decoder, on_output); break; } } @@ -260,8 +280,12 @@ fn drain_decoded_frames(decoder: &mut dav1d::Decoder) { } } -fn output_frames(decoder: &mut dav1d::Decoder, on_output: &OutputCallback) { - loop { +fn output_frames( + should_stop: &AtomicBool, + decoder: &mut dav1d::Decoder, + on_output: &OutputCallback, +) { + while !should_stop.load(Ordering::Acquire) { match { econtext::econtext!("get_picture"); decoder.get_picture() @@ -280,7 +304,7 @@ fn output_frames(decoder: &mut dav1d::Decoder, on_output: &OutputCallback) { } } -fn output_picture(picture: &rav1d::Picture, on_output: &(dyn Fn(Result) + Send + Sync)) { +fn output_picture(picture: &dav1d::Picture, on_output: &(dyn Fn(Result) + Send + Sync)) { // TODO(jan): support other parameters? // What do these even do: // - matrix_coefficients From 5c2767109b8eb651d7307888b63a0faa90493bf1 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 4 Oct 2024 10:29:37 +0200 Subject: [PATCH 42/61] Make it easy to use dav1d instead of rav1d --- Cargo.toml | 2 +- crates/store/re_video/Cargo.toml | 7 +++++-- crates/store/re_video/src/decode/av1.rs | 1 - 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 9f32ae924f9f..cc3aa72c03bb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -312,7 +312,7 @@ opt-level = 1 # Make debug builds run faster [profile.dev.package.re_video] opt-level = 2 # Speed up CPU-side chroma-upsampling (TODO(#7298): move to GPU) [profile.dev.package.rav1d] -opt-level = 2 # Speed up AV1 video decoding. TODO(emilk): this doesn't seem to work +opt-level = 2 # Speed up AV1 video decoding. TODO(emilk): this doesn't work. rav1d is dog slow in dev builds. [profile.dev.package.wgpu] opt-level = 2 # Speed up copying video textures diff --git a/crates/store/re_video/Cargo.toml b/crates/store/re_video/Cargo.toml index 9c37011cc7fe..adc30b6eabab 100644 --- a/crates/store/re_video/Cargo.toml +++ b/crates/store/re_video/Cargo.toml @@ -28,7 +28,7 @@ default = [] ## Opt-in to native AV1 decoding. ## You need to install [nasm](https://nasm.us/) to compile with this feature. -av1 = ["dep:rav1d"] +av1 = ["dep:dav1d"] [dependencies] re_log.workspace = true @@ -44,9 +44,12 @@ thiserror.workspace = true # Native dependencies: [target.'cfg(not(target_arch = "wasm32"))'.dependencies] + # If this package fails to build, install `nasm` locally, or build through `pixi`. # See https://github.com/rerun-io/rav1d/pull/1 -rav1d = { git = "https://github.com/rerun-io/rav1d", branch = "emilk/dav1d-interface", optional = true } # TODO(#7588): publish this fork +dav1d = { git = "https://github.com/rerun-io/rav1d", branch = "emilk/dav1d-interface", package = "rav1d", optional = true } # TODO(#7588): publish this fork + +# dav1d = "0.10.3" # Requires more things to build, but is fast in debug builds. Useful for development. [dev-dependencies] indicatif.workspace = true diff --git a/crates/store/re_video/src/decode/av1.rs b/crates/store/re_video/src/decode/av1.rs index b151cef827c7..20659442aa6b 100644 --- a/crates/store/re_video/src/decode/av1.rs +++ b/crates/store/re_video/src/decode/av1.rs @@ -14,7 +14,6 @@ use crossbeam::{ sync::{Parker, Unparker}, }; use dav1d::{PixelLayout, PlanarImageComponent}; -use rav1d::dav1d; use crate::Time; From bfaa7f4a0232b551f3d3812b215ce2b840a22cbc Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 4 Oct 2024 10:32:34 +0200 Subject: [PATCH 43/61] toml fmt --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index cc3aa72c03bb..aa8747386c2f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -164,7 +164,7 @@ criterion = "0.5" crossbeam = "0.8" directories = "5" document-features = "0.2.8" -econtext = "0.2" # Prints error contexts on crashes +econtext = "0.2" # Prints error contexts on crashes ehttp = "0.5.0" enumset = "1.0.12" env_logger = { version = "0.10", default-features = false } From e8c03f0820d244692c743be99ecf0101c121413a Mon Sep 17 00:00:00 2001 From: Andreas Reich Date: Fri, 4 Oct 2024 11:08:45 +0200 Subject: [PATCH 44/61] update to latest rav1d with windows fix --- Cargo.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 780cd0b95099..24e1bc87656e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4730,7 +4730,7 @@ dependencies = [ [[package]] name = "rav1d" version = "1.0.0" -source = "git+https://github.com/rerun-io/rav1d?branch=emilk/dav1d-interface#f5b659bd4b2bf10588cb95c4494044f19828e4e7" +source = "git+https://github.com/rerun-io/rav1d?branch=emilk/dav1d-interface#d3acfb077eac7759f94279ec9a81edd7d0c409ed" dependencies = [ "assert_matches", "atomig", From aa26f982771568e5a83d775fcacb9bf5a5eee2f3 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 4 Oct 2024 13:42:58 +0200 Subject: [PATCH 45/61] Remove `zeroed_texture` --- crates/viewer/re_renderer/src/video/decoder/native_av1.rs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/crates/viewer/re_renderer/src/video/decoder/native_av1.rs b/crates/viewer/re_renderer/src/video/decoder/native_av1.rs index c0858df8cedf..e87c59c1570c 100644 --- a/crates/viewer/re_renderer/src/video/decoder/native_av1.rs +++ b/crates/viewer/re_renderer/src/video/decoder/native_av1.rs @@ -49,7 +49,6 @@ pub struct Av1VideoDecoder { data: Arc, queue: Arc, texture: GpuTexture2D, - zeroed_texture: GpuTexture2D, decoder: re_video::av1::Decoder, decoder_output: Arc>, @@ -109,18 +108,11 @@ impl Av1VideoDecoder { data.config.coded_width as u32, data.config.coded_height as u32, ); - let zeroed_texture = alloc_video_frame_texture( - &render_context.device, - &render_context.gpu_resources.textures, - data.config.coded_width as u32, - data.config.coded_height as u32, - ); Ok(Self { data, queue, texture, - zeroed_texture, decoder, decoder_output, last_used_frame_timestamp: Time::MAX, From 4a58dc08c2afdd9b8e7cab6dff1454435165c5be Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 4 Oct 2024 13:43:33 +0200 Subject: [PATCH 46/61] merge imports --- crates/store/re_video/examples/frames.rs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/crates/store/re_video/examples/frames.rs b/crates/store/re_video/examples/frames.rs index 5fbb8c5cfab2..eba38ad25432 100644 --- a/crates/store/re_video/examples/frames.rs +++ b/crates/store/re_video/examples/frames.rs @@ -1,16 +1,17 @@ #![allow(clippy::unwrap_used)] +use std::{ + fs::{File, OpenOptions}, + io::Write as _, + path::{Path, PathBuf}, + sync::Arc, + time::{Duration, Instant}, +}; + use indicatif::ProgressBar; use parking_lot::Mutex; + use re_video::demux::mp4::load_mp4; -use std::fs::File; -use std::fs::OpenOptions; -use std::io::Write as _; -use std::path::Path; -use std::path::PathBuf; -use std::sync::Arc; -use std::time::Duration; -use std::time::Instant; fn main() { // frames From 585a8ad377503a8829170b889c336f8b9b766d20 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 4 Oct 2024 13:45:15 +0200 Subject: [PATCH 47/61] Remove TODO --- crates/viewer/re_renderer/src/video/decoder/native_av1.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/crates/viewer/re_renderer/src/video/decoder/native_av1.rs b/crates/viewer/re_renderer/src/video/decoder/native_av1.rs index e87c59c1570c..132f7cb380de 100644 --- a/crates/viewer/re_renderer/src/video/decoder/native_av1.rs +++ b/crates/viewer/re_renderer/src/video/decoder/native_av1.rs @@ -1,5 +1,3 @@ -// TODO(#7298): decode on native - #![allow(dead_code, unused_variables, clippy::unnecessary_wraps)] use std::sync::Arc; From 555807171c2502fe69643bbf0e33e32c7b7f1739 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 4 Oct 2024 13:56:33 +0200 Subject: [PATCH 48/61] Remove unused import --- crates/viewer/re_renderer/src/video/decoder/native_av1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/viewer/re_renderer/src/video/decoder/native_av1.rs b/crates/viewer/re_renderer/src/video/decoder/native_av1.rs index 132f7cb380de..5c2117327e4b 100644 --- a/crates/viewer/re_renderer/src/video/decoder/native_av1.rs +++ b/crates/viewer/re_renderer/src/video/decoder/native_av1.rs @@ -17,7 +17,7 @@ use re_video::{Frame, Time}; use parking_lot::Mutex; use web_time::Instant; -use super::{alloc_video_frame_texture, VideoDecoder, DECODING_ERROR_REPORTING_DELAY}; +use super::{VideoDecoder, DECODING_ERROR_REPORTING_DELAY}; struct DecoderOutput { frames: Vec, From 3c187e802db982da26462d72a57a8bdf70678a40 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 4 Oct 2024 14:31:31 +0200 Subject: [PATCH 49/61] Fix example --- Cargo.lock | 1 + crates/store/re_video/Cargo.toml | 2 ++ crates/store/re_video/examples/frames.rs | 3 ++- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 24e1bc87656e..b42322cac873 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5959,6 +5959,7 @@ dependencies = [ "re_log", "re_mp4", "re_tracing", + "re_video", "thiserror", ] diff --git a/crates/store/re_video/Cargo.toml b/crates/store/re_video/Cargo.toml index adc30b6eabab..d151b2119cd0 100644 --- a/crates/store/re_video/Cargo.toml +++ b/crates/store/re_video/Cargo.toml @@ -53,6 +53,8 @@ dav1d = { git = "https://github.com/rerun-io/rav1d", branch = "emilk/dav1d-inter [dev-dependencies] indicatif.workspace = true +re_video = { workspace=true, features=["av1"] } # For the `frames` example + [[example]] name = "frames" diff --git a/crates/store/re_video/examples/frames.rs b/crates/store/re_video/examples/frames.rs index eba38ad25432..46830400339a 100644 --- a/crates/store/re_video/examples/frames.rs +++ b/crates/store/re_video/examples/frames.rs @@ -38,7 +38,7 @@ fn main() { progress.enable_steady_tick(Duration::from_millis(100)); let frames = Arc::new(Mutex::new(Vec::new())); - let decoder = re_video::decode::av1::Decoder::new({ + let decoder = re_video::decode::av1::Decoder::new("debug_name".to_owned(), { let frames = frames.clone(); let progress = progress.clone(); move |frame| { @@ -52,6 +52,7 @@ fn main() { decoder.decode(video.get(sample).unwrap()); } + decoder.flush(); drop(decoder); let end = Instant::now(); progress.finish(); From 3163a70e115dd1c9554e492fc11e1e8fe5ae85e5 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 4 Oct 2024 14:39:22 +0200 Subject: [PATCH 50/61] Document the frame example --- crates/store/re_video/examples/frames.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crates/store/re_video/examples/frames.rs b/crates/store/re_video/examples/frames.rs index 46830400339a..fe3060bf6dc1 100644 --- a/crates/store/re_video/examples/frames.rs +++ b/crates/store/re_video/examples/frames.rs @@ -1,3 +1,5 @@ +//! Decodes an mp4 with AV1 in it to a folder of images. + #![allow(clippy::unwrap_used)] use std::{ From b7a6e3474551354c62af8a0a3e912a757dc02798 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Sun, 6 Oct 2024 21:00:39 +0200 Subject: [PATCH 51/61] Remove confused docstring --- crates/store/re_video/src/decode/av1.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/crates/store/re_video/src/decode/av1.rs b/crates/store/re_video/src/decode/av1.rs index 20659442aa6b..85e81d3fc700 100644 --- a/crates/store/re_video/src/decode/av1.rs +++ b/crates/store/re_video/src/decode/av1.rs @@ -80,7 +80,6 @@ impl Decoder { } } - /// Submits a single frame for decoding. pub fn decode(&self, chunk: Chunk) { re_tracing::profile_function!(); self.command_tx.send(Command::Chunk(chunk)).ok(); From baca5a8d56945f2738bec35d5f9d8210878357b7 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Sun, 6 Oct 2024 21:06:52 +0200 Subject: [PATCH 52/61] Make decoder use `&mut self` to avoid certain data races --- crates/store/re_video/src/decode/av1.rs | 12 ++++++++---- .../re_renderer/src/video/decoder/native_av1.rs | 16 ++++------------ 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/crates/store/re_video/src/decode/av1.rs b/crates/store/re_video/src/decode/av1.rs index 85e81d3fc700..23a46a8b9914 100644 --- a/crates/store/re_video/src/decode/av1.rs +++ b/crates/store/re_video/src/decode/av1.rs @@ -33,6 +33,7 @@ pub enum Error { pub type Result = std::result::Result; +/// AV1 software decoder. pub struct Decoder { _thread: std::thread::JoinHandle<()>, unparker: Unparker, @@ -80,7 +81,8 @@ impl Decoder { } } - pub fn decode(&self, chunk: Chunk) { + // NOTE: The interface is all `&mut self` to avoid certain types of races. + pub fn decode(&mut self, chunk: Chunk) { re_tracing::profile_function!(); self.command_tx.send(Command::Chunk(chunk)).ok(); self.unparker.unpark(); @@ -89,7 +91,8 @@ impl Decoder { /// Resets the decoder. /// /// This does not block, all chunks sent to `decode` before this point will be discarded. - pub fn reset(&self) { + // NOTE: The interface is all `&mut self` to avoid certain types of races. + pub fn reset(&mut self) { re_tracing::profile_function!(); // Ask the decoder to reset its internal state. let (tx, rx) = crossbeam::channel::bounded(0); @@ -100,7 +103,8 @@ impl Decoder { } /// Blocks until all pending frames have been decoded. - pub fn flush(&self) { + // NOTE: The interface is all `&mut self` to avoid certain types of races. + pub fn flush(&mut self) { re_tracing::profile_function!(); // Ask the decoder to notify us once all pending frames have been decoded. let (tx, rx) = crossbeam::channel::bounded(0); @@ -165,7 +169,7 @@ fn decoder_thread( drain_decoded_frames(&mut decoder); while !should_stop.load(Ordering::Acquire) { match command_rx.try_recv() { - // Discard chunks + // Discard chunks Ok(Command::Chunk(_)) => {} Ok(Command::Reset(done)) => { done.try_send(()).ok(); diff --git a/crates/viewer/re_renderer/src/video/decoder/native_av1.rs b/crates/viewer/re_renderer/src/video/decoder/native_av1.rs index 5c2117327e4b..88dfd2cfd276 100644 --- a/crates/viewer/re_renderer/src/video/decoder/native_av1.rs +++ b/crates/viewer/re_renderer/src/video/decoder/native_av1.rs @@ -280,29 +280,21 @@ impl Av1VideoDecoder { /// Enqueue all samples in the given segment. /// /// Does nothing if the index is out of bounds. - fn enqueue_segment(&self, segment_idx: usize) -> Result<(), DecodingError> { + fn enqueue_segment(&mut self, segment_idx: usize) -> Result<(), DecodingError> { let Some(segment) = self.data.segments.get(segment_idx) else { return Ok(()); }; let samples = &self.data.samples[segment.range()]; - // The first sample in a segment is always a key frame: - self.enqueue_sample(&samples[0], true)?; - for sample in &samples[1..] { - self.enqueue_sample(sample, false)?; + for sample in samples { + let chunk = self.data.get(sample).ok_or(DecodingError::BadData)?; + self.decoder.decode(chunk); } Ok(()) } - /// Enqueue the given sample. - fn enqueue_sample(&self, sample: &re_video::Sample, is_key: bool) -> Result<(), DecodingError> { - let chunk = self.data.get(sample).ok_or(DecodingError::BadData)?; - self.decoder.decode(chunk); - Ok(()) - } - /// Reset the video decoder and discard all frames. fn reset(&mut self) { re_log::debug!("Resetting AV1 decoder"); From 8f3529dd053a9310f3cc67ca60457f4b0dfdfcac Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Sun, 6 Oct 2024 21:07:17 +0200 Subject: [PATCH 53/61] Don't break after receiving a `Flush` when waiting for `Reset` --- crates/store/re_video/src/decode/av1.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/store/re_video/src/decode/av1.rs b/crates/store/re_video/src/decode/av1.rs index 23a46a8b9914..4143061b6205 100644 --- a/crates/store/re_video/src/decode/av1.rs +++ b/crates/store/re_video/src/decode/av1.rs @@ -169,8 +169,9 @@ fn decoder_thread( drain_decoded_frames(&mut decoder); while !should_stop.load(Ordering::Acquire) { match command_rx.try_recv() { + Ok(Command::Chunk(_)) => { // Discard chunks - Ok(Command::Chunk(_)) => {} + } Ok(Command::Reset(done)) => { done.try_send(()).ok(); break; @@ -178,7 +179,6 @@ fn decoder_thread( Ok(Command::Flush(done)) => { done.try_send(()).ok(); // We have not hit a `Reset` yet - break; } Err(TryRecvError::Empty | TryRecvError::Disconnected) => { break; From 833a11da3f62c238804e6b4e29325f354bad6d5a Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Sun, 6 Oct 2024 21:37:51 +0200 Subject: [PATCH 54/61] Simplify the AV1 decoder thread comms, removing a data race --- crates/store/re_video/src/decode/av1.rs | 210 +++++++----------- .../src/video/decoder/native_av1.rs | 1 - 2 files changed, 79 insertions(+), 132 deletions(-) diff --git a/crates/store/re_video/src/decode/av1.rs b/crates/store/re_video/src/decode/av1.rs index 4143061b6205..964cf42b6da0 100644 --- a/crates/store/re_video/src/decode/av1.rs +++ b/crates/store/re_video/src/decode/av1.rs @@ -1,18 +1,11 @@ //! AV1 support. -use std::{ - sync::{ - atomic::{AtomicBool, Ordering}, - Arc, - }, - time::Duration, +use std::sync::{ + atomic::{AtomicBool, AtomicU64, Ordering}, + Arc, }; -use crossbeam::{ - channel::{unbounded, Receiver, RecvError, Sender, TryRecvError}, - select, - sync::{Parker, Unparker}, -}; +use crossbeam::channel::{unbounded, Receiver, Sender}; use dav1d::{PixelLayout, PlanarImageComponent}; use crate::Time; @@ -33,19 +26,42 @@ pub enum Error { pub type Result = std::result::Result; -/// AV1 software decoder. -pub struct Decoder { - _thread: std::thread::JoinHandle<()>, - unparker: Unparker, +enum Command { + Chunk(Chunk), + Flush { on_done: Sender<()> }, + Reset, + Stop, +} +#[derive(Clone)] +struct Comms { /// Set when it is time to die should_stop: Arc, - /// Normal command stream + /// Incremented on each call to [`Decoder::reset`]. + /// Decremented each time the decoder thread receives [`Command::Reset`]. + num_outstanding_resets: Arc, +} + +impl Default for Comms { + fn default() -> Self { + Self { + should_stop: Arc::new(AtomicBool::new(false)), + num_outstanding_resets: Arc::new(AtomicU64::new(0)), + } + } +} + +/// AV1 software decoder. +pub struct Decoder { + /// Where the decoding happens + _thread: std::thread::JoinHandle<()>, + + /// Commands sent to the decoder thread. command_tx: Sender, - /// Fast-track to reset and ignore all command in the normal command stream. - reset_tx: Sender<()>, + /// Instant communication to the decoder thread (circumventing the command queue). + comms: Comms, } impl Decoder { @@ -55,18 +71,15 @@ impl Decoder { ) -> Self { re_tracing::profile_function!(); let (command_tx, command_rx) = unbounded(); - let (reset_tx, reset_rx) = unbounded(); - let parker = Parker::new(); - let unparker = parker.unparker().clone(); - let should_stop = Arc::new(AtomicBool::new(false)); + let comms = Comms::default(); let thread = std::thread::Builder::new() .name("av1_decoder".into()) .spawn({ - let should_stop = should_stop.clone(); + let comms = comms.clone(); move || { econtext::econtext_data!("Video", debug_name.clone()); - decoder_thread(&should_stop, &command_rx, &reset_rx, &parker, &on_output); + decoder_thread(&comms, &command_rx, &on_output); re_log::debug!("Closing decoder thread for {debug_name}"); } }) @@ -74,10 +87,8 @@ impl Decoder { Self { _thread: thread, - unparker, - should_stop, command_tx, - reset_tx, + comms, } } @@ -85,7 +96,6 @@ impl Decoder { pub fn decode(&mut self, chunk: Chunk) { re_tracing::profile_function!(); self.command_tx.send(Command::Chunk(chunk)).ok(); - self.unparker.unpark(); } /// Resets the decoder. @@ -94,22 +104,18 @@ impl Decoder { // NOTE: The interface is all `&mut self` to avoid certain types of races. pub fn reset(&mut self) { re_tracing::profile_function!(); - // Ask the decoder to reset its internal state. - let (tx, rx) = crossbeam::channel::bounded(0); - self.command_tx.send(Command::Reset(tx)).ok(); - self.reset_tx.send(()).ok(); - self.unparker.unpark(); - _ = rx; // Do not block + self.comms + .num_outstanding_resets + .fetch_add(1, Ordering::SeqCst); + self.command_tx.send(Command::Reset).ok(); } /// Blocks until all pending frames have been decoded. // NOTE: The interface is all `&mut self` to avoid certain types of races. pub fn flush(&mut self) { re_tracing::profile_function!(); - // Ask the decoder to notify us once all pending frames have been decoded. let (tx, rx) = crossbeam::channel::bounded(0); - self.command_tx.send(Command::Flush(tx)).ok(); - self.unparker.unpark(); + self.command_tx.send(Command::Flush { on_done: tx }).ok(); rx.recv().ok(); } } @@ -117,17 +123,12 @@ impl Decoder { impl Drop for Decoder { fn drop(&mut self) { re_tracing::profile_function!(); - self.should_stop.store(true, Ordering::Release); - self.unparker.unpark(); + self.comms.should_stop.store(true, Ordering::SeqCst); + self.command_tx.send(Command::Stop).ok(); + // NOTE: we don't block here. The decoder thread will finish soon enough. } } -enum Command { - Chunk(Chunk), - Flush(Sender<()>), - Reset(Sender<()>), -} - type OutputCallback = dyn Fn(Result) + Send + Sync; fn create_decoder() -> Result { @@ -140,13 +141,7 @@ fn create_decoder() -> Result { dav1d::Decoder::with_settings(&settings) } -fn decoder_thread( - should_stop: &AtomicBool, - command_rx: &Receiver, - reset_rx: &Receiver<()>, - parker: &Parker, - on_output: &OutputCallback, -) { +fn decoder_thread(comms: &Comms, command_rx: &Receiver, on_output: &OutputCallback) { let mut decoder = match create_decoder() { Err(err) => { on_output(Err(Error::Initialization(err))); @@ -155,91 +150,42 @@ fn decoder_thread( Ok(decoder) => decoder, }; - while !should_stop.load(Ordering::Acquire) { - select! { - recv(reset_rx) -> reset => { - if should_stop.load(Ordering::Acquire) { - return; - } - match reset { - Ok(_) => { - // Reset the decoder. - re_log::debug!("Received reset"); - decoder.flush(); - drain_decoded_frames(&mut decoder); - while !should_stop.load(Ordering::Acquire) { - match command_rx.try_recv() { - Ok(Command::Chunk(_)) => { - // Discard chunks - } - Ok(Command::Reset(done)) => { - done.try_send(()).ok(); - break; - } - Ok(Command::Flush(done)) => { - done.try_send(()).ok(); - // We have not hit a `Reset` yet - } - Err(TryRecvError::Empty | TryRecvError::Disconnected) => { - break; - } - } - } - continue; - } - Err(RecvError) => { - re_log::debug!("RecvError"); - // Channel disconnected, this only happens if the decoder is dropped. - decoder.flush(); - output_frames(should_stop, &mut decoder, on_output); - break; - } - } - } + while let Ok(command) = command_rx.recv() { + if comms.should_stop.load(Ordering::SeqCst) { + re_log::debug!("Should stop"); + return; + } + + // If we're waiting for a reset we should ignore all other commands until we receive it. + let has_outstanding_reset = 0 < comms.num_outstanding_resets.load(Ordering::SeqCst); - recv(command_rx) -> command => { - if should_stop.load(Ordering::Acquire) { - return; + match command { + Command::Chunk(chunk) => { + if !has_outstanding_reset { + submit_chunk(&mut decoder, chunk, on_output); + output_frames(&comms.should_stop, &mut decoder, on_output); } - match command { - Ok(Command::Chunk(chunk)) => { - submit_chunk(&mut decoder, chunk, on_output); - output_frames(should_stop, &mut decoder, on_output); - continue; - } - - Ok(Command::Flush(done)) => { - re_log::debug!("Command::Flush"); - // All pending frames must have already been decoded, because data sent - // through a channel is received in the order it was sent. - output_frames(should_stop, &mut decoder, on_output); - done.try_send(()).ok(); - continue; - } - - Ok(Command::Reset(done)) => { - re_log::debug!("Command::Reset"); - done.try_send(()).ok(); - continue; - } - - Err(RecvError) => { - re_log::debug!("RecvError"); - // Channel disconnected, this only happens if the decoder is dropped. - decoder.flush(); - output_frames(should_stop, &mut decoder, on_output); - break; - } + } + Command::Flush { on_done } => { + if !has_outstanding_reset { + // TODO(emilk): can there really be outstanding frames here? + output_frames(&comms.should_stop, &mut decoder, on_output); } + on_done.send(()).ok(); } - - default => { - // No samples left in the queue - parker.park_timeout(Duration::from_millis(100)); - continue; + Command::Reset => { + decoder.flush(); + drain_decoded_frames(&mut decoder); + comms.num_outstanding_resets.fetch_sub(1, Ordering::SeqCst); + } + Command::Stop => { + re_log::debug!("Stop"); + return; } } } + + re_log::debug!("Disconnected"); } fn submit_chunk(decoder: &mut dav1d::Decoder, chunk: Chunk, on_output: &OutputCallback) { @@ -277,6 +223,7 @@ fn submit_chunk(decoder: &mut dav1d::Decoder, chunk: Chunk, on_output: &OutputCa } fn drain_decoded_frames(decoder: &mut dav1d::Decoder) { + re_tracing::profile_function!(); while let Ok(picture) = decoder.get_picture() { _ = picture; } @@ -287,7 +234,8 @@ fn output_frames( decoder: &mut dav1d::Decoder, on_output: &OutputCallback, ) { - while !should_stop.load(Ordering::Acquire) { + re_tracing::profile_function!(); + while !should_stop.load(Ordering::SeqCst) { match { econtext::econtext!("get_picture"); decoder.get_picture() diff --git a/crates/viewer/re_renderer/src/video/decoder/native_av1.rs b/crates/viewer/re_renderer/src/video/decoder/native_av1.rs index 88dfd2cfd276..18cd9a2bb040 100644 --- a/crates/viewer/re_renderer/src/video/decoder/native_av1.rs +++ b/crates/viewer/re_renderer/src/video/decoder/native_av1.rs @@ -297,7 +297,6 @@ impl Av1VideoDecoder { /// Reset the video decoder and discard all frames. fn reset(&mut self) { - re_log::debug!("Resetting AV1 decoder"); self.decoder.reset(); let mut decoder_output = self.decoder_output.lock(); From 29938fc6fce261d994a5fe1ed0305833ad3c97a6 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Sun, 6 Oct 2024 21:44:04 +0200 Subject: [PATCH 55/61] toml-fmt --- crates/store/re_video/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/store/re_video/Cargo.toml b/crates/store/re_video/Cargo.toml index d151b2119cd0..4ec48e0f6946 100644 --- a/crates/store/re_video/Cargo.toml +++ b/crates/store/re_video/Cargo.toml @@ -53,7 +53,7 @@ dav1d = { git = "https://github.com/rerun-io/rav1d", branch = "emilk/dav1d-inter [dev-dependencies] indicatif.workspace = true -re_video = { workspace=true, features=["av1"] } # For the `frames` example +re_video = { workspace = true, features = ["av1"] } # For the `frames` example [[example]] From ecd1a45686338a3c948e6c49148c918188285fae Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Sun, 6 Oct 2024 22:21:26 +0200 Subject: [PATCH 56/61] Clarify handling of `Error::Again` --- crates/store/re_video/Cargo.toml | 2 +- crates/store/re_video/examples/frames.rs | 2 +- crates/store/re_video/src/decode/av1.rs | 56 ++++++++----------- crates/store/re_video/src/decode/mod.rs | 2 + .../re_renderer/src/video/decoder/mod.rs | 2 +- .../src/video/decoder/native_av1.rs | 2 +- crates/viewer/re_renderer/src/video/mod.rs | 2 +- 7 files changed, 29 insertions(+), 39 deletions(-) diff --git a/crates/store/re_video/Cargo.toml b/crates/store/re_video/Cargo.toml index 4ec48e0f6946..4df896a1a32b 100644 --- a/crates/store/re_video/Cargo.toml +++ b/crates/store/re_video/Cargo.toml @@ -49,7 +49,7 @@ thiserror.workspace = true # See https://github.com/rerun-io/rav1d/pull/1 dav1d = { git = "https://github.com/rerun-io/rav1d", branch = "emilk/dav1d-interface", package = "rav1d", optional = true } # TODO(#7588): publish this fork -# dav1d = "0.10.3" # Requires more things to build, but is fast in debug builds. Useful for development. +# dav1d = { version = "0.10.3", optional = true } # Requires more things to build, but is fast in debug builds. Useful for development. [dev-dependencies] indicatif.workspace = true diff --git a/crates/store/re_video/examples/frames.rs b/crates/store/re_video/examples/frames.rs index fe3060bf6dc1..1b95e8fd1868 100644 --- a/crates/store/re_video/examples/frames.rs +++ b/crates/store/re_video/examples/frames.rs @@ -40,7 +40,7 @@ fn main() { progress.enable_steady_tick(Duration::from_millis(100)); let frames = Arc::new(Mutex::new(Vec::new())); - let decoder = re_video::decode::av1::Decoder::new("debug_name".to_owned(), { + let mut decoder = re_video::decode::av1::Decoder::new("debug_name".to_owned(), { let frames = frames.clone(); let progress = progress.clone(); move |frame| { diff --git a/crates/store/re_video/src/decode/av1.rs b/crates/store/re_video/src/decode/av1.rs index 964cf42b6da0..4073b144b4d2 100644 --- a/crates/store/re_video/src/decode/av1.rs +++ b/crates/store/re_video/src/decode/av1.rs @@ -142,6 +142,8 @@ fn create_decoder() -> Result { } fn decoder_thread(comms: &Comms, command_rx: &Receiver, on_output: &OutputCallback) { + #![allow(clippy::debug_assert_with_mut_call)] + let mut decoder = match create_decoder() { Err(err) => { on_output(Err(Error::Initialization(err))); @@ -163,19 +165,22 @@ fn decoder_thread(comms: &Comms, command_rx: &Receiver, on_output: &Out Command::Chunk(chunk) => { if !has_outstanding_reset { submit_chunk(&mut decoder, chunk, on_output); - output_frames(&comms.should_stop, &mut decoder, on_output); + // NOTE: in all video's I've tested, there is one frame per chunk + let _num_frames = output_frames(&comms.should_stop, &mut decoder, on_output); } } Command::Flush { on_done } => { - if !has_outstanding_reset { - // TODO(emilk): can there really be outstanding frames here? - output_frames(&comms.should_stop, &mut decoder, on_output); - } + debug_assert!(matches!(decoder.get_picture(), Err(dav1d::Error::Again)), + "There should be no pending pictures, since we output them directly after submitting a chunk."); + on_done.send(()).ok(); } Command::Reset => { decoder.flush(); - drain_decoded_frames(&mut decoder); + + debug_assert!(matches!(decoder.get_picture(), Err(dav1d::Error::Again)), + "There should be no pending pictures, since we output them directly after submitting a chunk."); + comms.num_outstanding_resets.fetch_sub(1, Ordering::SeqCst); } Command::Stop => { @@ -192,21 +197,6 @@ fn submit_chunk(decoder: &mut dav1d::Decoder, chunk: Chunk, on_output: &OutputCa re_tracing::profile_function!(); econtext::econtext_function_data!(format!("chunk timestamp: {:?}", chunk.timestamp)); - { - re_tracing::profile_scope!("send_pending_data"); - // always attempt to send pending data first - // this does nothing if there is no pending data, - // and is required if a call to `send_data` previously - // returned `EAGAIN` - match decoder.send_pending_data() { - Ok(()) => {} - Err(err) if err.is_again() => {} - Err(err) => { - on_output(Err(Error::Dav1d(err))); - } - } - } - re_tracing::profile_scope!("send_data"); match decoder.send_data( chunk.data, @@ -215,36 +205,33 @@ fn submit_chunk(decoder: &mut dav1d::Decoder, chunk: Chunk, on_output: &OutputCa Some(chunk.duration.0), ) { Ok(()) => {} - Err(err) if err.is_again() => {} Err(err) => { + debug_assert!(err != dav1d::Error::Again, "Bug in AV1 decoder: send_data returned `Error::Again`. This shouldn't happen, since we process all images in a chunk right away"); on_output(Err(Error::Dav1d(err))); } }; } -fn drain_decoded_frames(decoder: &mut dav1d::Decoder) { - re_tracing::profile_function!(); - while let Ok(picture) = decoder.get_picture() { - _ = picture; - } -} - +/// Returns the number of new frames. fn output_frames( should_stop: &AtomicBool, decoder: &mut dav1d::Decoder, on_output: &OutputCallback, -) { +) -> usize { re_tracing::profile_function!(); + let mut count = 0; while !should_stop.load(Ordering::SeqCst) { - match { + let picture = { econtext::econtext!("get_picture"); decoder.get_picture() - } { + }; + match picture { Ok(picture) => { output_picture(&picture, on_output); + count += 1; } - Err(err) if err.is_again() => { - // Not enough data yet + Err(dav1d::Error::Again) => { + // We need to submit more chunks to get more pictures break; } Err(err) => { @@ -252,6 +239,7 @@ fn output_frames( } } } + count } fn output_picture(picture: &dav1d::Picture, on_output: &(dyn Fn(Result) + Send + Sync)) { diff --git a/crates/store/re_video/src/decode/mod.rs b/crates/store/re_video/src/decode/mod.rs index 0bcca5079006..8c82454296e0 100644 --- a/crates/store/re_video/src/decode/mod.rs +++ b/crates/store/re_video/src/decode/mod.rs @@ -5,12 +5,14 @@ pub mod av1; use crate::Time; +/// One chunk of encoded video data; usually one frame. pub struct Chunk { pub data: Vec, pub timestamp: Time, pub duration: Time, } +/// One decoded video frame. pub struct Frame { pub data: Vec, pub width: u32, diff --git a/crates/viewer/re_renderer/src/video/decoder/mod.rs b/crates/viewer/re_renderer/src/video/decoder/mod.rs index 00dce49cb381..a757fe7eb27e 100644 --- a/crates/viewer/re_renderer/src/video/decoder/mod.rs +++ b/crates/viewer/re_renderer/src/video/decoder/mod.rs @@ -39,7 +39,7 @@ pub trait VideoDecoder: 'static + Send { } pub fn new_video_decoder( - debug_name: String, + debug_name: &str, render_context: &RenderContext, data: Arc, hw_acceleration: DecodeHardwareAcceleration, diff --git a/crates/viewer/re_renderer/src/video/decoder/native_av1.rs b/crates/viewer/re_renderer/src/video/decoder/native_av1.rs index 18cd9a2bb040..66f12c2ecefe 100644 --- a/crates/viewer/re_renderer/src/video/decoder/native_av1.rs +++ b/crates/viewer/re_renderer/src/video/decoder/native_av1.rs @@ -58,7 +58,7 @@ pub struct Av1VideoDecoder { impl Av1VideoDecoder { pub fn new( - debug_name: String, + debug_name: &str, render_context: &RenderContext, data: Arc, ) -> Result { diff --git a/crates/viewer/re_renderer/src/video/mod.rs b/crates/viewer/re_renderer/src/video/mod.rs index e1550fcd4870..bd1ff735c216 100644 --- a/crates/viewer/re_renderer/src/video/mod.rs +++ b/crates/viewer/re_renderer/src/video/mod.rs @@ -206,7 +206,7 @@ impl Video { Entry::Occupied(occupied_entry) => occupied_entry.into_mut(), Entry::Vacant(vacant_entry) => { let new_decoder = decoder::new_video_decoder( - self.debug_name.clone(), + &self.debug_name, render_context, self.data.clone(), self.decode_hw_acceleration, From c376098b1a25a4eaf0b876110402d7dc5647506b Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Mon, 7 Oct 2024 11:58:10 +0200 Subject: [PATCH 57/61] Disable video playback in debug builds --- Cargo.toml | 4 ---- crates/viewer/re_renderer/src/video/decoder/mod.rs | 6 +++++- crates/viewer/re_renderer/src/video/mod.rs | 5 +++++ 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index aa8747386c2f..164949583d4c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -311,10 +311,6 @@ zip = { version = "0.6", default-features = false } opt-level = 1 # Make debug builds run faster [profile.dev.package.re_video] opt-level = 2 # Speed up CPU-side chroma-upsampling (TODO(#7298): move to GPU) -[profile.dev.package.rav1d] -opt-level = 2 # Speed up AV1 video decoding. TODO(emilk): this doesn't work. rav1d is dog slow in dev builds. -[profile.dev.package.wgpu] -opt-level = 2 # Speed up copying video textures # panic = "abort" leads to better optimizations and smaller binaries (and is the default in Wasm anyways), # but it also means backtraces don't work with the `backtrace` library (https://github.com/rust-lang/backtrace-rs/issues/397). diff --git a/crates/viewer/re_renderer/src/video/decoder/mod.rs b/crates/viewer/re_renderer/src/video/decoder/mod.rs index a757fe7eb27e..990a6466c1e6 100644 --- a/crates/viewer/re_renderer/src/video/decoder/mod.rs +++ b/crates/viewer/re_renderer/src/video/decoder/mod.rs @@ -50,7 +50,11 @@ pub fn new_video_decoder( if #[cfg(target_arch = "wasm32")] { let decoder = web::WebVideoDecoder::new(render_context, data, hw_acceleration)?; } else if #[cfg(feature = "video_av1")] { - let decoder = native_av1::Av1VideoDecoder::new(debug_name, render_context, data)?; + let decoder = if cfg!(debug_assertions) { + return Err(DecodingError::NoNativeDebug); // because debug builds of rav1d are so slow + } else { + native_av1::Av1VideoDecoder::new(debug_name, render_context, data)? + }; } else { let decoder = no_native_decoder::NoNativeVideoDecoder::default(); } diff --git a/crates/viewer/re_renderer/src/video/mod.rs b/crates/viewer/re_renderer/src/video/mod.rs index bd1ff735c216..628d51ee9bba 100644 --- a/crates/viewer/re_renderer/src/video/mod.rs +++ b/crates/viewer/re_renderer/src/video/mod.rs @@ -55,6 +55,11 @@ pub enum DecodingError { #[cfg(feature = "video_av1")] #[error("Unsupported codec: {codec:?}. Only AV1 is currently supported on native.")] UnsupportedCodec { codec: String }, + + #[cfg(not(target_arch = "wasm32"))] + #[cfg(feature = "video_av1")] + #[error("Video decoding not supported in native debug builds.")] + NoNativeDebug, } pub type FrameDecodingResult = Result; From e5a416df877f8e7a3c2e4522ce6a4d66d0ed8928 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Mon, 7 Oct 2024 12:00:47 +0200 Subject: [PATCH 58/61] Change atomic `Ordering`, and add comments --- crates/store/re_video/src/decode/av1.rs | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/crates/store/re_video/src/decode/av1.rs b/crates/store/re_video/src/decode/av1.rs index 4073b144b4d2..f7a037edff47 100644 --- a/crates/store/re_video/src/decode/av1.rs +++ b/crates/store/re_video/src/decode/av1.rs @@ -104,9 +104,13 @@ impl Decoder { // NOTE: The interface is all `&mut self` to avoid certain types of races. pub fn reset(&mut self) { re_tracing::profile_function!(); + + // Increment resets first… self.comms .num_outstanding_resets - .fetch_add(1, Ordering::SeqCst); + .fetch_add(1, Ordering::Release); + + // …so it is visible on the decoder thread when it gets the `Reset` command. self.command_tx.send(Command::Reset).ok(); } @@ -123,8 +127,13 @@ impl Decoder { impl Drop for Decoder { fn drop(&mut self) { re_tracing::profile_function!(); - self.comms.should_stop.store(true, Ordering::SeqCst); + + // Set `should_stop` first… + self.comms.should_stop.store(true, Ordering::Release); + + // …so it is visible on the decoder thread when it gets the `Stop` command. self.command_tx.send(Command::Stop).ok(); + // NOTE: we don't block here. The decoder thread will finish soon enough. } } @@ -153,13 +162,13 @@ fn decoder_thread(comms: &Comms, command_rx: &Receiver, on_output: &Out }; while let Ok(command) = command_rx.recv() { - if comms.should_stop.load(Ordering::SeqCst) { + if comms.should_stop.load(Ordering::Acquire) { re_log::debug!("Should stop"); return; } // If we're waiting for a reset we should ignore all other commands until we receive it. - let has_outstanding_reset = 0 < comms.num_outstanding_resets.load(Ordering::SeqCst); + let has_outstanding_reset = 0 < comms.num_outstanding_resets.load(Ordering::Acquire); match command { Command::Chunk(chunk) => { @@ -181,7 +190,7 @@ fn decoder_thread(comms: &Comms, command_rx: &Receiver, on_output: &Out debug_assert!(matches!(decoder.get_picture(), Err(dav1d::Error::Again)), "There should be no pending pictures, since we output them directly after submitting a chunk."); - comms.num_outstanding_resets.fetch_sub(1, Ordering::SeqCst); + comms.num_outstanding_resets.fetch_sub(1, Ordering::Release); } Command::Stop => { re_log::debug!("Stop"); From 9ad20e898d9e94a14acf6551a066f2a1f70c8b13 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Mon, 7 Oct 2024 12:07:05 +0200 Subject: [PATCH 59/61] Update demux code from `main` --- crates/store/re_video/src/demux/mod.rs | 32 +++++++---------------- crates/store/re_video/src/demux/mp4.rs | 36 -------------------------- 2 files changed, 10 insertions(+), 58 deletions(-) diff --git a/crates/store/re_video/src/demux/mod.rs b/crates/store/re_video/src/demux/mod.rs index b159bf3a3038..ce2f7e5abdb1 100644 --- a/crates/store/re_video/src/demux/mod.rs +++ b/crates/store/re_video/src/demux/mod.rs @@ -52,28 +52,16 @@ impl VideoData { /// /// TODO(andreas, jan): This should not copy the data, but instead store slices into a shared buffer. /// at the very least the should be a way to extract only metadata. - pub fn load_from_bytes(data: &[u8], media_type: Option<&str>) -> Result { - // Media type guessing here should be identical to `re_types::MediaType::guess_from_data`, - // but we don't want to depend on `re_types` here. - let media_type = if let Some(media_type) = media_type { - media_type.to_owned() - } else if mp4::is_mp4(data) { - "video/mp4".to_owned() - } else { - return Err(VideoLoadError::UnrecognizedVideoFormat { - provided_media_type: media_type.map(|m| m.to_owned()), - }); - }; - - match media_type.as_str() { + pub fn load_from_bytes(data: &[u8], media_type: &str) -> Result { + match media_type { "video/mp4" => mp4::load_mp4(data), media_type => { if media_type.starts_with("video/") { - Err(VideoLoadError::UnsupportedMediaType { + Err(VideoLoadError::UnsupportedMimeType { provided_or_detected_media_type: media_type.to_owned(), }) } else { - Err(VideoLoadError::MediaTypeIsNotAVideo { + Err(VideoLoadError::MimeTypeIsNotAVideo { provided_or_detected_media_type: media_type.to_owned(), }) } @@ -233,18 +221,18 @@ pub enum VideoLoadError { InvalidSamples, #[error("The media type of the blob is not a video: {provided_or_detected_media_type}")] - MediaTypeIsNotAVideo { + MimeTypeIsNotAVideo { provided_or_detected_media_type: String, }, - #[error("Video file has unsupported media type {provided_or_detected_media_type}")] - UnsupportedMediaType { + #[error("MIME type '{provided_or_detected_media_type}' is not supported for videos")] + UnsupportedMimeType { provided_or_detected_media_type: String, }, - // Technically this is a "failed to detect" case, but the only formats we detect as of writing are the ones we support. - #[error("Video file has unsupported format")] - UnrecognizedVideoFormat { provided_media_type: Option }, + /// Not used in `re_video` itself, but useful for media type detection ahead of calling [`VideoData::load_from_bytes`]. + #[error("Could not detect MIME type from the video contents")] + UnrecognizedMimeType, // `FourCC`'s debug impl doesn't quote the result #[error("Video track uses unsupported codec \"{0}\"")] // NOLINT diff --git a/crates/store/re_video/src/demux/mp4.rs b/crates/store/re_video/src/demux/mp4.rs index 3361a2e70419..04721da582ba 100644 --- a/crates/store/re_video/src/demux/mp4.rs +++ b/crates/store/re_video/src/demux/mp4.rs @@ -93,39 +93,3 @@ fn unknown_codec_fourcc(mp4: &re_mp4::Mp4, track: &re_mp4::Track) -> re_mp4::Fou _ => Default::default(), } } - -/// Returns whether a buffer is MP4 video data. -/// -/// From `infer` crate. -pub fn is_mp4(buf: &[u8]) -> bool { - buf.len() > 11 - && (buf[4] == b'f' && buf[5] == b't' && buf[6] == b'y' && buf[7] == b'p') - && ((buf[8] == b'a' && buf[9] == b'v' && buf[10] == b'c' && buf[11] == b'1') - || (buf[8] == b'd' && buf[9] == b'a' && buf[10] == b's' && buf[11] == b'h') - || (buf[8] == b'i' && buf[9] == b's' && buf[10] == b'o' && buf[11] == b'2') - || (buf[8] == b'i' && buf[9] == b's' && buf[10] == b'o' && buf[11] == b'3') - || (buf[8] == b'i' && buf[9] == b's' && buf[10] == b'o' && buf[11] == b'4') - || (buf[8] == b'i' && buf[9] == b's' && buf[10] == b'o' && buf[11] == b'5') - || (buf[8] == b'i' && buf[9] == b's' && buf[10] == b'o' && buf[11] == b'6') - || (buf[8] == b'i' && buf[9] == b's' && buf[10] == b'o' && buf[11] == b'm') - || (buf[8] == b'm' && buf[9] == b'm' && buf[10] == b'p' && buf[11] == b'4') - || (buf[8] == b'm' && buf[9] == b'p' && buf[10] == b'4' && buf[11] == b'1') - || (buf[8] == b'm' && buf[9] == b'p' && buf[10] == b'4' && buf[11] == b'2') - || (buf[8] == b'm' && buf[9] == b'p' && buf[10] == b'4' && buf[11] == b'v') - || (buf[8] == b'm' && buf[9] == b'p' && buf[10] == b'7' && buf[11] == b'1') - || (buf[8] == b'M' && buf[9] == b'S' && buf[10] == b'N' && buf[11] == b'V') - || (buf[8] == b'N' && buf[9] == b'D' && buf[10] == b'A' && buf[11] == b'S') - || (buf[8] == b'N' && buf[9] == b'D' && buf[10] == b'S' && buf[11] == b'C') - || (buf[8] == b'N' && buf[9] == b'S' && buf[10] == b'D' && buf[11] == b'C') - || (buf[8] == b'N' && buf[9] == b'D' && buf[10] == b'S' && buf[11] == b'H') - || (buf[8] == b'N' && buf[9] == b'D' && buf[10] == b'S' && buf[11] == b'M') - || (buf[8] == b'N' && buf[9] == b'D' && buf[10] == b'S' && buf[11] == b'P') - || (buf[8] == b'N' && buf[9] == b'D' && buf[10] == b'S' && buf[11] == b'S') - || (buf[8] == b'N' && buf[9] == b'D' && buf[10] == b'X' && buf[11] == b'C') - || (buf[8] == b'N' && buf[9] == b'D' && buf[10] == b'X' && buf[11] == b'H') - || (buf[8] == b'N' && buf[9] == b'D' && buf[10] == b'X' && buf[11] == b'M') - || (buf[8] == b'N' && buf[9] == b'D' && buf[10] == b'X' && buf[11] == b'P') - || (buf[8] == b'N' && buf[9] == b'D' && buf[10] == b'X' && buf[11] == b'S') - || (buf[8] == b'F' && buf[9] == b'4' && buf[10] == b'V' && buf[11] == b' ') - || (buf[8] == b'F' && buf[9] == b'4' && buf[10] == b'P' && buf[11] == b' ')) -} From 16f8d9532c6987fc49a01f93e61211e7cc5b793a Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Mon, 7 Oct 2024 12:13:46 +0200 Subject: [PATCH 60/61] Comment on dav1d settings --- crates/store/re_video/src/decode/av1.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/crates/store/re_video/src/decode/av1.rs b/crates/store/re_video/src/decode/av1.rs index f7a037edff47..44dc2a2203a3 100644 --- a/crates/store/re_video/src/decode/av1.rs +++ b/crates/store/re_video/src/decode/av1.rs @@ -143,8 +143,13 @@ type OutputCallback = dyn Fn(Result) + Send + Sync; fn create_decoder() -> Result { re_tracing::profile_function!(); + // See https://videolan.videolan.me/dav1d/structDav1dSettings.html for settings docs let mut settings = dav1d::Settings::new(); + + // Prioritize delivering video frames, not error messages. settings.set_strict_std_compliance(false); + + // Set to 1 for low-latency decoding. settings.set_max_frame_delay(1); dav1d::Decoder::with_settings(&settings) From 4ec11fa9ee5439ffa13199989231521a25cc0c2a Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Mon, 7 Oct 2024 12:24:47 +0200 Subject: [PATCH 61/61] Fix web build --- crates/store/re_video/src/decode/mod.rs | 1 + crates/store/re_video/src/lib.rs | 1 + 2 files changed, 2 insertions(+) diff --git a/crates/store/re_video/src/decode/mod.rs b/crates/store/re_video/src/decode/mod.rs index 8c82454296e0..3fa0da48803e 100644 --- a/crates/store/re_video/src/decode/mod.rs +++ b/crates/store/re_video/src/decode/mod.rs @@ -1,6 +1,7 @@ //! Video frame decoding. #[cfg(feature = "av1")] +#[cfg(not(target_arch = "wasm32"))] pub mod av1; use crate::Time; diff --git a/crates/store/re_video/src/lib.rs b/crates/store/re_video/src/lib.rs index aaf89b68eae9..c0a600738310 100644 --- a/crates/store/re_video/src/lib.rs +++ b/crates/store/re_video/src/lib.rs @@ -8,6 +8,7 @@ pub use demux::{Config, Sample, VideoData, VideoLoadError}; pub use re_mp4::{TrackId, TrackKind}; #[cfg(feature = "av1")] +#[cfg(not(target_arch = "wasm32"))] pub use decode::av1; use ordered_float::OrderedFloat;