media 0.1.0

A pure rust implementation of media framework
Documentation
use std::num::{NonZeroU32, NonZeroU8};

use crate::{
    audio::{AudioFormat, AudioFrameDescription},
    error::MediaError,
    media::MediaFrameType,
    media_frame::{Data, MediaFrame, MediaFrameData, MediaFrameDescription, MemoryData},
};

impl<'a> MemoryData<'a> {
    pub fn new_audio_data(format: AudioFormat, channels: NonZeroU8, samples: NonZeroU32) -> Result<Self, MediaError> {
        let (size, planes) = format.data_calc(channels.get(), samples.get());
        let initial_value = if matches!(format, AudioFormat::U8 | AudioFormat::U8P) {
            0x80
        } else {
            0
        };

        Ok(Self {
            data: Data::Owned(vec![initial_value; size as usize]),
            planes,
        })
    }
}

impl<'a> MediaFrame<'a> {
    pub fn new_audio_frame(desc: AudioFrameDescription) -> Result<Self, MediaError> {
        let data = MemoryData::new_audio_data(desc.format, desc.channels, desc.samples)?;

        Ok(Self {
            media_type: MediaFrameType::Audio,
            source: None,
            timestamp: 0,
            desc: MediaFrameDescription::Audio(desc),
            metadata: None,
            data: MediaFrameData::Memory(data),
        })
    }
}