From 99b3bfe2318d226840fdbdf26894271193c44c6b Mon Sep 17 00:00:00 2001 From: _ <> Date: Sun, 14 Nov 2021 18:12:07 +0000 Subject: [PATCH] :recycle: refactor --- src/decoder.rs | 48 +++++++++++++++++++----------------------------- 1 file changed, 19 insertions(+), 29 deletions(-) diff --git a/src/decoder.rs b/src/decoder.rs index f1407e0..c3d31dc 100644 --- a/src/decoder.rs +++ b/src/decoder.rs @@ -91,24 +91,19 @@ impl PcmBuffers { } pub struct Decoder { - input_ctx: DemuxContext, + demuxer: FfmpegDemuxer, + decoder: DecodeContext, resampler: ResamplingContext, - best_stream_idx: usize, dummy_frame: Option , } impl Decoder { pub fn new (filename: &str) -> Result { - let input_ctx = ffmpeg_next::format::input (&filename)?; - let stream = input_ctx - .streams () - .best (ffmpeg_next::media::Type::Audio) - .ok_or_else (|| anyhow! ("can't find good audio stream"))?; - let best_stream_idx = stream.index (); + let (demuxer, codec) = FfmpegDemuxer::new (filename)?; - let decoder = stream.codec ().decoder ().audio ()?; + let decoder = codec.decoder ().audio ()?; let resampler = decoder.resampler ( Sample::F32 (sample::Type::Packed), ChannelLayout::STEREO, @@ -116,11 +111,10 @@ impl Decoder { )?; Ok (Self { - input_ctx, + demuxer, decoder, resampler, - best_stream_idx, dummy_frame: None, }) } @@ -223,15 +217,14 @@ impl Decoder { } pub fn pump_demuxer (&mut self) -> Result { - while let Some ((stream, packet)) = self.input_ctx.packets ().next () { - if stream.index () == self.best_stream_idx { - // tracing::trace! ("demuxed packet"); - self.decoder.send_packet (&packet)?; - return Ok (true); - } - } + let packet = self.demuxer.pump ()?; + let packet = match packet { + Some (x) => x, + None => return Ok (false), + }; - Ok (false) + self.decoder.send_packet (&packet)?; + Ok (true) } } @@ -242,11 +235,10 @@ trait Demuxer { struct FfmpegDemuxer { input_ctx: DemuxContext, best_stream_idx: usize, - decoder: DecodeContext, } impl FfmpegDemuxer { - pub fn new (filename: &str) -> Result { + pub fn new (filename: &str) -> Result <(Self, ffmpeg_next::codec::Context)> { let input_ctx = ffmpeg_next::format::input (&filename)?; let stream = input_ctx .streams () @@ -254,27 +246,25 @@ impl FfmpegDemuxer { .ok_or_else (|| anyhow! ("can't find good audio stream"))?; let best_stream_idx = stream.index (); - let decoder = stream.codec ().decoder ().audio ()?; + let codec = stream.codec (); - Ok (Self { + Ok ((Self { input_ctx, best_stream_idx, - decoder, - }) + }, codec)) } } impl FfmpegDemuxer { - fn pump (&mut self) -> Result { + fn pump (&mut self) -> Result