diff mbox

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

Message ID 265596b3-7944-f533-5bf3-76a8781f3c09@vivanet.hu
State Accepted
Headers show

Commit Message

Bodecs Bela Dec. 26, 2016, 1:14 a.m. UTC
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

Comments

Steven Liu Dec. 26, 2016, 9:05 a.m. UTC | #1
2016-12-26 9:14 GMT+08:00 Bodecs Bela <bodecsb@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@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@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@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
>
Steven Liu Dec. 26, 2016, 9:55 a.m. UTC | #2
2016-12-26 17:05 GMT+08:00 Steven Liu <lingjiujianke@gmail.com>:

>
>
> 2016-12-26 9:14 GMT+08:00 Bodecs Bela <bodecsb@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@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@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@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!
Steven Liu Dec. 26, 2016, 10:22 a.m. UTC | #3
2016-12-26 17:55 GMT+08:00 Steven Liu <lingjiujianke@gmail.com>:

>
>
> 2016-12-26 17:05 GMT+08:00 Steven Liu <lingjiujianke@gmail.com>:
>
>>
>>
>> 2016-12-26 9:14 GMT+08:00 Bodecs Bela <bodecsb@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@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@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@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!
>
>
>
applied!


Thanks
diff mbox

Patch

From 7055e0b0bec3fee61373dd446bcab24d15117b7e Mon Sep 17 00:00:00 2001
From: Bela Bodecs <bodecsb@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@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