]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/ac3enc_template.c
swscale: Provide the right alignment for external mmx asm
[ffmpeg] / libavcodec / ac3enc_template.c
index 7e2bf3a9caaffdb0d6e3bc9081e605bafeccb342..6e0a2b6f34c7795f2bb12fd61bd1fceffa33f6c4 100644 (file)
@@ -33,7 +33,7 @@
 
 static void scale_coefficients(AC3EncodeContext *s);
 
-static void apply_window(DSPContext *dsp, SampleType *output,
+static void apply_window(void *dsp, SampleType *output,
                          const SampleType *input, const SampleType *window,
                          unsigned int len);
 
@@ -64,7 +64,7 @@ alloc_fail:
 }
 
 
-/**
+/*
  * Deinterleave input samples.
  * Channels are reordered from Libav's default order to AC-3 order.
  */
@@ -93,7 +93,7 @@ static void deinterleave_input_samples(AC3EncodeContext *s,
 }
 
 
-/**
+/*
  * 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.
@@ -107,8 +107,13 @@ static void apply_mdct(AC3EncodeContext *s)
             AC3Block *block = &s->blocks[blk];
             const SampleType *input_samples = &s->planar_samples[ch][blk * AC3_BLOCK_SIZE];
 
+#if CONFIG_AC3ENC_FLOAT
+            apply_window(&s->fdsp, s->windowed_samples, input_samples,
+                         s->mdct_window, AC3_WINDOW_SIZE);
+#else
             apply_window(&s->dsp, s->windowed_samples, input_samples,
                          s->mdct_window, AC3_WINDOW_SIZE);
+#endif
 
             if (s->fixed_point)
                 block->coeff_shift[ch+1] = normalize_samples(s);
@@ -120,7 +125,7 @@ static void apply_mdct(AC3EncodeContext *s)
 }
 
 
-/**
+/*
  * Calculate coupling channel and coupling coordinates.
  */
 static void apply_channel_coupling(AC3EncodeContext *s)
@@ -328,14 +333,14 @@ 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;
@@ -391,14 +396,11 @@ static void compute_rematrixing_strategy(AC3EncodeContext *s)
 }
 
 
-/**
- * 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;
+    const SampleType *samples = (const SampleType *)frame->data[0];
     int ret;
 
     if (s->options.allow_per_frame_metadata) {
@@ -445,7 +447,15 @@ int AC3_NAME(encode_frame)(AVCodecContext *avctx, unsigned char *frame,
 
     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;
 }