libde265-sys2 0.1.0

libde265 bindings
Documentation
use std::ffi::CStr;
use std::fs::File;
use std::io::Read;
use std::os::raw::c_int;
use std::ptr;

use libde265_sys2::*;

#[test]
fn create_libde265_decoder() {
    let expected_version = get_version().to_string() + ".";
    unsafe {
        assert_eq!(de265_init(), de265_error::DE265_OK);

        let version = CStr::from_ptr(de265_get_version()).to_string_lossy();
        assert!(version.starts_with(&expected_version));

        let decoder_ctx = de265_new_decoder();
        assert!(!decoder_ctx.is_null());
        de265_free_decoder(decoder_ctx);

        assert_eq!(de265_free(), de265_error::DE265_OK);
    }
}

fn get_version() -> &'static str {
    if cfg!(feature = "v1_0") { "1.0" } else { "1.0" }
}

#[test]
fn decode_h265() {
    unsafe {
        assert_eq!(de265_init(), de265_error::DE265_OK);
        let decoder_ctx = de265_new_decoder();

        let mut file = File::open("./data/girlshy.h265").unwrap();
        let mut buf = vec![0; 1024];
        let mut images_count = 0;
        loop {
            let mut more: c_int = 0;
            let err = de265_decode(decoder_ctx, &mut more);

            match err {
                de265_error::DE265_OK if more == 0 => break,
                de265_error::DE265_OK | de265_error::DE265_ERROR_IMAGE_BUFFER_FULL => {
                    // Get available images
                    while let img = de265_peek_next_picture(decoder_ctx)
                        && !img.is_null()
                    {
                        images_count += 1;
                        let width = de265_get_image_width(img, 0);
                        let height = de265_get_image_height(img, 0);
                        assert_eq!(width, 316);
                        assert_eq!(height, 240);

                        let mut stride: c_int = 0;
                        let plane_buf = de265_get_image_plane(img, 0, &mut stride);
                        assert!(!plane_buf.is_null());
                        assert_eq!(stride, 320);

                        de265_release_next_picture(decoder_ctx);
                    }
                }
                de265_error::DE265_ERROR_WAITING_FOR_INPUT_DATA => {}
                _ => panic!("unexpected error: {:?}", err),
            }

            // Load more video data into 'buf'
            let size = file.read(&mut buf).unwrap();
            if size == 0 {
                // EOF
                assert_eq!(de265_flush_data(decoder_ctx), de265_error::DE265_OK);
            } else {
                assert_eq!(
                    de265_push_data(
                        decoder_ctx,
                        buf.as_ptr() as _,
                        size as _,
                        0,
                        ptr::null_mut(),
                    ),
                    de265_error::DE265_OK
                );
            }
        }

        assert_eq!(images_count, 75);

        de265_free_decoder(decoder_ctx);
        assert_eq!(de265_free(), de265_error::DE265_OK);
    }
}