[xiph-rtp] P2P Theora Header delivery; why not SDP?

Ralph Giles giles at xiph.org
Tue May 10 21:09:19 PDT 2005


On Tue, May 10, 2005 at 07:58:21PM -0700, David Barrett wrote:
> Hi, I'm a long fan of Theora, and am starting an RTP implementation with:
> 
> http://svn.xiph.org/branches/theora-mmx/doc/draft-kerr-avt-theora-rtp-00.txt

Hi! Always good to have feedback from another implementer.

Note that most of the details of that draft have been superceeded. 
Unfortunately no one has fed the new design back into creating a new 
draft. If you're curious, you can troll through the recent discussions
on the vorbis mapping; all the same issues apply and we intend to make 
the drafts as similar as possible.

> Am I correct in understanding there are only two ways to deliver
> configuration headers?
> 
> 1) "in-band" using RTP
> 2) "out-of-band" by downloading from a URI specified in the SDP using TCP

Well, "out-of-band" can be however you want, but there are a couple of 
proposals of a how to do the TCP reference in the SDP.

> If so, how would you recommend implementing this in a P2P setting in light
> of lossy UDP transmission and NAT piercing?  I see the following
> complications:
> 
> - With respect to #1, UDP is lossy, and RTP has no standard retransmission
> technique.  Furthermore, due to NAT-piercing issues, the initial RTP packets
> have the highest probability of being lost (because your NAT will block my
> RTP packets until you "punch a hole" by sending a packet back to me).

Right, this isn't going to work reliably.

> - With respect to #2, TCP cannot pierce NATs near to the same degree as UDP.
> Thus option #2 limits the range of deployment to those clients between which
> TCP connections can be established.

If you have a p2p infrastructure, can you use that to achieve lossless 
out-of-band transmission? Some sort of send+ack over udp like or 
outgoing channel to a non-NAT node like you'd use for file transfer?

> C) Use (B), but pre-populate it with a large library of headers from which
> clients can index in a read-only fashion.  This is better, but only works if
> header-generation is deterministic (ie, headers generated with the same
> settings are exactly the same).  I assume it is -- can anyone confirm this?

It's entirely up to the encoder. The current reference implementation 
uses a fixed setup for all inputs. This is the same as the VP3 decode 
config, so if you control the clients well enough, you could just 
standardize on that, and add other,better fixed general sets as they 
become available.

> In this way, I can just generate my headers locally, and use its CRC32 to
> index into the server's library.

Right. We've abandoned the CRC32 because of the risk of collisions 
causing random failures. The new draft will still have a setup id
in the RTP payload header, but it is only 16 bits. The idea that this
is an arbitrary mapping between either in-band header packets with the 
same id, or something arranged out-of-band e.g. with the SDP.

So, for example, you could put a longer (MD5 or SHA1) hash of the 
setup packet in the SDP to indicate to the decoder which one you
used, and then hardwire a set into the clients, so it's the only
one used and no one has to fetch anything.

I guess this is something you'd want to be able to negotiate of in the 
future heterogenous clients could choose the best common header.

> What I would prefer (and actually expected but was surprised not to find)
> would be a third option where the inputs into the header-generation process
> are simply specified in the SDP itself (on the assumption that
> header-generation is deterministic from these, and can be computed locally).

That's not possible, except in the sense described above. The whold 
point is for future encoders to be able to make better choices by 
reconfiguring the decoder. This has been very successful with vorbis.

> For example:
> 
> c=IN IP4/6
> m=video  RTP/AVP 98
> a=rtpmap:98 theora/90000
> a=fmtp:98 sampling=YCbCr-4:2:2; width=1280; height=720;
> header=<URI of configuration header>
> a=theora: <frame_width>x<frame_height>;
> 	<offset_x>,<offset_y>;
> 	<width>x<height>;
> 	<fps_numerator>/<fps_denominator>;
> 	<aspect_numerator>/<aspect_denominator>;
> 	<colorspace>;
> 	<target_bitrate>;
> 	<quality>;

Note, of the following the keyframe_frequency_force is the only
one that actually appears in the info header; the rest are 
(confusingly) part of the encoder config api.

> 	<dropframes_p>;
> 	<quick_p>;
> 	<keyframe_auto_p>;
> 	<keyframe_frequency>;
> 	<keyframe_frequency_force>;
> 	<keyframe_mindistance>;
> 	<keyframe_data_target_bitrate>;
> 	<keyframe_auto_threshold>;
> 	<noise_sensitivity>

Anyway, something to chew on I hope. I'd like to hear what you think of 
the new draft as an implementor.

Cheers,
 -r


More information about the xiph-rtp mailing list