Merge commit '9752d07d33d5370f7819865fbb5e582b982aad06'
[ffmpeg.git] / libavcodec / wavpackenc.c
index 3cc74bd..63971c6 100644 (file)
 #include "wavpack.h"
 
 #define UPDATE_WEIGHT(weight, delta, source, result) \
-    if (source && result) { \
-        int32_t s = (int32_t) (source ^ result) >> 31; \
-        weight = (delta ^ s) + (weight - s); \
+    if ((source) && (result)) { \
+        int32_t s = (int32_t) ((source) ^ (result)) >> 31; \
+        weight = ((delta) ^ s) + ((weight) - s); \
     }
 
-#define APPLY_WEIGHT_F(weight, sample) (((((sample & 0xffff) * weight) >> 9) + \
-    (((sample & ~0xffff) >> 9) * weight) + 1) >> 1)
+#define APPLY_WEIGHT_F(weight, sample) ((((((sample) & 0xffff) * (weight)) >> 9) + \
+    ((((sample) & ~0xffff) >> 9) * (weight)) + 1) >> 1)
 
-#define APPLY_WEIGHT_I(weight, sample) ((weight * sample + 512) >> 10)
+#define APPLY_WEIGHT_I(weight, sample) (((weight) * (sample) + 512) >> 10)
 
-#define APPLY_WEIGHT(weight, sample) (sample != (short) sample ? \
+#define APPLY_WEIGHT(weight, sample) ((sample) != (short) (sample) ? \
     APPLY_WEIGHT_F(weight, sample) : APPLY_WEIGHT_I (weight, sample))
 
 #define CLEAR(destin) memset(&destin, 0, sizeof(destin));
@@ -135,7 +135,7 @@ static av_cold int wavpack_encode_init(AVCodecContext *avctx)
         else
             block_samples = avctx->sample_rate;
 
-        while (block_samples * avctx->channels > 150000)
+        while (block_samples * avctx->channels > WV_MAX_SAMPLES)
             block_samples /= 2;
 
         while (block_samples * avctx->channels < 40000)
@@ -638,7 +638,7 @@ static uint32_t log2sample(uint32_t v, int limit, uint32_t *result)
 
     if ((v += v >> 9) < (1 << 8)) {
         dbits = nbits_table[v];
-        result += (dbits << 8) + wp_log2_table[(v << (9 - dbits)) & 0xff];
+        *result += (dbits << 8) + wp_log2_table[(v << (9 - dbits)) & 0xff];
     } else {
         if (v < (1L << 16))
             dbits = nbits_table[v >> 8] + 8;
@@ -647,7 +647,7 @@ static uint32_t log2sample(uint32_t v, int limit, uint32_t *result)
         else
             dbits = nbits_table[v >> 24] + 24;
 
-        result += dbits = (dbits << 8) + wp_log2_table[(v >> (dbits - 9)) & 0xff];
+        *result += dbits = (dbits << 8) + wp_log2_table[(v >> (dbits - 9)) & 0xff];
 
         if (limit && dbits >= limit)
             return 1;
@@ -2482,11 +2482,14 @@ static int wavpack_encode_block(WavPackEncodeContext *s,
                                 uint8_t *out, int out_size)
 {
     int block_size, start, end, data_size, tcount, temp, m = 0;
-    int i, j, ret, got_extra = 0, nb_samples = s->block_samples;
+    int i, j, ret = 0, got_extra = 0, nb_samples = s->block_samples;
     uint32_t crc = 0xffffffffu;
     struct Decorr *dpp;
     PutByteContext pb;
 
+    if (s->flags & WV_MONO_DATA) {
+        CLEAR(s->w);
+    }
     if (!(s->flags & WV_MONO) && s->optimize_mono) {
         int32_t lor = 0, diff = 0;
 
@@ -2531,9 +2534,11 @@ static int wavpack_encode_block(WavPackEncodeContext *s,
 
     if ((s->flags & WV_FLOAT_DATA) || (s->flags & MAG_MASK) >> MAG_LSB >= 24) {
         av_fast_padded_malloc(&s->orig_l, &s->orig_l_size, sizeof(int32_t) * nb_samples);
-        av_fast_padded_malloc(&s->orig_r, &s->orig_r_size, sizeof(int32_t) * nb_samples);
         memcpy(s->orig_l, samples_l, sizeof(int32_t) * nb_samples);
-        memcpy(s->orig_r, samples_r, sizeof(int32_t) * nb_samples);
+        if (!(s->flags & WV_MONO_DATA)) {
+            av_fast_padded_malloc(&s->orig_r, &s->orig_r_size, sizeof(int32_t) * nb_samples);
+            memcpy(s->orig_r, samples_r, sizeof(int32_t) * nb_samples);
+        }
 
         if (s->flags & WV_FLOAT_DATA)
             got_extra = scan_float(s, samples_l, samples_r, nb_samples);
@@ -2811,6 +2816,8 @@ static int wavpack_encode_block(WavPackEncodeContext *s,
     block_size = bytestream2_tell_p(&pb);
     AV_WL32(out + 4, block_size - 8);
 
+    av_assert0(!bytestream2_get_eof(&pb));
+
     return block_size;
 }
 
@@ -2874,10 +2881,11 @@ static int wavpack_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
             return AVERROR(ENOMEM);
     }
 
-    if ((ret = ff_alloc_packet2(avctx, avpkt, s->block_samples * avctx->channels * 8)) < 0)
+    buf_size = s->block_samples * avctx->channels * 8
+             + 200 /* for headers */;
+    if ((ret = ff_alloc_packet2(avctx, avpkt, buf_size)) < 0)
         return ret;
     buf = avpkt->data;
-    buf_size = avpkt->size;
 
     for (s->ch_offset = 0; s->ch_offset < avctx->channels;) {
         set_samplerate(s);