summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2019-06-09 23:00:04 +0200
committerwm4 <wm4@nowhere>2019-09-19 20:37:05 +0200
commitcb82a206a966ce746737e0c0b407ac116cd93990 (patch)
treee2214209b49ab8b09ba3461b9324930f22018150
parent91abd7a4f78901df1c6e343452136d53c50d8f2b (diff)
downloadmpv-cb82a206a966ce746737e0c0b407ac116cd93990.tar.bz2
mpv-cb82a206a966ce746737e0c0b407ac116cd93990.tar.xz
demux_lavf: add per-stream state
Seems like this will be useful later.
-rw-r--r--demux/demux_lavf.c25
1 files changed, 17 insertions, 8 deletions
diff --git a/demux/demux_lavf.c b/demux/demux_lavf.c
index 938181e125..63dc4da79e 100644
--- a/demux/demux_lavf.c
+++ b/demux/demux_lavf.c
@@ -198,6 +198,10 @@ struct nested_stream {
int64_t last_bytes;
};
+struct stream_info {
+ struct sh_stream *sh;
+};
+
typedef struct lavf_priv {
struct stream *stream;
bool own_stream;
@@ -209,7 +213,7 @@ typedef struct lavf_priv {
bstr init_fragment;
int64_t stream_pos;
AVIOContext *pb;
- struct sh_stream **streams; // NULL for unknown streams
+ struct stream_info **streams; // NULL for unknown streams
int num_streams;
char *mime_type;
double seek_delay;
@@ -572,7 +576,7 @@ static void select_tracks(struct demuxer *demuxer, int start)
{
lavf_priv_t *priv = demuxer->priv;
for (int n = start; n < priv->num_streams; n++) {
- struct sh_stream *stream = priv->streams[n];
+ struct sh_stream *stream = priv->streams[n]->sh;
AVStream *st = priv->avfc->streams[n];
bool selected = stream && demux_stream_is_selected(stream) &&
!stream->attached_picture;
@@ -753,8 +757,12 @@ static void handle_new_stream(demuxer_t *demuxer, int i)
default: ;
}
+ struct stream_info *info = talloc_zero(priv, struct stream_info);
+ *info = (struct stream_info){
+ .sh = sh,
+ };
assert(priv->num_streams == i); // directly mapped
- MP_TARRAY_APPEND(priv, priv->streams, priv->num_streams, sh);
+ MP_TARRAY_APPEND(priv, priv->streams, priv->num_streams, info);
if (sh) {
sh->ff_index = st->index;
@@ -838,12 +846,12 @@ static void update_metadata(demuxer_t *demuxer)
}
for (int n = 0; n < priv->num_streams; n++) {
- AVStream *st = priv->streams[n] ? priv->avfc->streams[n] : NULL;
+ AVStream *st = priv->streams[n]->sh ? priv->avfc->streams[n] : NULL;
if (st && st->event_flags & AVSTREAM_EVENT_FLAG_METADATA_UPDATED) {
st->event_flags = 0;
struct mp_tags *tags = talloc_zero(NULL, struct mp_tags);
mp_tags_copy_from_av_dictionary(tags, st->metadata);
- demux_set_stream_tags(demuxer, priv->streams[n], tags);
+ demux_set_stream_tags(demuxer, priv->streams[n]->sh, tags);
}
}
}
@@ -1128,7 +1136,7 @@ static bool demux_lavf_read_packet(struct demuxer *demux,
update_metadata(demux);
assert(pkt->stream_index >= 0 && pkt->stream_index < priv->num_streams);
- struct sh_stream *stream = priv->streams[pkt->stream_index];
+ struct sh_stream *stream = priv->streams[pkt->stream_index]->sh;
AVStream *st = priv->avfc->streams[pkt->stream_index];
if (!demux_stream_is_selected(stream)) {
@@ -1271,8 +1279,9 @@ static void demux_close_lavf(demuxer_t *demuxer)
av_freep(&priv->pb->buffer);
av_freep(&priv->pb);
for (int n = 0; n < priv->num_streams; n++) {
- if (priv->streams[n])
- avcodec_parameters_free(&priv->streams[n]->codec->lav_codecpar);
+ struct stream_info *info = priv->streams[n];
+ if (info->sh)
+ avcodec_parameters_free(&info->sh->codec->lav_codecpar);
}
if (priv->own_stream)
free_stream(priv->stream);