Skip to main content

wedeo_codec/
registry.rs

1use wedeo_core::codec_id::CodecId;
2use wedeo_core::error::Result;
3
4use crate::decoder::{CodecParameters, Decoder, DecoderDescriptor};
5use crate::encoder::{Encoder, EncoderBuilder, EncoderDescriptor};
6
7/// Factory for creating decoder instances. Implementations register via `inventory`.
8pub trait DecoderFactory: Send + Sync {
9    fn descriptor(&self) -> &DecoderDescriptor;
10    fn create(&self, params: CodecParameters) -> Result<Box<dyn Decoder>>;
11}
12
13inventory::collect!(&'static dyn DecoderFactory);
14
15/// Factory for creating encoder instances. Implementations register via `inventory`.
16pub trait EncoderFactory: Send + Sync {
17    fn descriptor(&self) -> &EncoderDescriptor;
18    fn create(&self, builder: EncoderBuilder) -> Result<Box<dyn Encoder>>;
19}
20
21inventory::collect!(&'static dyn EncoderFactory);
22
23/// Find a decoder factory by codec ID. When multiple decoders support the same
24/// codec_id, the one with the highest priority wins.
25pub fn find_decoder(codec_id: CodecId) -> Option<&'static dyn DecoderFactory> {
26    inventory::iter::<&'static dyn DecoderFactory>()
27        .filter(|f| f.descriptor().codec_id == codec_id)
28        .max_by_key(|f| f.descriptor().priority)
29        .copied()
30}
31
32/// Find a decoder factory by name.
33pub fn find_decoder_by_name(name: &str) -> Option<&'static dyn DecoderFactory> {
34    inventory::iter::<&'static dyn DecoderFactory>()
35        .find(|f| f.descriptor().name == name)
36        .copied()
37}
38
39/// Find an encoder factory by codec ID. When multiple encoders support the same
40/// codec_id, the one with the highest priority wins.
41pub fn find_encoder(codec_id: CodecId) -> Option<&'static dyn EncoderFactory> {
42    inventory::iter::<&'static dyn EncoderFactory>()
43        .filter(|f| f.descriptor().codec_id == codec_id)
44        .max_by_key(|f| f.descriptor().priority)
45        .copied()
46}
47
48/// Find an encoder factory by name.
49pub fn find_encoder_by_name(name: &str) -> Option<&'static dyn EncoderFactory> {
50    inventory::iter::<&'static dyn EncoderFactory>()
51        .find(|f| f.descriptor().name == name)
52        .copied()
53}
54
55/// Iterate over all registered decoder factories.
56pub fn decoders() -> impl Iterator<Item = &'static dyn DecoderFactory> {
57    inventory::iter::<&'static dyn DecoderFactory>().copied()
58}
59
60/// Iterate over all registered encoder factories.
61pub fn encoders() -> impl Iterator<Item = &'static dyn EncoderFactory> {
62    inventory::iter::<&'static dyn EncoderFactory>().copied()
63}