diff options
author | Solomon Peachy <pizza@shaftnet.org> | 2020-10-27 15:00:48 -0400 |
---|---|---|
committer | Solomon Peachy <pizza@shaftnet.org> | 2020-10-28 02:12:01 +0000 |
commit | bcbf8bbf0a0884d66eab55747f9787c393ca7e1a (patch) | |
tree | 273b10d266ae0783bcef44a97b7c5f924b7aac27 /lib | |
parent | a5a19a33706a68a225e6df1ca627e654619f3a84 (diff) | |
download | rockbox-bcbf8bbf0a0884d66eab55747f9787c393ca7e1a.tar.gz rockbox-bcbf8bbf0a0884d66eab55747f9787c393ca7e1a.zip |
wmapro: Backport multiple fixes
upstream commits:
780d454
b28c678
9166f48
97a5add
b21ba20
f734671
b86dd1
b4027d9
50f0a6b
4c0080b
c7a7605
5dcb990
7ad698e
Change-Id: I8e6d74316e1eaf22217a57ddb54c1ea8303e6788
Diffstat (limited to 'lib')
-rwxr-xr-x | lib/rbcodec/codecs/libwmapro/wmaprodec.c | 130 |
1 files changed, 91 insertions, 39 deletions
diff --git a/lib/rbcodec/codecs/libwmapro/wmaprodec.c b/lib/rbcodec/codecs/libwmapro/wmaprodec.c index 62a12738a5..578b8ddb97 100755 --- a/lib/rbcodec/codecs/libwmapro/wmaprodec.c +++ b/lib/rbcodec/codecs/libwmapro/wmaprodec.c | |||
@@ -141,6 +141,7 @@ | |||
141 | #define MAX_BANDS 29 ///< max number of scale factor bands | 141 | #define MAX_BANDS 29 ///< max number of scale factor bands |
142 | #define MAX_FRAMESIZE 32768 ///< maximum compressed frame size | 142 | #define MAX_FRAMESIZE 32768 ///< maximum compressed frame size |
143 | 143 | ||
144 | #define WMAPRO_BLOCK_MIN_BITS 6 ///< log2 of min block size | ||
144 | #define WMAPRO_BLOCK_MAX_BITS 12 ///< log2 of max block size | 145 | #define WMAPRO_BLOCK_MAX_BITS 12 ///< log2 of max block size |
145 | #define WMAPRO_BLOCK_MAX_SIZE (1 << WMAPRO_BLOCK_MAX_BITS) ///< maximum block size | 146 | #define WMAPRO_BLOCK_MAX_SIZE (1 << WMAPRO_BLOCK_MAX_BITS) ///< maximum block size |
146 | #define WMAPRO_BLOCK_SIZES (WMAPRO_BLOCK_MAX_BITS - BLOCK_MIN_BITS + 1) ///< possible block sizes | 147 | #define WMAPRO_BLOCK_SIZES (WMAPRO_BLOCK_MAX_BITS - BLOCK_MIN_BITS + 1) ///< possible block sizes |
@@ -306,13 +307,13 @@ int decode_init(asf_waveformatex_t *wfx) | |||
306 | WMAProDecodeCtx *s = &globWMAProDecCtx; | 307 | WMAProDecodeCtx *s = &globWMAProDecCtx; |
307 | uint8_t *edata_ptr = wfx->data; | 308 | uint8_t *edata_ptr = wfx->data; |
308 | unsigned int channel_mask; | 309 | unsigned int channel_mask; |
309 | int i; | 310 | int i, bits; |
310 | int log2_max_num_subframes; | 311 | int log2_max_num_subframes; |
311 | int num_possible_block_sizes; | 312 | int num_possible_block_sizes; |
312 | 313 | ||
313 | /* Use globally defined array. Allows IRAM usage for models with large IRAM. */ | 314 | /* Use globally defined array. Allows IRAM usage for models with large IRAM. */ |
314 | s->tmp = g_tmp; | 315 | s->tmp = g_tmp; |
315 | 316 | ||
316 | /* Use globally defined arrays. Allows IRAM usage for up to 2 channels. */ | 317 | /* Use globally defined arrays. Allows IRAM usage for up to 2 channels. */ |
317 | s->channel[0].out = g_out_ch0; | 318 | s->channel[0].out = g_out_ch0; |
318 | s->channel[1].out = g_out_ch1; | 319 | s->channel[1].out = g_out_ch1; |
@@ -355,8 +356,12 @@ int decode_init(asf_waveformatex_t *wfx) | |||
355 | } | 356 | } |
356 | 357 | ||
357 | /** get frame len */ | 358 | /** get frame len */ |
358 | s->samples_per_frame = 1 << ff_wma_get_frame_len_bits(wfx->rate, | 359 | bits = ff_wma_get_frame_len_bits(wfx->rate, 3, s->decode_flags); |
359 | 3, s->decode_flags); | 360 | if (bits > WMAPRO_BLOCK_MAX_BITS) { |
361 | DEBUGF("14-bits block sizes\n"); | ||
362 | return AVERROR_INVALIDDATA; | ||
363 | } | ||
364 | s->samples_per_frame = 1 << bits; | ||
360 | 365 | ||
361 | /** init previous block len */ | 366 | /** init previous block len */ |
362 | for (i = 0; i < wfx->channels; i++) | 367 | for (i = 0; i < wfx->channels; i++) |
@@ -365,7 +370,7 @@ int decode_init(asf_waveformatex_t *wfx) | |||
365 | /** subframe info */ | 370 | /** subframe info */ |
366 | log2_max_num_subframes = ((s->decode_flags & 0x38) >> 3); | 371 | log2_max_num_subframes = ((s->decode_flags & 0x38) >> 3); |
367 | s->max_num_subframes = 1 << log2_max_num_subframes; | 372 | s->max_num_subframes = 1 << log2_max_num_subframes; |
368 | if (s->max_num_subframes == 16) | 373 | if (s->max_num_subframes == 16 || s->max_num_subframes == 4) |
369 | s->max_subframe_len_bit = 1; | 374 | s->max_subframe_len_bit = 1; |
370 | s->subframe_len_bits = av_log2(log2_max_num_subframes) + 1; | 375 | s->subframe_len_bits = av_log2(log2_max_num_subframes) + 1; |
371 | 376 | ||
@@ -379,6 +384,12 @@ int decode_init(asf_waveformatex_t *wfx) | |||
379 | return AVERROR_INVALIDDATA; | 384 | return AVERROR_INVALIDDATA; |
380 | } | 385 | } |
381 | 386 | ||
387 | if (s->min_samples_per_subframe < (1<<WMAPRO_BLOCK_MIN_BITS)) { | ||
388 | av_log(avctx, AV_LOG_ERROR, "min_samples_per_subframe of %d too small\n", | ||
389 | s->min_samples_per_subframe); | ||
390 | return AVERROR_INVALIDDATA; | ||
391 | } | ||
392 | |||
382 | s->num_channels = wfx->channels; | 393 | s->num_channels = wfx->channels; |
383 | 394 | ||
384 | /** extract lfe channel position */ | 395 | /** extract lfe channel position */ |
@@ -443,9 +454,15 @@ int decode_init(asf_waveformatex_t *wfx) | |||
443 | offset &= ~3; | 454 | offset &= ~3; |
444 | if (offset > s->sfb_offsets[i][band - 1]) | 455 | if (offset > s->sfb_offsets[i][band - 1]) |
445 | s->sfb_offsets[i][band++] = offset; | 456 | s->sfb_offsets[i][band++] = offset; |
457 | if (offset >= subframe_len) | ||
458 | break; | ||
446 | } | 459 | } |
447 | s->sfb_offsets[i][band - 1] = subframe_len; | 460 | s->sfb_offsets[i][band - 1] = subframe_len; |
448 | s->num_sfb[i] = band - 1; | 461 | s->num_sfb[i] = band - 1; |
462 | if (s->num_sfb[i] <= 0) { | ||
463 | av_log(avctx, AV_LOG_ERROR, "num_sfb invalid\n"); | ||
464 | return AVERROR_INVALIDDATA; | ||
465 | } | ||
449 | } | 466 | } |
450 | 467 | ||
451 | 468 | ||
@@ -476,12 +493,12 @@ int decode_init(asf_waveformatex_t *wfx) | |||
476 | / wfx->rate; | 493 | / wfx->rate; |
477 | s->subwoofer_cutoffs[i] = av_clip(cutoff, 4, block_size); | 494 | s->subwoofer_cutoffs[i] = av_clip(cutoff, 4, block_size); |
478 | } | 495 | } |
479 | 496 | ||
480 | #if 0 | 497 | #if 0 |
481 | /** calculate sine values for the decorrelation matrix */ | 498 | /** calculate sine values for the decorrelation matrix */ |
482 | for (i = 0; i < 33; i++) | 499 | for (i = 0; i < 33; i++) |
483 | sin64[i] = sin(i*M_PI / 64.0); | 500 | sin64[i] = sin(i*M_PI / 64.0); |
484 | #endif | 501 | #endif |
485 | 502 | ||
486 | #ifdef WMAPRO_DUMP_CTX_EN | 503 | #ifdef WMAPRO_DUMP_CTX_EN |
487 | dump_context(s); | 504 | dump_context(s); |
@@ -593,7 +610,7 @@ static int decode_tilehdr(WMAProDecodeCtx *s) | |||
593 | WMAProChannelCtx* chan = &s->channel[c]; | 610 | WMAProChannelCtx* chan = &s->channel[c]; |
594 | 611 | ||
595 | if (contains_subframe[c]) { | 612 | if (contains_subframe[c]) { |
596 | if (chan->num_subframes >= MAX_SUBFRAMES) { | 613 | if (chan->num_subframes >= MAX_SUBFRAMES) { |
597 | DEBUGF("broken frame: num subframes > 31\n"); | 614 | DEBUGF("broken frame: num subframes > 31\n"); |
598 | return AVERROR_INVALIDDATA; | 615 | return AVERROR_INVALIDDATA; |
599 | } | 616 | } |
@@ -651,7 +668,7 @@ static void decode_decorrelation_matrix(WMAProDecodeCtx *s, | |||
651 | for (i = 0; i < chgroup->num_channels; i++) { | 668 | for (i = 0; i < chgroup->num_channels; i++) { |
652 | chgroup->decorrelation_matrix[chgroup->num_channels * i + i] = | 669 | chgroup->decorrelation_matrix[chgroup->num_channels * i + i] = |
653 | get_bits1(&s->gb) ? 1.0 : -1.0; | 670 | get_bits1(&s->gb) ? 1.0 : -1.0; |
654 | 671 | ||
655 | if(chgroup->decorrelation_matrix[chgroup->num_channels * i + i] > 0) | 672 | if(chgroup->decorrelation_matrix[chgroup->num_channels * i + i] > 0) |
656 | chgroup->fixdecorrelation_matrix[chgroup->num_channels * i + i] = ONE_FRACT16; | 673 | chgroup->fixdecorrelation_matrix[chgroup->num_channels * i + i] = ONE_FRACT16; |
657 | else | 674 | else |
@@ -693,7 +710,7 @@ static void decode_decorrelation_matrix(WMAProDecodeCtx *s, | |||
693 | fixmul31(f1, fixsinv) - fixmul31(f2, fixcosv); | 710 | fixmul31(f1, fixsinv) - fixmul31(f2, fixcosv); |
694 | chgroup->fixdecorrelation_matrix[y + i * chgroup->num_channels] = | 711 | chgroup->fixdecorrelation_matrix[y + i * chgroup->num_channels] = |
695 | fixmul31(f1, fixcosv) + fixmul31(f2, fixsinv); | 712 | fixmul31(f1, fixcosv) + fixmul31(f2, fixsinv); |
696 | 713 | ||
697 | } | 714 | } |
698 | } | 715 | } |
699 | offset += i; | 716 | offset += i; |
@@ -881,11 +898,11 @@ static int decode_coeffs(WMAProDecodeCtx *s, int c) | |||
881 | vals[3] = (symbol_to_vec4[idx] ) & 0xF; | 898 | vals[3] = (symbol_to_vec4[idx] ) & 0xF; |
882 | } | 899 | } |
883 | 900 | ||
884 | /* Rockbox: To be able to use rockbox' optimized mdct we need to | 901 | /* Rockbox: To be able to use rockbox' optimized mdct we need to |
885 | * pre-shift the values by >>(nbits-3). */ | 902 | * pre-shift the values by >>(nbits-3). */ |
886 | const int nbits = av_log2(s->subframe_len)+1; | 903 | const int nbits = av_log2(s->subframe_len)+1; |
887 | const int shift = WMAPRO_FRACT-(nbits-3); | 904 | const int shift = WMAPRO_FRACT-(nbits-3); |
888 | 905 | ||
889 | /** decode sign */ | 906 | /** decode sign */ |
890 | for (i = 0; i < 4; i++) { | 907 | for (i = 0; i < 4; i++) { |
891 | if (vals[i]) { | 908 | if (vals[i]) { |
@@ -908,7 +925,7 @@ static int decode_coeffs(WMAProDecodeCtx *s, int c) | |||
908 | if (cur_coeff < s->subframe_len) { | 925 | if (cur_coeff < s->subframe_len) { |
909 | memset(&ci->coeffs[cur_coeff], 0, | 926 | memset(&ci->coeffs[cur_coeff], 0, |
910 | sizeof(*ci->coeffs) * (s->subframe_len - cur_coeff)); | 927 | sizeof(*ci->coeffs) * (s->subframe_len - cur_coeff)); |
911 | 928 | ||
912 | if (ff_wma_run_level_decode(&s->gb, vlc, | 929 | if (ff_wma_run_level_decode(&s->gb, vlc, |
913 | level, run, 1, ci->coeffs, | 930 | level, run, 1, ci->coeffs, |
914 | cur_coeff, s->subframe_len, | 931 | cur_coeff, s->subframe_len, |
@@ -995,7 +1012,7 @@ static int decode_scale_factors(WMAProDecodeCtx* s) | |||
995 | s->channel[c].scale_factors[i] += (val ^ sign) - sign; | 1012 | s->channel[c].scale_factors[i] += (val ^ sign) - sign; |
996 | } | 1013 | } |
997 | } | 1014 | } |
998 | 1015 | ||
999 | /** swap buffers */ | 1016 | /** swap buffers */ |
1000 | s->channel[c].scale_factor_idx = !s->channel[c].scale_factor_idx; | 1017 | s->channel[c].scale_factor_idx = !s->channel[c].scale_factor_idx; |
1001 | s->channel[c].table_idx = s->table_idx; | 1018 | s->channel[c].table_idx = s->table_idx; |
@@ -1041,14 +1058,14 @@ static void inverse_channel_transform(WMAProDecodeCtx *s) | |||
1041 | const int32_t* data_end = data + num_channels; | 1058 | const int32_t* data_end = data + num_channels; |
1042 | int32_t* data_ptr = data; | 1059 | int32_t* data_ptr = data; |
1043 | int32_t** ch; | 1060 | int32_t** ch; |
1044 | 1061 | ||
1045 | for (ch = ch_data; ch < ch_end; ch++) | 1062 | for (ch = ch_data; ch < ch_end; ch++) |
1046 | *data_ptr++ = (*ch)[y]; | 1063 | *data_ptr++ = (*ch)[y]; |
1047 | 1064 | ||
1048 | for (ch = ch_data; ch < ch_end; ch++) { | 1065 | for (ch = ch_data; ch < ch_end; ch++) { |
1049 | int32_t sum = 0; | 1066 | int32_t sum = 0; |
1050 | data_ptr = data; | 1067 | data_ptr = data; |
1051 | 1068 | ||
1052 | while (data_ptr < data_end) | 1069 | while (data_ptr < data_end) |
1053 | sum += fixmul16(*mat++, *data_ptr++); | 1070 | sum += fixmul16(*mat++, *data_ptr++); |
1054 | 1071 | ||
@@ -1090,16 +1107,16 @@ static void wmapro_window(WMAProDecodeCtx *s) | |||
1090 | xstart += (winlen - s->subframe_len) >> 1; | 1107 | xstart += (winlen - s->subframe_len) >> 1; |
1091 | winlen = s->subframe_len; | 1108 | winlen = s->subframe_len; |
1092 | } | 1109 | } |
1093 | 1110 | ||
1094 | window = sine_windows[av_log2(winlen) - BLOCK_MIN_BITS]; | 1111 | window = sine_windows[av_log2(winlen) - BLOCK_MIN_BITS]; |
1095 | 1112 | ||
1096 | winlen >>= 1; | 1113 | winlen >>= 1; |
1097 | 1114 | ||
1098 | vector_fixmul_window(xstart, xstart, xstart + winlen, | 1115 | vector_fixmul_window(xstart, xstart, xstart + winlen, |
1099 | window, winlen); | 1116 | window, winlen); |
1100 | 1117 | ||
1101 | s->channel[c].prev_block_len = s->subframe_len; | 1118 | s->channel[c].prev_block_len = s->subframe_len; |
1102 | 1119 | ||
1103 | } | 1120 | } |
1104 | } | 1121 | } |
1105 | 1122 | ||
@@ -1182,7 +1199,7 @@ static int decode_subframe(WMAProDecodeCtx *s) | |||
1182 | int num_fill_bits; | 1199 | int num_fill_bits; |
1183 | if (!(num_fill_bits = get_bits(&s->gb, 2))) { | 1200 | if (!(num_fill_bits = get_bits(&s->gb, 2))) { |
1184 | int len = get_bits(&s->gb, 4); | 1201 | int len = get_bits(&s->gb, 4); |
1185 | num_fill_bits = get_bits(&s->gb, len) + 1; | 1202 | num_fill_bits = (len ? get_bits(&s->gb, len) : 0) + 1; |
1186 | } | 1203 | } |
1187 | 1204 | ||
1188 | if (num_fill_bits >= 0) { | 1205 | if (num_fill_bits >= 0) { |
@@ -1219,7 +1236,12 @@ static int decode_subframe(WMAProDecodeCtx *s) | |||
1219 | int num_bits = av_log2((s->subframe_len + 3)/4) + 1; | 1236 | int num_bits = av_log2((s->subframe_len + 3)/4) + 1; |
1220 | for (i = 0; i < s->channels_for_cur_subframe; i++) { | 1237 | for (i = 0; i < s->channels_for_cur_subframe; i++) { |
1221 | int c = s->channel_indexes_for_cur_subframe[i]; | 1238 | int c = s->channel_indexes_for_cur_subframe[i]; |
1222 | s->channel[c].num_vec_coeffs = get_bits(&s->gb, num_bits) << 2; | 1239 | int num_vec_coeffs = get_bits(&s->gb, num_bits) << 2; |
1240 | if (num_vec_coeffs > s->subframe_len) { | ||
1241 | av_log(s->avctx, AV_LOG_ERROR, "num_vec_coeffs %d is too large\n", num_vec_coeffs); | ||
1242 | return AVERROR_INVALIDDATA; | ||
1243 | } | ||
1244 | s->channel[c].num_vec_coeffs = num_vec_coeffs; | ||
1223 | } | 1245 | } |
1224 | } else { | 1246 | } else { |
1225 | for (i = 0; i < s->channels_for_cur_subframe; i++) { | 1247 | for (i = 0; i < s->channels_for_cur_subframe; i++) { |
@@ -1260,7 +1282,7 @@ static int decode_subframe(WMAProDecodeCtx *s) | |||
1260 | } | 1282 | } |
1261 | } | 1283 | } |
1262 | } | 1284 | } |
1263 | 1285 | ||
1264 | /** decode scale factors */ | 1286 | /** decode scale factors */ |
1265 | if (decode_scale_factors(s) < 0) | 1287 | if (decode_scale_factors(s) < 0) |
1266 | return AVERROR_INVALIDDATA; | 1288 | return AVERROR_INVALIDDATA; |
@@ -1303,24 +1325,24 @@ static int decode_subframe(WMAProDecodeCtx *s) | |||
1303 | const int exp = s->channel[c].quant_step - | 1325 | const int exp = s->channel[c].quant_step - |
1304 | (s->channel[c].max_scale_factor - *sf++) * | 1326 | (s->channel[c].max_scale_factor - *sf++) * |
1305 | s->channel[c].scale_factor_step; | 1327 | s->channel[c].scale_factor_step; |
1306 | 1328 | ||
1307 | if(exp < EXP_MIN || exp > EXP_MAX) { | 1329 | if(exp < EXP_MIN || exp > EXP_MAX) { |
1308 | DEBUGF("in wmaprodec.c : unhandled value for exp (%d), please report sample.\n", exp); | 1330 | DEBUGF("in wmaprodec.c : unhandled value for exp (%d), please report sample.\n", exp); |
1309 | return -1; | 1331 | return -1; |
1310 | } | 1332 | } |
1311 | const int32_t quant = QUANT(exp); | 1333 | const int32_t quant = QUANT(exp); |
1312 | int start = s->cur_sfb_offsets[b]; | 1334 | int start = s->cur_sfb_offsets[b]; |
1313 | 1335 | ||
1314 | vector_fixmul_scalar(s->tmp+start, | 1336 | vector_fixmul_scalar(s->tmp+start, |
1315 | s->channel[c].coeffs + start, | 1337 | s->channel[c].coeffs + start, |
1316 | quant, end-start); | 1338 | quant, end-start); |
1317 | 1339 | ||
1318 | 1340 | ||
1319 | } | 1341 | } |
1320 | 1342 | ||
1321 | /** apply imdct (ff_imdct_half == DCTIV with reverse) */ | 1343 | /** apply imdct (ff_imdct_half == DCTIV with reverse) */ |
1322 | ff_imdct_half(nbits,s->channel[c].coeffs, s->tmp); | 1344 | ff_imdct_half(nbits,s->channel[c].coeffs, s->tmp); |
1323 | 1345 | ||
1324 | } | 1346 | } |
1325 | } | 1347 | } |
1326 | 1348 | ||
@@ -1364,7 +1386,7 @@ static int decode_frame(WMAProDecodeCtx *s) | |||
1364 | s->packet_loss = 1; | 1386 | s->packet_loss = 1; |
1365 | return 0; | 1387 | return 0; |
1366 | } | 1388 | } |
1367 | #endif | 1389 | #endif |
1368 | 1390 | ||
1369 | /** get frame length */ | 1391 | /** get frame length */ |
1370 | if (s->len_prefix) | 1392 | if (s->len_prefix) |
@@ -1481,7 +1503,7 @@ static void save_bits(WMAProDecodeCtx *s, GetBitContext* gb, int len, | |||
1481 | init_put_bits(&s->pb, s->frame_data, MAX_FRAMESIZE); | 1503 | init_put_bits(&s->pb, s->frame_data, MAX_FRAMESIZE); |
1482 | } | 1504 | } |
1483 | 1505 | ||
1484 | buflen = (s->num_saved_bits + len + 8) >> 3; | 1506 | buflen = (put_bits_count(&s->pb) + len + 8) >> 3; |
1485 | 1507 | ||
1486 | if (len <= 0 || buflen > MAX_FRAMESIZE) { | 1508 | if (len <= 0 || buflen > MAX_FRAMESIZE) { |
1487 | DEBUGF("input buffer too small\n"); | 1509 | DEBUGF("input buffer too small\n"); |
@@ -1489,6 +1511,16 @@ static void save_bits(WMAProDecodeCtx *s, GetBitContext* gb, int len, | |||
1489 | return; | 1511 | return; |
1490 | } | 1512 | } |
1491 | 1513 | ||
1514 | #if 0 | ||
1515 | if (len > put_bits_left(&s->pb)) { | ||
1516 | av_log(s->avctx, AV_LOG_ERROR, | ||
1517 | "Cannot append %d bits, only %d bits available.\n", | ||
1518 | len, put_bits_left(&s->pb)); | ||
1519 | s->packet_loss = 1; | ||
1520 | return; | ||
1521 | } | ||
1522 | #endif | ||
1523 | |||
1492 | s->num_saved_bits += len; | 1524 | s->num_saved_bits += len; |
1493 | if (!append) { | 1525 | if (!append) { |
1494 | ff_copy_bits(&s->pb, gb->buffer + (get_bits_count(gb) >> 3), | 1526 | ff_copy_bits(&s->pb, gb->buffer + (get_bits_count(gb) >> 3), |
@@ -1519,7 +1551,7 @@ static void save_bits(WMAProDecodeCtx *s, GetBitContext* gb, int len, | |||
1519 | *@param avpkt input packet | 1551 | *@param avpkt input packet |
1520 | *@return number of bytes that were read from the input buffer | 1552 | *@return number of bytes that were read from the input buffer |
1521 | */ | 1553 | */ |
1522 | int decode_packet(asf_waveformatex_t *wfx, int32_t *dec[2], int *data_size, | 1554 | int decode_packet(asf_waveformatex_t *wfx, int32_t *dec[2], int *data_size, |
1523 | void* pktdata, int size) | 1555 | void* pktdata, int size) |
1524 | { | 1556 | { |
1525 | WMAProDecodeCtx *s = &globWMAProDecCtx; | 1557 | WMAProDecodeCtx *s = &globWMAProDecCtx; |
@@ -1536,8 +1568,8 @@ int decode_packet(asf_waveformatex_t *wfx, int32_t *dec[2], int *data_size, | |||
1536 | memcpy(&s->channel[i].out[0], | 1568 | memcpy(&s->channel[i].out[0], |
1537 | &s->channel[i].out[s->samples_per_frame], | 1569 | &s->channel[i].out[s->samples_per_frame], |
1538 | s->samples_per_frame * sizeof(*s->channel[i].out) >> 1); | 1570 | s->samples_per_frame * sizeof(*s->channel[i].out) >> 1); |
1539 | 1571 | ||
1540 | 1572 | ||
1541 | s->samples = 0; | 1573 | s->samples = 0; |
1542 | *data_size = 0; | 1574 | *data_size = 0; |
1543 | 1575 | ||
@@ -1546,8 +1578,11 @@ int decode_packet(asf_waveformatex_t *wfx, int32_t *dec[2], int *data_size, | |||
1546 | s->buf_bit_size = buf_size << 3; | 1578 | s->buf_bit_size = buf_size << 3; |
1547 | 1579 | ||
1548 | /** sanity check for the buffer length */ | 1580 | /** sanity check for the buffer length */ |
1549 | if (buf_size < wfx->blockalign) | 1581 | if (buf_size < wfx->blockalign) { |
1550 | return 0; | 1582 | av_log(wfx, AV_LOG_ERROR, "Input packet too small (%d < %d)\n", |
1583 | buf_size, wfx->block_align); | ||
1584 | return AVERROR_INVALIDDATA; | ||
1585 | } | ||
1551 | 1586 | ||
1552 | buf_size = wfx->blockalign; | 1587 | buf_size = wfx->blockalign; |
1553 | 1588 | ||
@@ -1568,9 +1603,15 @@ int decode_packet(asf_waveformatex_t *wfx, int32_t *dec[2], int *data_size, | |||
1568 | DEBUGF("Packet loss detected! seq %x vs %x\n", | 1603 | DEBUGF("Packet loss detected! seq %x vs %x\n", |
1569 | s->packet_sequence_number, packet_sequence_number); | 1604 | s->packet_sequence_number, packet_sequence_number); |
1570 | } | 1605 | } |
1606 | |||
1571 | s->packet_sequence_number = packet_sequence_number; | 1607 | s->packet_sequence_number = packet_sequence_number; |
1572 | 1608 | ||
1573 | if (num_bits_prev_frame > 0) { | 1609 | if (num_bits_prev_frame > 0) { |
1610 | int remaining_packet_bits = s->buf_bit_size - get_bits_count(gb); | ||
1611 | if (num_bits_prev_frame >= remaining_packet_bits) { | ||
1612 | num_bits_prev_frame = remaining_packet_bits; | ||
1613 | s->packet_done = 1; | ||
1614 | } | ||
1574 | /** append the previous frame data to the remaining data from the | 1615 | /** append the previous frame data to the remaining data from the |
1575 | previous packet to create a full frame */ | 1616 | previous packet to create a full frame */ |
1576 | save_bits(s, gb, num_bits_prev_frame, 1); | 1617 | save_bits(s, gb, num_bits_prev_frame, 1); |
@@ -1585,8 +1626,13 @@ int decode_packet(asf_waveformatex_t *wfx, int32_t *dec[2], int *data_size, | |||
1585 | s->num_saved_bits - s->frame_offset); | 1626 | s->num_saved_bits - s->frame_offset); |
1586 | } | 1627 | } |
1587 | 1628 | ||
1588 | s->packet_loss = 0; | 1629 | if (s->packet_loss) { |
1589 | 1630 | /** reset number of saved bits so that the decoder | |
1631 | does not start to decode incomplete frames in the | ||
1632 | s->len_prefix == 0 case */ | ||
1633 | s->num_saved_bits = 0; | ||
1634 | s->packet_loss = 0; | ||
1635 | } | ||
1590 | } else { | 1636 | } else { |
1591 | int frame_size; | 1637 | int frame_size; |
1592 | s->buf_bit_size = size << 3; | 1638 | s->buf_bit_size = size << 3; |
@@ -1596,11 +1642,17 @@ int decode_packet(asf_waveformatex_t *wfx, int32_t *dec[2], int *data_size, | |||
1596 | (frame_size = show_bits(gb, s->log2_frame_size)) && | 1642 | (frame_size = show_bits(gb, s->log2_frame_size)) && |
1597 | frame_size <= remaining_bits(s, gb)) { | 1643 | frame_size <= remaining_bits(s, gb)) { |
1598 | save_bits(s, gb, frame_size, 0); | 1644 | save_bits(s, gb, frame_size, 0); |
1599 | s->packet_done = !decode_frame(s); | 1645 | if (!s->packet_loss) |
1646 | s->packet_done = !decode_frame(s); | ||
1600 | } else | 1647 | } else |
1601 | s->packet_done = 1; | 1648 | s->packet_done = 1; |
1602 | } | 1649 | } |
1603 | 1650 | ||
1651 | if (remaining_bits(s, gb) < 0) { | ||
1652 | av_log(wctx, AV_LOG_ERROR, "Overread %d\n", -remaining_bits(s, gb)); | ||
1653 | s->packet_loss = 1; | ||
1654 | } | ||
1655 | |||
1604 | if (s->packet_done && !s->packet_loss && | 1656 | if (s->packet_done && !s->packet_loss && |
1605 | remaining_bits(s, gb) > 0) { | 1657 | remaining_bits(s, gb) > 0) { |
1606 | /** save the rest of the data so that it can be decoded | 1658 | /** save the rest of the data so that it can be decoded |
@@ -1610,7 +1662,7 @@ int decode_packet(asf_waveformatex_t *wfx, int32_t *dec[2], int *data_size, | |||
1610 | 1662 | ||
1611 | dec[0] = s->channel[0].out; | 1663 | dec[0] = s->channel[0].out; |
1612 | dec[1] = s->channel[1].out; | 1664 | dec[1] = s->channel[1].out; |
1613 | 1665 | ||
1614 | *data_size = s->samples; | 1666 | *data_size = s->samples; |
1615 | s->packet_offset = get_bits_count(gb) & 7; | 1667 | s->packet_offset = get_bits_count(gb) & 7; |
1616 | 1668 | ||