diff options
Diffstat (limited to 'demux')
-rw-r--r-- | demux/demux.c | 28 | ||||
-rw-r--r-- | demux/demux.h | 5 | ||||
-rw-r--r-- | demux/demux_lavf.c | 20 |
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; |