Use this file to discover all available pages before exploring further.
Symphonia’s architecture allows you to implement custom decoders for codecs that aren’t built-in. This is useful for proprietary formats, experimental codecs, or specialized audio processing.
Instantiates your decoder with the given parameters:
fn try_new( params: &CodecParameters, options: &DecoderOptions,) -> Result<Self> { // Validate codec type if params.codec != MY_CODEC_TYPE { return unsupported_error("unsupported codec"); } // Check required parameters let sample_rate = params.sample_rate .ok_or_else(|| decode_error("missing sample rate"))?; let channels = params.channels .ok_or_else(|| decode_error("missing channels"))?; // Initialize decoder state let decoder_state = initialize_decoder(sample_rate, channels)?; Ok(MyCustomDecoder { params: params.clone(), state: decoder_state, })}
decode()
The core decoding method that converts packets to audio:
use symphonia::core::audio::{AudioBuffer, AudioBufferRef, Signal};use symphonia::core::sample::SampleFormat;fn decode(&mut self, packet: &Packet) -> Result<AudioBufferRef<'_>> { // Get packet data let data = packet.buf(); // Decode packet let decoded_samples = my_decode_algorithm(data)?; // Create audio buffer let spec = *self.audio_buf.spec(); let mut audio_buf = AudioBuffer::<f32>::new( decoded_samples.len() as u64, spec, ); // Fill audio buffer with decoded samples for (ch_idx, channel) in decoded_samples.iter().enumerate() { let buf_channel = audio_buf.chan_mut(ch_idx); buf_channel.copy_from_slice(channel); } // Return reference Ok(audio_buf.as_audio_buffer_ref())}
If decoding fails, you must clear the internal buffer before returning an error.
reset()
Resets decoder state after seeks:
fn reset(&mut self) { // Clear any buffered data self.buffer.clear(); // Reset codec state self.decoder_state.reset(); // Reset timestamps self.last_timestamp = 0;}
use symphonia::core::codecs::{CodecType, decl_codec_type};// Define a unique codec type// Use a 5-character ASCII identifierpub const CODEC_TYPE_MY_CODEC: CodecType = decl_codec_type(b"mycd");
Once implemented, register your decoder with a CodecRegistry.
1
Create a codec registry
use symphonia::core::codecs::CodecRegistry;// Create new registrylet mut registry = CodecRegistry::new();// Register all default codecssymphonia::default::register_enabled_codecs(&mut registry);
2
Register your decoder
// Register your custom decoderregistry.register_all::<MyCustomDecoder>();// Or register just the descriptorregistry.register(&MY_CODEC_DESCRIPTOR);
3
Use the registry
use symphonia::core::codecs::DecoderOptions;// Find a tracklet track = format.default_track().unwrap();// Create decoder from custom registrylet dec_opts = DecoderOptions::default();let decoder = registry.make(&track.codec_params, &dec_opts)?;// decoder can be your custom decoder or a built-in one