Hi Ross, I have read the FAQ, and searched this list for answers. I have found a similar issue and there you advised the user to actually allow the frames to be dropped, and to set the fNumTruncatedBytes variable to the correct value. I am using the DeviceSource class to encapsulate a live source (camera). My downstream object is a MPEG4VideoStreamDiscreteFramer, which has the correct buffer sizes etc. I am using the Event Trigger method to signal that new data has arrived at the camera, but for some reason the stream "dies" after a few seconds (using VLC to connect to RTSP stream). Looking at the logs I have added, it is clear that the frames are not being handled properly. This is a portion of my DeviceSource class (renamed to InputDeviceSource): void InputDeviceSource::deliverFrame0(void * clientData) { reinterpret_cast<InputDeviceSource *>(clientData)->deliverFrame(); } void InputDeviceSource::deliverFrame() { if (!isCurrentlyAwaitingData()) return; //if not explicitly waiting for data, we short-circuit. //this might not be neccessary fFrameSize = fParams.provider->GetData(fParams.stream, fTo, fMaxSize); //this performs the copy. Copies last chunk of previous frame if truncation would occur. if (fFrameSize <= fMaxSize) { fDurationInMicroseconds = 166666; //6 fps - set only when full frames are delivered gettimeofday(&fPresentationTime, NULL); } else //set to 0 when copying frame portions. fDurationInMicroseconds = 0; LOG((*g_logger), "deliverFrame - frameSize[" << fFrameSize <<"] fMaxSize[" << fMaxSize <<"] fDuration[" << fDurationInMicroseconds <<"]"); //write the log to disk if (fFrameSize > 0) //will be -1 if camera while waiting for data from camera FramedSource::afterGetting(this); //signal that data is available. } /* Called from external thread when data becomes available. */ void InputDeviceSource::SignalDataWaiting(void * clientData) { if (NULL == clientData) return; //sanity check - for some reason this could be null InputDeviceSource * source = reinterpret_cast<InputDeviceSource *>(clientData); TaskScheduler * ourScheduler = source->m_scheduler; //added this member (set in constructor) if (ourScheduler) //sanity check. ourScheduler->triggerEvent(source->eventTriggerId, source); } //called from external thread when camera signals that data is ready I am doing my best to call signalDataWaiting from the external thread when we detect that only a portion of a frame has been delivered to the DiscreteStreamFramer. Should I call signalDataWaiting for frame portions? Or should I truncate the data and allow the following full frame to be sent? Thank you Regards ___________________________________
Shaheed Abdol Web: www.scansoft.co.za <http://www.scansoft.co.za/> Tel: +27 21 913 8664 Cell: +27 79 835 8771
<<SST Email.png>>
_______________________________________________ live-devel mailing list live-devel@lists.live555.com http://lists.live555.com/mailman/listinfo/live-devel