mediadecode_ffmpeg/
audio.rs1use ffmpeg_next::{codec::Parameters, frame};
16use mediadecode::{Timebase, decoder::AudioStreamDecoder, frame::AudioFrame, packet::AudioPacket};
17use mediaframe::audio::ChannelLayoutDescription;
18
19use crate::{
20 Error, Ffmpeg, FfmpegBuffer, boundary,
21 convert::{self, ConvertError},
22 decoder::build_codec_context,
23 extras::{AudioFrameExtra, AudioPacketExtra},
24 frame::alloc_av_audio_frame,
25 sample_format::SampleFormat,
26};
27
28pub struct FfmpegAudioStreamDecoder {
30 decoder: ffmpeg_next::decoder::Audio,
31 scratch: frame::Audio,
32 time_base: Timebase,
33}
34
35impl FfmpegAudioStreamDecoder {
36 pub fn open(parameters: Parameters, time_base: Timebase) -> Result<Self, AudioDecodeError> {
38 let ctx = build_codec_context(¶meters).map_err(AudioDecodeError::Decode)?;
41 let decoder = ctx
42 .decoder()
43 .audio()
44 .map_err(|e| AudioDecodeError::Decode(Error::Ffmpeg(e)))?;
45 let scratch = alloc_av_audio_frame().map_err(AudioDecodeError::Decode)?;
46 Ok(Self {
47 decoder,
48 scratch,
49 time_base,
50 })
51 }
52
53 #[cfg_attr(not(tarpaulin), inline(always))]
55 pub const fn time_base(&self) -> Timebase {
56 self.time_base
57 }
58
59 #[cfg_attr(not(tarpaulin), inline(always))]
62 pub const fn inner(&self) -> &ffmpeg_next::decoder::Audio {
63 &self.decoder
64 }
65}
66
67impl AudioStreamDecoder for FfmpegAudioStreamDecoder {
68 type Adapter = Ffmpeg;
69 type Buffer = FfmpegBuffer;
70 type Error = AudioDecodeError;
71
72 fn send_packet(
73 &mut self,
74 packet: &AudioPacket<AudioPacketExtra, Self::Buffer>,
75 ) -> Result<(), Self::Error> {
76 let av_pkt = boundary::ffmpeg_packet_from_audio_packet(packet)
77 .map_err(|e| AudioDecodeError::Decode(Error::Ffmpeg(e)))?;
78 self
79 .decoder
80 .send_packet(&av_pkt)
81 .map_err(|e| AudioDecodeError::Decode(Error::Ffmpeg(e)))
82 }
83
84 fn receive_frame(
85 &mut self,
86 dst: &mut AudioFrame<SampleFormat, ChannelLayoutDescription, AudioFrameExtra, Self::Buffer>,
87 ) -> Result<(), Self::Error> {
88 self
89 .decoder
90 .receive_frame(&mut self.scratch)
91 .map_err(|e| AudioDecodeError::Decode(Error::Ffmpeg(e)))?;
92 let new_frame =
96 unsafe { convert::av_frame_to_audio_frame(self.scratch.as_ptr(), self.time_base) }
97 .map_err(AudioDecodeError::Convert)?;
98 *dst = new_frame;
99 Ok(())
100 }
101
102 fn send_eof(&mut self) -> Result<(), Self::Error> {
103 self
104 .decoder
105 .send_eof()
106 .map_err(|e| AudioDecodeError::Decode(Error::Ffmpeg(e)))
107 }
108
109 fn flush(&mut self) -> Result<(), Self::Error> {
110 self.decoder.flush();
111 Ok(())
112 }
113}
114
115#[derive(thiserror::Error, Debug, Clone)]
117pub enum AudioDecodeError {
118 #[error(transparent)]
120 Decode(#[from] Error),
121 #[error(transparent)]
124 Convert(#[from] ConvertError),
125}