mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
mpegaudiodec: Prevent premature clipping of mp3 input buffer.
Instead of clipping extrasize based on EXTRABYTES, clip based on the amount of buffer actually left. Without this fix, there are warbles and other distortions in the test case below. http://kevincennis.com/mix/assets/sounds/1901_voxfx.mp3
This commit is contained in:
parent
655b24c01c
commit
b716542691
@ -40,6 +40,7 @@
|
|||||||
|
|
||||||
#define BACKSTEP_SIZE 512
|
#define BACKSTEP_SIZE 512
|
||||||
#define EXTRABYTES 24
|
#define EXTRABYTES 24
|
||||||
|
#define LAST_BUF_SIZE 2 * BACKSTEP_SIZE + EXTRABYTES
|
||||||
|
|
||||||
/* layer 3 "granule" */
|
/* layer 3 "granule" */
|
||||||
typedef struct GranuleDef {
|
typedef struct GranuleDef {
|
||||||
@ -63,7 +64,7 @@ typedef struct GranuleDef {
|
|||||||
|
|
||||||
typedef struct MPADecodeContext {
|
typedef struct MPADecodeContext {
|
||||||
MPA_DECODE_HEADER
|
MPA_DECODE_HEADER
|
||||||
uint8_t last_buf[2 * BACKSTEP_SIZE + EXTRABYTES];
|
uint8_t last_buf[LAST_BUF_SIZE];
|
||||||
int last_buf_size;
|
int last_buf_size;
|
||||||
/* next header (used in free format parsing) */
|
/* next header (used in free format parsing) */
|
||||||
uint32_t free_format_next_header;
|
uint32_t free_format_next_header;
|
||||||
@ -1378,7 +1379,8 @@ static int mp_decode_layer3(MPADecodeContext *s)
|
|||||||
if (!s->adu_mode) {
|
if (!s->adu_mode) {
|
||||||
int skip;
|
int skip;
|
||||||
const uint8_t *ptr = s->gb.buffer + (get_bits_count(&s->gb)>>3);
|
const uint8_t *ptr = s->gb.buffer + (get_bits_count(&s->gb)>>3);
|
||||||
int extrasize = av_clip(get_bits_left(&s->gb) >> 3, 0, EXTRABYTES);
|
int extrasize = av_clip(get_bits_left(&s->gb) >> 3, 0,
|
||||||
|
FFMAX(0, LAST_BUF_SIZE - s->last_buf_size));
|
||||||
assert((get_bits_count(&s->gb) & 7) == 0);
|
assert((get_bits_count(&s->gb) & 7) == 0);
|
||||||
/* now we get bits from the main_data_begin offset */
|
/* now we get bits from the main_data_begin offset */
|
||||||
av_dlog(s->avctx, "seekback: %d\n", main_data_begin);
|
av_dlog(s->avctx, "seekback: %d\n", main_data_begin);
|
||||||
|
Loading…
Reference in New Issue
Block a user