> FramedSource* H264LiveServerMediaSubsession::createNewStreamSource(unsigned
> /*clientSessionId*/, unsigned& estBitrate) {
> estBitrate = 10000; // kbps, estimate
> // Create the video source:
> H264LiveStreamFramedSource* liveFramer =
> H264LiveStreamFramedSource::createNew(envir(),liveBuffer);
> H264VideoStreamDiscreteFramer* discFramer =
> H264VideoStreamDiscreteFramer::createNew(envir(),liveFramer);
> // Create a framer for the Video Elementary Stream:
> return H264VideoStreamFramer::createNew(envir(), discFramer);
No, this is wrong! You should not be creating/using a "H264VideoStreamFramer"
at all. That class should be used *only* when the input is a byte stream
(e.g., from a file). If - as in your case - the input is a discrete sequence
of NAL units (i.e., one NAL unit at a time), then you should use a
"H264VideoStreamDiscreteFramer" only. So, you should replace the line
return H264VideoStreamFramer::createNew(envir(), discFramer);
with
return discFramer;
That should also fix the problem that you're seeing with "fMaxSize" not being
large enough in your "H264VideoStreamLiveFramedSource" implementation.
> This is the doGetNextFrame in the H264LiveStreamFramedSource I'm using:
>
> void H264LiveStreamFramedSource::doGetNextFrame() {
>
> // Try to read as many bytes as will fit in the buffer provided (or
> "fPreferredFrameSize" if less)
> fFrameSize=fBuffer->read(fTo,fMaxSize,&fNumTruncatedBytes);
This should work, provided that your "read()" function always delivers (to
"*fTo") a single NAL unit, and nothing else - and blocks until one becomes
available. In other words, after "read()" is called, the first bytes of *fTo
must be the start of a single NAL unit, with *no* 'start code'.
This is not ideal, though, because, ideally, 'read' functions called from a
LIVE555-based application should not block (because LIVE555-based applications
run in a single-threaded event loop). Instead, if "doGetNextFrame()" gets
called when no new NAL unit is currently available, it should return
immediately.
I suggest that you review the sample code that we have provided in
"liveMedia/DeviceSource.cpp". You can use this class as a model for how to
write your "H264LiveStreamFramedSource" class.
Ross Finlayson
Live Networks, Inc.
http://www.live555.com/
_______________________________________________
live-devel mailing list
[email protected]
http://lists.live555.com/mailman/listinfo/live-devel