diff --git a/Changelog b/Changelog index 9eec45c997..00dc6404ad 100644 --- a/Changelog +++ b/Changelog @@ -50,6 +50,7 @@ version : - documentation split into per-component manuals - pp (postproc) filter ported from MPlayer - NIST Sphere demuxer +- av_basename and av_dirname version 1.0: diff --git a/doc/APIchanges b/doc/APIchanges index b463749eba..a79dd2df58 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -132,6 +132,9 @@ API changes, most recent first: 2012-03-26 - a67d9cf - lavfi 2.66.100 Add avfilter_fill_frame_from_{audio_,}buffer_ref() functions. +2012-xx-xx - xxxxxxx - lavu 52.2.1 - avstring.h + Add av_basename() and av_dirname(). + 2012-11-10 - 5980f5dd - lavu 52.2.0 - audioconvert.h Rename audioconvert.h to channel_layout.h. audioconvert.h is now deprecated. diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c index e85c8b0b53..75ae134649 100644 --- a/libavformat/hlsenc.c +++ b/libavformat/hlsenc.c @@ -85,7 +85,8 @@ static int append_entry(HLSContext *hls, uint64_t duration) if (!en) return AVERROR(ENOMEM); - av_get_frame_filename(en->name, sizeof(en->name), hls->basename, + av_get_frame_filename(en->name, sizeof(en->name), + av_basename(hls->basename), hls->number -1); en->duration = duration; @@ -260,9 +261,12 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) av_compare_ts(pkt->pts, st->time_base, end_pts, AV_TIME_BASE_Q) >= 0 && pkt->flags & AV_PKT_FLAG_KEY) { - append_entry(hls, av_rescale(pkt->pts - hls->end_pts, - st->time_base.num, - st->time_base.den)); + ret = append_entry(hls, av_rescale(pkt->pts - hls->end_pts, + st->time_base.num, + st->time_base.den)); + if (ret) + return ret; + hls->end_pts = pkt->pts; av_write_frame(oc, NULL); /* Flush any buffered data */ diff --git a/libavutil/avstring.c b/libavutil/avstring.c index f03df67441..7072a55cf3 100644 --- a/libavutil/avstring.c +++ b/libavutil/avstring.c @@ -25,6 +25,8 @@ #include #include #include "avstring.h" +#include "config.h" +#include "common.h" #include "mem.h" int av_strstart(const char *str, const char *pfx, const char **ptr) @@ -211,6 +213,45 @@ int av_strncasecmp(const char *a, const char *b, size_t n) return c1 - c2; } +const char *av_basename(const char *path) +{ + char *p = strrchr(path, '/'); + +#if HAVE_DOS_PATHS + char *q = strrchr(path, '\\'); + char *d = strchr(path, ':'); + + p = FFMAX3(p, q, d); +#endif + + if (!p) + return path; + + return p + 1; +} + +const char *av_dirname(char *path) +{ + char *p = strrchr(path, '/'); + +#if HAVE_DOS_PATHS + char *q = strrchr(path, '\\'); + char *d = strchr(path, ':'); + + d = d ? d + 1 : d; + + p = FFMAX3(p, q, d); +#endif + + if (!p) + return "."; + + *p = '\0'; + + return path; +} + + #ifdef TEST #include "common.h" diff --git a/libavutil/avstring.h b/libavutil/avstring.h index f73d6e7420..d7af9ec7c3 100644 --- a/libavutil/avstring.h +++ b/libavutil/avstring.h @@ -202,6 +202,22 @@ int av_strcasecmp(const char *a, const char *b); */ int av_strncasecmp(const char *a, const char *b, size_t n); + +/** + * Thread safe basename. + * @param path the path, on DOS both \ and / are considered separators. + * @return pointer to the basename substring. + */ +const char *av_basename(const char *path); + +/** + * Thread safe dirname. + * @param path the path, on DOS both \ and / are considered separators. + * @return the path with the separator replaced by the string terminator or ".". + * @note the function may change the input string. + */ +const char *av_dirname(char *path); + /** * @} */ diff --git a/libavutil/version.h b/libavutil/version.h index f5ccd1ff2b..e47e0d12b3 100644 --- a/libavutil/version.h +++ b/libavutil/version.h @@ -75,7 +75,7 @@ */ #define LIBAVUTIL_VERSION_MAJOR 52 -#define LIBAVUTIL_VERSION_MINOR 12 +#define LIBAVUTIL_VERSION_MINOR 13 #define LIBAVUTIL_VERSION_MICRO 100 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \