cobrand / mpv-rs Goto Github PK
View Code? Open in Web Editor NEWsafe mpv bindings for Rust
License: Apache License 2.0
safe mpv bindings for Rust
License: Apache License 2.0
The structs MpvHandler
, MpvHandlerWithGl
, MpvHandlerBuilder
do not have std::fmt::Debug
implemented.
Specifically, the segfault happens when the reply is received. Somewhere, (I guess as result) a null pointer is returned from libmpv, which mpv-rs tries to turn into a CStr
. This happens here.
A simple change like this prevents the segfault:
Format::Str(if char_ptr != 0 as *mut _ {
unsafe {
CStr::from_ptr(char_ptr)
.to_str()
.unwrap()
}
}
else {
""
})
But I can't say if this is a proper solution. Also, the same probably happens for OsdStr but I don't even know what OsdStr is used for.
The issue can easily be reproduced by adding the following line to examples/simple.rs
:
mpv.get_property_async::<&str>("nonexistent", 1).unwrap();
The bottom row of pixels is black in the SDL2 example. Maybe the whole video is shifted up by 1 px for some reason?
In the simple example it looks correct. [Link to test video]
Btw, the simple example uses 14% CPU while SDL2 example only uses 0.87% CPU, why?
Is it also possible to render video with glutin/glium with as low CPU usage as SDL2?
In this line, an uint64_t
is defined as an unsigned long
. This is not the case on Linux in 32bit.
Symptom:
Thread 1 hit Breakpoint 2, mpv_wait_event (ctx=0x73c822a0, timeout=1000) at ../player/client.c:849
849 return event;
1: *event = {event_id = MPV_EVENT_END_FILE, error = 0, reply_userdata = 0, data = 0x7320c048}
(gdb) n
850 }
(gdb)
mpv::mpv_handler::MpvHandler::wait_event::h37d3a3d836c63369 (self=0x7efff0c4, timeout=1000)
at /home/pi/.cargo/registry/src/github.com-1ecc6299db9ec823/mpv-0.2.3/src/mpv_handler.rs:350
350 if ptr.is_null() {
(gdb) print *ptr
$1 = mpv::mpv_gen::Struct_mpv_event {event_id: mpv::mpv_gen::MPV_EVENT_END_FILE, error: 0, reply_userdata: 0, data: 0x0}
(gdb) x/5x ptr
0x73c48ef8: 0x00000007 0x00000000 0x00000000 0x00000000
0x73c48f08: 0x7320c048
Note how in C data is 0x7320c048
, but Rust thinks that data is NULL
. When you look at the memory dump, the correct pointer is still there, but Rust is out of alignment with the structure:
typedef struct mpv_event {
mpv_event_id event_id;
int error;
uint64_t reply_userdata;
void *data;
} mpv_event;
This is the structure in mpv_gen.rs
:
#[repr(C)]
#[derive(Copy)]
pub struct Struct_mpv_event {
pub event_id: mpv_event_id,
pub error: ::std::os::raw::c_int,
pub reply_userdata: uint64_t,
pub data: *mut ::std::os::raw::c_void,
}
which looks ok, but since uint64_t
is actually only four bytes long, it's not.
This took ages to find.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.