Commit a915618a authored by Carl Eugen Hoyos's avatar Carl Eugen Hoyos

Improve decoding quality for lossy wavpack.

This reverts e6e7bfc1 and 365e1ec2.
The code may be incorrect both before and after the revert, but we
do not have any samples that were fixed by the original commits.

Fixes ticket #871.
parent 7fabef1f
...@@ -112,8 +112,7 @@ typedef struct WavpackFrameContext { ...@@ -112,8 +112,7 @@ typedef struct WavpackFrameContext {
int extra_bits; int extra_bits;
int and, or, shift; int and, or, shift;
int post_shift; int post_shift;
int hybrid, hybrid_bitrate; int hybrid, hybrid_bitrate, hybrid_maxclip;
int hybrid_maxclip, hybrid_minclip;
int float_flag; int float_flag;
int float_shift; int float_shift;
int float_max_exp; int float_max_exp;
...@@ -413,10 +412,10 @@ static inline int wv_get_value_integer(WavpackFrameContext *s, uint32_t *crc, ...@@ -413,10 +412,10 @@ static inline int wv_get_value_integer(WavpackFrameContext *s, uint32_t *crc,
} }
bit = (S & s->and) | s->or; bit = (S & s->and) | s->or;
bit = ((S + bit) << s->shift) - bit; bit = (((S + bit) << s->shift) - bit);
if (s->hybrid) 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; return bit << s->post_shift;
} }
...@@ -764,7 +763,7 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, ...@@ -764,7 +763,7 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
const uint8_t *orig_buf = buf; const uint8_t *orig_buf = buf;
const uint8_t *buf_end = buf + buf_size; const uint8_t *buf_end = buf + buf_size;
int i, j, id, size, ssize, weights, t; int i, j, id, size, ssize, weights, t;
int bpp, chan, chmask, orig_bpp; int bpp, chan, chmask;
if (buf_size == 0) { if (buf_size == 0) {
*got_frame_ptr = 0; *got_frame_ptr = 0;
...@@ -800,16 +799,15 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, ...@@ -800,16 +799,15 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
s->frame_flags = AV_RL32(buf); buf += 4; s->frame_flags = AV_RL32(buf); buf += 4;
bpp = av_get_bytes_per_sample(avctx->sample_fmt); bpp = av_get_bytes_per_sample(avctx->sample_fmt);
samples = (uint8_t*)samples + bpp * wc->ch_offset; 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 = !(s->frame_flags & WV_MONO);
s->stereo_in = (s->frame_flags & WV_FALSE_STEREO) ? 0 : s->stereo; s->stereo_in = (s->frame_flags & WV_FALSE_STEREO) ? 0 : s->stereo;
s->joint = s->frame_flags & WV_JOINT_STEREO; s->joint = s->frame_flags & WV_JOINT_STEREO;
s->hybrid = s->frame_flags & WV_HYBRID_MODE; s->hybrid = s->frame_flags & WV_HYBRID_MODE;
s->hybrid_bitrate = s->frame_flags & WV_HYBRID_BITRATE; 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 << ((((s->frame_flags & 0x03) + 1) << 3) - 1)) - 1;
s->hybrid_maxclip = (( 1LL << (orig_bpp - 1)) - 1) >> s->post_shift; s->post_shift = 8 * (bpp - 1 - (s->frame_flags & 0x03)) +
s->hybrid_minclip = ((-1LL << (orig_bpp - 1))) >> s->post_shift; ((s->frame_flags >> 13) & 0x1f);
s->CRC = AV_RL32(buf); buf += 4; s->CRC = AV_RL32(buf); buf += 4;
if (wc->mkv_mode) if (wc->mkv_mode)
buf += 4; //skip block size; buf += 4; //skip block size;
...@@ -970,15 +968,6 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, ...@@ -970,15 +968,6 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
s->and = 1; s->and = 1;
s->shift = buf[3]; 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; buf += 4;
break; break;
case WP_ID_FLOATINFO: case WP_ID_FLOATINFO:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment