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

Anshul anshul.ffmpeg at gmail.com
Sat Aug 30 12:34:37 CEST 2014


On August 30, 2014 8:57:12 AM IST, Steven Liu <lingjiujianke at gmail.com> wrote:
>
>On Aug 28, 2014, at 4:52 AM, Anshul <anshul.ffmpeg at gmail.com> wrote:
>
>> 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
>> 
>> 
>Hi Anshul,
>
>	Because if want remove the old segment ts file, must use hls_wrap and
>hls_list_size, otherwise the hls_wrap can not remove the 
>	file which is not in the m3u8 list.
>
>	So this patch can do it by just one option.
>
>
>Steven
>_______________________________________________
>ffmpeg-devel mailing list
>ffmpeg-devel at ffmpeg.org
>http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

I use av_dict_set(&opts, "hls_wrap", "5", 0);
And it works for me without using list_size option directly, I set the parameter of hls_wrap what you intend for list_size.

-Anshul

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


More information about the ffmpeg-devel mailing list