diff --git a/doc/APIchanges b/doc/APIchanges index 992a3b06e8..26271c86da 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -13,6 +13,10 @@ libavutil: 2013-12-xx API changes, most recent first: +2014-04-xx - xxxxxxx - lavu 53.10.0 - replaygain.h + Full scale for peak values is now 100000 (instead of UINT32_MAX) and values + may overflow. + 2014-04-xx - xxxxxxx - lavu 53.09.0 - log.h Add AV_LOG(c) macro to have 256 color debug messages. diff --git a/libavformat/replaygain.c b/libavformat/replaygain.c index 6983601491..c123a63985 100644 --- a/libavformat/replaygain.c +++ b/libavformat/replaygain.c @@ -35,7 +35,7 @@ #include "avformat.h" #include "replaygain.h" -static int32_t parse_gain(const char *gain) +static int32_t parse_value(const char *value, int32_t min) { char *fraction; int scale = 10000; @@ -43,15 +43,15 @@ static int32_t parse_gain(const char *gain) int sign = 1; int db; - if (!gain) - return INT32_MIN; + if (!value) + return min; - gain += strspn(gain, " \t"); + value += strspn(value, " \t"); - if (*gain == '-') + if (*value == '-') sign = -1; - db = strtol(gain, &fraction, 0); + db = strtol(value, &fraction, 0); if (*fraction++ == '.') { while (av_isdigit(*fraction) && scale) { mb += scale * (*fraction - '0'); @@ -61,43 +61,11 @@ static int32_t parse_gain(const char *gain) } if (abs(db) > (INT32_MAX - mb) / 100000) - return INT32_MIN; + return min; return db * 100000 + sign * mb; } -static uint32_t parse_peak(const uint8_t *peak) -{ - int64_t val = 0; - int64_t scale = 1; - - if (!peak) - return 0; - - peak += strspn(peak, " \t"); - - if (peak[0] == '1' && peak[1] == '.') - return UINT32_MAX; - else if (!(peak[0] == '0' && peak[1] == '.')) - return 0; - - peak += 2; - - while (av_isdigit(*peak)) { - int digit = *peak - '0'; - - if (scale > INT64_MAX / 10) - break; - - val = 10 * val + digit; - scale *= 10; - - peak++; - } - - return av_rescale(val, UINT32_MAX, scale); -} - static int replaygain_export(AVStream *st, const uint8_t *track_gain, const uint8_t *track_peak, const uint8_t *album_gain, const uint8_t *album_peak) @@ -108,10 +76,10 @@ static int replaygain_export(AVStream *st, int32_t tg, ag; uint32_t tp, ap; - tg = parse_gain(track_gain); - ag = parse_gain(album_gain); - tp = parse_peak(track_peak); - ap = parse_peak(album_peak); + tg = parse_value(track_gain, INT32_MIN); + ag = parse_value(album_gain, INT32_MIN); + tp = parse_value(track_peak, 0); + ap = parse_value(album_peak, 0); if (tg == INT32_MIN && ag == INT32_MIN) return 0; diff --git a/libavutil/replaygain.h b/libavutil/replaygain.h index 8447703fbf..7871d2c762 100644 --- a/libavutil/replaygain.h +++ b/libavutil/replaygain.h @@ -34,8 +34,8 @@ typedef struct AVReplayGain { */ int32_t track_gain; /** - * Peak track amplitude, with UINT32_MAX representing full scale. 0 when - * unknown. + * Peak track amplitude, with 100000 representing full scale (but values + * may overflow). 0 when unknown. */ uint32_t track_peak; /** diff --git a/libavutil/version.h b/libavutil/version.h index f8bb4479e2..e920653e8b 100644 --- a/libavutil/version.h +++ b/libavutil/version.h @@ -54,7 +54,7 @@ */ #define LIBAVUTIL_VERSION_MAJOR 53 -#define LIBAVUTIL_VERSION_MINOR 9 +#define LIBAVUTIL_VERSION_MINOR 10 #define LIBAVUTIL_VERSION_MICRO 0 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \