[Live-devel] Possible bugs in ByteStreamFileSource and MPEG2TransportStreamFramer
Ross Finlayson
finlayson at live555.com
Fri Jun 10 01:17:10 PDT 2011
>I am using the live555 library in a Linux application that receives
>a low frame rate MPEG2-TS from a live source one frame at a time.
>The source is not represented as a file by the OS. To make the
>interface to the live555 library easier, I opened a pipe and write
>each frame to it as I receive them. The read end of the pipe is
>given as the source to a ByteStreamFileSource instance which then
>feeds an instance of MPEG2TransportStreamFramer, which in turn feeds
>a BasicUDPSink (unfortunately my requirements do not allow me to use
>RTP/RTCP, which I would have preferred). This seems to work fairly
>well with the following exceptions.
>
>1. BasicUDPSink has a default packet size of 1450.
> MPEG2TransportStreamFramer asks its source (ByteStreamFileSource in
>this case) for 1450 bytes
You should instead be setting the "preferredFrameSize" parameter to
"ByteStreamFileSource::createNew()". See, for example, line 144 of
"testProgs/testMPEG2TransportStreamer.cpp", or line 199 of
"liveMedia/MPEG2TransportFileServerMediaSubsession.cpp". If you set
the "preferredFrameSize" parameter to 1316, then your
"ByteStreamFileSource" will deliver that many bytes.
>2. Since data is given to me and thus written to the pipe
>frame-by-frame, it is very common that a single write to the pipe
>will not be a multiple of 7 188-byte TS packets (e.g. a frame might
>be 25192 bytes = 134 188-byte TS packets = 19 UDP packets containing
>7 TS packets each + 1 UDP packet containing 1 TS packet). While the
>MPEG2-TS source continues to produce frames this does not cause any
>problems. However, when the source is paused/stopped it can cause
>the event loop to hang indefinitely. This is due to the fact that
>ByteStreamFileSource::doReadFromFile is trying to read more data
>than it can receive and thus blocks in the "fFrameSize = fread(fTo,
>1, fMaxSize, fFid);" line.
Hmm, reads from the input file (in this case, a pipe) are supposed to
be non-blocking, returning only as many bytes as are currently
available (which will always be >0, because the read is happening
only in response to a return from "select()" on the input file's
socket). Perhaps there's some way you can configure your pipe to
ensure that reads from it don't block?
--
Ross Finlayson
Live Networks, Inc.
http://www.live555.com/
More information about the live-devel
mailing list