diff mbox

[FFmpeg-devel] libavformat/hlsenc: fix broken -hls_flags +temp_file

Message ID FDBA495A-4E93-4757-B01D-6AB0589E8311@undev.ru
State Superseded
Headers show

Commit Message

Aleksey Skripka Dec. 14, 2018, 9:27 a.m. UTC
greetings!

fixed version.
thanks.

---
---

Comments

Liu Steven Dec. 14, 2018, 10:10 a.m. UTC | #1
> 在 2018年12月14日,下午5:27,Aleksey Skripka <caspy@undev.ru> 写道:
> 
> greetings!
> 
> fixed version.
> thanks.
Is this patch create by git format-patch ?
> 
> ---
> --- 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
Aleksey Skripka Dec. 14, 2018, 11:23 a.m. UTC | #2
> 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

>> 
>> ---
>> --- 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
Liu Steven Dec. 14, 2018, 2:21 p.m. UTC | #3
> 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
Aleksey Skripka Dec. 14, 2018, 2:56 p.m. UTC | #4
one more try, via 'git format-patch'.
> 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
diff mbox

Patch

--- 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;