diff --git a/libavformat/avformat.h b/libavformat/avformat.h index 50e4f5c69d..00380d7b6c 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -796,6 +796,8 @@ typedef struct AVChapter { AVDictionary *metadata; } AVChapter; +typedef struct AVFormatInternal AVFormatInternal; + /** * Format I/O context. * New fields can be added to the end with minor version bumps. @@ -1049,6 +1051,11 @@ typedef struct AVFormatContext { */ AVRational offset_timebase; + /** + * An opaque field for libavformat internal usage. + * Must not be accessed in any way by callers. + */ + AVFormatInternal *internal; } AVFormatContext; typedef struct AVPacketList { diff --git a/libavformat/internal.h b/libavformat/internal.h index e92f476f50..0e7eb36e32 100644 --- a/libavformat/internal.h +++ b/libavformat/internal.h @@ -42,6 +42,14 @@ typedef struct CodecMime{ enum AVCodecID id; } CodecMime; +struct AVFormatInternal { + /** + * Number of streams relevant for interleaving. + * Muxing only. + */ + int nb_interleaved_streams; +}; + void ff_dynarray_add(intptr_t **tab_ptr, int *nb_ptr, intptr_t elem); #ifdef __GNUC__ diff --git a/libavformat/mux.c b/libavformat/mux.c index 24c4932ed7..06dacead8f 100644 --- a/libavformat/mux.c +++ b/libavformat/mux.c @@ -232,6 +232,9 @@ static int init_muxer(AVFormatContext *s, AVDictionary **options) av_log(s, AV_LOG_WARNING, "Codec for stream %d does not use global headers " "but container format requires global headers\n", i); + + if (codec->codec_type != AVMEDIA_TYPE_ATTACHMENT) + s->internal->nb_interleaved_streams++; } if (!s->priv_data && of->priv_data_size > 0) { @@ -541,7 +544,7 @@ int ff_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, for (i = 0; i < s->nb_streams; i++) stream_count += !!s->streams[i]->last_in_packet_buffer; - if (stream_count && (s->nb_streams == stream_count || flush)) { + if (stream_count && (s->internal->nb_interleaved_streams == stream_count || flush)) { pktl = s->packet_buffer; *out = pktl->pkt; diff --git a/libavformat/options.c b/libavformat/options.c index d99f04aab5..a5646df997 100644 --- a/libavformat/options.c +++ b/libavformat/options.c @@ -19,6 +19,7 @@ */ #include "avformat.h" #include "avio_internal.h" +#include "internal.h" #include "libavutil/opt.h" /** @@ -100,6 +101,13 @@ AVFormatContext *avformat_alloc_context(void) ic = av_malloc(sizeof(AVFormatContext)); if (!ic) return ic; avformat_get_context_defaults(ic); + + ic->internal = av_mallocz(sizeof(*ic->internal)); + if (!ic->internal) { + avformat_free_context(ic); + return NULL; + } + return ic; } diff --git a/libavformat/utils.c b/libavformat/utils.c index 01215ef257..fca588b48e 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -2633,6 +2633,7 @@ void avformat_free_context(AVFormatContext *s) av_freep(&s->chapters); av_dict_free(&s->metadata); av_freep(&s->streams); + av_freep(&s->internal); av_free(s); }