Merge pull request #200 from mahkoh/jorth/pipewire-release
pipewire: updates buffer metadata in correct order
This commit is contained in:
commit
33d5c61c37
2 changed files with 46 additions and 47 deletions
|
|
@ -120,7 +120,7 @@ pub struct PwClientNodePort {
|
||||||
|
|
||||||
pub buffer_config: Cell<Option<PwClientNodeBufferConfig>>,
|
pub buffer_config: Cell<Option<PwClientNodeBufferConfig>>,
|
||||||
|
|
||||||
pub io_buffers: CopyHashMap<u32, Rc<PwMemTyped<spa_io_buffers>>>,
|
pub io_buffers: CloneCell<Option<Rc<PwMemTyped<spa_io_buffers>>>>,
|
||||||
|
|
||||||
pub serial: Cell<bool>,
|
pub serial: Cell<bool>,
|
||||||
}
|
}
|
||||||
|
|
@ -705,12 +705,12 @@ impl PwClientNode {
|
||||||
let size = p2.read_uint()?;
|
let size = p2.read_uint()?;
|
||||||
let port = self.get_port(direction, port_id)?;
|
let port = self.get_port(direction, port_id)?;
|
||||||
match id {
|
match id {
|
||||||
SPA_IO_Buffers => {
|
SPA_IO_Buffers if mix_id == 0 => {
|
||||||
if mem_id == !0 {
|
if mem_id == !0 {
|
||||||
port.io_buffers.remove(&mix_id);
|
port.io_buffers.take();
|
||||||
} else {
|
} else {
|
||||||
port.io_buffers
|
port.io_buffers
|
||||||
.set(mix_id, self.con.mem.map(mem_id, offset, size)?.typed());
|
.set(Some(self.con.mem.map(mem_id, offset, size)?.typed()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
|
|
|
||||||
|
|
@ -405,54 +405,53 @@ impl UsrJayScreencastOwner for StartedScreencast {
|
||||||
|
|
||||||
fn ready(&self, ev: &Ready) {
|
fn ready(&self, ev: &Ready) {
|
||||||
let idx = ev.idx as usize;
|
let idx = ev.idx as usize;
|
||||||
if !self.buffers_valid.get() {
|
let buffers = &*self.buffers.borrow();
|
||||||
|
let pbuffers = self.port.buffers.borrow();
|
||||||
|
let buffer = &buffers[idx];
|
||||||
|
let discard_buffer = || {
|
||||||
self.jay_screencast.release_buffer(idx);
|
self.jay_screencast.release_buffer(idx);
|
||||||
|
};
|
||||||
|
if !self.buffers_valid.get() {
|
||||||
|
discard_buffer();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
unsafe {
|
let Some(io) = self.port.io_buffers.get() else {
|
||||||
let mut used = false;
|
discard_buffer();
|
||||||
if let Some(io) = self.port.io_buffers.lock().values().next() {
|
return;
|
||||||
let io = io.write();
|
};
|
||||||
let status = io.status.load(Acquire);
|
let Some(pbuffer) = pbuffers.get(idx) else {
|
||||||
if status != SPA_STATUS_HAVE_DATA.0 {
|
discard_buffer();
|
||||||
used = true;
|
return;
|
||||||
let buffer_id = io.buffer_id.load(Relaxed);
|
};
|
||||||
if buffer_id != ev.idx {
|
let io = unsafe { io.read() };
|
||||||
if (buffer_id as usize) < self.buffers.borrow_mut().len() {
|
if io.status.load(Acquire) == SPA_STATUS_HAVE_DATA.0 {
|
||||||
self.jay_screencast.release_buffer(buffer_id as usize);
|
discard_buffer();
|
||||||
}
|
return;
|
||||||
}
|
}
|
||||||
io.buffer_id.store(ev.idx, Relaxed);
|
for (chunk, plane) in pbuffer.chunks.iter().zip(buffer.planes.iter()) {
|
||||||
io.status.store(SPA_STATUS_HAVE_DATA.0, Release);
|
let chunk = unsafe { chunk.write() };
|
||||||
}
|
chunk.flags = SpaChunkFlags::none();
|
||||||
}
|
chunk.offset = plane.offset;
|
||||||
if !used {
|
chunk.stride = plane.stride;
|
||||||
self.jay_screencast.release_buffer(idx);
|
chunk.size = plane.stride * buffer.height as u32;
|
||||||
}
|
}
|
||||||
{
|
if let Some(crop) = &pbuffer.meta_video_crop {
|
||||||
let pbuffers = self.port.buffers.borrow_mut();
|
unsafe { crop.write() }.region = spa_region {
|
||||||
let buffers = self.buffers.borrow_mut();
|
position: spa_point { x: 0, y: 0 },
|
||||||
if let Some(pbuffer) = pbuffers.get(idx) {
|
size: spa_rectangle {
|
||||||
let buffer = &buffers[idx];
|
width: buffer.width as _,
|
||||||
for (chunk, plane) in pbuffer.chunks.iter().zip(buffer.planes.iter()) {
|
height: buffer.height as _,
|
||||||
let chunk = chunk.write();
|
},
|
||||||
chunk.flags = SpaChunkFlags::none();
|
};
|
||||||
chunk.offset = plane.offset;
|
}
|
||||||
chunk.stride = plane.stride;
|
let buffer_id = io.buffer_id.load(Relaxed) as usize;
|
||||||
chunk.size = plane.stride * buffer.height as u32;
|
if buffer_id != idx {
|
||||||
}
|
if buffer_id < buffers.len() {
|
||||||
if let Some(crop) = &pbuffer.meta_video_crop {
|
self.jay_screencast.release_buffer(buffer_id);
|
||||||
crop.write().region = spa_region {
|
|
||||||
position: spa_point { x: 0, y: 0 },
|
|
||||||
size: spa_rectangle {
|
|
||||||
width: buffer.width as _,
|
|
||||||
height: buffer.height as _,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
io.buffer_id.store(ev.idx, Relaxed);
|
||||||
|
io.status.store(SPA_STATUS_HAVE_DATA.0, Release);
|
||||||
if let Some(wfd) = self.port.node.transport_out.get() {
|
if let Some(wfd) = self.port.node.transport_out.get() {
|
||||||
let _ = uapi::eventfd_write(wfd.raw(), 1);
|
let _ = uapi::eventfd_write(wfd.raw(), 1);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue