summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/mplayer.c26
-rw-r--r--demux/demux.c28
-rw-r--r--demux/demux.h5
-rw-r--r--demux/demux_lavf.c20
4 files changed, 37 insertions, 42 deletions
diff --git a/core/mplayer.c b/core/mplayer.c
index 275795defb..2cc4659eef 100644
--- a/core/mplayer.c
+++ b/core/mplayer.c
@@ -913,12 +913,6 @@ static int map_id_from_demuxer(struct demuxer *d, enum stream_type type, int id)
id = id & 0x1F;
return id;
}
-static int map_id_to_demuxer(struct demuxer *d, enum stream_type type, int id)
-{
- if (d->stream->uncached_type == STREAMTYPE_DVD && type == STREAM_SUB)
- id = id | 0x20;
- return id;
-}
static struct track *add_stream_track(struct MPContext *mpctx,
struct sh_stream *stream,
@@ -937,7 +931,9 @@ static struct track *add_stream_track(struct MPContext *mpctx,
track->stream = stream;
track->demuxer_id = stream->demuxer_id;
// Initialize lazily selected track
- if (track == mpctx->current_track[STREAM_SUB])
+ bool selected = track == mpctx->current_track[STREAM_SUB];
+ demuxer_select_track(track->demuxer, stream, selected);
+ if (selected)
reinit_subs(mpctx);
return track;
}
@@ -973,6 +969,8 @@ static struct track *add_stream_track(struct MPContext *mpctx,
track->lang = talloc_strdup(track, req.name);
}
+ demuxer_select_track(track->demuxer, stream, false);
+
return track;
}
@@ -1004,6 +1002,7 @@ static void add_dvd_tracks(struct MPContext *mpctx)
track->lang = talloc_strdup(track, req.name);
}
}
+ demuxer_enable_autoselect(demuxer);
#endif
}
@@ -1885,18 +1884,9 @@ static void reinit_subs(struct MPContext *mpctx)
mpctx->sh_sub->dec_sub = sub_create(opts);
assert(track->demuxer);
- if (!track->stream) {
- // Lazily added DVD track - we must not miss the first subtitle packet,
- // which makes the demuxer create the sh_stream, and contains the first
- // subtitle event.
-
- // demux_lavf - IDs are essentially random, have to use MPEG IDs
- int id = map_id_to_demuxer(track->demuxer, track->type,
- track->demuxer_id);
- demux_control(track->demuxer, DEMUXER_CTRL_AUTOSELECT_SUBTITLE, &id);
-
+ // Lazily added DVD track - will be created on first sub packet
+ if (!track->stream)
return;
- }
mpctx->initialized_flags |= INITIALIZED_SUB;
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;
diff --git a/demux/demux.h b/demux/demux.h
index 2b3a998289..d75c8f0d12 100644
--- a/demux/demux.h
+++ b/demux/demux.h
@@ -77,7 +77,6 @@ enum timestamp_type {
#define DEMUXER_CTRL_SWITCH_VIDEO 14
#define DEMUXER_CTRL_IDENTIFY_PROGRAM 15
#define DEMUXER_CTRL_CORRECT_PTS 16
-#define DEMUXER_CTRL_AUTOSELECT_SUBTITLE 17
#define SEEK_ABSOLUTE (1 << 0)
#define SEEK_FACTOR (1 << 1)
@@ -185,6 +184,7 @@ typedef struct demuxer {
struct sh_stream **streams;
int num_streams;
+ bool stream_autoselect;
int num_editions;
int edition;
@@ -255,6 +255,9 @@ int demux_control(struct demuxer *demuxer, int cmd, void *arg);
void demuxer_switch_track(struct demuxer *demuxer, enum stream_type type,
struct sh_stream *stream);
+void demuxer_select_track(struct demuxer *demuxer, struct sh_stream *stream,
+ bool selected);
+void demuxer_enable_autoselect(struct demuxer *demuxer);
int demuxer_type_by_filename(char *filename);
diff --git a/demux/demux_lavf.c b/demux/demux_lavf.c
index ce7c274e4b..f7ef5dda1a 100644
--- a/demux/demux_lavf.c
+++ b/demux/demux_lavf.c
@@ -73,7 +73,6 @@ typedef struct lavf_priv {
AVFormatContext *avfc;
AVIOContext *pb;
uint8_t buffer[BIO_BUFFER_SIZE];
- int autoselect_sub;
int64_t last_pts;
struct sh_stream **streams; // NULL for unknown streams
int num_streams;
@@ -196,7 +195,6 @@ static int lavf_check_file(demuxer_t *demuxer)
assert(!demuxer->priv);
demuxer->priv = talloc_zero(NULL, lavf_priv_t);
priv = demuxer->priv;
- priv->autoselect_sub = -1;
priv->filename = s->url;
if (!priv->filename) {
@@ -427,7 +425,6 @@ static void handle_stream(demuxer_t *demuxer, int i)
memcpy(sh_sub->extradata, codec->extradata, codec->extradata_size);
sh_sub->extradata_len = codec->extradata_size;
}
- st->discard = AVDISCARD_DEFAULT;
break;
}
case AVMEDIA_TYPE_ATTACHMENT: {
@@ -463,6 +460,9 @@ static void handle_stream(demuxer_t *demuxer, int i)
if (lang && lang->value)
sh->lang = talloc_strdup(sh, lang->value);
}
+
+ bool selected = demuxer_stream_is_selected(demuxer, sh);
+ st->discard = selected ? AVDISCARD_DEFAULT : AVDISCARD_ALL;
}
// Add any new streams that might have been added
@@ -657,13 +657,6 @@ static int demux_lavf_fill_buffer(demuxer_t *demux)
AVStream *st = priv->avfc->streams[pkt->stream_index];
struct sh_stream *stream = priv->streams[pkt->stream_index];
- if (stream && stream->type == STREAM_SUB &&
- stream->demuxer_id == priv->autoselect_sub)
- {
- priv->autoselect_sub = -1;
- demuxer_switch_track(demux, STREAM_SUB, stream);
- }
-
if (!demuxer_stream_is_selected(demux, stream)) {
talloc_free(pkt);
return 1;
@@ -799,18 +792,13 @@ static int demux_lavf_control(demuxer_t *demuxer, int cmd, void *arg)
for (int n = 0; n < priv->num_streams; n++) {
struct sh_stream *stream = priv->streams[n];
AVStream *st = priv->avfc->streams[n];
- if (stream && stream->type != STREAM_SUB) {
+ if (stream) {
bool selected = demuxer_stream_is_selected(demuxer, stream);
st->discard = selected ? AVDISCARD_DEFAULT : AVDISCARD_ALL;
}
}
return DEMUXER_CTRL_OK;
}
- case DEMUXER_CTRL_AUTOSELECT_SUBTITLE:
- {
- priv->autoselect_sub = *((int *)arg);
- return DEMUXER_CTRL_OK;
- }
case DEMUXER_CTRL_IDENTIFY_PROGRAM:
{
demux_program_t *prog = arg;