comparison aacsbr.c @ 11671:7f301b81b503 libavcodec

Move the SBR patch count check to prevent overwrites. Thanks to Chromium.
author alexc
date Fri, 30 Apr 2010 23:08:44 +0000
parents 53584d5f86b8
children f838fa3eefee
comparison
equal deleted inserted replaced
11670:53584d5f86b8 11671:7f301b81b503
517 for (i = k; i == k || sb > (sbr->k[0] - 1 + msb - odd); i--) { 517 for (i = k; i == k || sb > (sbr->k[0] - 1 + msb - odd); i--) {
518 sb = sbr->f_master[i]; 518 sb = sbr->f_master[i];
519 odd = (sb + sbr->k[0]) & 1; 519 odd = (sb + sbr->k[0]) & 1;
520 } 520 }
521 521
522 // Requirements (14496-3 sp04 p205) sets the maximum number of patches to 5.
523 // After this check the final number of patches can still be six which is
524 // illegal however the Coding Technologies decoder check stream has a final
525 // count of 6 patches
526 if (sbr->num_patches > 5) {
527 av_log(ac->avccontext, AV_LOG_ERROR, "Too many patches: %d\n", sbr->num_patches);
528 return -1;
529 }
530
522 sbr->patch_num_subbands[sbr->num_patches] = FFMAX(sb - usb, 0); 531 sbr->patch_num_subbands[sbr->num_patches] = FFMAX(sb - usb, 0);
523 sbr->patch_start_subband[sbr->num_patches] = sbr->k[0] - odd - sbr->patch_num_subbands[sbr->num_patches]; 532 sbr->patch_start_subband[sbr->num_patches] = sbr->k[0] - odd - sbr->patch_num_subbands[sbr->num_patches];
524 533
525 if (sbr->patch_num_subbands[sbr->num_patches] > 0) { 534 if (sbr->patch_num_subbands[sbr->num_patches] > 0) {
526 usb = sb; 535 usb = sb;
533 k = sbr->n_master; 542 k = sbr->n_master;
534 } while (sb != sbr->kx[1] + sbr->m[1]); 543 } while (sb != sbr->kx[1] + sbr->m[1]);
535 544
536 if (sbr->patch_num_subbands[sbr->num_patches-1] < 3 && sbr->num_patches > 1) 545 if (sbr->patch_num_subbands[sbr->num_patches-1] < 3 && sbr->num_patches > 1)
537 sbr->num_patches--; 546 sbr->num_patches--;
538
539 // Requirements (14496-3 sp04 p205) sets the maximum number of patches to 5
540 // However the Coding Technologies decoder check uses 6 patches
541 if (sbr->num_patches > 6) {
542 av_log(ac->avccontext, AV_LOG_ERROR, "Too many patches: %d\n", sbr->num_patches);
543 return -1;
544 }
545 547
546 return 0; 548 return 0;
547 } 549 }
548 550
549 /// Derived Frequency Band Tables (14496-3 sp04 p197) 551 /// Derived Frequency Band Tables (14496-3 sp04 p197)