From fb9187129c3d07ac6d0f7deaa27f1248394d8f91 Mon Sep 17 00:00:00 2001 From: Andreas Weis Date: Wed, 27 Apr 2016 08:15:17 +0200 Subject: [PATCH] avutil/log: added av_log_format_line2 which returns buffer length The new function behaves the same as av_log_format_line, but also forwards the return value from the underlying snprintf call. This will allow callers to accurately determine the size requirements for the line buffer. Signed-off-by: Andreas Weis Signed-off-by: Michael Niedermayer --- doc/APIchanges | 4 ++++ libavutil/log.c | 11 ++++++++++- libavutil/log.h | 17 +++++++++++++++++ libavutil/version.h | 4 ++-- 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/doc/APIchanges b/doc/APIchanges index de7280735a..d777dc0f40 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -15,6 +15,10 @@ libavutil: 2015-08-28 API changes, most recent first: +2016-04-27 - xxxxxxx - lavu 55.23.100 - log.h + Add a new function av_log_format_line2() which returns number of bytes + written to the target buffer. + 2016-xx-xx - xxxxxxx - lavc 57.37.100 - avcodec.h Add a new audio/video encoding and decoding API with decoupled input and output -- avcodec_send_packet(), avcodec_receive_frame(), diff --git a/libavutil/log.c b/libavutil/log.c index 45835195e1..0efba7ada4 100644 --- a/libavutil/log.c +++ b/libavutil/log.c @@ -283,11 +283,20 @@ static void format_line(void *avcl, int level, const char *fmt, va_list vl, void av_log_format_line(void *ptr, int level, const char *fmt, va_list vl, char *line, int line_size, int *print_prefix) +{ + av_log_format_line2(ptr, level, fmt, vl, line, line_size, print_prefix); +} + +int av_log_format_line2(void *ptr, int level, const char *fmt, va_list vl, + char *line, int line_size, int *print_prefix) { AVBPrint part[4]; + int ret; + format_line(ptr, level, fmt, vl, part, print_prefix, NULL); - snprintf(line, line_size, "%s%s%s%s", part[0].str, part[1].str, part[2].str, part[3].str); + ret = snprintf(line, line_size, "%s%s%s%s", part[0].str, part[1].str, part[2].str, part[3].str); av_bprint_finalize(part+3, NULL); + return ret; } void av_log_default_callback(void* ptr, int level, const char* fmt, va_list vl) diff --git a/libavutil/log.h b/libavutil/log.h index 321748cd80..9b1d66f521 100644 --- a/libavutil/log.h +++ b/libavutil/log.h @@ -317,6 +317,23 @@ AVClassCategory av_default_get_category(void *ptr); void av_log_format_line(void *ptr, int level, const char *fmt, va_list vl, char *line, int line_size, int *print_prefix); +/** + * Format a line of log the same way as the default callback. + * @param line buffer to receive the formatted line; + * may be NULL if line_size is 0 + * @param line_size size of the buffer; at most line_size-1 characters will + * be written to the buffer, plus one null terminator + * @param print_prefix used to store whether the prefix must be printed; + * must point to a persistent integer initially set to 1 + * @return Returns a negative value if an error occured, otherwise returns + * the number of characters that would have been written for a + * sufficiently large buffer, not including the terminating null + * character. If the return value is not less than line_size, it means + * that the log message was truncated to fit the buffer. + */ +int av_log_format_line2(void *ptr, int level, const char *fmt, va_list vl, + char *line, int line_size, int *print_prefix); + #if FF_API_DLOG /** * av_dlog macros diff --git a/libavutil/version.h b/libavutil/version.h index 24bd0d0ab3..57759dadbb 100644 --- a/libavutil/version.h +++ b/libavutil/version.h @@ -64,8 +64,8 @@ */ #define LIBAVUTIL_VERSION_MAJOR 55 -#define LIBAVUTIL_VERSION_MINOR 22 -#define LIBAVUTIL_VERSION_MICRO 101 +#define LIBAVUTIL_VERSION_MINOR 23 +#define LIBAVUTIL_VERSION_MICRO 100 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ LIBAVUTIL_VERSION_MINOR, \