mirror of
https://gitee.com/openharmony/third_party_ffmpeg
synced 2024-11-27 13:10:37 +00:00
lavf: ignore attachment streams for interleaving purposes
Those streams should never get any packets by definition.
This commit is contained in:
parent
7b03b65bf0
commit
33c859c142
@ -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 {
|
||||
|
@ -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__
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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…
Reference in New Issue
Block a user