#include <string.h>
#include <locale.h>
#include <errno.h>
+#include <sys/stat.h>
#include <getopt.h>
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef _WIN32
+#include <io.h>
+#endif
#include "compat.h"
#include "wav_reader.h"
#include "aacenc.h"
p += sprintf(p, PROGNAME " %s, ", fdkaac_version);
- lib_info = malloc(FDK_MODULE_LAST * sizeof(LIB_INFO));
- /* XXX: aacEncGetLibInfo() seems buggy and sometimes fails */
+ lib_info = calloc(FDK_MODULE_LAST, sizeof(LIB_INFO));
if (aacEncGetLibInfo(lib_info) == AACENC_OK) {
for (i = 0; i < FDK_MODULE_LAST; ++i)
if (lib_info[i].module_id == FDK_AACENC)
if (params->bitrate_mode)
sprintf(p, "VBR mode %d", params->bitrate_mode);
else
- sprintf(p, "CBR %dkbps", params->bitrate / 1000);
+ sprintf(p, "CBR %dkbps",
+ aacEncoder_GetParam(encoder, AACENC_BITRATE) / 1000);
m4af_add_itmf_string_tag(m4af, M4AF_TAG_TOOL, tool_info);
}
return 0;
}
+static
+const char *basename(const char *filename)
+{
+ char *p = strrchr(filename, '/');
+#ifdef _WIN32
+ char *q = strrchr(filename, '\\');
+ if (p < q) p = q;
+#endif
+ return p ? p + 1 : filename;
+}
+
+static
+char *generate_output_filename(const char *filename, const char *ext)
+{
+ char *p = 0;
+ size_t ext_len = strlen(ext);
+
+ if (strcmp(filename, "-") == 0) {
+ p = malloc(ext_len + 6);
+ sprintf(p, "stdin%s", ext);
+ } else {
+ const char *base = basename(filename);
+ size_t ilen = strlen(base);
+ const char *ext_org = strrchr(base, '.');
+ if (ext_org) ilen = ext_org - base;
+ p = malloc(ilen + ext_len + 1);
+ sprintf(p, "%.*s%s", ilen, base, ext);
+ }
+ return p;
+}
+
int main(int argc, char **argv)
{
wav_io_context_t wav_io = { read_callback, seek_callback };
const pcm_sample_description_t *sample_format;
int downsampled_timescale = 0;
int frame_count = 0;
+ struct stat stb = { 0 };
setlocale(LC_CTYPE, "");
setbuf(stderr, 0);
goto END;
}
- if (ifp == stdin)
+ if (fstat(fileno(ifp), &stb) == 0 && (stb.st_mode & S_IFMT) != S_IFREG)
wav_io.seek = 0;
if ((wavf = wav_open(&wav_io, ifp, params.ignore_length)) == 0) {
goto END;
if (!params.output_filename) {
- size_t ilen = strlen(params.input_filename);
- const char *ext = strrchr(params.input_filename, '.');
- if (ext) ilen = ext - params.input_filename;
- output_filename = malloc(ilen + 5);
- sprintf(output_filename, "%.*s%s", ilen, params.input_filename,
- params.transport_format ? ".aac" : ".m4a");
+ const char *ext = params.transport_format ? ".aac" : ".m4a";
+ output_filename = generate_output_filename(params.input_filename, ext);
params.output_filename = output_filename;
}