mirror of https://git.ffmpeg.org/ffmpeg.git
lavf/flvdec: replace a private option with a field in FFFormatContext
The demuxer's 'missing_streams' private option is used to communicate information from the demuxer to avformat_find_stream_info(). However, that is not only unnecessarily complicated, it also leaks internal information to users, e.g. this option appears in the results of the fate-flv-demux test. Use a new field in FFFormatContext to communicate this information instead.
This commit is contained in:
parent
31da5222a4
commit
86460a0342
|
@ -2537,7 +2537,6 @@ 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;
|
||||||
int *missing_streams = av_opt_ptr(ic->iformat->priv_class, ic->priv_data, "missing_streams");
|
|
||||||
|
|
||||||
flush_codecs = probesize > 0;
|
flush_codecs = probesize > 0;
|
||||||
|
|
||||||
|
@ -2676,8 +2675,7 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
analyzed_all_streams = 0;
|
analyzed_all_streams = 0;
|
||||||
if (!missing_streams || !*missing_streams)
|
if (i == ic->nb_streams && !si->missing_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
|
||||||
* packets to get most of the streams, so we cannot stop here. */
|
* packets to get most of the streams, so we cannot stop here. */
|
||||||
|
|
|
@ -97,7 +97,6 @@ typedef struct FLVContext {
|
||||||
int64_t audio_bit_rate;
|
int64_t audio_bit_rate;
|
||||||
int64_t *keyframe_times;
|
int64_t *keyframe_times;
|
||||||
int64_t *keyframe_filepositions;
|
int64_t *keyframe_filepositions;
|
||||||
int missing_streams;
|
|
||||||
AVRational framerate;
|
AVRational framerate;
|
||||||
int64_t last_ts;
|
int64_t last_ts;
|
||||||
int64_t time_offset;
|
int64_t time_offset;
|
||||||
|
@ -189,6 +188,7 @@ static void add_keyframes_index(AVFormatContext *s)
|
||||||
|
|
||||||
static AVStream *create_stream(AVFormatContext *s, int codec_type)
|
static AVStream *create_stream(AVFormatContext *s, int codec_type)
|
||||||
{
|
{
|
||||||
|
FFFormatContext *const si = ffformatcontext(s);
|
||||||
FLVContext *flv = s->priv_data;
|
FLVContext *flv = s->priv_data;
|
||||||
AVStream *st = avformat_new_stream(s, NULL);
|
AVStream *st = avformat_new_stream(s, NULL);
|
||||||
if (!st)
|
if (!st)
|
||||||
|
@ -202,11 +202,11 @@ static AVStream *create_stream(AVFormatContext *s, int codec_type)
|
||||||
s->ctx_flags &= ~AVFMTCTX_NOHEADER;
|
s->ctx_flags &= ~AVFMTCTX_NOHEADER;
|
||||||
if (codec_type == AVMEDIA_TYPE_AUDIO) {
|
if (codec_type == AVMEDIA_TYPE_AUDIO) {
|
||||||
st->codecpar->bit_rate = flv->audio_bit_rate;
|
st->codecpar->bit_rate = flv->audio_bit_rate;
|
||||||
flv->missing_streams &= ~FLV_HEADER_FLAG_HASAUDIO;
|
si->missing_streams &= ~FLV_HEADER_FLAG_HASAUDIO;
|
||||||
}
|
}
|
||||||
if (codec_type == AVMEDIA_TYPE_VIDEO) {
|
if (codec_type == AVMEDIA_TYPE_VIDEO) {
|
||||||
st->codecpar->bit_rate = flv->video_bit_rate;
|
st->codecpar->bit_rate = flv->video_bit_rate;
|
||||||
flv->missing_streams &= ~FLV_HEADER_FLAG_HASVIDEO;
|
si->missing_streams &= ~FLV_HEADER_FLAG_HASVIDEO;
|
||||||
st->avg_frame_rate = flv->framerate;
|
st->avg_frame_rate = flv->framerate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -843,6 +843,7 @@ 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)
|
||||||
{
|
{
|
||||||
|
FFFormatContext *const si = ffformatcontext(s);
|
||||||
int flags;
|
int flags;
|
||||||
FLVContext *flv = s->priv_data;
|
FLVContext *flv = s->priv_data;
|
||||||
int offset;
|
int offset;
|
||||||
|
@ -855,7 +856,7 @@ static int flv_read_header(AVFormatContext *s)
|
||||||
avio_skip(s->pb, 4);
|
avio_skip(s->pb, 4);
|
||||||
flags = avio_r8(s->pb);
|
flags = avio_r8(s->pb);
|
||||||
|
|
||||||
flv->missing_streams = flags & (FLV_HEADER_FLAG_HASVIDEO | FLV_HEADER_FLAG_HASAUDIO);
|
si->missing_streams = flags & (FLV_HEADER_FLAG_HASVIDEO | FLV_HEADER_FLAG_HASAUDIO);
|
||||||
|
|
||||||
s->ctx_flags |= AVFMTCTX_NOHEADER;
|
s->ctx_flags |= AVFMTCTX_NOHEADER;
|
||||||
|
|
||||||
|
@ -1577,7 +1578,6 @@ 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 },
|
||||||
{ "flv_full_metadata", "Dump full metadata of the onMetadata", OFFSET(dump_full_metadata), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VD },
|
{ "flv_full_metadata", "Dump full metadata of the onMetadata", OFFSET(dump_full_metadata), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VD },
|
||||||
{ "flv_ignore_prevtag", "Ignore the Size of previous tag", OFFSET(trust_datasize), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VD },
|
{ "flv_ignore_prevtag", "Ignore the Size of previous tag", OFFSET(trust_datasize), 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 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -120,6 +120,8 @@ typedef struct FFFormatContext {
|
||||||
* ID3v2 tag useful for MP3 demuxing
|
* ID3v2 tag useful for MP3 demuxing
|
||||||
*/
|
*/
|
||||||
AVDictionary *id3v2_meta;
|
AVDictionary *id3v2_meta;
|
||||||
|
|
||||||
|
int missing_streams;
|
||||||
} FFFormatContext;
|
} FFFormatContext;
|
||||||
|
|
||||||
static av_always_inline FFFormatContext *ffformatcontext(AVFormatContext *s)
|
static av_always_inline FFFormatContext *ffformatcontext(AVFormatContext *s)
|
||||||
|
|
|
@ -601,6 +601,6 @@ packet|codec_type=video|stream_index=0|pts=11612|pts_time=11.612000|dts=11612|dt
|
||||||
packet|codec_type=video|stream_index=0|pts=11645|pts_time=11.645000|dts=11645|dts_time=11.645000|duration=33|duration_time=0.033000|size=2600|pos=507811|flags=___|data_hash=CRC32:d35f9e6f
|
packet|codec_type=video|stream_index=0|pts=11645|pts_time=11.645000|dts=11645|dts_time=11.645000|duration=33|duration_time=0.033000|size=2600|pos=507811|flags=___|data_hash=CRC32:d35f9e6f
|
||||||
packet|codec_type=audio|stream_index=1|pts=11656|pts_time=11.656000|dts=11656|dts_time=11.656000|duration=46|duration_time=0.046000|size=346|pos=510431|flags=K__|data_hash=CRC32:4e6b44cb
|
packet|codec_type=audio|stream_index=1|pts=11656|pts_time=11.656000|dts=11656|dts_time=11.656000|duration=46|duration_time=0.046000|size=346|pos=510431|flags=K__|data_hash=CRC32:4e6b44cb
|
||||||
packet|codec_type=video|stream_index=0|pts=11678|pts_time=11.678000|dts=11678|dts_time=11.678000|duration=33|duration_time=0.033000|size=1190|pos=510794|flags=__C|data_hash=CRC32:a0206c90
|
packet|codec_type=video|stream_index=0|pts=11678|pts_time=11.678000|dts=11678|dts_time=11.678000|duration=33|duration_time=0.033000|size=1190|pos=510794|flags=__C|data_hash=CRC32:a0206c90
|
||||||
stream|index=0|codec_name=h264|profile=77|codec_type=video|codec_tag_string=[0][0][0][0]|codec_tag=0x0000|width=426|height=240|coded_width=426|coded_height=240|closed_captions=0|film_grain=0|has_b_frames=1|sample_aspect_ratio=1:1|display_aspect_ratio=71:40|pix_fmt=yuv420p|level=21|color_range=unknown|color_space=unknown|color_transfer=unknown|color_primaries=unknown|chroma_location=left|field_order=progressive|refs=1|is_avc=true|nal_length_size=4|missing_streams=0|id=N/A|r_frame_rate=30000/1001|avg_frame_rate=30/1|time_base=1/1000|start_pts=0|start_time=0.000000|duration_ts=N/A|duration=N/A|bit_rate=393929|max_bit_rate=N/A|bits_per_raw_sample=8|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=351|extradata_size=39|extradata_hash=CRC32:07b85ca9|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|disposition:multilayer=0
|
stream|index=0|codec_name=h264|profile=77|codec_type=video|codec_tag_string=[0][0][0][0]|codec_tag=0x0000|width=426|height=240|coded_width=426|coded_height=240|closed_captions=0|film_grain=0|has_b_frames=1|sample_aspect_ratio=1:1|display_aspect_ratio=71:40|pix_fmt=yuv420p|level=21|color_range=unknown|color_space=unknown|color_transfer=unknown|color_primaries=unknown|chroma_location=left|field_order=progressive|refs=1|is_avc=true|nal_length_size=4|id=N/A|r_frame_rate=30000/1001|avg_frame_rate=30/1|time_base=1/1000|start_pts=0|start_time=0.000000|duration_ts=N/A|duration=N/A|bit_rate=393929|max_bit_rate=N/A|bits_per_raw_sample=8|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=351|extradata_size=39|extradata_hash=CRC32:07b85ca9|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|disposition:multilayer=0
|
||||||
stream|index=1|codec_name=aac|profile=1|codec_type=audio|codec_tag_string=[0][0][0][0]|codec_tag=0x0000|sample_fmt=fltp|sample_rate=22050|channels=2|channel_layout=stereo|bits_per_sample=0|initial_padding=0|missing_streams=0|id=N/A|r_frame_rate=0/0|avg_frame_rate=0/0|time_base=1/1000|start_pts=0|start_time=0.000000|duration_ts=N/A|duration=N/A|bit_rate=67874|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=252|extradata_size=2|extradata_hash=CRC32:d039c029|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|disposition:multilayer=0
|
stream|index=1|codec_name=aac|profile=1|codec_type=audio|codec_tag_string=[0][0][0][0]|codec_tag=0x0000|sample_fmt=fltp|sample_rate=22050|channels=2|channel_layout=stereo|bits_per_sample=0|initial_padding=0|id=N/A|r_frame_rate=0/0|avg_frame_rate=0/0|time_base=1/1000|start_pts=0|start_time=0.000000|duration_ts=N/A|duration=N/A|bit_rate=67874|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=252|extradata_size=2|extradata_hash=CRC32:d039c029|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|disposition:multilayer=0
|
||||||
format|filename=Enigma_Principles_of_Lust-part.flv|nb_streams=2|nb_programs=0|nb_stream_groups=0|format_name=flv|start_time=0.000000|duration=210.209999|size=512000|bit_rate=19485|probe_score=100|tag:hasKeyframes=true|tag:hasMetadata=true|tag:datasize=11970544|tag:hasVideo=true|tag:canSeekToEnd=false|tag:lasttimestamp=210|tag:lastkeyframetimestamp=210|tag:audiosize=1791332|tag:hasAudio=true|tag:audiodelay=0|tag:videosize=10176110|tag:metadatadate=2011-02-27T11:00:33.125000Z|tag:metadatacreator=inlet media FLVTool2 v1.0.6 - http://www.inlet-media.de/flvtool2|tag:hasCuePoints=false
|
format|filename=Enigma_Principles_of_Lust-part.flv|nb_streams=2|nb_programs=0|nb_stream_groups=0|format_name=flv|start_time=0.000000|duration=210.209999|size=512000|bit_rate=19485|probe_score=100|tag:hasKeyframes=true|tag:hasMetadata=true|tag:datasize=11970544|tag:hasVideo=true|tag:canSeekToEnd=false|tag:lasttimestamp=210|tag:lastkeyframetimestamp=210|tag:audiosize=1791332|tag:hasAudio=true|tag:audiodelay=0|tag:videosize=10176110|tag:metadatadate=2011-02-27T11:00:33.125000Z|tag:metadatacreator=inlet media FLVTool2 v1.0.6 - http://www.inlet-media.de/flvtool2|tag:hasCuePoints=false
|
||||||
|
|
Loading…
Reference in New Issue