[FFmpeg-devel] [PATCH 2/2] hlsenc: write playlist into a temp file and replace the original atomically

Hendrik Leppkes h.leppkes at gmail.com
Fri Feb 20 14:15:30 CET 2015


On Fri, Feb 20, 2015 at 1:38 PM, Michael Niedermayer <michaelni at 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


More information about the ffmpeg-devel mailing list