Ross, thanks a lot for your help!

From the encoder, I get buffers with multiple NAL Units. NAL Units are all with 
0x00000001 start codes. I strip this codes from the buffers, break the buffer 
and send the packets as separate NAL units.

Yes, this is correct (provided that you deliver NAL units to the downstream 
"H264VideoStreamDiscreteFramer" one at a time)

Yes, when I receive the buffer, I look for start codes, break the buffer and send NALU's 
to the downstream "H264VideoStreamDiscreteFramer" one by one (off course, 
without start codes).

In this situation, in VLC I just get the first image and the following error(s):
        direct3d warning: trying surface pixel format: YV12
        main error: ES_OUT_RESET_PCR called
        
In openRTSP, which I start to create mp4 files with 5 seconds length (openRTSP 
-4 -P 5 -w 720 -h 576 -f 25 rtsp://...) I get mp4 files, which VLC reports that 
are 40 seconds long (also MediaInfo) and not a single frame can be decoded.

Now, this is the first approach I'm trying.

Also, I get NAL Units with fragments.

What specifically do you mean by "fragments" here?  Do you mean slices?  I.e., are you 
talking about NAL units that each represent just one 'slice' of a frame (picture)?  If so, then 
yes, we support this.  You can treat these NAL units just like any other; deliver them (one at a 
time) to the downstream "H264VideoStreamDiscreteFramer".

Or are you instead referring to multiple chunks of data (that are *not* NAL units 
themselves) that, if combined together, form a single (large) NAL unit?  If so, then you 
*must not* deliver these chunks of data separately.  Instead, you *must* combine these 
chunks into a single NAL unit, and deliver this completely (without the 'start code', of 
course) to the downstream "H264VideoStreamDiscreteFramer").

I'm not all that much familiar with H264 specification or the inner workings of 
the encoder. I based my code on a working RTSP server (wrapped as a DirectShow 
filter, from here: http://www.gdcl.co.uk/2013/05/16/RTSP-Jukebox.html).

Now, in that code, there's a NAL unit parser, which my code is based on. The 
code there presumes that:

const int max_packet_size = 1514 - 42; // observed from Wireshark
const int rtp_header_size = 12;

static int SinglePacketSize()   { return max_packet_size - rtp_header_size; }
static int FragmentSize()       { return SinglePacketSize() -2; }

If the NALU size is <= SinglePacketSize, it gets forwarded as it is, but when 
NALU is bigger then SinglePacketSize, then the code fragments the buffer by the 
value of FragmentSize. So if NALU buffer size is 2 x SinglePacketSize, then it 
will fragment it to buffers with FragmentSize size and send it downstream one by 
one.
Now, I don't know why is this, but this RTSP server (unicast) is working fine 
with the Media Foundation H264 Encoder and playing fine in VLC and/or other 
Streaming Clients.
If I try this approach in my code, in VLC I get the error: "live555 warning: unsupported NAL 
type for H264" and after that, "avcodec warning: cannot decode one frame (1614 
bytes)"
In openRTSP the same situation as in previous case.

This is the second approach I'm trying.

Another thing to be aware of is that if a NAL unit can be very large, you may need to change the 
value of "OutPacketBuffer::maxSize" (in "testH264VideoStreamer.cpp" from 100000 
(bytes) to something larger.

The max size of the NALU packets I'm forwarding to live555 isn't bigger then 
4000-5000 bytes.

Thanks and sorry for the long post,
Goran.

_______________________________________________
live-devel mailing list
[email protected]
http://lists.live555.com/mailman/listinfo/live-devel

Reply via email to