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
7pub 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
15pub 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
23pub 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
32pub 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
39pub 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
48pub 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
55pub fn decoders() -> impl Iterator<Item = &'static dyn DecoderFactory> {
57 inventory::iter::<&'static dyn DecoderFactory>().copied()
58}
59
60pub fn encoders() -> impl Iterator<Item = &'static dyn EncoderFactory> {
62 inventory::iter::<&'static dyn EncoderFactory>().copied()
63}