|
|
|
@ -143,7 +143,9 @@ static AVStream *create_stream(AVFormatContext *s, int codec_type) |
|
|
|
|
st->codecpar->codec_type = codec_type; |
|
|
|
|
if (s->nb_streams>=3 ||( s->nb_streams==2 |
|
|
|
|
&& 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->streams[0]->codecpar->codec_type != AVMEDIA_TYPE_DATA |
|
|
|
|
&& s->streams[1]->codecpar->codec_type != AVMEDIA_TYPE_DATA)) |
|
|
|
|
s->ctx_flags &= ~AVFMTCTX_NOHEADER; |
|
|
|
|
if (codec_type == AVMEDIA_TYPE_AUDIO) { |
|
|
|
|
st->codecpar->bit_rate = flv->audio_bit_rate; |
|
|
|
@ -1001,7 +1003,7 @@ retry: |
|
|
|
|
int type; |
|
|
|
|
meta_pos = avio_tell(s->pb); |
|
|
|
|
type = flv_read_metabody(s, next); |
|
|
|
|
if (type == 0 && dts == 0 || type < 0 || type == TYPE_UNKNOWN) { |
|
|
|
|
if (type == 0 && dts == 0 || type < 0) { |
|
|
|
|
if (type < 0 && flv->validate_count && |
|
|
|
|
flv->validate_index[0].pos > next && |
|
|
|
|
flv->validate_index[0].pos - 4 < next |
|
|
|
@ -1015,6 +1017,8 @@ retry: |
|
|
|
|
return flv_data_packet(s, pkt, dts, next); |
|
|
|
|
} else if (type == TYPE_ONCAPTION) { |
|
|
|
|
return flv_data_packet(s, pkt, dts, next); |
|
|
|
|
} else if (type == TYPE_UNKNOWN) { |
|
|
|
|
stream_type = FLV_STREAM_TYPE_DATA; |
|
|
|
|
} |
|
|
|
|
avio_seek(s->pb, meta_pos, SEEK_SET); |
|
|
|
|
} |
|
|
|
@ -1054,10 +1058,13 @@ skip: |
|
|
|
|
} else if (stream_type == FLV_STREAM_TYPE_SUBTITLE) { |
|
|
|
|
if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) |
|
|
|
|
break; |
|
|
|
|
} else if (stream_type == FLV_STREAM_TYPE_DATA) { |
|
|
|
|
if (st->codecpar->codec_type == AVMEDIA_TYPE_DATA) |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (i == s->nb_streams) { |
|
|
|
|
static const enum AVMediaType stream_types[] = {AVMEDIA_TYPE_VIDEO, AVMEDIA_TYPE_AUDIO, AVMEDIA_TYPE_SUBTITLE}; |
|
|
|
|
static const enum AVMediaType stream_types[] = {AVMEDIA_TYPE_VIDEO, AVMEDIA_TYPE_AUDIO, AVMEDIA_TYPE_SUBTITLE, AVMEDIA_TYPE_DATA}; |
|
|
|
|
st = create_stream(s, stream_types[stream_type]); |
|
|
|
|
if (!st) |
|
|
|
|
return AVERROR(ENOMEM); |
|
|
|
@ -1153,6 +1160,8 @@ retry_duration: |
|
|
|
|
size -= ret; |
|
|
|
|
} else if (stream_type == FLV_STREAM_TYPE_SUBTITLE) { |
|
|
|
|
st->codecpar->codec_id = AV_CODEC_ID_TEXT; |
|
|
|
|
} else if (stream_type == FLV_STREAM_TYPE_DATA) { |
|
|
|
|
st->codecpar->codec_id = AV_CODEC_ID_NONE; // Opaque AMF data
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (st->codecpar->codec_id == AV_CODEC_ID_AAC || |
|
|
|
@ -1253,7 +1262,8 @@ retry_duration: |
|
|
|
|
|
|
|
|
|
if ( stream_type == FLV_STREAM_TYPE_AUDIO || |
|
|
|
|
((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY) || |
|
|
|
|
stream_type == FLV_STREAM_TYPE_SUBTITLE) |
|
|
|
|
stream_type == FLV_STREAM_TYPE_SUBTITLE || |
|
|
|
|
stream_type == FLV_STREAM_TYPE_DATA) |
|
|
|
|
pkt->flags |= AV_PKT_FLAG_KEY; |
|
|
|
|
|
|
|
|
|
leave: |
|
|
|
|