From 0ea1013babf9ca96132bde5a93ed3c5ef4581460 Mon Sep 17 00:00:00 2001 From: Janne Koschinski <janne@kuschku.de> Date: Fri, 6 Mar 2020 21:50:18 +0100 Subject: [PATCH] use rustfmt --- Cargo.toml | 10 +- src/ffmpeg_api/api.rs | 214 ++++++++++++++++++++++-------------- src/ffmpeg_api/enums.rs | 4 +- src/ffmpeg_api/mod.rs | 2 +- src/ingest/extract.rs | 109 +++++++++--------- src/ingest/mod.rs | 2 +- src/ingest/spritesheet.rs | 53 +++++---- src/main.rs | 4 +- src/util/media_time.rs | 18 +-- src/util/stream_metadata.rs | 10 +- src/util/webvtt.rs | 14 ++- 11 files changed, 249 insertions(+), 191 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 8335761..65a703f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,12 +17,12 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -ffmpeg-dev = "0.3.8" -image = "0.23.0" enum_primitive = "0.1.1" failure = "0.1.6" +ffmpeg-dev = "0.3.8" fraction = "0.6.2" -time = "0.2" -serde = { version = "1.0", features = ["derive"] } +image = "0.23.0" serde_json = "1.0" -structopt = "0.3" \ No newline at end of file +serde = { version = "1.0", features = ["derive"] } +structopt = "0.3" +time = "0.2" diff --git a/src/ffmpeg_api/api.rs b/src/ffmpeg_api/api.rs index cf6b7ea..f632daf 100644 --- a/src/ffmpeg_api/api.rs +++ b/src/ffmpeg_api/api.rs @@ -23,7 +23,8 @@ impl<'a> AVFormatContext { } pub fn open_input(&mut self, path: &Path) -> Result<(), failure::Error> { - let path = path.to_str() + let path = path + .to_str() .ok_or_else(|| failure::format_err!("Could not convert path to c string"))?; let path = std::ffi::CString::new(path) .map_err(|_| failure::format_err!("Could not convert path to c string"))?; @@ -37,7 +38,7 @@ impl<'a> AVFormatContext { ) } { 0 => Ok(()), - _ => bail!("Could not open input") + _ => bail!("Could not open input"), } } @@ -46,45 +47,40 @@ impl<'a> AVFormatContext { } pub fn streams(&self) -> Vec<AVStream> { - Vec::from( - unsafe { - std::slice::from_raw_parts( - (*self.base).streams, - (*self.base).nb_streams as usize, - ) - } - ).iter().map(|stream| { - AVStream::new(unsafe { (*stream).as_mut() }.expect("not null")) - }).collect() - } - - pub fn find_stream<P>(&self, predicate: P) -> Option<AVStream> where - P: FnMut(&AVStream) -> bool { - Vec::from( - unsafe { - std::slice::from_raw_parts( - (*self.base).streams, - (*self.base).nb_streams as usize, - ) - } - ).iter().map(|stream| { - AVStream::new(unsafe { (*stream).as_mut() }.expect("not null")) - }).find(predicate) + Vec::from(unsafe { + std::slice::from_raw_parts((*self.base).streams, (*self.base).nb_streams as usize) + }) + .iter() + .map(|stream| AVStream::new(unsafe { (*stream).as_mut() }.expect("not null"))) + .collect() + } + + pub fn find_stream<P>(&self, predicate: P) -> Option<AVStream> + where + P: FnMut(&AVStream) -> bool, + { + Vec::from(unsafe { + std::slice::from_raw_parts((*self.base).streams, (*self.base).nb_streams as usize) + }) + .iter() + .map(|stream| AVStream::new(unsafe { (*stream).as_mut() }.expect("not null"))) + .find(predicate) } pub fn read_frame(&mut self, packet: &mut AVPacket) -> Result<(), failure::Error> { match unsafe { ffi::av_read_frame(self.base, packet.base) } { 0 => Ok(()), - errno => Err(failure::format_err!("Error while decoding frame: {}", errno)) + errno => Err(failure::format_err!( + "Error while decoding frame: {}", + errno + )), } } pub fn duration(&self) -> Result<media_time::MediaTime, failure::Error> { media_time::MediaTime::from_rational( - unsafe { (*self.base).duration }, Fraction::new( - 1 as u64, - ffi::AV_TIME_BASE as u64, - ), + unsafe { (*self.base).duration }, + Fraction::new(1 as u64, ffi::AV_TIME_BASE as u64), ) } } @@ -96,7 +92,7 @@ impl Drop for AVFormatContext { } pub struct AVInputFormat<'a> { - base: &'a mut ffi::AVInputFormat + base: &'a mut ffi::AVInputFormat, } impl<'a> AVInputFormat<'a> { @@ -110,11 +106,13 @@ impl<'a> AVInputFormat<'a> { if raw.is_null() { Err(failure::format_err!("No mime type found")) } else { - Ok(String::from(unsafe { - std::ffi::CStr::from_ptr(raw) - }.to_str().map_err(|err| { - failure::format_err!("Could not convert mime type to string: {}", err) - })?)) + Ok(String::from( + unsafe { std::ffi::CStr::from_ptr(raw) } + .to_str() + .map_err(|err| { + failure::format_err!("Could not convert mime type to string: {}", err) + })?, + )) } } @@ -124,11 +122,13 @@ impl<'a> AVInputFormat<'a> { if raw.is_null() { Err(failure::format_err!("No mime type found")) } else { - Ok(String::from(unsafe { - std::ffi::CStr::from_ptr(raw) - }.to_str().map_err(|err| { - failure::format_err!("Could not convert mime type to string: {}", err) - })?)) + Ok(String::from( + unsafe { std::ffi::CStr::from_ptr(raw) } + .to_str() + .map_err(|err| { + failure::format_err!("Could not convert mime type to string: {}", err) + })?, + )) } } @@ -138,11 +138,13 @@ impl<'a> AVInputFormat<'a> { if raw.is_null() { Err(failure::format_err!("No mime type found")) } else { - Ok(String::from(unsafe { - std::ffi::CStr::from_ptr(raw) - }.to_str().map_err(|err| { - failure::format_err!("Could not convert mime type to string: {}", err) - })?)) + Ok(String::from( + unsafe { std::ffi::CStr::from_ptr(raw) } + .to_str() + .map_err(|err| { + failure::format_err!("Could not convert mime type to string: {}", err) + })?, + )) } } @@ -159,7 +161,7 @@ impl<'a> AVInputFormat<'a> { _ => { // Do nothing } - } + }, "webm" => match stream_codec { "vp8" | "vp9" | "av1" => { return Ok(String::from("video/webm")); @@ -167,14 +169,18 @@ impl<'a> AVInputFormat<'a> { _ => { // Do nothing } - } + }, _ => { // Do nothing } } } - return Err(failure::format_err!("Could not determine mime type: {} video in {} container", stream_codec, containers)); + return Err(failure::format_err!( + "Could not determine mime type: {} video in {} container", + stream_codec, + containers + )); } } @@ -193,19 +199,18 @@ impl AVBuffer { } pub fn empty() -> Self { - AVBuffer { base: std::ptr::null_mut(), size: 0 } + AVBuffer { + base: std::ptr::null_mut(), + size: 0, + } } pub fn data(&self) -> &[u8] { - unsafe { - std::slice::from_raw_parts(self.base, self.size) - } + unsafe { std::slice::from_raw_parts(self.base, self.size) } } pub fn data_mut(&mut self) -> &[u8] { - unsafe { - std::slice::from_raw_parts_mut(self.base, self.size) - } + unsafe { std::slice::from_raw_parts_mut(self.base, self.size) } } } @@ -258,10 +263,18 @@ impl AVFrame { if base.is_null() { bail!("avformat_alloc_frame() failed"); } - Ok(AVFrame { base, buffer: AVBuffer::empty() }) - } - - pub fn init(&mut self, width: i32, height: i32, format: AVPixelFormat) -> Result<(), failure::Error> { + Ok(AVFrame { + base, + buffer: AVBuffer::empty(), + }) + } + + pub fn init( + &mut self, + width: i32, + height: i32, + format: AVPixelFormat, + ) -> Result<(), failure::Error> { let mut base = unsafe { self.base.as_mut() }.expect("not null"); base.width = width; @@ -298,13 +311,16 @@ impl AVFrame { pub fn format(&self) -> AVPixelFormat { let base = unsafe { self.base.as_ref() }.expect("not null"); - AVPixelFormat::from_i32(base.format) - .unwrap_or(AVPixelFormat::NONE) + AVPixelFormat::from_i32(base.format).unwrap_or(AVPixelFormat::NONE) } pub fn size(&self) -> usize { unsafe { - ffi::avpicture_get_size(self.format() as ffi::AVPixelFormat, self.width(), self.height()) as usize + ffi::avpicture_get_size( + self.format() as ffi::AVPixelFormat, + self.width(), + self.height(), + ) as usize } } @@ -353,17 +369,13 @@ impl AVFrame { pub fn data(&self, index: usize) -> &[u8] { let base = unsafe { self.base.as_ref() }.expect("not null"); - unsafe { - std::slice::from_raw_parts(base.data[index], self.size()) - } + unsafe { std::slice::from_raw_parts(base.data[index], self.size()) } } pub fn data_mut(&mut self, index: usize) -> &mut [u8] { let base = unsafe { self.base.as_mut() }.expect("not null"); - unsafe { - std::slice::from_raw_parts_mut(base.data[index], self.size()) - } + unsafe { std::slice::from_raw_parts_mut(base.data[index], self.size()) } } } @@ -374,7 +386,7 @@ impl Drop for AVFrame { } pub struct AVStream<'a> { - base: &'a mut ffi::AVStream + base: &'a mut ffi::AVStream, } impl<'a> AVStream<'a> { @@ -393,7 +405,10 @@ impl<'a> AVStream<'a> { ) } - pub fn timestamp(self: &AVStream<'a>, timestamp: i64) -> Result<media_time::MediaTime, failure::Error> { + pub fn timestamp( + self: &AVStream<'a>, + timestamp: i64, + ) -> Result<media_time::MediaTime, failure::Error> { media_time::MediaTime::from_rational(timestamp, self.time_base()) } @@ -428,7 +443,10 @@ impl<'a> AVStream<'a> { } pub fn codec_parameters(&self) -> AVCodecParameters { - AVCodecParameters::new(unsafe { self.base.codecpar.as_mut() }.expect("not null"), self) + AVCodecParameters::new( + unsafe { self.base.codecpar.as_mut() }.expect("not null"), + self, + ) } } @@ -439,7 +457,10 @@ pub struct AVCodecParameters<'a> { impl<'a> AVCodecParameters<'a> { fn new(base: &'a mut ffi::AVCodecParameters, _: &'a AVStream) -> Self { - return AVCodecParameters { base, phantom: PhantomData }; + return AVCodecParameters { + base, + phantom: PhantomData, + }; } pub fn codec_type(&self) -> AVMediaType { @@ -456,7 +477,8 @@ impl<'a> AVCodecParameters<'a> { pub fn find_decoder(&self) -> AVCodec { AVCodec::new( - unsafe { ffi::avcodec_find_decoder(self.base.codec_id).as_mut() }.expect("Decoder not found"), + unsafe { ffi::avcodec_find_decoder(self.base.codec_id).as_mut() } + .expect("Decoder not found"), self, ) } @@ -469,11 +491,18 @@ pub struct AVCodec<'a> { impl<'a> AVCodec<'a> { fn new(base: &'a mut ffi::AVCodec, _: &'a AVCodecParameters) -> Self { - return AVCodec { base, phantom: PhantomData }; + return AVCodec { + base, + phantom: PhantomData, + }; } pub fn name(self: &AVCodec<'a>) -> std::string::String { - String::from(unsafe { std::ffi::CStr::from_ptr(self.base.name) }.to_str().unwrap()) + String::from( + unsafe { std::ffi::CStr::from_ptr(self.base.name) } + .to_str() + .unwrap(), + ) } } @@ -493,14 +522,20 @@ impl AVCodecContext { pub fn in_packet(&mut self, packet: &mut AVPacket) -> Result<(), failure::Error> { match unsafe { ffi::avcodec_send_packet(self.base, packet.base) } { 0 => Ok(()), - errno => Err(failure::format_err!("Error while loading paclet: {}", errno)) + errno => Err(failure::format_err!( + "Error while loading paclet: {}", + errno + )), } } pub fn out_frame(&mut self, frame: &mut AVFrame) -> Result<(), failure::Error> { match unsafe { ffi::avcodec_receive_frame(self.base, frame.base) } { 0 => Ok(()), - errno => Err(failure::format_err!("Error while decoding frame: {}", errno)) + errno => Err(failure::format_err!( + "Error while decoding frame: {}", + errno + )), } } @@ -565,10 +600,17 @@ pub struct SwsContext { impl SwsContext { pub fn new() -> Self { - SwsContext { base: std::ptr::null_mut() } + SwsContext { + base: std::ptr::null_mut(), + } } - pub fn reinit(&mut self, source: &AVFrame, target: &AVFrame, scaler: SwsScaler) -> Result<(), failure::Error> { + pub fn reinit( + &mut self, + source: &AVFrame, + target: &AVFrame, + scaler: SwsScaler, + ) -> Result<(), failure::Error> { let base = unsafe { ffi::sws_getCachedContext( self.base, @@ -596,7 +638,13 @@ impl SwsContext { self.scale_slice(source, target, 0, source.height()) } - pub fn scale_slice(&self, source: &AVFrame, target: &mut AVFrame, slice_from: i32, slice_to: i32) -> i32 { + pub fn scale_slice( + &self, + source: &AVFrame, + target: &mut AVFrame, + slice_from: i32, + slice_to: i32, + ) -> i32 { unsafe { ffi::sws_scale( self.base, @@ -615,4 +663,4 @@ impl Drop for SwsContext { fn drop(&mut self) { unsafe { ffi::sws_freeContext(self.base) } } -} \ No newline at end of file +} diff --git a/src/ffmpeg_api/enums.rs b/src/ffmpeg_api/enums.rs index ad915a0..4cd2965 100644 --- a/src/ffmpeg_api/enums.rs +++ b/src/ffmpeg_api/enums.rs @@ -1,5 +1,5 @@ -use ffmpeg_dev::sys as ffi; use enum_primitive::*; +use ffmpeg_dev::sys as ffi; enum_from_primitive! { #[doc = " Pixel format."] @@ -949,4 +949,4 @@ enum_from_primitive! { Lanczos = ffi::SWS_LANCZOS, Spline = ffi::SWS_SPLINE, } -} \ No newline at end of file +} diff --git a/src/ffmpeg_api/mod.rs b/src/ffmpeg_api/mod.rs index 67de0ab..30b930b 100644 --- a/src/ffmpeg_api/mod.rs +++ b/src/ffmpeg_api/mod.rs @@ -1,2 +1,2 @@ -pub(crate) mod enums; pub(crate) mod api; +pub(crate) mod enums; diff --git a/src/ingest/extract.rs b/src/ingest/extract.rs index 9c610e6..c7abd23 100644 --- a/src/ingest/extract.rs +++ b/src/ingest/extract.rs @@ -1,42 +1,41 @@ -use std::path::Path; use failure::format_err; +use std::path::Path; use crate::ffmpeg_api::api::*; use crate::ffmpeg_api::enums::*; -use crate::util::media_time::*; use crate::ingest::spritesheet::*; +use crate::util::media_time::*; use crate::util::stream_metadata::*; pub fn extract( max_size: u32, - num_horizontal: u32, num_vertical: u32, + num_horizontal: u32, + num_vertical: u32, frame_interval: MediaTime, input_file: &Path, output_folder: &Path, ) -> Result<(), failure::Error> { - let mut avformat_context = AVFormatContext::new().map_err(|error| { - format_err!("Could not allocate a context to process the video: {:?}", error) - })?; - avformat_context.open_input(input_file).map_err(|error| { - format_err!("Could not open video input: {:?}", error) - })?; + let mut avformat_context = AVFormatContext::new() + .map_err(|error| format_err!("Could not open video input: {}", error))?; + avformat_context + .open_input(input_file) + .map_err(|error| format_err!("Could not open video input: {}", error))?; let duration = avformat_context.duration()?; let spritesheet_path = output_folder.join("spritesheets"); std::fs::create_dir_all(&spritesheet_path)?; let mut spritesheet_manager = SpritesheetManager::new( max_size, - num_horizontal, num_vertical, + num_horizontal, + num_vertical, frame_interval, spritesheet_path, - "preview" + "preview", ); - let mut stream: AVStream = avformat_context.find_stream(|stream| { - stream.codec_parameters().codec_type() == AVMediaType::Video - }).ok_or_else(|| { - format_err!("Could not find video stream") - })?; + let mut stream: AVStream = avformat_context + .find_stream(|stream| stream.codec_parameters().codec_type() == AVMediaType::Video) + .ok_or_else(|| format_err!("Could not find video stream"))?; stream.set_discard(AVDiscard::NonKey); let index = stream.index(); @@ -53,19 +52,19 @@ pub fn extract( ); let mut metadata = StreamMetadata::new( - avformat_context.input_format().determine_mime(local_codec.name())?, + avformat_context + .input_format() + .determine_mime(local_codec.name())?, duration, - codec_parameters.bit_rate() / 1000 + codec_parameters.bit_rate() / 1000, ); - let mut output_frame = AVFrame::new().map_err(|error| { - format_err!("Could not create output frame: {:?}", error) - })?; + let mut output_frame = + AVFrame::new().map_err(|error| format_err!("Could not create output frame: {}", error))?; if codec_parameters.codec_type() == AVMediaType::Video { - let mut codec_context = AVCodecContext::new(&local_codec).map_err(|error| { - format_err!("Could not init codec context: {:?}", error) - })?; + let mut codec_context = AVCodecContext::new(&local_codec) + .map_err(|error| format_err!("Could not init codec context: {}", error))?; codec_context.set_parameters(&codec_parameters); codec_context.open(&local_codec); @@ -73,21 +72,19 @@ pub fn extract( codec_context.set_skip_idct(AVDiscard::NonKey); codec_context.set_skip_frame(AVDiscard::NonKey); - let mut packet = AVPacket::new().map_err(|error| { - format_err!("Could not init temporary packet: {:?}", error) - })?; + let mut packet = AVPacket::new() + .map_err(|error| format_err!("Could not init temporary packet: {}", error))?; - let mut frame = AVFrame::new().map_err(|error| { - format_err!("Could not create input frame: {:?}", error) - })?; + let mut frame = AVFrame::new() + .map_err(|error| format_err!("Could not create input frame: {}", error))?; let mut scale_context = SwsContext::new(); while avformat_context.read_frame(&mut packet).is_ok() { if packet.stream_index() == index { - codec_context.in_packet(&mut packet).map_err(|error| { - format_err!("Could not load packet: {:?}", error) - })?; + codec_context + .in_packet(&mut packet) + .map_err(|error| format_err!("Could not load packet: {}", error))?; while codec_context.out_frame(&mut frame).is_ok() { let timestamp = MediaTime::from_rational(frame.pts(), time_base)?; @@ -100,22 +97,23 @@ pub fn extract( if spritesheet_manager.fulfils_frame_interval(timestamp) { if !spritesheet_manager.initialized() { - spritesheet_manager.initialize(frame.width() as u32, frame.height() as u32); + spritesheet_manager + .initialize(frame.width() as u32, frame.height() as u32); metadata.set_frame_size(frame.width(), frame.height()); - output_frame.init( - spritesheet_manager.sprite_width() as i32, - spritesheet_manager.sprite_height() as i32, - AVPixelFormat::RGB24, - ).map_err(|error| { - format_err!("Could not init output frame: {:?}", error) - })?; - scale_context.reinit( - &frame, - &output_frame, - SwsScaler::FastBilinear, - ).map_err(|error| { - format_err!("Could not reinit scale context: {:?}", error) - })?; + output_frame + .init( + spritesheet_manager.sprite_width() as i32, + spritesheet_manager.sprite_height() as i32, + AVPixelFormat::RGB24, + ) + .map_err(|error| { + format_err!("Could not init output frame: {}", error) + })?; + scale_context + .reinit(&frame, &output_frame, SwsScaler::FastBilinear) + .map_err(|error| { + format_err!("Could not reinit scale context: {}", error) + })?; } scale_context.scale(&frame, &mut output_frame); @@ -126,9 +124,8 @@ pub fn extract( output_frame.width() as u32, output_frame.height() as u32, output_frame.data(0).to_vec(), - ).ok_or_else(|| { - format_err!("Could not process frame") - })? + ) + .ok_or_else(|| format_err!("Could not process frame"))?, )?; } } @@ -139,11 +136,9 @@ pub fn extract( spritesheet_manager.save()?; } - metadata.save( - output_folder.join("metadata.json") - ).map_err(|error| { - format_err!("Could not write stream metadata: {}", error) - })?; + metadata + .save(output_folder.join("metadata.json")) + .map_err(|error| format_err!("Could not write stream metadata: {}", error))?; Ok(()) -} \ No newline at end of file +} diff --git a/src/ingest/mod.rs b/src/ingest/mod.rs index 59bb335..1d0c622 100644 --- a/src/ingest/mod.rs +++ b/src/ingest/mod.rs @@ -1,2 +1,2 @@ pub(crate) mod extract; -pub(crate) mod spritesheet; \ No newline at end of file +pub(crate) mod spritesheet; diff --git a/src/ingest/spritesheet.rs b/src/ingest/spritesheet.rs index e0e05b8..42b61d5 100644 --- a/src/ingest/spritesheet.rs +++ b/src/ingest/spritesheet.rs @@ -1,10 +1,10 @@ use std::path::PathBuf; -use image::{RgbImage, ImageBuffer}; use failure::{bail, format_err}; +use image::{ImageBuffer, RgbImage}; use crate::util::media_time::MediaTime; -use crate::util::webvtt::{WebVTTFile, WebVTTCue}; +use crate::util::webvtt::{WebVTTCue, WebVTTFile}; pub struct SpritesheetManager { num_horizontal: u32, @@ -23,7 +23,14 @@ pub struct SpritesheetManager { } impl SpritesheetManager { - pub fn new<T: AsRef<str>, U: Into<PathBuf>>(max_side: u32, num_horizontal: u32, num_vertical: u32, frame_interval: MediaTime, output_path: U, name: T) -> SpritesheetManager { + pub fn new<T: AsRef<str>, U: Into<PathBuf>>( + max_side: u32, + num_horizontal: u32, + num_vertical: u32, + frame_interval: MediaTime, + output_path: U, + name: T, + ) -> SpritesheetManager { SpritesheetManager { num_horizontal, num_vertical, @@ -94,22 +101,24 @@ impl SpritesheetManager { self.current_image == 0 || timestamp - self.last_timestamp > self.frame_interval } - pub fn add_image(&mut self, timestamp: MediaTime, image: RgbImage) -> Result<(), failure::Error> { + pub fn add_image( + &mut self, + timestamp: MediaTime, + image: RgbImage, + ) -> Result<(), failure::Error> { if image.width() != self.sprite_width || image.height() != self.sprite_height { bail!( "Wrong image size: {}x{}, but expected {}x{}", - image.width(), image.height(), - self.sprite_width, self.sprite_height + image.width(), + image.height(), + self.sprite_width, + self.sprite_height ) } let x = self.x(self.current_image); let y = self.y(self.current_image); - image::imageops::overlay( - &mut self.spritesheet, - &image, - x, y, - ); + image::imageops::overlay(&mut self.spritesheet, &image, x, y); if self.current_image != 0 { self.end_frame(timestamp); @@ -142,22 +151,22 @@ impl SpritesheetManager { } fn save_spritesheet(&mut self) -> Result<(), failure::Error> { - self.spritesheet.save( - self.output_path.join(format!("{}_{}.jpg", self.name, self.spritesheet_index(self.current_image))) - ).map_err(|error| { - format_err!("Could not write spritesheet: {}", error) - })?; + self.spritesheet + .save(self.output_path.join(format!( + "{}_{}.jpg", + self.name, + self.spritesheet_index(self.current_image) + ))) + .map_err(|error| format_err!("Could not write spritesheet: {}", error))?; self.reinit_buffer(); Ok(()) } pub fn save(&mut self) -> Result<(), failure::Error> { self.save_spritesheet()?; - self.metadata.save( - self.output_path.join(format!("{}.vtt", self.name)) - ).map_err(|error| { - format_err!("Could not write spritesheet metadata: {}", error) - })?; + self.metadata + .save(self.output_path.join(format!("{}.vtt", self.name))) + .map_err(|error| format_err!("Could not write spritesheet metadata: {}", error))?; Ok(()) } -} \ No newline at end of file +} diff --git a/src/main.rs b/src/main.rs index 7bb3a6e..32c15ef 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,7 +11,7 @@ use structopt::StructOpt; use crate::util::media_time::MediaTime; #[derive(StructOpt, Debug)] -#[structopt(author,about)] +#[structopt(author, about)] struct Options { input: String, output: String, @@ -34,7 +34,7 @@ fn main() -> Result<(), failure::Error> { options.num_vertical, MediaTime::from_seconds(options.frame_interval), Path::new(&options.input), - Path::new(&options.output) + Path::new(&options.output), )?; Ok(()) diff --git a/src/util/media_time.rs b/src/util/media_time.rs index 54bd366..ef80485 100644 --- a/src/util/media_time.rs +++ b/src/util/media_time.rs @@ -1,20 +1,20 @@ -use fraction::Fraction; use failure::format_err; +use fraction::Fraction; #[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd)] pub struct MediaTime(time::Duration); impl MediaTime { pub fn from_rational(timestamp: i64, base: Fraction) -> Result<MediaTime, failure::Error> { - let num: u64 = *base.numer().ok_or_else(|| { - format_err!("time base of unusable format") - })?; - let den: u64 = *base.denom().ok_or_else(|| { - format_err!("time base of unusable format") - })?; + let num: u64 = *base + .numer() + .ok_or_else(|| format_err!("time base of unusable format"))?; + let den: u64 = *base + .denom() + .ok_or_else(|| format_err!("time base of unusable format"))?; Ok(MediaTime(time::Duration::milliseconds( - (1000 * timestamp as i128 * num as i128 / den as i128) as i64 + (1000 * timestamp as i128 * num as i128 / den as i128) as i64, ))) } @@ -69,4 +69,4 @@ impl std::ops::Sub for MediaTime { fn sub(self, other: Self) -> Self { Self(self.0 - other.0) } -} \ No newline at end of file +} diff --git a/src/util/stream_metadata.rs b/src/util/stream_metadata.rs index 35e1412..3d71b1a 100644 --- a/src/util/stream_metadata.rs +++ b/src/util/stream_metadata.rs @@ -1,6 +1,6 @@ use std::fs::File; -use std::path::Path; use std::io::BufWriter; +use std::path::Path; use serde::{Deserialize, Serialize}; @@ -17,7 +17,11 @@ pub struct StreamMetadata { } impl StreamMetadata { - pub fn new<T: AsRef<str>>(content_type: T, duration: MediaTime, bitrate: i64) -> StreamMetadata { + pub fn new<T: AsRef<str>>( + content_type: T, + duration: MediaTime, + bitrate: i64, + ) -> StreamMetadata { StreamMetadata { content_type: String::from(content_type.as_ref()), duration: duration.seconds(), @@ -38,4 +42,4 @@ impl StreamMetadata { serde_json::to_writer(BufWriter::new(File::create(path)?), self)?; Ok(()) } -} \ No newline at end of file +} diff --git a/src/util/webvtt.rs b/src/util/webvtt.rs index c26b8e9..782fac5 100644 --- a/src/util/webvtt.rs +++ b/src/util/webvtt.rs @@ -7,7 +7,7 @@ use std::string::String; use crate::util::media_time::MediaTime; pub struct WebVTTFile { - cues: Vec<WebVTTCue> + cues: Vec<WebVTTCue>, } pub struct WebVTTCue { @@ -18,9 +18,7 @@ pub struct WebVTTCue { impl WebVTTFile { pub fn new() -> WebVTTFile { - WebVTTFile { - cues: Vec::new() - } + WebVTTFile { cues: Vec::new() } } pub fn add(&mut self, cue: WebVTTCue) { @@ -41,10 +39,14 @@ impl WebVTTFile { impl WebVTTCue { pub fn new(start: MediaTime, end: MediaTime, payload: String) -> WebVTTCue { - WebVTTCue { start, end, payload } + WebVTTCue { + start, + end, + payload, + } } - fn save(&self, writer: &mut LineWriter<File>) -> Result<(), std::io::Error>{ + fn save(&self, writer: &mut LineWriter<File>) -> Result<(), std::io::Error> { writer.write_all(format!("{} --> {}\n", self.start, self.end).as_bytes())?; writer.write_all(self.payload.as_bytes())?; writer.write_all(b"\n\n")?; -- GitLab