|  | @@ -653,6 +653,38 @@ fail: | 
														
													
														
															
																|  |  | return ret; |  |  | 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) |  |  | static int hls_start(AVFormatContext *s) | 
														
													
														
															
																|  |  | { |  |  | { | 
														
													
														
															
																|  |  | HLSContext *c = s->priv_data; |  |  | HLSContext *c = s->priv_data; | 
														
													
												
													
														
															
																|  | @@ -686,6 +718,10 @@ static int hls_start(AVFormatContext *s) | 
														
													
														
															
																|  |  | return AVERROR(EINVAL); |  |  | 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) { |  |  | if (c->use_localtime_mkdir) { | 
														
													
														
															
																|  |  | const char *dir; |  |  | const char *dir; | 
														
													
														
															
																|  |  | char *fn_copy = av_strdup(oc->filename); |  |  | char *fn_copy = av_strdup(oc->filename); | 
														
													
												
													
														
															
																|  | 
 |