[vlc-devel] VLC and ff / rewind, again ...

j.zorko at att.net j.zorko at att.net
Sun May 4 03:11:52 CEST 2003

Hello, all ...

I am tasked to make VLC, while acting as a media server (not decoding / playing the media), able 
to respond to fast-forward and rewind commands, and do the right thing.  It was easy enough 
adding this functionality on a purely temporal basis ... rewind seeks back n seconds, fast-forward 
seeks forward n seconds, and this keeps happening until told to stop, and I merely changed the 
remote control interface to call input_Seek( p_input, i_new_pos, INPUT_SEEK_SECONDS) in between 
the calls to select().  This way the input thread gets the chance to read some data, the FIFO gets 
filled, the output module gets to send this data out to the network, and the end result is that any 
client VLCs tuning in to the server will hear something representative of the fast-forward or rewind 
action happening.

Now, this is all cool, but for video it really stinks -- seeking to some arbitrary time in the media 
file tends to a.) produce some really jerky or bad video artifacts in any client VLCs tuned in to the 
server VLC, and sometimes the client VLCs even crash (decoder fed data it wasn't expecting, 
perhaps).  So I need to extend this server-based rewind / ff mechanism to rewind not based on 
time, but (for video at least) based on a start code (I frames / GOPs perhaps).

VLC is not built for this, evidently -- the decoder is not instantiated in a VLC acting only as a 
server, the decoder lives on the other side of the FIFO wall, etc.  So i'm implementing a new way to 
seek on the input stream, by calling input_Seek( p_input, i_new_pos, INPUT_SEEK_STARTCODE).  
I've got the plumbing all in there so far, using the VLC ways of doing things, and i've added a 
Seek_Special() method to modules/access/file.c that gets called when I want it to.  This function 
will basically to a lseek() backwards or forwards, read some data, find the start code it's looking for 
(or the nth occurence of the start code it's looking for), do one final lseek() to that point, and 
return.  Everything is done and working except the last (lseek()) part (the Seek_Special() function 
basically seeks forward or backward 1000 bytes at a time and returns, it doesn't do the read and 
look for the start code yet, but this is simple enough to add).

OK ... you know, this feels wrong, though.  This is basically duplicating a bit of the functionality of 
the decoder stuff that lives on the other side of the FIFO, but only enough to decode the media 
down to a specific start code.  Since neither VLC nor VLS does RTSP, for instance, this seems like 
the only way I can do it, after studying the VLC source for a few days.  Can anyone who is 
intimately familiar with VLC tell me if there is a cleaner way to do this?


John, VLC hacker (who wants to do it right)

Falling You - exploring the beauty 
of voice and sound

This is the vlc-devel mailing-list, see http://www.videolan.org/vlc/
To unsubscribe, please read http://developers.videolan.org/lists.html
If you are in trouble, please contact <postmaster at videolan.org>

More information about the vlc-devel mailing list