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 n, n2;
00052
00053 n = 1 << nbits;
00054 n2 = n >> 1;
00055
00056 window = av_malloc(n2 * 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 mdct->window = window;
00063
00064 return ff_mdct_init(&mdct->fft, nbits, 0, -2.0 / n);
00065 }
00066
00067
00073 static void mdct512(AC3MDCTContext *mdct, float *out, float *in)
00074 {
00075 ff_mdct_calc(&mdct->fft, out, in);
00076 }
00077
00078
00082 static void apply_window(float *output, const float *input,
00083 const float *window, int n)
00084 {
00085 int i;
00086 int n2 = n >> 1;
00087
00088 for (i = 0; i < n2; i++) {
00089 output[i] = input[i] * window[i];
00090 output[n-i-1] = input[n-i-1] * window[i];
00091 }
00092 }
00093
00094
00098 static int normalize_samples(AC3EncodeContext *s)
00099 {
00100
00101 return 0;
00102 }
00103
00104
00108 static void scale_coefficients(AC3EncodeContext *s)
00109 {
00110 int i;
00111 for (i = 0; i < AC3_MAX_COEFS * AC3_MAX_BLOCKS * s->channels; i++)
00112 s->fixed_coef_buffer[i] = SCALE_FLOAT(s->mdct_coef_buffer[i], 24);
00113 }
00114
00115
00116 AVCodec ac3_encoder = {
00117 "ac3",
00118 AVMEDIA_TYPE_AUDIO,
00119 CODEC_ID_AC3,
00120 sizeof(AC3EncodeContext),
00121 ac3_encode_init,
00122 ac3_encode_frame,
00123 ac3_encode_close,
00124 NULL,
00125 .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_FLT,AV_SAMPLE_FMT_NONE},
00126 .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52A (AC-3)"),
00127 .channel_layouts = ac3_channel_layouts,
00128 };