Documentation
use super::buffer::AtomicBuffer;
use super::rtcpreader::RTCPReader;
use std::collections::HashMap;
use std::sync::Arc;
use tokio::sync::Mutex;
#[derive(Default)]
pub struct Factory {
    #[allow(dead_code)]
    video_pool_size: usize,
    #[allow(dead_code)]
    audio_pool_size: usize,
    pub rtp_buffers: HashMap<u32, Arc<AtomicBuffer>>,
    pub rtcp_readers: HashMap<u32, Arc<Mutex<RTCPReader>>>,
}
#[derive(Default)]
pub struct AtomicFactory {
    factory: Arc<Mutex<Factory>>,
}

impl AtomicFactory {
    pub fn new(video_pool_size: usize, audio_pool_size: usize) -> Self {
        Self {
            factory: Arc::new(Mutex::new(Factory {
                video_pool_size,
                audio_pool_size,
                ..Default::default()
            })),
        }
    }

    pub async fn get_or_new_rtcp_buffer(&self, ssrc: u32) -> Arc<Mutex<RTCPReader>> {
        let factory = &mut self.factory.lock().await;

        if let Some(reader) = factory.rtcp_readers.get_mut(&ssrc) {
            return reader.clone();
        }

        let reader = Arc::new(Mutex::new(RTCPReader::new(ssrc)));
        factory.rtcp_readers.insert(ssrc, reader.clone());

        reader
    }

    pub async fn get_or_new_buffer(&self, ssrc: u32) -> Arc<AtomicBuffer> {
        let factory = &mut self.factory.lock().await;

        if let Some(reader) = factory.rtp_buffers.get_mut(&ssrc) {
            return reader.clone();
        }

        let reader = Arc::new(AtomicBuffer::new(ssrc));
        factory.rtp_buffers.insert(ssrc, reader.clone());

        reader
    }
}