[FFmpeg-devel] [PATCH] avformat/flvenc: fix ticket 5976 and use old commit
Steven Liu
lingjiujianke at gmail.com
Sat Nov 26 03:19:42 EET 2016
2016-11-24 11:49 GMT+08:00 Steven Liu <lq at 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 at 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.
>
> + at 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 at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
More information about the ffmpeg-devel
mailing list