diff mbox

[FFmpeg-devel] libavformat/hlsenc: fix delete_segments when use_localtime_mkdir

Message ID 19981fca-7a89-f83c-3f83-ec20bc049a19@vivanet.hu
State Accepted
Headers show

Commit Message

Bodecs Bela Dec. 28, 2016, 11:45 p.m. UTC
Dear All,

when delete_segments hls_flag is specified, deleting old segments may 
fail in certain cases when use_localtime_mkdir is in effect and 
hls_segment_filename expression contains subdirs. This patch fixes this 
behaviour.

Command to reproduce the bug:

ffmpeg -loglevel info -y -re -f lavfi -i color=c=red:size=640x480:r=25 
-f lavfi -i anullsrc=r=44100:cl=stereo -c:v mpeg2video -g 25 -acodec aac 
-cutoff 20000 -ac 2 -ar 44100 -ab 192k -f hls -hls_time 3 -hls_list_size 
5 -hls_flags delete_segments -use_localtime_mkdir 1 -use_localtime 1  
-hls_segment_filename "bb/bb%Y%m%d%H%I%S.ts" stream.m3u8


thank you in advance,

Bela Bodecs
diff mbox

Patch

From ac4c24c2826d2704e595fbde515b184429a64073 Mon Sep 17 00:00:00 2001
From: Bela Bodecs <bodecsb@vivanet.hu>
Date: Thu, 29 Dec 2016 00:30:00 +0100
Subject: [PATCH 1/1] libavformat/hlsenc: fix delete_segments when
 use_localtime_mkdir

When delete_segments hls_flag is specified, deleting old segments may
fail in certain cases when use_localtime_mkdir is in effect and
hls_segment_filename expression contains subdirs. This patch fixes this
behaviour.

Signed-off-by: Bela Bodecs <bodecsb@vivanet.hu>
---
 libavformat/hlsenc.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
index cf4d4bd..c9d8e3c 100644
--- a/libavformat/hlsenc.c
+++ b/libavformat/hlsenc.c
@@ -194,7 +194,7 @@  static int hls_delete_old_segments(HLSContext *hls) {
         }
     }
 
-    if (segment) {
+    if (segment && !hls->use_localtime_mkdir) {
         if (hls->segment_filename) {
             dirname = av_strdup(hls->segment_filename);
         } else {
@@ -211,15 +211,20 @@  static int hls_delete_old_segments(HLSContext *hls) {
     while (segment) {
         av_log(hls, AV_LOG_DEBUG, "deleting old segment %s\n",
                                   segment->filename);
-        path_size = strlen(dirname) + strlen(segment->filename) + 1;
+        path_size =  (hls->use_localtime_mkdir ? 0 : strlen(dirname)) + strlen(segment->filename) + 1;
         path = av_malloc(path_size);
         if (!path) {
             ret = AVERROR(ENOMEM);
             goto fail;
         }
 
-        av_strlcpy(path, dirname, path_size);
-        av_strlcat(path, segment->filename, path_size);
+        if (hls->use_localtime_mkdir)
+            av_strlcpy(path, segment->filename, path_size);
+        else { // segment->filename contains basename only
+            av_strlcpy(path, dirname, path_size);
+            av_strlcat(path, segment->filename, path_size);
+        }
+
         if (unlink(path) < 0) {
             av_log(hls, AV_LOG_ERROR, "failed to delete old segment %s: %s\n",
                                      path, strerror(errno));
-- 
2.5.3.windows.1