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 => {
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),
}
let size = file.read(&mut buf).unwrap();
if size == 0 {
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);
}
}