diff options
author | metamuffin <metamuffin@disroot.org> | 2023-01-13 18:06:11 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2023-01-13 18:06:11 +0100 |
commit | 8fc4b9792044d82e729e8b4ef993c6391d711c5b (patch) | |
tree | ad69a04a83e876dce4ebb15513c69fad757483d8 | |
parent | b192ec740d358d0e12eedd1308d006e080b3d8c2 (diff) | |
download | jellything-8fc4b9792044d82e729e8b4ef993c6391d711c5b.tar jellything-8fc4b9792044d82e729e8b4ef993c6391d711c5b.tar.bz2 jellything-8fc4b9792044d82e729e8b4ef993c6391d711c5b.tar.zst |
started writing a proc_macro now
-rw-r--r-- | Cargo.lock | 16 | ||||
-rw-r--r-- | Cargo.toml | 2 | ||||
-rw-r--r-- | ebml/Cargo.toml | 3 | ||||
-rw-r--r-- | ebml/src/bin/experiment.rs | 3 | ||||
-rw-r--r-- | ebml/src/lib.rs (renamed from ebml/src/mod.rs) | 3 | ||||
-rw-r--r-- | ebml/src/matroska.rs | 6 | ||||
-rw-r--r-- | ebml/src/read.rs | 3 | ||||
-rw-r--r-- | ebml_derive/src/lib.rs | 63 | ||||
-rw-r--r-- | ebml_derive/src/main.rs | 6 | ||||
-rw-r--r-- | remuxer/Cargo.toml | 3 | ||||
-rw-r--r-- | remuxer/src/lib.rs | 135 | ||||
-rw-r--r-- | server/src/main.rs | 2 |
12 files changed, 156 insertions, 89 deletions
@@ -350,6 +350,16 @@ dependencies = [ ] [[package]] +name = "ebml" +version = "0.1.0" +dependencies = [ + "anyhow", + "ebml_derive", + "env_logger", + "log", +] + +[[package]] name = "ebml-iterable" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -381,6 +391,10 @@ dependencies = [ [[package]] name = "ebml_derive" version = "0.1.0" +dependencies = [ + "quote", + "syn", +] [[package]] name = "either" @@ -830,11 +844,9 @@ name = "jellyremuxer" version = "0.1.0" dependencies = [ "anyhow", - "env_logger", "jellycommon", "log", "tokio", - "webm-iterable", ] [[package]] @@ -1,2 +1,2 @@ [workspace] -members = ["server", "remuxer", "common", "tools", "remuxer/ebml_derive"] +members = ["server", "remuxer", "common", "tools", "ebml", "ebml_derive"] diff --git a/ebml/Cargo.toml b/ebml/Cargo.toml index b01d4a3..ec58cc4 100644 --- a/ebml/Cargo.toml +++ b/ebml/Cargo.toml @@ -5,3 +5,6 @@ edition = "2021" [dependencies] ebml_derive = { path = "../ebml_derive" } +anyhow = "1.0.68" +log = "0.4.17" +env_logger = "0.10.0" diff --git a/ebml/src/bin/experiment.rs b/ebml/src/bin/experiment.rs index 7d8cede..d332b41 100644 --- a/ebml/src/bin/experiment.rs +++ b/ebml/src/bin/experiment.rs @@ -1,6 +1,5 @@ use std::fs::File; - -use jellyremuxer::format::matroska::read::EbmlReader; +use ebml::read::EbmlReader; fn main() { env_logger::init_from_env("LOG"); diff --git a/ebml/src/mod.rs b/ebml/src/lib.rs index 5da6809..116b8e2 100644 --- a/ebml/src/mod.rs +++ b/ebml/src/lib.rs @@ -1,4 +1,4 @@ -use crate::format::matroska::read::EbmlSize; +use crate::read::EbmlSize; use self::read::EbmlReader; use anyhow::{bail, Result}; @@ -6,6 +6,7 @@ use log::debug; pub mod matroska; pub mod read; +pub mod write; #[derive(Debug, Clone)] pub enum Master { diff --git a/ebml/src/matroska.rs b/ebml/src/matroska.rs index f53a1e8..802ce6a 100644 --- a/ebml/src/matroska.rs +++ b/ebml/src/matroska.rs @@ -1,11 +1,10 @@ - - +use ebml_derive::define_ebml; define_ebml! { global Crc32[0xbf]: Binary, global Void[0xec]: Binary, - Ebml[0x1a45dfa3] { + Ebml[0x1a45dfa3]: { EbmlVersion[0x4286]: u64, EbmlReadVersion[0x42f7]: u64, EbmlMaxIdLength[0x42f2]: u64, @@ -19,6 +18,7 @@ define_ebml! { }, }, } + // #[id=0x18538067] Segment(Master), // #[id=0x1941A469] Segment/Attachments(Master), // #[id=0x61A7] Segment/Attachments/AttachedFile(Master), diff --git a/ebml/src/read.rs b/ebml/src/read.rs index 0ffb24c..9864ea5 100644 --- a/ebml/src/read.rs +++ b/ebml/src/read.rs @@ -2,9 +2,8 @@ use std::io::{Read, Seek}; use anyhow::{bail, Result}; use log::debug; -use webm_iterable::matroska_spec::MatroskaSpec; -use crate::format::matroska::{Master, MatroskaTag}; +// use crate::matroska::{Master, MatroskaTag}; trait ReadAndSeek: Read + Seek {} impl<T: Read + Seek> ReadAndSeek for T {} diff --git a/ebml_derive/src/lib.rs b/ebml_derive/src/lib.rs new file mode 100644 index 0000000..2c9dd9c --- /dev/null +++ b/ebml_derive/src/lib.rs @@ -0,0 +1,63 @@ +use proc_macro::{Delimiter, TokenStream, TokenTree}; +use quote::quote; + +struct Tag { + id: u64, + path: Vec<String>, + name: String, + r#type: Option<String>, // None -> Master +} + +#[proc_macro] +pub fn define_ebml(ts: TokenStream) -> TokenStream { + let mut next_glob = false; + let mut ts = ts.into_iter(); + + let mut tags = vec![]; + + while let Some(t) = ts.next() { + match t { + TokenTree::Ident(ident) => { + let ident = ident.to_string(); + if &ident == "global" { + next_glob = true; + } else { + let glob = next_glob; + next_glob = false; + let id = if let Some(TokenTree::Group(gr)) = ts.next() { + assert_eq!(gr.delimiter(), Delimiter::Bracket); + let mut ts = gr.stream().into_iter(); + if let TokenTree::Literal(lit) = ts.next().unwrap() { + u64::from_str_radix(&lit.to_string()[2..], 16).unwrap() + } else { + panic!("literal expected") + } + } else { + panic!("group expected") + }; + if let Some(TokenTree::Punct(p)) = ts.next() { + assert_eq!(p.as_char(), ':') + } else { + panic!("colon expected") + } + match ts.next() { + Some(TokenTree::Group(_)) => {} + Some(TokenTree::Ident(ident)) => { + let r#type = ident.to_string(); + eprintln!("global={glob} id={id}, type={}", r#type); + + } + _ => panic!("group or ident expected"), + } + if let Some(TokenTree::Punct(p)) = ts.next() { + assert_eq!(p.as_char(), ',') + } else { + panic!("colon expected") + } + } + } + x => panic!("unexpected {x:?}"), + } + } + quote! {}.into() +} diff --git a/ebml_derive/src/main.rs b/ebml_derive/src/main.rs deleted file mode 100644 index ac0ea26..0000000 --- a/ebml_derive/src/main.rs +++ /dev/null @@ -1,6 +0,0 @@ - -#[proc_macro] -fn define_ebml(tt: TokenStream) { - -} - diff --git a/remuxer/Cargo.toml b/remuxer/Cargo.toml index e98b3f7..4327779 100644 --- a/remuxer/Cargo.toml +++ b/remuxer/Cargo.toml @@ -8,4 +8,5 @@ tokio = { version = "1.24.1", features = ["io-util"] } jellycommon = { path = "../common" } anyhow = "1.0.68" -env_logger = "0.10.0" +log = "0.4.17" + diff --git a/remuxer/src/lib.rs b/remuxer/src/lib.rs index aa22b3b..749e04f 100644 --- a/remuxer/src/lib.rs +++ b/remuxer/src/lib.rs @@ -1,10 +1,5 @@ use jellycommon::ItemInfo; -use log::{debug, info}; -use std::{fs::File, io::Write, path::PathBuf, sync::Arc}; -use webm_iterable::{ - matroska_spec::{Block, Master, MatroskaSpec}, - WebmIterator, WebmWriter, -}; +use std::{io::Write, path::PathBuf, sync::Arc}; pub struct RemuxerContext {} @@ -21,73 +16,73 @@ impl RemuxerContext { item: ItemInfo, selection: Vec<u64>, ) -> anyhow::Result<()> { - let source_path = path_base.join(item.source.path); - info!("remuxing {source_path:?} to have tracks {selection:?}"); - let mut input = File::open(source_path)?; + // let source_path = path_base.join(item.source.path); + // info!("remuxing {source_path:?} to have tracks {selection:?}"); + // let mut input = File::open(source_path)?; - let tags = WebmIterator::new(&mut input, &[MatroskaSpec::TrackEntry(Master::Start)]); - let mut output = WebmWriter::new(writer); + // let tags = WebmIterator::new(&mut input, &[MatroskaSpec::TrackEntry(Master::Start)]); + // let mut output = WebmWriter::new(writer); - let mut tscale = None; - let mut duration = None; - let mut ignore = false; + // let mut tscale = None; + // let mut duration = None; + // let mut ignore = false; - for tag in tags { - let tag = tag.unwrap(); - match tag { - MatroskaSpec::SeekHead(Master::Start) | MatroskaSpec::Cues(Master::Start) => { - ignore = true - } - MatroskaSpec::SeekHead(Master::End) | MatroskaSpec::Cues(Master::End) => { - ignore = false - } - MatroskaSpec::TrackEntry(master) => { - let children = master.get_children(); - let mut number = None; - for c in &children { - if let MatroskaSpec::TrackNumber(n) = c { - number = Some(*n) - } - } - let number = number.unwrap(); - if selection.contains(&number) { - output.write(&MatroskaSpec::TrackEntry(Master::Full(children)))?; - } - } - MatroskaSpec::Block(ref data) => { - let data: &[u8] = &data; - let block: Block = data.try_into()?; - if selection.contains(&block.track) { - output.write(&tag)?; - } - } - MatroskaSpec::SimpleBlock(ref data) => { - let data: &[u8] = &data; - let block: Block = data.try_into()?; - if selection.contains(&block.track) { - output.write(&tag)?; - } - } - MatroskaSpec::Info(Master::Start) => (), - MatroskaSpec::TimestampScale(n) => tscale = Some(n), - MatroskaSpec::Duration(n) => duration = Some(n), - MatroskaSpec::Info(Master::End) => { - output.write(&MatroskaSpec::Info(Master::Full(vec![ - MatroskaSpec::TimestampScale(tscale.unwrap()), - MatroskaSpec::Title(item.title.clone()), - MatroskaSpec::Duration(duration.unwrap()), - MatroskaSpec::MuxingApp("jellyremux".to_string()), - MatroskaSpec::WritingApp("jellything".to_string()), - ])))?; - } - x => { - if !ignore { - debug!("{x:?}"); - output.write(&x)?; - } - } - } - } + // for tag in tags { + // let tag = tag.unwrap(); + // match tag { + // MatroskaSpec::SeekHead(Master::Start) | MatroskaSpec::Cues(Master::Start) => { + // ignore = true + // } + // MatroskaSpec::SeekHead(Master::End) | MatroskaSpec::Cues(Master::End) => { + // ignore = false + // } + // MatroskaSpec::TrackEntry(master) => { + // let children = master.get_children(); + // let mut number = None; + // for c in &children { + // if let MatroskaSpec::TrackNumber(n) = c { + // number = Some(*n) + // } + // } + // let number = number.unwrap(); + // if selection.contains(&number) { + // output.write(&MatroskaSpec::TrackEntry(Master::Full(children)))?; + // } + // } + // MatroskaSpec::Block(ref data) => { + // let data: &[u8] = &data; + // let block: Block = data.try_into()?; + // if selection.contains(&block.track) { + // output.write(&tag)?; + // } + // } + // MatroskaSpec::SimpleBlock(ref data) => { + // let data: &[u8] = &data; + // let block: Block = data.try_into()?; + // if selection.contains(&block.track) { + // output.write(&tag)?; + // } + // } + // MatroskaSpec::Info(Master::Start) => (), + // MatroskaSpec::TimestampScale(n) => tscale = Some(n), + // MatroskaSpec::Duration(n) => duration = Some(n), + // MatroskaSpec::Info(Master::End) => { + // output.write(&MatroskaSpec::Info(Master::Full(vec![ + // MatroskaSpec::TimestampScale(tscale.unwrap()), + // MatroskaSpec::Title(item.title.clone()), + // MatroskaSpec::Duration(duration.unwrap()), + // MatroskaSpec::MuxingApp("jellyremux".to_string()), + // MatroskaSpec::WritingApp("jellything".to_string()), + // ])))?; + // } + // x => { + // if !ignore { + // debug!("{x:?}"); + // output.write(&x)?; + // } + // } + // } + // } Ok(()) } } diff --git a/server/src/main.rs b/server/src/main.rs index 6243b3f..edf562a 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -52,7 +52,7 @@ fn stream( tokio::task::spawn_blocking(move || { if let Err(e) = remuxer.generate_into( b, - offset, + 0, item.fs_path.parent().unwrap().to_path_buf(), item.data.clone(), selection, |