diff --git a/bootstrap b/bootstrap old file mode 100644 new file mode 100755 index 38af371..38af371 100755 diff --git a/common/faad/getopt.c b/common/faad/getopt.c deleted file mode 100644 index 185d49b..0000000 --- a/common/faad/getopt.c +++ /dev/null @@ -1,755 +0,0 @@ -/* Getopt for GNU. - NOTE: getopt is now part of the C library, so if you don't know what - "Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu - before changing it! - - Copyright (C) 1987, 88, 89, 90, 91, 92, 1993 - Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2, or (at your option) any - later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#ifndef __STDC__ -# ifndef const -# define const -# endif -#endif - -/* This tells Alpha OSF/1 not to define a getopt prototype in . */ -#ifndef _NO_PROTO -#define _NO_PROTO -#endif - -#include - -/* Comment out all this code if we are using the GNU C Library, and are not - actually compiling the library itself. This code is part of the GNU C - Library, but also included in many other GNU distributions. Compiling - and linking in this code is a waste when using the GNU C library - (especially if it is a shared library). Rather than having every GNU - program understand `configure --with-gnu-libc' and omit the object files, - it is simpler to just do this in the source for each such file. */ - -#if defined (_LIBC) || !defined (__GNU_LIBRARY__) || !__MacOSX__ - - -/* This needs to come after some library #include - to get __GNU_LIBRARY__ defined. */ -#ifdef __GNU_LIBRARY__ -/* Don't include stdlib.h for non-GNU C libraries because some of them - contain conflicting prototypes for getopt. */ -#include -#endif /* GNU C library. */ - -/* If GETOPT_COMPAT is defined, `+' as well as `--' can introduce a - long-named option. Because this is not POSIX.2 compliant, it is - being phased out. */ -/* #define GETOPT_COMPAT */ - -/* This version of `getopt' appears to the caller like standard Unix `getopt' - but it behaves differently for the user, since it allows the user - to intersperse the options with the other arguments. - - As `getopt' works, it permutes the elements of ARGV so that, - when it is done, all the options precede everything else. Thus - all application programs are extended to handle flexible argument order. - - Setting the environment variable POSIXLY_CORRECT disables permutation. - Then the behavior is completely standard. - - GNU application programs can use a third alternative mode in which - they can distinguish the relative order of options and other arguments. */ - -#include "getopt.h" - -/* For communication from `getopt' to the caller. - When `getopt' finds an option that takes an argument, - the argument value is returned here. - Also, when `ordering' is RETURN_IN_ORDER, - each non-option ARGV-element is returned here. */ - -char *optarg = 0; - -/* Index in ARGV of the next element to be scanned. - This is used for communication to and from the caller - and for communication between successive calls to `getopt'. - - On entry to `getopt', zero means this is the first call; initialize. - - When `getopt' returns EOF, this is the index of the first of the - non-option elements that the caller should itself scan. - - Otherwise, `optind' communicates from one call to the next - how much of ARGV has been scanned so far. */ - -/* XXX 1003.2 says this must be 1 before any call. */ -int optind = 0; - -/* The next char to be scanned in the option-element - in which the last option character we returned was found. - This allows us to pick up the scan where we left off. - - If this is zero, or a null string, it means resume the scan - by advancing to the next ARGV-element. */ - -static char *nextchar; - -/* Callers store zero here to inhibit the error message - for unrecognized options. */ - -int opterr = 1; - -/* Set to an option character which was unrecognized. - This must be initialized on some systems to avoid linking in the - system's own getopt implementation. */ - -#define BAD_OPTION '\0' -int optopt = BAD_OPTION; - -/* Describe how to deal with options that follow non-option ARGV-elements. - - If the caller did not specify anything, - the default is REQUIRE_ORDER if the environment variable - POSIXLY_CORRECT is defined, PERMUTE otherwise. - - REQUIRE_ORDER means don't recognize them as options; - stop option processing when the first non-option is seen. - This is what Unix does. - This mode of operation is selected by either setting the environment - variable POSIXLY_CORRECT, or using `+' as the first character - of the list of option characters. - - PERMUTE is the default. We permute the contents of ARGV as we scan, - so that eventually all the non-options are at the end. This allows options - to be given in any order, even with programs that were not written to - expect this. - - RETURN_IN_ORDER is an option available to programs that were written - to expect options and other ARGV-elements in any order and that care about - the ordering of the two. We describe each non-option ARGV-element - as if it were the argument of an option with character code 1. - Using `-' as the first character of the list of option characters - selects this mode of operation. - - The special argument `--' forces an end of option-scanning regardless - of the value of `ordering'. In the case of RETURN_IN_ORDER, only - `--' can cause `getopt' to return EOF with `optind' != ARGC. */ - -static enum -{ - REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER -} ordering; - -#ifdef __GNU_LIBRARY__ -/* We want to avoid inclusion of string.h with non-GNU libraries - because there are many ways it can cause trouble. - On some systems, it contains special magic macros that don't work - in GCC. */ -#include -#define my_index strchr -#define my_strlen strlen -#else - -/* Avoid depending on library functions or files - whose names are inconsistent. */ - -#if __STDC__ || defined(PROTO) -extern char *getenv(const char *name); -extern int strcmp (const char *s1, const char *s2); -extern int strncmp(const char *s1, const char *s2, unsigned int n); - -static int my_strlen(const char *s); -static char *my_index (const char *str, int chr); -#else -extern char *getenv (); -#endif - -static int -my_strlen (str) - const char *str; -{ - int n = 0; - while (*str++) - n++; - return n; -} - -static char * -my_index (str, chr) - const char *str; - int chr; -{ - while (*str) - { - if (*str == chr) - return (char *) str; - str++; - } - return 0; -} - -#endif /* GNU C library. */ - -/* Handle permutation of arguments. */ - -/* Describe the part of ARGV that contains non-options that have - been skipped. `first_nonopt' is the index in ARGV of the first of them; - `last_nonopt' is the index after the last of them. */ - -static int first_nonopt; -static int last_nonopt; - -/* Exchange two adjacent subsequences of ARGV. - One subsequence is elements [first_nonopt,last_nonopt) - which contains all the non-options that have been skipped so far. - The other is elements [last_nonopt,optind), which contains all - the options processed since those non-options were skipped. - - `first_nonopt' and `last_nonopt' are relocated so that they describe - the new indices of the non-options in ARGV after they are moved. - - To perform the swap, we first reverse the order of all elements. So - all options now come before all non options, but they are in the - wrong order. So we put back the options and non options in original - order by reversing them again. For example: - original input: a b c -x -y - reverse all: -y -x c b a - reverse options: -x -y c b a - reverse non options: -x -y a b c -*/ - -#if __STDC__ || defined(PROTO) -static void exchange (char **argv); -#endif - -static void -exchange (argv) - char **argv; -{ - char *temp, **first, **last; - - /* Reverse all the elements [first_nonopt, optind) */ - first = &argv[first_nonopt]; - last = &argv[optind-1]; - while (first < last) { - temp = *first; *first = *last; *last = temp; first++; last--; - } - /* Put back the options in order */ - first = &argv[first_nonopt]; - first_nonopt += (optind - last_nonopt); - last = &argv[first_nonopt - 1]; - while (first < last) { - temp = *first; *first = *last; *last = temp; first++; last--; - } - - /* Put back the non options in order */ - first = &argv[first_nonopt]; - last_nonopt = optind; - last = &argv[last_nonopt-1]; - while (first < last) { - temp = *first; *first = *last; *last = temp; first++; last--; - } -} - -/* Scan elements of ARGV (whose length is ARGC) for option characters - given in OPTSTRING. - - If an element of ARGV starts with '-', and is not exactly "-" or "--", - then it is an option element. The characters of this element - (aside from the initial '-') are option characters. If `getopt' - is called repeatedly, it returns successively each of the option characters - from each of the option elements. - - If `getopt' finds another option character, it returns that character, - updating `optind' and `nextchar' so that the next call to `getopt' can - resume the scan with the following option character or ARGV-element. - - If there are no more option characters, `getopt' returns `EOF'. - Then `optind' is the index in ARGV of the first ARGV-element - that is not an option. (The ARGV-elements have been permuted - so that those that are not options now come last.) - - OPTSTRING is a string containing the legitimate option characters. - If an option character is seen that is not listed in OPTSTRING, - return BAD_OPTION after printing an error message. If you set `opterr' to - zero, the error message is suppressed but we still return BAD_OPTION. - - If a char in OPTSTRING is followed by a colon, that means it wants an arg, - so the following text in the same ARGV-element, or the text of the following - ARGV-element, is returned in `optarg'. Two colons mean an option that - wants an optional arg; if there is text in the current ARGV-element, - it is returned in `optarg', otherwise `optarg' is set to zero. - - If OPTSTRING starts with `-' or `+', it requests different methods of - handling the non-option ARGV-elements. - See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. - - Long-named options begin with `--' instead of `-'. - Their names may be abbreviated as long as the abbreviation is unique - or is an exact match for some defined option. If they have an - argument, it follows the option name in the same ARGV-element, separated - from the option name by a `=', or else the in next ARGV-element. - When `getopt' finds a long-named option, it returns 0 if that option's - `flag' field is nonzero, the value of the option's `val' field - if the `flag' field is zero. - - The elements of ARGV aren't really const, because we permute them. - But we pretend they're const in the prototype to be compatible - with other systems. - - LONGOPTS is a vector of `struct option' terminated by an - element containing a name which is zero. - - LONGIND returns the index in LONGOPT of the long-named option found. - It is only valid when a long-named option has been found by the most - recent call. - - If LONG_ONLY is nonzero, '-' as well as '--' can introduce - long-named options. */ - -int -_getopt_internal (argc, argv, optstring, longopts, longind, long_only) - int argc; - char *const *argv; - const char *optstring; - const struct option *longopts; - int *longind; - int long_only; -{ - int option_index; - - optarg = 0; - - /* Initialize the internal data when the first call is made. - Start processing options with ARGV-element 1 (since ARGV-element 0 - is the program name); the sequence of previously skipped - non-option ARGV-elements is empty. */ - - if (optind == 0) - { - first_nonopt = last_nonopt = optind = 1; - - nextchar = NULL; - - /* Determine how to handle the ordering of options and nonoptions. */ - - if (optstring[0] == '-') - { - ordering = RETURN_IN_ORDER; - ++optstring; - } - else if (optstring[0] == '+') - { - ordering = REQUIRE_ORDER; - ++optstring; - } - else if (getenv ("POSIXLY_CORRECT") != NULL) - ordering = REQUIRE_ORDER; - else - ordering = PERMUTE; - } - - if (nextchar == NULL || *nextchar == '\0') - { - if (ordering == PERMUTE) - { - /* If we have just processed some options following some non-options, - exchange them so that the options come first. */ - - if (first_nonopt != last_nonopt && last_nonopt != optind) - exchange ((char **) argv); - else if (last_nonopt != optind) - first_nonopt = optind; - - /* Now skip any additional non-options - and extend the range of non-options previously skipped. */ - - while (optind < argc - && (argv[optind][0] != '-' || argv[optind][1] == '\0') -#ifdef GETOPT_COMPAT - && (longopts == NULL - || argv[optind][0] != '+' || argv[optind][1] == '\0') -#endif /* GETOPT_COMPAT */ - ) - optind++; - last_nonopt = optind; - } - - /* Special ARGV-element `--' means premature end of options. - Skip it like a null option, - then exchange with previous non-options as if it were an option, - then skip everything else like a non-option. */ - - if (optind != argc && !strcmp (argv[optind], "--")) - { - optind++; - - if (first_nonopt != last_nonopt && last_nonopt != optind) - exchange ((char **) argv); - else if (first_nonopt == last_nonopt) - first_nonopt = optind; - last_nonopt = argc; - - optind = argc; - } - - /* If we have done all the ARGV-elements, stop the scan - and back over any non-options that we skipped and permuted. */ - - if (optind == argc) - { - /* Set the next-arg-index to point at the non-options - that we previously skipped, so the caller will digest them. */ - if (first_nonopt != last_nonopt) - optind = first_nonopt; - return EOF; - } - - /* If we have come to a non-option and did not permute it, - either stop the scan or describe it to the caller and pass it by. */ - - if ((argv[optind][0] != '-' || argv[optind][1] == '\0') -#ifdef GETOPT_COMPAT - && (longopts == NULL - || argv[optind][0] != '+' || argv[optind][1] == '\0') -#endif /* GETOPT_COMPAT */ - ) - { - if (ordering == REQUIRE_ORDER) - return EOF; - optarg = argv[optind++]; - return 1; - } - - /* We have found another option-ARGV-element. - Start decoding its characters. */ - - nextchar = (argv[optind] + 1 - + (longopts != NULL && argv[optind][1] == '-')); - } - - if (longopts != NULL - && ((argv[optind][0] == '-' - && (argv[optind][1] == '-' || long_only)) -#ifdef GETOPT_COMPAT - || argv[optind][0] == '+' -#endif /* GETOPT_COMPAT */ - )) - { - const struct option *p; - char *s = nextchar; - int exact = 0; - int ambig = 0; - const struct option *pfound = NULL; - int indfound = 0; - - while (*s && *s != '=') - s++; - - /* Test all options for either exact match or abbreviated matches. */ - for (p = longopts, option_index = 0; p->name; - p++, option_index++) - if (!strncmp (p->name, nextchar, s - nextchar)) - { - if (s - nextchar == my_strlen (p->name)) - { - /* Exact match found. */ - pfound = p; - indfound = option_index; - exact = 1; - break; - } - else if (pfound == NULL) - { - /* First nonexact match found. */ - pfound = p; - indfound = option_index; - } - else - /* Second nonexact match found. */ - ambig = 1; - } - - if (ambig && !exact) - { - if (opterr) - fprintf (stderr, "%s: option `%s' is ambiguous\n", - argv[0], argv[optind]); - nextchar += my_strlen (nextchar); - optind++; - return BAD_OPTION; - } - - if (pfound != NULL) - { - option_index = indfound; - optind++; - if (*s) - { - /* Don't test has_arg with >, because some C compilers don't - allow it to be used on enums. */ - if (pfound->has_arg) - optarg = s + 1; - else - { - if (opterr) - { - if (argv[optind - 1][1] == '-') - /* --option */ - fprintf (stderr, - "%s: option `--%s' doesn't allow an argument\n", - argv[0], pfound->name); - else - /* +option or -option */ - fprintf (stderr, - "%s: option `%c%s' doesn't allow an argument\n", - argv[0], argv[optind - 1][0], pfound->name); - } - nextchar += my_strlen (nextchar); - return BAD_OPTION; - } - } - else if (pfound->has_arg == 1) - { - if (optind < argc) - optarg = argv[optind++]; - else - { - if (opterr) - fprintf (stderr, "%s: option `%s' requires an argument\n", - argv[0], argv[optind - 1]); - nextchar += my_strlen (nextchar); - return optstring[0] == ':' ? ':' : BAD_OPTION; - } - } - nextchar += my_strlen (nextchar); - if (longind != NULL) - *longind = option_index; - if (pfound->flag) - { - *(pfound->flag) = pfound->val; - return 0; - } - return pfound->val; - } - /* Can't find it as a long option. If this is not getopt_long_only, - or the option starts with '--' or is not a valid short - option, then it's an error. - Otherwise interpret it as a short option. */ - if (!long_only || argv[optind][1] == '-' -#ifdef GETOPT_COMPAT - || argv[optind][0] == '+' -#endif /* GETOPT_COMPAT */ - || my_index (optstring, *nextchar) == NULL) - { - if (opterr) - { - if (argv[optind][1] == '-') - /* --option */ - fprintf (stderr, "%s: unrecognized option `--%s'\n", - argv[0], nextchar); - else - /* +option or -option */ - fprintf (stderr, "%s: unrecognized option `%c%s'\n", - argv[0], argv[optind][0], nextchar); - } - nextchar = (char *) ""; - optind++; - return BAD_OPTION; - } - } - - /* Look at and handle the next option-character. */ - - { - char c = *nextchar++; - char *temp = my_index (optstring, c); - - /* Increment `optind' when we start to process its last character. */ - if (*nextchar == '\0') - ++optind; - - if (temp == NULL || c == ':') - { - if (opterr) - { -#if 0 - if (c < 040 || c >= 0177) - fprintf (stderr, "%s: unrecognized option, character code 0%o\n", - argv[0], c); - else - fprintf (stderr, "%s: unrecognized option `-%c'\n", argv[0], c); -#else - /* 1003.2 specifies the format of this message. */ - fprintf (stderr, "%s: illegal option -- %c\n", argv[0], c); -#endif - } - optopt = c; - return BAD_OPTION; - } - if (temp[1] == ':') - { - if (temp[2] == ':') - { - /* This is an option that accepts an argument optionally. */ - if (*nextchar != '\0') - { - optarg = nextchar; - optind++; - } - else - optarg = 0; - nextchar = NULL; - } - else - { - /* This is an option that requires an argument. */ - if (*nextchar != '\0') - { - optarg = nextchar; - /* If we end this ARGV-element by taking the rest as an arg, - we must advance to the next element now. */ - optind++; - } - else if (optind == argc) - { - if (opterr) - { -#if 0 - fprintf (stderr, "%s: option `-%c' requires an argument\n", - argv[0], c); -#else - /* 1003.2 specifies the format of this message. */ - fprintf (stderr, "%s: option requires an argument -- %c\n", - argv[0], c); -#endif - } - optopt = c; - if (optstring[0] == ':') - c = ':'; - else - c = BAD_OPTION; - } - else - /* We already incremented `optind' once; - increment it again when taking next ARGV-elt as argument. */ - optarg = argv[optind++]; - nextchar = NULL; - } - } - return c; - } -} - -int -getopt (argc, argv, optstring) - int argc; - char *const *argv; - const char *optstring; -{ - return _getopt_internal (argc, argv, optstring, - (const struct option *) 0, - (int *) 0, - 0); -} - -int -getopt_long (argc, argv, options, long_options, opt_index) - int argc; - char *const *argv; - const char *options; - const struct option *long_options; - int *opt_index; -{ - return _getopt_internal (argc, argv, options, long_options, opt_index, 0); -} - -#endif /* _LIBC or not __GNU_LIBRARY__. */ - -#ifdef TEST - -/* Compile with -DTEST to make an executable for use in testing - the above definition of `getopt'. */ - -int -main (argc, argv) - int argc; - char **argv; -{ - int c; - int digit_optind = 0; - - while (1) - { - int this_option_optind = optind ? optind : 1; - - c = getopt (argc, argv, "abc:d:0123456789"); - if (c == EOF) - break; - - switch (c) - { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - if (digit_optind != 0 && digit_optind != this_option_optind) - printf ("digits occur in two different argv-elements.\n"); - digit_optind = this_option_optind; - printf ("option %c\n", c); - break; - - case 'a': - printf ("option a\n"); - break; - - case 'b': - printf ("option b\n"); - break; - - case 'c': - printf ("option c with value `%s'\n", optarg); - break; - - case BAD_OPTION: - break; - - default: - printf ("?? getopt returned character code 0%o ??\n", c); - } - } - - if (optind < argc) - { - printf ("non-option ARGV-elements: "); - while (optind < argc) - printf ("%s ", argv[optind++]); - printf ("\n"); - } - - exit (0); -} - -#endif /* TEST */ diff --git a/common/faad/getopt.h b/common/faad/getopt.h deleted file mode 100644 index 3fd1277..0000000 --- a/common/faad/getopt.h +++ /dev/null @@ -1,130 +0,0 @@ -/* Declarations for getopt. - Copyright (C) 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2, or (at your option) any - later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#ifndef _GETOPT_H -#define _GETOPT_H 1 - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef __MacOSX__ - -/* For communication from `getopt' to the caller. - When `getopt' finds an option that takes an argument, - the argument value is returned here. - Also, when `ordering' is RETURN_IN_ORDER, - each non-option ARGV-element is returned here. */ - -extern char *optarg; - -/* Index in ARGV of the next element to be scanned. - This is used for communication to and from the caller - and for communication between successive calls to `getopt'. - - On entry to `getopt', zero means this is the first call; initialize. - - When `getopt' returns EOF, this is the index of the first of the - non-option elements that the caller should itself scan. - - Otherwise, `optind' communicates from one call to the next - how much of ARGV has been scanned so far. */ - -extern int optind; - -/* Callers store zero here to inhibit the error message `getopt' prints - for unrecognized options. */ - -extern int opterr; - -/* Set to an option character which was unrecognized. */ - -extern int optopt; -#endif - -/* Describe the long-named options requested by the application. - The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector - of `struct option' terminated by an element containing a name which is - zero. - - The field `has_arg' is: - no_argument (or 0) if the option does not take an argument, - required_argument (or 1) if the option requires an argument, - optional_argument (or 2) if the option takes an optional argument. - - If the field `flag' is not NULL, it points to a variable that is set - to the value given in the field `val' when the option is found, but - left unchanged if the option is not found. - - To have a long-named option do something other than set an `int' to - a compiled-in constant, such as set a value from `optarg', set the - option's `flag' field to zero and its `val' field to a nonzero - value (the equivalent single-letter option character, if there is - one). For long options that have a zero `flag' field, `getopt' - returns the contents of the `val' field. */ - -struct option -{ -#if __STDC__ - const char *name; -#else - char *name; -#endif - /* has_arg can't be an enum because some compilers complain about - type mismatches in all the code that assumes it is an int. */ - int has_arg; - int *flag; - int val; -}; - -/* Names for the values of the `has_arg' field of `struct option'. */ - -#define no_argument 0 -#define required_argument 1 -#define optional_argument 2 - -//#if __STDC__ || defined(PROTO) -#if defined(__GNU_LIBRARY__) -/* Many other libraries have conflicting prototypes for getopt, with - differences in the consts, in stdlib.h. To avoid compilation - errors, only prototype getopt for the GNU C library. */ -extern int getopt (int argc, char *const *argv, const char *shortopts); -#endif /* not __GNU_LIBRARY__ */ -extern int getopt_long (int argc, char *const *argv, const char *shortopts, - const struct option *longopts, int *longind); -extern int getopt_long_only (int argc, char *const *argv, - const char *shortopts, - const struct option *longopts, int *longind); - -/* Internal only. Users should not call this directly. */ -extern int _getopt_internal (int argc, char *const *argv, - const char *shortopts, - const struct option *longopts, int *longind, - int long_only); -//#else /* not __STDC__ */ -extern int getopt (int argc, char *const *argv, const char *shortopts); -//extern int getopt_long (); -//extern int getopt_long_only (); - -//extern int _getopt_internal (); -//#endif /* not __STDC__ */ - -#ifdef __cplusplus -} -#endif - -#endif /* _GETOPT_H */ diff --git a/common/mp4ff/Makefile.am b/common/mp4ff/Makefile.am index 301317d..23d7499 100644 --- a/common/mp4ff/Makefile.am +++ b/common/mp4ff/Makefile.am @@ -4,4 +4,4 @@ libmp4ff_a_CFLAGS = -DUSE_TAGGING=1 libmp4ff_a_SOURCES = mp4ff.c mp4atom.c mp4meta.c mp4sample.c mp4util.c \ - mp4tagupdate.c mp4ff.h mp4ffint.h mp4ff_int_types.h + mp4tagupdate.c mp4ff.h mp4ffint.h diff --git a/common/mp4ff/mp4atom.c b/common/mp4ff/mp4atom.c index c735c2a..e88ffb4 100644 --- a/common/mp4ff/mp4atom.c +++ b/common/mp4ff/mp4atom.c @@ -258,6 +258,9 @@ static int32_t mp4ff_read_stsz(mp4ff_t *f) { + if (f->total_tracks == 0) + return f->error++; + mp4ff_read_char(f); /* version */ mp4ff_read_int24(f); /* flags */ f->track[f->total_tracks - 1]->stsz_sample_size = mp4ff_read_int32(f); @@ -269,7 +272,10 @@ f->track[f->total_tracks - 1]->stsz_table = (int32_t*)malloc(f->track[f->total_tracks - 1]->stsz_sample_count*sizeof(int32_t)); - for (i = 0; i < f->track[f->total_tracks - 1]->stsz_sample_count; i++) + if (!f->track[f->total_tracks - 1]->stsz_table) + return f->error++; + + for (i = 0; i < f->track[f->total_tracks - 1]->stsz_sample_count && !f->stream->read_error; i++) { f->track[f->total_tracks - 1]->stsz_table[i] = mp4ff_read_int32(f); } @@ -282,6 +288,9 @@ { uint8_t tag; uint32_t temp; + + if (f->total_tracks == 0) + return f->error++; mp4ff_read_char(f); /* version */ mp4ff_read_int24(f); /* flags */ @@ -347,6 +356,9 @@ uint8_t atom_type = 0; uint8_t header_size = 0; + if (f->total_tracks == 0) + return f->error++; + for (i = 0; i < 6; i++) { mp4ff_read_char(f); /* reserved */ @@ -380,12 +392,16 @@ int32_t i; uint8_t header_size = 0; + /* CVE-2017-9218 */ + if (f->total_tracks == 0) + return f->error++; + mp4ff_read_char(f); /* version */ mp4ff_read_int24(f); /* flags */ f->track[f->total_tracks - 1]->stsd_entry_count = mp4ff_read_int32(f); - for (i = 0; i < f->track[f->total_tracks - 1]->stsd_entry_count; i++) + for (i = 0; i < f->track[f->total_tracks - 1]->stsd_entry_count && !f->stream->read_error; i++) /* CVE-2017-9253 */ { uint64_t skip = mp4ff_position(f); uint64_t size; @@ -415,6 +431,9 @@ { int32_t i; + if (f->total_tracks == 0) + return f->error++; + mp4ff_read_char(f); /* version */ mp4ff_read_int24(f); /* flags */ f->track[f->total_tracks - 1]->stsc_entry_count = mp4ff_read_int32(f); @@ -426,7 +445,27 @@ f->track[f->total_tracks - 1]->stsc_sample_desc_index = (int32_t*)malloc(f->track[f->total_tracks - 1]->stsc_entry_count*sizeof(int32_t)); - for (i = 0; i < f->track[f->total_tracks - 1]->stsc_entry_count; i++) + /* CVE-2017-9219 */ + if (!f->track[f->total_tracks - 1]->stsc_first_chunk) + { + return f->error++; + } + if (!f->track[f->total_tracks - 1]->stsc_samples_per_chunk) + { + free(f->track[f->total_tracks - 1]->stsc_first_chunk); + f->track[f->total_tracks - 1]->stsc_first_chunk = NULL; + return f->error++; + } + if (!f->track[f->total_tracks - 1]->stsc_sample_desc_index) + { + free(f->track[f->total_tracks - 1]->stsc_first_chunk); + f->track[f->total_tracks - 1]->stsc_first_chunk = NULL; + free(f->track[f->total_tracks - 1]->stsc_samples_per_chunk); + f->track[f->total_tracks - 1]->stsc_samples_per_chunk = NULL; + return f->error++; + } + + for (i = 0; i < f->track[f->total_tracks - 1]->stsc_entry_count && !f->stream->read_error; i++) /* CVE-2017-9255 */ { f->track[f->total_tracks - 1]->stsc_first_chunk[i] = mp4ff_read_int32(f); f->track[f->total_tracks - 1]->stsc_samples_per_chunk[i] = mp4ff_read_int32(f); @@ -440,6 +479,9 @@ { int32_t i; + if (f->total_tracks == 0) + return f->error++; + mp4ff_read_char(f); /* version */ mp4ff_read_int24(f); /* flags */ f->track[f->total_tracks - 1]->stco_entry_count = mp4ff_read_int32(f); @@ -447,7 +489,11 @@ f->track[f->total_tracks - 1]->stco_chunk_offset = (int32_t*)malloc(f->track[f->total_tracks - 1]->stco_entry_count*sizeof(int32_t)); - for (i = 0; i < f->track[f->total_tracks - 1]->stco_entry_count; i++) + /* CVE-2017-9220 */ + if (!f->track[f->total_tracks - 1]->stco_chunk_offset) + return f->error++; + + for (i = 0; i < f->track[f->total_tracks - 1]->stco_entry_count && !f->stream->read_error; i++) /* CVE-2017-9256 */ { f->track[f->total_tracks - 1]->stco_chunk_offset[i] = mp4ff_read_int32(f); } @@ -458,8 +504,12 @@ static int32_t mp4ff_read_ctts(mp4ff_t *f) { int32_t i; - mp4ff_track_t * p_track = f->track[f->total_tracks - 1]; - + mp4ff_track_t * p_track; + + if (f->total_tracks == 0) + return f->error++; + + p_track = f->track[f->total_tracks - 1]; if (p_track->ctts_entry_count) return 0; mp4ff_read_char(f); /* version */ @@ -478,7 +528,7 @@ } else { - for (i = 0; i < f->track[f->total_tracks - 1]->ctts_entry_count; i++) + for (i = 0; i < f->track[f->total_tracks - 1]->ctts_entry_count && !f->stream->read_error; i++) /* CVE-2017-9257 */ { p_track->ctts_sample_count[i] = mp4ff_read_int32(f); p_track->ctts_sample_offset[i] = mp4ff_read_int32(f); @@ -490,7 +540,13 @@ static int32_t mp4ff_read_stts(mp4ff_t *f) { int32_t i; - mp4ff_track_t * p_track = f->track[f->total_tracks - 1]; + mp4ff_track_t * p_track; + + /* CVE-2017-9223 */ + if (f->total_tracks == 0) + return f->error++; + + p_track = f->track[f->total_tracks - 1]; if (p_track->stts_entry_count) return 0; @@ -510,7 +566,7 @@ } else { - for (i = 0; i < f->track[f->total_tracks - 1]->stts_entry_count; i++) + for (i = 0; i < f->track[f->total_tracks - 1]->stts_entry_count && !f->stream->read_error; i++) /* CVE-2017-9254 */ { p_track->stts_sample_count[i] = mp4ff_read_int32(f); p_track->stts_sample_delta[i] = mp4ff_read_int32(f); @@ -596,6 +652,10 @@ static int32_t mp4ff_read_mdhd(mp4ff_t *f) { uint32_t version; + + /* CVE-2017-9221 */ + if (f->total_tracks == 0) + return f->error++; version = mp4ff_read_int32(f); if (version==1) diff --git a/common/mp4ff/mp4ff.c b/common/mp4ff/mp4ff.c index 9181ace..761bb0d 100644 --- a/common/mp4ff/mp4ff.c +++ b/common/mp4ff/mp4ff.c @@ -42,6 +42,12 @@ parse_atoms(ff,0); + if (ff->error) + { + free(ff); + ff = NULL; + } + return ff; } @@ -54,6 +60,12 @@ ff->stream = f; parse_atoms(ff,1); + + if (ff->error) + { + free(ff); + ff = NULL; + } return ff; } @@ -101,9 +113,16 @@ if (ff) free(ff); } -void mp4ff_track_add(mp4ff_t *f) +static void mp4ff_track_add(mp4ff_t *f) { f->total_tracks++; + + if (f->total_tracks > MAX_TRACKS) + { + f->total_tracks = 0; + f->error++; + return; + } f->track[f->total_tracks - 1] = malloc(sizeof(mp4ff_track_t)); @@ -185,6 +204,7 @@ uint8_t header_size = 0; f->file_size = 0; + f->stream->read_error = 0; while ((size = mp4ff_atom_read_header(f, &atom_type, &header_size)) != 0) { diff --git a/common/mp4ff/mp4ff.h b/common/mp4ff/mp4ff.h index 17b7fe7..93bd555 100644 --- a/common/mp4ff/mp4ff.h +++ b/common/mp4ff/mp4ff.h @@ -35,11 +35,7 @@ extern "C" { #endif /* __cplusplus */ -#ifdef HAVE_STDINT_H #include -#else -#include "mp4ff_int_types.h" -#endif /* file callback structure */ typedef struct @@ -47,12 +43,113 @@ uint32_t (*read)(void *user_data, void *buffer, uint32_t length); uint32_t (*write)(void *udata, void *buffer, uint32_t length); uint32_t (*seek)(void *user_data, uint64_t position); - uint32_t (*truncate)(void *user_data); + uint32_t (*truncate)(void *user_data); void *user_data; + uint32_t read_error; } mp4ff_callback_t; +#ifdef USE_TAGGING + +/* metadata tag structure */ +typedef struct +{ + char *item; + char *value; + uint32_t len; +} mp4ff_tag_t; + +/* metadata list structure */ +typedef struct +{ + mp4ff_tag_t *tags; + uint32_t count; +} mp4ff_metadata_t; + +int32_t mp4ff_meta_update(mp4ff_callback_t *f,const mp4ff_metadata_t * data); + +#endif + + +#ifndef MP4FF_INTERNAL_H /* mp4 main file structure */ typedef void* mp4ff_t; +#else +typedef struct +{ + int32_t type; + int32_t channelCount; + int32_t sampleSize; + uint16_t sampleRate; + int32_t audioType; + + /* stsd */ + int32_t stsd_entry_count; + + /* stsz */ + int32_t stsz_sample_size; + int32_t stsz_sample_count; + int32_t *stsz_table; + + /* stts */ + int32_t stts_entry_count; + int32_t *stts_sample_count; + int32_t *stts_sample_delta; + + /* stsc */ + int32_t stsc_entry_count; + int32_t *stsc_first_chunk; + int32_t *stsc_samples_per_chunk; + int32_t *stsc_sample_desc_index; + + /* stsc */ + int32_t stco_entry_count; + int32_t *stco_chunk_offset; + + /* ctts */ + int32_t ctts_entry_count; + int32_t *ctts_sample_count; + int32_t *ctts_sample_offset; + + /* esde */ + uint8_t *decoderConfig; + int32_t decoderConfigLen; + + uint32_t maxBitrate; + uint32_t avgBitrate; + + uint32_t timeScale; + uint64_t duration; + +} mp4ff_track_t; + +/* mp4 main file structure */ +typedef struct +{ + /* stream to read from */ + mp4ff_callback_t *stream; + int64_t current_position; + + int32_t moov_read; + uint64_t moov_offset; + uint64_t moov_size; + uint8_t last_atom; + uint64_t file_size; + uint32_t error; + + /* mvhd */ + int32_t time_scale; + int32_t duration; + + /* incremental track index while reading the file */ + int32_t total_tracks; + + /* track data */ + mp4ff_track_t *track[MAX_TRACKS]; + + /* metadata */ + mp4ff_metadata_t tags; +} mp4ff_t; +#endif /* API */ @@ -110,26 +207,6 @@ int mp4ff_meta_get_compilation(const mp4ff_t *f, char **value); int mp4ff_meta_get_tempo(const mp4ff_t *f, char **value); int32_t mp4ff_meta_get_coverart(const mp4ff_t *f, char **value); -#ifdef USE_TAGGING - -/* metadata tag structure */ -typedef struct -{ - char *item; - char *value; -} mp4ff_tag_t; - -/* metadata list structure */ -typedef struct -{ - mp4ff_tag_t *tags; - uint32_t count; -} mp4ff_metadata_t; - -int32_t mp4ff_meta_update(mp4ff_callback_t *f,const mp4ff_metadata_t * data); - -#endif - #ifdef __cplusplus } diff --git a/common/mp4ff/mp4ff_int_types.h b/common/mp4ff/mp4ff_int_types.h deleted file mode 100644 index 15e7fd6..0000000 --- a/common/mp4ff/mp4ff_int_types.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef _MP4FF_INT_TYPES_H_ -#define _MP4FF_INT_TYPES_H_ - -#if defined (_WIN32) - -#ifdef __MINGW32__ -#include -#endif /* #ifdef __MINGW32__ */ - -typedef signed char int8_t; -typedef unsigned char uint8_t; -typedef signed short int16_t; -typedef unsigned short uint16_t; -typedef signed long int32_t; -typedef unsigned long uint32_t; - -typedef signed __int64 int64_t; -typedef unsigned __int64 uint64_t; - -#else - -#include - -#endif - - -#endif diff --git a/common/mp4ff/mp4ffint.h b/common/mp4ff/mp4ffint.h index 8c5455c..309a32e 100644 --- a/common/mp4ff/mp4ffint.h +++ b/common/mp4ff/mp4ffint.h @@ -35,8 +35,8 @@ extern "C" { #endif /* __cplusplus */ -#include "mp4ff_int_types.h" #include +#include #define MAX_TRACKS 1024 #define TRACK_UNKNOWN 0 @@ -136,110 +136,7 @@ #define strdup _strdup #endif -/* file callback structure */ -typedef struct -{ - uint32_t (*read)(void *user_data, void *buffer, uint32_t length); - uint32_t (*write)(void *udata, void *buffer, uint32_t length); - uint32_t (*seek)(void *user_data, uint64_t position); - uint32_t (*truncate)(void *user_data); - void *user_data; -} mp4ff_callback_t; - - -/* metadata tag structure */ -typedef struct -{ - char *item; - char *value; - uint32_t len; -} mp4ff_tag_t; - -/* metadata list structure */ -typedef struct -{ - mp4ff_tag_t *tags; - uint32_t count; -} mp4ff_metadata_t; - - -typedef struct -{ - int32_t type; - int32_t channelCount; - int32_t sampleSize; - uint16_t sampleRate; - int32_t audioType; - - /* stsd */ - int32_t stsd_entry_count; - - /* stsz */ - int32_t stsz_sample_size; - int32_t stsz_sample_count; - int32_t *stsz_table; - - /* stts */ - int32_t stts_entry_count; - int32_t *stts_sample_count; - int32_t *stts_sample_delta; - - /* stsc */ - int32_t stsc_entry_count; - int32_t *stsc_first_chunk; - int32_t *stsc_samples_per_chunk; - int32_t *stsc_sample_desc_index; - - /* stsc */ - int32_t stco_entry_count; - int32_t *stco_chunk_offset; - - /* ctts */ - int32_t ctts_entry_count; - int32_t *ctts_sample_count; - int32_t *ctts_sample_offset; - - /* esde */ - uint8_t *decoderConfig; - int32_t decoderConfigLen; - - uint32_t maxBitrate; - uint32_t avgBitrate; - - uint32_t timeScale; - uint64_t duration; - -} mp4ff_track_t; - -/* mp4 main file structure */ -typedef struct -{ - /* stream to read from */ - mp4ff_callback_t *stream; - int64_t current_position; - - int32_t moov_read; - uint64_t moov_offset; - uint64_t moov_size; - uint8_t last_atom; - uint64_t file_size; - - /* mvhd */ - int32_t time_scale; - int32_t duration; - - /* incremental track index while reading the file */ - int32_t total_tracks; - - /* track data */ - mp4ff_track_t *track[MAX_TRACKS]; - - /* metadata */ - mp4ff_metadata_t tags; -} mp4ff_t; - - - +#include "mp4ff.h" /* mp4util.c */ int32_t mp4ff_read_data(mp4ff_t *f, int8_t *data, uint32_t size); diff --git a/common/mp4ff/mp4meta.c b/common/mp4ff/mp4meta.c index def2149..54117f5 100644 --- a/common/mp4ff/mp4meta.c +++ b/common/mp4ff/mp4meta.c @@ -240,7 +240,7 @@ uint32_t len = 0; - while (sumsize < size) + while (sumsize < size && !f->stream->read_error) /* CVE-2017-9222 */ { uint64_t destpos; subsize = mp4ff_atom_read_header(f, &atom_type, &header_size); @@ -500,4 +500,4 @@ return mp4ff_meta_find_by_name_and_return_len(f, "cover", value); } -#endif \ No newline at end of file +#endif diff --git a/common/mp4ff/mp4util.c b/common/mp4ff/mp4util.c index 24d89c7..75a1620 100644 --- a/common/mp4ff/mp4util.c +++ b/common/mp4ff/mp4util.c @@ -36,6 +36,9 @@ int32_t result = 1; result = f->stream->read(f->stream->user_data, data, size); + + if (result < size) + f->stream->read_error++; f->current_position += size; diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..4470f22 --- /dev/null +++ b/configure.ac @@ -0,0 +1,169 @@ +dnl +dnl This is the configure.in for faad2 related to unix creation + +dnl - libfaad.so +dnl - libmp4ff.a (only static for moment) +dnl - faad +dnl - xmms input mp4/aac plugin +dnl - mpeg4ip plugin (requires mpeg4ip's libmp4v2 to be installed) + +AC_PREREQ(2.50) +AC_INIT(faad2, 2.8.1) +AC_CONFIG_AUX_DIR(.) +AM_INIT_AUTOMAKE([subdir-objects]) + +AC_PROG_LIBTOOL +AC_SUBST(LIBTOOL_DEPS) + +dnl Checks for programs. +AC_PROG_CC +AM_PROG_CC_C_O +AC_PROG_CPP +dnl disable for mpeg4ip plugin +AC_PROG_CXX +AC_PROG_INSTALL +AC_PROG_LN_S +AC_PROG_MAKE_SET +AC_CHECK_PROGS(RPMBUILD, rpmbuild, rpm) + +AC_CONFIG_HEADERS([config.h]) + +AC_ARG_WITH(xmms,[ --with-xmms compile XMMS-1 plugin], + WITHXMMS=$withval, WITHXMMS=no) + +AC_ARG_WITH(drm,[ --with-drm compile libfaad with DRM support], + WITHDRM=$withval, WITHDRM=no) + +AC_ARG_WITH(mpeg4ip, [ --with-mpeg4ip compile mpeg4ip plugin], + WITHMPEG4IP=$withval, WITHMPEG4IP=no) + +dnl Checks for header files required for mp4.h +AC_HEADER_STDC +AC_CHECK_HEADERS(stdint.h inttypes.h) +AC_CHECK_HEADERS(mathf.h) +AC_CHECK_HEADERS(float.h) +AC_CHECK_FUNCS(strchr memcpy) +AC_CHECK_HEADERS(sys/time.h) +AC_HEADER_TIME + +dnl DRMS +AC_CHECK_HEADERS(errno.h sys/stat.h sys/types.h limits.h) +AC_CHECK_HEADERS(sysfs/libsysfs.h) +AC_CHECK_HEADERS(IOKit/IOKitLib.h, + [AC_CHECK_LIB(IOKit, main, + [AC_DEFINE(HAVE_IOKIT_IOKITLIB_H, 1, [Define if you have the IOKit API]) + MP4FF_LIBS="-lIOKit" + AC_SUBST(MP4FF_LIBS)])]) +AC_CHECK_FUNCS(getpwuid) + +AC_C_INLINE +AC_C_BIGENDIAN + +AC_TYPE_OFF_T + +AC_DEFUN([MY_CHECK_TYPEDEF_FROM_INCLUDE], +[ + AC_MSG_CHECKING([for $1]) + AC_TRY_COMPILE([$2], + [$1;], + libfaad_ok=yes, libfaad_ok=no) + if test $libfaad_ok = yes; then + AC_DEFINE($3, 1, [Define if needed]) + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) +fi +]) + +dnl @synopsis AC_C99_FUNC_LRINTF +dnl +dnl Check whether C99's lrintf function is available. +dnl @version 1.3 Feb 12 2002 +dnl @author Erik de Castro Lopo +dnl +dnl Permission to use, copy, modify, distribute, and sell this file for any +dnl purpose is hereby granted without fee, provided that the above copyright +dnl and this permission notice appear in all copies. No representations are +dnl made about the suitability of this software for any purpose. It is +dnl provided "as is" without express or implied warranty. +dnl +AC_DEFUN([AC_C99_FUNC_LRINTF], +[AC_CACHE_CHECK(for lrintf, + ac_cv_c99_lrintf, +[ +lrintf_save_CFLAGS=$CFLAGS +CFLAGS="-O -lm" +AC_TRY_LINK([ +#define _ISOC9X_SOURCE 1 +#define _ISOC99_SOURCE 1 +#define __USE_ISOC99 1 +#define __USE_ISOC9X 1 + +#include +], if (!lrintf(3.14159)) lrintf(2.7183);, ac_cv_c99_lrintf=yes, ac_cv_c99_lrintf=no) + +CFLAGS=$lrintf_save_CFLAGS + +]) + +if test "$ac_cv_c99_lrintf" = yes; then + AC_DEFINE(HAVE_LRINTF, 1, + [Define if you have C99's lrintf function.]) +fi +])# AC_C99_FUNC_LRINTF +AC_C99_FUNC_LRINTF + +MY_CHECK_TYPEDEF_FROM_INCLUDE([float32_t temp], + [#include , + #include ], [HAVE_FLOAT32_T]) + +AC_CHECK_FUNCS(strsep) + +AC_CHECK_PROG(external_mp4v2, mpeg4ip-config, yes, no) +AM_CONDITIONAL(HAVE_MPEG4IP_PLUG, false) +if test x$WITHMPEG4IP = xyes; then + if test x$external_mp4v2 = xyes; then + AM_CONDITIONAL(HAVE_MPEG4IP_PLUG, true) + AC_MSG_NOTICE("Building MPEG4IP plugin") + else + AC_MSG_NOTICE("MPEG4IP libmp4v2 is required for MPEG4IP plugin") + fi +fi + +if test x$WITHXMMS = xyes; then + AC_CHECK_PROGS(XMMS_CONFIG, xmms-config,"not_found") + if test "$XMMS_CONFIG" = "not_found"; then + AC_MSG_ERROR("*** xmms-config not found - xmms plugin can't be build") + fi + AC_CHECK_HEADER(pthread.h,, + AC_MSG_ERROR(*** pthread headers support not installed or not found)) + AC_CHECK_HEADER(id3.h,, + AC_MSG_ERROR(*** id3lib headers support not installed or not found)) + AC_CHECK_PROGS(GTK_CONFIG, gtk-config, "not_found") + if test "$XGTK_CONFIG" = "not_found"; then + AC_MSG_ERROR("*** gtk-config not found - xmms plugin can't be build without") + fi + + AM_CONDITIONAL(HAVE_XMMS, true) +else + AC_MSG_NOTICE(no xmms build configured) + AM_CONDITIONAL(HAVE_XMMS, false) +fi + +if test x$WITHDRM = xyes; then + AC_DEFINE(DRM, 1, [Define if you want to use libfaad together with Digital Radio Mondiale (DRM)]) + AC_DEFINE(DRM_PS, 1, [Define if you want support for Digital Radio Mondiale (DRM) parametric stereo]) +fi + +AC_CONFIG_FILES(libfaad/Makefile) +AC_CONFIG_FILES(common/Makefile) +AC_CONFIG_FILES(common/mp4ff/Makefile) +AC_CONFIG_FILES(plugins/Makefile) +AC_CONFIG_FILES(plugins/xmms/Makefile) +AC_CONFIG_FILES(plugins/xmms/src/Makefile) +AC_CONFIG_FILES(plugins/mpeg4ip/Makefile) +AC_CONFIG_FILES(faad2.spec) +AC_CONFIG_FILES(frontend/Makefile) +AC_CONFIG_FILES(Makefile) + +AC_OUTPUT diff --git a/configure.in b/configure.in deleted file mode 100644 index 740b056..0000000 --- a/configure.in +++ /dev/null @@ -1,168 +0,0 @@ -dnl -dnl This is the configure.in for faad2 related to unix creation - -dnl - libfaad.so -dnl - libmp4ff.a (only static for moment) -dnl - faad -dnl - xmms input mp4/aac plugin -dnl - mpeg4ip plugin (requires mpeg4ip's libmp4v2 to be installed) - -AC_INIT -AC_CONFIG_AUX_DIR(.) -AM_INIT_AUTOMAKE(faad2, 2.8.0cvs) - -AC_PROG_LIBTOOL -AC_SUBST(LIBTOOL_DEPS) - -dnl Checks for programs. -AC_PROG_CC -AM_PROG_CC_C_O -AC_PROG_CPP -dnl disable for mpeg4ip plugin -AC_PROG_CXX -AC_PROG_INSTALL -AC_PROG_LN_S -AC_PROG_MAKE_SET -AC_CHECK_PROGS(RPMBUILD, rpmbuild, rpm) - -AM_CONFIG_HEADER(config.h) - -AC_ARG_WITH(xmms,[ --with-xmms compile XMMS-1 plugin], - WITHXMMS=$withval, WITHXMMS=no) - -AC_ARG_WITH(drm,[ --with-drm compile libfaad with DRM support], - WITHDRM=$withval, WITHDRM=no) - -AC_ARG_WITH(mpeg4ip, [ --with-mpeg4ip compile mpeg4ip plugin], - WITHMPEG4IP=$withval, WITHMPEG4IP=no) - -dnl Checks for header files required for mp4.h -AC_HEADER_STDC -AC_CHECK_HEADERS(stdint.h inttypes.h) -AC_CHECK_HEADERS(mathf.h) -AC_CHECK_HEADERS(float.h) -AC_CHECK_FUNCS(strchr memcpy) -AC_CHECK_HEADERS(sys/time.h) -AC_HEADER_TIME - -dnl DRMS -AC_CHECK_HEADERS(errno.h sys/stat.h sys/types.h limits.h) -AC_CHECK_HEADERS(sysfs/libsysfs.h) -AC_CHECK_HEADERS(IOKit/IOKitLib.h, - [AC_CHECK_LIB(IOKit, main, - [AC_DEFINE(HAVE_IOKIT_IOKITLIB_H, 1, [Define if you have the IOKit API]) - MP4FF_LIBS="-lIOKit" - AC_SUBST(MP4FF_LIBS)])]) -AC_CHECK_FUNCS(getpwuid) - -AC_C_INLINE -AC_C_BIGENDIAN - -AC_TYPE_OFF_T - -AC_DEFUN([MY_CHECK_TYPEDEF_FROM_INCLUDE], -[ - AC_MSG_CHECKING([for $1]) - AC_TRY_COMPILE([$2], - [$1;], - libfaad_ok=yes, libfaad_ok=no) - if test $libfaad_ok = yes; then - AC_DEFINE($3, 1, [Define if needed]) - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) -fi -]) - -dnl @synopsis AC_C99_FUNC_LRINTF -dnl -dnl Check whether C99's lrintf function is available. -dnl @version 1.3 Feb 12 2002 -dnl @author Erik de Castro Lopo -dnl -dnl Permission to use, copy, modify, distribute, and sell this file for any -dnl purpose is hereby granted without fee, provided that the above copyright -dnl and this permission notice appear in all copies. No representations are -dnl made about the suitability of this software for any purpose. It is -dnl provided "as is" without express or implied warranty. -dnl -AC_DEFUN([AC_C99_FUNC_LRINTF], -[AC_CACHE_CHECK(for lrintf, - ac_cv_c99_lrintf, -[ -lrintf_save_CFLAGS=$CFLAGS -CFLAGS="-O -lm" -AC_TRY_LINK([ -#define _ISOC9X_SOURCE 1 -#define _ISOC99_SOURCE 1 -#define __USE_ISOC99 1 -#define __USE_ISOC9X 1 - -#include -], if (!lrintf(3.14159)) lrintf(2.7183);, ac_cv_c99_lrintf=yes, ac_cv_c99_lrintf=no) - -CFLAGS=$lrintf_save_CFLAGS - -]) - -if test "$ac_cv_c99_lrintf" = yes; then - AC_DEFINE(HAVE_LRINTF, 1, - [Define if you have C99's lrintf function.]) -fi -])# AC_C99_FUNC_LRINTF -AC_C99_FUNC_LRINTF - -MY_CHECK_TYPEDEF_FROM_INCLUDE([float32_t temp], - [#include , - #include ], [HAVE_FLOAT32_T]) - -AC_CHECK_FUNCS(strsep) - -AC_CHECK_PROG(external_mp4v2, mpeg4ip-config, yes, no) -AM_CONDITIONAL(HAVE_MPEG4IP_PLUG, false) -if test x$WITHMPEG4IP = xyes; then - if test x$external_mp4v2 = xyes; then - AM_CONDITIONAL(HAVE_MPEG4IP_PLUG, true) - AC_MSG_NOTICE("Building MPEG4IP plugin") - else - AC_MSG_NOTICE("MPEG4IP libmp4v2 is required for MPEG4IP plugin") - fi -fi - -if test x$WITHXMMS = xyes; then - AC_CHECK_PROGS(XMMS_CONFIG, xmms-config,"not_found") - if test "$XMMS_CONFIG" = "not_found"; then - AC_MSG_ERROR("*** xmms-config not found - xmms plugin can't be build") - fi - AC_CHECK_HEADER(pthread.h,, - AC_MSG_ERROR(*** pthread headers support not installed or not found)) - AC_CHECK_HEADER(id3.h,, - AC_MSG_ERROR(*** id3lib headers support not installed or not found)) - AC_CHECK_PROGS(GTK_CONFIG, gtk-config, "not_found") - if test "$XGTK_CONFIG" = "not_found"; then - AC_MSG_ERROR("*** gtk-config not found - xmms plugin can't be build without") - fi - - AM_CONDITIONAL(HAVE_XMMS, true) -else - AC_MSG_NOTICE(no xmms build configured) - AM_CONDITIONAL(HAVE_XMMS, false) -fi - -if test x$WITHDRM = xyes; then - AC_DEFINE(DRM, 1, [Define if you want to use libfaad together with Digital Radio Mondiale (DRM)]) - AC_DEFINE(DRM_PS, 1, [Define if you want support for Digital Radio Mondiale (DRM) parametric stereo]) -fi - -AC_CONFIG_FILES(libfaad/Makefile) -AC_CONFIG_FILES(common/Makefile) -AC_CONFIG_FILES(common/mp4ff/Makefile) -AC_CONFIG_FILES(plugins/Makefile) -AC_CONFIG_FILES(plugins/xmms/Makefile) -AC_CONFIG_FILES(plugins/xmms/src/Makefile) -AC_CONFIG_FILES(plugins/mpeg4ip/Makefile) -AC_CONFIG_FILES(faad2.spec) -AC_CONFIG_FILES(frontend/Makefile) -AC_CONFIG_FILES(Makefile) - -AC_OUTPUT diff --git a/docs/libfaad.3 b/docs/libfaad.3 index 9384845..efbdf81 100644 --- a/docs/libfaad.3 +++ b/docs/libfaad.3 @@ -230,8 +230,8 @@ .B NeAACDecAudioSpecificConfig .PP char NEAACDECAPI NeAACDecAudioSpecificConfig(unsigned char *pBuffer, - unsigned long buffer_size, - mp4AudioSpecificConfig *mp4ASC); + unsigned long buffer_size, + mp4AudioSpecificConfig *mp4ASC); .PP .B Structures .RS 4 diff --git a/frontend/Makefile.am b/frontend/Makefile.am index 532fa13..1e18277 100644 --- a/frontend/Makefile.am +++ b/frontend/Makefile.am @@ -1,12 +1,9 @@ bin_PROGRAMS = faad man1_MANS = faad.man -INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/common/faad \ - -I$(top_srcdir)/common/mp4ff +AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/common/mp4ff faad_LDADD = $(top_builddir)/libfaad/libfaad.la \ $(top_builddir)/common/mp4ff/libmp4ff.a -faad_SOURCES = main.c \ - audio.c audio.h \ - $(top_srcdir)/common/faad/getopt.c +faad_SOURCES = main.c audio.c audio.h diff --git a/frontend/getopt.c b/frontend/getopt.c new file mode 100644 index 0000000..185d49b --- /dev/null +++ b/frontend/getopt.c @@ -0,0 +1,755 @@ +/* Getopt for GNU. + NOTE: getopt is now part of the C library, so if you don't know what + "Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu + before changing it! + + Copyright (C) 1987, 88, 89, 90, 91, 92, 1993 + Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifndef __STDC__ +# ifndef const +# define const +# endif +#endif + +/* This tells Alpha OSF/1 not to define a getopt prototype in . */ +#ifndef _NO_PROTO +#define _NO_PROTO +#endif + +#include + +/* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself. This code is part of the GNU C + Library, but also included in many other GNU distributions. Compiling + and linking in this code is a waste when using the GNU C library + (especially if it is a shared library). Rather than having every GNU + program understand `configure --with-gnu-libc' and omit the object files, + it is simpler to just do this in the source for each such file. */ + +#if defined (_LIBC) || !defined (__GNU_LIBRARY__) || !__MacOSX__ + + +/* This needs to come after some library #include + to get __GNU_LIBRARY__ defined. */ +#ifdef __GNU_LIBRARY__ +/* Don't include stdlib.h for non-GNU C libraries because some of them + contain conflicting prototypes for getopt. */ +#include +#endif /* GNU C library. */ + +/* If GETOPT_COMPAT is defined, `+' as well as `--' can introduce a + long-named option. Because this is not POSIX.2 compliant, it is + being phased out. */ +/* #define GETOPT_COMPAT */ + +/* This version of `getopt' appears to the caller like standard Unix `getopt' + but it behaves differently for the user, since it allows the user + to intersperse the options with the other arguments. + + As `getopt' works, it permutes the elements of ARGV so that, + when it is done, all the options precede everything else. Thus + all application programs are extended to handle flexible argument order. + + Setting the environment variable POSIXLY_CORRECT disables permutation. + Then the behavior is completely standard. + + GNU application programs can use a third alternative mode in which + they can distinguish the relative order of options and other arguments. */ + +#include "getopt.h" + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +char *optarg = 0; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns EOF, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +/* XXX 1003.2 says this must be 1 before any call. */ +int optind = 0; + +/* The next char to be scanned in the option-element + in which the last option character we returned was found. + This allows us to pick up the scan where we left off. + + If this is zero, or a null string, it means resume the scan + by advancing to the next ARGV-element. */ + +static char *nextchar; + +/* Callers store zero here to inhibit the error message + for unrecognized options. */ + +int opterr = 1; + +/* Set to an option character which was unrecognized. + This must be initialized on some systems to avoid linking in the + system's own getopt implementation. */ + +#define BAD_OPTION '\0' +int optopt = BAD_OPTION; + +/* Describe how to deal with options that follow non-option ARGV-elements. + + If the caller did not specify anything, + the default is REQUIRE_ORDER if the environment variable + POSIXLY_CORRECT is defined, PERMUTE otherwise. + + REQUIRE_ORDER means don't recognize them as options; + stop option processing when the first non-option is seen. + This is what Unix does. + This mode of operation is selected by either setting the environment + variable POSIXLY_CORRECT, or using `+' as the first character + of the list of option characters. + + PERMUTE is the default. We permute the contents of ARGV as we scan, + so that eventually all the non-options are at the end. This allows options + to be given in any order, even with programs that were not written to + expect this. + + RETURN_IN_ORDER is an option available to programs that were written + to expect options and other ARGV-elements in any order and that care about + the ordering of the two. We describe each non-option ARGV-element + as if it were the argument of an option with character code 1. + Using `-' as the first character of the list of option characters + selects this mode of operation. + + The special argument `--' forces an end of option-scanning regardless + of the value of `ordering'. In the case of RETURN_IN_ORDER, only + `--' can cause `getopt' to return EOF with `optind' != ARGC. */ + +static enum +{ + REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER +} ordering; + +#ifdef __GNU_LIBRARY__ +/* We want to avoid inclusion of string.h with non-GNU libraries + because there are many ways it can cause trouble. + On some systems, it contains special magic macros that don't work + in GCC. */ +#include +#define my_index strchr +#define my_strlen strlen +#else + +/* Avoid depending on library functions or files + whose names are inconsistent. */ + +#if __STDC__ || defined(PROTO) +extern char *getenv(const char *name); +extern int strcmp (const char *s1, const char *s2); +extern int strncmp(const char *s1, const char *s2, unsigned int n); + +static int my_strlen(const char *s); +static char *my_index (const char *str, int chr); +#else +extern char *getenv (); +#endif + +static int +my_strlen (str) + const char *str; +{ + int n = 0; + while (*str++) + n++; + return n; +} + +static char * +my_index (str, chr) + const char *str; + int chr; +{ + while (*str) + { + if (*str == chr) + return (char *) str; + str++; + } + return 0; +} + +#endif /* GNU C library. */ + +/* Handle permutation of arguments. */ + +/* Describe the part of ARGV that contains non-options that have + been skipped. `first_nonopt' is the index in ARGV of the first of them; + `last_nonopt' is the index after the last of them. */ + +static int first_nonopt; +static int last_nonopt; + +/* Exchange two adjacent subsequences of ARGV. + One subsequence is elements [first_nonopt,last_nonopt) + which contains all the non-options that have been skipped so far. + The other is elements [last_nonopt,optind), which contains all + the options processed since those non-options were skipped. + + `first_nonopt' and `last_nonopt' are relocated so that they describe + the new indices of the non-options in ARGV after they are moved. + + To perform the swap, we first reverse the order of all elements. So + all options now come before all non options, but they are in the + wrong order. So we put back the options and non options in original + order by reversing them again. For example: + original input: a b c -x -y + reverse all: -y -x c b a + reverse options: -x -y c b a + reverse non options: -x -y a b c +*/ + +#if __STDC__ || defined(PROTO) +static void exchange (char **argv); +#endif + +static void +exchange (argv) + char **argv; +{ + char *temp, **first, **last; + + /* Reverse all the elements [first_nonopt, optind) */ + first = &argv[first_nonopt]; + last = &argv[optind-1]; + while (first < last) { + temp = *first; *first = *last; *last = temp; first++; last--; + } + /* Put back the options in order */ + first = &argv[first_nonopt]; + first_nonopt += (optind - last_nonopt); + last = &argv[first_nonopt - 1]; + while (first < last) { + temp = *first; *first = *last; *last = temp; first++; last--; + } + + /* Put back the non options in order */ + first = &argv[first_nonopt]; + last_nonopt = optind; + last = &argv[last_nonopt-1]; + while (first < last) { + temp = *first; *first = *last; *last = temp; first++; last--; + } +} + +/* Scan elements of ARGV (whose length is ARGC) for option characters + given in OPTSTRING. + + If an element of ARGV starts with '-', and is not exactly "-" or "--", + then it is an option element. The characters of this element + (aside from the initial '-') are option characters. If `getopt' + is called repeatedly, it returns successively each of the option characters + from each of the option elements. + + If `getopt' finds another option character, it returns that character, + updating `optind' and `nextchar' so that the next call to `getopt' can + resume the scan with the following option character or ARGV-element. + + If there are no more option characters, `getopt' returns `EOF'. + Then `optind' is the index in ARGV of the first ARGV-element + that is not an option. (The ARGV-elements have been permuted + so that those that are not options now come last.) + + OPTSTRING is a string containing the legitimate option characters. + If an option character is seen that is not listed in OPTSTRING, + return BAD_OPTION after printing an error message. If you set `opterr' to + zero, the error message is suppressed but we still return BAD_OPTION. + + If a char in OPTSTRING is followed by a colon, that means it wants an arg, + so the following text in the same ARGV-element, or the text of the following + ARGV-element, is returned in `optarg'. Two colons mean an option that + wants an optional arg; if there is text in the current ARGV-element, + it is returned in `optarg', otherwise `optarg' is set to zero. + + If OPTSTRING starts with `-' or `+', it requests different methods of + handling the non-option ARGV-elements. + See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. + + Long-named options begin with `--' instead of `-'. + Their names may be abbreviated as long as the abbreviation is unique + or is an exact match for some defined option. If they have an + argument, it follows the option name in the same ARGV-element, separated + from the option name by a `=', or else the in next ARGV-element. + When `getopt' finds a long-named option, it returns 0 if that option's + `flag' field is nonzero, the value of the option's `val' field + if the `flag' field is zero. + + The elements of ARGV aren't really const, because we permute them. + But we pretend they're const in the prototype to be compatible + with other systems. + + LONGOPTS is a vector of `struct option' terminated by an + element containing a name which is zero. + + LONGIND returns the index in LONGOPT of the long-named option found. + It is only valid when a long-named option has been found by the most + recent call. + + If LONG_ONLY is nonzero, '-' as well as '--' can introduce + long-named options. */ + +int +_getopt_internal (argc, argv, optstring, longopts, longind, long_only) + int argc; + char *const *argv; + const char *optstring; + const struct option *longopts; + int *longind; + int long_only; +{ + int option_index; + + optarg = 0; + + /* Initialize the internal data when the first call is made. + Start processing options with ARGV-element 1 (since ARGV-element 0 + is the program name); the sequence of previously skipped + non-option ARGV-elements is empty. */ + + if (optind == 0) + { + first_nonopt = last_nonopt = optind = 1; + + nextchar = NULL; + + /* Determine how to handle the ordering of options and nonoptions. */ + + if (optstring[0] == '-') + { + ordering = RETURN_IN_ORDER; + ++optstring; + } + else if (optstring[0] == '+') + { + ordering = REQUIRE_ORDER; + ++optstring; + } + else if (getenv ("POSIXLY_CORRECT") != NULL) + ordering = REQUIRE_ORDER; + else + ordering = PERMUTE; + } + + if (nextchar == NULL || *nextchar == '\0') + { + if (ordering == PERMUTE) + { + /* If we have just processed some options following some non-options, + exchange them so that the options come first. */ + + if (first_nonopt != last_nonopt && last_nonopt != optind) + exchange ((char **) argv); + else if (last_nonopt != optind) + first_nonopt = optind; + + /* Now skip any additional non-options + and extend the range of non-options previously skipped. */ + + while (optind < argc + && (argv[optind][0] != '-' || argv[optind][1] == '\0') +#ifdef GETOPT_COMPAT + && (longopts == NULL + || argv[optind][0] != '+' || argv[optind][1] == '\0') +#endif /* GETOPT_COMPAT */ + ) + optind++; + last_nonopt = optind; + } + + /* Special ARGV-element `--' means premature end of options. + Skip it like a null option, + then exchange with previous non-options as if it were an option, + then skip everything else like a non-option. */ + + if (optind != argc && !strcmp (argv[optind], "--")) + { + optind++; + + if (first_nonopt != last_nonopt && last_nonopt != optind) + exchange ((char **) argv); + else if (first_nonopt == last_nonopt) + first_nonopt = optind; + last_nonopt = argc; + + optind = argc; + } + + /* If we have done all the ARGV-elements, stop the scan + and back over any non-options that we skipped and permuted. */ + + if (optind == argc) + { + /* Set the next-arg-index to point at the non-options + that we previously skipped, so the caller will digest them. */ + if (first_nonopt != last_nonopt) + optind = first_nonopt; + return EOF; + } + + /* If we have come to a non-option and did not permute it, + either stop the scan or describe it to the caller and pass it by. */ + + if ((argv[optind][0] != '-' || argv[optind][1] == '\0') +#ifdef GETOPT_COMPAT + && (longopts == NULL + || argv[optind][0] != '+' || argv[optind][1] == '\0') +#endif /* GETOPT_COMPAT */ + ) + { + if (ordering == REQUIRE_ORDER) + return EOF; + optarg = argv[optind++]; + return 1; + } + + /* We have found another option-ARGV-element. + Start decoding its characters. */ + + nextchar = (argv[optind] + 1 + + (longopts != NULL && argv[optind][1] == '-')); + } + + if (longopts != NULL + && ((argv[optind][0] == '-' + && (argv[optind][1] == '-' || long_only)) +#ifdef GETOPT_COMPAT + || argv[optind][0] == '+' +#endif /* GETOPT_COMPAT */ + )) + { + const struct option *p; + char *s = nextchar; + int exact = 0; + int ambig = 0; + const struct option *pfound = NULL; + int indfound = 0; + + while (*s && *s != '=') + s++; + + /* Test all options for either exact match or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; + p++, option_index++) + if (!strncmp (p->name, nextchar, s - nextchar)) + { + if (s - nextchar == my_strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else + /* Second nonexact match found. */ + ambig = 1; + } + + if (ambig && !exact) + { + if (opterr) + fprintf (stderr, "%s: option `%s' is ambiguous\n", + argv[0], argv[optind]); + nextchar += my_strlen (nextchar); + optind++; + return BAD_OPTION; + } + + if (pfound != NULL) + { + option_index = indfound; + optind++; + if (*s) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + optarg = s + 1; + else + { + if (opterr) + { + if (argv[optind - 1][1] == '-') + /* --option */ + fprintf (stderr, + "%s: option `--%s' doesn't allow an argument\n", + argv[0], pfound->name); + else + /* +option or -option */ + fprintf (stderr, + "%s: option `%c%s' doesn't allow an argument\n", + argv[0], argv[optind - 1][0], pfound->name); + } + nextchar += my_strlen (nextchar); + return BAD_OPTION; + } + } + else if (pfound->has_arg == 1) + { + if (optind < argc) + optarg = argv[optind++]; + else + { + if (opterr) + fprintf (stderr, "%s: option `%s' requires an argument\n", + argv[0], argv[optind - 1]); + nextchar += my_strlen (nextchar); + return optstring[0] == ':' ? ':' : BAD_OPTION; + } + } + nextchar += my_strlen (nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + /* Can't find it as a long option. If this is not getopt_long_only, + or the option starts with '--' or is not a valid short + option, then it's an error. + Otherwise interpret it as a short option. */ + if (!long_only || argv[optind][1] == '-' +#ifdef GETOPT_COMPAT + || argv[optind][0] == '+' +#endif /* GETOPT_COMPAT */ + || my_index (optstring, *nextchar) == NULL) + { + if (opterr) + { + if (argv[optind][1] == '-') + /* --option */ + fprintf (stderr, "%s: unrecognized option `--%s'\n", + argv[0], nextchar); + else + /* +option or -option */ + fprintf (stderr, "%s: unrecognized option `%c%s'\n", + argv[0], argv[optind][0], nextchar); + } + nextchar = (char *) ""; + optind++; + return BAD_OPTION; + } + } + + /* Look at and handle the next option-character. */ + + { + char c = *nextchar++; + char *temp = my_index (optstring, c); + + /* Increment `optind' when we start to process its last character. */ + if (*nextchar == '\0') + ++optind; + + if (temp == NULL || c == ':') + { + if (opterr) + { +#if 0 + if (c < 040 || c >= 0177) + fprintf (stderr, "%s: unrecognized option, character code 0%o\n", + argv[0], c); + else + fprintf (stderr, "%s: unrecognized option `-%c'\n", argv[0], c); +#else + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, "%s: illegal option -- %c\n", argv[0], c); +#endif + } + optopt = c; + return BAD_OPTION; + } + if (temp[1] == ':') + { + if (temp[2] == ':') + { + /* This is an option that accepts an argument optionally. */ + if (*nextchar != '\0') + { + optarg = nextchar; + optind++; + } + else + optarg = 0; + nextchar = NULL; + } + else + { + /* This is an option that requires an argument. */ + if (*nextchar != '\0') + { + optarg = nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + optind++; + } + else if (optind == argc) + { + if (opterr) + { +#if 0 + fprintf (stderr, "%s: option `-%c' requires an argument\n", + argv[0], c); +#else + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, "%s: option requires an argument -- %c\n", + argv[0], c); +#endif + } + optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = BAD_OPTION; + } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + optarg = argv[optind++]; + nextchar = NULL; + } + } + return c; + } +} + +int +getopt (argc, argv, optstring) + int argc; + char *const *argv; + const char *optstring; +{ + return _getopt_internal (argc, argv, optstring, + (const struct option *) 0, + (int *) 0, + 0); +} + +int +getopt_long (argc, argv, options, long_options, opt_index) + int argc; + char *const *argv; + const char *options; + const struct option *long_options; + int *opt_index; +{ + return _getopt_internal (argc, argv, options, long_options, opt_index, 0); +} + +#endif /* _LIBC or not __GNU_LIBRARY__. */ + +#ifdef TEST + +/* Compile with -DTEST to make an executable for use in testing + the above definition of `getopt'. */ + +int +main (argc, argv) + int argc; + char **argv; +{ + int c; + int digit_optind = 0; + + while (1) + { + int this_option_optind = optind ? optind : 1; + + c = getopt (argc, argv, "abc:d:0123456789"); + if (c == EOF) + break; + + switch (c) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (digit_optind != 0 && digit_optind != this_option_optind) + printf ("digits occur in two different argv-elements.\n"); + digit_optind = this_option_optind; + printf ("option %c\n", c); + break; + + case 'a': + printf ("option a\n"); + break; + + case 'b': + printf ("option b\n"); + break; + + case 'c': + printf ("option c with value `%s'\n", optarg); + break; + + case BAD_OPTION: + break; + + default: + printf ("?? getopt returned character code 0%o ??\n", c); + } + } + + if (optind < argc) + { + printf ("non-option ARGV-elements: "); + while (optind < argc) + printf ("%s ", argv[optind++]); + printf ("\n"); + } + + exit (0); +} + +#endif /* TEST */ diff --git a/frontend/getopt.h b/frontend/getopt.h new file mode 100644 index 0000000..3fd1277 --- /dev/null +++ b/frontend/getopt.h @@ -0,0 +1,130 @@ +/* Declarations for getopt. + Copyright (C) 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#ifndef _GETOPT_H +#define _GETOPT_H 1 + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef __MacOSX__ + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +extern char *optarg; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns EOF, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +extern int optind; + +/* Callers store zero here to inhibit the error message `getopt' prints + for unrecognized options. */ + +extern int opterr; + +/* Set to an option character which was unrecognized. */ + +extern int optopt; +#endif + +/* Describe the long-named options requested by the application. + The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector + of `struct option' terminated by an element containing a name which is + zero. + + The field `has_arg' is: + no_argument (or 0) if the option does not take an argument, + required_argument (or 1) if the option requires an argument, + optional_argument (or 2) if the option takes an optional argument. + + If the field `flag' is not NULL, it points to a variable that is set + to the value given in the field `val' when the option is found, but + left unchanged if the option is not found. + + To have a long-named option do something other than set an `int' to + a compiled-in constant, such as set a value from `optarg', set the + option's `flag' field to zero and its `val' field to a nonzero + value (the equivalent single-letter option character, if there is + one). For long options that have a zero `flag' field, `getopt' + returns the contents of the `val' field. */ + +struct option +{ +#if __STDC__ + const char *name; +#else + char *name; +#endif + /* has_arg can't be an enum because some compilers complain about + type mismatches in all the code that assumes it is an int. */ + int has_arg; + int *flag; + int val; +}; + +/* Names for the values of the `has_arg' field of `struct option'. */ + +#define no_argument 0 +#define required_argument 1 +#define optional_argument 2 + +//#if __STDC__ || defined(PROTO) +#if defined(__GNU_LIBRARY__) +/* Many other libraries have conflicting prototypes for getopt, with + differences in the consts, in stdlib.h. To avoid compilation + errors, only prototype getopt for the GNU C library. */ +extern int getopt (int argc, char *const *argv, const char *shortopts); +#endif /* not __GNU_LIBRARY__ */ +extern int getopt_long (int argc, char *const *argv, const char *shortopts, + const struct option *longopts, int *longind); +extern int getopt_long_only (int argc, char *const *argv, + const char *shortopts, + const struct option *longopts, int *longind); + +/* Internal only. Users should not call this directly. */ +extern int _getopt_internal (int argc, char *const *argv, + const char *shortopts, + const struct option *longopts, int *longind, + int long_only); +//#else /* not __STDC__ */ +extern int getopt (int argc, char *const *argv, const char *shortopts); +//extern int getopt_long (); +//extern int getopt_long_only (); + +//extern int _getopt_internal (); +//#endif /* not __STDC__ */ + +#ifdef __cplusplus +} +#endif + +#endif /* _GETOPT_H */ diff --git a/frontend/main.c b/frontend/main.c index f943d9d..b1c43f7 100644 --- a/frontend/main.c +++ b/frontend/main.c @@ -28,6 +28,10 @@ ** $Id: main.c,v 1.89 2015/01/19 09:46:12 knik Exp $ **/ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + #ifdef _WIN32 #define WIN32_LEAN_AND_MEAN #include @@ -49,6 +53,13 @@ #include #include "audio.h" + +#ifdef HAVE_GETOPT_H +# include +#else +# include "getopt.h" +# include "getopt.c" +#endif #ifndef min #define min(a,b) ( (a) < (b) ? (a) : (b) ) @@ -421,6 +432,7 @@ faad_fprintf(stdout, " -w Write output to stdio instead of a file.\n"); faad_fprintf(stdout, " -g Disable gapless decoding.\n"); faad_fprintf(stdout, " -q Quiet - suppresses status messages.\n"); + faad_fprintf(stdout, " -j X Jump - start output X seconds into track (MP4 files only).\n"); faad_fprintf(stdout, "Example:\n"); faad_fprintf(stdout, " %s infile.aac\n", progName); faad_fprintf(stdout, " %s infile.mp4\n", progName); @@ -792,7 +804,7 @@ static int decodeMP4file(char *mp4file, char *sndfile, char *adts_fn, int to_stdout, int outputFormat, int fileType, int downMatrix, int noGapless, - int infoOnly, int adts_out, float *song_length) + int infoOnly, int adts_out, float *song_length, float seek_to) { int track; unsigned long samplerate; @@ -800,7 +812,7 @@ void *sample_buffer; mp4ff_t *infile; - long sampleId, numSamples; + long sampleId, numSamples, startSampleId; audio_file *aufile; @@ -960,7 +972,14 @@ numSamples = mp4ff_num_samples(infile, track); - for (sampleId = 0; sampleId < numSamples; sampleId++) + startSampleId = 0; + if (seek_to > 0.1) { + int32_t sample = mp4ff_find_sample(infile, track, (int64_t)(seek_to * timescale), NULL); + if (sample > 0 && sample < numSamples) + startSampleId = sample; + } + + for (sampleId = startSampleId; sampleId < numSamples; sampleId++) { int rc; long dur; @@ -1119,6 +1138,7 @@ char *aacFileName = NULL; char *audioFileName = NULL; char *adtsFileName = NULL; + float seekTo = 0; unsigned char header[8]; float length = 0; FILE *hMP4File; @@ -1151,11 +1171,12 @@ { "info", 0, 0, 'i' }, { "stdio", 0, 0, 'w' }, { "stdio", 0, 0, 'g' }, + { "seek", 1, 0, 'j' }, { "help", 0, 0, 'h' }, { 0, 0, 0, 0 } }; - c = getopt_long(argc, argv, "o:a:s:f:b:l:wgdhitq", + c = getopt_long(argc, argv, "o:a:s:f:b:l:j:wgdhitq", long_options, &option_index); if (c == -1) @@ -1246,6 +1267,12 @@ } } break; + case 'j': + if (optarg) + { + seekTo = atof(optarg); + } + break; case 't': old_format = 1; break; @@ -1277,6 +1304,8 @@ faad_fprintf(stderr, " Build: %s\n", __DATE__); faad_fprintf(stderr, " Copyright 2002-2004: Ahead Software AG\n"); faad_fprintf(stderr, " http://www.audiocoding.com\n"); + faad_fprintf(stderr, "\n Latest version and bug tracking available here:\n"); + faad_fprintf(stderr, " http://sourceforge.net/projects/faac/\n\n"); if (cap & FIXED_POINT_CAP) faad_fprintf(stderr, " Fixed point version\n"); else @@ -1368,10 +1397,14 @@ if (header[4] == 'f' && header[5] == 't' && header[6] == 'y' && header[7] == 'p') mp4file = 1; + if (!mp4file && seekTo != 0) { + faad_fprintf(stderr, "Warning: can only seek in MP4 files"); + } + if (mp4file) { result = decodeMP4file(aacFileName, audioFileName, adtsFileName, writeToStdio, - outputFormat, format, downMatrix, noGapless, infoOnly, adts_out, &length); + outputFormat, format, downMatrix, noGapless, infoOnly, adts_out, &length, seekTo); } else { if (readFromStdin == 1) { diff --git a/include/neaacdec.h b/include/neaacdec.h index 610a00b..1331f2c 100644 --- a/include/neaacdec.h +++ b/include/neaacdec.h @@ -73,7 +73,7 @@ #endif #endif -#define FAAD2_VERSION "2.7" +#define FAAD2_VERSION PACKAGE_VERSION /* object types for AAC */ #define MAIN 1 diff --git a/libfaad/Makefile.am b/libfaad/Makefile.am index 22e7432..a042c47 100644 --- a/libfaad/Makefile.am +++ b/libfaad/Makefile.am @@ -1,6 +1,6 @@ lib_LTLIBRARIES = libfaad.la libfaad_drm.la -INCLUDES = -iquote $(top_srcdir)/include +AM_CPPFLAGS = -iquote $(top_srcdir)/include include_HEADERS = $(top_srcdir)/include/faad.h \ $(top_srcdir)/include/neaacdec.h diff --git a/plugins/mpeg4ip/Makefile.am b/plugins/mpeg4ip/Makefile.am index dd916fc..ff52ade 100644 --- a/plugins/mpeg4ip/Makefile.am +++ b/plugins/mpeg4ip/Makefile.am @@ -13,7 +13,7 @@ -lm -INCLUDES = -I$(top_srcdir)/include +AM_CPPFLAGS = -I$(top_srcdir)/include AM_CFLAGS = -D_REENTRANT -fexceptions