summaryrefslogtreecommitdiffstats
path: root/libavcodec/wavpack.c
diff options
context:
space:
mode:
Diffstat (limited to 'libavcodec/wavpack.c')
-rw-r--r--libavcodec/wavpack.c33
1 files changed, 11 insertions, 22 deletions
diff --git a/libavcodec/wavpack.c b/libavcodec/wavpack.c
index fb0e0b2..e6dbab2 100644
--- a/libavcodec/wavpack.c
+++ b/libavcodec/wavpack.c
@@ -2,20 +2,20 @@
* WavPack lossless audio decoder
* Copyright (c) 2006,2011 Konstantin Shishkov
*
- * This file is part of Libav.
+ * This file is part of FFmpeg.
*
- * Libav is free software; you can redistribute it and/or
+ * FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
- * Libav is distributed in the hope that it will be useful,
+ * FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
- * License along with Libav; if not, write to the Free Software
+ * License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
@@ -112,8 +112,7 @@ typedef struct WavpackFrameContext {
int extra_bits;
int and, or, shift;
int post_shift;
- int hybrid, hybrid_bitrate;
- int hybrid_maxclip, hybrid_minclip;
+ int hybrid, hybrid_bitrate, hybrid_maxclip;
int float_flag;
int float_shift;
int float_max_exp;
@@ -413,10 +412,10 @@ static inline int wv_get_value_integer(WavpackFrameContext *s, uint32_t *crc,
}
bit = (S & s->and) | s->or;
- bit = ((S + bit) << s->shift) - bit;
+ bit = (((S + bit) << s->shift) - bit);
if (s->hybrid)
- bit = av_clip(bit, s->hybrid_minclip, s->hybrid_maxclip);
+ bit = av_clip(bit, -s->hybrid_maxclip - 1, s->hybrid_maxclip);
return bit << s->post_shift;
}
@@ -769,7 +768,7 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
const uint8_t *orig_buf = buf;
const uint8_t *buf_end = buf + buf_size;
int i, j, id, size, ssize, weights, t;
- int bpp, chan, chmask, orig_bpp;
+ int bpp, chan, chmask;
if (buf_size == 0) {
*got_frame_ptr = 0;
@@ -805,16 +804,15 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
s->frame_flags = AV_RL32(buf); buf += 4;
bpp = av_get_bytes_per_sample(avctx->sample_fmt);
samples = (uint8_t*)samples + bpp * wc->ch_offset;
- orig_bpp = ((s->frame_flags & 0x03) + 1) << 3;
s->stereo = !(s->frame_flags & WV_MONO);
s->stereo_in = (s->frame_flags & WV_FALSE_STEREO) ? 0 : s->stereo;
s->joint = s->frame_flags & WV_JOINT_STEREO;
s->hybrid = s->frame_flags & WV_HYBRID_MODE;
s->hybrid_bitrate = s->frame_flags & WV_HYBRID_BITRATE;
- s->post_shift = bpp * 8 - orig_bpp + ((s->frame_flags >> 13) & 0x1f);
- s->hybrid_maxclip = (( 1LL << (orig_bpp - 1)) - 1) >> s->post_shift;
- s->hybrid_minclip = ((-1LL << (orig_bpp - 1))) >> s->post_shift;
+ s->hybrid_maxclip = (1LL << ((((s->frame_flags & 0x03) + 1) << 3) - 1)) - 1;
+ s->post_shift = 8 * (bpp - 1 - (s->frame_flags & 0x03)) +
+ ((s->frame_flags >> 13) & 0x1f);
s->CRC = AV_RL32(buf); buf += 4;
if (wc->mkv_mode)
buf += 4; //skip block size;
@@ -976,15 +974,6 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
s->and = 1;
s->shift = buf[3];
}
- /* original WavPack decoder forces 32-bit lossy sound to be treated
- * as 24-bit one in order to have proper clipping
- */
- if (s->hybrid && bpp == 4 && s->post_shift < 8 && s->shift > 8) {
- s->post_shift += 8;
- s->shift -= 8;
- s->hybrid_maxclip >>= 8;
- s->hybrid_minclip >>= 8;
- }
buf += 4;
break;
case WP_ID_FLOATINFO:
OpenPOWER on IntegriCloud