avcodec/wavpackenc: handle INT32_MIN samples

abs() cannot represent the magnitude of INT32_MIN. labs() has the same issue on platforms where long is 32 bits. use FFABSU for the full signed sample range.

Signed-off-by: Ayoub Nabil Boubagrat <237098474+ayoubnabil@users.noreply.github.com>
(cherry picked from commit 4021d0d193)
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
Ayoub Nabil Boubagrat authored and Michael Niedermayer committed 2026-09-04 21:54:00 +02:00
1 parent 9fa9960cea
commit db019be35b
1 file changed
+7 -4
+7 -4
View File
@@ -663,8 +663,9 @@ static uint32_t log2mono(int32_t *samples, int nb_samples, int limit)
{
uint32_t result = 0;
while (nb_samples--) {
if (log2sample(abs(*samples++), limit, &result))
if (log2sample(FFABSU(samples[0]), limit, &result))
return UINT32_MAX;
samples++;
}
return result;
}
@@ -674,9 +675,11 @@ static uint32_t log2stereo(int32_t *samples_l, int32_t *samples_r,
{
uint32_t result = 0;
while (nb_samples--) {
if (log2sample(abs(*samples_l++), limit, &result) ||
log2sample(abs(*samples_r++), limit, &result))
if (log2sample(FFABSU(samples_l[0]), limit, &result) ||
log2sample(FFABSU(samples_r[0]), limit, &result))
return UINT32_MAX;
samples_l++;
samples_r++;
}
return result;
}
@@ -992,7 +995,7 @@ static void scan_word(WavPackEncodeContext *s, WvChannel *c,
samples += nb_samples - 1;
while (nb_samples--) {
uint32_t low, value = labs(samples[0]);
uint32_t low, value = FFABSU(samples[0]);
if (value < GET_MED(0)) {
DEC_MED(0);