[FFmpeg-devel] [PATCH v2] avformat/hlsenc: add hls_flag option to write segments to temporary file until complete

Steven Liu lingjiujianke at gmail.com
Fri Feb 3 17:16:05 EET 2017


2017-02-03 23:15 GMT+08:00 Steven Liu <lingjiujianke at gmail.com>:

>
>
> 2017-02-02 8:28 GMT+08:00 Aman Gupta <ffmpeg at tmm1.net>:
>
>> From: Aman Gupta <aman at tmm1.net>
>>
>> Adds a `-hls_flags +temp_file` which will write segment data to
>> filename.tmp, and then rename to filename when the segment is complete.
>>
>> This patch is similar in spirit to one used in Plex's ffmpeg fork, and
>> allows a transcoding webserver to ensure incomplete segment files are
>> never served up accidentally.
>> ---
>>  libavformat/hlsenc.c | 25 +++++++++++++++++++++++++
>>  1 file changed, 25 insertions(+)
>>
>> diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
>> index bd1e684..17d4fe4 100644
>> --- a/libavformat/hlsenc.c
>> +++ b/libavformat/hlsenc.c
>> @@ -76,6 +76,7 @@ typedef enum HLSFlags {
>>      HLS_SECOND_LEVEL_SEGMENT_INDEX = (1 << 8), // include segment index
>> in segment filenames when use_localtime  e.g.: %%03d
>>      HLS_SECOND_LEVEL_SEGMENT_DURATION = (1 << 9), // include segment
>> duration (microsec) in segment filenames when use_localtime  e.g.: %%09t
>>      HLS_SECOND_LEVEL_SEGMENT_SIZE = (1 << 10), // include segment size
>> (bytes) in segment filenames when use_localtime  e.g.: %%014s
>> +    HLS_TEMP_FILE = (1 << 11),
>>  } HLSFlags;
>>
>>  typedef enum {
>> @@ -416,6 +417,7 @@ static int hls_mux_init(AVFormatContext *s)
>>          return ret;
>>      oc = hls->avf;
>>
>> +    oc->filename[0]        = '\0';
>>      oc->oformat            = hls->oformat;
>>      oc->interrupt_callback = s->interrupt_callback;
>>      oc->max_delay          = s->max_delay;
>> @@ -815,6 +817,15 @@ static int hls_start(AVFormatContext *s)
>>      char *filename, iv_string[KEYSIZE*2 + 1];
>>      int err = 0;
>>
>> +    if ((c->flags & HLS_TEMP_FILE) && oc->filename[0] != 0) {
>> +        size_t len = strlen(oc->filename);
>> +        char final_filename[sizeof(oc->filename)];
>> +        av_strlcpy(final_filename, oc->filename, len);
>> +        final_filename[len-4] = '\0';
>> +        ff_rename(oc->filename, final_filename, s);
>> +        oc->filename[len-4] = '\0';
>> +    }
>> +
>>      if (c->flags & HLS_SINGLE_FILE) {
>>          av_strlcpy(oc->filename, c->basename,
>>                     sizeof(oc->filename));
>> @@ -915,6 +926,10 @@ static int hls_start(AVFormatContext *s)
>>
>>      set_http_options(&options, c);
>>
>> +    if (c->flags & HLS_TEMP_FILE) {
>> +        av_strlcat(oc->filename, ".tmp", sizeof(oc->filename));
>> +    }
>> +
>>      if (c->key_info_file) {
>>          if ((err = hls_encryption_start(s)) < 0)
>>              goto fail;
>> @@ -1364,6 +1379,15 @@ static int hls_write_trailer(struct
>> AVFormatContext *s)
>>           ff_rename(old_filename, hls->avf->filename, hls);
>>      }
>>
>> +    if ((hls->flags & HLS_TEMP_FILE) && oc->filename[0] != 0) {
>> +        size_t len = strlen(oc->filename);
>> +        char final_filename[sizeof(oc->filename)];
>> +        av_strlcpy(final_filename, oc->filename, len);
>> +        final_filename[len-4] = '\0';
>> +        ff_rename(oc->filename, final_filename, s);
>> +        oc->filename[len-4] = '\0';
>> +    }
>> +
>>      if (vtt_oc) {
>>          if (vtt_oc->pb)
>>              av_write_trailer(vtt_oc);
>> @@ -1406,6 +1430,7 @@ static const AVOption options[] = {
>>      {"hls_subtitle_path",     "set path of hls subtitles",
>> OFFSET(subtitle_filename), AV_OPT_TYPE_STRING, {.str = NULL},  0, 0,    E},
>>      {"hls_flags",     "set flags affecting HLS playlist and media file
>> generation", OFFSET(flags), AV_OPT_TYPE_FLAGS, {.i64 = 0 }, 0, UINT_MAX, E,
>> "flags"},
>>      {"single_file",   "generate a single media file indexed with byte
>> ranges", 0, AV_OPT_TYPE_CONST, {.i64 = HLS_SINGLE_FILE }, 0, UINT_MAX,   E,
>> "flags"},
>> +    {"temp_file", "write segment to temporary file and rename when
>> complete", 0, AV_OPT_TYPE_CONST, {.i64 = HLS_TEMP_FILE }, 0, UINT_MAX,   E,
>> "flags"},
>>      {"delete_segments", "delete segment files that are no longer part of
>> the playlist", 0, AV_OPT_TYPE_CONST, {.i64 = HLS_DELETE_SEGMENTS }, 0,
>> UINT_MAX,   E, "flags"},
>>      {"round_durations", "round durations in m3u8 to whole numbers", 0,
>> AV_OPT_TYPE_CONST, {.i64 = HLS_ROUND_DURATIONS }, 0, UINT_MAX,   E,
>> "flags"},
>>      {"discont_start", "start the playlist with a discontinuity tag", 0,
>> AV_OPT_TYPE_CONST, {.i64 = HLS_DISCONT_START }, 0, UINT_MAX,   E, "flags"},
>> --
>> 2.10.1 (Apple Git-78)
>>
>> _______________________________________________
>> ffmpeg-devel mailing list
>> ffmpeg-devel at ffmpeg.org
>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>
>
>
> LGTM!
>

Documentation please!


More information about the ffmpeg-devel mailing list