diff options
Diffstat (limited to 'libavformat/hlsenc.c')
-rw-r--r-- | libavformat/hlsenc.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c index acf3a301af..e46e9b4270 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 = NULL, *dirname = NULL, *path = NULL; + 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; @@ -686,6 +718,10 @@ static int hls_start(AVFormatContext *s) 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; char *fn_copy = av_strdup(oc->filename); |