greetings! fixed version. thanks.
--- --- 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 <l...@chinaffmpeg.org> wrote: > > > >> 在 2018年12月14日,下午3:04,Aleksey Skripka <ca...@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