mirror of https://github.com/mpv-player/mpv
demux_rtp.cpp: Add a hack to receive audio while probing video FPS
Otherwise newer live555 versions would just hang. Fixes http://bugzilla.mplayerhq.hu/show_bug.cgi?id=1874 git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@33793 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
ae31369a50
commit
684e54587e
|
@ -498,11 +498,32 @@ static demux_packet_t* getBuffer(demuxer_t* demuxer, demux_stream_t* ds,
|
|||
RTPState* rtpState = (RTPState*)(demuxer->priv);
|
||||
ReadBufferQueue* bufferQueue = NULL;
|
||||
int headersize = 0;
|
||||
TaskToken task;
|
||||
int waitboth = 0;
|
||||
TaskToken task, task2;
|
||||
|
||||
if (demuxer->stream->eof) return NULL;
|
||||
|
||||
if (ds == demuxer->video) {
|
||||
bufferQueue = rtpState->audioBufferQueue;
|
||||
// HACK: for the latest versions we must also receive audio
|
||||
// when probing for video FPS, otherwise the stream just hangs
|
||||
// and times out
|
||||
if (mustGetNewData &&
|
||||
bufferQueue &&
|
||||
bufferQueue->readSource() &&
|
||||
!bufferQueue->nextpacket) {
|
||||
headersize = bufferQueue->readSource()->isAMRAudioSource() ? 1 : 0;
|
||||
demux_packet_t *dp = new_demux_packet(MAX_RTP_FRAME_SIZE);
|
||||
bufferQueue->dp = dp;
|
||||
bufferQueue->blockingFlag = 0;
|
||||
bufferQueue->readSource()->getNextFrame(
|
||||
&dp->buffer[headersize], MAX_RTP_FRAME_SIZE - headersize,
|
||||
afterReading, bufferQueue,
|
||||
onSourceClosure, bufferQueue);
|
||||
task2 = bufferQueue->readSource()->envir().taskScheduler().
|
||||
scheduleDelayedTask(10000000, onSourceClosure, bufferQueue);
|
||||
waitboth = 1;
|
||||
}
|
||||
bufferQueue = rtpState->videoBufferQueue;
|
||||
if (((sh_video_t*)ds->sh)->format == mmioFOURCC('H','2','6','4'))
|
||||
headersize = 3;
|
||||
|
@ -560,6 +581,10 @@ static demux_packet_t* getBuffer(demuxer_t* demuxer, demux_stream_t* ds,
|
|||
task = scheduler.scheduleDelayedTask(delay, onSourceClosure, bufferQueue);
|
||||
scheduler.doEventLoop(&bufferQueue->blockingFlag);
|
||||
scheduler.unscheduleDelayedTask(task);
|
||||
if (waitboth) {
|
||||
scheduler.doEventLoop(&rtpState->audioBufferQueue->blockingFlag);
|
||||
scheduler.unscheduleDelayedTask(task2);
|
||||
}
|
||||
if (demuxer->stream->eof) {
|
||||
free_demux_packet(dp);
|
||||
return NULL;
|
||||
|
|
Loading…
Reference in New Issue