mirror of
https://github.com/encounter/rust-ffmpeg.git
synced 2026-07-10 21:18:39 -07:00
fix: make sure io::Error is always converted to an errno
This commit is contained in:
+21
-12
@@ -1,5 +1,5 @@
|
||||
use std::{slice, convert::TryInto, io::{Read, Write, Seek, SeekFrom}, ptr};
|
||||
use libc::{c_void, c_int, SEEK_CUR, SEEK_END, SEEK_SET};
|
||||
use std::{slice, convert::TryInto, io::{self, Read, Write, Seek, SeekFrom}, ptr};
|
||||
use libc::{c_void, c_int, SEEK_CUR, SEEK_END, SEEK_SET, EINVAL};
|
||||
use crate::{ffi::*, format::context, Error};
|
||||
|
||||
pub enum Proxy {
|
||||
@@ -57,6 +57,15 @@ impl Io {
|
||||
}
|
||||
}
|
||||
|
||||
fn as_error(err: io::Error) -> c_int {
|
||||
if let Some(value) = err.raw_os_error() {
|
||||
value.try_into().unwrap()
|
||||
}
|
||||
else {
|
||||
EINVAL
|
||||
}
|
||||
}
|
||||
|
||||
unsafe extern "C" fn read_packet(opaque: *mut c_void, buf: *mut u8, size: c_int) -> c_int {
|
||||
let mut proxy = Box::<Proxy>::from_raw(opaque.cast());
|
||||
let buffer = slice::from_raw_parts_mut(buf, size.try_into().unwrap());
|
||||
@@ -64,7 +73,7 @@ unsafe extern "C" fn read_packet(opaque: *mut c_void, buf: *mut u8, size: c_int)
|
||||
let result = match proxy.as_read().read(buffer) {
|
||||
Ok(0) => AVERROR_EOF,
|
||||
Ok(size) => size.try_into().unwrap(),
|
||||
Err(err) => err.raw_os_error().unwrap().try_into().unwrap(),
|
||||
Err(err) => as_error(err),
|
||||
};
|
||||
|
||||
Box::into_raw(proxy);
|
||||
@@ -74,11 +83,11 @@ unsafe extern "C" fn read_packet(opaque: *mut c_void, buf: *mut u8, size: c_int)
|
||||
unsafe extern "C" fn seek(opaque: *mut c_void, offset: i64, whence: c_int) -> i64 {
|
||||
let mut proxy = Box::<Proxy>::from_raw(opaque.cast());
|
||||
|
||||
let result = if whence == AVSEEK_SIZE {
|
||||
let result: i64 = if whence == AVSEEK_SIZE {
|
||||
#[cfg(feature = "unstable")]
|
||||
match proxy.as_seek().stream_len() {
|
||||
Ok(size) => size,
|
||||
Err(err) => err.raw_os_error().unwrap().try_into().unwrap(),
|
||||
Err(err) => as_error(err),
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "unstable"))]
|
||||
@@ -93,26 +102,26 @@ unsafe extern "C" fn seek(opaque: *mut c_void, offset: i64, whence: c_int) -> i6
|
||||
};
|
||||
|
||||
match proxy.as_seek().seek(whence) {
|
||||
Ok(size) => size,
|
||||
Err(err) => err.raw_os_error().unwrap().try_into().unwrap(),
|
||||
Ok(size) => size.try_into().unwrap(),
|
||||
Err(err) => as_error(err).into(),
|
||||
}
|
||||
};
|
||||
|
||||
Box::into_raw(proxy);
|
||||
result.try_into().unwrap()
|
||||
result
|
||||
}
|
||||
|
||||
unsafe extern "C" fn write_packet(opaque: *mut c_void, buf: *mut u8, size: c_int) -> c_int {
|
||||
let mut proxy = Box::<Proxy>::from_raw(opaque.cast());
|
||||
let buffer = slice::from_raw_parts(buf, size.try_into().unwrap());
|
||||
|
||||
let result = match proxy.as_write().write(buffer) {
|
||||
Ok(size) => size,
|
||||
Err(err) => err.raw_os_error().unwrap().try_into().unwrap(),
|
||||
let result: c_int = match proxy.as_write().write(buffer) {
|
||||
Ok(size) => size.try_into().unwrap(),
|
||||
Err(err) => as_error(err),
|
||||
};
|
||||
|
||||
Box::into_raw(proxy);
|
||||
result.try_into().unwrap()
|
||||
result
|
||||
}
|
||||
|
||||
impl Io {
|
||||
|
||||
Reference in New Issue
Block a user