[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