[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