[Live-devel] NAL processing order.

Ross Finlayson finlayson at live555.com
Sun Sep 9 08:04:23 PDT 2012


> This stream is H264 AVC format. I am delivering single NAL units
> (With AVC start codes) to H264VideoStreamDiscreteFramer

No!  You MUST NOT include 'start codes' (i.e., 0x00 0x00 0x00 0x01) in the NAL units that you feed to a "H264VideoStreamDiscreteFramer".  I don't know how much clearer I (and the LIVE555 code) can be about this!

> from a
> Device subclass which in turn feeds to a H264VideoRTPSink;
[...]
> all is well in delivery except when the NAL's look like MPEG NALS 
> 00 00  xx xx. (warning nal type:0)

FYI, you may be using an out-of-date version of our software.  If so, please upgrade.


> You had mentioned in a 
> previous question there should be no start codes, however the 
> decoder (client side) certainly requires it for immediate play.

That's irrelevant!  We're not talking about feeding NAL units to a client; we're talking about feeding them to a "H264VideoStreamDiscreteFramer", which in turn gets fed to a "H264VideoRTPSink", which in turn get transmitted within RTP packets (which according to the IETF-defined payload format for H.264, MUST NOT include start codes).  This all happens at the *sender* end - i.e., the server.  Once again, the NAL units that you feed to a "H264VideoStreamDiscreteFramer" MUST NOT include start codes.


> Are the start codes somehow reconstructed client side with a
> proper setup?

The *receiver* end - i.e., the client - receives NAL units that have been packed into RTP packets.  Once again, according to the IETF-defined standard payload format for H.264, these NAL units DO NOT include start codes.  Instead, the receiving client receives - from the RTP demultiplexor - a sequence of discrete NAL units, each with their size defined.  (I.e., the receiving client doesn't need (and doesn't get) start codes, because instead it knows the size of each NAL unit.)

If the receiver also uses the LIVE555 software, then it would use a "H264VideoRTPSource", which (like all "FramedSource" subclasses) delivers a sequence of 'frames', each with its own length ("frameSize").  In this case, each such 'frame' is a H.264 NAL unit (without a start code).  These NAL units would then be fed to a decoder.  If the decoder needs a start code in front of each NAL unit, then you would insert it there - i.e., when you feed it to your decoder.  If, however, the decoder doesn't need a start code - i.e., if the NAL unit lengths are enough for the decoder - then you don't need to insert one when you feed it to your decoder.  I.e., it depends on your decoder.


Ross Finlayson
Live Networks, Inc.
http://www.live555.com/

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.live555.com/pipermail/live-devel/attachments/20120909/c4f91b13/attachment.html>


More information about the live-devel mailing list