[FFmpeg-devel] [PATCH v2] expand hls_fmp4_init_filename with strftime()

Andreas Rheinhardt andreas.rheinhardt at gmail.com
Sat Oct 24 18:32:41 EEST 2020


Steven Liu:
> Nikola Pajkovsky <nikis at pajkis.cz> 于2020年10月23日周五 下午2:21写道:
>>
>> init.mp4 can be expanded with strftime() the same way as
>> hls_segment_filename.
>>
>> Signed-off-by: Nikola Pajkovsky <nikis at pajkis.cz>
>> ---
>>  v2: fix memleak on strftime failure
>>
>>  doc/muxers.texi      |  7 ++++++
>>  libavformat/hlsenc.c | 54 +++++++++++++++++++++++++++++++++++---------
>>  2 files changed, 50 insertions(+), 11 deletions(-)
>>
>> diff --git a/doc/muxers.texi b/doc/muxers.texi
>> index 813b4678f409..179b9239517b 100644
>> --- a/doc/muxers.texi
>> +++ b/doc/muxers.texi
>> @@ -859,6 +859,13 @@ fmp4 files may be used in HLS version 7 and above.
>>  @item hls_fmp4_init_filename @var{filename}
>>  Set filename to the fragment files header file, default filename is @file{init.mp4}.
>>
>> +Use @code{-strftime 1} on @var{filename} to expand the segment filename with localtime.
>> + at example
>> +ffmpeg -i in.nut  -hls_segment_type fmp4 -strftime 1 -hls_fmp4_init_filename "%s_init.mp4" out.m3u8
>> + at end example
>> +This will produce init like this
>> + at file{1602678741_init.mp4}
>> +
>>  @item hls_fmp4_init_resend
>>  Resend init file after m3u8 file refresh every time, default is @var{0}.
>>
>> diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
>> index cb31d6aed7cf..5adc2da99b58 100644
>> --- a/libavformat/hlsenc.c
>> +++ b/libavformat/hlsenc.c
>> @@ -258,6 +258,29 @@ typedef struct HLSContext {
>>      int has_video_m3u8; /* has video stream m3u8 list */
>>  } HLSContext;
>>
>> +static int strftime_expand(const char *fmt, char **dest)
>> +{
>> +    int r = 1;
>> +    time_t now0;
>> +    struct tm *tm, tmpbuf;
>> +    char *buf;
>> +
>> +    buf = av_mallocz(MAX_URL_SIZE);
>> +    if (!buf)
>> +        return AVERROR(ENOMEM);
>> +
>> +    time(&now0);
>> +    tm = localtime_r(&now0, &tmpbuf);
>> +    r = strftime(buf, MAX_URL_SIZE, fmt, tm);
>> +    if (!r) {
>> +        free(buf);

av_free, not free.

>> +        return AVERROR(EINVAL);
>> +    }
>> +    *dest = buf;
>> +
>> +    return r;
>> +}
>> +
>>  static int hlsenc_io_open(AVFormatContext *s, AVIOContext **pb, char *filename,
>>                            AVDictionary **options)
>>  {
>> @@ -1614,19 +1637,15 @@ static int hls_start(AVFormatContext *s, VariantStream *vs)
>>          ff_format_set_url(oc, filename);
>>      } else {
>>          if (c->use_localtime) {
>> -            time_t now0;
>> -            struct tm *tm, tmpbuf;
>> -            int bufsize = strlen(vs->basename) + MAX_URL_SIZE;
>> -            char *buf = av_mallocz(bufsize);
>> -            if (!buf)
>> -                return AVERROR(ENOMEM);
>> -            time(&now0);
>> -            tm = localtime_r(&now0, &tmpbuf);
>> -            ff_format_set_url(oc, buf);
>> -            if (!strftime(oc->url, bufsize, vs->basename, tm)) {
>> +            int r;
>> +            char *expanded = NULL;
>> +
>> +            r = strftime_expand(vs->basename, &expanded);
>> +            if (r < 0) {
>>                  av_log(oc, AV_LOG_ERROR, "Could not get segment filename with strftime\n");
>> -                return AVERROR(EINVAL);
>> +                return r;
>>              }
>> +            ff_format_set_url(oc, expanded);
>>
>>              err = sls_flag_use_localtime_filename(oc, c, vs);
>>              if (err < 0) {
>> @@ -2929,6 +2948,19 @@ static int hls_init(AVFormatContext *s)
>>                          return ret;
>>                  }
>>
>> +                if (hls->use_localtime) {
>> +                    int r;
>> +                    char *expanded = NULL;
>> +
>> +                    r = strftime_expand(vs->fmp4_init_filename, &expanded);
>> +                    if (r < 0) {
>> +                      av_log(s, AV_LOG_ERROR, "Could not get segment filename with strftime\n");
>> +                      return r;
>> +                   }
>> +                   av_free(vs->fmp4_init_filename);
>> +                   vs->fmp4_init_filename = expanded;
>> +               }
>> +
>>                  p = strrchr(vs->m3u8_name, '/');
>>                  if (p) {
>>                      char tmp = *(++p);
>> --
>> 2.28.0
>>
>> _______________________________________________
>> ffmpeg-devel mailing list
>> ffmpeg-devel at ffmpeg.org
>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>
>> To unsubscribe, visit link above, or email
>> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
> 
> lgtm, waiting for other reviewer comments, will push after 24 hours if
> there have no more comments,
> 
> 
> Thanks
> Steven
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
> 



More information about the ffmpeg-devel mailing list