|
|
|
@ -65,30 +65,23 @@ alloc_fail: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Deinterleave input samples. |
|
|
|
|
* Copy input samples. |
|
|
|
|
* Channels are reordered from Libav's default order to AC-3 order. |
|
|
|
|
*/ |
|
|
|
|
static void deinterleave_input_samples(AC3EncodeContext *s, |
|
|
|
|
const SampleType *samples) |
|
|
|
|
static void copy_input_samples(AC3EncodeContext *s, SampleType **samples) |
|
|
|
|
{ |
|
|
|
|
int ch, i; |
|
|
|
|
int ch; |
|
|
|
|
|
|
|
|
|
/* deinterleave and remap input samples */ |
|
|
|
|
/* copy and remap input samples */ |
|
|
|
|
for (ch = 0; ch < s->channels; ch++) { |
|
|
|
|
const SampleType *sptr; |
|
|
|
|
int sinc; |
|
|
|
|
|
|
|
|
|
/* copy last 256 samples of previous frame to the start of the current frame */ |
|
|
|
|
memcpy(&s->planar_samples[ch][0], &s->planar_samples[ch][AC3_BLOCK_SIZE * s->num_blocks], |
|
|
|
|
AC3_BLOCK_SIZE * sizeof(s->planar_samples[0][0])); |
|
|
|
|
|
|
|
|
|
/* deinterleave */ |
|
|
|
|
sinc = s->channels; |
|
|
|
|
sptr = samples + s->channel_map[ch]; |
|
|
|
|
for (i = AC3_BLOCK_SIZE; i < AC3_BLOCK_SIZE * (s->num_blocks + 1); i++) { |
|
|
|
|
s->planar_samples[ch][i] = *sptr; |
|
|
|
|
sptr += sinc; |
|
|
|
|
} |
|
|
|
|
/* copy new samples for current frame */ |
|
|
|
|
memcpy(&s->planar_samples[ch][AC3_BLOCK_SIZE], |
|
|
|
|
samples[s->channel_map[ch]], |
|
|
|
|
AC3_BLOCK_SIZE * s->num_blocks * sizeof(s->planar_samples[0][0])); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -400,7 +393,6 @@ int AC3_NAME(encode_frame)(AVCodecContext *avctx, AVPacket *avpkt, |
|
|
|
|
const AVFrame *frame, int *got_packet_ptr) |
|
|
|
|
{ |
|
|
|
|
AC3EncodeContext *s = avctx->priv_data; |
|
|
|
|
const SampleType *samples = (const SampleType *)frame->data[0]; |
|
|
|
|
int ret; |
|
|
|
|
|
|
|
|
|
if (s->options.allow_per_frame_metadata) { |
|
|
|
@ -412,7 +404,7 @@ int AC3_NAME(encode_frame)(AVCodecContext *avctx, AVPacket *avpkt, |
|
|
|
|
if (s->bit_alloc.sr_code == 1 || s->eac3) |
|
|
|
|
ff_ac3_adjust_frame_size(s); |
|
|
|
|
|
|
|
|
|
deinterleave_input_samples(s, samples); |
|
|
|
|
copy_input_samples(s, (SampleType **)frame->extended_data); |
|
|
|
|
|
|
|
|
|
apply_mdct(s); |
|
|
|
|
|
|
|
|
|