Message ID | 42AAD417-F8C1-4ED0-9167-7F02ED2E2929@undev.ru |
---|---|
State | New |
Headers | show |
Aleksey Skripka <caspy@undev.ru> 于2018年12月14日周五 下午10:58写道: > > > From e85edcc4d8b0312c7871f78ed0859ec7436be460 Mon Sep 17 00:00:00 2001 > From: Aleksey Skripka <caspy@undev.ru> > Date: Fri, 14 Dec 2018 14:48:31 +0000 > Subject: [PATCH] libavformat/hlsenc: fix broken -hls_flags +temp_file > > 1. fix addressing '->flags' while assigning 'use_temp_file'. > 2. before 223d2bde22ce33dcbcb6f17f234b609cb98f1fb6 playlist file was always created via .tmp for 'file' proto, now not. keep old behavior. > 3. rename logic in hls_write_packet() incorrectly placed (in fMP4-only code), thus not renaming files for mpegts. > 4. needless av_free() call. > --- > libavformat/hlsenc.c | 23 +++++++---------------- > 1 file changed, 7 insertions(+), 16 deletions(-) > > diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c > index bdd2a11..70eee19 100644 > --- a/libavformat/hlsenc.c > +++ b/libavformat/hlsenc.c > @@ -1358,7 +1358,7 @@ static int hls_window(AVFormatContext *s, int last, VariantStream *vs) > 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_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE); > + int use_temp_file = proto && !strcmp(proto, "file"); > static unsigned warned_non_file; > char *key_uri = NULL; > char *iv_string = NULL; > @@ -1478,7 +1478,7 @@ static int hls_start(AVFormatContext *s, VariantStream *vs) > AVFormatContext *vtt_oc = vs->vtt_avf; > AVDictionary *options = NULL; > const char *proto = avio_find_protocol_name(s->url); > - int use_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE); > + int use_temp_file = proto && !strcmp(proto, "file") && (c->flags & HLS_TEMP_FILE); > char *filename, iv_string[KEYSIZE*2 + 1]; > int err = 0; > > @@ -2143,7 +2143,7 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) > int stream_index = 0; > int range_length = 0; > const char *proto = avio_find_protocol_name(s->url); > - int use_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE); > + int use_temp_file = proto && !strcmp(proto, "file") && (hls->flags & HLS_TEMP_FILE); > uint8_t *buffer = NULL; > VariantStream *vs = NULL; > AVDictionary *options = NULL; > @@ -2266,7 +2266,6 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) > if (hls->flags & HLS_SINGLE_FILE) { > ret = flush_dynbuf(vs, &range_length); > if (ret < 0) { > - av_free(old_filename); > return ret; > } > vs->size = range_length; > @@ -2284,20 +2283,12 @@ 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 (use_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); > - } > - } > } > } > > + if (use_temp_file && oc->url[0] && !(hls->flags & HLS_SINGLE_FILE)) > + hls_rename_temp_file(s, oc); > + > old_filename = av_strdup(vs->avf->url); > if (!old_filename) { > return AVERROR(ENOMEM); > @@ -2367,7 +2358,7 @@ static int hls_write_trailer(struct AVFormatContext *s) > AVFormatContext *vtt_oc = NULL; > char *old_filename = NULL; > const char *proto = avio_find_protocol_name(s->url); > - int use_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE); > + int use_temp_file = proto && !strcmp(proto, "file") && (hls->flags & HLS_TEMP_FILE); > int i; > int ret = 0; > VariantStream *vs = NULL; > -- > 1.8.3.1 > > -- > Aleksey Skripka > > > > > On 14 Dec 2018, at 17:21, Steven Liu <lq@chinaffmpeg.org> wrote: > > > > > > > >> On Dec 14, 2018, at 19:23, Aleksey Skripka <caspy@undev.ru> wrote: > >> > >>> > >>> On 14 Dec 2018, at 13:10, Liu Steven <lq@chinaffmpeg.org> wrote: > >>> > >>> > >>> > >>>> 在 2018年12月14日,下午5:27,Aleksey Skripka <caspy@undev.ru> 写道: > >>>> > >>>> greetings! > >>>> > >>>> fixed version. > >>>> thanks. > >>> Is this patch create by git format-patch ? > >> no. > >> diff -up fileA fileB > > https://ffmpeg.org/developer.html#Submitting-patches-1 > > This is the rule for make a patch, I think your code is ok. :D > > > >> > >>>> > >>>> --- > >>>> --- libavformat/hlsenc.c.orig 2018-12-14 09:25:06.541809226 +0000 > >>>> +++ libavformat/hlsenc.c 2018-12-14 09:19:16.129377384 +0000 > >>>> @@ -1348,7 +1348,7 @@ static int hls_window(AVFormatContext *s > >>>> 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_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE); > >>>> + int use_temp_file = proto && !strcmp(proto, "file"); > >>>> static unsigned warned_non_file; > >>>> char *key_uri = NULL; > >>>> char *iv_string = NULL; > >>>> @@ -1463,7 +1463,7 @@ static int hls_start(AVFormatContext *s, > >>>> AVFormatContext *vtt_oc = vs->vtt_avf; > >>>> AVDictionary *options = NULL; > >>>> const char *proto = avio_find_protocol_name(s->url); > >>>> - int use_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE); > >>>> + int use_temp_file = proto && !strcmp(proto, "file") && (c->flags & HLS_TEMP_FILE); > >>>> char *filename, iv_string[KEYSIZE*2 + 1]; > >>>> int err = 0; > >>>> > >>>> @@ -2123,7 +2123,7 @@ static int hls_write_packet(AVFormatCont > >>>> int stream_index = 0; > >>>> int range_length = 0; > >>>> const char *proto = avio_find_protocol_name(s->url); > >>>> - int use_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE); > >>>> + int use_temp_file = proto && !strcmp(proto, "file") && (hls->flags & HLS_TEMP_FILE); > >>>> uint8_t *buffer = NULL; > >>>> VariantStream *vs = NULL; > >>>> AVDictionary *options = NULL; > >>>> @@ -2251,7 +2251,6 @@ static int hls_write_packet(AVFormatCont > >>>> if (hls->flags & HLS_SINGLE_FILE) { > >>>> ret = flush_dynbuf(vs, &range_length); > >>>> if (ret < 0) { > >>>> - av_free(old_filename); > >>>> return ret; > >>>> } > >>>> vs->size = range_length; > >>>> @@ -2269,20 +2268,12 @@ static int hls_write_packet(AVFormatCont > >>>> return ret; > >>>> } > >>>> ff_format_io_close(s, &vs->out); > >>>> - > >>>> - // rename that segment from .tmp to the real one > >>>> - if (use_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); > >>>> - } > >>>> - } > >>>> } > >>>> } > >>>> > >>>> + if (use_temp_file && oc->url[0] && !(hls->flags & HLS_SINGLE_FILE)) > >>>> + hls_rename_temp_file(s, oc); > >>>> + > >>>> old_filename = av_strdup(vs->avf->url); > >>>> if (!old_filename) { > >>>> return AVERROR(ENOMEM); > >>>> @@ -2348,7 +2339,7 @@ static int hls_write_trailer(struct AVFo > >>>> AVFormatContext *vtt_oc = NULL; > >>>> char *old_filename = NULL; > >>>> const char *proto = avio_find_protocol_name(s->url); > >>>> - int use_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE); > >>>> + int use_temp_file = proto && !strcmp(proto, "file") && (hls->flags & HLS_TEMP_FILE); > >>>> int i; > >>>> int ret = 0; > >>>> VariantStream *vs = NULL; > >>>> --- > >>>> > >>>> -- > >>>> Aleksey Skripka > >>>> > >>>> > >>>> > >>>>> On 14 Dec 2018, at 11:38, Liu Steven <lq@chinaffmpeg.org> wrote: > >>>>> > >>>>> > >>>>> > >>>>>> 在 2018年12月14日,下午3:04,Aleksey Skripka <caspy@undev.ru> 写道: > >>>>>> > >>>>>> greetings! > >>>>>> > >>>>>> after commit 223d2bde22ce33dcbcb6f17f234b609cb98f1fb6 temp_file functionality totally broken. > >>>>>> > >>>>>> attached patch prototype will fix: > >>>>>> 1) while assigning 'use_temp_file' addressing to '->flags' is done incorrectly in 4 places. > >>>>>> 2) before that commit playlist was always created via .tmp for 'file' proto, now not. sure we should keep it in such way, thus not look for this flag in hls_window(). > >>>>>> 3) rename logic in hls_write_packet() was accidentally moved to fMP4-only code, thus not renaming files for mpegts. > >>>>>> 4) av_free() call, where variable always NULL. > >>>>>> > >>>>>> please take a look. > >>>>>> > >>>>>> --- > >>>>>> --- libavformat/hlsenc.c.orig 2018-12-13 13:27:03.307499151 +0000 > >>>>>> +++ libavformat/hlsenc.c 2018-12-13 20:19:59.781833259 +0000 > >>>>>> @@ -1348,7 +1348,7 @@ static int hls_window(AVFormatContext *s > >>>>>> 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_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE); > >>>>>> + int use_temp_file = proto && !strcmp(proto, "file")/* && (hls->flags & HLS_TEMP_FILE)*/; // always use .tmp logic for 'file' proto. > >>>>>> static unsigned warned_non_file; > >>>>>> char *key_uri = NULL; > >>>>>> char *iv_string = NULL; > >>>>>> @@ -1463,7 +1463,7 @@ static int hls_start(AVFormatContext *s, > >>>>>> AVFormatContext *vtt_oc = vs->vtt_avf; > >>>>>> AVDictionary *options = NULL; > >>>>>> const char *proto = avio_find_protocol_name(s->url); > >>>>>> - int use_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE); > >>>>>> + int use_temp_file = proto && !strcmp(proto, "file") && (c->flags & HLS_TEMP_FILE); > >>>>>> char *filename, iv_string[KEYSIZE*2 + 1]; > >>>>>> int err = 0; > >>>>>> > >>>>>> @@ -2123,7 +2123,7 @@ static int hls_write_packet(AVFormatCont > >>>>>> int stream_index = 0; > >>>>>> int range_length = 0; > >>>>>> const char *proto = avio_find_protocol_name(s->url); > >>>>>> - int use_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE); > >>>>>> + int use_temp_file = proto && !strcmp(proto, "file") && (hls->flags & HLS_TEMP_FILE); > >>>>>> uint8_t *buffer = NULL; > >>>>>> VariantStream *vs = NULL; > >>>>>> AVDictionary *options = NULL; > >>>>>> @@ -2249,7 +2249,8 @@ static int hls_write_packet(AVFormatCont > >>>>>> if (hls->flags & HLS_SINGLE_FILE) { > >>>>>> ret = flush_dynbuf(vs, &range_length); > >>>>>> if (ret < 0) { > >>>>>> - av_free(old_filename); > >>>>>> +// old_filename not yet defined here > >>>>>> +// av_free(old_filename); > >>>>>> return ret; > >>>>>> } > >>>>>> vs->size = range_length; > >>>>>> @@ -2268,19 +2269,23 @@ static int hls_write_packet(AVFormatCont > >>>>>> } > >>>>>> ff_format_io_close(s, &vs->out); > >>>>>> > >>>>>> - // rename that segment from .tmp to the real one > >>>>>> - if (use_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); > >>>>>> - } > >>>>>> - } > >>>>>> +// bad place for rename here, it does not rename non-fmp4 files > >>>>>> +// // rename that segment from .tmp to the real one > >>>>>> +// if (use_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); > >>>>>> +// } > >>>>>> +// } > >>>>> remove the code block when it unused. > >>>>>> } > >>>>>> } > >>>>>> > >>>>>> + if (use_temp_file && oc->url[0] && !(hls->flags & HLS_SINGLE_FILE)) > >>>>>> + hls_rename_temp_file(s, oc); > >>>>>> + > >>>>>> old_filename = av_strdup(vs->avf->url); > >>>>>> if (!old_filename) { > >>>>>> return AVERROR(ENOMEM); > >>>>>> @@ -2346,7 +2351,7 @@ static int hls_write_trailer(struct AVFo > >>>>>> AVFormatContext *vtt_oc = NULL; > >>>>>> char *old_filename = NULL; > >>>>>> const char *proto = avio_find_protocol_name(s->url); > >>>>>> - int use_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE); > >>>>>> + int use_temp_file = proto && !strcmp(proto, "file") && (hls->flags & HLS_TEMP_FILE); > >>>>>> int i; > >>>>>> int ret = 0; > >>>>>> VariantStream *vs = NULL; > >>>>>> --- > >>>>>> -- > >>>>>> Aleksey Skripka > >>>>>> -- > >>>>>> Aleksey Skripka > >>>>>> > >>>>> > >>>>> Thanks > >>>>> > >>>>> Steven > >>>>>> > >>>>>> > >>>>>> _______________________________________________ > >>>>>> 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 > >>>> > >>>> _______________________________________________ > >>>> 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 > >> > >> _______________________________________________ > >> ffmpeg-devel mailing list > >> ffmpeg-devel@ffmpeg.org > >> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > > > Thanks > > Steven > > > > > > > > > > > > _______________________________________________ > > 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 will push Thanks Steven
> On Dec 16, 2018, at 10:31 PM, Steven Liu <lingjiujianke@gmail.com> wrote: > > Aleksey Skripka <caspy@undev.ru> 于2018年12月14日周五 下午10:58写道: >> >> >> From e85edcc4d8b0312c7871f78ed0859ec7436be460 Mon Sep 17 00:00:00 2001 >> From: Aleksey Skripka <caspy@undev.ru> >> Date: Fri, 14 Dec 2018 14:48:31 +0000 >> Subject: [PATCH] libavformat/hlsenc: fix broken -hls_flags +temp_file >> >> 1. fix addressing '->flags' while assigning 'use_temp_file'. >> 2. before 223d2bde22ce33dcbcb6f17f234b609cb98f1fb6 playlist file was always created via .tmp for 'file' proto, now not. keep old behavior. >> 3. rename logic in hls_write_packet() incorrectly placed (in fMP4-only code), thus not renaming files for mpegts. >> 4. needless av_free() call. Hi Aleksey, Just wanted to make sure this wouldn’t affect standard VOD use cases running on a file on disk. We have some really gigantic audio files and we can’t sustain fragmentation times over a few minutes. Taking a week to fragment something is not acceptable. I hope we don’t make temp files in those cases. Did you test that on the command line? Ronak >> --- >> libavformat/hlsenc.c | 23 +++++++---------------- >> 1 file changed, 7 insertions(+), 16 deletions(-) >> >> diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c >> index bdd2a11..70eee19 100644 >> --- a/libavformat/hlsenc.c >> +++ b/libavformat/hlsenc.c >> @@ -1358,7 +1358,7 @@ static int hls_window(AVFormatContext *s, int last, VariantStream *vs) >> 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_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE); >> + int use_temp_file = proto && !strcmp(proto, "file"); >> static unsigned warned_non_file; >> char *key_uri = NULL; >> char *iv_string = NULL; >> @@ -1478,7 +1478,7 @@ static int hls_start(AVFormatContext *s, VariantStream *vs) >> AVFormatContext *vtt_oc = vs->vtt_avf; >> AVDictionary *options = NULL; >> const char *proto = avio_find_protocol_name(s->url); >> - int use_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE); >> + int use_temp_file = proto && !strcmp(proto, "file") && (c->flags & HLS_TEMP_FILE); >> char *filename, iv_string[KEYSIZE*2 + 1]; >> int err = 0; >> >> @@ -2143,7 +2143,7 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) >> int stream_index = 0; >> int range_length = 0; >> const char *proto = avio_find_protocol_name(s->url); >> - int use_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE); >> + int use_temp_file = proto && !strcmp(proto, "file") && (hls->flags & HLS_TEMP_FILE); >> uint8_t *buffer = NULL; >> VariantStream *vs = NULL; >> AVDictionary *options = NULL; >> @@ -2266,7 +2266,6 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) >> if (hls->flags & HLS_SINGLE_FILE) { >> ret = flush_dynbuf(vs, &range_length); >> if (ret < 0) { >> - av_free(old_filename); >> return ret; >> } >> vs->size = range_length; >> @@ -2284,20 +2283,12 @@ 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 (use_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); >> - } >> - } >> } >> } >> >> + if (use_temp_file && oc->url[0] && !(hls->flags & HLS_SINGLE_FILE)) >> + hls_rename_temp_file(s, oc); >> + >> old_filename = av_strdup(vs->avf->url); >> if (!old_filename) { >> return AVERROR(ENOMEM); >> @@ -2367,7 +2358,7 @@ static int hls_write_trailer(struct AVFormatContext *s) >> AVFormatContext *vtt_oc = NULL; >> char *old_filename = NULL; >> const char *proto = avio_find_protocol_name(s->url); >> - int use_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE); >> + int use_temp_file = proto && !strcmp(proto, "file") && (hls->flags & HLS_TEMP_FILE); >> int i; >> int ret = 0; >> VariantStream *vs = NULL; >> -- >> 1.8.3.1 >> >> -- >> Aleksey Skripka >> >> >> >>> On 14 Dec 2018, at 17:21, Steven Liu <lq@chinaffmpeg.org> wrote: >>> >>> >>> >>>>> On Dec 14, 2018, at 19:23, Aleksey Skripka <caspy@undev.ru> wrote: >>>>> >>>>> >>>>> On 14 Dec 2018, at 13:10, Liu Steven <lq@chinaffmpeg.org> wrote: >>>>> >>>>> >>>>> >>>>>> 在 2018年12月14日,下午5:27,Aleksey Skripka <caspy@undev.ru> 写道: >>>>>> >>>>>> greetings! >>>>>> >>>>>> fixed version. >>>>>> thanks. >>>>> Is this patch create by git format-patch ? >>>> no. >>>> diff -up fileA fileB >>> https://ffmpeg.org/developer.html#Submitting-patches-1 >>> This is the rule for make a patch, I think your code is ok. :D >>> >>>> >>>>>> >>>>>> --- >>>>>> --- libavformat/hlsenc.c.orig 2018-12-14 09:25:06.541809226 +0000 >>>>>> +++ libavformat/hlsenc.c 2018-12-14 09:19:16.129377384 +0000 >>>>>> @@ -1348,7 +1348,7 @@ static int hls_window(AVFormatContext *s >>>>>> 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_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE); >>>>>> + int use_temp_file = proto && !strcmp(proto, "file"); >>>>>> static unsigned warned_non_file; >>>>>> char *key_uri = NULL; >>>>>> char *iv_string = NULL; >>>>>> @@ -1463,7 +1463,7 @@ static int hls_start(AVFormatContext *s, >>>>>> AVFormatContext *vtt_oc = vs->vtt_avf; >>>>>> AVDictionary *options = NULL; >>>>>> const char *proto = avio_find_protocol_name(s->url); >>>>>> - int use_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE); >>>>>> + int use_temp_file = proto && !strcmp(proto, "file") && (c->flags & HLS_TEMP_FILE); >>>>>> char *filename, iv_string[KEYSIZE*2 + 1]; >>>>>> int err = 0; >>>>>> >>>>>> @@ -2123,7 +2123,7 @@ static int hls_write_packet(AVFormatCont >>>>>> int stream_index = 0; >>>>>> int range_length = 0; >>>>>> const char *proto = avio_find_protocol_name(s->url); >>>>>> - int use_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE); >>>>>> + int use_temp_file = proto && !strcmp(proto, "file") && (hls->flags & HLS_TEMP_FILE); >>>>>> uint8_t *buffer = NULL; >>>>>> VariantStream *vs = NULL; >>>>>> AVDictionary *options = NULL; >>>>>> @@ -2251,7 +2251,6 @@ static int hls_write_packet(AVFormatCont >>>>>> if (hls->flags & HLS_SINGLE_FILE) { >>>>>> ret = flush_dynbuf(vs, &range_length); >>>>>> if (ret < 0) { >>>>>> - av_free(old_filename); >>>>>> return ret; >>>>>> } >>>>>> vs->size = range_length; >>>>>> @@ -2269,20 +2268,12 @@ static int hls_write_packet(AVFormatCont >>>>>> return ret; >>>>>> } >>>>>> ff_format_io_close(s, &vs->out); >>>>>> - >>>>>> - // rename that segment from .tmp to the real one >>>>>> - if (use_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); >>>>>> - } >>>>>> - } >>>>>> } >>>>>> } >>>>>> >>>>>> + if (use_temp_file && oc->url[0] && !(hls->flags & HLS_SINGLE_FILE)) >>>>>> + hls_rename_temp_file(s, oc); >>>>>> + >>>>>> old_filename = av_strdup(vs->avf->url); >>>>>> if (!old_filename) { >>>>>> return AVERROR(ENOMEM); >>>>>> @@ -2348,7 +2339,7 @@ static int hls_write_trailer(struct AVFo >>>>>> AVFormatContext *vtt_oc = NULL; >>>>>> char *old_filename = NULL; >>>>>> const char *proto = avio_find_protocol_name(s->url); >>>>>> - int use_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE); >>>>>> + int use_temp_file = proto && !strcmp(proto, "file") && (hls->flags & HLS_TEMP_FILE); >>>>>> int i; >>>>>> int ret = 0; >>>>>> VariantStream *vs = NULL; >>>>>> --- >>>>>> >>>>>> -- >>>>>> Aleksey Skripka >>>>>> >>>>>> >>>>>> >>>>>>> On 14 Dec 2018, at 11:38, Liu Steven <lq@chinaffmpeg.org> wrote: >>>>>>> >>>>>>> >>>>>>> >>>>>>>> 在 2018年12月14日,下午3:04,Aleksey Skripka <caspy@undev.ru> 写道: >>>>>>>> >>>>>>>> greetings! >>>>>>>> >>>>>>>> after commit 223d2bde22ce33dcbcb6f17f234b609cb98f1fb6 temp_file functionality totally broken. >>>>>>>> >>>>>>>> attached patch prototype will fix: >>>>>>>> 1) while assigning 'use_temp_file' addressing to '->flags' is done incorrectly in 4 places. >>>>>>>> 2) before that commit playlist was always created via .tmp for 'file' proto, now not. sure we should keep it in such way, thus not look for this flag in hls_window(). >>>>>>>> 3) rename logic in hls_write_packet() was accidentally moved to fMP4-only code, thus not renaming files for mpegts. >>>>>>>> 4) av_free() call, where variable always NULL. >>>>>>>> >>>>>>>> please take a look. >>>>>>>> >>>>>>>> --- >>>>>>>> --- libavformat/hlsenc.c.orig 2018-12-13 13:27:03.307499151 +0000 >>>>>>>> +++ libavformat/hlsenc.c 2018-12-13 20:19:59.781833259 +0000 >>>>>>>> @@ -1348,7 +1348,7 @@ static int hls_window(AVFormatContext *s >>>>>>>> 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_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE); >>>>>>>> + int use_temp_file = proto && !strcmp(proto, "file")/* && (hls->flags & HLS_TEMP_FILE)*/; // always use .tmp logic for 'file' proto. >>>>>>>> static unsigned warned_non_file; >>>>>>>> char *key_uri = NULL; >>>>>>>> char *iv_string = NULL; >>>>>>>> @@ -1463,7 +1463,7 @@ static int hls_start(AVFormatContext *s, >>>>>>>> AVFormatContext *vtt_oc = vs->vtt_avf; >>>>>>>> AVDictionary *options = NULL; >>>>>>>> const char *proto = avio_find_protocol_name(s->url); >>>>>>>> - int use_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE); >>>>>>>> + int use_temp_file = proto && !strcmp(proto, "file") && (c->flags & HLS_TEMP_FILE); >>>>>>>> char *filename, iv_string[KEYSIZE*2 + 1]; >>>>>>>> int err = 0; >>>>>>>> >>>>>>>> @@ -2123,7 +2123,7 @@ static int hls_write_packet(AVFormatCont >>>>>>>> int stream_index = 0; >>>>>>>> int range_length = 0; >>>>>>>> const char *proto = avio_find_protocol_name(s->url); >>>>>>>> - int use_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE); >>>>>>>> + int use_temp_file = proto && !strcmp(proto, "file") && (hls->flags & HLS_TEMP_FILE); >>>>>>>> uint8_t *buffer = NULL; >>>>>>>> VariantStream *vs = NULL; >>>>>>>> AVDictionary *options = NULL; >>>>>>>> @@ -2249,7 +2249,8 @@ static int hls_write_packet(AVFormatCont >>>>>>>> if (hls->flags & HLS_SINGLE_FILE) { >>>>>>>> ret = flush_dynbuf(vs, &range_length); >>>>>>>> if (ret < 0) { >>>>>>>> - av_free(old_filename); >>>>>>>> +// old_filename not yet defined here >>>>>>>> +// av_free(old_filename); >>>>>>>> return ret; >>>>>>>> } >>>>>>>> vs->size = range_length; >>>>>>>> @@ -2268,19 +2269,23 @@ static int hls_write_packet(AVFormatCont >>>>>>>> } >>>>>>>> ff_format_io_close(s, &vs->out); >>>>>>>> >>>>>>>> - // rename that segment from .tmp to the real one >>>>>>>> - if (use_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); >>>>>>>> - } >>>>>>>> - } >>>>>>>> +// bad place for rename here, it does not rename non-fmp4 files >>>>>>>> +// // rename that segment from .tmp to the real one >>>>>>>> +// if (use_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); >>>>>>>> +// } >>>>>>>> +// } >>>>>>> remove the code block when it unused. >>>>>>>> } >>>>>>>> } >>>>>>>> >>>>>>>> + if (use_temp_file && oc->url[0] && !(hls->flags & HLS_SINGLE_FILE)) >>>>>>>> + hls_rename_temp_file(s, oc); >>>>>>>> + >>>>>>>> old_filename = av_strdup(vs->avf->url); >>>>>>>> if (!old_filename) { >>>>>>>> return AVERROR(ENOMEM); >>>>>>>> @@ -2346,7 +2351,7 @@ static int hls_write_trailer(struct AVFo >>>>>>>> AVFormatContext *vtt_oc = NULL; >>>>>>>> char *old_filename = NULL; >>>>>>>> const char *proto = avio_find_protocol_name(s->url); >>>>>>>> - int use_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE); >>>>>>>> + int use_temp_file = proto && !strcmp(proto, "file") && (hls->flags & HLS_TEMP_FILE); >>>>>>>> int i; >>>>>>>> int ret = 0; >>>>>>>> VariantStream *vs = NULL; >>>>>>>> --- >>>>>>>> -- >>>>>>>> Aleksey Skripka >>>>>>>> -- >>>>>>>> Aleksey Skripka >>>>>>>> >>>>>>> >>>>>>> Thanks >>>>>>> >>>>>>> Steven >>>>>>>> >>>>>>>> >>>>>>>> _______________________________________________ >>>>>>>> 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 >>>>>> >>>>>> _______________________________________________ >>>>>> 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 >>>> >>>> _______________________________________________ >>>> ffmpeg-devel mailing list >>>> ffmpeg-devel@ffmpeg.org >>>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel >>> >>> Thanks >>> Steven >>> >>> >>> >>> >>> >>> _______________________________________________ >>> 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 > > will push > > > Thanks > > Steven > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c index bdd2a11..70eee19 100644 --- a/libavformat/hlsenc.c +++ b/libavformat/hlsenc.c @@ -1358,7 +1358,7 @@ static int hls_window(AVFormatContext *s, int last, VariantStream *vs) 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_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE); + int use_temp_file = proto && !strcmp(proto, "file"); static unsigned warned_non_file; char *key_uri = NULL; char *iv_string = NULL; @@ -1478,7 +1478,7 @@ static int hls_start(AVFormatContext *s, VariantStream *vs) AVFormatContext *vtt_oc = vs->vtt_avf; AVDictionary *options = NULL; const char *proto = avio_find_protocol_name(s->url); - int use_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE); + int use_temp_file = proto && !strcmp(proto, "file") && (c->flags & HLS_TEMP_FILE); char *filename, iv_string[KEYSIZE*2 + 1]; int err = 0; @@ -2143,7 +2143,7 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) int stream_index = 0; int range_length = 0; const char *proto = avio_find_protocol_name(s->url); - int use_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE); + int use_temp_file = proto && !strcmp(proto, "file") && (hls->flags & HLS_TEMP_FILE); uint8_t *buffer = NULL; VariantStream *vs = NULL; AVDictionary *options = NULL; @@ -2266,7 +2266,6 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) if (hls->flags & HLS_SINGLE_FILE) { ret = flush_dynbuf(vs, &range_length); if (ret < 0) { - av_free(old_filename); return ret; } vs->size = range_length; @@ -2284,20 +2283,12 @@ 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 (use_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); - } - } } } + if (use_temp_file && oc->url[0] && !(hls->flags & HLS_SINGLE_FILE)) + hls_rename_temp_file(s, oc); + old_filename = av_strdup(vs->avf->url); if (!old_filename) { return AVERROR(ENOMEM); @@ -2367,7 +2358,7 @@ static int hls_write_trailer(struct AVFormatContext *s) AVFormatContext *vtt_oc = NULL; char *old_filename = NULL; const char *proto = avio_find_protocol_name(s->url); - int use_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE); + int use_temp_file = proto && !strcmp(proto, "file") && (hls->flags & HLS_TEMP_FILE); int i; int ret = 0; VariantStream *vs = NULL;
From e85edcc4d8b0312c7871f78ed0859ec7436be460 Mon Sep 17 00:00:00 2001 From: Aleksey Skripka <caspy@undev.ru> Date: Fri, 14 Dec 2018 14:48:31 +0000 Subject: [PATCH] libavformat/hlsenc: fix broken -hls_flags +temp_file 1. fix addressing '->flags' while assigning 'use_temp_file'. 2. before 223d2bde22ce33dcbcb6f17f234b609cb98f1fb6 playlist file was always created via .tmp for 'file' proto, now not. keep old behavior. 3. rename logic in hls_write_packet() incorrectly placed (in fMP4-only code), thus not renaming files for mpegts. 4. needless av_free() call. --- libavformat/hlsenc.c | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) -- 1.8.3.1