|
|
|
@@ -37,9 +37,6 @@ static const char* liba52name = "liba52.so.0"; |
|
|
|
* released under the GPL license. |
|
|
|
*/ |
|
|
|
typedef struct AC3DecodeState { |
|
|
|
uint8_t inbuf[4096]; /* input buffer */ |
|
|
|
uint8_t *inbuf_ptr; |
|
|
|
int frame_size; |
|
|
|
int flags; |
|
|
|
int channels; |
|
|
|
a52_state_t* state; |
|
|
|
@@ -114,8 +111,6 @@ static int a52_decode_init(AVCodecContext *avctx) |
|
|
|
#endif |
|
|
|
s->state = s->a52_init(0); /* later use CPU flags */ |
|
|
|
s->samples = s->a52_samples(s->state); |
|
|
|
s->inbuf_ptr = s->inbuf; |
|
|
|
s->frame_size = 0; |
|
|
|
|
|
|
|
/* allow downmixing to stereo or mono */ |
|
|
|
if (avctx->channels > 0 && avctx->request_channels > 0 && |
|
|
|
@@ -150,7 +145,6 @@ static int a52_decode_frame(AVCodecContext *avctx, |
|
|
|
uint8_t *buf, int buf_size) |
|
|
|
{ |
|
|
|
AC3DecodeState *s = avctx->priv_data; |
|
|
|
uint8_t *buf_ptr; |
|
|
|
int flags, i, len; |
|
|
|
int sample_rate, bit_rate; |
|
|
|
short *out_samples = data; |
|
|
|
@@ -161,26 +155,19 @@ static int a52_decode_frame(AVCodecContext *avctx, |
|
|
|
|
|
|
|
*data_size= 0; |
|
|
|
|
|
|
|
buf_ptr = buf; |
|
|
|
while (buf_size > 0) { |
|
|
|
len = s->inbuf_ptr - s->inbuf; |
|
|
|
if (s->frame_size == 0) { |
|
|
|
/* no header seen : find one. We need at least 7 bytes to parse it */ |
|
|
|
len = HEADER_SIZE - len; |
|
|
|
if (len > buf_size) |
|
|
|
len = buf_size; |
|
|
|
memcpy(s->inbuf_ptr, buf_ptr, len); |
|
|
|
buf_ptr += len; |
|
|
|
s->inbuf_ptr += len; |
|
|
|
buf_size -= len; |
|
|
|
if ((s->inbuf_ptr - s->inbuf) == HEADER_SIZE) { |
|
|
|
len = s->a52_syncinfo(s->inbuf, &s->flags, &sample_rate, &bit_rate); |
|
|
|
if (buf_size < HEADER_SIZE) { |
|
|
|
av_log(avctx, AV_LOG_ERROR, "Error decoding frame, not enough bytes for header\n"); |
|
|
|
return -1; |
|
|
|
} |
|
|
|
len = s->a52_syncinfo(buf, &s->flags, &sample_rate, &bit_rate); |
|
|
|
if (len == 0) { |
|
|
|
/* no sync found : move by one byte (inefficient, but simple!) */ |
|
|
|
memcpy(s->inbuf, s->inbuf + 1, HEADER_SIZE - 1); |
|
|
|
s->inbuf_ptr--; |
|
|
|
} else { |
|
|
|
s->frame_size = len; |
|
|
|
av_log(avctx, AV_LOG_ERROR, "Error decoding frame, no sync byte at begin\n"); |
|
|
|
return -1; |
|
|
|
} |
|
|
|
if (buf_size < len) { |
|
|
|
av_log(avctx, AV_LOG_ERROR, "Error decoding frame, not enough bytes\n"); |
|
|
|
return -1; |
|
|
|
} |
|
|
|
/* update codec info */ |
|
|
|
avctx->sample_rate = sample_rate; |
|
|
|
s->channels = ac3_channels[s->flags & 7]; |
|
|
|
@@ -194,18 +181,6 @@ static int a52_decode_frame(AVCodecContext *avctx, |
|
|
|
avctx->channels = s->channels; |
|
|
|
} |
|
|
|
avctx->bit_rate = bit_rate; |
|
|
|
} |
|
|
|
} |
|
|
|
} else if (len < s->frame_size) { |
|
|
|
len = s->frame_size - len; |
|
|
|
if (len > buf_size) |
|
|
|
len = buf_size; |
|
|
|
|
|
|
|
memcpy(s->inbuf_ptr, buf_ptr, len); |
|
|
|
buf_ptr += len; |
|
|
|
s->inbuf_ptr += len; |
|
|
|
buf_size -= len; |
|
|
|
} else { |
|
|
|
flags = s->flags; |
|
|
|
if (avctx->channels == 1) |
|
|
|
flags = A52_MONO; |
|
|
|
@@ -214,25 +189,18 @@ static int a52_decode_frame(AVCodecContext *avctx, |
|
|
|
else |
|
|
|
flags |= A52_ADJUST_LEVEL; |
|
|
|
level = 1; |
|
|
|
if (s->a52_frame(s->state, s->inbuf, &flags, &level, 384)) { |
|
|
|
if (s->a52_frame(s->state, buf, &flags, &level, 384)) { |
|
|
|
fail: |
|
|
|
av_log(avctx, AV_LOG_ERROR, "Error decoding frame\n"); |
|
|
|
s->inbuf_ptr = s->inbuf; |
|
|
|
s->frame_size = 0; |
|
|
|
continue; |
|
|
|
return -1; |
|
|
|
} |
|
|
|
for (i = 0; i < 6; i++) { |
|
|
|
if (s->a52_block(s->state)) |
|
|
|
goto fail; |
|
|
|
float_to_int(s->samples, out_samples + i * 256 * avctx->channels, avctx->channels); |
|
|
|
} |
|
|
|
s->inbuf_ptr = s->inbuf; |
|
|
|
s->frame_size = 0; |
|
|
|
*data_size = 6 * avctx->channels * 256 * sizeof(int16_t); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
return buf_ptr - buf; |
|
|
|
return len; |
|
|
|
} |
|
|
|
|
|
|
|
static int a52_decode_end(AVCodecContext *avctx) |
|
|
|
|