Browse Source

lavf: ignore attachment streams for interleaving purposes

Those streams should never get any packets by definition.
tags/n2.2-rc1
Anton Khirnov 11 years ago
parent
commit
33c859c142
5 changed files with 28 additions and 1 deletions
  1. +7
    -0
      libavformat/avformat.h
  2. +8
    -0
      libavformat/internal.h
  3. +4
    -1
      libavformat/mux.c
  4. +8
    -0
      libavformat/options.c
  5. +1
    -0
      libavformat/utils.c

+ 7
- 0
libavformat/avformat.h View File

@@ -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 {


+ 8
- 0
libavformat/internal.h View File

@@ -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__


+ 4
- 1
libavformat/mux.c View File

@@ -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;



+ 8
- 0
libavformat/options.c View File

@@ -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;
}



+ 1
- 0
libavformat/utils.c View File

@@ -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);
}



Loading…
Cancel
Save