summaryrefslogtreecommitdiffstats
path: root/demux
diff options
context:
space:
mode:
Diffstat (limited to 'demux')
-rw-r--r--demux/demux.c28
-rw-r--r--demux/demux.h5
-rw-r--r--demux/demux_lavf.c20
3 files changed, 29 insertions, 24 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;
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;