♻️ refactor
							parent
							
								
									57c53a31dd
								
							
						
					
					
						commit
						99b3bfe231
					
				|  | @ -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 <FfAudioFrame>, | ||||
| } | ||||
| 
 | ||||
| impl Decoder { | ||||
| 	pub fn new (filename: &str) -> Result <Self> { | ||||
| 		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 <bool> { | ||||
| 		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 <Self> { | ||||
| 	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 <bool> { | ||||
| 	fn pump (&mut self) -> Result <Option <ffmpeg_next::Packet>> { | ||||
| 		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); | ||||
| 				return Ok (Some (packet)); | ||||
| 			} | ||||
| 		} | ||||
| 		
 | ||||
| 		Ok (false) | ||||
| 		Ok (None) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 _
						_