summaryrefslogtreecommitdiffstats
path: root/demux/demux.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-07-11 19:22:24 +0200
committerwm4 <wm4@nowhere>2013-07-11 19:22:24 +0200
commite5544e2da38522674edb1eb5d4cfdf179c4328db (patch)
tree3868c73a022520365a9bd9ef45810d7685b8e5a4 /demux/demux.c
parent83eb28fff7d3a588610c617d255ae2420b792c44 (diff)
downloadmpv-e5544e2da38522674edb1eb5d4cfdf179c4328db.tar.bz2
mpv-e5544e2da38522674edb1eb5d4cfdf179c4328db.tar.xz
demux: improve DVD sub auto-selection hack
The code touched by this commit makes sure that DVD subtitle tracks known by libdvdread but not known by demux_lavf can be selected and displayed properly. These subtitle tracks have the first packet some time late in the packet stream, so that libavformat won't immediately recognize them, and will add the track as soon as the first packet is seen during normal demuxing. demux_mpg used to handle this elegantly: you just set the MPEG ID of the stream you wanted. demux_lavf couldn't do this, so it was emulated with a DEMUXER_CTRL. This commit changes it so that new streams are selected by default (if autoselect is enabled), and the playloop simply can take appropriate action before the lower layer throws away the first packet. This also changes the demux_lavf behavior that subtitle packets are always demuxed, even if not needed. (They were immediately thrown away, so there was no advantage to this.) Further, this adds the ability to demux.c to deal with demuxing more than one stream of a kind at once. (Though currently it's not useful.)
Diffstat (limited to 'demux/demux.c')
-rw-r--r--demux/demux.c28
1 files changed, 21 insertions, 7 deletions
diff --git a/demux/demux.c b/demux/demux.c
index 3e2c7bb52e..f0652fba4d 100644
--- a/demux/demux.c
+++ b/demux/demux.c
@@ -315,6 +315,9 @@ struct sh_stream *new_sh_stream(demuxer_t *demuxer, enum stream_type type)
}
default: assert(false);
}
+
+ sh->ds->selected = demuxer->stream_autoselect;
+
return sh;
}
@@ -913,18 +916,29 @@ void demuxer_switch_track(struct demuxer *demuxer, enum stream_type type,
{
assert(!stream || stream->type == type);
- // don't flush buffers if stream is already selected / none are selected
for (int n = 0; n < demuxer->num_streams; n++) {
struct sh_stream *cur = demuxer->streams[n];
- bool select = cur == stream;
- if (cur->type == type && cur->ds->selected != select) {
- cur->ds->selected = select;
- ds_free_packs(cur->ds);
- demux_control(demuxer, DEMUXER_CTRL_SWITCHED_TRACKS, NULL);
- }
+ if (cur->type == type)
+ demuxer_select_track(demuxer, cur, cur == stream);
+ }
+}
+
+void demuxer_select_track(struct demuxer *demuxer, struct sh_stream *stream,
+ bool selected)
+{
+ // don't flush buffers if stream is already selected / unselected
+ if (stream->ds->selected != selected) {
+ stream->ds->selected = selected;
+ ds_free_packs(stream->ds);
+ demux_control(demuxer, DEMUXER_CTRL_SWITCHED_TRACKS, NULL);
}
}
+void demuxer_enable_autoselect(struct demuxer *demuxer)
+{
+ demuxer->stream_autoselect = true;
+}
+
bool demuxer_stream_is_selected(struct demuxer *d, struct sh_stream *stream)
{
return stream && stream->ds->selected;