summaryrefslogtreecommitdiffstats
path: root/libmpdemux
diff options
context:
space:
mode:
Diffstat (limited to 'libmpdemux')
-rw-r--r--libmpdemux/demux_lavf.c19
-rw-r--r--libmpdemux/demux_mkv.c12
-rw-r--r--libmpdemux/demuxer.c12
-rw-r--r--libmpdemux/demuxer.h2
-rw-r--r--libmpdemux/stheader.h15
5 files changed, 51 insertions, 9 deletions
diff --git a/libmpdemux/demux_lavf.c b/libmpdemux/demux_lavf.c
index 79d5a3c420..42130dd677 100644
--- a/libmpdemux/demux_lavf.c
+++ b/libmpdemux/demux_lavf.c
@@ -299,6 +299,9 @@ static void handle_stream(demuxer_t *demuxer, AVFormatContext *avfc, int i)
if (override_tag)
codec->codec_tag = override_tag;
+ AVCodec *avc = avcodec_find_decoder(codec->codec_id);
+ const char *codec_name = avc ? avc->name : "unknown";
+
switch (codec->codec_type) {
case AVMEDIA_TYPE_AUDIO: {
WAVEFORMATEX *wf;
@@ -306,6 +309,8 @@ static void handle_stream(demuxer_t *demuxer, AVFormatContext *avfc, int i)
sh_audio = new_sh_audio_aid(demuxer, i, priv->audio_streams);
if (!sh_audio)
break;
+ sh_audio->demuxer_id = i;
+ sh_audio->demuxer_codecname = codec_name;
stream_type = "audio";
priv->astreams[priv->audio_streams] = i;
sh_audio->libav_codec_id = codec->codec_id;
@@ -384,6 +389,8 @@ static void handle_stream(demuxer_t *demuxer, AVFormatContext *avfc, int i)
sh_video = new_sh_video_vid(demuxer, i, priv->video_streams);
if (!sh_video)
break;
+ sh_video->demuxer_id = i;
+ sh_video->demuxer_codecname = codec_name;
stream_type = "video";
priv->vstreams[priv->video_streams] = i;
sh_video->libav_codec_id = codec->codec_id;
@@ -495,6 +502,8 @@ static void handle_stream(demuxer_t *demuxer, AVFormatContext *avfc, int i)
sh_sub = new_sh_sub_sid(demuxer, i, priv->sub_streams);
if (!sh_sub)
break;
+ sh_sub->demuxer_id = i;
+ sh_sub->demuxer_codecname = codec_name;
stream_type = "subtitle";
priv->sstreams[priv->sub_streams] = i;
sh_sub->libav_codec_id = codec->codec_id;
@@ -534,18 +543,16 @@ static void handle_stream(demuxer_t *demuxer, AVFormatContext *avfc, int i)
st->discard = AVDISCARD_ALL;
}
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[i])
codec_name = sh_sub_type2str((demuxer->s_streams[i])->type);
- mp_msg(MSGT_DEMUX, MSGL_INFO, "[lavf] stream %d: %s (%s), -%cid %d",
+ mp_msg(MSGT_DEMUX, MSGL_V, "[lavf] stream %d: %s (%s), -%cid %d",
i, stream_type, codec_name, *stream_type, stream_id);
if (lang && lang->value && *stream_type != 'v')
- mp_msg(MSGT_DEMUX, MSGL_INFO, ", -%clang %s",
+ mp_msg(MSGT_DEMUX, MSGL_V, ", -%clang %s",
*stream_type, lang->value);
if (title && title->value)
- mp_msg(MSGT_DEMUX, MSGL_INFO, ", %s", title->value);
- mp_msg(MSGT_DEMUX, MSGL_INFO, "\n");
+ mp_msg(MSGT_DEMUX, MSGL_V, ", %s", title->value);
+ mp_msg(MSGT_DEMUX, MSGL_V, "\n");
}
}
diff --git a/libmpdemux/demux_mkv.c b/libmpdemux/demux_mkv.c
index bcc01fcc0f..49168e88e4 100644
--- a/libmpdemux/demux_mkv.c
+++ b/libmpdemux/demux_mkv.c
@@ -1121,12 +1121,12 @@ static void display_create_tracks(demuxer_t *demuxer)
break;
}
if (mkv_d->tracks[i]->name)
- mp_tmsg(MSGT_DEMUX, MSGL_INFO,
+ mp_tmsg(MSGT_DEMUX, MSGL_V,
"[mkv] Track ID %u: %s (%s) \"%s\", %s\n",
mkv_d->tracks[i]->tnum, type, mkv_d->tracks[i]->codec_id,
mkv_d->tracks[i]->name, str);
else
- mp_tmsg(MSGT_DEMUX, MSGL_INFO, "[mkv] Track ID %u: %s (%s), %s\n",
+ mp_tmsg(MSGT_DEMUX, MSGL_V, "[mkv] Track ID %u: %s (%s), %s\n",
mkv_d->tracks[i]->tnum, type, mkv_d->tracks[i]->codec_id,
str);
}
@@ -1271,6 +1271,8 @@ static int demux_mkv_open_video(demuxer_t *demuxer, mkv_track_t *track,
}
sh_v = new_sh_video(demuxer, vid);
+ sh_v->demuxer_id = track->tnum;
+ sh_v->demuxer_codecname = track->codec_id;
sh_v->title = talloc_strdup(sh_v, track->name);
sh_v->bih = bih;
sh_v->format = sh_v->bih->biCompression;
@@ -1342,6 +1344,8 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track,
if (track->language && (strcmp(track->language, "und") != 0))
sh_a->lang = talloc_strdup(sh_a, track->language);
+ sh_a->demuxer_id = track->tnum;
+ sh_a->demuxer_codecname = track->codec_id;
sh_a->title = talloc_strdup(sh_a, track->name);
sh_a->default_track = track->default_track;
sh_a->ds = demuxer->audio;
@@ -1579,6 +1583,8 @@ static int demux_mkv_open_sub(demuxer_t *demuxer, mkv_track_t *track,
int size;
uint8_t *buffer;
sh_sub_t *sh = new_sh_sub(demuxer, sid);
+ sh->demuxer_id = track->tnum;
+ sh->demuxer_codecname = track->codec_id;
track->sh_sub = sh;
sh->type = track->subtitle_type;
size = track->private_size;
@@ -1720,7 +1726,7 @@ static int demux_mkv_open(demuxer_t *demuxer)
MATROSKA_TRACK_VIDEO);
if (track && demuxer->v_streams[track->id]) {
- mp_tmsg(MSGT_DEMUX, MSGL_INFO, "[mkv] Will play video track %u.\n",
+ mp_tmsg(MSGT_DEMUX, MSGL_V, "[mkv] Will play video track %u.\n",
track->tnum);
demuxer->video->id = track->id;
demuxer->video->sh = demuxer->v_streams[track->id];
diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c
index 453de0b91a..85c98306f1 100644
--- a/libmpdemux/demuxer.c
+++ b/libmpdemux/demuxer.c
@@ -354,6 +354,10 @@ sh_sub_t *new_sh_sub_sid(demuxer_t *demuxer, int id, int sid)
else {
struct sh_sub *sh = talloc_zero(demuxer, struct sh_sub);
demuxer->s_streams[id] = sh;
+ sh->stream_type = STREAM_SUBTITLE;
+ sh->demuxer_id = demuxer->new_stream_id++;
+ sh->id = sid;
+ sh->index = id;
sh->sid = sid;
sh->opts = demuxer->opts;
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SUBTITLE_ID=%d\n", sid);
@@ -394,6 +398,10 @@ sh_audio_t *new_sh_audio_aid(demuxer_t *demuxer, int id, int aid)
mp_tmsg(MSGT_DEMUXER, MSGL_V, "==> Found audio stream: %d\n", id);
struct sh_audio *sh = talloc_zero(demuxer, struct sh_audio);
demuxer->a_streams[id] = sh;
+ sh->stream_type = STREAM_AUDIO;
+ sh->demuxer_id = demuxer->new_stream_id++;
+ sh->id = aid;
+ sh->index = id;
sh->aid = aid;
sh->ds = demuxer->audio;
// set some defaults
@@ -430,6 +438,10 @@ sh_video_t *new_sh_video_vid(demuxer_t *demuxer, int id, int vid)
mp_tmsg(MSGT_DEMUXER, MSGL_V, "==> Found video stream: %d\n", id);
struct sh_video *sh = talloc_zero(demuxer, struct sh_video);
demuxer->v_streams[id] = sh;
+ sh->stream_type = STREAM_VIDEO;
+ sh->demuxer_id = demuxer->new_stream_id++;
+ sh->id = vid;
+ sh->index = id;
sh->vid = vid;
sh->ds = demuxer->video;
sh->opts = demuxer->opts;
diff --git a/libmpdemux/demuxer.h b/libmpdemux/demuxer.h
index 03b1fee830..3f9aa80b96 100644
--- a/libmpdemux/demuxer.h
+++ b/libmpdemux/demuxer.h
@@ -282,6 +282,8 @@ typedef struct demuxer {
char **info; // metadata
struct MPOpts *opts;
struct demuxer_params *params;
+
+ int new_stream_id;
} demuxer_t;
typedef struct {
diff --git a/libmpdemux/stheader.h b/libmpdemux/stheader.h
index 58390650b2..6feefa9ef0 100644
--- a/libmpdemux/stheader.h
+++ b/libmpdemux/stheader.h
@@ -26,9 +26,24 @@
struct MPOpts;
struct demuxer;
+enum STREAM_TYPE {
+ STREAM_VIDEO = 1,
+ STREAM_AUDIO,
+ STREAM_SUBTITLE,
+};
+
// Stream headers:
+// id: the type specific id, e.g. aid or sid
+// index: index into stream array (currently one array per type)
+// demuxer_id: demuxer specific ID (-1 if unknown, otherwise >= 0)
+
#define SH_COMMON \
+ enum STREAM_TYPE stream_type; \
+ int id; \
+ int index; \
+ int demuxer_id; \
+ const char *demuxer_codecname; \
struct MPOpts *opts; \
struct demux_stream *ds; \
struct codecs *codec; \