diff options
Diffstat (limited to 'aac-enc.c')
-rw-r--r-- | aac-enc.c | 240 |
1 files changed, 0 insertions, 240 deletions
diff --git a/aac-enc.c b/aac-enc.c deleted file mode 100644 index 9365cc9..0000000 --- a/aac-enc.c +++ /dev/null @@ -1,240 +0,0 @@ -/* ------------------------------------------------------------------ - * Copyright (C) 2011 Martin Storsjo - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. - * See the License for the specific language governing permissions - * and limitations under the License. - * ------------------------------------------------------------------- - */ - -#include <stdio.h> -#include <stdint.h> - -#if defined(_MSC_VER) -#include <getopt.h> -#else -#include <unistd.h> -#endif - -#include <stdlib.h> -#include "libAACenc/include/aacenc_lib.h" -#include "wavreader.h" - -void usage(const char* name) { - fprintf(stderr, "%s [-r bitrate] [-t aot] [-a afterburner] [-s sbr] [-v vbr] in.wav out.aac\n", name); - fprintf(stderr, "Supported AOTs:\n"); - fprintf(stderr, "\t2\tAAC-LC\n"); - fprintf(stderr, "\t5\tHE-AAC\n"); - fprintf(stderr, "\t29\tHE-AAC v2\n"); - fprintf(stderr, "\t23\tAAC-LD\n"); - fprintf(stderr, "\t39\tAAC-ELD\n"); -} - -int main(int argc, char *argv[]) { - int bitrate = 64000; - int ch; - const char *infile, *outfile; - FILE *out; - void *wav; - int format, sample_rate, channels, bits_per_sample; - int input_size; - uint8_t* input_buf; - int16_t* convert_buf; - int aot = 2; - int afterburner = 1; - int eld_sbr = 0; - int vbr = 0; - HANDLE_AACENCODER handle; - CHANNEL_MODE mode; - AACENC_InfoStruct info = { 0 }; - while ((ch = getopt(argc, argv, "r:t:a:s:v:")) != -1) { - switch (ch) { - case 'r': - bitrate = atoi(optarg); - break; - case 't': - aot = atoi(optarg); - break; - case 'a': - afterburner = atoi(optarg); - break; - case 's': - eld_sbr = atoi(optarg); - break; - case 'v': - vbr = atoi(optarg); - break; - case '?': - default: - usage(argv[0]); - return 1; - } - } - if (argc - optind < 2) { - usage(argv[0]); - return 1; - } - infile = argv[optind]; - outfile = argv[optind + 1]; - - wav = wav_read_open(infile); - if (!wav) { - fprintf(stderr, "Unable to open wav file %s\n", infile); - return 1; - } - if (!wav_get_header(wav, &format, &channels, &sample_rate, &bits_per_sample, NULL)) { - fprintf(stderr, "Bad wav file %s\n", infile); - return 1; - } - if (format != 1) { - fprintf(stderr, "Unsupported WAV format %d\n", format); - return 1; - } - if (bits_per_sample != 16) { - fprintf(stderr, "Unsupported WAV sample depth %d\n", bits_per_sample); - return 1; - } - switch (channels) { - case 1: mode = MODE_1; break; - case 2: mode = MODE_2; break; - case 3: mode = MODE_1_2; break; - case 4: mode = MODE_1_2_1; break; - case 5: mode = MODE_1_2_2; break; - case 6: mode = MODE_1_2_2_1; break; - default: - fprintf(stderr, "Unsupported WAV channels %d\n", channels); - return 1; - } - if (aacEncOpen(&handle, 0, channels) != AACENC_OK) { - fprintf(stderr, "Unable to open encoder\n"); - return 1; - } - if (aacEncoder_SetParam(handle, AACENC_AOT, aot) != AACENC_OK) { - fprintf(stderr, "Unable to set the AOT\n"); - return 1; - } - if (aot == 39 && eld_sbr) { - if (aacEncoder_SetParam(handle, AACENC_SBR_MODE, 1) != AACENC_OK) { - fprintf(stderr, "Unable to set SBR mode for ELD\n"); - return 1; - } - } - if (aacEncoder_SetParam(handle, AACENC_SAMPLERATE, sample_rate) != AACENC_OK) { - fprintf(stderr, "Unable to set the AOT\n"); - return 1; - } - if (aacEncoder_SetParam(handle, AACENC_CHANNELMODE, mode) != AACENC_OK) { - fprintf(stderr, "Unable to set the channel mode\n"); - return 1; - } - if (aacEncoder_SetParam(handle, AACENC_CHANNELORDER, 1) != AACENC_OK) { - fprintf(stderr, "Unable to set the wav channel order\n"); - return 1; - } - if (vbr) { - if (aacEncoder_SetParam(handle, AACENC_BITRATEMODE, vbr) != AACENC_OK) { - fprintf(stderr, "Unable to set the VBR bitrate mode\n"); - return 1; - } - } else { - if (aacEncoder_SetParam(handle, AACENC_BITRATE, bitrate) != AACENC_OK) { - fprintf(stderr, "Unable to set the bitrate\n"); - return 1; - } - } - if (aacEncoder_SetParam(handle, AACENC_TRANSMUX, 2) != AACENC_OK) { - fprintf(stderr, "Unable to set the ADTS transmux\n"); - return 1; - } - if (aacEncoder_SetParam(handle, AACENC_AFTERBURNER, afterburner) != AACENC_OK) { - fprintf(stderr, "Unable to set the afterburner mode\n"); - return 1; - } - if (aacEncEncode(handle, NULL, NULL, NULL, NULL) != AACENC_OK) { - fprintf(stderr, "Unable to initialize the encoder\n"); - return 1; - } - if (aacEncInfo(handle, &info) != AACENC_OK) { - fprintf(stderr, "Unable to get the encoder info\n"); - return 1; - } - - out = fopen(outfile, "wb"); - if (!out) { - perror(outfile); - return 1; - } - - input_size = channels*2*info.frameLength; - input_buf = (uint8_t*) malloc(input_size); - convert_buf = (int16_t*) malloc(input_size); - - while (1) { - AACENC_BufDesc in_buf = { 0 }, out_buf = { 0 }; - AACENC_InArgs in_args = { 0 }; - AACENC_OutArgs out_args = { 0 }; - int in_identifier = IN_AUDIO_DATA; - int in_size, in_elem_size; - int out_identifier = OUT_BITSTREAM_DATA; - int out_size, out_elem_size; - int read, i; - void *in_ptr, *out_ptr; - uint8_t outbuf[20480]; - AACENC_ERROR err; - - read = wav_read_data(wav, input_buf, input_size); - for (i = 0; i < read/2; i++) { - const uint8_t* in = &input_buf[2*i]; - convert_buf[i] = in[0] | (in[1] << 8); - } - if (read <= 0) { - in_args.numInSamples = -1; - } else { - in_ptr = convert_buf; - in_size = read; - in_elem_size = 2; - - in_args.numInSamples = read/2; - in_buf.numBufs = 1; - in_buf.bufs = &in_ptr; - in_buf.bufferIdentifiers = &in_identifier; - in_buf.bufSizes = &in_size; - in_buf.bufElSizes = &in_elem_size; - } - out_ptr = outbuf; - out_size = sizeof(outbuf); - out_elem_size = 1; - out_buf.numBufs = 1; - out_buf.bufs = &out_ptr; - out_buf.bufferIdentifiers = &out_identifier; - out_buf.bufSizes = &out_size; - out_buf.bufElSizes = &out_elem_size; - - if ((err = aacEncEncode(handle, &in_buf, &out_buf, &in_args, &out_args)) != AACENC_OK) { - if (err == AACENC_ENCODE_EOF) - break; - fprintf(stderr, "Encoding failed\n"); - return 1; - } - if (out_args.numOutBytes == 0) - continue; - fwrite(outbuf, 1, out_args.numOutBytes, out); - } - free(input_buf); - free(convert_buf); - fclose(out); - wav_read_close(wav); - aacEncClose(&handle); - - return 0; -} - |