media-core 0.9.1

Define media types and provide basic media utilities
Documentation
use std::fmt::Debug;

use bytemuck::Pod;
use media_core::{audio::SampleFormat, frame::Frame};

fn test_audio_convert<I, O>(src_fmt: SampleFormat, dst_fmt: SampleFormat, channels: u8, input_value: I, output_value: O)
where
    I: Pod + Copy,
    O: Pod + Copy + Debug + PartialEq,
{
    let samples = 960;
    let sample_rate = 48000;

    let mut input_frame = Frame::audio_creator().create(src_fmt, channels, samples, sample_rate).unwrap();
    let mut output_frame = Frame::audio_creator().create(dst_fmt, channels, samples, sample_rate).unwrap();

    if let Ok(mut guard) = input_frame.map_mut() {
        if let Some(planes) = guard.planes_mut() {
            for mut plane in planes {
                let data = plane.as_mut_slice_of::<I>().unwrap();
                data.fill(input_value);
            }
        }
    }

    let result = input_frame.convert_audio_to(&mut output_frame);
    assert!(result.is_ok(), "convert from {:?} to {:?} failed: {:?}", src_fmt, dst_fmt, result);

    let map_result = output_frame.map();
    if let Ok(guard) = map_result {
        if let Some(planes) = guard.planes() {
            for plane in planes {
                let data = plane.as_slice_of::<O>().unwrap();
                for &sample in data {
                    assert_eq!(sample, output_value);
                }
            }
        }
    }
}

#[test]
fn test_u8_to_s16() {
    test_audio_convert(SampleFormat::U8, SampleFormat::S16, 1, u8::MIN, i16::MIN);
    test_audio_convert(SampleFormat::U8P, SampleFormat::S16, 2, 0x80u8, 0i16);
}

#[test]
fn test_u8_to_s32() {
    test_audio_convert(SampleFormat::U8, SampleFormat::S32, 1, u8::MIN, i32::MIN);
    test_audio_convert(SampleFormat::U8P, SampleFormat::S32, 2, 0x80u8, 0i32);
}

#[test]
fn test_u8_to_s64() {
    test_audio_convert(SampleFormat::U8, SampleFormat::S64, 1, u8::MIN, i64::MIN);
    test_audio_convert(SampleFormat::U8P, SampleFormat::S64, 2, 0x80u8, 0i64);
}

#[test]
fn test_u8_to_f32() {
    test_audio_convert(SampleFormat::U8, SampleFormat::F32, 1, u8::MIN, -1.0f32);
    test_audio_convert(SampleFormat::U8, SampleFormat::F32P, 2, 0x80u8, 0.0f32);
}

#[test]
fn test_u8_to_f64() {
    test_audio_convert(SampleFormat::U8, SampleFormat::F64, 1, u8::MIN, -1.0f64);
    test_audio_convert(SampleFormat::U8, SampleFormat::F64P, 2, 0x80u8, 0.0f64);
}

#[test]
fn test_s16_to_u8() {
    test_audio_convert(SampleFormat::S16, SampleFormat::U8, 1, i16::MIN, u8::MIN);
    test_audio_convert(SampleFormat::S16P, SampleFormat::U8, 2, 0i16, 0x80u8);
    test_audio_convert(SampleFormat::S16, SampleFormat::U8P, 2, i16::MAX, u8::MAX);
}

#[test]
fn test_s16_to_s32() {
    test_audio_convert(SampleFormat::S16, SampleFormat::S32, 1, i16::MIN, i32::MIN);
    test_audio_convert(SampleFormat::S16P, SampleFormat::S32, 2, 0i16, 0i32);
}

#[test]
fn test_s16_to_s64() {
    test_audio_convert(SampleFormat::S16, SampleFormat::S64, 1, i16::MIN, i64::MIN);
    test_audio_convert(SampleFormat::S16P, SampleFormat::S64, 2, 0i16, 0i64);
}

#[test]
fn test_s16_to_f32() {
    test_audio_convert(SampleFormat::S16, SampleFormat::F32, 1, i16::MIN, -1.0f32);
    test_audio_convert(SampleFormat::S16P, SampleFormat::F32, 2, 0i16, 0.0f32);
}

#[test]
fn test_s16_to_f64() {
    test_audio_convert(SampleFormat::S16, SampleFormat::F64, 1, i16::MIN, -1.0f64);
    test_audio_convert(SampleFormat::S16P, SampleFormat::F64, 2, 0i16, 0.0f64);
}

#[test]
fn test_s32_to_u8() {
    test_audio_convert(SampleFormat::S32, SampleFormat::U8, 1, i32::MIN, u8::MIN);
    test_audio_convert(SampleFormat::S32P, SampleFormat::U8, 2, 0i32, 0x80u8);
    test_audio_convert(SampleFormat::S32, SampleFormat::U8P, 2, i32::MAX, u8::MAX);
}

#[test]
fn test_s32_to_s16() {
    test_audio_convert(SampleFormat::S32, SampleFormat::S16, 1, i32::MIN, i16::MIN);
    test_audio_convert(SampleFormat::S32P, SampleFormat::S16, 2, 0i32, 0i16);
    test_audio_convert(SampleFormat::S32, SampleFormat::S16P, 2, i32::MAX, i16::MAX);
}

#[test]
fn test_s32_to_s64() {
    test_audio_convert(SampleFormat::S32, SampleFormat::S64, 1, i32::MIN, i64::MIN);
    test_audio_convert(SampleFormat::S32P, SampleFormat::S64, 2, 0i32, 0i64);
}

#[test]
fn test_s32_to_f32() {
    test_audio_convert(SampleFormat::S32, SampleFormat::F32, 1, i32::MIN, -1.0f32);
    test_audio_convert(SampleFormat::S32P, SampleFormat::F32, 2, 0i32, 0.0f32);
}

#[test]
fn test_s32_to_f64() {
    test_audio_convert(SampleFormat::S32, SampleFormat::F64, 1, i32::MIN, -1.0f64);
    test_audio_convert(SampleFormat::S32P, SampleFormat::F64, 2, 0i32, 0.0f64);
}

#[test]
fn test_s64_to_u8() {
    test_audio_convert(SampleFormat::S64, SampleFormat::U8, 1, i64::MIN, u8::MIN);
    test_audio_convert(SampleFormat::S64P, SampleFormat::U8, 2, 0i64, 0x80u8);
    test_audio_convert(SampleFormat::S64, SampleFormat::U8P, 2, i64::MAX, u8::MAX);
}

#[test]
fn test_s64_to_s16() {
    test_audio_convert(SampleFormat::S64, SampleFormat::S16, 1, i64::MIN, i16::MIN);
    test_audio_convert(SampleFormat::S64P, SampleFormat::S16, 2, 0i64, 0i16);
    test_audio_convert(SampleFormat::S64, SampleFormat::S16P, 2, i64::MAX, i16::MAX);
}

#[test]
fn test_s64_to_s32() {
    test_audio_convert(SampleFormat::S64, SampleFormat::S32, 1, i64::MIN, i32::MIN);
    test_audio_convert(SampleFormat::S64P, SampleFormat::S32, 2, 0i64, 0i32);
    test_audio_convert(SampleFormat::S64, SampleFormat::S32P, 2, i64::MAX, i32::MAX);
}

#[test]
fn test_s64_to_f32() {
    test_audio_convert(SampleFormat::S64, SampleFormat::F32, 1, i64::MIN, -1.0f32);
    test_audio_convert(SampleFormat::S64P, SampleFormat::F32, 2, 0i64, 0.0f32);
}

#[test]
fn test_s64_to_f64() {
    test_audio_convert(SampleFormat::S64, SampleFormat::F64, 1, i64::MIN, -1.0f64);
    test_audio_convert(SampleFormat::S64P, SampleFormat::F64, 2, 0i64, 0.0f64);
}

#[test]
fn test_f32_to_u8() {
    test_audio_convert(SampleFormat::F32, SampleFormat::U8, 1, -1.0f32, u8::MIN);
    test_audio_convert(SampleFormat::F32P, SampleFormat::U8, 2, 0.0f32, 0x80u8);
    test_audio_convert(SampleFormat::F32, SampleFormat::U8P, 2, 1.0f32, u8::MAX);
}

#[test]
fn test_f32_to_s16() {
    test_audio_convert(SampleFormat::F32, SampleFormat::S16, 1, -1.0f32, i16::MIN);
    test_audio_convert(SampleFormat::F32P, SampleFormat::S16, 2, 0.0f32, 0i16);
    test_audio_convert(SampleFormat::F32, SampleFormat::S16P, 2, 1.0f32, i16::MAX);
}

#[test]
fn test_f32_to_s32() {
    test_audio_convert(SampleFormat::F32, SampleFormat::S32, 1, -1.0f32, i32::MIN);
    test_audio_convert(SampleFormat::F32P, SampleFormat::S32, 2, 0.0f32, 0i32);
    test_audio_convert(SampleFormat::F32, SampleFormat::S32P, 2, 1.0f32, i32::MAX);
}

#[test]
fn test_f32_to_s64() {
    test_audio_convert(SampleFormat::F32, SampleFormat::S64, 1, -1.0f32, i64::MIN);
    test_audio_convert(SampleFormat::F32P, SampleFormat::S64, 2, 0.0f32, 0i64);
    test_audio_convert(SampleFormat::F32, SampleFormat::S64P, 2, 1.0f32, i64::MAX);
}

#[test]
fn test_f32_to_f64() {
    test_audio_convert(SampleFormat::F32, SampleFormat::F64, 1, -1.0f32, -1.0f64);
    test_audio_convert(SampleFormat::F32P, SampleFormat::F64, 2, 0.0f32, 0.0f64);
    test_audio_convert(SampleFormat::F32, SampleFormat::F64P, 2, 1.0f32, 1.0f64);
}

#[test]
fn test_f64_to_u8() {
    test_audio_convert(SampleFormat::F64, SampleFormat::U8, 1, -1.0f64, u8::MIN);
    test_audio_convert(SampleFormat::F64P, SampleFormat::U8, 2, 0.0f64, 0x80u8);
    test_audio_convert(SampleFormat::F64, SampleFormat::U8P, 2, 1.0f64, u8::MAX);
}

#[test]
fn test_f64_to_s16() {
    test_audio_convert(SampleFormat::F64, SampleFormat::S16, 1, -1.0f64, i16::MIN);
    test_audio_convert(SampleFormat::F64P, SampleFormat::S16, 2, 0.0f64, 0i16);
    test_audio_convert(SampleFormat::F64, SampleFormat::S16P, 2, 1.0f64, i16::MAX);
}

#[test]
fn test_f64_to_s32() {
    test_audio_convert(SampleFormat::F64, SampleFormat::S32, 1, -1.0f64, i32::MIN);
    test_audio_convert(SampleFormat::F64P, SampleFormat::S32, 2, 0.0f64, 0i32);
    test_audio_convert(SampleFormat::F64, SampleFormat::S32P, 2, 1.0f64, i32::MAX);
}

#[test]
fn test_f64_to_s64() {
    test_audio_convert(SampleFormat::F64, SampleFormat::S64, 1, -1.0f64, i64::MIN);
    test_audio_convert(SampleFormat::F64P, SampleFormat::S64, 2, 0.0f64, 0i64);
    test_audio_convert(SampleFormat::F64, SampleFormat::S64P, 2, 1.0f64, i64::MAX);
}

#[test]
fn test_f64_to_f32() {
    test_audio_convert(SampleFormat::F64, SampleFormat::F32, 1, -1.0f64, -1.0f32);
    test_audio_convert(SampleFormat::F64P, SampleFormat::F32, 2, 0.0f64, 0.0f32);
    test_audio_convert(SampleFormat::F64, SampleFormat::F32P, 2, 1.0f64, 1.0f32);
}