|
|
|
@@ -63,6 +63,7 @@ static const AVCodecTag flv_audio_codec_ids[] = { |
|
|
|
|
|
|
|
typedef enum { |
|
|
|
FLV_AAC_SEQ_HEADER_DETECT = (1 << 0), |
|
|
|
FLV_NO_SEQUENCE_END = (1 << 1), |
|
|
|
} FLVFlags; |
|
|
|
|
|
|
|
typedef struct FLVContext { |
|
|
|
@@ -527,13 +528,17 @@ static int flv_write_trailer(AVFormatContext *s) |
|
|
|
FLVContext *flv = s->priv_data; |
|
|
|
int i; |
|
|
|
|
|
|
|
/* Add EOS tag */ |
|
|
|
for (i = 0; i < s->nb_streams; i++) { |
|
|
|
AVCodecParameters *par = s->streams[i]->codecpar; |
|
|
|
FLVStreamContext *sc = s->streams[i]->priv_data; |
|
|
|
if (par->codec_type == AVMEDIA_TYPE_VIDEO && |
|
|
|
(par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4)) |
|
|
|
put_avc_eos_tag(pb, sc->last_ts); |
|
|
|
if (flv->flags & FLV_NO_SEQUENCE_END) { |
|
|
|
av_log(s, AV_LOG_DEBUG, "FLV no sequence end mode open\n"); |
|
|
|
} else { |
|
|
|
/* Add EOS tag */ |
|
|
|
for (i = 0; i < s->nb_streams; i++) { |
|
|
|
AVCodecParameters *par = s->streams[i]->codecpar; |
|
|
|
FLVStreamContext *sc = s->streams[i]->priv_data; |
|
|
|
if (par->codec_type == AVMEDIA_TYPE_VIDEO && |
|
|
|
(par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4)) |
|
|
|
put_avc_eos_tag(pb, sc->last_ts); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
file_size = avio_tell(pb); |
|
|
|
@@ -723,6 +728,7 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt) |
|
|
|
static const AVOption options[] = { |
|
|
|
{ "flvflags", "FLV muxer flags", offsetof(FLVContext, flags), AV_OPT_TYPE_FLAGS, {.i64 = 0}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "flvflags" }, |
|
|
|
{ "aac_seq_header_detect", "Put AAC sequence header based on stream data", 0, AV_OPT_TYPE_CONST, {.i64 = FLV_AAC_SEQ_HEADER_DETECT}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "flvflags" }, |
|
|
|
{ "no_sequence_end", "disable sequence end for FLV", 0, AV_OPT_TYPE_CONST, {.i64 = FLV_NO_SEQUENCE_END}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "flvflags" }, |
|
|
|
{ NULL }, |
|
|
|
}; |
|
|
|
|
|
|
|
|