Message ID | 20161124034936.16178-1-lq@chinaffmpeg.org |
---|---|
State | Accepted |
Commit | ee24c8ad011272ffd1a6daaf3f0128ace8663c18 |
Headers | show |
2016-11-24 11:49 GMT+08:00 Steven Liu <lq@chinaffmpeg.org>: > mythtv have problem with non-seekable dont write duration and filesize > and there have problem with some other server and player with 0 value > duation and filesize. > So add a flv flags to fix the ticket and make a choose for users. > > Signed-off-by: Steven Liu <lq@chinaffmpeg.org> > --- > doc/muxers.texi | 4 ++++ > libavformat/flvenc.c | 11 +++++++---- > 2 files changed, 11 insertions(+), 4 deletions(-) > > diff --git a/doc/muxers.texi b/doc/muxers.texi > index 8689341..1c14adf 100644 > --- a/doc/muxers.texi > +++ b/doc/muxers.texi > @@ -151,6 +151,10 @@ Disable sequence end tag. > @item no_metadata > Disable metadata tag. > > +@item no_duration_filesize > +Disable duration and filesize in metadata when they are equal to zero > +at the end of stream. (Be used to non-seekable living stream). > + > @item add_keyframe_index > Used to facilitate seeking; particularly for HTTP pseudo streaming. > @end table > diff --git a/libavformat/flvenc.c b/libavformat/flvenc.c > index 177052a..62d406a 100644 > --- a/libavformat/flvenc.c > +++ b/libavformat/flvenc.c > @@ -68,6 +68,7 @@ typedef enum { > FLV_NO_SEQUENCE_END = (1 << 1), > FLV_ADD_KEYFRAME_INDEX = (1 << 2), > FLV_NO_METADATA = (1 << 3), > + FLV_NO_DURATION_FILESIZE = (1 << 4), > } FLVFlags; > > typedef struct FLVFileposition { > @@ -269,6 +270,7 @@ static void write_metadata(AVFormatContext *s, > unsigned int ts) > { > AVIOContext *pb = s->pb; > FLVContext *flv = s->priv_data; > + int write_duration_filesize = !(flv->flags & > FLV_NO_DURATION_FILESIZE); > int metadata_count = 0; > int64_t metadata_count_pos; > AVDictionaryEntry *tag = NULL; > @@ -292,12 +294,12 @@ static void write_metadata(AVFormatContext *s, > unsigned int ts) > metadata_count = 4 * !!flv->video_par + > 5 * !!flv->audio_par + > 1 * !!flv->data_par; > - if (pb->seekable) { > + if (write_duration_filesize) { > metadata_count += 2; // +2 for duration and file size > } > avio_wb32(pb, metadata_count); > > - if (pb->seekable) { > + if (write_duration_filesize) { > put_amf_string(pb, "duration"); > flv->duration_offset = avio_tell(pb); > // fill in the guessed duration, it'll be corrected later if > incorrect > @@ -378,7 +380,7 @@ static void write_metadata(AVFormatContext *s, > unsigned int ts) > metadata_count++; > } > > - if (pb->seekable) { > + if (write_duration_filesize) { > put_amf_string(pb, "filesize"); > flv->filesize_offset = avio_tell(pb); > put_amf_double(pb, 0); // delayed write > @@ -844,7 +846,7 @@ end: > avio_seek(pb, flv->datasize_offset, SEEK_SET); > put_amf_double(pb, flv->datasize); > } > - if (pb->seekable) { > + if (!(flv->flags & FLV_NO_DURATION_FILESIZE)) { > /* update information */ > if (avio_seek(pb, flv->duration_offset, SEEK_SET) < 0) { > av_log(s, AV_LOG_WARNING, "Failed to update header with > correct duration.\n"); > @@ -1061,6 +1063,7 @@ static const AVOption options[] = { > { "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" }, > { "no_metadata", "disable metadata for FLV", 0, AV_OPT_TYPE_CONST, > {.i64 = FLV_NO_METADATA}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, > "flvflags" }, > + { "no_duration_filesize", "disable duration and filesize zero value > metadata for FLV", 0, AV_OPT_TYPE_CONST, {.i64 = FLV_NO_DURATION_FILESIZE}, > INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "flvflags" }, > { "add_keyframe_index", "Add keyframe index metadata", 0, > AV_OPT_TYPE_CONST, {.i64 = FLV_ADD_KEYFRAME_INDEX}, INT_MIN, INT_MAX, > AV_OPT_FLAG_ENCODING_PARAM, "flvflags" }, > { NULL }, > }; > -- > 1.7.1 > > pushed, Thanks ! > > > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel >
On Sat, 26 Nov 2016 09:19:42 +0800, Steven Liu wrote: > 2016-11-24 11:49 GMT+08:00 Steven Liu <lq@chinaffmpeg.org>: > > > mythtv have problem with non-seekable dont write duration and filesize > > and there have problem with some other server and player with 0 value > > duation and filesize. > > So add a flv flags to fix the ticket and make a choose for users. > > > > Signed-off-by: Steven Liu <lq@chinaffmpeg.org> > > --- > > doc/muxers.texi | 4 ++++ > > libavformat/flvenc.c | 11 +++++++---- > > 2 files changed, 11 insertions(+), 4 deletions(-) [...] > > pushed, Thanks ! You can trim the "pushed" messages. Also, your quoting was messed up which made it hard to determine old text from new text.
2016-11-26 9:39 GMT+08:00 Lou Logan <lou@lrcd.com>: > On Sat, 26 Nov 2016 09:19:42 +0800, Steven Liu wrote: > > > 2016-11-24 11:49 GMT+08:00 Steven Liu <lq@chinaffmpeg.org>: > > > > > mythtv have problem with non-seekable dont write duration and filesize > > > and there have problem with some other server and player with 0 value > > > duation and filesize. > > > So add a flv flags to fix the ticket and make a choose for users. > > > > > > Signed-off-by: Steven Liu <lq@chinaffmpeg.org> > > > --- > > > doc/muxers.texi | 4 ++++ > > > libavformat/flvenc.c | 11 +++++++---- > > > 2 files changed, 11 insertions(+), 4 deletions(-) > [...] > > > pushed, Thanks ! > > You can trim the "pushed" messages. Also, your quoting was messed up > which made it hard to determine old text from new text. > ok, i have look at the old push messages, i see now. Thanks for your suggestion! > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel >
diff --git a/doc/muxers.texi b/doc/muxers.texi index 8689341..1c14adf 100644 --- a/doc/muxers.texi +++ b/doc/muxers.texi @@ -151,6 +151,10 @@ Disable sequence end tag. @item no_metadata Disable metadata tag. +@item no_duration_filesize +Disable duration and filesize in metadata when they are equal to zero +at the end of stream. (Be used to non-seekable living stream). + @item add_keyframe_index Used to facilitate seeking; particularly for HTTP pseudo streaming. @end table diff --git a/libavformat/flvenc.c b/libavformat/flvenc.c index 177052a..62d406a 100644 --- a/libavformat/flvenc.c +++ b/libavformat/flvenc.c @@ -68,6 +68,7 @@ typedef enum { FLV_NO_SEQUENCE_END = (1 << 1), FLV_ADD_KEYFRAME_INDEX = (1 << 2), FLV_NO_METADATA = (1 << 3), + FLV_NO_DURATION_FILESIZE = (1 << 4), } FLVFlags; typedef struct FLVFileposition { @@ -269,6 +270,7 @@ static void write_metadata(AVFormatContext *s, unsigned int ts) { AVIOContext *pb = s->pb; FLVContext *flv = s->priv_data; + int write_duration_filesize = !(flv->flags & FLV_NO_DURATION_FILESIZE); int metadata_count = 0; int64_t metadata_count_pos; AVDictionaryEntry *tag = NULL; @@ -292,12 +294,12 @@ static void write_metadata(AVFormatContext *s, unsigned int ts) metadata_count = 4 * !!flv->video_par + 5 * !!flv->audio_par + 1 * !!flv->data_par; - if (pb->seekable) { + if (write_duration_filesize) { metadata_count += 2; // +2 for duration and file size } avio_wb32(pb, metadata_count); - if (pb->seekable) { + if (write_duration_filesize) { put_amf_string(pb, "duration"); flv->duration_offset = avio_tell(pb); // fill in the guessed duration, it'll be corrected later if incorrect @@ -378,7 +380,7 @@ static void write_metadata(AVFormatContext *s, unsigned int ts) metadata_count++; } - if (pb->seekable) { + if (write_duration_filesize) { put_amf_string(pb, "filesize"); flv->filesize_offset = avio_tell(pb); put_amf_double(pb, 0); // delayed write @@ -844,7 +846,7 @@ end: avio_seek(pb, flv->datasize_offset, SEEK_SET); put_amf_double(pb, flv->datasize); } - if (pb->seekable) { + if (!(flv->flags & FLV_NO_DURATION_FILESIZE)) { /* update information */ if (avio_seek(pb, flv->duration_offset, SEEK_SET) < 0) { av_log(s, AV_LOG_WARNING, "Failed to update header with correct duration.\n"); @@ -1061,6 +1063,7 @@ static const AVOption options[] = { { "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" }, { "no_metadata", "disable metadata for FLV", 0, AV_OPT_TYPE_CONST, {.i64 = FLV_NO_METADATA}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "flvflags" }, + { "no_duration_filesize", "disable duration and filesize zero value metadata for FLV", 0, AV_OPT_TYPE_CONST, {.i64 = FLV_NO_DURATION_FILESIZE}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "flvflags" }, { "add_keyframe_index", "Add keyframe index metadata", 0, AV_OPT_TYPE_CONST, {.i64 = FLV_ADD_KEYFRAME_INDEX}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "flvflags" }, { NULL }, };
mythtv have problem with non-seekable dont write duration and filesize and there have problem with some other server and player with 0 value duation and filesize. So add a flv flags to fix the ticket and make a choose for users. Signed-off-by: Steven Liu <lq@chinaffmpeg.org> --- doc/muxers.texi | 4 ++++ libavformat/flvenc.c | 11 +++++++---- 2 files changed, 11 insertions(+), 4 deletions(-)