From 9cb340b194c8d7edd26d2630e41c14ea3899bd9f Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Thu, 8 Aug 2024 21:26:04 -0400 Subject: [PATCH] debug video error --- Cargo.lock | 224 +++++++++++++++--- crates/lib/files/videos/Cargo.toml | 5 + crates/lib/files/videos/src/get_mp4_info.rs | 8 - .../videos/src/get_mp4_info_symphonia.rs | 61 +++++ crates/lib/files/videos/src/lib.rs | 3 +- .../upload_new_video_media_file_handler.rs | 25 +- 6 files changed, 271 insertions(+), 55 deletions(-) create mode 100644 crates/lib/files/videos/src/get_mp4_info_symphonia.rs diff --git a/Cargo.lock b/Cargo.lock index e40ef0a406..f87f0189c1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2524,6 +2524,12 @@ dependencies = [ "zune-inflate", ] +[[package]] +name = "extended" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af9673d8203fcb076b19dfd17e38b3d4ae9f44959416ea532ce72415a6020365" + [[package]] name = "fastrand" version = "1.9.0" @@ -4165,7 +4171,7 @@ dependencies = [ "errors", "log", "my-workspace-hack", - "symphonia", + "symphonia 0.5.0", ] [[package]] @@ -6996,7 +7002,7 @@ dependencies = [ "sqlx", "strum", "strum_macros", - "symphonia", + "symphonia 0.5.0", "thumbnail_generator", "time", "tokens", @@ -7120,19 +7126,38 @@ version = "0.5.0" source = "git+https://github.com/pdeljanov/Symphonia.git?rev=e1a70095c4409478c1ded499fb8dd4afa540fb90#e1a70095c4409478c1ded499fb8dd4afa540fb90" dependencies = [ "lazy_static", - "symphonia-bundle-flac", + "symphonia-bundle-flac 0.5.0", "symphonia-bundle-mp3", "symphonia-codec-aac", "symphonia-codec-alac", "symphonia-codec-opus", - "symphonia-codec-pcm", - "symphonia-codec-vorbis", - "symphonia-core", - "symphonia-format-isomp4", - "symphonia-format-mkv", - "symphonia-format-ogg", + "symphonia-codec-pcm 0.5.0", + "symphonia-codec-vorbis 0.5.0", + "symphonia-core 0.5.0", + "symphonia-format-isomp4 0.5.0", + "symphonia-format-mkv 0.5.0", + "symphonia-format-ogg 0.5.0", "symphonia-format-wav", - "symphonia-metadata", + "symphonia-metadata 0.5.0", +] + +[[package]] +name = "symphonia" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "815c942ae7ee74737bb00f965fa5b5a2ac2ce7b6c01c0cc169bbeaf7abd5f5a9" +dependencies = [ + "lazy_static", + "symphonia-bundle-flac 0.5.4", + "symphonia-codec-adpcm", + "symphonia-codec-pcm 0.5.4", + "symphonia-codec-vorbis 0.5.4", + "symphonia-core 0.5.4", + "symphonia-format-isomp4 0.5.4", + "symphonia-format-mkv 0.5.4", + "symphonia-format-ogg 0.5.4", + "symphonia-format-riff", + "symphonia-metadata 0.5.4", ] [[package]] @@ -7141,9 +7166,21 @@ version = "0.5.0" source = "git+https://github.com/pdeljanov/Symphonia.git?rev=e1a70095c4409478c1ded499fb8dd4afa540fb90#e1a70095c4409478c1ded499fb8dd4afa540fb90" dependencies = [ "log", - "symphonia-core", - "symphonia-metadata", - "symphonia-utils-xiph", + "symphonia-core 0.5.0", + "symphonia-metadata 0.5.0", + "symphonia-utils-xiph 0.5.0", +] + +[[package]] +name = "symphonia-bundle-flac" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72e34f34298a7308d4397a6c7fbf5b84c5d491231ce3dd379707ba673ab3bd97" +dependencies = [ + "log", + "symphonia-core 0.5.4", + "symphonia-metadata 0.5.4", + "symphonia-utils-xiph 0.5.4", ] [[package]] @@ -7154,8 +7191,8 @@ dependencies = [ "bitflags 1.3.2", "lazy_static", "log", - "symphonia-core", - "symphonia-metadata", + "symphonia-core 0.5.0", + "symphonia-metadata 0.5.0", ] [[package]] @@ -7165,7 +7202,17 @@ source = "git+https://github.com/pdeljanov/Symphonia.git?rev=e1a70095c4409478c1d dependencies = [ "lazy_static", "log", - "symphonia-core", + "symphonia-core 0.5.0", +] + +[[package]] +name = "symphonia-codec-adpcm" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c94e1feac3327cd616e973d5be69ad36b3945f16b06f19c6773fc3ac0b426a0f" +dependencies = [ + "log", + "symphonia-core 0.5.4", ] [[package]] @@ -7174,7 +7221,7 @@ version = "0.5.0" source = "git+https://github.com/pdeljanov/Symphonia.git?rev=e1a70095c4409478c1ded499fb8dd4afa540fb90#e1a70095c4409478c1ded499fb8dd4afa540fb90" dependencies = [ "log", - "symphonia-core", + "symphonia-core 0.5.0", ] [[package]] @@ -7183,7 +7230,7 @@ version = "0.0.1" source = "git+https://github.com/pdeljanov/Symphonia.git?rev=e1a70095c4409478c1ded499fb8dd4afa540fb90#e1a70095c4409478c1ded499fb8dd4afa540fb90" dependencies = [ "log", - "symphonia-core", + "symphonia-core 0.5.0", ] [[package]] @@ -7192,7 +7239,17 @@ version = "0.5.0" source = "git+https://github.com/pdeljanov/Symphonia.git?rev=e1a70095c4409478c1ded499fb8dd4afa540fb90#e1a70095c4409478c1ded499fb8dd4afa540fb90" dependencies = [ "log", - "symphonia-core", + "symphonia-core 0.5.0", +] + +[[package]] +name = "symphonia-codec-pcm" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f395a67057c2ebc5e84d7bb1be71cce1a7ba99f64e0f0f0e303a03f79116f89b" +dependencies = [ + "log", + "symphonia-core 0.5.4", ] [[package]] @@ -7201,8 +7258,19 @@ version = "0.5.0" source = "git+https://github.com/pdeljanov/Symphonia.git?rev=e1a70095c4409478c1ded499fb8dd4afa540fb90#e1a70095c4409478c1ded499fb8dd4afa540fb90" dependencies = [ "log", - "symphonia-core", - "symphonia-utils-xiph", + "symphonia-core 0.5.0", + "symphonia-utils-xiph 0.5.0", +] + +[[package]] +name = "symphonia-codec-vorbis" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a98765fb46a0a6732b007f7e2870c2129b6f78d87db7987e6533c8f164a9f30" +dependencies = [ + "log", + "symphonia-core 0.5.4", + "symphonia-utils-xiph 0.5.4", ] [[package]] @@ -7217,6 +7285,19 @@ dependencies = [ "log", ] +[[package]] +name = "symphonia-core" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "798306779e3dc7d5231bd5691f5a813496dc79d3f56bf82e25789f2094e022c3" +dependencies = [ + "arrayvec", + "bitflags 1.3.2", + "bytemuck", + "lazy_static", + "log", +] + [[package]] name = "symphonia-format-isomp4" version = "0.5.0" @@ -7224,9 +7305,22 @@ source = "git+https://github.com/pdeljanov/Symphonia.git?rev=e1a70095c4409478c1d dependencies = [ "encoding_rs", "log", - "symphonia-core", - "symphonia-metadata", - "symphonia-utils-xiph", + "symphonia-core 0.5.0", + "symphonia-metadata 0.5.0", + "symphonia-utils-xiph 0.5.0", +] + +[[package]] +name = "symphonia-format-isomp4" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abfdf178d697e50ce1e5d9b982ba1b94c47218e03ec35022d9f0e071a16dc844" +dependencies = [ + "encoding_rs", + "log", + "symphonia-core 0.5.4", + "symphonia-metadata 0.5.4", + "symphonia-utils-xiph 0.5.4", ] [[package]] @@ -7236,9 +7330,22 @@ source = "git+https://github.com/pdeljanov/Symphonia.git?rev=e1a70095c4409478c1d dependencies = [ "lazy_static", "log", - "symphonia-core", - "symphonia-metadata", - "symphonia-utils-xiph", + "symphonia-core 0.5.0", + "symphonia-metadata 0.5.0", + "symphonia-utils-xiph 0.5.0", +] + +[[package]] +name = "symphonia-format-mkv" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bb43471a100f7882dc9937395bd5ebee8329298e766250b15b3875652fe3d6f" +dependencies = [ + "lazy_static", + "log", + "symphonia-core 0.5.4", + "symphonia-metadata 0.5.4", + "symphonia-utils-xiph 0.5.4", ] [[package]] @@ -7247,9 +7354,33 @@ version = "0.5.0" source = "git+https://github.com/pdeljanov/Symphonia.git?rev=e1a70095c4409478c1ded499fb8dd4afa540fb90#e1a70095c4409478c1ded499fb8dd4afa540fb90" dependencies = [ "log", - "symphonia-core", - "symphonia-metadata", - "symphonia-utils-xiph", + "symphonia-core 0.5.0", + "symphonia-metadata 0.5.0", + "symphonia-utils-xiph 0.5.0", +] + +[[package]] +name = "symphonia-format-ogg" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ada3505789516bcf00fc1157c67729eded428b455c27ca370e41f4d785bfa931" +dependencies = [ + "log", + "symphonia-core 0.5.4", + "symphonia-metadata 0.5.4", + "symphonia-utils-xiph 0.5.4", +] + +[[package]] +name = "symphonia-format-riff" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f7be232f962f937f4b7115cbe62c330929345434c834359425e043bfd15f50" +dependencies = [ + "extended", + "log", + "symphonia-core 0.5.4", + "symphonia-metadata 0.5.4", ] [[package]] @@ -7258,8 +7389,8 @@ version = "0.5.0" source = "git+https://github.com/pdeljanov/Symphonia.git?rev=e1a70095c4409478c1ded499fb8dd4afa540fb90#e1a70095c4409478c1ded499fb8dd4afa540fb90" dependencies = [ "log", - "symphonia-core", - "symphonia-metadata", + "symphonia-core 0.5.0", + "symphonia-metadata 0.5.0", ] [[package]] @@ -7270,7 +7401,19 @@ dependencies = [ "encoding_rs", "lazy_static", "log", - "symphonia-core", + "symphonia-core 0.5.0", +] + +[[package]] +name = "symphonia-metadata" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc622b9841a10089c5b18e99eb904f4341615d5aa55bbf4eedde1be721a4023c" +dependencies = [ + "encoding_rs", + "lazy_static", + "log", + "symphonia-core 0.5.4", ] [[package]] @@ -7278,8 +7421,18 @@ name = "symphonia-utils-xiph" version = "0.5.0" source = "git+https://github.com/pdeljanov/Symphonia.git?rev=e1a70095c4409478c1ded499fb8dd4afa540fb90#e1a70095c4409478c1ded499fb8dd4afa540fb90" dependencies = [ - "symphonia-core", - "symphonia-metadata", + "symphonia-core 0.5.0", + "symphonia-metadata 0.5.0", +] + +[[package]] +name = "symphonia-utils-xiph" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "484472580fa49991afda5f6550ece662237b00c6f562c7d9638d1b086ed010fe" +dependencies = [ + "symphonia-core 0.5.4", + "symphonia-metadata 0.5.4", ] [[package]] @@ -8226,6 +8379,7 @@ dependencies = [ "log", "mp4", "my-workspace-hack", + "symphonia 0.5.4", "testing", ] diff --git a/crates/lib/files/videos/Cargo.toml b/crates/lib/files/videos/Cargo.toml index f287783cb3..46fdabbff7 100644 --- a/crates/lib/files/videos/Cargo.toml +++ b/crates/lib/files/videos/Cargo.toml @@ -27,7 +27,12 @@ my-workspace-hack = { version = "0.1", path = "../../../my-workspace-hack" } # External ffprobe = "0.4.0" log = "0.4.20" +symphonia = { version = "0.5.4", features = ["isomp4"] } + +# TODO(bt,2024-08-08): We might drop `mp4` crate because it crashes on reading +# some videos with the message "avcc not found" mp4 = "0.14.0" + [dev-dependencies] testing = { path = "../../testing" } diff --git a/crates/lib/files/videos/src/get_mp4_info.rs b/crates/lib/files/videos/src/get_mp4_info.rs index 11bd2f60fc..de22727a8a 100644 --- a/crates/lib/files/videos/src/get_mp4_info.rs +++ b/crates/lib/files/videos/src/get_mp4_info.rs @@ -69,19 +69,11 @@ pub fn get_mp4_info(reader: T, file_size: u64) -> AnyhowResult PathBuf { - // https://doc.rust-lang.org/cargo/reference/environment-variables.html - let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); - path.push(format!("../../../{}", path_from_repo_root)); - path - } - #[test] pub fn test_decode_mp4() { let filename = test_file_path("test_data/video/mp4/golden_sun_garoh.mp4") diff --git a/crates/lib/files/videos/src/get_mp4_info_symphonia.rs b/crates/lib/files/videos/src/get_mp4_info_symphonia.rs new file mode 100644 index 0000000000..96e7e1a62b --- /dev/null +++ b/crates/lib/files/videos/src/get_mp4_info_symphonia.rs @@ -0,0 +1,61 @@ +/* +use std::io::{Read, Seek}; +use std::time::Duration; +use log::warn; +use mp4::TrackType; +use symphonia::core::codecs::{CODEC_TYPE_NULL, DecoderOptions}; +use symphonia::core::formats::FormatOptions; +use symphonia::core::io::{MediaSource, MediaSourceStream}; +use symphonia::core::meta::MetadataOptions; +use symphonia::core::probe::Hint; +use errors::{anyhow, AnyhowResult}; +use crate::get_mp4_info::Mp4Info; + +pub fn get_mp4_info_symphonia(media_source: Box) -> AnyhowResult { + let mss = MediaSourceStream::new(media_source, Default::default()); + + let mut hint = Hint::new(); + hint.with_extension("mp4"); + + // Use the default options for metadata and format readers. + let meta_opts: MetadataOptions = Default::default(); + let fmt_opts: FormatOptions = Default::default(); + + // Probe the media source. + let probed = symphonia::default::get_probe() + .format(&hint, mss, &fmt_opts, &meta_opts) + .expect("unsupported format"); + + // Get the instantiated format reader. + let mut format = probed.format; + + format.metadata(); + + // Find the first audio track with a known (decodeable) codec. + let track = format + .tracks() + .iter() + .find(|t| t.codec_params.codec != CODEC_TYPE_NULL) + .ok_or_else(|| anyhow!("no supported audio tracks"))?; + + // Use the default options for the decoder. + let dec_opts: DecoderOptions = Default::default(); + + // Create a decoder for the track. + let mut decoder = symphonia::default::get_codecs() + .make(&track.codec_params, &dec_opts)?; + + // Store the track identifier, it will be used to filter packets. + let track_id = track.id; + + + + + Ok(Mp4Info { + framerate, + duration_millis: mp4.duration().as_millis(), + width, + height, + }) +} +*/ \ No newline at end of file diff --git a/crates/lib/files/videos/src/lib.rs b/crates/lib/files/videos/src/lib.rs index 5d35240395..3fce53bc8c 100644 --- a/crates/lib/files/videos/src/lib.rs +++ b/crates/lib/files/videos/src/lib.rs @@ -19,4 +19,5 @@ #![allow(non_snake_case)] pub mod ffprobe_get_dimensions; -pub mod get_mp4_info; \ No newline at end of file +pub mod get_mp4_info; +pub mod get_mp4_info_symphonia; \ No newline at end of file diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_new_video_media_file_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_new_video_media_file_handler.rs index c45b62a53c..d3ec903f46 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_new_video_media_file_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_new_video_media_file_handler.rs @@ -203,6 +203,20 @@ pub async fn upload_new_video_media_file_handler( // ==================== FILE VALIDATION ==================== // + info!("temporary file location: {:?}", form.file.file.path()); + + match ffprobe_get_dimensions(form.file.file.path()) { + Err(err) => { + warn!("Error reading video dimensions with ffprobe: {:?}", err); + } + Ok(Some(dims)) => { + info!("Video dimensions: {}x{}", dims.width, dims.height); + } + Ok(None) => { + warn!("No video dimensions found"); + } + } + let mut file_bytes = Vec::new(); form.file.file.read_to_end(&mut file_bytes) .map_err(|e| { @@ -229,17 +243,6 @@ pub async fn upload_new_video_media_file_handler( // ==================== DURATION DETECTION ==================== // - match ffprobe_get_dimensions(form.file.file.path()) { - Err(err) => { - warn!("Error reading video dimensions with ffprobe: {:?}", err); - } - Ok(Some(dims)) => { - info!("Video dimensions: {}x{}", dims.width, dims.height); - } - Ok(None) => { - warn!("No video dimensions found"); - } - } let mp4_info = get_mp4_info_for_bytes(file_bytes.as_ref()) .map_err(|err| {