On Fri, Feb 20, 2015 at 1:38 PM, Michael Niedermayer <michae...@gmx.at> wrote:
> On Fri, Feb 20, 2015 at 12:55:14PM +0100, Hendrik Leppkes wrote:
>> ---
>>  libavformat/hlsenc.c | 6 +++++-
>>  1 file changed, 5 insertions(+), 1 deletion(-)
>>
>> diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
>> index 1831c17..0f14e90 100644
>> --- a/libavformat/hlsenc.c
>> +++ b/libavformat/hlsenc.c
>> @@ -242,10 +242,12 @@ static int hls_window(AVFormatContext *s, int last)
>>      int target_duration = 0;
>>      int ret = 0;
>>      AVIOContext *out = NULL;
>> +    char temp_filename[1024];
>>      int64_t sequence = FFMAX(hls->start_sequence, hls->sequence - 
>> hls->nb_entries);
>>      int version = hls->flags & HLS_SINGLE_FILE ? 4 : 3;
>>
>> -    if ((ret = avio_open2(&out, s->filename, AVIO_FLAG_WRITE,
>> +    snprintf(temp_filename, sizeof(temp_filename), "%s.tmp", s->filename);
>> +    if ((ret = avio_open2(&out, temp_filename, AVIO_FLAG_WRITE,
>>                            &s->interrupt_callback, NULL)) < 0)
>>          goto fail;
>>
>> @@ -280,6 +282,8 @@ static int hls_window(AVFormatContext *s, int last)
>>
>>  fail:
>>      avio_closep(&out);
>> +    if (ret >= 0)
>> +        ff_rename(temp_filename, s->filename, s);
>
> what if s->filename is not a local file ?
> or am i missing something that prevents that ?
>

What else could it be? It writes to separate segment files as well,
not sure that would work on anything but local files.

For the record, this is the same method used in dashenc for writing
its manifest file, and it can avoid a sort-of race condition when
serving the files through a web server directly (ie. web server
reading while in the middle of re-writing it).

- Hendrik
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to