| 
																	
																	
																		
																	
																	
																 | 
																@@ -139,7 +139,7 @@ typedef struct WavpackContext { | 
															
														
														
													
														
															
																 | 
																 | 
																} WavpackContext; | 
																 | 
																 | 
																} WavpackContext; | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																// exponent table copied from WavPack source | 
																 | 
																 | 
																// exponent table copied from WavPack source | 
															
														
														
													
														
															
																 | 
																 | 
																static const uint8_t wp_exp2_table [256] = { | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																static const uint8_t wp_exp2_table[256] = { | 
															
														
														
													
														
															
																 | 
																 | 
																    0x00, 0x01, 0x01, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0a, 0x0b, | 
																 | 
																 | 
																    0x00, 0x01, 0x01, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0a, 0x0b, | 
															
														
														
													
														
															
																 | 
																 | 
																    0x0b, 0x0c, 0x0d, 0x0e, 0x0e, 0x0f, 0x10, 0x10, 0x11, 0x12, 0x13, 0x13, 0x14, 0x15, 0x16, 0x16, | 
																 | 
																 | 
																    0x0b, 0x0c, 0x0d, 0x0e, 0x0e, 0x0f, 0x10, 0x10, 0x11, 0x12, 0x13, 0x13, 0x14, 0x15, 0x16, 0x16, | 
															
														
														
													
														
															
																 | 
																 | 
																    0x17, 0x18, 0x19, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1d, 0x1e, 0x1f, 0x20, 0x20, 0x21, 0x22, 0x23, | 
																 | 
																 | 
																    0x17, 0x18, 0x19, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1d, 0x1e, 0x1f, 0x20, 0x20, 0x21, 0x22, 0x23, | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																	
																	
																		
																	
																	
																 | 
																@@ -186,9 +186,9 @@ static av_always_inline int wp_exp2(int16_t val) | 
															
														
														
													
														
															
																 | 
																 | 
																        neg = 1; | 
																 | 
																 | 
																        neg = 1; | 
															
														
														
													
														
															
																 | 
																 | 
																    } | 
																 | 
																 | 
																    } | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																    res = wp_exp2_table[val & 0xFF] | 0x100; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    res   = wp_exp2_table[val & 0xFF] | 0x100; | 
															
														
														
													
														
															
																 | 
																 | 
																    val >>= 8; | 
																 | 
																 | 
																    val >>= 8; | 
															
														
														
													
														
															
																 | 
																 | 
																    res = (val > 9) ? (res << (val - 9)) : (res >> (9 - val)); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    res   = (val > 9) ? (res << (val - 9)) : (res >> (9 - val)); | 
															
														
														
													
														
															
																 | 
																 | 
																    return neg ? -res : res; | 
																 | 
																 | 
																    return neg ? -res : res; | 
															
														
														
													
														
															
																 | 
																 | 
																} | 
																 | 
																 | 
																} | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																	
																	
																		
																	
																	
																 | 
																@@ -229,15 +229,14 @@ static av_always_inline int wp_log2(int32_t val) | 
															
														
														
													
														
															
																 | 
																 | 
																        } \ | 
																 | 
																 | 
																        } \ | 
															
														
														
													
														
															
																 | 
																 | 
																    } | 
																 | 
																 | 
																    } | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																static av_always_inline int get_tail(GetBitContext *gb, int k) | 
																 | 
																 | 
																static av_always_inline int get_tail(GetBitContext *gb, int k) | 
															
														
														
													
														
															
																 | 
																 | 
																{ | 
																 | 
																 | 
																{ | 
															
														
														
													
														
															
																 | 
																 | 
																    int p, e, res; | 
																 | 
																 | 
																    int p, e, res; | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																    if (k < 1) | 
																 | 
																 | 
																    if (k < 1) | 
															
														
														
													
														
															
																 | 
																 | 
																        return 0; | 
																 | 
																 | 
																        return 0; | 
															
														
														
													
														
															
																 | 
																 | 
																    p = av_log2(k); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																    e = (1 << (p + 1)) - k - 1; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    p   = av_log2(k); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    e   = (1 << (p + 1)) - k - 1; | 
															
														
														
													
														
															
																 | 
																 | 
																    res = p ? get_bits(gb, p) : 0; | 
																 | 
																 | 
																    res = p ? get_bits(gb, p) : 0; | 
															
														
														
													
														
															
																 | 
																 | 
																    if (res >= e) | 
																 | 
																 | 
																    if (res >= e) | 
															
														
														
													
														
															
																 | 
																 | 
																        res = (res << 1) - e + get_bits1(gb); | 
																 | 
																 | 
																        res = (res << 1) - e + get_bits1(gb); | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -250,8 +249,8 @@ static void update_error_limit(WavpackFrameContext *ctx) | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																    for (i = 0; i <= ctx->stereo_in; i++) { | 
																 | 
																 | 
																    for (i = 0; i <= ctx->stereo_in; i++) { | 
															
														
														
													
														
															
																 | 
																 | 
																        ctx->ch[i].bitrate_acc += ctx->ch[i].bitrate_delta; | 
																 | 
																 | 
																        ctx->ch[i].bitrate_acc += ctx->ch[i].bitrate_delta; | 
															
														
														
													
														
															
																 | 
																 | 
																        br[i] = ctx->ch[i].bitrate_acc >> 16; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																        sl[i] = LEVEL_DECAY(ctx->ch[i].slow_level); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        br[i]                   = ctx->ch[i].bitrate_acc >> 16; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        sl[i]                   = LEVEL_DECAY(ctx->ch[i].slow_level); | 
															
														
														
													
														
															
																 | 
																 | 
																    } | 
																 | 
																 | 
																    } | 
															
														
														
													
														
															
																 | 
																 | 
																    if (ctx->stereo_in && ctx->hybrid_bitrate) { | 
																 | 
																 | 
																    if (ctx->stereo_in && ctx->hybrid_bitrate) { | 
															
														
														
													
														
															
																 | 
																 | 
																        int balance = (sl[1] - sl[0] + br[1] + 1) >> 1; | 
																 | 
																 | 
																        int balance = (sl[1] - sl[0] + br[1] + 1) >> 1; | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -260,7 +259,7 @@ static void update_error_limit(WavpackFrameContext *ctx) | 
															
														
														
													
														
															
																 | 
																 | 
																            br[0] = 0; | 
																 | 
																 | 
																            br[0] = 0; | 
															
														
														
													
														
															
																 | 
																 | 
																        } else if (-balance > br[0]) { | 
																 | 
																 | 
																        } else if (-balance > br[0]) { | 
															
														
														
													
														
															
																 | 
																 | 
																            br[0] <<= 1; | 
																 | 
																 | 
																            br[0] <<= 1; | 
															
														
														
													
														
															
																 | 
																 | 
																            br[1] = 0; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            br[1]   = 0; | 
															
														
														
													
														
															
																 | 
																 | 
																        } else { | 
																 | 
																 | 
																        } else { | 
															
														
														
													
														
															
																 | 
																 | 
																            br[1] = br[0] + balance; | 
																 | 
																 | 
																            br[1] = br[0] + balance; | 
															
														
														
													
														
															
																 | 
																 | 
																            br[0] = br[0] - balance; | 
																 | 
																 | 
																            br[0] = br[0] - balance; | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																	
																	
																		
																	
																	
																 | 
																@@ -300,7 +299,7 @@ static int wv_get_value(WavpackFrameContext *ctx, GetBitContext *gb, | 
															
														
														
													
														
															
																 | 
																 | 
																            if (t >= 2) { | 
																 | 
																 | 
																            if (t >= 2) { | 
															
														
														
													
														
															
																 | 
																 | 
																                if (get_bits_left(gb) < t - 1) | 
																 | 
																 | 
																                if (get_bits_left(gb) < t - 1) | 
															
														
														
													
														
															
																 | 
																 | 
																                    goto error; | 
																 | 
																 | 
																                    goto error; | 
															
														
														
													
														
															
																 | 
																 | 
																                t = get_bits(gb, t - 1) | (1 << (t-1)); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                t = get_bits(gb, t - 1) | (1 << (t - 1)); | 
															
														
														
													
														
															
																 | 
																 | 
																            } else { | 
																 | 
																 | 
																            } else { | 
															
														
														
													
														
															
																 | 
																 | 
																                if (get_bits_left(gb) < 0) | 
																 | 
																 | 
																                if (get_bits_left(gb) < 0) | 
															
														
														
													
														
															
																 | 
																 | 
																                    goto error; | 
																 | 
																 | 
																                    goto error; | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -316,7 +315,7 @@ static int wv_get_value(WavpackFrameContext *ctx, GetBitContext *gb, | 
															
														
														
													
														
															
																 | 
																 | 
																    } | 
																 | 
																 | 
																    } | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																    if (ctx->zero) { | 
																 | 
																 | 
																    if (ctx->zero) { | 
															
														
														
													
														
															
																 | 
																 | 
																        t = 0; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        t         = 0; | 
															
														
														
													
														
															
																 | 
																 | 
																        ctx->zero = 0; | 
																 | 
																 | 
																        ctx->zero = 0; | 
															
														
														
													
														
															
																 | 
																 | 
																    } else { | 
																 | 
																 | 
																    } else { | 
															
														
														
													
														
															
																 | 
																 | 
																        t = get_unary_0_33(gb); | 
																 | 
																 | 
																        t = get_unary_0_33(gb); | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -337,10 +336,10 @@ static int wv_get_value(WavpackFrameContext *ctx, GetBitContext *gb, | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																        if (ctx->one) { | 
																 | 
																 | 
																        if (ctx->one) { | 
															
														
														
													
														
															
																 | 
																 | 
																            ctx->one = t & 1; | 
																 | 
																 | 
																            ctx->one = t & 1; | 
															
														
														
													
														
															
																 | 
																 | 
																            t = (t >> 1) + 1; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            t        = (t >> 1) + 1; | 
															
														
														
													
														
															
																 | 
																 | 
																        } else { | 
																 | 
																 | 
																        } else { | 
															
														
														
													
														
															
																 | 
																 | 
																            ctx->one = t & 1; | 
																 | 
																 | 
																            ctx->one = t & 1; | 
															
														
														
													
														
															
																 | 
																 | 
																            t >>= 1; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            t      >>= 1; | 
															
														
														
													
														
															
																 | 
																 | 
																        } | 
																 | 
																 | 
																        } | 
															
														
														
													
														
															
																 | 
																 | 
																        ctx->zero = !ctx->one; | 
																 | 
																 | 
																        ctx->zero = !ctx->one; | 
															
														
														
													
														
															
																 | 
																 | 
																    } | 
																 | 
																 | 
																    } | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																	
																	
																		
																	
																	
																 | 
																@@ -403,11 +402,12 @@ static inline int wv_get_value_integer(WavpackFrameContext *s, uint32_t *crc, | 
															
														
														
													
														
															
																 | 
																 | 
																{ | 
																 | 
																 | 
																{ | 
															
														
														
													
														
															
																 | 
																 | 
																    int bit; | 
																 | 
																 | 
																    int bit; | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																    if (s->extra_bits){ | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    if (s->extra_bits) { | 
															
														
														
													
														
															
																 | 
																 | 
																        S <<= s->extra_bits; | 
																 | 
																 | 
																        S <<= s->extra_bits; | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																        if (s->got_extra_bits && get_bits_left(&s->gb_extra_bits) >= s->extra_bits) { | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																            S |= get_bits(&s->gb_extra_bits, s->extra_bits); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        if (s->got_extra_bits && | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            get_bits_left(&s->gb_extra_bits) >= s->extra_bits) { | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            S   |= get_bits(&s->gb_extra_bits, s->extra_bits); | 
															
														
														
													
														
															
																 | 
																 | 
																            *crc = *crc * 9 + (S & 0xffff) * 3 + ((unsigned)S >> 16); | 
																 | 
																 | 
																            *crc = *crc * 9 + (S & 0xffff) * 3 + ((unsigned)S >> 16); | 
															
														
														
													
														
															
																 | 
																 | 
																        } | 
																 | 
																 | 
																        } | 
															
														
														
													
														
															
																 | 
																 | 
																    } | 
																 | 
																 | 
																    } | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																	
																	
																		
																	
																	
																 | 
																@@ -440,7 +440,7 @@ static float wv_get_value_float(WavpackFrameContext *s, uint32_t *crc, int S) | 
															
														
														
													
														
															
																 | 
																 | 
																    } | 
																 | 
																 | 
																    } | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																    if (S) { | 
																 | 
																 | 
																    if (S) { | 
															
														
														
													
														
															
																 | 
																 | 
																        S <<= s->float_shift; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        S  <<= s->float_shift; | 
															
														
														
													
														
															
																 | 
																 | 
																        sign = S < 0; | 
																 | 
																 | 
																        sign = S < 0; | 
															
														
														
													
														
															
																 | 
																 | 
																        if (sign) | 
																 | 
																 | 
																        if (sign) | 
															
														
														
													
														
															
																 | 
																 | 
																            S = -S; | 
																 | 
																 | 
																            S = -S; | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -460,7 +460,8 @@ static float wv_get_value_float(WavpackFrameContext *s, uint32_t *crc, int S) | 
															
														
														
													
														
															
																 | 
																 | 
																            if (shift) { | 
																 | 
																 | 
																            if (shift) { | 
															
														
														
													
														
															
																 | 
																 | 
																                S <<= shift; | 
																 | 
																 | 
																                S <<= shift; | 
															
														
														
													
														
															
																 | 
																 | 
																                if ((s->float_flag & WV_FLT_SHIFT_ONES) || | 
																 | 
																 | 
																                if ((s->float_flag & WV_FLT_SHIFT_ONES) || | 
															
														
														
													
														
															
																 | 
																 | 
																                    (s->got_extra_bits && (s->float_flag & WV_FLT_SHIFT_SAME) && | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                    (s->got_extra_bits && | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                     (s->float_flag & WV_FLT_SHIFT_SAME) && | 
															
														
														
													
														
															
																 | 
																 | 
																                     get_bits1(&s->gb_extra_bits))) { | 
																 | 
																 | 
																                     get_bits1(&s->gb_extra_bits))) { | 
															
														
														
													
														
															
																 | 
																 | 
																                    S |= (1 << shift) - 1; | 
																 | 
																 | 
																                    S |= (1 << shift) - 1; | 
															
														
														
													
														
															
																 | 
																 | 
																                } else if (s->got_extra_bits && | 
																 | 
																 | 
																                } else if (s->got_extra_bits && | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -474,7 +475,7 @@ static float wv_get_value_float(WavpackFrameContext *s, uint32_t *crc, int S) | 
															
														
														
													
														
															
																 | 
																 | 
																        S &= 0x7fffff; | 
																 | 
																 | 
																        S &= 0x7fffff; | 
															
														
														
													
														
															
																 | 
																 | 
																    } else { | 
																 | 
																 | 
																    } else { | 
															
														
														
													
														
															
																 | 
																 | 
																        sign = 0; | 
																 | 
																 | 
																        sign = 0; | 
															
														
														
													
														
															
																 | 
																 | 
																        exp = 0; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        exp  = 0; | 
															
														
														
													
														
															
																 | 
																 | 
																        if (s->got_extra_bits && (s->float_flag & WV_FLT_ZERO_SENT)) { | 
																 | 
																 | 
																        if (s->got_extra_bits && (s->float_flag & WV_FLT_ZERO_SENT)) { | 
															
														
														
													
														
															
																 | 
																 | 
																            if (get_bits1(&s->gb_extra_bits)) { | 
																 | 
																 | 
																            if (get_bits1(&s->gb_extra_bits)) { | 
															
														
														
													
														
															
																 | 
																 | 
																                S = get_bits(&s->gb_extra_bits, 23); | 
																 | 
																 | 
																                S = get_bits(&s->gb_extra_bits, 23); | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -496,7 +497,7 @@ static float wv_get_value_float(WavpackFrameContext *s, uint32_t *crc, int S) | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																static void wv_reset_saved_context(WavpackFrameContext *s) | 
																 | 
																 | 
																static void wv_reset_saved_context(WavpackFrameContext *s) | 
															
														
														
													
														
															
																 | 
																 | 
																{ | 
																 | 
																 | 
																{ | 
															
														
														
													
														
															
																 | 
																 | 
																    s->pos = 0; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    s->pos    = 0; | 
															
														
														
													
														
															
																 | 
																 | 
																    s->sc.crc = s->extra_sc.crc = 0xFFFFFFFF; | 
																 | 
																 | 
																    s->sc.crc = s->extra_sc.crc = 0xFFFFFFFF; | 
															
														
														
													
														
															
																 | 
																 | 
																} | 
																 | 
																 | 
																} | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -521,13 +522,13 @@ static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb, | 
															
														
														
													
														
															
																 | 
																 | 
																    int i, j, count = 0; | 
																 | 
																 | 
																    int i, j, count = 0; | 
															
														
														
													
														
															
																 | 
																 | 
																    int last, t; | 
																 | 
																 | 
																    int last, t; | 
															
														
														
													
														
															
																 | 
																 | 
																    int A, B, L, L2, R, R2; | 
																 | 
																 | 
																    int A, B, L, L2, R, R2; | 
															
														
														
													
														
															
																 | 
																 | 
																    int pos = s->pos; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																    uint32_t crc = s->sc.crc; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    int pos                 = s->pos; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    uint32_t crc            = s->sc.crc; | 
															
														
														
													
														
															
																 | 
																 | 
																    uint32_t crc_extra_bits = s->extra_sc.crc; | 
																 | 
																 | 
																    uint32_t crc_extra_bits = s->extra_sc.crc; | 
															
														
														
													
														
															
																 | 
																 | 
																    int16_t *dst16 = dst; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																    int32_t *dst32 = dst; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																    float   *dstfl = dst; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																    const int channel_pad = s->avctx->channels - 2; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    int16_t *dst16          = dst; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    int32_t *dst32          = dst; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    float *dstfl            = dst; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    const int channel_pad   = s->avctx->channels - 2; | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																    s->one = s->zero = s->zeroes = 0; | 
																 | 
																 | 
																    s->one = s->zero = s->zeroes = 0; | 
															
														
														
													
														
															
																 | 
																 | 
																    do { | 
																 | 
																 | 
																    do { | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -550,7 +551,7 @@ static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb, | 
															
														
														
													
														
															
																 | 
																 | 
																                    } | 
																 | 
																 | 
																                    } | 
															
														
														
													
														
															
																 | 
																 | 
																                    s->decorr[i].samplesA[1] = s->decorr[i].samplesA[0]; | 
																 | 
																 | 
																                    s->decorr[i].samplesA[1] = s->decorr[i].samplesA[0]; | 
															
														
														
													
														
															
																 | 
																 | 
																                    s->decorr[i].samplesB[1] = s->decorr[i].samplesB[0]; | 
																 | 
																 | 
																                    s->decorr[i].samplesB[1] = s->decorr[i].samplesB[0]; | 
															
														
														
													
														
															
																 | 
																 | 
																                    j = 0; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                    j                        = 0; | 
															
														
														
													
														
															
																 | 
																 | 
																                } else { | 
																 | 
																 | 
																                } else { | 
															
														
														
													
														
															
																 | 
																 | 
																                    A = s->decorr[i].samplesA[pos]; | 
																 | 
																 | 
																                    A = s->decorr[i].samplesA[pos]; | 
															
														
														
													
														
															
																 | 
																 | 
																                    B = s->decorr[i].samplesB[pos]; | 
																 | 
																 | 
																                    B = s->decorr[i].samplesB[pos]; | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -563,8 +564,10 @@ static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb, | 
															
														
														
													
														
															
																 | 
																 | 
																                    L2 = L + ((s->decorr[i].weightA * A + 512) >> 10); | 
																 | 
																 | 
																                    L2 = L + ((s->decorr[i].weightA * A + 512) >> 10); | 
															
														
														
													
														
															
																 | 
																 | 
																                    R2 = R + ((s->decorr[i].weightB * B + 512) >> 10); | 
																 | 
																 | 
																                    R2 = R + ((s->decorr[i].weightB * B + 512) >> 10); | 
															
														
														
													
														
															
																 | 
																 | 
																                } | 
																 | 
																 | 
																                } | 
															
														
														
													
														
															
																 | 
																 | 
																                if (A && L) s->decorr[i].weightA -= ((((L ^ A) >> 30) & 2) - 1) * s->decorr[i].delta; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																                if (B && R) s->decorr[i].weightB -= ((((R ^ B) >> 30) & 2) - 1) * s->decorr[i].delta; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                if (A && L) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                    s->decorr[i].weightA -= ((((L ^ A) >> 30) & 2) - 1) * s->decorr[i].delta; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                if (B && R) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                    s->decorr[i].weightB -= ((((R ^ B) >> 30) & 2) - 1) * s->decorr[i].delta; | 
															
														
														
													
														
															
																 | 
																 | 
																                s->decorr[i].samplesA[j] = L = L2; | 
																 | 
																 | 
																                s->decorr[i].samplesA[j] = L = L2; | 
															
														
														
													
														
															
																 | 
																 | 
																                s->decorr[i].samplesB[j] = R = R2; | 
																 | 
																 | 
																                s->decorr[i].samplesB[j] = R = R2; | 
															
														
														
													
														
															
																 | 
																 | 
																            } else if (t == -1) { | 
																 | 
																 | 
																            } else if (t == -1) { | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -579,7 +582,7 @@ static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb, | 
															
														
														
													
														
															
																 | 
																 | 
																                else | 
																 | 
																 | 
																                else | 
															
														
														
													
														
															
																 | 
																 | 
																                    R2 = R + ((s->decorr[i].weightB * L2 + 512) >> 10); | 
																 | 
																 | 
																                    R2 = R + ((s->decorr[i].weightB * L2 + 512) >> 10); | 
															
														
														
													
														
															
																 | 
																 | 
																                UPDATE_WEIGHT_CLIP(s->decorr[i].weightB, s->decorr[i].delta, L2, R); | 
																 | 
																 | 
																                UPDATE_WEIGHT_CLIP(s->decorr[i].weightB, s->decorr[i].delta, L2, R); | 
															
														
														
													
														
															
																 | 
																 | 
																                R = R2; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                R                        = R2; | 
															
														
														
													
														
															
																 | 
																 | 
																                s->decorr[i].samplesA[0] = R; | 
																 | 
																 | 
																                s->decorr[i].samplesA[0] = R; | 
															
														
														
													
														
															
																 | 
																 | 
																            } else { | 
																 | 
																 | 
																            } else { | 
															
														
														
													
														
															
																 | 
																 | 
																                if (type != AV_SAMPLE_FMT_S16) | 
																 | 
																 | 
																                if (type != AV_SAMPLE_FMT_S16) | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -590,7 +593,7 @@ static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb, | 
															
														
														
													
														
															
																 | 
																 | 
																                R = R2; | 
																 | 
																 | 
																                R = R2; | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																                if (t == -3) { | 
																 | 
																 | 
																                if (t == -3) { | 
															
														
														
													
														
															
																 | 
																 | 
																                    R2 = s->decorr[i].samplesA[0]; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                    R2                       = s->decorr[i].samplesA[0]; | 
															
														
														
													
														
															
																 | 
																 | 
																                    s->decorr[i].samplesA[0] = R; | 
																 | 
																 | 
																                    s->decorr[i].samplesA[0] = R; | 
															
														
														
													
														
															
																 | 
																 | 
																                } | 
																 | 
																 | 
																                } | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -599,7 +602,7 @@ static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb, | 
															
														
														
													
														
															
																 | 
																 | 
																                else | 
																 | 
																 | 
																                else | 
															
														
														
													
														
															
																 | 
																 | 
																                    L2 = L + ((s->decorr[i].weightA * R2 + 512) >> 10); | 
																 | 
																 | 
																                    L2 = L + ((s->decorr[i].weightA * R2 + 512) >> 10); | 
															
														
														
													
														
															
																 | 
																 | 
																                UPDATE_WEIGHT_CLIP(s->decorr[i].weightA, s->decorr[i].delta, R2, L); | 
																 | 
																 | 
																                UPDATE_WEIGHT_CLIP(s->decorr[i].weightA, s->decorr[i].delta, R2, L); | 
															
														
														
													
														
															
																 | 
																 | 
																                L = L2; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                L                        = L2; | 
															
														
														
													
														
															
																 | 
																 | 
																                s->decorr[i].samplesB[0] = L; | 
																 | 
																 | 
																                s->decorr[i].samplesB[0] = L; | 
															
														
														
													
														
															
																 | 
																 | 
																            } | 
																 | 
																 | 
																            } | 
															
														
														
													
														
															
																 | 
																 | 
																        } | 
																 | 
																 | 
																        } | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -611,15 +614,15 @@ static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb, | 
															
														
														
													
														
															
																 | 
																 | 
																        if (type == AV_SAMPLE_FMT_FLT) { | 
																 | 
																 | 
																        if (type == AV_SAMPLE_FMT_FLT) { | 
															
														
														
													
														
															
																 | 
																 | 
																            *dstfl++ = wv_get_value_float(s, &crc_extra_bits, L); | 
																 | 
																 | 
																            *dstfl++ = wv_get_value_float(s, &crc_extra_bits, L); | 
															
														
														
													
														
															
																 | 
																 | 
																            *dstfl++ = wv_get_value_float(s, &crc_extra_bits, R); | 
																 | 
																 | 
																            *dstfl++ = wv_get_value_float(s, &crc_extra_bits, R); | 
															
														
														
													
														
															
																 | 
																 | 
																            dstfl += channel_pad; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            dstfl   += channel_pad; | 
															
														
														
													
														
															
																 | 
																 | 
																        } else if (type == AV_SAMPLE_FMT_S32) { | 
																 | 
																 | 
																        } else if (type == AV_SAMPLE_FMT_S32) { | 
															
														
														
													
														
															
																 | 
																 | 
																            *dst32++ = wv_get_value_integer(s, &crc_extra_bits, L); | 
																 | 
																 | 
																            *dst32++ = wv_get_value_integer(s, &crc_extra_bits, L); | 
															
														
														
													
														
															
																 | 
																 | 
																            *dst32++ = wv_get_value_integer(s, &crc_extra_bits, R); | 
																 | 
																 | 
																            *dst32++ = wv_get_value_integer(s, &crc_extra_bits, R); | 
															
														
														
													
														
															
																 | 
																 | 
																            dst32 += channel_pad; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            dst32   += channel_pad; | 
															
														
														
													
														
															
																 | 
																 | 
																        } else { | 
																 | 
																 | 
																        } else { | 
															
														
														
													
														
															
																 | 
																 | 
																            *dst16++ = wv_get_value_integer(s, &crc_extra_bits, L); | 
																 | 
																 | 
																            *dst16++ = wv_get_value_integer(s, &crc_extra_bits, L); | 
															
														
														
													
														
															
																 | 
																 | 
																            *dst16++ = wv_get_value_integer(s, &crc_extra_bits, R); | 
																 | 
																 | 
																            *dst16++ = wv_get_value_integer(s, &crc_extra_bits, R); | 
															
														
														
													
														
															
																 | 
																 | 
																            dst16 += channel_pad; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            dst16   += channel_pad; | 
															
														
														
													
														
															
																 | 
																 | 
																        } | 
																 | 
																 | 
																        } | 
															
														
														
													
														
															
																 | 
																 | 
																        count++; | 
																 | 
																 | 
																        count++; | 
															
														
														
													
														
															
																 | 
																 | 
																    } while (!last && count < s->samples); | 
																 | 
																 | 
																    } while (!last && count < s->samples); | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -638,12 +641,12 @@ static inline int wv_unpack_mono(WavpackFrameContext *s, GetBitContext *gb, | 
															
														
														
													
														
															
																 | 
																 | 
																    int i, j, count = 0; | 
																 | 
																 | 
																    int i, j, count = 0; | 
															
														
														
													
														
															
																 | 
																 | 
																    int last, t; | 
																 | 
																 | 
																    int last, t; | 
															
														
														
													
														
															
																 | 
																 | 
																    int A, S, T; | 
																 | 
																 | 
																    int A, S, T; | 
															
														
														
													
														
															
																 | 
																 | 
																    int pos = s->pos; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																    uint32_t crc = s->sc.crc; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																    uint32_t crc_extra_bits = s->extra_sc.crc; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																    int16_t *dst16 = dst; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																    int32_t *dst32 = dst; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																    float   *dstfl = dst; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    int pos                  = s->pos; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    uint32_t crc             = s->sc.crc; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    uint32_t crc_extra_bits  = s->extra_sc.crc; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    int16_t *dst16           = dst; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    int32_t *dst32           = dst; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    float *dstfl             = dst; | 
															
														
														
													
														
															
																 | 
																 | 
																    const int channel_stride = s->avctx->channels; | 
																 | 
																 | 
																    const int channel_stride = s->avctx->channels; | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																    s->one = s->zero = s->zeroes = 0; | 
																 | 
																 | 
																    s->one = s->zero = s->zeroes = 0; | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -660,7 +663,7 @@ static inline int wv_unpack_mono(WavpackFrameContext *s, GetBitContext *gb, | 
															
														
														
													
														
															
																 | 
																 | 
																                else | 
																 | 
																 | 
																                else | 
															
														
														
													
														
															
																 | 
																 | 
																                    A = (3 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1]) >> 1; | 
																 | 
																 | 
																                    A = (3 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1]) >> 1; | 
															
														
														
													
														
															
																 | 
																 | 
																                s->decorr[i].samplesA[1] = s->decorr[i].samplesA[0]; | 
																 | 
																 | 
																                s->decorr[i].samplesA[1] = s->decorr[i].samplesA[0]; | 
															
														
														
													
														
															
																 | 
																 | 
																                j = 0; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                j                        = 0; | 
															
														
														
													
														
															
																 | 
																 | 
																            } else { | 
																 | 
																 | 
																            } else { | 
															
														
														
													
														
															
																 | 
																 | 
																                A = s->decorr[i].samplesA[pos]; | 
																 | 
																 | 
																                A = s->decorr[i].samplesA[pos]; | 
															
														
														
													
														
															
																 | 
																 | 
																                j = (pos + t) & 7; | 
																 | 
																 | 
																                j = (pos + t) & 7; | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																	
																	
																		
																	
																	
																 | 
																@@ -699,7 +702,6 @@ static inline int wv_unpack_mono(WavpackFrameContext *s, GetBitContext *gb, | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																static av_cold int wv_alloc_frame_context(WavpackContext *c) | 
																 | 
																 | 
																static av_cold int wv_alloc_frame_context(WavpackContext *c) | 
															
														
														
													
														
															
																 | 
																 | 
																{ | 
																 | 
																 | 
																{ | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																    if (c->fdec_num == WV_MAX_FRAME_DECODERS) | 
																 | 
																 | 
																    if (c->fdec_num == WV_MAX_FRAME_DECODERS) | 
															
														
														
													
														
															
																 | 
																 | 
																        return -1; | 
																 | 
																 | 
																        return -1; | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -723,12 +725,12 @@ static av_cold int wavpack_decode_init(AVCodecContext *avctx) | 
															
														
														
													
														
															
																 | 
																 | 
																    else | 
																 | 
																 | 
																    else | 
															
														
														
													
														
															
																 | 
																 | 
																        avctx->sample_fmt = AV_SAMPLE_FMT_S32; | 
																 | 
																 | 
																        avctx->sample_fmt = AV_SAMPLE_FMT_S32; | 
															
														
														
													
														
															
																 | 
																 | 
																    if (avctx->channels <= 2 && !avctx->channel_layout) | 
																 | 
																 | 
																    if (avctx->channels <= 2 && !avctx->channel_layout) | 
															
														
														
													
														
															
																 | 
																 | 
																        avctx->channel_layout = (avctx->channels == 2) ? AV_CH_LAYOUT_STEREO : | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																                                                         AV_CH_LAYOUT_MONO; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        avctx->channel_layout = (avctx->channels == 2) ? AV_CH_LAYOUT_STEREO | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                                                       : AV_CH_LAYOUT_MONO; | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																    s->multichannel = avctx->channels > 2; | 
																 | 
																 | 
																    s->multichannel = avctx->channels > 2; | 
															
														
														
													
														
															
																 | 
																 | 
																    /* lavf demuxer does not provide extradata, Matroska stores 0x403 | 
																 | 
																 | 
																    /* lavf demuxer does not provide extradata, Matroska stores 0x403 | 
															
														
														
													
														
															
																 | 
																 | 
																       there, use this to detect decoding mode for multichannel */ | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																     * there, use this to detect decoding mode for multichannel */ | 
															
														
														
													
														
															
																 | 
																 | 
																    s->mkv_mode = 0; | 
																 | 
																 | 
																    s->mkv_mode = 0; | 
															
														
														
													
														
															
																 | 
																 | 
																    if (s->multichannel && avctx->extradata && avctx->extradata_size == 2) { | 
																 | 
																 | 
																    if (s->multichannel && avctx->extradata && avctx->extradata_size == 2) { | 
															
														
														
													
														
															
																 | 
																 | 
																        int ver = AV_RL16(avctx->extradata); | 
																 | 
																 | 
																        int ver = AV_RL16(avctx->extradata); | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																	
																	
																		
																	
																	
																 | 
																@@ -780,18 +782,20 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																    s = wc->fdec[block_no]; | 
																 | 
																 | 
																    s = wc->fdec[block_no]; | 
															
														
														
													
														
															
																 | 
																 | 
																    if (!s) { | 
																 | 
																 | 
																    if (!s) { | 
															
														
														
													
														
															
																 | 
																 | 
																        av_log(avctx, AV_LOG_ERROR, "Context for block %d is not present\n", block_no); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        av_log(avctx, AV_LOG_ERROR, "Context for block %d is not present\n", | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																               block_no); | 
															
														
														
													
														
															
																 | 
																 | 
																        return -1; | 
																 | 
																 | 
																        return -1; | 
															
														
														
													
														
															
																 | 
																 | 
																    } | 
																 | 
																 | 
																    } | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																    memset(s->decorr, 0, MAX_TERMS * sizeof(Decorr)); | 
																 | 
																 | 
																    memset(s->decorr, 0, MAX_TERMS * sizeof(Decorr)); | 
															
														
														
													
														
															
																 | 
																 | 
																    memset(s->ch, 0, sizeof(s->ch)); | 
																 | 
																 | 
																    memset(s->ch, 0, sizeof(s->ch)); | 
															
														
														
													
														
															
																 | 
																 | 
																    s->extra_bits = 0; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																    s->and = s->or = s->shift = 0; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    s->extra_bits     = 0; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    s->and            = s->or = s->shift = 0; | 
															
														
														
													
														
															
																 | 
																 | 
																    s->got_extra_bits = 0; | 
																 | 
																 | 
																    s->got_extra_bits = 0; | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																    if (!wc->mkv_mode) { | 
																 | 
																 | 
																    if (!wc->mkv_mode) { | 
															
														
														
													
														
															
																 | 
																 | 
																        s->samples = AV_RL32(buf); buf += 4; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        s->samples = AV_RL32(buf); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        buf       += 4; | 
															
														
														
													
														
															
																 | 
																 | 
																        if (!s->samples) { | 
																 | 
																 | 
																        if (!s->samples) { | 
															
														
														
													
														
															
																 | 
																 | 
																            *got_frame_ptr = 0; | 
																 | 
																 | 
																            *got_frame_ptr = 0; | 
															
														
														
													
														
															
																 | 
																 | 
																            return 0; | 
																 | 
																 | 
																            return 0; | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -799,10 +803,11 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, | 
															
														
														
													
														
															
																 | 
																 | 
																    } else { | 
																 | 
																 | 
																    } else { | 
															
														
														
													
														
															
																 | 
																 | 
																        s->samples = wc->samples; | 
																 | 
																 | 
																        s->samples = wc->samples; | 
															
														
														
													
														
															
																 | 
																 | 
																    } | 
																 | 
																 | 
																    } | 
															
														
														
													
														
															
																 | 
																 | 
																    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->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         = !(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; | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -810,11 +815,12 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, | 
															
														
														
													
														
															
																 | 
																 | 
																    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->post_shift     = bpp * 8 - orig_bpp + ((s->frame_flags >> 13) & 0x1f); | 
															
														
														
													
														
															
																 | 
																 | 
																    s->hybrid_maxclip = (( 1LL << (orig_bpp - 1)) - 1); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    s->hybrid_maxclip =  ((1LL << (orig_bpp - 1)) - 1); | 
															
														
														
													
														
															
																 | 
																 | 
																    s->hybrid_minclip = ((-1LL << (orig_bpp - 1))); | 
																 | 
																 | 
																    s->hybrid_minclip = ((-1LL << (orig_bpp - 1))); | 
															
														
														
													
														
															
																 | 
																 | 
																    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; | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																    wc->ch_offset += 1 + s->stereo; | 
																 | 
																 | 
																    wc->ch_offset += 1 + s->stereo; | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -827,15 +833,17 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, | 
															
														
														
													
														
															
																 | 
																 | 
																            size |= (*buf++) << 16; | 
																 | 
																 | 
																            size |= (*buf++) << 16; | 
															
														
														
													
														
															
																 | 
																 | 
																        } | 
																 | 
																 | 
																        } | 
															
														
														
													
														
															
																 | 
																 | 
																        size <<= 1; // size is specified in words | 
																 | 
																 | 
																        size <<= 1; // size is specified in words | 
															
														
														
													
														
															
																 | 
																 | 
																        ssize = size; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        ssize  = size; | 
															
														
														
													
														
															
																 | 
																 | 
																        if (id & WP_IDF_ODD) | 
																 | 
																 | 
																        if (id & WP_IDF_ODD) | 
															
														
														
													
														
															
																 | 
																 | 
																            size--; | 
																 | 
																 | 
																            size--; | 
															
														
														
													
														
															
																 | 
																 | 
																        if (size < 0) { | 
																 | 
																 | 
																        if (size < 0) { | 
															
														
														
													
														
															
																 | 
																 | 
																            av_log(avctx, AV_LOG_ERROR, "Got incorrect block %02X with size %i\n", id, size); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            av_log(avctx, AV_LOG_ERROR, | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                   "Got incorrect block %02X with size %i\n", id, size); | 
															
														
														
													
														
															
																 | 
																 | 
																            break; | 
																 | 
																 | 
																            break; | 
															
														
														
													
														
															
																 | 
																 | 
																        } | 
																 | 
																 | 
																        } | 
															
														
														
													
														
															
																 | 
																 | 
																        if (buf + ssize > buf_end) { | 
																 | 
																 | 
																        if (buf + ssize > buf_end) { | 
															
														
														
													
														
															
																 | 
																 | 
																            av_log(avctx, AV_LOG_ERROR, "Block size %i is out of bounds\n", size); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            av_log(avctx, AV_LOG_ERROR, | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                   "Block size %i is out of bounds\n", size); | 
															
														
														
													
														
															
																 | 
																 | 
																            break; | 
																 | 
																 | 
																            break; | 
															
														
														
													
														
															
																 | 
																 | 
																        } | 
																 | 
																 | 
																        } | 
															
														
														
													
														
															
																 | 
																 | 
																        if (id & WP_IDF_IGNORE) { | 
																 | 
																 | 
																        if (id & WP_IDF_IGNORE) { | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -847,7 +855,7 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, | 
															
														
														
													
														
															
																 | 
																 | 
																            if (size > MAX_TERMS) { | 
																 | 
																 | 
																            if (size > MAX_TERMS) { | 
															
														
														
													
														
															
																 | 
																 | 
																                av_log(avctx, AV_LOG_ERROR, "Too many decorrelation terms\n"); | 
																 | 
																 | 
																                av_log(avctx, AV_LOG_ERROR, "Too many decorrelation terms\n"); | 
															
														
														
													
														
															
																 | 
																 | 
																                s->terms = 0; | 
																 | 
																 | 
																                s->terms = 0; | 
															
														
														
													
														
															
																 | 
																 | 
																                buf += ssize; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                buf     += ssize; | 
															
														
														
													
														
															
																 | 
																 | 
																                continue; | 
																 | 
																 | 
																                continue; | 
															
														
														
													
														
															
																 | 
																 | 
																            } | 
																 | 
																 | 
																            } | 
															
														
														
													
														
															
																 | 
																 | 
																            s->terms = size; | 
																 | 
																 | 
																            s->terms = size; | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -870,17 +878,17 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, | 
															
														
														
													
														
															
																 | 
																 | 
																                continue; | 
																 | 
																 | 
																                continue; | 
															
														
														
													
														
															
																 | 
																 | 
																            } | 
																 | 
																 | 
																            } | 
															
														
														
													
														
															
																 | 
																 | 
																            for (i = 0; i < weights; i++) { | 
																 | 
																 | 
																            for (i = 0; i < weights; i++) { | 
															
														
														
													
														
															
																 | 
																 | 
																                t = (int8_t)(*buf++); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                t                                   = (int8_t)(*buf++); | 
															
														
														
													
														
															
																 | 
																 | 
																                s->decorr[s->terms - i - 1].weightA = t << 3; | 
																 | 
																 | 
																                s->decorr[s->terms - i - 1].weightA = t << 3; | 
															
														
														
													
														
															
																 | 
																 | 
																                if (s->decorr[s->terms - i - 1].weightA > 0) | 
																 | 
																 | 
																                if (s->decorr[s->terms - i - 1].weightA > 0) | 
															
														
														
													
														
															
																 | 
																 | 
																                    s->decorr[s->terms - i - 1].weightA += | 
																 | 
																 | 
																                    s->decorr[s->terms - i - 1].weightA += | 
															
														
														
													
														
															
																 | 
																 | 
																                            (s->decorr[s->terms - i - 1].weightA + 64) >> 7; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                        (s->decorr[s->terms - i - 1].weightA + 64) >> 7; | 
															
														
														
													
														
															
																 | 
																 | 
																                if (s->stereo_in) { | 
																 | 
																 | 
																                if (s->stereo_in) { | 
															
														
														
													
														
															
																 | 
																 | 
																                    t = (int8_t)(*buf++); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                    t                                   = (int8_t)(*buf++); | 
															
														
														
													
														
															
																 | 
																 | 
																                    s->decorr[s->terms - i - 1].weightB = t << 3; | 
																 | 
																 | 
																                    s->decorr[s->terms - i - 1].weightB = t << 3; | 
															
														
														
													
														
															
																 | 
																 | 
																                    if (s->decorr[s->terms - i - 1].weightB > 0) | 
																 | 
																 | 
																                    if (s->decorr[s->terms - i - 1].weightB > 0) | 
															
														
														
													
														
															
																 | 
																 | 
																                        s->decorr[s->terms - i - 1].weightB += | 
																 | 
																 | 
																                        s->decorr[s->terms - i - 1].weightB += | 
															
														
														
													
														
															
																 | 
																 | 
																                                (s->decorr[s->terms - i - 1].weightB + 64) >> 7; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                            (s->decorr[s->terms - i - 1].weightB + 64) >> 7; | 
															
														
														
													
														
															
																 | 
																 | 
																                } | 
																 | 
																 | 
																                } | 
															
														
														
													
														
															
																 | 
																 | 
																            } | 
																 | 
																 | 
																            } | 
															
														
														
													
														
															
																 | 
																 | 
																            got_weights = 1; | 
																 | 
																 | 
																            got_weights = 1; | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -893,23 +901,31 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, | 
															
														
														
													
														
															
																 | 
																 | 
																            t = 0; | 
																 | 
																 | 
																            t = 0; | 
															
														
														
													
														
															
																 | 
																 | 
																            for (i = s->terms - 1; (i >= 0) && (t < size); i--) { | 
																 | 
																 | 
																            for (i = s->terms - 1; (i >= 0) && (t < size); i--) { | 
															
														
														
													
														
															
																 | 
																 | 
																                if (s->decorr[i].value > 8) { | 
																 | 
																 | 
																                if (s->decorr[i].value > 8) { | 
															
														
														
													
														
															
																 | 
																 | 
																                    s->decorr[i].samplesA[0] = wp_exp2(AV_RL16(buf)); buf += 2; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																                    s->decorr[i].samplesA[1] = wp_exp2(AV_RL16(buf)); buf += 2; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                    s->decorr[i].samplesA[0] = wp_exp2(AV_RL16(buf)); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                    buf                     += 2; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                    s->decorr[i].samplesA[1] = wp_exp2(AV_RL16(buf)); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                    buf                     += 2; | 
															
														
														
													
														
															
																 | 
																 | 
																                    if (s->stereo_in) { | 
																 | 
																 | 
																                    if (s->stereo_in) { | 
															
														
														
													
														
															
																 | 
																 | 
																                        s->decorr[i].samplesB[0] = wp_exp2(AV_RL16(buf)); buf += 2; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																                        s->decorr[i].samplesB[1] = wp_exp2(AV_RL16(buf)); buf += 2; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																                        t += 4; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                        s->decorr[i].samplesB[0] = wp_exp2(AV_RL16(buf)); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                        buf                     += 2; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                        s->decorr[i].samplesB[1] = wp_exp2(AV_RL16(buf)); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                        buf                     += 2; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                        t                       += 4; | 
															
														
														
													
														
															
																 | 
																 | 
																                    } | 
																 | 
																 | 
																                    } | 
															
														
														
													
														
															
																 | 
																 | 
																                    t += 4; | 
																 | 
																 | 
																                    t += 4; | 
															
														
														
													
														
															
																 | 
																 | 
																                } else if (s->decorr[i].value < 0) { | 
																 | 
																 | 
																                } else if (s->decorr[i].value < 0) { | 
															
														
														
													
														
															
																 | 
																 | 
																                    s->decorr[i].samplesA[0] = wp_exp2(AV_RL16(buf)); buf += 2; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																                    s->decorr[i].samplesB[0] = wp_exp2(AV_RL16(buf)); buf += 2; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																                    t += 4; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                    s->decorr[i].samplesA[0] = wp_exp2(AV_RL16(buf)); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                    buf                     += 2; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                    s->decorr[i].samplesB[0] = wp_exp2(AV_RL16(buf)); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                    buf                     += 2; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                    t                       += 4; | 
															
														
														
													
														
															
																 | 
																 | 
																                } else { | 
																 | 
																 | 
																                } else { | 
															
														
														
													
														
															
																 | 
																 | 
																                    for (j = 0; j < s->decorr[i].value; j++) { | 
																 | 
																 | 
																                    for (j = 0; j < s->decorr[i].value; j++) { | 
															
														
														
													
														
															
																 | 
																 | 
																                        s->decorr[i].samplesA[j] = wp_exp2(AV_RL16(buf)); buf += 2; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                        s->decorr[i].samplesA[j] = wp_exp2(AV_RL16(buf)); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                        buf                     += 2; | 
															
														
														
													
														
															
																 | 
																 | 
																                        if (s->stereo_in) { | 
																 | 
																 | 
																                        if (s->stereo_in) { | 
															
														
														
													
														
															
																 | 
																 | 
																                            s->decorr[i].samplesB[j] = wp_exp2(AV_RL16(buf)); buf += 2; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                            s->decorr[i].samplesB[j] = wp_exp2(AV_RL16(buf)); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                            buf                     += 2; | 
															
														
														
													
														
															
																 | 
																 | 
																                        } | 
																 | 
																 | 
																                        } | 
															
														
														
													
														
															
																 | 
																 | 
																                    } | 
																 | 
																 | 
																                    } | 
															
														
														
													
														
															
																 | 
																 | 
																                    t += s->decorr[i].value * 2 * (s->stereo_in + 1); | 
																 | 
																 | 
																                    t += s->decorr[i].value * 2 * (s->stereo_in + 1); | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -919,36 +935,36 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, | 
															
														
														
													
														
															
																 | 
																 | 
																            break; | 
																 | 
																 | 
																            break; | 
															
														
														
													
														
															
																 | 
																 | 
																        case WP_ID_ENTROPY: | 
																 | 
																 | 
																        case WP_ID_ENTROPY: | 
															
														
														
													
														
															
																 | 
																 | 
																            if (size != 6 * (s->stereo_in + 1)) { | 
																 | 
																 | 
																            if (size != 6 * (s->stereo_in + 1)) { | 
															
														
														
													
														
															
																 | 
																 | 
																                av_log(avctx, AV_LOG_ERROR, "Entropy vars size should be %i, " | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																                       "got %i", 6 * (s->stereo_in + 1), size); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                av_log(avctx, AV_LOG_ERROR, | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                       "Entropy vars size should be %i, got %i", | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                       6 * (s->stereo_in + 1), size); | 
															
														
														
													
														
															
																 | 
																 | 
																                buf += ssize; | 
																 | 
																 | 
																                buf += ssize; | 
															
														
														
													
														
															
																 | 
																 | 
																                continue; | 
																 | 
																 | 
																                continue; | 
															
														
														
													
														
															
																 | 
																 | 
																            } | 
																 | 
																 | 
																            } | 
															
														
														
													
														
															
																 | 
																 | 
																            for (j = 0; j <= s->stereo_in; j++) { | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            for (j = 0; j <= s->stereo_in; j++) | 
															
														
														
													
														
															
																 | 
																 | 
																                for (i = 0; i < 3; i++) { | 
																 | 
																 | 
																                for (i = 0; i < 3; i++) { | 
															
														
														
													
														
															
																 | 
																 | 
																                    s->ch[j].median[i] = wp_exp2(AV_RL16(buf)); | 
																 | 
																 | 
																                    s->ch[j].median[i] = wp_exp2(AV_RL16(buf)); | 
															
														
														
													
														
															
																 | 
																 | 
																                    buf += 2; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                    buf               += 2; | 
															
														
														
													
														
															
																 | 
																 | 
																                } | 
																 | 
																 | 
																                } | 
															
														
														
													
														
															
																 | 
																 | 
																            } | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																            got_entropy = 1; | 
																 | 
																 | 
																            got_entropy = 1; | 
															
														
														
													
														
															
																 | 
																 | 
																            break; | 
																 | 
																 | 
																            break; | 
															
														
														
													
														
															
																 | 
																 | 
																        case WP_ID_HYBRID: | 
																 | 
																 | 
																        case WP_ID_HYBRID: | 
															
														
														
													
														
															
																 | 
																 | 
																            if (s->hybrid_bitrate) { | 
																 | 
																 | 
																            if (s->hybrid_bitrate) { | 
															
														
														
													
														
															
																 | 
																 | 
																                for (i = 0; i <= s->stereo_in; i++) { | 
																 | 
																 | 
																                for (i = 0; i <= s->stereo_in; i++) { | 
															
														
														
													
														
															
																 | 
																 | 
																                    s->ch[i].slow_level = wp_exp2(AV_RL16(buf)); | 
																 | 
																 | 
																                    s->ch[i].slow_level = wp_exp2(AV_RL16(buf)); | 
															
														
														
													
														
															
																 | 
																 | 
																                    buf += 2; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																                    size -= 2; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                    buf                += 2; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                    size               -= 2; | 
															
														
														
													
														
															
																 | 
																 | 
																                } | 
																 | 
																 | 
																                } | 
															
														
														
													
														
															
																 | 
																 | 
																            } | 
																 | 
																 | 
																            } | 
															
														
														
													
														
															
																 | 
																 | 
																            for (i = 0; i < (s->stereo_in + 1); i++) { | 
																 | 
																 | 
																            for (i = 0; i < (s->stereo_in + 1); i++) { | 
															
														
														
													
														
															
																 | 
																 | 
																                s->ch[i].bitrate_acc = AV_RL16(buf) << 16; | 
																 | 
																 | 
																                s->ch[i].bitrate_acc = AV_RL16(buf) << 16; | 
															
														
														
													
														
															
																 | 
																 | 
																                buf += 2; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																                size -= 2; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                buf                 += 2; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                size                -= 2; | 
															
														
														
													
														
															
																 | 
																 | 
																            } | 
																 | 
																 | 
																            } | 
															
														
														
													
														
															
																 | 
																 | 
																            if (size > 0) { | 
																 | 
																 | 
																            if (size > 0) { | 
															
														
														
													
														
															
																 | 
																 | 
																                for (i = 0; i < (s->stereo_in + 1); i++) { | 
																 | 
																 | 
																                for (i = 0; i < (s->stereo_in + 1); i++) { | 
															
														
														
													
														
															
																 | 
																 | 
																                    s->ch[i].bitrate_delta = wp_exp2((int16_t)AV_RL16(buf)); | 
																 | 
																 | 
																                    s->ch[i].bitrate_delta = wp_exp2((int16_t)AV_RL16(buf)); | 
															
														
														
													
														
															
																 | 
																 | 
																                    buf += 2; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                    buf                   += 2; | 
															
														
														
													
														
															
																 | 
																 | 
																                } | 
																 | 
																 | 
																                } | 
															
														
														
													
														
															
																 | 
																 | 
																            } else { | 
																 | 
																 | 
																            } else { | 
															
														
														
													
														
															
																 | 
																 | 
																                for (i = 0; i < (s->stereo_in + 1); i++) | 
																 | 
																 | 
																                for (i = 0; i < (s->stereo_in + 1); i++) | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -958,7 +974,9 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, | 
															
														
														
													
														
															
																 | 
																 | 
																            break; | 
																 | 
																 | 
																            break; | 
															
														
														
													
														
															
																 | 
																 | 
																        case WP_ID_INT32INFO: | 
																 | 
																 | 
																        case WP_ID_INT32INFO: | 
															
														
														
													
														
															
																 | 
																 | 
																            if (size != 4) { | 
																 | 
																 | 
																            if (size != 4) { | 
															
														
														
													
														
															
																 | 
																 | 
																                av_log(avctx, AV_LOG_ERROR, "Invalid INT32INFO, size = %i, sent_bits = %i\n", size, *buf); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                av_log(avctx, AV_LOG_ERROR, | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                       "Invalid INT32INFO, size = %i, sent_bits = %i\n", | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                       size, *buf); | 
															
														
														
													
														
															
																 | 
																 | 
																                buf += ssize; | 
																 | 
																 | 
																                buf += ssize; | 
															
														
														
													
														
															
																 | 
																 | 
																                continue; | 
																 | 
																 | 
																                continue; | 
															
														
														
													
														
															
																 | 
																 | 
																            } | 
																 | 
																 | 
																            } | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -966,19 +984,18 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, | 
															
														
														
													
														
															
																 | 
																 | 
																                s->extra_bits = buf[0]; | 
																 | 
																 | 
																                s->extra_bits = buf[0]; | 
															
														
														
													
														
															
																 | 
																 | 
																            else if (buf[1]) | 
																 | 
																 | 
																            else if (buf[1]) | 
															
														
														
													
														
															
																 | 
																 | 
																                s->shift = buf[1]; | 
																 | 
																 | 
																                s->shift = buf[1]; | 
															
														
														
													
														
															
																 | 
																 | 
																            else if (buf[2]){ | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																                s->and = s->or = 1; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            else if (buf[2]) { | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                s->and   = s->or = 1; | 
															
														
														
													
														
															
																 | 
																 | 
																                s->shift = buf[2]; | 
																 | 
																 | 
																                s->shift = buf[2]; | 
															
														
														
													
														
															
																 | 
																 | 
																            } else if(buf[3]) { | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            } else if (buf[3]) { | 
															
														
														
													
														
															
																 | 
																 | 
																                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 | 
																 | 
																 | 
																            /* original WavPack decoder forces 32-bit lossy sound to be treated | 
															
														
														
													
														
															
																 | 
																 | 
																             * as 24-bit one in order to have proper clipping | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																             */ | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																             * as 24-bit one in order to have proper clipping */ | 
															
														
														
													
														
															
																 | 
																 | 
																            if (s->hybrid && bpp == 4 && s->post_shift < 8 && s->shift > 8) { | 
																 | 
																 | 
																            if (s->hybrid && bpp == 4 && s->post_shift < 8 && s->shift > 8) { | 
															
														
														
													
														
															
																 | 
																 | 
																                s->post_shift += 8; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																                s->shift      -= 8; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                s->post_shift      += 8; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                s->shift           -= 8; | 
															
														
														
													
														
															
																 | 
																 | 
																                s->hybrid_maxclip >>= 8; | 
																 | 
																 | 
																                s->hybrid_maxclip >>= 8; | 
															
														
														
													
														
															
																 | 
																 | 
																                s->hybrid_minclip >>= 8; | 
																 | 
																 | 
																                s->hybrid_minclip >>= 8; | 
															
														
														
													
														
															
																 | 
																 | 
																            } | 
																 | 
																 | 
																            } | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -986,23 +1003,24 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, | 
															
														
														
													
														
															
																 | 
																 | 
																            break; | 
																 | 
																 | 
																            break; | 
															
														
														
													
														
															
																 | 
																 | 
																        case WP_ID_FLOATINFO: | 
																 | 
																 | 
																        case WP_ID_FLOATINFO: | 
															
														
														
													
														
															
																 | 
																 | 
																            if (size != 4) { | 
																 | 
																 | 
																            if (size != 4) { | 
															
														
														
													
														
															
																 | 
																 | 
																                av_log(avctx, AV_LOG_ERROR, "Invalid FLOATINFO, size = %i\n", size); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                av_log(avctx, AV_LOG_ERROR, | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                       "Invalid FLOATINFO, size = %i\n", size); | 
															
														
														
													
														
															
																 | 
																 | 
																                buf += ssize; | 
																 | 
																 | 
																                buf += ssize; | 
															
														
														
													
														
															
																 | 
																 | 
																                continue; | 
																 | 
																 | 
																                continue; | 
															
														
														
													
														
															
																 | 
																 | 
																            } | 
																 | 
																 | 
																            } | 
															
														
														
													
														
															
																 | 
																 | 
																            s->float_flag    = buf[0]; | 
																 | 
																 | 
																            s->float_flag    = buf[0]; | 
															
														
														
													
														
															
																 | 
																 | 
																            s->float_shift   = buf[1]; | 
																 | 
																 | 
																            s->float_shift   = buf[1]; | 
															
														
														
													
														
															
																 | 
																 | 
																            s->float_max_exp = buf[2]; | 
																 | 
																 | 
																            s->float_max_exp = buf[2]; | 
															
														
														
													
														
															
																 | 
																 | 
																            buf += 4; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																            got_float = 1; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            buf             += 4; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            got_float        = 1; | 
															
														
														
													
														
															
																 | 
																 | 
																            break; | 
																 | 
																 | 
																            break; | 
															
														
														
													
														
															
																 | 
																 | 
																        case WP_ID_DATA: | 
																 | 
																 | 
																        case WP_ID_DATA: | 
															
														
														
													
														
															
																 | 
																 | 
																            s->sc.offset = buf - orig_buf; | 
																 | 
																 | 
																            s->sc.offset = buf - orig_buf; | 
															
														
														
													
														
															
																 | 
																 | 
																            s->sc.size   = size * 8; | 
																 | 
																 | 
																            s->sc.size   = size * 8; | 
															
														
														
													
														
															
																 | 
																 | 
																            init_get_bits(&s->gb, buf, size * 8); | 
																 | 
																 | 
																            init_get_bits(&s->gb, buf, size * 8); | 
															
														
														
													
														
															
																 | 
																 | 
																            s->data_size = size * 8; | 
																 | 
																 | 
																            s->data_size = size * 8; | 
															
														
														
													
														
															
																 | 
																 | 
																            buf += size; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																            got_bs = 1; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            buf         += size; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            got_bs       = 1; | 
															
														
														
													
														
															
																 | 
																 | 
																            break; | 
																 | 
																 | 
																            break; | 
															
														
														
													
														
															
																 | 
																 | 
																        case WP_ID_EXTRABITS: | 
																 | 
																 | 
																        case WP_ID_EXTRABITS: | 
															
														
														
													
														
															
																 | 
																 | 
																            if (size <= 4) { | 
																 | 
																 | 
																            if (size <= 4) { | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -1014,23 +1032,32 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, | 
															
														
														
													
														
															
																 | 
																 | 
																            s->extra_sc.offset = buf - orig_buf; | 
																 | 
																 | 
																            s->extra_sc.offset = buf - orig_buf; | 
															
														
														
													
														
															
																 | 
																 | 
																            s->extra_sc.size   = size * 8; | 
																 | 
																 | 
																            s->extra_sc.size   = size * 8; | 
															
														
														
													
														
															
																 | 
																 | 
																            init_get_bits(&s->gb_extra_bits, buf, size * 8); | 
																 | 
																 | 
																            init_get_bits(&s->gb_extra_bits, buf, size * 8); | 
															
														
														
													
														
															
																 | 
																 | 
																            s->crc_extra_bits = get_bits_long(&s->gb_extra_bits, 32); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																            buf += size; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																            s->got_extra_bits = 1; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            s->crc_extra_bits  = get_bits_long(&s->gb_extra_bits, 32); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            buf               += size; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            s->got_extra_bits  = 1; | 
															
														
														
													
														
															
																 | 
																 | 
																            break; | 
																 | 
																 | 
																            break; | 
															
														
														
													
														
															
																 | 
																 | 
																        case WP_ID_CHANINFO: | 
																 | 
																 | 
																        case WP_ID_CHANINFO: | 
															
														
														
													
														
															
																 | 
																 | 
																            if (size <= 1) { | 
																 | 
																 | 
																            if (size <= 1) { | 
															
														
														
													
														
															
																 | 
																 | 
																                av_log(avctx, AV_LOG_ERROR, "Insufficient channel information\n"); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                av_log(avctx, AV_LOG_ERROR, | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                       "Insufficient channel information\n"); | 
															
														
														
													
														
															
																 | 
																 | 
																                return -1; | 
																 | 
																 | 
																                return -1; | 
															
														
														
													
														
															
																 | 
																 | 
																            } | 
																 | 
																 | 
																            } | 
															
														
														
													
														
															
																 | 
																 | 
																            chan = *buf++; | 
																 | 
																 | 
																            chan = *buf++; | 
															
														
														
													
														
															
																 | 
																 | 
																            switch (size - 2) { | 
																 | 
																 | 
																            switch (size - 2) { | 
															
														
														
													
														
															
																 | 
																 | 
																            case 0: chmask = *buf;         break; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																            case 1: chmask = AV_RL16(buf); break; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																            case 2: chmask = AV_RL24(buf); break; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																            case 3: chmask = AV_RL32(buf); break; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            case 0: | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                chmask = *buf; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                break; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            case 1: | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                chmask = AV_RL16(buf); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                break; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            case 2: | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                chmask = AV_RL24(buf); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                break; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            case 3: | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                chmask = AV_RL32(buf); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                break; | 
															
														
														
													
														
															
																 | 
																 | 
																            case 5: | 
																 | 
																 | 
																            case 5: | 
															
														
														
													
														
															
																 | 
																 | 
																                chan |= (buf[1] & 0xF) << 8; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                chan  |= (buf[1] & 0xF) << 8; | 
															
														
														
													
														
															
																 | 
																 | 
																                chmask = AV_RL24(buf + 2); | 
																 | 
																 | 
																                chmask = AV_RL24(buf + 2); | 
															
														
														
													
														
															
																 | 
																 | 
																                break; | 
																 | 
																 | 
																                break; | 
															
														
														
													
														
															
																 | 
																 | 
																            default: | 
																 | 
																 | 
																            default: | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -1040,9 +1067,10 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, | 
															
														
														
													
														
															
																 | 
																 | 
																                chmask = avctx->channel_layout; | 
																 | 
																 | 
																                chmask = avctx->channel_layout; | 
															
														
														
													
														
															
																 | 
																 | 
																            } | 
																 | 
																 | 
																            } | 
															
														
														
													
														
															
																 | 
																 | 
																            if (chan != avctx->channels) { | 
																 | 
																 | 
																            if (chan != avctx->channels) { | 
															
														
														
													
														
															
																 | 
																 | 
																                av_log(avctx, AV_LOG_ERROR, "Block reports total %d channels, " | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																                       "decoder believes it's %d channels\n", chan, | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																                       avctx->channels); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                av_log(avctx, AV_LOG_ERROR, | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                       "Block reports total %d channels, " | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                       "decoder believes it's %d channels\n", | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                       chan, avctx->channels); | 
															
														
														
													
														
															
																 | 
																 | 
																                return -1; | 
																 | 
																 | 
																                return -1; | 
															
														
														
													
														
															
																 | 
																 | 
																            } | 
																 | 
																 | 
																            } | 
															
														
														
													
														
															
																 | 
																 | 
																            if (!avctx->channel_layout) | 
																 | 
																 | 
																            if (!avctx->channel_layout) | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																	
																	
																		
																	
																	
																 | 
																@@ -1119,27 +1147,27 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, | 
															
														
														
													
														
															
																 | 
																 | 
																            return -1; | 
																 | 
																 | 
																            return -1; | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																        if (s->stereo && avctx->sample_fmt == AV_SAMPLE_FMT_S16) { | 
																 | 
																 | 
																        if (s->stereo && avctx->sample_fmt == AV_SAMPLE_FMT_S16) { | 
															
														
														
													
														
															
																 | 
																 | 
																            int16_t *dst = (int16_t*)samples + 1; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																            int16_t *src = (int16_t*)samples; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																            int cnt = samplecount; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            int16_t *dst = (int16_t *)samples + 1; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            int16_t *src = (int16_t *)samples; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            int cnt      = samplecount; | 
															
														
														
													
														
															
																 | 
																 | 
																            while (cnt--) { | 
																 | 
																 | 
																            while (cnt--) { | 
															
														
														
													
														
															
																 | 
																 | 
																                *dst = *src; | 
																 | 
																 | 
																                *dst = *src; | 
															
														
														
													
														
															
																 | 
																 | 
																                src += channel_stride; | 
																 | 
																 | 
																                src += channel_stride; | 
															
														
														
													
														
															
																 | 
																 | 
																                dst += channel_stride; | 
																 | 
																 | 
																                dst += channel_stride; | 
															
														
														
													
														
															
																 | 
																 | 
																            } | 
																 | 
																 | 
																            } | 
															
														
														
													
														
															
																 | 
																 | 
																        } else if (s->stereo && avctx->sample_fmt == AV_SAMPLE_FMT_S32) { | 
																 | 
																 | 
																        } else if (s->stereo && avctx->sample_fmt == AV_SAMPLE_FMT_S32) { | 
															
														
														
													
														
															
																 | 
																 | 
																            int32_t *dst = (int32_t*)samples + 1; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																            int32_t *src = (int32_t*)samples; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																            int cnt = samplecount; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            int32_t *dst = (int32_t *)samples + 1; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            int32_t *src = (int32_t *)samples; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            int cnt      = samplecount; | 
															
														
														
													
														
															
																 | 
																 | 
																            while (cnt--) { | 
																 | 
																 | 
																            while (cnt--) { | 
															
														
														
													
														
															
																 | 
																 | 
																                *dst = *src; | 
																 | 
																 | 
																                *dst = *src; | 
															
														
														
													
														
															
																 | 
																 | 
																                src += channel_stride; | 
																 | 
																 | 
																                src += channel_stride; | 
															
														
														
													
														
															
																 | 
																 | 
																                dst += channel_stride; | 
																 | 
																 | 
																                dst += channel_stride; | 
															
														
														
													
														
															
																 | 
																 | 
																            } | 
																 | 
																 | 
																            } | 
															
														
														
													
														
															
																 | 
																 | 
																        } else if (s->stereo) { | 
																 | 
																 | 
																        } else if (s->stereo) { | 
															
														
														
													
														
															
																 | 
																 | 
																            float *dst = (float*)samples + 1; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																            float *src = (float*)samples; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																            int cnt = samplecount; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            float *dst = (float *)samples + 1; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            float *src = (float *)samples; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            int cnt    = samplecount; | 
															
														
														
													
														
															
																 | 
																 | 
																            while (cnt--) { | 
																 | 
																 | 
																            while (cnt--) { | 
															
														
														
													
														
															
																 | 
																 | 
																                *dst = *src; | 
																 | 
																 | 
																                *dst = *src; | 
															
														
														
													
														
															
																 | 
																 | 
																                src += channel_stride; | 
																 | 
																 | 
																                src += channel_stride; | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																	
																	
																		
																	
																	
																 | 
																@@ -1177,7 +1205,8 @@ static int wavpack_decode_frame(AVCodecContext *avctx, void *data, | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																    /* determine number of samples */ | 
																 | 
																 | 
																    /* determine number of samples */ | 
															
														
														
													
														
															
																 | 
																 | 
																    if (s->mkv_mode) { | 
																 | 
																 | 
																    if (s->mkv_mode) { | 
															
														
														
													
														
															
																 | 
																 | 
																        s->samples  = AV_RL32(buf); buf += 4; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        s->samples  = AV_RL32(buf); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        buf        += 4; | 
															
														
														
													
														
															
																 | 
																 | 
																        frame_flags = AV_RL32(buf); | 
																 | 
																 | 
																        frame_flags = AV_RL32(buf); | 
															
														
														
													
														
															
																 | 
																 | 
																    } else { | 
																 | 
																 | 
																    } else { | 
															
														
														
													
														
															
																 | 
																 | 
																        if (s->multichannel) { | 
																 | 
																 | 
																        if (s->multichannel) { | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -1199,7 +1228,7 @@ static int wavpack_decode_frame(AVCodecContext *avctx, void *data, | 
															
														
														
													
														
															
																 | 
																 | 
																    } else if ((frame_flags & 0x03) <= 1) { | 
																 | 
																 | 
																    } else if ((frame_flags & 0x03) <= 1) { | 
															
														
														
													
														
															
																 | 
																 | 
																        avctx->sample_fmt = AV_SAMPLE_FMT_S16; | 
																 | 
																 | 
																        avctx->sample_fmt = AV_SAMPLE_FMT_S16; | 
															
														
														
													
														
															
																 | 
																 | 
																    } else { | 
																 | 
																 | 
																    } else { | 
															
														
														
													
														
															
																 | 
																 | 
																        avctx->sample_fmt = AV_SAMPLE_FMT_S32; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        avctx->sample_fmt          = AV_SAMPLE_FMT_S32; | 
															
														
														
													
														
															
																 | 
																 | 
																        avctx->bits_per_raw_sample = ((frame_flags & 0x03) + 1) << 3; | 
																 | 
																 | 
																        avctx->bits_per_raw_sample = ((frame_flags & 0x03) + 1) << 3; | 
															
														
														
													
														
															
																 | 
																 | 
																    } | 
																 | 
																 | 
																    } | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -1215,16 +1244,19 @@ static int wavpack_decode_frame(AVCodecContext *avctx, void *data, | 
															
														
														
													
														
															
																 | 
																 | 
																            frame_size = buf_size; | 
																 | 
																 | 
																            frame_size = buf_size; | 
															
														
														
													
														
															
																 | 
																 | 
																        } else { | 
																 | 
																 | 
																        } else { | 
															
														
														
													
														
															
																 | 
																 | 
																            if (!s->mkv_mode) { | 
																 | 
																 | 
																            if (!s->mkv_mode) { | 
															
														
														
													
														
															
																 | 
																 | 
																                frame_size = AV_RL32(buf) - 12; buf += 4; buf_size -= 4; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                frame_size = AV_RL32(buf) - 12; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                buf       += 4; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                buf_size  -= 4; | 
															
														
														
													
														
															
																 | 
																 | 
																            } else { | 
																 | 
																 | 
																            } else { | 
															
														
														
													
														
															
																 | 
																 | 
																                if (buf_size < 12) //MKV files can have zero flags after last block | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                if (buf_size < 12) // MKV files can have zero flags after last block | 
															
														
														
													
														
															
																 | 
																 | 
																                    break; | 
																 | 
																 | 
																                    break; | 
															
														
														
													
														
															
																 | 
																 | 
																                frame_size = AV_RL32(buf + 8) + 12; | 
																 | 
																 | 
																                frame_size = AV_RL32(buf + 8) + 12; | 
															
														
														
													
														
															
																 | 
																 | 
																            } | 
																 | 
																 | 
																            } | 
															
														
														
													
														
															
																 | 
																 | 
																        } | 
																 | 
																 | 
																        } | 
															
														
														
													
														
															
																 | 
																 | 
																        if (frame_size < 0 || frame_size > buf_size) { | 
																 | 
																 | 
																        if (frame_size < 0 || frame_size > buf_size) { | 
															
														
														
													
														
															
																 | 
																 | 
																            av_log(avctx, AV_LOG_ERROR, "Block %d has invalid size (size %d " | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																                   "vs. %d bytes left)\n", s->block, frame_size, buf_size); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            av_log(avctx, AV_LOG_ERROR, | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                   "Block %d has invalid size (size %d vs. %d bytes left)\n", | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                   s->block, frame_size, buf_size); | 
															
														
														
													
														
															
																 | 
																 | 
																            wavpack_decode_flush(avctx); | 
																 | 
																 | 
																            wavpack_decode_flush(avctx); | 
															
														
														
													
														
															
																 | 
																 | 
																            return -1; | 
																 | 
																 | 
																            return -1; | 
															
														
														
													
														
															
																 | 
																 | 
																        } | 
																 | 
																 | 
																        } | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -1235,7 +1267,8 @@ static int wavpack_decode_frame(AVCodecContext *avctx, void *data, | 
															
														
														
													
														
															
																 | 
																 | 
																            return -1; | 
																 | 
																 | 
																            return -1; | 
															
														
														
													
														
															
																 | 
																 | 
																        } | 
																 | 
																 | 
																        } | 
															
														
														
													
														
															
																 | 
																 | 
																        s->block++; | 
																 | 
																 | 
																        s->block++; | 
															
														
														
													
														
															
																 | 
																 | 
																        buf += frame_size; buf_size -= frame_size; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        buf      += frame_size; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        buf_size -= frame_size; | 
															
														
														
													
														
															
																 | 
																 | 
																    } | 
																 | 
																 | 
																    } | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																    return avpkt->size; | 
																 | 
																 | 
																    return avpkt->size; | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																	
																	
																	
																 | 
																
  |