00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00029 #define CONFIG_AC3ENC_FLOAT 1
00030 #include "ac3enc.c"
00031
00032
00036 static av_cold void mdct_end(AC3MDCTContext *mdct)
00037 {
00038 ff_mdct_end(&mdct->fft);
00039 av_freep(&mdct->window);
00040 }
00041
00042
00047 static av_cold int mdct_init(AVCodecContext *avctx, AC3MDCTContext *mdct,
00048 int nbits)
00049 {
00050 float *window;
00051 int i, n, n2;
00052
00053 n = 1 << nbits;
00054 n2 = n >> 1;
00055
00056 window = av_malloc(n * sizeof(*window));
00057 if (!window) {
00058 av_log(avctx, AV_LOG_ERROR, "Cannot allocate memory.\n");
00059 return AVERROR(ENOMEM);
00060 }
00061 ff_kbd_window_init(window, 5.0, n2);
00062 for (i = 0; i < n2; i++)
00063 window[n-1-i] = window[i];
00064 mdct->window = window;
00065
00066 return ff_mdct_init(&mdct->fft, nbits, 0, -2.0 / n);
00067 }
00068
00069
00075 static void mdct512(AC3MDCTContext *mdct, float *out, float *in)
00076 {
00077 ff_mdct_calc(&mdct->fft, out, in);
00078 }
00079
00080
00084 static void apply_window(DSPContext *dsp, float *output, const float *input,
00085 const float *window, int n)
00086 {
00087 dsp->vector_fmul(output, input, window, n);
00088 }
00089
00090
00094 static int normalize_samples(AC3EncodeContext *s)
00095 {
00096
00097 return 0;
00098 }
00099
00100
00104 static void scale_coefficients(AC3EncodeContext *s)
00105 {
00106 int i;
00107 for (i = 0; i < AC3_MAX_COEFS * AC3_MAX_BLOCKS * s->channels; i++)
00108 s->fixed_coef_buffer[i] = SCALE_FLOAT(s->mdct_coef_buffer[i], 24);
00109 }
00110
00111
00112 AVCodec ff_ac3_encoder = {
00113 "ac3",
00114 AVMEDIA_TYPE_AUDIO,
00115 CODEC_ID_AC3,
00116 sizeof(AC3EncodeContext),
00117 ac3_encode_init,
00118 ac3_encode_frame,
00119 ac3_encode_close,
00120 NULL,
00121 .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_FLT,AV_SAMPLE_FMT_NONE},
00122 .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52A (AC-3)"),
00123 .channel_layouts = ac3_channel_layouts,
00124 };