singe-npp 0.1.0-alpha.8

Safe Rust wrappers for NVIDIA Performance Primitives library (NPP).
Documentation
use singe_cuda::memory::DeviceMemory;

use crate::{
    context::StreamContext,
    error::Result,
    image::view::{ImageView, MaskView},
};

pub trait MeanStandardDeviationImage<T, L> {
    const OUTPUT_CHANNELS: usize;

    fn mean_standard_deviation(
        stream_context: &StreamContext,
        source: &ImageView<'_, T, L>,
        mean: &mut DeviceMemory<f64>,
        standard_deviation: &mut DeviceMemory<f64>,
    ) -> Result<()>;
}

pub trait MaskedMeanStandardDeviationImage<T, L> {
    const OUTPUT_CHANNELS: usize;

    fn mean_standard_deviation_masked(
        stream_context: &StreamContext,
        source: &ImageView<'_, T, L>,
        mask: &MaskView<'_>,
        mean: &mut DeviceMemory<f64>,
        standard_deviation: &mut DeviceMemory<f64>,
    ) -> Result<()>;
}

pub trait ChannelMeanStandardDeviationImage<T, L> {
    fn mean_standard_deviation_channel(
        stream_context: &StreamContext,
        source: &ImageView<'_, T, L>,
        channel: usize,
        mean: &mut DeviceMemory<f64>,
        standard_deviation: &mut DeviceMemory<f64>,
    ) -> Result<()>;
}

pub trait MaskedChannelMeanStandardDeviationImage<T, L> {
    fn mean_standard_deviation_channel_masked(
        stream_context: &StreamContext,
        source: &ImageView<'_, T, L>,
        mask: &MaskView<'_>,
        channel: usize,
        mean: &mut DeviceMemory<f64>,
        standard_deviation: &mut DeviceMemory<f64>,
    ) -> Result<()>;
}

macro_rules! impl_mean_standard_deviation_image {
    ($ty:ty, $layout:ty, $mean_standard_deviation:path) => {
        impl<'a> MeanStandardDeviationImage<$ty, $layout> for ImagePipeline<'a, $ty, $layout> {
            const OUTPUT_CHANNELS: usize = <$layout as ChannelLayout>::CHANNELS;

            fn mean_standard_deviation(
                stream_context: &StreamContext,
                source: &ImageView<'_, $ty, $layout>,
                mean: &mut DeviceMemory<f64>,
                standard_deviation: &mut DeviceMemory<f64>,
            ) -> Result<()> {
                $mean_standard_deviation(stream_context, source, mean, standard_deviation)
            }
        }
    };
}

macro_rules! impl_masked_mean_standard_deviation_image {
    ($ty:ty, $mean_standard_deviation:path) => {
        impl<'a> MaskedMeanStandardDeviationImage<$ty, C1> for ImagePipeline<'a, $ty, C1> {
            const OUTPUT_CHANNELS: usize = 1;

            fn mean_standard_deviation_masked(
                stream_context: &StreamContext,
                source: &ImageView<'_, $ty, C1>,
                mask: &MaskView<'_>,
                mean: &mut DeviceMemory<f64>,
                standard_deviation: &mut DeviceMemory<f64>,
            ) -> Result<()> {
                $mean_standard_deviation(stream_context, source, mask, mean, standard_deviation)
            }
        }
    };
}

macro_rules! impl_channel_mean_standard_deviation_image {
    ($ty:ty, $layout:ty, $mean_standard_deviation:path) => {
        impl<'a> ChannelMeanStandardDeviationImage<$ty, $layout>
            for ImagePipeline<'a, $ty, $layout>
        {
            fn mean_standard_deviation_channel(
                stream_context: &StreamContext,
                source: &ImageView<'_, $ty, $layout>,
                channel: usize,
                mean: &mut DeviceMemory<f64>,
                standard_deviation: &mut DeviceMemory<f64>,
            ) -> Result<()> {
                $mean_standard_deviation(stream_context, source, channel, mean, standard_deviation)
            }
        }
    };
}

macro_rules! impl_masked_channel_mean_standard_deviation_image {
    ($ty:ty, $layout:ty, $mean_standard_deviation:path) => {
        impl<'a> MaskedChannelMeanStandardDeviationImage<$ty, $layout>
            for ImagePipeline<'a, $ty, $layout>
        {
            fn mean_standard_deviation_channel_masked(
                stream_context: &StreamContext,
                source: &ImageView<'_, $ty, $layout>,
                mask: &MaskView<'_>,
                channel: usize,
                mean: &mut DeviceMemory<f64>,
                standard_deviation: &mut DeviceMemory<f64>,
            ) -> Result<()> {
                $mean_standard_deviation(
                    stream_context,
                    source,
                    mask,
                    channel,
                    mean,
                    standard_deviation,
                )
            }
        }
    };
}