summaryrefslogtreecommitdiffstats
path: root/libmpdemux/demux_lavf.c
diff options
context:
space:
mode:
authorUoti Urpala <uau@glyph.nonexistent.invalid>2009-11-16 06:54:22 +0200
committerUoti Urpala <uau@glyph.nonexistent.invalid>2009-11-16 07:01:46 +0200
commit287b62163eed8811b6cd33716c0691d328947d48 (patch)
tree3143d2cb17b32a19e3e7e0aa428210d1bba3eb0b /libmpdemux/demux_lavf.c
parent507f4fe6c7811558b1367e4b64855ae7f9bc8da8 (diff)
parentb411278fbb00767b8013604157a43e0203f66f4c (diff)
downloadmpv-287b62163eed8811b6cd33716c0691d328947d48.tar.bz2
mpv-287b62163eed8811b6cd33716c0691d328947d48.tar.xz
Merge svn changes up to r29912
Diffstat (limited to 'libmpdemux/demux_lavf.c')
-rw-r--r--libmpdemux/demux_lavf.c41
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];