On Aug 28, 2014, at 4:52 AM, Anshul <anshul.ffm...@gmail.com> wrote:
> On August 22, 2014 8:01:20 AM IST, Steven Liu <lingjiujia...@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....@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 <lingjiujia...@gmail.com>: >> >>> Hi Stefano, >>> if unistd is not available under Linux, >>> it will output error message when compile the source code. >>> >>> [root@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@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 <stefa...@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@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@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@localhost ffmpeg]# >>>>> >>>>> after use this patch: >>>>> [root@localhost ffmpeg]# ls *.ts *.m3u8 >>>>> a10.ts a11.ts a12.ts a13.ts a9.ts a.m3u8 >>>>> [root@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@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....@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@ffmpeg.org >>>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel >>>> >>> >>> >> _______________________________________________ >> ffmpeg-devel mailing list >> ffmpeg-devel@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@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel