summaryrefslogtreecommitdiffstats
path: root/libmpdemux
diff options
context:
space:
mode:
authorUoti Urpala <uau@mplayer2.org>2011-07-06 13:07:37 +0300
committerUoti Urpala <uau@mplayer2.org>2011-07-06 13:07:37 +0300
commit2670ceeb81e009f88812f4014e08b88317a2cf42 (patch)
treeb6f2a6367fcc8998a531d209745770789ae03fcd /libmpdemux
parentb7f574405350f93083fb423c34a21788684e10d4 (diff)
parenta7b99687a7c8b59abb67f725c1cbc648ab439c74 (diff)
downloadmpv-2670ceeb81e009f88812f4014e08b88317a2cf42.tar.bz2
mpv-2670ceeb81e009f88812f4014e08b88317a2cf42.tar.xz
Merge branch 'mplayer1_changes'
Diffstat (limited to 'libmpdemux')
-rw-r--r--libmpdemux/asf.h2
-rw-r--r--libmpdemux/asfheader.c2
-rw-r--r--libmpdemux/demux_lavf.c16
-rw-r--r--libmpdemux/demux_rtp.cpp27
-rw-r--r--libmpdemux/demux_vqf.c4
-rw-r--r--libmpdemux/demuxer.h2
6 files changed, 40 insertions, 13 deletions
diff --git a/libmpdemux/asf.h b/libmpdemux/asf.h
index a3d2b01c17..a2bf546fd1 100644
--- a/libmpdemux/asf.h
+++ b/libmpdemux/asf.h
@@ -52,7 +52,7 @@ typedef struct __attribute__((packed)) {
uint64_t num_packets; //Number of packets UINT64 8
uint64_t play_duration; //Timestamp of the end position UINT64 8
uint64_t send_duration; //Duration of the playback UINT64 8
- uint64_t preroll; //Time to bufferize before playing UINT32 4
+ uint64_t preroll; //Time to bufferize before playing UINT64 8
uint32_t flags; //Unknown, maybe flags ( usually contains 2 ) UINT32 4
uint32_t min_packet_size; //Min size of the packet, in bytes UINT32 4
uint32_t max_packet_size; //Max size of the packet UINT32 4
diff --git a/libmpdemux/asfheader.c b/libmpdemux/asfheader.c
index 994c3e890d..857a899bef 100644
--- a/libmpdemux/asfheader.c
+++ b/libmpdemux/asfheader.c
@@ -542,7 +542,7 @@ int read_asf_header(demuxer_t *demuxer,struct asf_priv* asf){
asf->packetsize=fileh->max_packet_size;
asf->packet=malloc(asf->packetsize); // !!!
asf->packetrate=fileh->max_bitrate/8.0/(double)asf->packetsize;
- asf->movielength=(fileh->play_duration-10000*fileh->preroll)/10000000.0;
+ asf->movielength=FFMAX(0.0, (fileh->play_duration / 10000.0 - fileh->preroll) / 1000.0);
}
// find content header
diff --git a/libmpdemux/demux_lavf.c b/libmpdemux/demux_lavf.c
index f1a0e41c21..efda65a14d 100644
--- a/libmpdemux/demux_lavf.c
+++ b/libmpdemux/demux_lavf.c
@@ -517,8 +517,8 @@ static void handle_stream(demuxer_t *demuxer, AVFormatContext *avfc, int i)
if (stream_type) {
AVCodec *avc = avcodec_find_decoder(codec->codec_id);
const char *codec_name = avc ? avc->name : "unknown";
- if (!avc && *stream_type == 's' && demuxer->s_streams[stream_id])
- codec_name = sh_sub_type2str(((sh_sub_t *)demuxer->s_streams[stream_id])->type);
+ if (!avc && *stream_type == 's' && demuxer->s_streams[i])
+ codec_name = sh_sub_type2str(((sh_sub_t *)demuxer->s_streams[i])->type);
mp_msg(MSGT_DEMUX, MSGL_INFO, "[lavf] stream %d: %s (%s), -%cid %d",
i, stream_type, codec_name, *stream_type, stream_id);
if (lang && lang->value && *stream_type != 'v')
@@ -596,11 +596,13 @@ static demuxer_t *demux_open_lavf(demuxer_t *demuxer)
} else
av_strlcat(mp_filename, "foobar.dummy", sizeof(mp_filename));
- priv->pb = av_alloc_put_byte(priv->buffer, BIO_BUFFER_SIZE, 0,
- demuxer, mp_read, NULL, mp_seek);
- priv->pb->read_seek = mp_read_seek;
- priv->pb->is_streamed = !demuxer->stream->end_pos ||
- (demuxer->stream->flags & MP_STREAM_SEEK) != MP_STREAM_SEEK;
+ if (!(priv->avif->flags & AVFMT_NOFILE)) {
+ priv->pb = av_alloc_put_byte(priv->buffer, BIO_BUFFER_SIZE, 0,
+ demuxer, mp_read, NULL, mp_seek);
+ priv->pb->read_seek = mp_read_seek;
+ priv->pb->is_streamed = !demuxer->stream->end_pos ||
+ (demuxer->stream->flags & MP_STREAM_SEEK) != MP_STREAM_SEEK;
+ }
if (av_open_input_stream(&avfc, priv->pb, mp_filename, priv->avif,
&ap) < 0) {
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;
diff --git a/libmpdemux/demux_vqf.c b/libmpdemux/demux_vqf.c
index 94d7cf4096..8a3cff66b7 100644
--- a/libmpdemux/demux_vqf.c
+++ b/libmpdemux/demux_vqf.c
@@ -157,7 +157,7 @@ static demuxer_t* demux_open_vqf(demuxer_t* demuxer) {
if(sid==mmioFOURCC('E','N','C','D')) demux_info_add(demuxer,"Encoder",sdata);
else
mp_msg(MSGT_DEMUX, MSGL_V, "Unhandled subchunk '%c%c%c%c'='%s'\n",((char *)&sid)[0],((char *)&sid)[1],((char *)&sid)[2],((char *)&sid)[3],sdata);
- /* other stuff is unrecognized due untranslatable japan's idiomatics */
+ /* rest not recognized due to untranslatable Japanese expressions */
}
}
else
@@ -229,7 +229,7 @@ const demuxer_desc_t demuxer_desc_vqf = {
"vqf",
"VQF",
"Nick Kurshev",
- "ported frm MPlayerXP",
+ "ported from MPlayerXP",
DEMUXER_TYPE_VQF,
1, // safe autodetect
demux_probe_vqf,
diff --git a/libmpdemux/demuxer.h b/libmpdemux/demuxer.h
index abb3dd62b1..ee664d83e2 100644
--- a/libmpdemux/demuxer.h
+++ b/libmpdemux/demuxer.h
@@ -377,7 +377,7 @@ struct demuxer *new_demuxers_demuxer(struct demuxer *vd, struct demuxer *ad,
struct demuxer *sd);
// AVI demuxer params:
-extern int index_mode; // -1=untouched 0=don't use index 1=use (geneate) index
+extern int index_mode; // -1=untouched 0=don't use index 1=use (generate) index
extern char *index_file_save, *index_file_load;
extern int force_ni;
extern int pts_from_bps;