[FFmpeg-devel] [PATCH 6/6] avformat/hlsenc: Simplify setting base_output_dirname
Andreas Rheinhardt
andreas.rheinhardt at gmail.com
Sat May 9 22:15:09 EEST 2020
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>
---
The usage of fmp4_init_filename_len is weird: It is basically used for
two different purposes: The length of vs->fmp4_init_filename_len and the
length of vs->base_output_dirname (this name is btw misleading because
it is not a dirname at all). And given that it's scope is the whole
function, the second time vs->fmp4_init_filename was allocated it also
contained enough space to contain the whole of vs->m3u8_name.
Furthermore, there seems to be a misconception in the way the
fmp4_init_filename_len is calculated in case of more than one
varstreams: It is incremented by strlen("_%d"), yet the string is not
built by inserting "_%d" into the other string; instead if no %v is
present in the string and if there is more than varstream, then it is
created by inserting "_%d", where %d is replace by the actual index of
the varstream. And this can take more than three bytes. But it is not
dangerous: fmp4_init_filename_len is incremented by strlen("_%d") on
every iteration of the loop.
I also pondered using av_append_path_component() in the case that p is
not NULL below; yet this might swallow a "/" and I don't know if it
would make a difference. (Is it actually allowed to use an absolute path
for hls->fmp4_init_filename? If one does so, said path will still be
treated as relative to the directory of vs->m3u8_name.)
I can also give vs->fmp4_init_filename a similar treatment; yet before
doing so I'd like to know if it is intentional that a "%v" in
hls->fmp4_init_filename only gets replaced if there is more than one
varstream (in other cases a %v also gets replaced when one only has one
varstream).
libavformat/hlsenc.c | 24 +++++++++---------------
1 file changed, 9 insertions(+), 15 deletions(-)
diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
index d80852739e..be54957e9d 100644
--- a/libavformat/hlsenc.c
+++ b/libavformat/hlsenc.c
@@ -2908,24 +2908,18 @@ static int hls_init(AVFormatContext *s)
return ret;
}
- fmp4_init_filename_len = strlen(vs->m3u8_name) +
- strlen(vs->fmp4_init_filename) + 1;
-
- vs->base_output_dirname = av_malloc(fmp4_init_filename_len);
- if (!vs->base_output_dirname)
- return AVERROR(ENOMEM);
-
- av_strlcpy(vs->base_output_dirname, vs->m3u8_name,
- fmp4_init_filename_len);
- p = strrchr(vs->base_output_dirname, '/');
+ p = strrchr(vs->m3u8_name, '/');
if (p) {
- *(p + 1) = '\0';
- av_strlcat(vs->base_output_dirname, vs->fmp4_init_filename,
- fmp4_init_filename_len);
+ char tmp = *(++p);
+ *p = '\0';
+ vs->base_output_dirname = av_asprintf("%s%s", vs->m3u8_name,
+ vs->fmp4_init_filename);
+ *p = tmp;
} else {
- av_strlcpy(vs->base_output_dirname, vs->fmp4_init_filename,
- fmp4_init_filename_len);
+ vs->base_output_dirname = av_strdup(vs->fmp4_init_filename);
}
+ if (!vs->base_output_dirname)
+ return AVERROR(ENOMEM);
}
}
--
2.20.1
More information about the ffmpeg-devel
mailing list