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

Michael Niedermayer michaelni at gmx.at
Fri Feb 20 14:30:34 CET 2015


On Fri, Feb 20, 2015 at 02:15:30PM +0100, Hendrik Leppkes wrote:
> 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?

http, ftp, who knows
also ff_rename() would interpret a "http://" differently from
avio_open2(), so something more is needed to not end up with odd
rename() calls

> It writes to separate segment files as well,
> not sure that would work on anything but local files.

i dont know either
but if someone passes "ftp://..." it should either work or fail
with a error message or mostly work while printing a warning


> 
> 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 at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 

-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Let us carefully observe those good qualities wherein our enemies excel us
and endeavor to excel them, by avoiding what is faulty, and imitating what
is excellent in them. -- Plutarch
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20150220/76fec752/attachment.asc>


More information about the ffmpeg-devel mailing list