Author: alexc Date: Thu Nov 26 22:52:50 2009 New Revision: 5457 Log: Read SBR bits from a second GetBitContext to prevent unrecoverable over-reads and get automatic under-read protection.
Modified: aac-sbr/aacsbr.c Modified: aac-sbr/aacsbr.c ============================================================================== --- aac-sbr/aacsbr.c Fri Nov 20 21:48:49 2009 (r5456) +++ aac-sbr/aacsbr.c Thu Nov 26 22:52:50 2009 (r5457) @@ -792,9 +792,13 @@ static void sbr_reset(AACContext *ac, Sp * @return Returns number of bytes consumed from the TYPE_FIL element. */ int ff_decode_sbr_extension(AACContext *ac, SpectralBandReplication *sbr, - GetBitContext *gb, int crc, int cnt, int id_aac) + GetBitContext *gb_host, int crc, int cnt, int id_aac) { unsigned int num_sbr_bits = 0, num_align_bits; + unsigned bytes_read; + GetBitContext gbc = *gb_host; + GetBitContext *gb = &gbc; + skip_bits_long(gb_host, cnt*8 - 4); if (crc) { skip_bits(gb, 10); // bs_sbr_crc_bits; FIXME - implement CRC check @@ -812,9 +816,11 @@ int ff_decode_sbr_extension(AACContext * num_sbr_bits += sbr_data(ac, sbr, gb, id_aac); num_align_bits = ((cnt << 3) - 4 - num_sbr_bits) & 7; - skip_bits(gb, num_align_bits); // bs_fill_bits - - return (num_sbr_bits + num_align_bits + 4) >> 3; + bytes_read = ((num_sbr_bits + num_align_bits + 4) / 8); + if (bytes_read > cnt) { + av_log(ac->avccontext, AV_LOG_ERROR, "Expected to read %d SBR bytes actually read %d.\n", cnt, bytes_read); + } + return cnt; } // Time/frequency Grid (14496-3 sp04 p200) _______________________________________________ FFmpeg-soc mailing list FFmpeg-soc@mplayerhq.hu https://lists.mplayerhq.hu/mailman/listinfo/ffmpeg-soc