> On Aug 10, 2018, at 6:31 AM, Ronak Patel <ronak2121-at-yahoo....@ffmpeg.org> > wrote: > >> >> On Aug 8, 2018, at 5:37 PM, Ronak <ronak2121-at-yahoo....@ffmpeg.org> wrote: >> >> >> >>> On Aug 8, 2018, at 3:52 PM, Ronak <ronak2121-at-yahoo....@ffmpeg.org> wrote: >>> >>> >>> >>>> On Aug 6, 2018, at 10:20 AM, Steven Liu <l...@chinaffmpeg.org> wrote: >>>> >>>> >>>> >>>>>> On Aug 6, 2018, at 19:29, Ronak Patel >>>>>> <ronak2121-at-yahoo....@ffmpeg.org> wrote: >>>>>> >>>>>> >>>>>> On Aug 6, 2018, at 7:19 AM, Liu Steven <l...@chinaffmpeg.org> wrote: >>>>>> >>>>>> >>>>>> >>>>>>>> 在 2018年8月6日,下午7:12,Ronak Patel <ronak2121-at-yahoo....@ffmpeg.org> 写道: >>>>>>>> >>>>>>>> >>>>>>>> On Aug 5, 2018, at 10:54 PM, Liu Steven <l...@chinaffmpeg.org> wrote: >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>>> 在 2018年8月4日,上午2:17,Ronak <ronak2...@yahoo.com> 写道: >>>>>>>>> >>>>>>>>>>>>>>> I have read this patch some problem for this patch. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> 1. maybe there will have a problem when duration is not same >>>>>>>>>>>>>>> when every fragment, for example: >>>>>>>>>>>>>>> liuqideMacBook-Pro:xxx liuqi$ ./ffmpeg -v quiet -i >>>>>>>>>>>>>>> ~/Movies/Test/bbb_sunflower_1080p_30fps_normal.mp4 -c copy -f >>>>>>>>>>>>>>> hls -hls_list_size 0 output_test.m3u8 >>>>>>>>>>>>>>> liuqideMacBook-Pro:xxx liuqi$ head -n 10 output_test.m3u8 >>>>>>>>>>>>>>> #EXTM3U >>>>>>>>>>>>>>> #EXT-X-VERSION:3 >>>>>>>>>>>>>>> #EXT-X-TARGETDURATION:8 >>>>>>>>>>>>>>> #EXT-X-MEDIA-SEQUENCE:0 >>>>>>>>>>>>>>> #EXTINF:3.866667, >>>>>>>>>>>>>>> output_test0.ts >>>>>>>>>>>>>>> #EXTINF:7.300000, >>>>>>>>>>>>>>> output_test1.ts >>>>>>>>>>>>>>> #EXTINF:8.333333, >>>>>>>>>>>>>>> output_test2.ts >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> the output_test0.ts’s duration is short than output_test1.ts, >>>>>>>>>>>>>>> the #EXT-X-TARGETDURATION need update to the longest duration. >>>>>>>>>>>>>>> this operation (check the longest duration) will happen at >>>>>>>>>>>>>>> every fragment write complete. >>>>>>>>>>>>>>> it will not update when move the update option to the >>>>>>>>>>>>>>> hls_write_header, >>>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> This is a problem in the code that splits the mpegts files. I've >>>>>>>>>>>>>> filed a separate issue for this here: >>>>>>>>>>>>>> https://trac.ffmpeg.org/ticket/7341. Mpegts segmentation should >>>>>>>>>>>>>> be following the hls_time parameter (or the default length). >>>>>>>>>>>>> This is whatever hls_time, is decide by keyframe position, this >>>>>>>>>>>>> is happen when GOP size is not a permanent t position. >>>>>>>>>>>>> >>>>>>>>>> >>>>>>>>>>>>>> This is happening now with fMP4 assets, but not with mpegts. >>>>>>>>>>>>> Whatever fmp4 or mpegts, all of them need fix the problem of >>>>>>>>>>>>> duration refresh. >>>>>>>>>>>>> >>>>>>>>>>>>> for example: >>>>>>>>>>>>> >>>>>>>>>>>>> liuqideMacBook-Pro:xxx liuqi$ ./ffmpeg -ss -v quiet -i >>>>>>>>>>>>> ~/Movies/Test/bbb_sunflower_1080p_30fps_normal.mp4 -c copy -f hls >>>>>>>>>>>>> -hls_list_size 0 -hls_segment_type fmp4 -hls_time 3 >>>>>>>>>>>>> output_test.m3u8 >>>>>>>>>>>>> liuqideMacBook-Pro:xxx liuqi$ head -n 10 output_test.m3u8 >>>>>>>>>>>>> #EXTM3U >>>>>>>>>>>>> #EXT-X-VERSION:7 >>>>>>>>>>>>> #EXT-X-TARGETDURATION:8 >>>>>>>>>>>>> #EXT-X-MEDIA-SEQUENCE:0 >>>>>>>>>>>>> #EXT-X-MAP:URI="init.mp4" >>>>>>>>>>>>> #EXTINF:3.866667, >>>>>>>>>>>>> output_test0.m4s >>>>>>>>>>>>> #EXTINF:7.300000, >>>>>>>>>>>>> output_test1.m4s >>>>>>>>>>>>> #EXTINF:8.333333, >>>>>>>>>>>>> liuqideMacBook-Pro:xxx liuqi$ >>>>>>>>>>>> >>>>>>>>>>>> This is after your patch: >>>>>>>>>>>> liuqideMacBook-Pro:xxx liuqi$ ./ffmpeg -ss 17 -v quiet -i >>>>>>>>>>>> ~/Movies/Test/bbb_sunflower_1080p_30fps_normal.mp4 -c copy -f hls >>>>>>>>>>>> -hls_list_size 0 -hls_segment_type fmp4 -hls_time 3 >>>>>>>>>>>> output_test.m3u8 >>>>>>>>>>>> liuqideMacBook-Pro:xxx liuqi$ head -n 10 output_test.m3u8 >>>>>>>>>>>> #EXTM3U >>>>>>>>>>>> #EXT-X-VERSION:7 >>>>>>>>>>>> #EXT-X-TARGETDURATION:3 >>>>>>>>>>>> #EXT-X-MEDIA-SEQUENCE:0 >>>>>>>>>>>> #EXT-X-MAP:URI="init.mp4" >>>>>>>>>>>> #EXTINF:3.866667, >>>>>>>>>>>> output_test0.m4s >>>>>>>>>>>> #EXTINF:7.300000, >>>>>>>>>>>> output_test1.m4s >>>>>>>>>>>> #EXTINF:8.333333, >>>>>>>>>>>> >>>>>>>>>>>> The RFC https://www.rfc-editor.org/rfc/rfc8216.txt describe: >>>>>>>>>>>> >>>>>>>>>>>> 4.3.3.1. EXT-X-TARGETDURATION >>>>>>>>>>>> >>>>>>>>>>>> The EXT-X-TARGETDURATION tag specifies the maximum Media Segment >>>>>>>>>>>> duration. The EXTINF duration of each Media Segment in the >>>>>>>>>>>> Playlist >>>>>>>>>>>> file, when rounded to the nearest integer, MUST be less than or >>>>>>>>>>>> equal >>>>>>>>>>>> to the target duration; longer segments can trigger playback stalls >>>>>>>>>>>> or other errors. It applies to the entire Playlist file. Its >>>>>>>>>>>> format >>>>>>>>>>>> is: >>>>>>>>>>>> >>>>>>>>>>>> #EXT-X-TARGETDURATION:<s> >>>>>>>>>>>> >>>>>>>>>>>> where s is a decimal-integer indicating the target duration in >>>>>>>>>>>> seconds. The EXT-X-TARGETDURATION tag is REQUIRED. >>>>>>>>>>>> >>>>>>>>>>>> your patch make the EXT-X-TARGETDURATION less than EXTINF:7.300000 >>>>>>>>>>>> EXTINF:8.333333 >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>>>>>> 2. the version maybe will update when use hls_segment_type or >>>>>>>>>>>>>>> append_list etc. when the operation is support from different >>>>>>>>>>>>>>> version m3u8. >>>>>>>>>>>>>> >>>>>>>>>>>>>> I don't follow what you mean here. The version number is known >>>>>>>>>>>>>> up front, based on the options that were passed in. It should be >>>>>>>>>>>>>> illegal to switch between versions when trying to update an >>>>>>>>>>>>>> existing manifest. When can this legitimately happen? >>>>>>>>>>>>> there maybe have some player cannot support high version of m3u8, >>>>>>>>>>>>> for example old parser or player just support the VERSION 3, >>>>>>>>>>>>> this must think about all of the player or parser, because ffmpeg >>>>>>>>>>>>> is not used only by myself. >>>>>>>>>>>>> >>>>>>>>>>>>> Or what about get the #EXT-X-VERSION position, to update it? >>>>>>>>>>>>> looks like flvenc.c or movenc.c date shift >>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>>> 3. need update segments vs->segments when hls_list_size option >>>>>>>>>>>>>>> is set. >>>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> What do you mean by this and where should I do it? >>>>>>>>>>>>> for example, hls_list_size is 4, the m3u8 list should refresh >>>>>>>>>>>>> every time when make a new fragment. >>>>>>>>>>>>> >>>>>>>>>>>>> first time: >>>>>>>>>>>>> 1.m4s >>>>>>>>>>>>> 2.m4s >>>>>>>>>>>>> 3.m4s >>>>>>>>>>>>> 4.m4s >>>>>>>>>>>>> >>>>>>>>>>>>> sencond time: >>>>>>>>>>>>> 2.m4s >>>>>>>>>>>>> 3.m4s >>>>>>>>>>>>> 4.m4s >>>>>>>>>>>>> 5.m4s >>>>>>>>>>>> >>>>>>>>>>>> after your patch: >>>>>>>>>>>> >>>>>>>>>>>> liuqideMacBook-Pro:xxx liuqi$ ./ffmpeg -v quiet -i >>>>>>>>>>>> ~/Movies/Test/bbb_sunflower_1080p_30fps_normal.mp4 -c copy -f hls >>>>>>>>>>>> -hls_list_size 4 -hls_segment_type fmp4 -hls_time 3 -t 50 >>>>>>>>>>>> output_test.m3u8 >>>>>>>>>>>> liuqideMacBook-Pro:xxx liuqi$ cat output_test.m3u8 >>>>>>>>>>>> #EXTM3U >>>>>>>>>>>> #EXT-X-VERSION:7 >>>>>>>>>>>> #EXT-X-TARGETDURATION:3 >>>>>>>>>>>> #EXT-X-MEDIA-SEQUENCE:0 >>>>>>>>>>>> #EXT-X-MAP:URI="init.mp4" >>>>>>>>>>>> #EXTINF:3.866667, >>>>>>>>>>>> output_test0.m4s >>>>>>>>>>>> #EXTINF:7.300000, >>>>>>>>>>>> output_test1.m4s >>>>>>>>>>>> #EXTINF:8.333333, >>>>>>>>>>>> output_test2.m4s >>>>>>>>>>>> #EXTINF:3.966667, >>>>>>>>>>>> output_test3.m4s >>>>>>>>>>>> #EXTINF:8.333333, >>>>>>>>>>>> output_test4.m4s >>>>>>>>>>>> #EXTINF:4.033333, >>>>>>>>>>>> output_test5.m4s >>>>>>>>>>>> #EXTINF:8.333333, >>>>>>>>>>>> output_test6.m4s >>>>>>>>>>>> #EXTINF:4.633333, >>>>>>>>>>>> output_test7.m4s >>>>>>>>>>>> liuqideMacBook-Pro:xxx liuqi$ >>>>>>>>>>>> liuqideMacBook-Pro:xxx liuqi$ >>>>>>>>>>>> >>>>>>>>>>>> the m3u8 list is incorrect, because users want control the m3u8 >>>>>>>>>>>> list length, because their disk do not have enough space to save >>>>>>>>>>>> the fragments. >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> Ok I will fix this. >>>>>>>>> >>>>>>>>> >>>>>>>>> I'm attaching a new patch that resolves all of these issues, while >>>>>>>>> still resolving this bug for VOD playlists. >>>>>>>>> >>>>>>>>> Can you please review? >>>>>>>>> >>>>>>>>> >>>>>>>>> <0001-libavformat-hlsenc-Fix-HLS-Manifest-Generation-from-.patch> >>>>>>>> >>>>>>>> From bbc4870c0d685f5c07e82042c3f2ef153d83f3d1 Mon Sep 17 00:00:00 2001 >>>>>>>> From: "Ronak Patel (Audible)" <ron...@audible.com> >>>>>>>> Date: Thu, 2 Aug 2018 09:25:12 -0400 >>>>>>>> Subject: [PATCH] libavformat/hlsenc: Fix HLS Manifest Generation from >>>>>>>> an N^2 >>>>>>>> algorithm to N. >>>>>>>> >>>>>>>> This fixes the creation of the hls manifest in hlsenc.c by writing the >>>>>>>> entire manifest at the end for VOD playlists. Live & Event Playlists >>>>>>>> are unaffected. >>>>>>>> This also fixes the behavior with HLS_TEMP_FILE to work correctly when >>>>>>>> -hlsflags temp_file is specified, instead of always relying on >>>>>>>> use_rename, which caused these problems. >>>>>>>> >>>>>>>> Files that would previously take over a week to fragment now take 1 >>>>>>>> minute on the same hardware. This was a 153 hour audio file (2.2GB of >>>>>>>> audio). >>>>>>>> >>>>>>>> Signed-off-by: Ronak Patel <ronak2...@yahoo.com> >>>>>>>> --- >>>>>>>> libavformat/dashenc.c | 2 +- >>>>>>>> libavformat/hlsenc.c | 54 >>>>>>>> +++++++++++++++++++++++++++++++++------------------ >>>>>>>> 2 files changed, 36 insertions(+), 20 deletions(-) >>>>>>>> >>>>>>>> diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c >>>>>>>> >>>>>>>> -------you have modify dash >>>>>>> >>>>>>> Sorry I will submit this separately. Will remove. >>>>>>> >>>>>>>> index ae57fd5..ae22c08 100644 >>>>>>>> --- a/libavformat/dashenc.c >>>>>>>> +++ b/libavformat/dashenc.c >>>>>>>> @@ -483,7 +483,7 @@ static void output_segment_list(OutputStream *os, >>>>>>>> AVIOContext *out, AVFormatCont >>>>>>>> target_duration = lrint(duration); >>>>>>>> } >>>>>>>> >>>>>>>> - ff_hls_write_playlist_header(c->m3u8_out, 6, -1, >>>>>>>> target_duration, >>>>>>>> + ff_hls_write_playlist_header(c->m3u8_out, 7, -1, >>>>>>>> target_duration, >>>>>>>> start_number, PLAYLIST_TYPE_NONE); >>>>>>>> >>>>>>>> ff_hls_write_init_file(c->m3u8_out, os->initfile, c->single_file, >>>>>>>> diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c >>>>>>>> index b5644f0..0eb0801 100644 >>>>>>>> --- a/libavformat/hlsenc.c >>>>>>>> +++ b/libavformat/hlsenc.c >>>>>>>> @@ -942,6 +942,7 @@ static int >>>>>>>> sls_flag_use_localtime_filename(AVFormatContext *oc, HLSContext *c, V >>>>>>>> if (c->flags & (HLS_SECOND_LEVEL_SEGMENT_SIZE | >>>>>>>> HLS_SECOND_LEVEL_SEGMENT_DURATION)) { >>>>>>>> av_strlcpy(vs->current_segment_final_filename_fmt, oc->url, >>>>>>>> sizeof(vs->current_segment_final_filename_fmt)); >>>>>>>> + >>>>>>>> ——you add a empty line >>>>>>> Ok will remove >>>>>>> >>>>>>>> if (c->flags & HLS_SECOND_LEVEL_SEGMENT_SIZE) { >>>>>>>> char *filename = NULL; >>>>>>>> if (replace_int_data_in_filename(&filename, oc->url, 's', 0) < 1) >>>>>>>> { >>>>>>>> @@ -1166,9 +1167,10 @@ static int hls_rename_temp_file(AVFormatContext >>>>>>>> *s, AVFormatContext *oc) >>>>>>>> >>>>>>>> if (!final_filename) >>>>>>>> return AVERROR(ENOMEM); >>>>>>>> + >>>>>>>> ——you add a empty line >>>>>>> Ok will remove >>>>>>>> >>>>>>>> final_filename[len-4] = '\0'; >>>>>>>> + >>>>>>>> >>>>>>>> ——you add a empty line >>>>>>> Ok will remove >>>>>>>> ret = ff_rename(oc->url, final_filename, s); >>>>>>>> - oc->url[len-4] = '\0’; >>>>>>>> ——Why do you give the len - 4 = 0? >>>>>>> This code was already there. All I’m doing is removing this part that >>>>>>> was causing a problem when you use the HLS_TEMP option. >>>>>>> >>>>>>>> av_freep(&final_filename); >>>>>>>> return ret; >>>>>>>> } >>>>>>>> @@ -1373,9 +1375,7 @@ static int hls_window(AVFormatContext *s, int >>>>>>>> last, VariantStream *vs) >>>>>>>> int ret = 0; >>>>>>>> char temp_filename[1024]; >>>>>>>> int64_t sequence = FFMAX(hls->start_sequence, vs->sequence - >>>>>>>> vs->nb_entries); >>>>>>>> - const char *proto = avio_find_protocol_name(s->url); >>>>>>>> - int use_rename = proto && !strcmp(proto, "file"); >>>>>>>> - static unsigned warned_non_file; >>>>>>>> + int use_temp_file = (s->flags & HLS_TEMP_FILE); >>>>>>>> ——What will have if use http put method? >>>>>>> >>>>>>> I’ll test it. >>>>>>> >>>>>>>> char *key_uri = NULL; >>>>>>>> char *iv_string = NULL; >>>>>>>> AVDictionary *options = NULL; >>>>>>>> @@ -1397,11 +1397,9 @@ static int hls_window(AVFormatContext *s, int >>>>>>>> last, VariantStream *vs) >>>>>>>> hls->version = 7; >>>>>>>> } >>>>>>>> >>>>>>>> - if (!use_rename && !warned_non_file++) >>>>>>>> - av_log(s, AV_LOG_ERROR, "Cannot use rename on non file >>>>>>>> protocol, this may lead to races and temporary partial files\n"); >>>>>>>> - >>>>>>>> ——I have see this message long time, i have not remove this message >>>>>>>> because this is used to http method. Why do you remove it? >>>>>>> >>>>>>> I can keep it for http put and HLS_TEMP if that’s what you want. >>>>>>> >>>>>>>> >>>>>>>> set_http_options(s, &options, hls); >>>>>>>> - snprintf(temp_filename, sizeof(temp_filename), use_rename ? >>>>>>>> "%s.tmp" : "%s", vs->m3u8_name); >>>>>>>> + snprintf(temp_filename, sizeof(temp_filename), use_temp_file ? >>>>>>>> "%s.tmp" : "%s", vs->m3u8_name); >>>>>>>> + //av_log(s, AV_LOG_INFO, "We're going to write out to %s", >>>>>>>> temp_filename); >>>>>>>> ------this info message is unused? >>>>>>> >>>>>>> Ok will remove. >>>>>>> >>>>>>>> if ((ret = hlsenc_io_open(s, has->m3u8_out, temp_filename, &options)) >>>>>>>> < 0) >>>>>>>> goto fail; >>>>>>>> >>>>>>>> @@ -1472,8 +1470,9 @@ fail: >>>>>>>> av_dict_free(&options); >>>>>>>> hlsenc_io_close(s, &hls->m3u8_out, temp_filename); >>>>>>>> hlsenc_io_close(s, &hls->sub_m3u8_out, vs->vtt_m3u8_name); >>>>>>>> - if (ret >= 0 && use_rename) >>>>>>>> - ff_rename(temp_filename, vs->m3u8_name, s); >>>>>>>> + if (use_temp_file) { >>>>>>>> + ff_rename(temp_filename, vs->m3u8_name, s); >>>>>>>> + } >>>>>>>> >>>>>>>> if (ret >= 0 && hls->master_pl_name) >>>>>>>> if (create_master_playlist(s, vs) < 0) >>>>>>>> @@ -2253,11 +2252,14 @@ static int hls_write_packet(AVFormatContext >>>>>>>> *s, AVPacket *pkt) >>>>>>>> hlsenc_io_close(s, &vs->vtt_avf->pb, vs->vtt_avf->url); >>>>>>>> } >>>>>>>> } >>>>>>>> + >>>>>>>> + // look to rename the asset name >>>>>>>> if ((hls->flags & HLS_TEMP_FILE) && oc->url[0]) { >>>>>>>> - if (!(hls->flags & HLS_SINGLE_FILE) || (hls->max_seg_size >>>>>>>> <= 0)) >>>>>>>> - if ((vs->avf->oformat->priv_class && >>>>>>>> vs->avf->priv_data) && hls->segment_type != SEGMENT_TYPE_FMP4) >>>>>>>> - av_opt_set(vs->avf->priv_data, "mpegts_flags", >>>>>>>> "resend_headers", 0); >>>>>>>> - hls_rename_temp_file(s, oc); >>>>>>>> + if (!(hls->flags & HLS_SINGLE_FILE) || (hls->max_seg_size >>>>>>>> <= 0)) { >>>>>>>> + if ((vs->avf->oformat->priv_class && >>>>>>>> vs->avf->priv_data) && hls->segment_type != SEGMENT_TYPE_FMP4) { >>>>>>>> + av_opt_set(vs->avf->priv_data, "mpegts_flags", >>>>>>>> "resend_headers", 0); >>>>>>>> + } >>>>>>>> + } >>>>>>>> ——Just reindent? >>>>>>> >>>>>>> Yes I put the code properly under braces. But if you don’t like it, I >>>>>>> can remove. >>>>>>> >>>>>>>> } >>>>>>>> >>>>>>>> if (vs->fmp4_init_mode) { >>>>>>>> @@ -2286,6 +2288,17 @@ static int hls_write_packet(AVFormatContext *s, >>>>>>>> AVPacket *pkt) >>>>>>>> return ret; >>>>>>>> } >>>>>>>> ff_format_io_close(s, &vs->out); >>>>>>>> + >>>>>>>> + // rename that segment from .tmp to the real one >>>>>>>> + if ((hls->flags & HLS_TEMP_FILE) && oc->url[0]) { >>>>>>>> + hls_rename_temp_file(s, oc); >>>>>>>> + av_free(old_filename); >>>>>>>> + old_filename = av_strdup(vs->avf->url); >>>>>>>> + >>>>>>>> + if (!old_filename) { >>>>>>>> + return AVERROR(ENOMEM); >>>>>>>> + } >>>>>>>> + } >>>>>>>> } >>>>>>>> } >>>>>>>> >>>>>>>> @@ -2334,14 +2347,16 @@ static int hls_write_packet(AVFormatContext >>>>>>>> *s, AVPacket *pkt) >>>>>>>> return ret; >>>>>>>> } >>>>>>>> >>>>>>>> - if (!vs->fmp4_init_mode || byterange_mode) >>>>>>>> + // if we're building a VOD playlist, skip writing the >>>>>>>> manifest multiple times, and just wait until the end >>>>>>>> + if (hls->pl_type != PLAYLIST_TYPE_VOD) { >>>>>>>> ------Whatever event VOD or Live Streaming, the EXT-X-TARGETDURATION >>>>>>>> need refresh when lrint(current fragment duration) is large than >>>>>>>> lrint(the before duration). >>>>>>> >>>>>>> You do not need to do this for VOD. This is the main reason why ffmpeg >>>>>>> takes over 7 days to fragment a 153 hour VOD audio file. Other tools >>>>>>> can do it in less than 5 minutes. Why would you write the same VOD >>>>>>> playlist over 155000 times on disk when the input is never changing. >>>>>>> >>>>>>> VOD does not ever change once it is written so it makes sense to wait >>>>>>> until the very end to write out the entire manifest. There’s no >>>>>>> refreshing required. Only live or event playlists need any sort of >>>>>>> refresh. Ffmpeg is written predominantly for the event or live use case >>>>>>> I’ve noticed, which has forced you to make poor decisions for VOD. >>>>>>> >>>>>>> If I could I would rewrite all of this logic to clearly separate VOD >>>>>>> from event and live playlist generation logic to make the code clearer. >>>>>>> This is hard to understand code in general. >>>>>> >>>>>> Maybe you want record the fragments to a VOD Service, or time shift for >>>>>> the history stream. Do i guess right or wrong? >>>>>>> >>>>> >>>>> If that’s what you want, you would wait until the very end anyway. Why >>>>> would you upload a partial manifest file? >>>>> >>>>> For VOD, you don’t do anything until you get the whole manifest. If you >>>>> wanted a partial one, that’s an event, and you can pass that option to >>>>> get the refreshing behavior. >>>>> >>>>> Even with event, this algorithm of writing out the entire manifest just >>>>> to add a new segment is very wasteful, slow and unnecessary. This is an >>>>> O(N!) algorithm for something you can solve in O(N) time. You can just >>>>> append and adjust the EXT-X-TARGETDURATION for your video content. >>>> Yes, I agreed with you and cannot agreed more. O(N!), but is the list is >>>> too short, that is not a problem. But, why do you create a list long time >>>> to 7 days? The hls_list_size default is 5 fragments, and the hls live >>>> streaming (No Endlist) is play from last 3 fragment, i can not understand >>>> what do you want. let me make sure, do you want record long list? or maybe >>>> you want make some files to use disk? >>>> >>> >>> Hi Steven, >>> >>> Sorry it's taken me some time to get back to you. I was busy with other >>> things. So to clarify my exact situation and why this is a problem for me. >>> We have really long audio files that we stream over HLS & DASH. We always >>> stream in VOD mode. We DO NOT do any EVENT or LIVE streaming. Our audio >>> files are generally at least 10 hours long, but can be as long as 153 hours >>> long. >>> >>> So, in the trunk version of ffmpeg, if you try to run this command: >>> >>> ffmpeg -i output_22_32.aac -codec copy -hls_time 0.975238095238095 >>> -hls_segment_type fmp4 -hls_flags single_file -hls_playlist_type vod >>> output_22_32_1sec_ts.m3u8 >>> >>> The O(N!) algorithm that ffmpeg uses takes 7 days for this command to >>> finish executing. This is unacceptable for us, we need to be able to >>> prepare our content in seconds or minutes, not days or weeks. >>> >>> My patch is looking to resolve the crux of this issue which are: >>> >>> 1. The unnecessary creation/deletion of a temp file when I didn't even ask >>> for one (HLS_TEMP option wasn't specified). >>> 2. The unnecessary regeneration of the entire manifest when we are just >>> appending a new segment. >>> >>> I hope this context helps you understand the problem. >>> >>> I'll submit a new patch with your comments resolved shortly. >>> >>> Ronak >>> >> >> Hi Steven, >> >> Please see my new patch taking your feedback into account. >> >> Ronak > > Hi Steven, > > Did you have a chance to review? I’m going to send you a new patch for > dashenc.c shortly. > > For dashenc.c, ffmpeg again always assumes we are doing live streaming. It > doesn’t even have another profile. I’m going to add a VOD profile to it and > fix this problem there. I will have to add a new cli parameter so we can > specify the profile now. > > Ronak
Hi Steven, Did you have a chance to review this patch? I haven't seen your feedback yet. Did you have a chance to try it out? I would like to get this merged this week. Ronak > >> >> >>>>> >>>>>>>> >>>>>>>> if ((ret = hls_window(s, 0, vs)) < 0) { >>>>>>>> return ret; >>>>>>>> } >>>>>>>> + } >>>>>>>> } >>>>>>>> >>>>>>>> - vs->packets_written++; >>>>>>>> ret = ff_write_chained(oc, stream_index, pkt, s, 0); >>>>>>>> + vs->packets_written++; >>>>>>>> >>>>>>>> return ret; >>>>>>>> } >>>>>>>> @@ -2394,15 +2409,16 @@ failed: >>>>>>>> if (hls->segment_type != SEGMENT_TYPE_FMP4) >>>>>>>> ff_format_io_close(s, &oc->pb); >>>>>>>> >>>>>>>> - if ((hls->flags & HLS_TEMP_FILE) && oc->url[0]) { >>>>>>>> - hls_rename_temp_file(s, oc); >>>>>>>> + // rename that segment from .tmp to the real one >>>>>>>> + if ((hls->flags & HLS_TEMP_FILE) && oc->url[0] && >>>>>>>> !(hls->flags & HLS_SINGLE_FILE)) { >>>>>>>> + hls_rename_temp_file(s, oc); >>>>>>>> av_free(old_filename); >>>>>>>> old_filename = av_strdup(vs->avf->url); >>>>>>>> >>>>>>>> if (!old_filename) { >>>>>>>> return AVERROR(ENOMEM); >>>>>>>> } >>>>>>>> - } >>>>>>>> + } >>>>>>>> >>>>>>>> /* after av_write_trailer, then duration + 1 duration per packet >>>>>>>> */ >>>>>>>> hls_append_segment(s, hls, vs, vs->duration + vs->dpp, >>>>>>>> vs->start_pos, vs->size); >>>>>>>> -- >>>>>>>> 2.6.3 >>>>>>>> >>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>> >>>> Thanks >>>> Steven >>>> >>>> >>>> >>>> >>>> >>>> _______________________________________________ >>>> ffmpeg-devel mailing list >>>> ffmpeg-devel@ffmpeg.org <mailto:ffmpeg-devel@ffmpeg.org> >>>> <mailto:ffmpeg-devel@ffmpeg.org <mailto:ffmpeg-devel@ffmpeg.org>> >>>> <mailto:ffmpeg-devel@ffmpeg.org <mailto:ffmpeg-devel@ffmpeg.org> >>>> <mailto:ffmpeg-devel@ffmpeg.org <mailto:ffmpeg-devel@ffmpeg.org>>> >>>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel >>>> <http://ffmpeg.org/mailman/listinfo/ffmpeg-devel> >>>> <http://ffmpeg.org/mailman/listinfo/ffmpeg-devel >>>> <http://ffmpeg.org/mailman/listinfo/ffmpeg-devel>> >>>> <http://ffmpeg.org/mailman/listinfo/ffmpeg-devel >>>> <http://ffmpeg.org/mailman/listinfo/ffmpeg-devel> >>>> <http://ffmpeg.org/mailman/listinfo/ffmpeg-devel >>>> <http://ffmpeg.org/mailman/listinfo/ffmpeg-devel>>> >>> _______________________________________________ >>> ffmpeg-devel mailing list >>> ffmpeg-devel@ffmpeg.org <mailto:ffmpeg-devel@ffmpeg.org> >>> <mailto:ffmpeg-devel@ffmpeg.org <mailto:ffmpeg-devel@ffmpeg.org>> >>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel >>> <http://ffmpeg.org/mailman/listinfo/ffmpeg-devel> >>> <http://ffmpeg.org/mailman/listinfo/ffmpeg-devel >>> <http://ffmpeg.org/mailman/listinfo/ffmpeg-devel>> >> _______________________________________________ >> ffmpeg-devel mailing list >> ffmpeg-devel@ffmpeg.org <mailto:ffmpeg-devel@ffmpeg.org> >> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel >> <http://ffmpeg.org/mailman/listinfo/ffmpeg-devel> > > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org <mailto:ffmpeg-devel@ffmpeg.org> > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > <http://ffmpeg.org/mailman/listinfo/ffmpeg-devel> _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel