summaryrefslogtreecommitdiffstats
path: root/libmpdemux
diff options
context:
space:
mode:
authorreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2011-07-01 20:54:57 +0000
committerUoti Urpala <uau@mplayer2.org>2011-07-06 13:01:08 +0300
commit684e54587e78d09426fcd9680ca4eb5eb2672d69 (patch)
tree92a3acd841866a247ffd9abd5618d422bcaa47ff /libmpdemux
parentae31369a50169c43098070da6d652d095c460398 (diff)
downloadmpv-684e54587e78d09426fcd9680ca4eb5eb2672d69.tar.bz2
mpv-684e54587e78d09426fcd9680ca4eb5eb2672d69.tar.xz
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
Diffstat (limited to 'libmpdemux')
-rw-r--r--libmpdemux/demux_rtp.cpp27
1 files changed, 26 insertions, 1 deletions
diff --git a/libmpdemux/demux_rtp.cpp b/libmpdemux/demux_rtp.cpp
index e93616d07f..c9c950de8a 100644
--- a/libmpdemux/demux_rtp.cpp
+++ b/libmpdemux/demux_rtp.cpp
@@ -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;