diff mbox

[FFmpeg-devel] avformat/flvenc: fix ticket 5976 and use old commit

Message ID 20161124034936.16178-1-lq@chinaffmpeg.org
State Accepted
Commit ee24c8ad011272ffd1a6daaf3f0128ace8663c18
Headers show

Commit Message

Liu Steven Nov. 24, 2016, 3:49 a.m. UTC
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(-)

Comments

Steven Liu Nov. 26, 2016, 1:19 a.m. UTC | #1
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
>
Lou Logan Nov. 26, 2016, 1:39 a.m. UTC | #2
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.
Steven Liu Nov. 26, 2016, 3:36 a.m. UTC | #3
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 mbox

Patch

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 },
 };