Commit 1db6437f authored by Justin Ruggles's avatar Justin Ruggles

wmapro: fix strict-aliasing violations by using av_alias32

Also fix some undefined unsigned/signed conversions.
parent b8b4c9c3
...@@ -86,6 +86,7 @@ ...@@ -86,6 +86,7 @@
* subframe in order to reconstruct the output samples. * subframe in order to reconstruct the output samples.
*/ */
#include "libavutil/intreadwrite.h"
#include "avcodec.h" #include "avcodec.h"
#include "internal.h" #include "internal.h"
#include "get_bits.h" #include "get_bits.h"
...@@ -770,7 +771,7 @@ static int decode_coeffs(WMAProDecodeCtx *s, int c) ...@@ -770,7 +771,7 @@ static int decode_coeffs(WMAProDecodeCtx *s, int c)
/* Integers 0..15 as single-precision floats. The table saves a /* Integers 0..15 as single-precision floats. The table saves a
costly int to float conversion, and storing the values as costly int to float conversion, and storing the values as
integers allows fast sign-flipping. */ integers allows fast sign-flipping. */
static const int fval_tab[16] = { static const uint32_t fval_tab[16] = {
0x00000000, 0x3f800000, 0x40000000, 0x40400000, 0x00000000, 0x3f800000, 0x40000000, 0x40400000,
0x40800000, 0x40a00000, 0x40c00000, 0x40e00000, 0x40800000, 0x40a00000, 0x40c00000, 0x40e00000,
0x41000000, 0x41100000, 0x41200000, 0x41300000, 0x41000000, 0x41100000, 0x41200000, 0x41300000,
...@@ -802,7 +803,7 @@ static int decode_coeffs(WMAProDecodeCtx *s, int c) ...@@ -802,7 +803,7 @@ static int decode_coeffs(WMAProDecodeCtx *s, int c)
4 vector coded large values) */ 4 vector coded large values) */
while ((s->transmit_num_vec_coeffs || !rl_mode) && while ((s->transmit_num_vec_coeffs || !rl_mode) &&
(cur_coeff + 3 < ci->num_vec_coeffs)) { (cur_coeff + 3 < ci->num_vec_coeffs)) {
int vals[4]; uint32_t vals[4];
int i; int i;
unsigned int idx; unsigned int idx;
...@@ -812,15 +813,15 @@ static int decode_coeffs(WMAProDecodeCtx *s, int c) ...@@ -812,15 +813,15 @@ static int decode_coeffs(WMAProDecodeCtx *s, int c)
for (i = 0; i < 4; i += 2) { for (i = 0; i < 4; i += 2) {
idx = get_vlc2(&s->gb, vec2_vlc.table, VLCBITS, VEC2MAXDEPTH); idx = get_vlc2(&s->gb, vec2_vlc.table, VLCBITS, VEC2MAXDEPTH);
if (idx == HUFF_VEC2_SIZE - 1) { if (idx == HUFF_VEC2_SIZE - 1) {
int v0, v1; uint32_t v0, v1;
v0 = get_vlc2(&s->gb, vec1_vlc.table, VLCBITS, VEC1MAXDEPTH); v0 = get_vlc2(&s->gb, vec1_vlc.table, VLCBITS, VEC1MAXDEPTH);
if (v0 == HUFF_VEC1_SIZE - 1) if (v0 == HUFF_VEC1_SIZE - 1)
v0 += ff_wma_get_large_val(&s->gb); v0 += ff_wma_get_large_val(&s->gb);
v1 = get_vlc2(&s->gb, vec1_vlc.table, VLCBITS, VEC1MAXDEPTH); v1 = get_vlc2(&s->gb, vec1_vlc.table, VLCBITS, VEC1MAXDEPTH);
if (v1 == HUFF_VEC1_SIZE - 1) if (v1 == HUFF_VEC1_SIZE - 1)
v1 += ff_wma_get_large_val(&s->gb); v1 += ff_wma_get_large_val(&s->gb);
((float*)vals)[i ] = v0; vals[i ] = ((av_alias32){ .f32 = v0 }).u32;
((float*)vals)[i+1] = v1; vals[i+1] = ((av_alias32){ .f32 = v1 }).u32;
} else { } else {
vals[i] = fval_tab[symbol_to_vec2[idx] >> 4 ]; vals[i] = fval_tab[symbol_to_vec2[idx] >> 4 ];
vals[i+1] = fval_tab[symbol_to_vec2[idx] & 0xF]; vals[i+1] = fval_tab[symbol_to_vec2[idx] & 0xF];
...@@ -836,8 +837,8 @@ static int decode_coeffs(WMAProDecodeCtx *s, int c) ...@@ -836,8 +837,8 @@ static int decode_coeffs(WMAProDecodeCtx *s, int c)
/** decode sign */ /** decode sign */
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
if (vals[i]) { if (vals[i]) {
int sign = get_bits1(&s->gb) - 1; uint32_t sign = get_bits1(&s->gb) - 1;
*(uint32_t*)&ci->coeffs[cur_coeff] = vals[i] ^ sign<<31; AV_WN32A(&ci->coeffs[cur_coeff], vals[i] ^ sign << 31);
num_zeros = 0; num_zeros = 0;
} else { } else {
ci->coeffs[cur_coeff] = 0; ci->coeffs[cur_coeff] = 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment