demux: simplify stream ID business, fix issue with cover art

The stream ID handling as it was changed in commit 654c34f was still
a little bit insane, and caused a regression with the cover art hack
(the stream set in demux->video->sh was incorrect for demux_lavf).

Simplify by always using stream_index for demux_stream->id, and getting
rid of that tid thing. It turns out that the id for subtitles isn't
special either (maybe demux_ts.c was the only thing left that required
this).
This commit is contained in:
wm4 2013-04-29 22:34:36 +02:00
parent 2d8783075f
commit 1c96f51e36
3 changed files with 9 additions and 17 deletions

View File

@ -244,9 +244,9 @@ demuxer_t *new_demuxer(struct MPOpts *opts, stream_t *stream, int type,
static struct sh_stream *new_sh_stream_id(demuxer_t *demuxer,
enum stream_type type,
int stream_index,
int tid)
int demuxer_id)
{
if (demuxer->num_streams > MAX_SH_STREAMS) {
if (demuxer->num_streams > MAX_SH_STREAMS || stream_index > MAX_SH_STREAMS) {
mp_msg(MSGT_DEMUXER, MSGL_WARN, "Too many streams.");
return NULL;
}
@ -255,8 +255,7 @@ static struct sh_stream *new_sh_stream_id(demuxer_t *demuxer,
.type = type,
.demuxer = demuxer,
.index = demuxer->num_streams,
.demuxer_id = tid, // may be overwritten by demuxer
.tid = tid,
.demuxer_id = demuxer_id, // may be overwritten by demuxer
.stream_index = stream_index,
.opts = demuxer->opts,
});
@ -1203,7 +1202,7 @@ void demuxer_switch_track(struct demuxer *demuxer, enum stream_type type,
int old_id = demuxer->ds[type]->id;
// legacy
int index = stream ? stream->tid : -2;
int index = stream ? stream->stream_index : -2;
if (type == STREAM_AUDIO) {
if (demux_control(demuxer, DEMUXER_CTRL_SWITCH_AUDIO, &index)
== DEMUXER_CTRL_NOTIMPL)
@ -1213,8 +1212,7 @@ void demuxer_switch_track(struct demuxer *demuxer, enum stream_type type,
== DEMUXER_CTRL_NOTIMPL)
demuxer->video->id = index;
} else if (type == STREAM_SUB) {
int index2 = stream ? stream->stream_index : -2;
demuxer->ds[type]->id = index2;
demuxer->ds[type]->id = index;
} else {
abort();
}
@ -1238,12 +1236,7 @@ void demuxer_switch_track(struct demuxer *demuxer, enum stream_type type,
bool demuxer_stream_is_selected(struct demuxer *d, struct sh_stream *stream)
{
if (!stream)
return false;
int st_id = stream->tid;
if (stream->type == STREAM_SUB) // major braindeath
st_id = stream->stream_index;
return d->ds[stream->type]->id == st_id;
return stream && d->ds[stream->type]->id == stream->stream_index;
}
int demuxer_add_attachment(demuxer_t *demuxer, struct bstr name,

View File

@ -2986,7 +2986,7 @@ static int ts_parse(demuxer_t *demuxer , ES_stream_t *es, unsigned char *packet,
{
sh_sub_t *sh_sub = demuxer->sub->sh;
if(sh_sub && sh_sub->gsh->tid == tss->pid)
if(sh_sub && sh_sub->gsh->demuxer_id == tss->pid)
{
ds = demuxer->sub;

View File

@ -42,11 +42,10 @@ struct sh_stream {
struct demuxer *demuxer;
// Index into demuxer->streams.
int index;
// The (possibly) type specific id, e.g. aid or sid.
int tid;
// Index into stream array (currently one array per type, e.g. a_streams).
int stream_index;
// Demuxer specific ID (always set, defaults to tid).
// Demuxer/format specific ID. Corresponds to the stream IDs as encoded in
// some file formats (e.g. MPEG), or an index chosen by demux.c.
int demuxer_id;
// One of these is non-NULL, the others are NULL, depending on the stream
// type.