diff options
Diffstat (limited to 'libmpdemux')
-rw-r--r-- | libmpdemux/asf.h | 2 | ||||
-rw-r--r-- | libmpdemux/asfheader.c | 2 | ||||
-rw-r--r-- | libmpdemux/demux_lavf.c | 16 | ||||
-rw-r--r-- | libmpdemux/demux_rtp.cpp | 27 | ||||
-rw-r--r-- | libmpdemux/demux_vqf.c | 4 | ||||
-rw-r--r-- | libmpdemux/demuxer.h | 2 |
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; |