media_codec/
decoder.rs

1use std::{
2    collections::HashMap,
3    sync::{Arc, LazyLock, RwLock},
4};
5
6use media_core::{frame::Frame, variant::Variant, Result};
7
8use crate::{
9    codec::{find_codec, find_codec_by_name, register_codec, Codec, CodecBuilder, CodecID, CodecList, CodecParameters, LazyCodecList},
10    packet::Packet,
11};
12
13pub trait Decoder: Codec + Send + Sync {
14    fn send_packet(&mut self, parameters: Option<&CodecParameters>, packet: &Packet) -> Result<()>;
15    fn receive_frame(&mut self, parameters: Option<&CodecParameters>) -> Result<Frame<'_>>;
16}
17
18pub trait DecoderBuilder: CodecBuilder {
19    fn new_decoder(&self, codec_id: CodecID, parameters: Option<CodecParameters>, options: Option<Variant>) -> Result<Box<dyn Decoder>>;
20}
21
22type DecoderBuilderList = CodecList<Arc<dyn DecoderBuilder>>;
23
24pub struct DecoderContext {
25    pub parameters: Option<CodecParameters>,
26    pub options: Option<Variant>,
27    decoder: Box<dyn Decoder>,
28}
29
30static CODEC_LIST: LazyCodecList<dyn DecoderBuilder> = LazyLock::new(|| {
31    RwLock::new(DecoderBuilderList {
32        codecs: HashMap::new(),
33    })
34});
35
36pub fn register_decoder(builder: Arc<dyn DecoderBuilder>, default: bool) -> Result<()> {
37    register_codec(&CODEC_LIST, builder, default)
38}
39
40pub(crate) fn find_decoder(codec_id: CodecID) -> Result<Arc<dyn DecoderBuilder>> {
41    find_codec(&CODEC_LIST, codec_id)
42}
43
44pub(crate) fn find_decoder_by_name(name: &str) -> Result<Arc<dyn DecoderBuilder>> {
45    find_codec_by_name(&CODEC_LIST, name)
46}
47
48impl DecoderContext {
49    pub fn from_codec_id(codec_id: CodecID, parameters: Option<CodecParameters>, options: Option<Variant>) -> Result<Self> {
50        let builder = find_decoder(codec_id)?;
51        let decoder = builder.new_decoder(codec_id, parameters.clone(), options.clone())?;
52
53        Ok(Self {
54            parameters,
55            options,
56            decoder,
57        })
58    }
59
60    pub fn from_codec_name(name: &str, parameters: Option<CodecParameters>, options: Option<Variant>) -> Result<Self> {
61        let builder = find_decoder_by_name(name)?;
62        let decoder = builder.new_decoder(builder.id(), parameters.clone(), options.clone())?;
63
64        Ok(Self {
65            parameters,
66            options,
67            decoder,
68        })
69    }
70
71    pub fn send_packet(&mut self, packet: &Packet) -> Result<()> {
72        let params = self.parameters.as_ref();
73        self.decoder.send_packet(params, packet)
74    }
75
76    pub fn receive_frame(&mut self) -> Result<Frame<'_>> {
77        let params = self.parameters.as_ref();
78        self.decoder.receive_frame(params)
79    }
80}