[FFmpeg-devel] [PATCH] avformat/hlsenc: detecting duplicated segment filenames

Steven Liu lingjiujianke at gmail.com
Mon Dec 26 11:55:24 EET 2016


2016-12-26 17:05 GMT+08:00 Steven Liu <lingjiujianke at gmail.com>:

>
>
> 2016-12-26 9:14 GMT+08:00 Bodecs Bela <bodecsb at vivanet.hu>:
>
>> Dear All,
>>
>> with use_localtime parameter hlsenc may produce identical filenames for
>> different but still existing segments. It happens when
>> hls_segment_filename contains
>> syntacticaly correct but inadequate format parameters. Currently there
>> is no any log message when such a situaton occurs but these cases should
>> be avoided in most times. This patch generate warning log messages in
>> these
>> cases.
>>
>> best regards,
>>
>> bb
>>
>>> From 7055e0b0bec3fee61373dd446bcab24d15117b7e Mon Sep 17 00:00:00 2001
>>
>> From: Bela Bodecs <bodecsb at vivanet.hu>
>>
>> Date: Mon, 26 Dec 2016 02:00:49 +0100
>>
>> Subject: [PATCH] avformat/hlsenc: detecting duplicated segment filenames
>>
>>
>>> with use_localtime parameter hlsenc may produce identical filenames for
>>
>> different but still existing segments. It happens when
>>
>> hls_segment_filename contains
>>
>> syntacticaly correct but inadequate format parameters. Currently there
>>
>> is no any log message when such a situaton occurs but these cases should
>>
>> be avoided in most times. This patch generate warning messages in these
>>
>> cases.
>>
>>
>>> Signed-off-by: Bela Bodecs <bodecsb at vivanet.hu>
>>
>> ---
>>
>>  libavformat/hlsenc.c | 34 ++++++++++++++++++++++++++++++++++
>>
>>  1 file changed, 34 insertions(+)
>>
>>
>>> diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
>>
>> index acf3a30..11ec3b8 100644
>>
>> --- a/libavformat/hlsenc.c
>>
>> +++ b/libavformat/hlsenc.c
>>
>> @@ -653,6 +653,38 @@ fail:
>>
>>      return ret;
>>
>>  }
>>
>>
>>
>> +static HLSSegment * find_segment_by_filename(HLSSegment * segment,
>>> const char * filename)
>>
>> +{
>>
>> +    /* filename may contain rel/abs path, but segments store only
>>> basename */
>>
>> +    char *p, *dirname, *path;
>>
>> +    int path_size;
>>
>> +    HLSSegment *ret_segment = NULL;
>>
>> +    dirname = av_strdup(filename);
>>
>> +    if (!dirname)
>>
>> +        return NULL;
>>
>> +    p = (char *)av_basename(dirname); // av_dirname would return . in
>>> case of no dir
>>
>> +    *p = '\0'; // maybe empty
>>
>> +
>>
>> +    while (segment) {
>>
>> +        path_size = strlen(dirname) + strlen(segment->filename) + 1;
>>
>> +        path = av_malloc(path_size);
>>
>> +        if (!path)
>>
>> +            goto end;
>>
>> +        av_strlcpy(path, dirname, path_size);
>>
>> +        av_strlcat(path, segment->filename, path_size);
>>
>> +        if (!strcmp(path,filename)) {
>>
>> +            ret_segment = segment;
>>
>> +            av_free(path);
>>
>> +            goto end;
>>
>> +        }
>>
>> +        av_free(path);
>>
>> +        segment = segment->next;
>>
>> +    }
>>
>> +end:
>>
>> +    av_free(dirname);
>>
>> +    return ret_segment;
>>
>> +}
>>
>> +
>>
>>  static int hls_start(AVFormatContext *s)
>>
>>  {
>>
>>      HLSContext *c = s->priv_data;
>>
>> @@ -685,6 +717,8 @@ static int hls_start(AVFormatContext *s)
>>
>>                  av_log(oc, AV_LOG_ERROR, "Could not get segment filename
>>> with use_localtime\n");
>>
>>                  return AVERROR(EINVAL);
>>
>>              }
>>
>> +            if (find_segment_by_filename(c->segments, oc->filename) ||
>>> find_segment_by_filename(c->old_segments, oc->filename))
>>
>> +                av_log(c, AV_LOG_WARNING, "Duplicated segment filename
>>> detected: %s\n",oc->filename);
>>
>>
>>
>>              if (c->use_localtime_mkdir) {
>>
>>                  const char *dir;
>>
>> --
>>
>> 2.5.3.windows.1
>>
>>
>>>
> LTGM
>
>
>
>
>>
>>
>> _______________________________________________
>> ffmpeg-devel mailing list
>> ffmpeg-devel at ffmpeg.org
>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>
>>
>

localhost:mpegts liuqi$ ./ffmpeg -loglevel info   -y -f lavfi -i
color=c=red:size=640x480:r=25 -f lavfi -f lavfi -i
color=c=pink:size=1920x1080:r=25 -f lavfi -i anullsrc=r=44100:cl=stereo  -f
lavfi -i anullsrc=r=44100:cl=stereo -filter_complex
"[1]setpts=PTS-STARTPTS[1o]; [0:v]setpts=PTS-STARTPTS [0vo]; [1o][0vo]
overlay=x=10:y=10 ,  split=3 [v1][v2][vimg] ; [v1] scale=size=960x540,
setdar=dar=16/9, nullsink ; [v2] scale=size=640x360,  setdar=dar=16/9 ,
nullsink ; [vimg] fps=1/5, scale=size=320x180, nullsink ;
[3]asetpts=PTS-STARTPTS [0ao]; [2]asetpts=PTS-STARTPTS [2o]; [0ao][2o] amix
[aout1] "   -map "[aout1]"  -acodec aac -cutoff 20000 -ac 2 -ar 44100 -ab
192k  -f hls -hls_time 3 -hls_list_size 100 -hls_flags delete_segments
-use_localtime 1 -hls_segment_filename 'segment%Y%m%d%H%M%S.ts'
stream.m3u8}}}
ffmpeg version N-82932-g6e26b6e Copyright (c) 2000-2016 the FFmpeg
developers
  built with Apple LLVM version 8.0.0 (clang-800.0.42.1)
  configuration: --enable-fontconfig --enable-gpl --enable-libass
--enable-libbluray --enable-libfreetype --enable-libmp3lame
--enable-libspeex --enable-libx264 --enable-libx265 --enable-version3
--cc='ccache gcc'
  libavutil      55. 43.100 / 55. 43.100
  libavcodec     57. 70.100 / 57. 70.100
  libavformat    57. 61.100 / 57. 61.100
  libavdevice    57.  2.100 / 57.  2.100
  libavfilter     6. 68.100 /  6. 68.100
  libswscale      4.  3.101 /  4.  3.101
  libswresample   2.  4.100 /  2.  4.100
  libpostproc    54.  2.100 / 54.  2.100
Input #0, lavfi, from 'color=c=red:size=640x480:r=25':
  Duration: N/A, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: rawvideo (I420 / 0x30323449), yuv420p, 640x480 [SAR
1:1 DAR 4:3], 25 tbr, 25 tbn, 25 tbc
Input #1, lavfi, from 'color=c=pink:size=1920x1080:r=25':
  Duration: N/A, start: 0.000000, bitrate: N/A
    Stream #1:0: Video: rawvideo (I420 / 0x30323449), yuv420p, 1920x1080
[SAR 1:1 DAR 16:9], 25 tbr, 25 tbn, 25 tbc
Input #2, lavfi, from 'anullsrc=r=44100:cl=stereo':
  Duration: N/A, start: 0.000000, bitrate: 705 kb/s
    Stream #2:0: Audio: pcm_u8, 44100 Hz, stereo, u8, 705 kb/s
Input #3, lavfi, from 'anullsrc=r=44100:cl=stereo':
  Duration: N/A, start: 0.000000, bitrate: 705 kb/s
    Stream #3:0: Audio: pcm_u8, 44100 Hz, stereo, u8, 705 kb/s
[mpegts @ 0x7feb3b808400] frame size not set
Output #0, hls, to 'stream.m3u8}}}':
  Metadata:
    encoder         : Lavf57.61.100
    Stream #0:0: Audio: aac (LC), 44100 Hz, stereo, fltp, 192 kb/s (default)
    Metadata:
      encoder         : Lavc57.70.100 aac
Stream mapping:
  Stream #0:0 (rawvideo) -> setpts
  Stream #1:0 (rawvideo) -> setpts
  Stream #2:0 (pcm_u8) -> asetpts
  Stream #3:0 (pcm_u8) -> asetpts
  amix -> Stream #0:0 (aac)
Press [q] to stop, [?] for help
[hls muxer @ 0x7feb3c02a800] Duplicated segment filename detected:
segment20161226175432.ts
[hls muxer @ 0x7feb3c02a800] Duplicated segment filename detected:
segment20161226175433.ts
    Last message repeated 1 times
[hls muxer @ 0x7feb3c02a800] Duplicated segment filename detected:
segment20161226175434.ts
[hls muxer @ 0x7feb3c02a800] Duplicated segment filename detected:
segment20161226175436.ts
[hls muxer @ 0x7feb3c02a800] Duplicated segment filename detected:
segment20161226175436.ts
    Last message repeated 1 times
[hls muxer @ 0x7feb3c02a800] Duplicated segment filename detected:
segment20161226175438.ts
[hls muxer @ 0x7feb3c02a800] Duplicated segment filename detected:
segment20161226175439.ts
[hls muxer @ 0x7feb3c02a800] Duplicated segment filename detected:
segment20161226175439.ts
[hls muxer @ 0x7feb3c02a800] Duplicated segment filename detected:
segment20161226175440.ts
size=N/A time=00:01:05.03 bitrate=N/A speed=5.93x
video:0kB audio:17kB subtitle:0kB other streams:0kB global headers:0kB
muxing overhead: unknown
[aac @ 0x7feb3c02be00] Qavg: 65536.000
Exiting normally, received signal 2.
localhost:mpegts liuqi$ cat stream.m3u8}}}
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:4
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:3.018600,
segment20161226175430.ts
#EXTINF:2.995367,
segment20161226175431.ts
#EXTINF:2.995378,
segment20161226175432.ts
#EXTINF:2.995378,
segment20161226175432.ts
#EXTINF:2.995367,
segment20161226175433.ts
#EXTINF:3.018600,
segment20161226175433.ts
#EXTINF:2.995378,
segment20161226175433.ts
#EXTINF:2.995367,
segment20161226175434.ts
#EXTINF:2.995378,
segment20161226175434.ts
#EXTINF:2.995378,
segment20161226175435.ts
#EXTINF:3.018589,
segment20161226175436.ts
#EXTINF:2.995378,
segment20161226175436.ts
#EXTINF:2.995367,
segment20161226175436.ts
#EXTINF:2.995378,
segment20161226175436.ts
#EXTINF:2.995378,
segment20161226175437.ts
#EXTINF:3.018589,
segment20161226175438.ts
#EXTINF:2.995378,
segment20161226175438.ts
#EXTINF:2.995378,
segment20161226175439.ts
#EXTINF:2.995367,
segment20161226175439.ts
#EXTINF:2.995378,
segment20161226175439.ts
#EXTINF:3.018589,
segment20161226175440.ts
#EXTINF:2.020144,
segment20161226175440.ts
#EXT-X-ENDLIST





Tested pass!


More information about the ffmpeg-devel mailing list