openipc-video 0.1.40

Low-latency platform video decoding for OpenIPC applications
Documentation
use windows::Win32::Graphics::Dxgi::Common::DXGI_FORMAT_NV12;

use crate::{
    backends::test_fixtures::{H264_KEYFRAME, H265_KEYFRAME},
    DecodedSurface, DecoderOptions, EncodedAccessUnit, PixelFormat, VideoCodec, VideoDecoder,
    VideoTimestamp, WindowsDecoder,
};

#[test]
#[ignore = "requires a Windows D3D11 hardware video decoder"]
fn decodes_h264_to_a_d3d11_texture() {
    decode_fixture(VideoCodec::H264, H264_KEYFRAME);
}

#[test]
#[ignore = "requires a Windows D3D11 hardware video decoder"]
fn decodes_h265_to_a_d3d11_texture() {
    decode_fixture(VideoCodec::H265, H265_KEYFRAME);
}

fn decode_fixture(codec: VideoCodec, data: &[u8]) {
    let mut decoder = WindowsDecoder::new(DecoderOptions::default()).unwrap();
    for timestamp in 0..3 {
        decoder
            .submit(EncodedAccessUnit::new(
                codec,
                data.to_vec(),
                VideoTimestamp::from_rtp(timestamp),
                true,
            ))
            .unwrap();
        if let Some(frame) = decoder.latest_frame() {
            assert_eq!(frame.dimensions().width, 128);
            assert_eq!(frame.dimensions().height, 128);
            assert_eq!(frame.surface.pixel_format(), PixelFormat::Nv12VideoRange);
            assert_eq!(frame.surface.texture_desc().Format, DXGI_FORMAT_NV12);
            return;
        }
    }
    panic!(
        "Media Foundation produced no frame; stats={:?}",
        decoder.stats()
    );
}