From 2a89943f45031278b9f032c3be16d3a21a67ccd5 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Thu, 7 Mar 2024 03:36:42 -0500 Subject: [PATCH] Mocap job: read video file dimensions --- Cargo.lock | 1 + crates/lib/files/videos/src/get_mp4_info.rs | 27 +++++++- crates/service/job/inference_job/Cargo.toml | 5 +- .../job_types/mocap/mocap_net/process_job.rs | 66 ++++++++++++++----- .../upload_video_media_file_handler.rs | 4 +- 5 files changed, 78 insertions(+), 25 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 70f3cb9a12..d6f1270264 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3241,6 +3241,7 @@ dependencies = [ "tokens", "tokio", "tts_common", + "videos", "walkdir", ] diff --git a/crates/lib/files/videos/src/get_mp4_info.rs b/crates/lib/files/videos/src/get_mp4_info.rs index 2a0327bf6c..11bd2f60fc 100644 --- a/crates/lib/files/videos/src/get_mp4_info.rs +++ b/crates/lib/files/videos/src/get_mp4_info.rs @@ -6,30 +6,47 @@ use mp4::TrackType; use errors::AnyhowResult; +#[derive(Debug, Clone)] pub struct Mp4Info { /// Framerate of the longest video track. pub framerate: f64, + /// Duration of the entire mp4. pub duration_millis: u128, + + /// Width of the longest video track. + pub width: u16, + + /// Height of the longest video track. + pub height: u16, } -pub fn get_mp4_info_for_bytes(file_bytes: &[u8], file_size: u64) -> AnyhowResult { +pub fn get_mp4_info_for_bytes(file_bytes: &[u8]) -> AnyhowResult { + get_mp4_info_for_bytes_and_len(file_bytes, file_bytes.len()) +} + +pub fn get_mp4_info_for_bytes_and_len(file_bytes: &[u8], file_size: usize) -> AnyhowResult { let reader = BufReader::new(Cursor::new(file_bytes)); - get_mp4_info(reader, file_size) + get_mp4_info(reader, file_size as u64) } pub fn get_mp4_info(reader: T, file_size: u64) -> AnyhowResult { let mp4 = mp4::Mp4Reader::read_header(reader, file_size)?; - let mut framerate = 0.0; let mut longest_duration = Duration::from_secs(0); + let mut framerate = 0.0; + let mut width = 0; + let mut height = 0; + for track in mp4.tracks().values() { match track.track_type() { Ok(TrackType::Video) => { if track.duration() > longest_duration { longest_duration = track.duration(); framerate = track.frame_rate(); + width = track.width(); + height = track.height(); } } Err(err) => { @@ -43,6 +60,8 @@ pub fn get_mp4_info(reader: T, file_size: u64) -> AnyhowResult) -> Result return Err(ProcessSingleJobError::Other(anyhow!("Mocap args not found"))), + Some(args) => args, + }; + + let mc_args = match poly_args { + Mc(args) => args, + _ => return Err(ProcessSingleJobError::Other(anyhow!("Mocap args not found"))), + }; + // ==================== TEMP DIR ==================== // let work_temp_dir = format!("temp_mocapnet_inference_{}", job.id.0); @@ -86,6 +106,22 @@ pub async fn process_job(args: MocapNetProcessJobArgs<'_>) -> Result) -> Result return Err(ProcessSingleJobError::Other(anyhow!("Mocap args not found"))), - Some(args) => args, - }; - - let mc_args = match poly_args { - Mc(args) => args, - _ => return Err(ProcessSingleJobError::Other(anyhow!("Mocap args not found"))), - }; - // ==================== RUN INFERENCE SCRIPT ==================== // let stderr_output_file = work_temp_dir.path().join("stderr.txt"); let inference_start_time = Instant::now(); @@ -130,8 +151,8 @@ pub async fn process_job(args: MocapNetProcessJobArgs<'_>) -> Result) -> Result Option { + let video_file = File::open(video_filename).ok()?; + let file_length = video_file.metadata().ok()?.len(); + let reader = BufReader::new(video_file); + let info = get_mp4_info(reader, file_length).ok()?; + Some(info) +} \ No newline at end of file diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload_video/upload_video_media_file_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload_video/upload_video_media_file_handler.rs index 3a01c23f09..6eac332b77 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload_video/upload_video_media_file_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload_video/upload_video_media_file_handler.rs @@ -18,7 +18,7 @@ use mimetypes::mimetype_to_extension::mimetype_to_extension; use mysql_queries::queries::idepotency_tokens::insert_idempotency_token::insert_idempotency_token; use mysql_queries::queries::media_files::create::insert_media_file_from_file_upload::{insert_media_file_from_file_upload, InsertMediaFileFromUploadArgs, UploadType}; use tokens::tokens::media_files::MediaFileToken; -use videos::get_mp4_info::{get_mp4_info, get_mp4_info_for_bytes}; +use videos::get_mp4_info::{get_mp4_info, get_mp4_info_for_bytes, get_mp4_info_for_bytes_and_len}; use crate::http_server::endpoints::engine::create_scene_handler::{CreateSceneError, CreateSceneSuccessResponse}; use crate::http_server::endpoints::media_files::upload_video::drain_multipart_request::drain_multipart_request; @@ -176,7 +176,7 @@ pub async fn upload_video_media_file_handler( // ==================== FRAME RATE ==================== // - let mp4_info = get_mp4_info_for_bytes(file_bytes.as_ref(), file_size_bytes as u64) + let mp4_info = get_mp4_info_for_bytes(file_bytes.as_ref()) .map_err(|err| { warn!("Error reading mp4 info: {:?}", err); VideoMediaFileUploadError::ServerError