Hi,

as written on the devel list, I'm thinking about adding seek support to
file transfers. I'm working on media networks in my PhD thesis and a
seekable stream is exactly what I need. First a small scenario why I
think it is useful:

I have a media server with a video file. This could either be a storage
server for my media files or a record server with the latest recordings
I made. Now I want to watch that video. The current approach is to use
the file transfer and start watching while the bytes are coming in. This
is similar to watching a video file over HTTP. But there are two
problems:

1. If it is a recording, I may want to skip the first minutes (recording
   started to early) or skip the commercials. I don't not like to wait
   until the file transfer has catched up.

2. Some video container have an (optional) index at the end of the
   file. To play such a file the player should read the first bytes and
   the last bytes before starting playback.

We also don't want to set up a new stream using SOCKS5 or a future
ICE-TCP every time the user seeks (IBB is a stupid idea here, so we
ignore it). So we have one stream for the data and should use XMPP
stanzas for controlling it.

I see two ways of doing it right now, maybe someone has a better idea

1. Add the number of bytes you want to receive on the stream.

   | Player: send me bytes 0-1023
   | File-Server sends the first kb over the data stream
   | Player: send me bytes 1024-2047
   | File-Server sends the second kb over the data stream

   Well, 1kb may not be a good choice, maybe request 1MB chunks. It is
   up to the application and use case.

   Pros: good control over the stream
   Cons: requires many XMPP messages.

2. Assume that the initiator wants to read the stream like a normal file
   transfer and add some marks to the stream similar to HTTP chunks:

   | File-Server sends "0 1024\n" over the data stream
   | File-Server sends first kb over the data stream
   | File-Server sends "1024 1024\n" over the data stream
   | File-Server sends second kb over the data stream
   | Player sends seek to byte 528743 command, but it takes some time
   |    until that request makes it to the file server
   | File-Server sends "2048 1024\n" over the data stream
   | File-Server sends third kb over the data stream
   | File-Server got the seek request
   | File-Server sends "528743 1024\n" over the data stream
   | File-Server sends 1 kb starting from byte 528743 over the data stream

   HTTP chunks use ASCII for the metadata like stream position, we could
   replace "1024 1024\n" with a binary struct containing position and
   length of a chunk.
   
What do you think about that? Should it be part of the Jingle file
transfer XEP? If 2. is used, the initiator of the session requesting the
stream should be able to turn it off for normal file transfer without
the metadata (maybe by setting chunk size to 0).


Dirk

-- 
Did you know that dolphins are so intelligent that within only a few
weeks of captivity, they can train Americans to stand at the very edge
of the pool and throw them fish.

Reply via email to