From: Michael R. <mr...@us...> - 2005-07-28 10:27:16
|
Hi, >> if you try pausing the video in xine-ui, you will notice that osd is >> still cleared after a couple of seconds and resizing works. following >> the path of video_out.c:check_redraw_needed() you should be able to >> see how it works. > > Ah, yes, I had noticed this function but didn't think it would do > what I > needed because it's not working for me. :) > > The problem is that because my vo's display_frame function calls > get_frame() of the target (passthrough) vo, when the video is paused > this call seems to block, so the pause loop of my buffer vo never gets > iterated. > > Looking at video_out.c:paused_loop(), I see: > > pthread_mutex_lock( &this->free_img_buf_queue->mutex ); > /* prevent decoder thread from allocating new frames */ > this->free_img_buf_queue->locked_for_read = 1; > > So I assume that's what I'm running into: buffer_display_frame() wants > to allocate a frame from the passthrough/target vo, and it blocks, and > as a result, buffer_redraw_needed() never gets called again until the > video gets unpaused. I guess that's to ensure video frames are only allocated by upstream components to avoid deadlock. To work around that, you may have to keep one preallocated passthrough frame around in your output plugin for these situations. Michael |