diff options
author | Uoti Urpala <uau@glyph.nonexistent.invalid> | 2009-11-16 06:54:22 +0200 |
---|---|---|
committer | Uoti Urpala <uau@glyph.nonexistent.invalid> | 2009-11-16 07:01:46 +0200 |
commit | 287b62163eed8811b6cd33716c0691d328947d48 (patch) | |
tree | 3143d2cb17b32a19e3e7e0aa428210d1bba3eb0b /libmpdemux/demux_lavf.c | |
parent | 507f4fe6c7811558b1367e4b64855ae7f9bc8da8 (diff) | |
parent | b411278fbb00767b8013604157a43e0203f66f4c (diff) |
Merge svn changes up to r29912
Diffstat (limited to 'libmpdemux/demux_lavf.c')
-rw-r--r-- | libmpdemux/demux_lavf.c | 41 |
1 files changed, 13 insertions, 28 deletions
diff --git a/libmpdemux/demux_lavf.c b/libmpdemux/demux_lavf.c index f69f2715ff..0d44a0fc18 100644 --- a/libmpdemux/demux_lavf.c +++ b/libmpdemux/demux_lavf.c @@ -49,7 +49,6 @@ static unsigned int opt_probesize = 0; static unsigned int opt_analyzeduration = 0; static char *opt_format; static char *opt_cryptokey; -extern int ts_prog; static char *opt_avopt = NULL; const m_option_t lavfdopts_conf[] = { @@ -133,6 +132,7 @@ static int lavf_check_file(demuxer_t *demuxer){ AVProbeData avpd; uint8_t buf[PROBE_BUF_SIZE]; lavf_priv_t *priv; + int probe_data_size; if(!demuxer->priv) demuxer->priv=calloc(sizeof(lavf_priv_t),1); @@ -154,11 +154,12 @@ static int lavf_check_file(demuxer_t *demuxer){ return DEMUXER_TYPE_LAVF; } - if(stream_read(demuxer->stream, buf, PROBE_BUF_SIZE)!=PROBE_BUF_SIZE) + probe_data_size = stream_read(demuxer->stream, buf, PROBE_BUF_SIZE); + if(probe_data_size <= 0) return 0; avpd.filename= demuxer->stream->url; avpd.buf= buf; - avpd.buf_size= PROBE_BUF_SIZE; + avpd.buf_size= probe_data_size; priv->avif= av_probe_input_format(&avpd, 1); if(!priv->avif){ @@ -383,6 +384,8 @@ static void handle_stream(demuxer_t *demuxer, AVFormatContext *avfc, int i) { type = 'a'; else if(codec->codec_id == CODEC_ID_DVD_SUBTITLE) type = 'v'; + else if(codec->codec_id == CODEC_ID_DVB_TELETEXT) + type = 'd'; else break; sh_sub = new_sh_sub_sid(demuxer, i, priv->sub_streams); @@ -493,30 +496,12 @@ static demuxer_t* demux_open_lavf(demuxer_t *demuxer){ for(i=0; i<avfc->nb_streams; i++) handle_stream(demuxer, avfc, i); if(avfc->nb_programs) { - int p, start=0, found=0; - - if(ts_prog) { - for(p=0; p<avfc->nb_programs; p++) { - if(avfc->programs[p]->id == ts_prog) { - start = p; - found = 1; - break; - } - } - if(!found) { - mp_msg(MSGT_HEADER,MSGL_ERR,"DEMUX_LAVF: program %d doesn't seem to be present\n", ts_prog); - return NULL; - } - } - p = start; - do { + int p; + for (p = 0; p < avfc->nb_programs; p++) { AVProgram *program = avfc->programs[p]; t = av_metadata_get(program->metadata, "title", NULL, 0); mp_msg(MSGT_HEADER,MSGL_INFO,"LAVF: Program %d %s\n", program->id, t ? t->value : ""); - if(!priv->cur_program && (demuxer->video->sh || demuxer->audio->sh)) - priv->cur_program = program->id; - p = (p + 1) % avfc->nb_programs; - } while(p!=start); + } } mp_msg(MSGT_HEADER,MSGL_V,"LAVF: %d audio and %d video streams found\n",priv->audio_streams,priv->video_streams); @@ -717,8 +702,9 @@ static int demux_lavf_control(demuxer_t *demuxer, int cmd, void *arg) int p, i; int start; - if(priv->avfc->nb_programs < 2) - return DEMUXER_CTRL_NOTIMPL; + prog->vid = prog->aid = prog->sid = -2; //no audio and no video by default + if(priv->avfc->nb_programs < 1) + return DEMUXER_CTRL_DONTKNOW; if(prog->progid == -1) { @@ -733,10 +719,9 @@ static int demux_lavf_control(demuxer_t *demuxer, int cmd, void *arg) if(priv->avfc->programs[i]->id == prog->progid) break; if(i==priv->avfc->nb_programs) - return DEMUXER_CTRL_NOTIMPL; + return DEMUXER_CTRL_DONTKNOW; p = i; } - prog->vid = prog->aid = prog->sid = -2; //no audio and no video by default start = p; redo: program = priv->avfc->programs[p]; |