[FFmpeg-devel] [PATCH] delete the old segment file from hls list

Anshul anshul.ffmpeg at gmail.com
Wed Aug 27 22:52:03 CEST 2014


On August 22, 2014 8:01:20 AM IST, Steven Liu <lingjiujianke at gmail.com> wrote:
>repost new patch:
>
>when update the hls m3u8 list, the old file is not unlinked
>this patch can do this operation
>delete the old ts segment which not show in m3u8,
>use hls_sync_list.
>
>Signed-off-by: Steven Liu <qi.liu at chinacache.com>
>---
> libavformat/hlsenc.c |   15 ++++++++++++++-
> 1 files changed, 14 insertions(+), 1 deletions(-)
>
>diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
>index 11f1e5b..fc1063e 100644
>--- a/libavformat/hlsenc.c
>+++ b/libavformat/hlsenc.c
>@@ -30,6 +30,10 @@
>
> #include "avformat.h"
> #include "internal.h"
>+#if HAVE_UNISTD_H
>+#include <unistd.h>
>+#endif
>+
>
> typedef struct HLSSegment {
>     char filename[1024];
>@@ -50,6 +54,7 @@ typedef struct HLSContext {
>     float time;            // Set by a private option.
>     int max_nb_segments;   // Set by a private option.
>     int  wrap;             // Set by a private option.
>+    int  sync_list;
>
>     int64_t recording_time;
>     int has_video;
>@@ -96,6 +101,7 @@ static int hls_mux_init(AVFormatContext *s)
> static int hls_append_segment(HLSContext *hls, double duration)
> {
>     HLSSegment *en = av_malloc(sizeof(*en));
>+    int ret = 0;
>
>     if (!en)
>         return AVERROR(ENOMEM);
>@@ -115,7 +121,13 @@ static int hls_append_segment(HLSContext *hls,
>double
>duration)
> if (hls->max_nb_segments && hls->nb_entries >= hls->max_nb_segments) {
>         en = hls->segments;
>         hls->segments = en->next;
>-        av_free(en);
>+        if (hls->sync_list) {
>+            ret = unlink(en->filename);
>+            if (ret < 0) {
>+                av_log(hls->avf, AV_LOG_WARNING, "remove %s failed\n",
>en->filename);
>+            }
>+        }
>+        av_free(en);
>     } else
>         hls->nb_entries++;
>
>@@ -340,6 +352,7 @@ static const AVOption options[] = {
>     {"hls_list_size", "set maximum number of playlist entries",
>OFFSET(max_nb_segments),    AV_OPT_TYPE_INT,    {.i64 = 5},     0,
>INT_MAX,
>E},
>     {"hls_wrap",      "set number after which the index wraps",
>OFFSET(wrap),    AV_OPT_TYPE_INT,    {.i64 = 0},     0, INT_MAX, E},
>     {"hls_base_url",  "url to prepend to each playlist entry",
>OFFSET(baseurl), AV_OPT_TYPE_STRING, {.str = NULL},  0, 0,       E},
>+    {"hls_sync_list", "remove old ts segment for sync the file with
>the
>m3u8 list",  OFFSET(sync_list),    AV_OPT_TYPE_INT,    {.i64 = 0},    
>0,
>INT_MAX, E},
>     { NULL },
> };
>
>--
>1.7.1
>
>
>
>2014-08-21 16:51 GMT+08:00 Steven Liu <lingjiujianke at gmail.com>:
>
>> Hi Stefano,
>> if unistd is not available under Linux,
>> it will output error message when compile the source code.
>>
>>       [root at testrtmp ffmpeg]# make
>> CC      libavformat/hlsenc.o
>> libavformat/hlsenc.c: In function ‘hls_append_segment’:
>> libavformat/hlsenc.c:125: error: implicit declaration of function
>‘unlink’
>> make: *** [libavformat/hlsenc.o] Error 1
>> [root at testrtmp ffmpeg]#
>>
>>
>>
>> the follow is the new patch:
>>
>> diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
>> index 11f1e5b..fc1063e 100644
>>
>> --- a/libavformat/hlsenc.c
>> +++ b/libavformat/hlsenc.c
>> @@ -30,6 +30,10 @@
>>
>>  #include "avformat.h"
>>  #include "internal.h"
>> +#if HAVE_UNISTD_H
>> +#include <unistd.h>
>> +#endif
>> +
>>
>>  typedef struct HLSSegment {
>>      char filename[1024];
>> @@ -50,6 +54,7 @@ typedef struct HLSContext {
>>      float time;            // Set by a private option.
>>      int max_nb_segments;   // Set by a private option.
>>      int  wrap;             // Set by a private option.
>> +    int  sync_list;        // Set by a private option.
>>
>>      int64_t recording_time;
>>      int has_video;
>> @@ -96,6 +101,7 @@ static int hls_mux_init(AVFormatContext *s)
>>
>>  static int hls_append_segment(HLSContext *hls, double duration)
>>  {
>>      HLSSegment *en = av_malloc(sizeof(*en));
>> +       int ret = 0;
>>
>>      if (!en)
>>          return AVERROR(ENOMEM);
>> @@ -115,7 +121,13 @@ static int hls_append_segment(HLSContext *hls,
>double
>> duration)
>>
>>      if (hls->max_nb_segments && hls->nb_entries >=
>hls->max_nb_segments) {
>>          en = hls->segments;
>>          hls->segments = en->next;
>> -        av_free(en);
>> +        if (hls->sync_list) {
>> +            ret = unlink(en->filename);
>> +            if (ret < 0) {
>> +                av_log(hls->avf, AV_LOG_WARNING, "remove %s
>failed\n",
>> en->filename);
>> +            }
>> +        }
>> +           av_free(en);
>>      } else
>>          hls->nb_entries++;
>>
>> @@ -340,6 +352,7 @@ static const AVOption options[] = {
>>      {"hls_list_size", "set maximum number of playlist entries",
>> OFFSET(max_nb_segments),    AV_OPT_TYPE_INT,    {.i64 = 5},     0,
>INT_MAX,
>> E},
>>      {"hls_wrap",      "set number after which the index wraps",
>> OFFSET(wrap),    AV_OPT_TYPE_INT,    {.i64 = 0},     0, INT_MAX, E},
>>      {"hls_base_url",  "url to prepend to each playlist entry",
>> OFFSET(baseurl), AV_OPT_TYPE_STRING, {.str = NULL},  0, 0,       E},
>> +    {"hls_sync_list", "remove old ts segment for sync the file with
>the
>> m3u8 list",  OFFSET(sync_list),    AV_OPT_TYPE_INT,    {.i64 = 0},   
> 0,
>> INT_MAX, E},
>>      { NULL },
>>  };
>>
>> If you want sync the file with the m3u8 list, please use the
>hls_sync_list
>> parameter, default it is 0, and !0 is enable the sync operation.
>>
>> Thanks,
>>
>>
>>
>> 2014-08-14 18:25 GMT+08:00 Stefano Sabatini <stefasab at gmail.com>:
>>
>> On date Monday 2014-08-11 17:39:37 +0800, Steven Liu encoded:
>>> > Hi Guys,
>>> >
>>> >      The FFmpeg hls module can make m3u8 and ts, but it dosen't
>delete
>>> the
>>> > old ts segment file.
>>> >       If always run this module, the disk will full, so this patch
>can
>>> fix
>>> > the problem.
>>> >       When update the segment list m3u8 file, it will delete the
>ts
>>> segment
>>> > out range from the list file.
>>> >
>>> >      before use this patch:
>>> > [root at localhost ffmpeg]# ls *.ts *.m3u8
>>> > a0.ts  a10.ts  a11.ts  a12.ts  a13.ts  a14.ts  a15.ts  a16.ts 
>a17.ts
>>> > a18.ts  a19.ts  a1.ts  a20.ts  a2.ts  a3.ts  a4.ts  a5.ts  a6.ts 
>a7.ts
>>> > a8.ts  a9.ts  a.m3u8
>>> > [root at localhost ffmpeg]# cat a.m3u8
>>> > #EXTM3U
>>> > #EXT-X-VERSION:3
>>> > #EXT-X-TARGETDURATION:11
>>> > #EXT-X-MEDIA-SEQUENCE:16
>>> > #EXTINF:10.427075,
>>> > a16.ts
>>> > #EXTINF:10.427075,
>>> > a17.ts
>>> > #EXTINF:10.427075,
>>> > a18.ts
>>> > #EXTINF:10.427075,
>>> > a19.ts
>>> > #EXTINF:3.670330,
>>> > a20.ts
>>> > #EXT-X-ENDLIST
>>> > [root at localhost ffmpeg]#
>>> >
>>> > after use this patch:
>>> > [root at localhost ffmpeg]# ls *.ts *.m3u8
>>> > a10.ts  a11.ts  a12.ts  a13.ts  a9.ts  a.m3u8
>>> > [root at localhost ffmpeg]# cat a.m3u8
>>> > #EXTM3U
>>> > #EXT-X-VERSION:3
>>> > #EXT-X-TARGETDURATION:11
>>> > #EXT-X-MEDIA-SEQUENCE:9
>>> > #EXTINF:10.427075,
>>> > a9.ts
>>> > #EXTINF:10.427075,
>>> > a10.ts
>>> > #EXTINF:10.427075,
>>> > a11.ts
>>> > #EXTINF:10.427075,
>>> > a12.ts
>>> > #EXTINF:2.335665,
>>> > a13.ts
>>> > #EXT-X-ENDLIST
>>> > [root at localhost ffmpeg]#
>>> >
>>> > -------------------------------------------
>>> > The patch context:
>>> >
>>> > when update the hls m3u8 list, the old file is not unlinked
>>> > this patch can do this operation
>>> >
>>> > Signed-off-by: Steven Liu <qi.liu at chinacache.com>
>>> > ---
>>> >  libavformat/hlsenc.c |    5 +++++
>>> >  1 files changed, 5 insertions(+), 0 deletions(-)
>>> >
>>> > diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
>>> > index 11f1e5b..2ee0970 100644
>>> > --- a/libavformat/hlsenc.c
>>> > +++ b/libavformat/hlsenc.c
>>> > @@ -30,6 +30,10 @@
>>> >
>>> >  #include "avformat.h"
>>> >  #include "internal.h"
>>> > +#if HAVE_UNISTD_H
>>> > +#include <unistd.h>
>>> > +#endif
>>> > +
>>> >
>>> >  typedef struct HLSSegment {
>>> >      char filename[1024];
>>> > @@ -115,6 +119,7 @@ static int hls_append_segment(HLSContext *hls,
>>> double
>>> > duration)
>>> >      if (hls->max_nb_segments && hls->nb_entries >=
>>> hls->max_nb_segments) {
>>> >          en = hls->segments;
>>> >          hls->segments = en->next;
>>> > +        unlink(en->filename);
>>>
>>> Check for the return value, and log an explicit error message in
>case
>>> of failure.
>>>
>>> >          av_free(en);
>>> >      } else
>>> >          hls->nb_entries++;
>>>
>>> Also, in order not to alter the standard behavior, I think it might
>be
>>> safer to add an option to enable this behavior. Also, what happens
>if
>>> unistd.h is not available?
>>> --
>>> FFmpeg = Frightening and Forgiving Monstrous Proud Elastic Gadget
>>> _______________________________________________
>>> ffmpeg-devel mailing list
>>> ffmpeg-devel at ffmpeg.org
>>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>>
>>
>>
>_______________________________________________
>ffmpeg-devel mailing list
>ffmpeg-devel at ffmpeg.org
>http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Why not use hls_wrap option, which gives you the same behavior.

I achive same thing using hls_wrap.

-Anshul

-- 
Sent from my Android device with K-9 Mail. Please excuse my brevity.


More information about the ffmpeg-devel mailing list