#include <stdint.h>
+#include "libavutil/internal.h"
/* prototypes for static functions in ac3enc_fixed.c and ac3enc_float.c */
static void scale_coefficients(AC3EncodeContext *s);
-static void apply_window(DSPContext *dsp, SampleType *output,
- const SampleType *input, const SampleType *window,
- unsigned int len);
-
static int normalize_samples(AC3EncodeContext *s);
static void clip_coefficients(DSPContext *dsp, CoefType *coef, unsigned int len);
}
-/**
- * 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]));
}
}
-/**
+/*
* Apply the MDCT to input samples to generate frequency coefficients.
* This applies the KBD window and normalizes the input to reduce precision
* loss due to fixed-point calculations.
AC3Block *block = &s->blocks[blk];
const SampleType *input_samples = &s->planar_samples[ch][blk * AC3_BLOCK_SIZE];
- apply_window(&s->dsp, s->windowed_samples, input_samples,
- s->mdct_window, AC3_WINDOW_SIZE);
+#if CONFIG_AC3ENC_FLOAT
+ s->fdsp.vector_fmul(s->windowed_samples, input_samples,
+ s->mdct_window, AC3_WINDOW_SIZE);
+#else
+ s->ac3dsp.apply_window_int16(s->windowed_samples, input_samples,
+ s->mdct_window, AC3_WINDOW_SIZE);
+#endif
if (s->fixed_point)
block->coeff_shift[ch+1] = normalize_samples(s);
}
-/**
+/*
* Calculate coupling channel and coupling coordinates.
*/
static void apply_channel_coupling(AC3EncodeContext *s)
}
-/**
+/*
* Determine rematrixing flags for each block and band.
*/
static void compute_rematrixing_strategy(AC3EncodeContext *s)
{
int nb_coefs;
int blk, bnd, i;
- AC3Block *block, *av_uninit(block0);
+ AC3Block *block, *block0;
if (s->channel_mode != AC3_CHMODE_STEREO)
return;
}
-/**
- * Encode a single AC-3 frame.
- */
-int AC3_NAME(encode_frame)(AVCodecContext *avctx, unsigned char *frame,
- int buf_size, void *data)
+int AC3_NAME(encode_frame)(AVCodecContext *avctx, AVPacket *avpkt,
+ const AVFrame *frame, int *got_packet_ptr)
{
AC3EncodeContext *s = avctx->priv_data;
- const SampleType *samples = data;
int ret;
if (s->options.allow_per_frame_metadata) {
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);
ff_ac3_quantize_mantissas(s);
- ff_ac3_output_frame(s, frame);
+ if ((ret = ff_alloc_packet(avpkt, s->frame_size))) {
+ av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n");
+ return ret;
+ }
+ ff_ac3_output_frame(s, avpkt->data);
- return s->frame_size;
+ if (frame->pts != AV_NOPTS_VALUE)
+ avpkt->pts = frame->pts - ff_samples_to_time_base(avctx, avctx->delay);
+
+ *got_packet_ptr = 1;
+ return 0;
}