summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSolomon Peachy <pizza@shaftnet.org>2020-10-27 15:00:48 -0400
committerSolomon Peachy <pizza@shaftnet.org>2020-10-28 02:12:01 +0000
commitbcbf8bbf0a0884d66eab55747f9787c393ca7e1a (patch)
tree273b10d266ae0783bcef44a97b7c5f924b7aac27
parenta5a19a33706a68a225e6df1ca627e654619f3a84 (diff)
downloadrockbox-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
-rwxr-xr-xlib/rbcodec/codecs/libwmapro/wmaprodec.c130
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 */
1522int decode_packet(asf_waveformatex_t *wfx, int32_t *dec[2], int *data_size, 1554int 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