Those streams should never get any packets by definition.tags/n2.2-rc1
| @@ -796,6 +796,8 @@ typedef struct AVChapter { | |||||
| AVDictionary *metadata; | AVDictionary *metadata; | ||||
| } AVChapter; | } AVChapter; | ||||
| typedef struct AVFormatInternal AVFormatInternal; | |||||
| /** | /** | ||||
| * Format I/O context. | * Format I/O context. | ||||
| * New fields can be added to the end with minor version bumps. | * New fields can be added to the end with minor version bumps. | ||||
| @@ -1049,6 +1051,11 @@ typedef struct AVFormatContext { | |||||
| */ | */ | ||||
| AVRational offset_timebase; | AVRational offset_timebase; | ||||
| /** | |||||
| * An opaque field for libavformat internal usage. | |||||
| * Must not be accessed in any way by callers. | |||||
| */ | |||||
| AVFormatInternal *internal; | |||||
| } AVFormatContext; | } AVFormatContext; | ||||
| typedef struct AVPacketList { | typedef struct AVPacketList { | ||||
| @@ -42,6 +42,14 @@ typedef struct CodecMime{ | |||||
| enum AVCodecID id; | enum AVCodecID id; | ||||
| } CodecMime; | } 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); | void ff_dynarray_add(intptr_t **tab_ptr, int *nb_ptr, intptr_t elem); | ||||
| #ifdef __GNUC__ | #ifdef __GNUC__ | ||||
| @@ -232,6 +232,9 @@ static int init_muxer(AVFormatContext *s, AVDictionary **options) | |||||
| av_log(s, AV_LOG_WARNING, | av_log(s, AV_LOG_WARNING, | ||||
| "Codec for stream %d does not use global headers " | "Codec for stream %d does not use global headers " | ||||
| "but container format requires global headers\n", i); | "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) { | 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++) | for (i = 0; i < s->nb_streams; i++) | ||||
| stream_count += !!s->streams[i]->last_in_packet_buffer; | 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; | pktl = s->packet_buffer; | ||||
| *out = pktl->pkt; | *out = pktl->pkt; | ||||
| @@ -19,6 +19,7 @@ | |||||
| */ | */ | ||||
| #include "avformat.h" | #include "avformat.h" | ||||
| #include "avio_internal.h" | #include "avio_internal.h" | ||||
| #include "internal.h" | |||||
| #include "libavutil/opt.h" | #include "libavutil/opt.h" | ||||
| /** | /** | ||||
| @@ -100,6 +101,13 @@ AVFormatContext *avformat_alloc_context(void) | |||||
| ic = av_malloc(sizeof(AVFormatContext)); | ic = av_malloc(sizeof(AVFormatContext)); | ||||
| if (!ic) return ic; | if (!ic) return ic; | ||||
| avformat_get_context_defaults(ic); | avformat_get_context_defaults(ic); | ||||
| ic->internal = av_mallocz(sizeof(*ic->internal)); | |||||
| if (!ic->internal) { | |||||
| avformat_free_context(ic); | |||||
| return NULL; | |||||
| } | |||||
| return ic; | return ic; | ||||
| } | } | ||||
| @@ -2633,6 +2633,7 @@ void avformat_free_context(AVFormatContext *s) | |||||
| av_freep(&s->chapters); | av_freep(&s->chapters); | ||||
| av_dict_free(&s->metadata); | av_dict_free(&s->metadata); | ||||
| av_freep(&s->streams); | av_freep(&s->streams); | ||||
| av_freep(&s->internal); | |||||
| av_free(s); | av_free(s); | ||||
| } | } | ||||