mirror of
https://git.videolan.org/git/ffmpeg.git
synced 2024-10-14 20:33:00 +02:00
avformat/flvdec: Fix regression loosing streams
Fixes: unknown_video.flv Found-by: Thierry Foucu <tfoucu@google.com> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
parent
940b8908b9
commit
077939626e
@ -66,6 +66,7 @@ typedef struct FLVContext {
|
|||||||
int keyframe_count;
|
int keyframe_count;
|
||||||
int64_t *keyframe_times;
|
int64_t *keyframe_times;
|
||||||
int64_t *keyframe_filepositions;
|
int64_t *keyframe_filepositions;
|
||||||
|
int missing_streams;
|
||||||
} FLVContext;
|
} FLVContext;
|
||||||
|
|
||||||
static int probe(AVProbeData *p, int live)
|
static int probe(AVProbeData *p, int live)
|
||||||
@ -137,6 +138,11 @@ static AVStream *create_stream(AVFormatContext *s, int codec_type)
|
|||||||
&& s->streams[0]->codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE
|
&& s->streams[0]->codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE
|
||||||
&& s->streams[1]->codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE))
|
&& s->streams[1]->codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE))
|
||||||
s->ctx_flags &= ~AVFMTCTX_NOHEADER;
|
s->ctx_flags &= ~AVFMTCTX_NOHEADER;
|
||||||
|
if (codec_type == AVMEDIA_TYPE_AUDIO)
|
||||||
|
flv->missing_streams &= ~FLV_HEADER_FLAG_HASAUDIO;
|
||||||
|
if (codec_type == AVMEDIA_TYPE_VIDEO)
|
||||||
|
flv->missing_streams &= ~FLV_HEADER_FLAG_HASVIDEO;
|
||||||
|
|
||||||
|
|
||||||
avpriv_set_pts_info(st, 32, 1, 1000); /* 32 bit pts in ms */
|
avpriv_set_pts_info(st, 32, 1, 1000); /* 32 bit pts in ms */
|
||||||
flv->last_keyframe_stream_index = s->nb_streams - 1;
|
flv->last_keyframe_stream_index = s->nb_streams - 1;
|
||||||
@ -674,11 +680,14 @@ static int flv_read_metabody(AVFormatContext *s, int64_t next_pos)
|
|||||||
|
|
||||||
static int flv_read_header(AVFormatContext *s)
|
static int flv_read_header(AVFormatContext *s)
|
||||||
{
|
{
|
||||||
|
int flags;
|
||||||
FLVContext *flv = s->priv_data;
|
FLVContext *flv = s->priv_data;
|
||||||
int offset;
|
int offset;
|
||||||
|
|
||||||
avio_skip(s->pb, 4);
|
avio_skip(s->pb, 4);
|
||||||
avio_r8(s->pb); // flags
|
flags = avio_r8(s->pb);
|
||||||
|
|
||||||
|
flv->missing_streams = flags & (FLV_HEADER_FLAG_HASVIDEO | FLV_HEADER_FLAG_HASAUDIO);
|
||||||
|
|
||||||
s->ctx_flags |= AVFMTCTX_NOHEADER;
|
s->ctx_flags |= AVFMTCTX_NOHEADER;
|
||||||
|
|
||||||
@ -1216,6 +1225,7 @@ static int flv_read_seek(AVFormatContext *s, int stream_index,
|
|||||||
#define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
|
#define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
|
||||||
static const AVOption options[] = {
|
static const AVOption options[] = {
|
||||||
{ "flv_metadata", "Allocate streams according to the onMetaData array", OFFSET(trust_metadata), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VD },
|
{ "flv_metadata", "Allocate streams according to the onMetaData array", OFFSET(trust_metadata), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VD },
|
||||||
|
{ "missing_streams", "", OFFSET(missing_streams), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 0xFF, VD | AV_OPT_FLAG_EXPORT | AV_OPT_FLAG_READONLY },
|
||||||
{ NULL }
|
{ NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -3349,6 +3349,7 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
|
|||||||
int64_t max_subtitle_analyze_duration;
|
int64_t max_subtitle_analyze_duration;
|
||||||
int64_t probesize = ic->probesize;
|
int64_t probesize = ic->probesize;
|
||||||
int eof_reached = 0;
|
int eof_reached = 0;
|
||||||
|
int64_t *missing_streams = av_opt_ptr(ic->iformat->priv_class, ic->priv_data, "missing_streams");
|
||||||
|
|
||||||
flush_codecs = probesize > 0;
|
flush_codecs = probesize > 0;
|
||||||
|
|
||||||
@ -3502,6 +3503,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
analyzed_all_streams = 0;
|
analyzed_all_streams = 0;
|
||||||
|
if (!missing_streams || !*missing_streams)
|
||||||
if (i == ic->nb_streams) {
|
if (i == ic->nb_streams) {
|
||||||
analyzed_all_streams = 1;
|
analyzed_all_streams = 1;
|
||||||
/* NOTE: If the format has no header, then we need to read some
|
/* NOTE: If the format has no header, then we need to read some
|
||||||
|
Loading…
Reference in New Issue
Block a user