shithub: aacenc

Download patch

ref: 89b2c57b8b3ca8e3b0118db62c439d8605b3b5f7
parent: fbc0f3f60fb0e8e8621910623a77233763ad8c5e
author: lenox <lenox>
date: Sat Feb 19 07:51:08 EST 2000

added faac.c

--- /dev/null
+++ b/faac.c
@@ -1,0 +1,314 @@
+#ifdef WIN32
+#include <windows.h>
+#else
+#include <time.h>
+#include <stdio.h>
+#include <stdlib.h>
+#endif
+
+#include "aacenc.h"
+
+#ifdef FAAC_DLL
+
+BOOL APIENTRY DllMain(HANDLE hModule,
+                      DWORD  ul_reason_for_call,
+                      LPVOID lpReserved)
+{
+  return TRUE;
+}
+
+#else  // Not dll
+
+char *get_filename(char *pPath)
+{
+  char *pT;
+
+  for (pT = pPath; *pPath; pPath++) {
+   if ((pPath[0] == '\\' || pPath[0] == ':') && pPath[1] && (pPath[1] != '\\'))
+     pT = pPath + 1;
+  }
+
+  return pT;
+}
+
+void combine_path(char *path, char *dir, char *file)
+{
+  /* Should be a bit more sophisticated
+    This code assumes that the path exists */
+
+  /* Assume dir is allocated big enough */
+  if (dir[strlen(dir)-1] != '\\')
+    strcat(dir, "\\");
+  strcat(dir, get_filename(file));
+  strcpy(path, dir);
+}
+
+void usage(void)
+{
+  printf("Usage:\n");
+  printf("faac.exe -options file ...\n");
+  printf("Options:\n");
+  printf(" -?    Shows this help screen.\n");
+  printf(" -pX   AAC profile (X can be LOW, or MAIN (default).\n");
+  printf(" -bX   Bitrate in kbps (in steps of 1kbps, min. 16kbps)\n");
+  printf(" -pns  Use PNS (Perceptual Noise Substitution).\n");
+  printf(" -tns  Use TNS (Temporal Noise Shaping).\n");
+  printf(" -is   Use intensity stereo coding.\n");
+  printf(" -ms   Use mid/side stereo coding.\n");
+  printf(" -nm   Don't use mid/side stereo coding.\n");
+  printf("       The default for MS is intelligent switching.\n");
+  printf(" -np   Don't use LTP (Long Term Prediction).\n");
+  printf(" -oX   Set output directory.\n");
+  printf(" -sX   Set output sampling rate.\n");
+  printf(" -cX   Set cut-off frequency.\n");
+  printf(" -r    Use raw data input file.\n");
+  printf(" -hN   No header will be written to the AAC file.\n");
+  printf(" -hS   ADTS headers will be written to the AAC file(default).\n");
+  printf(" -hI   ADIF header will be written to the AAC file.\n");
+  printf(" file  Multiple files can be given as well as wild cards.\n");
+  printf("       Can be any of the filetypes supported by libsndfile\n");
+  printf("       (http://www.zip.com.au/~erikd/libsndfile/).\n");
+  printf("Example:\n");
+  printf("       faac.exe -b96 -oc:\\aac\\ *.wav\n");
+  return;
+}
+
+int parse_arg(int argc, char *argv[],faacAACStream *as, char *InFileNames[100], char *OutFileNames[100])
+{
+  int i, out_dir_set=0, FileCount=0;
+  char *argp, *fnp, out_dir[255];
+
+  faac_InitParams(as);
+  if (argc == 1) {
+    usage();
+    return -1;
+  }
+
+  for (i = 1; i < argc; i++) {
+    if ((argv[i][0] != '-')&&(argv[i][0] != '/')) {
+      if (strchr("-/", argv[i][0]))
+      	argp = &argv[i][1];
+      else
+        argp = argv[i];
+
+      if (!strchr(argp, '*') && !strchr(argp, '?')) {
+	InFileNames[FileCount] = (char*) malloc((strlen(argv[i])+1)*sizeof(char));
+	OutFileNames[FileCount] = (char*) malloc((strlen(argv[i])+1)*sizeof(char));
+	strcpy(InFileNames[FileCount], argv[i]);
+	FileCount++;
+      }
+      else {
+#ifdef WIN32
+	HANDLE hFindFile;
+	WIN32_FIND_DATA fd;
+
+        char path[255], *p;
+
+        if (NULL == (p = strrchr(argp, '\\')))
+	  p = strrchr(argp, '/');
+        if (p) {
+	  char ch = *p;
+
+	  *p = 0;
+	  strcat(strcpy(path, argp), "\\");
+	  *p = ch;
+        }
+	else
+	  *path = 0;
+
+	  if (INVALID_HANDLE_VALUE != (hFindFile = FindFirstFile(argp, &fd))) {
+	     do {
+	       InFileNames[FileCount] = (char*) malloc((strlen(fd.cFileName) + strlen(path) + 2)*sizeof(char));
+               strcat(strcpy(InFileNames[FileCount], path), fd.cFileName);
+	       FileCount++;
+             }
+             while (FindNextFile(hFindFile, &fd));
+	  FindClose(hFindFile);
+        }
+#else
+	printf("Wildcards not yet supported on systems other than WIN32\n");
+#endif
+      }
+    }
+    else {
+      switch(argv[i][1]) {
+      	case 'p': case 'P':
+	  if ((argv[i][2] == 'n') || (argv[i][2] == 'N'))
+	    faac_SetParam(as,PNS,USE_PNS);
+          else if ((argv[i][2] == 'l') || (argv[i][2] == 'L'))
+            faac_SetParam(as,PROFILE,LOW_PROFILE);
+	  else
+	    faac_SetParam(as,PROFILE,MAIN_PROFILE);
+          break;
+        case 'n': case 'N':
+	  if ((argv[i][2] == 'm') || (argv[i][2] == 'M'))
+	    faac_SetParam(as,MS_STEREO,NO_MS);
+          else if ((argv[i][2] == 'p') || (argv[i][2] == 'P'))
+	    faac_SetParam(as,LTP,NO_LTP);
+	  break;
+        case 'h': case 'H':
+          if ((argv[i][2] == 'i') || (argv[i][2] == 'I'))
+	    faac_SetParam(as,HEADER_TYPE,ADIF_HEADER);
+          else if ((argv[i][2] == 's') || (argv[i][2] == 'S'))
+	    faac_SetParam(as,HEADER_TYPE,ADTS_HEADER);
+          else if ((argv[i][2] == 'n') || (argv[i][2] == 'N'))
+	    faac_SetParam(as,HEADER_TYPE,NO_HEADER);
+	  break;
+        case 'm': case 'M':
+	  faac_SetParam(as,MS_STEREO,FORCE_MS);
+	  break;
+	case 'i': case 'I':
+	  faac_SetParam(as,IS_STEREO,USE_IS);
+	  break;
+	case 'r': case 'R':
+	  faac_SetParam(as,RAW_AUDIO,USE_RAW_AUDIO);
+	  break;
+	case 't': case 'T':
+	  faac_SetParam(as,TNS,USE_TNS);
+	  break;
+	case 'b': case 'B':
+	  faac_SetParam(as,BITRATE,atoi(&argv[i][2]));
+	  break;
+	case 's': case 'S':
+	  faac_SetParam(as,OUT_SAMPLING_RATE,atoi(&argv[i][2]));
+	  break;
+        case 'c': case 'C':
+	  faac_SetParam(as,CUT_OFF,atoi(&argv[i][2]));
+	  break;
+        case 'o': case 'O':
+	  out_dir_set = 1;
+	  strcpy(out_dir, &argv[i][2]);
+	  break;
+	case '?':
+	  usage();
+	  return 1;
+      }
+    }   // else  of:  if ((argv[i][0] != '-')&&(argv[i][0] != '/')) {
+  } //   for (i = 1; i < argc; i++) {
+
+  if (FileCount == 0)
+    return -1;
+  else {
+    for (i = 0; i < FileCount; i++){
+      if (out_dir_set)
+        combine_path(OutFileNames[i], out_dir, InFileNames[i]);
+      else
+        strcpy(OutFileNames[i], InFileNames[i]);
+      fnp = strrchr(OutFileNames[i],'.');
+      fnp[0] = '\0';
+      strcat(OutFileNames[i],".aac");
+    }
+  }
+  return FileCount;
+}
+
+void printVersion(void)
+{
+  faacVersion *faacv;
+  faacv = faac_Version();
+  printf("FAAC cl (Freeware AAC Encoder)\n");
+  printf("FAAC homepage: %s\n", faacv->HomePage);
+  printf("Encoder engine version: %d.%d\n\n",
+	 faacv->MajorVersion, faacv->MinorVersion);
+  if (faacv)
+    free(faacv);
+}
+
+void printConf(faacAACStream *as)
+{
+  printf("AAC configuration:\n");
+  printf("----------------------------------------------\n");
+  printf("AAC profile: %s.\n", (as->profile==MAIN_PROFILE)?"MAIN":"LOW");
+  printf("Bitrate: %dkbps.\n", as->bit_rate);
+  printf("Mid/Side (MS) stereo coding: %s.\n",
+ 	(as->use_MS==1)?"Always":((as->use_MS==0)?"Switching":"Off"));
+  printf("Intensity stereo (IS) coding: %s.\n", as->use_IS?"On":"Off");
+  printf("Temporal Noise Shaping: %s.\n", as->use_TNS?"On":"Off");
+  printf("Long Term Prediction: %s.\n", as->use_LTP?"On":"Off");
+  printf("Perceptual Noise Substitution: %s.\n", as->use_PNS?"On":"Off");
+  if (as->out_sampling_rate)
+    printf("Output sampling rate: %dHz.\n", as->out_sampling_rate);
+  if (as->cut_off)
+    printf("Cut-off frequency: %dHz.\n", as->cut_off);
+  if (as->header_type == ADIF_HEADER)
+    printf("Header info: ADIF header (seeking disabled)\n");
+  else if (as->header_type == ADTS_HEADER)
+    printf("Header info: ADTS headers (seeking enabled)\n");
+  else
+    printf("Header info: no headers (seeking disabled)\n");
+  printf("----------------------------------------------\n");
+}
+
+int main(int argc, char *argv[])
+{
+  int i, frames, currentFrame, result, FileCount;
+  char *InFileNames[100];
+  char *OutFileNames[100];
+
+  faacAACStream *as;
+
+  /* timing vars */
+  long begin, end;
+  int nTotSecs, nSecs;
+  int nMins;
+
+  /* create main aacstream object */
+  as =(faacAACStream *) malloc(sizeof(faacAACStream));
+
+  /* Print version of FAAC */
+  printVersion();
+
+  /* Process command line params */
+  if ((FileCount=parse_arg(argc, argv, as, InFileNames, OutFileNames))<0) return 0;
+
+  /* Print configuration */
+  printConf(as);
+
+  /* Process input files */
+  for (i = 0; i < FileCount; i++) {
+    printf("0%\tBusy encoding %s.\r", InFileNames[i]);
+#ifdef WIN32
+    begin = GetTickCount();
+#else
+    begin = clock();
+#endif
+    /* Init encoder core and retrieve number of frames */
+    if ((frames=faac_EncodeInit(as, InFileNames[i], OutFileNames[i])) < 0) {
+      printf("Error %d while encoding %s.\n",-frames,InFileNames[i]);
+      continue;
+    }
+    currentFrame = 0;
+    // Keep encoding frames until the end of the audio file
+    do {
+      currentFrame++;
+      result = faac_EncodeFrame(as);
+      if (result == FERROR) {
+        printf("Error while encoding %s.\n", InFileNames[i]);
+	break;
+      }
+      printf("%.2f%%\tBusy encoding %s.\r", min(((double)currentFrame/(double)frames)*100,100),InFileNames[i]);
+
+    } while (result != F_FINISH);
+
+    /* finishing last frames and destroying internal data */
+    faac_EncodeFinish(as);
+    faac_EncodeFree(as);
+#ifdef WIN32
+    end = GetTickCount();
+#else
+    end = clock();
+#endif
+    nTotSecs = (end-begin)/1000;
+    nMins = nTotSecs / 60;
+    nSecs = nTotSecs - (60*nMins);
+    printf("Encoding %s took:\t%d:%.2d\t\n", InFileNames[i], nMins, nSecs);
+    if(InFileNames[i]) free(InFileNames[i]);
+    if(OutFileNames[i]) free(OutFileNames[i]);
+  }
+  if (as) free (as);
+  return FNO_ERROR;
+}
+
+#endif // end of not dll
+
+ 
\ No newline at end of file
--- a/faac.dsp
+++ b/faac.dsp
@@ -154,6 +154,10 @@
 
 SOURCE=.\winswitch.c
 # End Source File
+# Begin Source File
+
+SOURCE=.\faac.c
+# End Source File
 # End Group
 # End Target
 # End Project
--- a/faac_dll.dsp
+++ b/faac_dll.dsp
@@ -158,6 +158,10 @@
 
 SOURCE=.\winswitch.c
 # End Source File
+# Begin Source File
+
+SOURCE=.\faac.c
+# End Source File
 # End Group
 # Begin Group "Resource Files"