update nestegg

+ prune some unused files

https://github.com/kinetiknz/nestegg.git

commit f46223191d8116a36bf299b5b9793fcb798417b1
Merge: 0851279 4b0190a
Author:     Matthew Gregan <kinetik@flim.org>
AuthorDate: Wed Nov 27 13:50:43 2013 -0800
Commit:     Matthew Gregan <kinetik@flim.org>
CommitDate: Wed Nov 27 13:50:43 2013 -0800

    Merge pull request #15 from shadone/master

    Fix compiler warning.

Change-Id: I59eecdd68fced1ef61b67d446735539628d81484
This commit is contained in:
James Zern 2013-12-13 18:53:31 -08:00
parent b27207cf63
commit cc6117d0f3
20 changed files with 681 additions and 2900 deletions

40
nestegg/.gitignore vendored
View File

@ -1,40 +0,0 @@
*.lo
*.o
*.swp
*~
.deps
.dirstamp
.libs
Makefile
Makefile.in
_stdint.h
aclocal.m4
autom4te.cache
compile
config.guess
config.h
config.h.in
config.log
config.status
config.sub
configure
depcomp
docs/Doxyfile
docs/doxygen-build.stamp
docs/html
install-sh
libtool
ltmain.sh
m4/libtool.m4
m4/ltoptions.m4
m4/ltsugar.m4
m4/ltversion.m4
m4/lt~obsolete.m4
missing
nestegg-uninstalled.pc
nestegg.pc
src/.dirstamp
src/libnestegg.la
stamp-h1
test/test
include/nestegg/nestegg-stdint.h

View File

@ -0,0 +1,41 @@
diff --git a/nestegg/halloc/src/halloc.c b/nestegg/halloc/src/halloc.c
index 5758fc0..837b3ff 100644
--- a/nestegg/halloc/src/halloc.c
+++ b/nestegg/halloc/src/halloc.c
@@ -15,7 +15,7 @@
#include <stdlib.h> /* realloc */
#include <string.h> /* memset & co */
-#include "halloc.h"
+#include "nestegg/halloc/halloc.h"
#include "align.h"
#include "hlist.h"
diff --git a/nestegg/include/nestegg/nestegg.h b/nestegg/include/nestegg/nestegg.h
index ff13728..c18d1d3 100644
--- a/nestegg/include/nestegg/nestegg.h
+++ b/nestegg/include/nestegg/nestegg.h
@@ -7,7 +7,7 @@
#if !defined(NESTEGG_671cac2a_365d_ed69_d7a3_4491d3538d79)
#define NESTEGG_671cac2a_365d_ed69_d7a3_4491d3538d79
-#include <nestegg/nestegg-stdint.h>
+#include "vpx/vpx_integer.h"
#if defined(__cplusplus)
extern "C" {
diff --git a/nestegg/src/nestegg.c b/nestegg/src/nestegg.c
index daf1eed..4fb10e7 100644
--- a/nestegg/src/nestegg.c
+++ b/nestegg/src/nestegg.c
@@ -8,8 +8,8 @@
#include <stdlib.h>
#include <string.h>
-#include "halloc.h"
-#include "nestegg/nestegg.h"
+#include "nestegg/halloc/halloc.h"
+#include "nestegg/include/nestegg/nestegg.h"
/* EBML Elements */
#define ID_EBML 0x1a45dfa3

View File

@ -0,0 +1,21 @@
diff --git a/nestegg/src/nestegg.c b/nestegg/src/nestegg.c
index 4fb10e7..b6bc460 100644
--- a/nestegg/src/nestegg.c
+++ b/nestegg/src/nestegg.c
@@ -934,7 +934,7 @@ static int
ne_read_simple(nestegg * ctx, struct ebml_element_desc * desc, size_t length)
{
struct ebml_type * storage;
- int r;
+ int r = 0;
storage = (struct ebml_type *) (ctx->ancestor->data + desc->offset);
@@ -968,7 +968,6 @@ ne_read_simple(nestegg * ctx, struct ebml_element_desc * desc, size_t length)
case TYPE_MASTER:
case TYPE_UNKNOWN:
assert(0);
- r = 0;
break;
}

View File

@ -1 +1,3 @@
Matthew Gregan <kinetik@flim.org>
Steve Workman <sjhworkman@gmail.com>
Paul Adenot <paul@paul.cx>

View File

@ -1,51 +0,0 @@
AUTOMAKE_OPTIONS = foreign 1.11 no-dist-gzip dist-bzip2 subdir-objects
ACLOCAL_AMFLAGS = -I m4
INCLUDES = -I$(top_srcdir)/include -I. -I$(top_srcdir)/halloc
AM_CFLAGS = -ansi -pedantic -Wall -Wextra -Wno-long-long -O0 -g
SUBDIRS = docs
EXTRA_DIST = \
AUTHORS README LICENSE \
nestegg-uninstalled.pc.in \
m4/as-ac-expand.m4 \
m4/pkg.m4 \
m4/ax_create_stdint_h.m4 \
halloc/src/halloc.c \
halloc/halloc.h \
halloc/src/align.h \
halloc/src/hlist.h \
halloc/src/macros.h
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = nestegg.pc
nesteggincludedir = $(includedir)/nestegg
nestegginclude_HEADERS = include/nestegg/nestegg.h include/nestegg/nestegg-stdint.h
lib_LTLIBRARIES = src/libnestegg.la
src_libnestegg_la_SOURCES = \
src/nestegg.c \
halloc/src/halloc.c \
halloc/halloc.h \
halloc/src/align.h \
halloc/src/hlist.h \
halloc/src/macros.h
check_PROGRAMS = test/test
test_test_SOURCES = test/test.c
test_test_LDADD = src/libnestegg.la
DISTCLEANFILES = include/nestegg/nestegg-stdint.h
dist-hook:
find $(distdir) -type d -name '.git' | xargs rm -rf
debug:
$(MAKE) all CFLAGS="@DEBUG@"
profile:
$(MAKE) all CFLAGS="@PROFILE@"

16
nestegg/README.webm Normal file
View File

@ -0,0 +1,16 @@
URL: https://github.com/kinetiknz/nestegg.git
Version: f46223191d8116a36bf299b5b9793fcb798417b1
License: ISC-style
License File: LICENSE
Description:
The source under the halloc/ directory is licensed under a BSD license. See
halloc/halloc.h for details.
Local Modifications:
- delete unnecessary docs and build files
- nestegg/0001-include-paths.diff
include path modifications for the libvpx build system
- 0002-ne_read_simple-uninitialized_variable.diff
fixes:
nestegg.c|975 col 6| warning: r may be used uninitialized in this function [-Wuninitialized]

View File

@ -1,124 +0,0 @@
dnl ------------------------------------------------
dnl Initialization and Versioning
dnl ------------------------------------------------
AC_INIT(libnestegg,[0.1git])
AC_CANONICAL_HOST
AC_CANONICAL_TARGET
AC_CONFIG_MACRO_DIR([m4])
AM_CONFIG_HEADER([config.h])
AC_CONFIG_SRCDIR([src/nestegg.c])
AM_INIT_AUTOMAKE
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
dnl Library versioning
dnl CURRENT, REVISION, AGE
dnl - library source changed -> increment REVISION
dnl - interfaces added/removed/changed -> increment CURRENT, REVISION = 0
dnl - interfaces added -> increment AGE
dnl - interfaces removed -> AGE = 0
NESTEGG_CURRENT=0
NESTEGG_REVISION=0
NESTEGG_AGE=1
AC_SUBST(NESTEGG_CURRENT)
AC_SUBST(NESTEGG_REVISION)
AC_SUBST(NESTEGG_AGE)
dnl --------------------------------------------------
dnl Check for programs
dnl --------------------------------------------------
dnl save $CFLAGS since AC_PROG_CC likes to insert "-g -O2"
dnl if $CFLAGS is blank
cflags_save="$CFLAGS"
AC_PROG_CC
AC_PROG_CPP
CFLAGS="$cflags_save"
AM_PROG_CC_C_O
AC_LIBTOOL_WIN32_DLL
AM_PROG_LIBTOOL
dnl Check for doxygen
AC_ARG_ENABLE([doc],
AS_HELP_STRING([--enable-doc], [Build API documentation]),
[ac_enable_doc=$enableval], [ac_enable_doc=auto])
if test "x$ac_enable_doc" != "xno"; then
AC_CHECK_PROG(HAVE_DOXYGEN, doxygen, true, false)
if test "x$HAVE_DOXYGEN" = "xfalse" -a "x$ac_enable_doc" = "xyes"; then
AC_MSG_ERROR([*** API documentation explicitly requested but Doxygen not found])
fi
else
HAVE_DOXYGEN=false
fi
AM_CONDITIONAL(HAVE_DOXYGEN,$HAVE_DOXYGEN)
if test $HAVE_DOXYGEN = "false"; then
AC_MSG_WARN([*** doxygen not found, API documentation will not be built])
fi
# Generate portable stdint.h replacement
AX_CREATE_STDINT_H(include/nestegg/nestegg-stdint.h)
# Test whenever ld supports -version-script
AC_PROG_LD
AC_PROG_LD_GNU
AC_MSG_CHECKING([how to control symbol export])
dnl --------------------------------------------------
dnl Do substitutions
dnl --------------------------------------------------
AC_SUBST(DEBUG)
AC_SUBST(PROFILE)
AC_OUTPUT([
Makefile
docs/Makefile
docs/Doxyfile
nestegg.pc
nestegg-uninstalled.pc
])
AS_AC_EXPAND(LIBDIR, ${libdir})
AS_AC_EXPAND(INCLUDEDIR, ${includedir})
AS_AC_EXPAND(BINDIR, ${bindir})
AS_AC_EXPAND(DOCDIR, ${docdir})
if test $HAVE_DOXYGEN = "false"; then
doc_build="no"
else
doc_build="yes"
fi
AC_MSG_RESULT([
------------------------------------------------------------------------
$PACKAGE $VERSION: Automatic configuration OK.
General configuration:
API Documentation: .......... ${doc_build}
Installation paths:
libnestegg: .................. ${LIBDIR}
C header files: .............. ${INCLUDEDIR}/nestegg
Documentation: ............... ${DOCDIR}
Building:
Type 'make' to compile $PACKAGE.
Type 'make install' to install $PACKAGE.
Example programs will be built but not installed.
------------------------------------------------------------------------
])

File diff suppressed because it is too large Load Diff

View File

@ -1,38 +0,0 @@
doc_DATA = doxygen-build.stamp
EXTRA_DIST = Doxyfile.in
if HAVE_DOXYGEN
doxygen-build.stamp: Doxyfile
doxygen
touch doxygen-build.stamp
else
doxygen-build.stamp:
echo "*** Warning: Doxygen not found; documentation will not be built."
touch doxygen-build.stamp
endif
dist_docdir = $(distdir)/libnestegg
dist-hook:
if test -d html; then \
mkdir $(dist_docdir); \
echo -n "copying built documenation..."; \
cp -rp html $(dist_docdir)/html; \
echo "OK"; \
fi
install-data-local: doxygen-build.stamp
$(mkinstalldirs) $(DESTDIR)$(docdir)
if test -d html; then \
cp -rp html $(DESTDIR)$(docdir)/html; \
fi
uninstall-local:
rm -rf $(DESTDIR)$(docdir)
clean-local:
if test -d html; then rm -rf html; fi
if test -f doxygen-build.stamp; then rm -f doxygen-build.stamp; fi

View File

@ -15,7 +15,7 @@
#include <stdlib.h> /* realloc */
#include <string.h> /* memset & co */
#include "../halloc.h"
#include "nestegg/halloc/halloc.h"
#include "align.h"
#include "hlist.h"

View File

@ -4,12 +4,12 @@
* This program is made available under an ISC-style license. See the
* accompanying file LICENSE for details.
*/
#ifndef NESTEGG_671cac2a_365d_ed69_d7a3_4491d3538d79
#if !defined(NESTEGG_671cac2a_365d_ed69_d7a3_4491d3538d79)
#define NESTEGG_671cac2a_365d_ed69_d7a3_4491d3538d79
#include "vpx/vpx_integer.h"
#ifdef __cplusplus
#if defined(__cplusplus)
extern "C" {
#endif
@ -17,10 +17,10 @@ extern "C" {
@section intro Introduction
This is the documentation fot the <tt>libnestegg</tt> C API.
This is the documentation for the <tt>libnestegg</tt> C API.
<tt>libnestegg</tt> is a demultiplexing library for <a
href="http://www.matroska.org/">Matroska</a> and <a
href="http://www.webmproject.org/">WebMedia</a> media files.
href="http://www.webmproject.org/code/specs/container/">WebM</a>
media files.
@section example Example code
@ -68,6 +68,13 @@ extern "C" {
#define NESTEGG_CODEC_VP8 0 /**< Track uses Google On2 VP8 codec. */
#define NESTEGG_CODEC_VORBIS 1 /**< Track uses Xiph Vorbis codec. */
#define NESTEGG_CODEC_VP9 2 /**< Track uses Google On2 VP9 codec. */
#define NESTEGG_CODEC_OPUS 3 /**< Track uses Xiph Opus codec. */
#define NESTEGG_VIDEO_MONO 0 /**< Track is mono video. */
#define NESTEGG_VIDEO_STEREO_LEFT_RIGHT 1 /**< Track is side-by-side stereo video. Left first. */
#define NESTEGG_VIDEO_STEREO_BOTTOM_TOP 2 /**< Track is top-bottom stereo video. Right first. */
#define NESTEGG_VIDEO_STEREO_TOP_BOTTOM 3 /**< Track is top-bottom stereo video. Left first. */
#define NESTEGG_VIDEO_STEREO_RIGHT_LEFT 11 /**< Track is side-by-side stereo video. Right first. */
#define NESTEGG_SEEK_SET 0 /**< Seek offset relative to beginning of stream. */
#define NESTEGG_SEEK_CUR 1 /**< Seek offset relative to current position in stream. */
@ -114,6 +121,10 @@ typedef struct {
/** Parameters specific to a video track. */
typedef struct {
unsigned int stereo_mode; /**< Video mode. One of #NESTEGG_VIDEO_MONO,
#NESTEGG_VIDEO_STEREO_LEFT_RIGHT,
#NESTEGG_VIDEO_STEREO_BOTTOM_TOP, or
#NESTEGG_VIDEO_STEREO_TOP_BOTTOM. */
unsigned int width; /**< Width of the video frame in pixels. */
unsigned int height; /**< Height of the video frame in pixels. */
unsigned int display_width; /**< Display width of the video frame in pixels. */
@ -129,6 +140,8 @@ typedef struct {
double rate; /**< Sampling rate in Hz. */
unsigned int channels; /**< Number of audio channels. */
unsigned int depth; /**< Bits per sample. */
uint64_t codec_delay; /**< Nanoseconds that must be discarded from the start. */
uint64_t seek_preroll;/**< Nanoseconds that must be discarded after a seek. */
} nestegg_audio_params;
/** Logging callback function pointer. */
@ -140,9 +153,10 @@ typedef void (* nestegg_log)(nestegg * context, unsigned int severity, char cons
@param context Storage for the new nestegg context. @see nestegg_destroy
@param io User supplied IO context.
@param callback Optional logging callback function pointer. May be NULL.
@param max_offset Optional maximum offset to be read. Set -1 to ignore.
@retval 0 Success.
@retval -1 Error. */
int nestegg_init(nestegg ** context, nestegg_io io, nestegg_log callback);
int nestegg_init(nestegg ** context, nestegg_io io, nestegg_log callback, int64_t max_offset);
/** Destroy a nestegg context and free associated memory.
@param context #nestegg context to be freed. @see nestegg_init */
@ -171,6 +185,29 @@ int nestegg_tstamp_scale(nestegg * context, uint64_t * scale);
@retval -1 Error. */
int nestegg_track_count(nestegg * context, unsigned int * tracks);
/** Query the start and end offset for a particular cluster.
@param context Stream context initialized by #nestegg_init.
@param cluster_num Zero-based cluster number; order they appear in cues.
@param max_offset Optional maximum offset to be read. Set -1 to ignore.
@param start_pos Starting offset of the cluster. -1 means non-existant.
@param end_pos Starting offset of the cluster. -1 means non-existant or
final cluster.
@param tstamp Starting timestamp of the cluster.
@retval 0 Success.
@retval -1 Error. */
int nestegg_get_cue_point(nestegg * context, unsigned int cluster_num,
int64_t max_offset, int64_t * start_pos,
int64_t * end_pos, uint64_t * tstamp);
/** Seek to @a offset. Stream will seek directly to offset.
Should be used to seek to the start of a resync point, i.e. cluster; the
parser will not be able to understand other offsets.
@param context Stream context initialized by #nestegg_init.
@param offset Absolute offset in bytes.
@retval 0 Success.
@retval -1 Error. */
int nestegg_offset_seek(nestegg * context, uint64_t offset);
/** Seek @a track to @a tstamp. Stream seek will terminate at the earliest
key point in the stream at or before @a tstamp. Other tracks in the
stream will output packets with unspecified but nearby timestamps.
@ -286,7 +323,30 @@ int nestegg_packet_count(nestegg_packet * packet, unsigned int * count);
int nestegg_packet_data(nestegg_packet * packet, unsigned int item,
unsigned char ** data, size_t * length);
#ifdef __cplusplus
/** Returns discard_padding for given packet
@param packet Packet initialized by #nestegg_read_packet.
@param discard_padding pointer to store discard padding in.
@retval 0 Success.
@retval -1 Error. */
int nestegg_packet_discard_padding(nestegg_packet * packet,
int64_t * discard_padding);
/** Query the presence of cues.
@param context Stream context initialized by #nestegg_init.
@retval 0 The media has no cues.
@retval 1 The media has cues. */
int nestegg_has_cues(nestegg * context);
/**
* Try to determine if the buffer looks like the beginning of a WebM file.
*
* @param buffer A buffer containing the beginning of a media file.
* @param length The size of the buffer.
* @retval 0 The file is not a WebM file.
* @retval 1 The file is a WebM file. */
int nestegg_sniff(unsigned char const * buffer, size_t length);
#if defined(__cplusplus)
}
#endif

View File

@ -1,43 +0,0 @@
dnl as-ac-expand.m4 0.2.0
dnl autostars m4 macro for expanding directories using configure's prefix
dnl thomas@apestaart.org
dnl AS_AC_EXPAND(VAR, CONFIGURE_VAR)
dnl example
dnl AS_AC_EXPAND(SYSCONFDIR, $sysconfdir)
dnl will set SYSCONFDIR to /usr/local/etc if prefix=/usr/local
AC_DEFUN([AS_AC_EXPAND],
[
EXP_VAR=[$1]
FROM_VAR=[$2]
dnl first expand prefix and exec_prefix if necessary
prefix_save=$prefix
exec_prefix_save=$exec_prefix
dnl if no prefix given, then use /usr/local, the default prefix
if test "x$prefix" = "xNONE"; then
prefix="$ac_default_prefix"
fi
dnl if no exec_prefix given, then use prefix
if test "x$exec_prefix" = "xNONE"; then
exec_prefix=$prefix
fi
full_var="$FROM_VAR"
dnl loop until it doesn't change anymore
while true; do
new_full_var="`eval echo $full_var`"
if test "x$new_full_var" = "x$full_var"; then break; fi
full_var=$new_full_var
done
dnl clean up
full_var=$new_full_var
AC_SUBST([$1], "$full_var")
dnl restore prefix and exec_prefix
prefix=$prefix_save
exec_prefix=$exec_prefix_save
])

View File

@ -1,695 +0,0 @@
dnl @synopsis AX_CREATE_STDINT_H [( HEADER-TO-GENERATE [, HEDERS-TO-CHECK])]
dnl
dnl the "ISO C9X: 7.18 Integer types <stdint.h>" section requires the
dnl existence of an include file <stdint.h> that defines a set of
dnl typedefs, especially uint8_t,int32_t,uintptr_t. Many older
dnl installations will not provide this file, but some will have the
dnl very same definitions in <inttypes.h>. In other enviroments we can
dnl use the inet-types in <sys/types.h> which would define the typedefs
dnl int8_t and u_int8_t respectivly.
dnl
dnl This macros will create a local "_stdint.h" or the headerfile given
dnl as an argument. In many cases that file will just "#include
dnl <stdint.h>" or "#include <inttypes.h>", while in other environments
dnl it will provide the set of basic 'stdint's definitions/typedefs:
dnl
dnl int8_t,uint8_t,int16_t,uint16_t,int32_t,uint32_t,intptr_t,uintptr_t
dnl int_least32_t.. int_fast32_t.. intmax_t
dnl
dnl which may or may not rely on the definitions of other files, or
dnl using the AC_CHECK_SIZEOF macro to determine the actual sizeof each
dnl type.
dnl
dnl if your header files require the stdint-types you will want to
dnl create an installable file mylib-int.h that all your other
dnl installable header may include. So if you have a library package
dnl named "mylib", just use
dnl
dnl AX_CREATE_STDINT_H(mylib-int.h)
dnl
dnl in configure.ac and go to install that very header file in
dnl Makefile.am along with the other headers (mylib.h) - and the
dnl mylib-specific headers can simply use "#include <mylib-int.h>" to
dnl obtain the stdint-types.
dnl
dnl Remember, if the system already had a valid <stdint.h>, the
dnl generated file will include it directly. No need for fuzzy
dnl HAVE_STDINT_H things... (oops, GCC 4.2.x has deliberatly disabled
dnl its stdint.h for non-c99 compilation and the c99-mode is not the
dnl default. Therefore this macro will not use the compiler's stdint.h
dnl - please complain to the GCC developers).
dnl
dnl @category C
dnl @author Guido U. Draheim <guidod@gmx.de>
dnl @version 2006-10-13
dnl @license GPLWithACException
AC_DEFUN([AX_CHECK_DATA_MODEL],[
AC_CHECK_SIZEOF(char)
AC_CHECK_SIZEOF(short)
AC_CHECK_SIZEOF(int)
AC_CHECK_SIZEOF(long)
AC_CHECK_SIZEOF(void*)
ac_cv_char_data_model=""
ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_char"
ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_short"
ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_int"
ac_cv_long_data_model=""
ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_int"
ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_long"
ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_voidp"
AC_MSG_CHECKING([data model])
case "$ac_cv_char_data_model/$ac_cv_long_data_model" in
122/242) ac_cv_data_model="IP16" ; n="standard 16bit machine" ;;
122/244) ac_cv_data_model="LP32" ; n="standard 32bit machine" ;;
122/*) ac_cv_data_model="i16" ; n="unusual int16 model" ;;
124/444) ac_cv_data_model="ILP32" ; n="standard 32bit unixish" ;;
124/488) ac_cv_data_model="LP64" ; n="standard 64bit unixish" ;;
124/448) ac_cv_data_model="LLP64" ; n="unusual 64bit unixish" ;;
124/*) ac_cv_data_model="i32" ; n="unusual int32 model" ;;
128/888) ac_cv_data_model="ILP64" ; n="unusual 64bit numeric" ;;
128/*) ac_cv_data_model="i64" ; n="unusual int64 model" ;;
222/*2) ac_cv_data_model="DSP16" ; n="strict 16bit dsptype" ;;
333/*3) ac_cv_data_model="DSP24" ; n="strict 24bit dsptype" ;;
444/*4) ac_cv_data_model="DSP32" ; n="strict 32bit dsptype" ;;
666/*6) ac_cv_data_model="DSP48" ; n="strict 48bit dsptype" ;;
888/*8) ac_cv_data_model="DSP64" ; n="strict 64bit dsptype" ;;
222/*|333/*|444/*|666/*|888/*) :
ac_cv_data_model="iDSP" ; n="unusual dsptype" ;;
*) ac_cv_data_model="none" ; n="very unusual model" ;;
esac
AC_MSG_RESULT([$ac_cv_data_model ($ac_cv_long_data_model, $n)])
])
dnl AX_CHECK_HEADER_STDINT_X([HEADERLIST][,ACTION-IF])
AC_DEFUN([AX_CHECK_HEADER_STDINT_X],[
AC_CACHE_CHECK([for stdint uintptr_t], [ac_cv_header_stdint_x],[
ac_cv_header_stdint_x="" # the 1997 typedefs (inttypes.h)
AC_MSG_RESULT([(..)])
for i in m4_ifval([$1],[$1],[stdint.h inttypes.h sys/inttypes.h sys/types.h])
do
unset ac_cv_type_uintptr_t
unset ac_cv_type_uint64_t
AC_CHECK_TYPE(uintptr_t,[ac_cv_header_stdint_x=$i],continue,[#include <$i>])
AC_CHECK_TYPE(uint64_t,[and64="/uint64_t"],[and64=""],[#include<$i>])
m4_ifvaln([$1],[$1]) break
done
AC_MSG_CHECKING([for stdint uintptr_t])
])
])
AC_DEFUN([AX_CHECK_HEADER_STDINT_O],[
AC_CACHE_CHECK([for stdint uint32_t], [ac_cv_header_stdint_o],[
ac_cv_header_stdint_o="" # the 1995 typedefs (sys/inttypes.h)
AC_MSG_RESULT([(..)])
for i in m4_ifval([$1],[$1],[inttypes.h sys/inttypes.h sys/types.h stdint.h])
do
unset ac_cv_type_uint32_t
unset ac_cv_type_uint64_t
AC_CHECK_TYPE(uint32_t,[ac_cv_header_stdint_o=$i],continue,[#include <$i>])
AC_CHECK_TYPE(uint64_t,[and64="/uint64_t"],[and64=""],[#include<$i>])
m4_ifvaln([$1],[$1]) break
break;
done
AC_MSG_CHECKING([for stdint uint32_t])
])
])
AC_DEFUN([AX_CHECK_HEADER_STDINT_U],[
AC_CACHE_CHECK([for stdint u_int32_t], [ac_cv_header_stdint_u],[
ac_cv_header_stdint_u="" # the BSD typedefs (sys/types.h)
AC_MSG_RESULT([(..)])
for i in m4_ifval([$1],[$1],[sys/types.h inttypes.h sys/inttypes.h]) ; do
unset ac_cv_type_u_int32_t
unset ac_cv_type_u_int64_t
AC_CHECK_TYPE(u_int32_t,[ac_cv_header_stdint_u=$i],continue,[#include <$i>])
AC_CHECK_TYPE(u_int64_t,[and64="/u_int64_t"],[and64=""],[#include<$i>])
m4_ifvaln([$1],[$1]) break
break;
done
AC_MSG_CHECKING([for stdint u_int32_t])
])
])
AC_DEFUN([AX_CREATE_STDINT_H],
[# ------ AX CREATE STDINT H -------------------------------------
AC_MSG_CHECKING([for stdint types])
ac_stdint_h=`echo ifelse($1, , _stdint.h, $1)`
# try to shortcircuit - if the default include path of the compiler
# can find a "stdint.h" header then we assume that all compilers can.
AC_CACHE_VAL([ac_cv_header_stdint_t],[
old_CXXFLAGS="$CXXFLAGS" ; CXXFLAGS=""
old_CPPFLAGS="$CPPFLAGS" ; CPPFLAGS=""
old_CFLAGS="$CFLAGS" ; CFLAGS=""
AC_TRY_COMPILE([#include <stdint.h>],[int_least32_t v = 0;],
[ac_cv_stdint_result="(assuming C99 compatible system)"
ac_cv_header_stdint_t="stdint.h"; ],
[ac_cv_header_stdint_t=""])
if test "$GCC" = "yes" && test ".$ac_cv_header_stdint_t" = "."; then
CFLAGS="-std=c99"
AC_TRY_COMPILE([#include <stdint.h>],[int_least32_t v = 0;],
[AC_MSG_WARN(your GCC compiler has a defunct stdint.h for its default-mode)])
fi
CXXFLAGS="$old_CXXFLAGS"
CPPFLAGS="$old_CPPFLAGS"
CFLAGS="$old_CFLAGS" ])
v="... $ac_cv_header_stdint_h"
if test "$ac_stdint_h" = "stdint.h" ; then
AC_MSG_RESULT([(are you sure you want them in ./stdint.h?)])
elif test "$ac_stdint_h" = "inttypes.h" ; then
AC_MSG_RESULT([(are you sure you want them in ./inttypes.h?)])
elif test "_$ac_cv_header_stdint_t" = "_" ; then
AC_MSG_RESULT([(putting them into $ac_stdint_h)$v])
else
ac_cv_header_stdint="$ac_cv_header_stdint_t"
AC_MSG_RESULT([$ac_cv_header_stdint (shortcircuit)])
fi
if test "_$ac_cv_header_stdint_t" = "_" ; then # can not shortcircuit..
dnl .....intro message done, now do a few system checks.....
dnl btw, all old CHECK_TYPE macros do automatically "DEFINE" a type,
dnl therefore we use the autoconf implementation detail CHECK_TYPE_NEW
dnl instead that is triggered with 3 or more arguments (see types.m4)
inttype_headers=`echo $2 | sed -e 's/,/ /g'`
ac_cv_stdint_result="(no helpful system typedefs seen)"
AX_CHECK_HEADER_STDINT_X(dnl
stdint.h inttypes.h sys/inttypes.h $inttype_headers,
ac_cv_stdint_result="(seen uintptr_t$and64 in $i)")
if test "_$ac_cv_header_stdint_x" = "_" ; then
AX_CHECK_HEADER_STDINT_O(dnl,
inttypes.h sys/inttypes.h stdint.h $inttype_headers,
ac_cv_stdint_result="(seen uint32_t$and64 in $i)")
fi
if test "_$ac_cv_header_stdint_x" = "_" ; then
if test "_$ac_cv_header_stdint_o" = "_" ; then
AX_CHECK_HEADER_STDINT_U(dnl,
sys/types.h inttypes.h sys/inttypes.h $inttype_headers,
ac_cv_stdint_result="(seen u_int32_t$and64 in $i)")
fi fi
dnl if there was no good C99 header file, do some typedef checks...
if test "_$ac_cv_header_stdint_x" = "_" ; then
AC_MSG_CHECKING([for stdint datatype model])
AC_MSG_RESULT([(..)])
AX_CHECK_DATA_MODEL
fi
if test "_$ac_cv_header_stdint_x" != "_" ; then
ac_cv_header_stdint="$ac_cv_header_stdint_x"
elif test "_$ac_cv_header_stdint_o" != "_" ; then
ac_cv_header_stdint="$ac_cv_header_stdint_o"
elif test "_$ac_cv_header_stdint_u" != "_" ; then
ac_cv_header_stdint="$ac_cv_header_stdint_u"
else
ac_cv_header_stdint="stddef.h"
fi
AC_MSG_CHECKING([for extra inttypes in chosen header])
AC_MSG_RESULT([($ac_cv_header_stdint)])
dnl see if int_least and int_fast types are present in _this_ header.
unset ac_cv_type_int_least32_t
unset ac_cv_type_int_fast32_t
AC_CHECK_TYPE(int_least32_t,,,[#include <$ac_cv_header_stdint>])
AC_CHECK_TYPE(int_fast32_t,,,[#include<$ac_cv_header_stdint>])
AC_CHECK_TYPE(intmax_t,,,[#include <$ac_cv_header_stdint>])
fi # shortcircut to system "stdint.h"
# ------------------ PREPARE VARIABLES ------------------------------
if test "$GCC" = "yes" ; then
ac_cv_stdint_message="using gnu compiler "`$CC --version | head -1`
else
ac_cv_stdint_message="using $CC"
fi
AC_MSG_RESULT([make use of $ac_cv_header_stdint in $ac_stdint_h dnl
$ac_cv_stdint_result])
dnl -----------------------------------------------------------------
# ----------------- DONE inttypes.h checks START header -------------
AC_CONFIG_COMMANDS([$ac_stdint_h],[
AC_MSG_NOTICE(creating $ac_stdint_h : $_ac_stdint_h)
ac_stdint=$tmp/_stdint.h
echo "#ifndef" $_ac_stdint_h >$ac_stdint
echo "#define" $_ac_stdint_h "1" >>$ac_stdint
echo "#ifndef" _GENERATED_STDINT_H >>$ac_stdint
echo "#define" _GENERATED_STDINT_H '"'$PACKAGE $VERSION'"' >>$ac_stdint
echo "/* generated $ac_cv_stdint_message */" >>$ac_stdint
if test "_$ac_cv_header_stdint_t" != "_" ; then
echo "#define _STDINT_HAVE_STDINT_H" "1" >>$ac_stdint
echo "#include <stdint.h>" >>$ac_stdint
echo "#endif" >>$ac_stdint
echo "#endif" >>$ac_stdint
else
cat >>$ac_stdint <<STDINT_EOF
/* ................... shortcircuit part ........................... */
#if defined HAVE_STDINT_H || defined _STDINT_HAVE_STDINT_H
#include <stdint.h>
#else
#include <stddef.h>
/* .................... configured part ............................ */
STDINT_EOF
echo "/* whether we have a C99 compatible stdint header file */" >>$ac_stdint
if test "_$ac_cv_header_stdint_x" != "_" ; then
ac_header="$ac_cv_header_stdint_x"
echo "#define _STDINT_HEADER_INTPTR" '"'"$ac_header"'"' >>$ac_stdint
else
echo "/* #undef _STDINT_HEADER_INTPTR */" >>$ac_stdint
fi
echo "/* whether we have a C96 compatible inttypes header file */" >>$ac_stdint
if test "_$ac_cv_header_stdint_o" != "_" ; then
ac_header="$ac_cv_header_stdint_o"
echo "#define _STDINT_HEADER_UINT32" '"'"$ac_header"'"' >>$ac_stdint
else
echo "/* #undef _STDINT_HEADER_UINT32 */" >>$ac_stdint
fi
echo "/* whether we have a BSD compatible inet types header */" >>$ac_stdint
if test "_$ac_cv_header_stdint_u" != "_" ; then
ac_header="$ac_cv_header_stdint_u"
echo "#define _STDINT_HEADER_U_INT32" '"'"$ac_header"'"' >>$ac_stdint
else
echo "/* #undef _STDINT_HEADER_U_INT32 */" >>$ac_stdint
fi
echo "" >>$ac_stdint
if test "_$ac_header" != "_" ; then if test "$ac_header" != "stddef.h" ; then
echo "#include <$ac_header>" >>$ac_stdint
echo "" >>$ac_stdint
fi fi
echo "/* which 64bit typedef has been found */" >>$ac_stdint
if test "$ac_cv_type_uint64_t" = "yes" ; then
echo "#define _STDINT_HAVE_UINT64_T" "1" >>$ac_stdint
else
echo "/* #undef _STDINT_HAVE_UINT64_T */" >>$ac_stdint
fi
if test "$ac_cv_type_u_int64_t" = "yes" ; then
echo "#define _STDINT_HAVE_U_INT64_T" "1" >>$ac_stdint
else
echo "/* #undef _STDINT_HAVE_U_INT64_T */" >>$ac_stdint
fi
echo "" >>$ac_stdint
echo "/* which type model has been detected */" >>$ac_stdint
if test "_$ac_cv_char_data_model" != "_" ; then
echo "#define _STDINT_CHAR_MODEL" "$ac_cv_char_data_model" >>$ac_stdint
echo "#define _STDINT_LONG_MODEL" "$ac_cv_long_data_model" >>$ac_stdint
else
echo "/* #undef _STDINT_CHAR_MODEL // skipped */" >>$ac_stdint
echo "/* #undef _STDINT_LONG_MODEL // skipped */" >>$ac_stdint
fi
echo "" >>$ac_stdint
echo "/* whether int_least types were detected */" >>$ac_stdint
if test "$ac_cv_type_int_least32_t" = "yes"; then
echo "#define _STDINT_HAVE_INT_LEAST32_T" "1" >>$ac_stdint
else
echo "/* #undef _STDINT_HAVE_INT_LEAST32_T */" >>$ac_stdint
fi
echo "/* whether int_fast types were detected */" >>$ac_stdint
if test "$ac_cv_type_int_fast32_t" = "yes"; then
echo "#define _STDINT_HAVE_INT_FAST32_T" "1" >>$ac_stdint
else
echo "/* #undef _STDINT_HAVE_INT_FAST32_T */" >>$ac_stdint
fi
echo "/* whether intmax_t type was detected */" >>$ac_stdint
if test "$ac_cv_type_intmax_t" = "yes"; then
echo "#define _STDINT_HAVE_INTMAX_T" "1" >>$ac_stdint
else
echo "/* #undef _STDINT_HAVE_INTMAX_T */" >>$ac_stdint
fi
echo "" >>$ac_stdint
cat >>$ac_stdint <<STDINT_EOF
/* .................... detections part ............................ */
/* whether we need to define bitspecific types from compiler base types */
#ifndef _STDINT_HEADER_INTPTR
#ifndef _STDINT_HEADER_UINT32
#ifndef _STDINT_HEADER_U_INT32
#define _STDINT_NEED_INT_MODEL_T
#else
#define _STDINT_HAVE_U_INT_TYPES
#endif
#endif
#endif
#ifdef _STDINT_HAVE_U_INT_TYPES
#undef _STDINT_NEED_INT_MODEL_T
#endif
#ifdef _STDINT_CHAR_MODEL
#if _STDINT_CHAR_MODEL+0 == 122 || _STDINT_CHAR_MODEL+0 == 124
#ifndef _STDINT_BYTE_MODEL
#define _STDINT_BYTE_MODEL 12
#endif
#endif
#endif
#ifndef _STDINT_HAVE_INT_LEAST32_T
#define _STDINT_NEED_INT_LEAST_T
#endif
#ifndef _STDINT_HAVE_INT_FAST32_T
#define _STDINT_NEED_INT_FAST_T
#endif
#ifndef _STDINT_HEADER_INTPTR
#define _STDINT_NEED_INTPTR_T
#ifndef _STDINT_HAVE_INTMAX_T
#define _STDINT_NEED_INTMAX_T
#endif
#endif
/* .................... definition part ............................ */
/* some system headers have good uint64_t */
#ifndef _HAVE_UINT64_T
#if defined _STDINT_HAVE_UINT64_T || defined HAVE_UINT64_T
#define _HAVE_UINT64_T
#elif defined _STDINT_HAVE_U_INT64_T || defined HAVE_U_INT64_T
#define _HAVE_UINT64_T
typedef u_int64_t uint64_t;
#endif
#endif
#ifndef _HAVE_UINT64_T
/* .. here are some common heuristics using compiler runtime specifics */
#if defined __STDC_VERSION__ && defined __STDC_VERSION__ >= 199901L
#define _HAVE_UINT64_T
#define _HAVE_LONGLONG_UINT64_T
typedef long long int64_t;
typedef unsigned long long uint64_t;
#elif !defined __STRICT_ANSI__
#if defined _MSC_VER || defined __WATCOMC__ || defined __BORLANDC__
#define _HAVE_UINT64_T
typedef __int64 int64_t;
typedef unsigned __int64 uint64_t;
#elif defined __GNUC__ || defined __MWERKS__ || defined __ELF__
/* note: all ELF-systems seem to have loff-support which needs 64-bit */
#if !defined _NO_LONGLONG
#define _HAVE_UINT64_T
#define _HAVE_LONGLONG_UINT64_T
typedef long long int64_t;
typedef unsigned long long uint64_t;
#endif
#elif defined __alpha || (defined __mips && defined _ABIN32)
#if !defined _NO_LONGLONG
typedef long int64_t;
typedef unsigned long uint64_t;
#endif
/* compiler/cpu type to define int64_t */
#endif
#endif
#endif
#if defined _STDINT_HAVE_U_INT_TYPES
/* int8_t int16_t int32_t defined by inet code, redeclare the u_intXX types */
typedef u_int8_t uint8_t;
typedef u_int16_t uint16_t;
typedef u_int32_t uint32_t;
/* glibc compatibility */
#ifndef __int8_t_defined
#define __int8_t_defined
#endif
#endif
#ifdef _STDINT_NEED_INT_MODEL_T
/* we must guess all the basic types. Apart from byte-adressable system, */
/* there a few 32-bit-only dsp-systems that we guard with BYTE_MODEL 8-} */
/* (btw, those nibble-addressable systems are way off, or so we assume) */
dnl /* have a look at "64bit and data size neutrality" at */
dnl /* http://unix.org/version2/whatsnew/login_64bit.html */
dnl /* (the shorthand "ILP" types always have a "P" part) */
#if defined _STDINT_BYTE_MODEL
#if _STDINT_LONG_MODEL+0 == 242
/* 2:4:2 = IP16 = a normal 16-bit system */
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned long uint32_t;
#ifndef __int8_t_defined
#define __int8_t_defined
typedef char int8_t;
typedef short int16_t;
typedef long int32_t;
#endif
#elif _STDINT_LONG_MODEL+0 == 244 || _STDINT_LONG_MODEL == 444
/* 2:4:4 = LP32 = a 32-bit system derived from a 16-bit */
/* 4:4:4 = ILP32 = a normal 32-bit system */
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
#ifndef __int8_t_defined
#define __int8_t_defined
typedef char int8_t;
typedef short int16_t;
typedef int int32_t;
#endif
#elif _STDINT_LONG_MODEL+0 == 484 || _STDINT_LONG_MODEL+0 == 488
/* 4:8:4 = IP32 = a 32-bit system prepared for 64-bit */
/* 4:8:8 = LP64 = a normal 64-bit system */
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
#ifndef __int8_t_defined
#define __int8_t_defined
typedef char int8_t;
typedef short int16_t;
typedef int int32_t;
#endif
/* this system has a "long" of 64bit */
#ifndef _HAVE_UINT64_T
#define _HAVE_UINT64_T
typedef unsigned long uint64_t;
typedef long int64_t;
#endif
#elif _STDINT_LONG_MODEL+0 == 448
/* LLP64 a 64-bit system derived from a 32-bit system */
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
#ifndef __int8_t_defined
#define __int8_t_defined
typedef char int8_t;
typedef short int16_t;
typedef int int32_t;
#endif
/* assuming the system has a "long long" */
#ifndef _HAVE_UINT64_T
#define _HAVE_UINT64_T
#define _HAVE_LONGLONG_UINT64_T
typedef unsigned long long uint64_t;
typedef long long int64_t;
#endif
#else
#define _STDINT_NO_INT32_T
#endif
#else
#define _STDINT_NO_INT8_T
#define _STDINT_NO_INT32_T
#endif
#endif
/*
* quote from SunOS-5.8 sys/inttypes.h:
* Use at your own risk. As of February 1996, the committee is squarely
* behind the fixed sized types; the "least" and "fast" types are still being
* discussed. The probability that the "fast" types may be removed before
* the standard is finalized is high enough that they are not currently
* implemented.
*/
#if defined _STDINT_NEED_INT_LEAST_T
typedef int8_t int_least8_t;
typedef int16_t int_least16_t;
typedef int32_t int_least32_t;
#ifdef _HAVE_UINT64_T
typedef int64_t int_least64_t;
#endif
typedef uint8_t uint_least8_t;
typedef uint16_t uint_least16_t;
typedef uint32_t uint_least32_t;
#ifdef _HAVE_UINT64_T
typedef uint64_t uint_least64_t;
#endif
/* least types */
#endif
#if defined _STDINT_NEED_INT_FAST_T
typedef int8_t int_fast8_t;
typedef int int_fast16_t;
typedef int32_t int_fast32_t;
#ifdef _HAVE_UINT64_T
typedef int64_t int_fast64_t;
#endif
typedef uint8_t uint_fast8_t;
typedef unsigned uint_fast16_t;
typedef uint32_t uint_fast32_t;
#ifdef _HAVE_UINT64_T
typedef uint64_t uint_fast64_t;
#endif
/* fast types */
#endif
#ifdef _STDINT_NEED_INTMAX_T
#ifdef _HAVE_UINT64_T
typedef int64_t intmax_t;
typedef uint64_t uintmax_t;
#else
typedef long intmax_t;
typedef unsigned long uintmax_t;
#endif
#endif
#ifdef _STDINT_NEED_INTPTR_T
#ifndef __intptr_t_defined
#define __intptr_t_defined
/* we encourage using "long" to store pointer values, never use "int" ! */
#if _STDINT_LONG_MODEL+0 == 242 || _STDINT_LONG_MODEL+0 == 484
typedef unsigned int uintptr_t;
typedef int intptr_t;
#elif _STDINT_LONG_MODEL+0 == 244 || _STDINT_LONG_MODEL+0 == 444
typedef unsigned long uintptr_t;
typedef long intptr_t;
#elif _STDINT_LONG_MODEL+0 == 448 && defined _HAVE_UINT64_T
typedef uint64_t uintptr_t;
typedef int64_t intptr_t;
#else /* matches typical system types ILP32 and LP64 - but not IP16 or LLP64 */
typedef unsigned long uintptr_t;
typedef long intptr_t;
#endif
#endif
#endif
/* The ISO C99 standard specifies that in C++ implementations these
should only be defined if explicitly requested. */
#if !defined __cplusplus || defined __STDC_CONSTANT_MACROS
#ifndef UINT32_C
/* Signed. */
# define INT8_C(c) c
# define INT16_C(c) c
# define INT32_C(c) c
# ifdef _HAVE_LONGLONG_UINT64_T
# define INT64_C(c) c ## L
# else
# define INT64_C(c) c ## LL
# endif
/* Unsigned. */
# define UINT8_C(c) c ## U
# define UINT16_C(c) c ## U
# define UINT32_C(c) c ## U
# ifdef _HAVE_LONGLONG_UINT64_T
# define UINT64_C(c) c ## UL
# else
# define UINT64_C(c) c ## ULL
# endif
/* Maximal type. */
# ifdef _HAVE_LONGLONG_UINT64_T
# define INTMAX_C(c) c ## L
# define UINTMAX_C(c) c ## UL
# else
# define INTMAX_C(c) c ## LL
# define UINTMAX_C(c) c ## ULL
# endif
/* literalnumbers */
#endif
#endif
/* These limits are merily those of a two complement byte-oriented system */
/* Minimum of signed integral types. */
# define INT8_MIN (-128)
# define INT16_MIN (-32767-1)
# define INT32_MIN (-2147483647-1)
# define INT64_MIN (-__INT64_C(9223372036854775807)-1)
/* Maximum of signed integral types. */
# define INT8_MAX (127)
# define INT16_MAX (32767)
# define INT32_MAX (2147483647)
# define INT64_MAX (__INT64_C(9223372036854775807))
/* Maximum of unsigned integral types. */
# define UINT8_MAX (255)
# define UINT16_MAX (65535)
# define UINT32_MAX (4294967295U)
# define UINT64_MAX (__UINT64_C(18446744073709551615))
/* Minimum of signed integral types having a minimum size. */
# define INT_LEAST8_MIN INT8_MIN
# define INT_LEAST16_MIN INT16_MIN
# define INT_LEAST32_MIN INT32_MIN
# define INT_LEAST64_MIN INT64_MIN
/* Maximum of signed integral types having a minimum size. */
# define INT_LEAST8_MAX INT8_MAX
# define INT_LEAST16_MAX INT16_MAX
# define INT_LEAST32_MAX INT32_MAX
# define INT_LEAST64_MAX INT64_MAX
/* Maximum of unsigned integral types having a minimum size. */
# define UINT_LEAST8_MAX UINT8_MAX
# define UINT_LEAST16_MAX UINT16_MAX
# define UINT_LEAST32_MAX UINT32_MAX
# define UINT_LEAST64_MAX UINT64_MAX
/* shortcircuit*/
#endif
/* once */
#endif
#endif
STDINT_EOF
fi
if cmp -s $ac_stdint_h $ac_stdint 2>/dev/null; then
AC_MSG_NOTICE([$ac_stdint_h is unchanged])
else
ac_dir=`AS_DIRNAME(["$ac_stdint_h"])`
AS_MKDIR_P(["$ac_dir"])
rm -f $ac_stdint_h
mv $ac_stdint $ac_stdint_h
fi
],[# variables for create stdint.h replacement
PACKAGE="$PACKAGE"
VERSION="$VERSION"
ac_stdint_h="$ac_stdint_h"
_ac_stdint_h=AS_TR_CPP(_$PACKAGE-$ac_stdint_h)
ac_cv_stdint_message="$ac_cv_stdint_message"
ac_cv_header_stdint_t="$ac_cv_header_stdint_t"
ac_cv_header_stdint_x="$ac_cv_header_stdint_x"
ac_cv_header_stdint_o="$ac_cv_header_stdint_o"
ac_cv_header_stdint_u="$ac_cv_header_stdint_u"
ac_cv_type_uint64_t="$ac_cv_type_uint64_t"
ac_cv_type_u_int64_t="$ac_cv_type_u_int64_t"
ac_cv_char_data_model="$ac_cv_char_data_model"
ac_cv_long_data_model="$ac_cv_long_data_model"
ac_cv_type_int_least32_t="$ac_cv_type_int_least32_t"
ac_cv_type_int_fast32_t="$ac_cv_type_int_fast32_t"
ac_cv_type_intmax_t="$ac_cv_type_intmax_t"
])
])

View File

@ -1,157 +0,0 @@
# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
#
# Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
#
# 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 of the License, 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, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.
# PKG_PROG_PKG_CONFIG([MIN-VERSION])
# ----------------------------------
AC_DEFUN([PKG_PROG_PKG_CONFIG],
[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
m4_pattern_allow([^PKG_CONFIG(_PATH)?$])
AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl
if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
fi
if test -n "$PKG_CONFIG"; then
_pkg_min_version=m4_default([$1], [0.9.0])
AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
AC_MSG_RESULT([yes])
else
AC_MSG_RESULT([no])
PKG_CONFIG=""
fi
fi[]dnl
])# PKG_PROG_PKG_CONFIG
# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
#
# Check to see whether a particular set of modules exists. Similar
# to PKG_CHECK_MODULES(), but does not set variables or print errors.
#
#
# Similar to PKG_CHECK_MODULES, make sure that the first instance of
# this or PKG_CHECK_MODULES is called, or make sure to call
# PKG_CHECK_EXISTS manually
# --------------------------------------------------------------
AC_DEFUN([PKG_CHECK_EXISTS],
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
if test -n "$PKG_CONFIG" && \
AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
m4_ifval([$2], [$2], [:])
m4_ifvaln([$3], [else
$3])dnl
fi])
# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
# ---------------------------------------------
m4_define([_PKG_CONFIG],
[if test -n "$PKG_CONFIG"; then
if test -n "$$1"; then
pkg_cv_[]$1="$$1"
else
PKG_CHECK_EXISTS([$3],
[pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`],
[pkg_failed=yes])
fi
else
pkg_failed=untried
fi[]dnl
])# _PKG_CONFIG
# _PKG_SHORT_ERRORS_SUPPORTED
# -----------------------------
AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
_pkg_short_errors_supported=yes
else
_pkg_short_errors_supported=no
fi[]dnl
])# _PKG_SHORT_ERRORS_SUPPORTED
# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
# [ACTION-IF-NOT-FOUND])
#
#
# Note that if there is a possibility the first call to
# PKG_CHECK_MODULES might not happen, you should be sure to include an
# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
#
#
# --------------------------------------------------------------
AC_DEFUN([PKG_CHECK_MODULES],
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
pkg_failed=no
AC_MSG_CHECKING([for $1])
_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
_PKG_CONFIG([$1][_LIBS], [libs], [$2])
m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
and $1[]_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.])
if test $pkg_failed = yes; then
_PKG_SHORT_ERRORS_SUPPORTED
if test $_pkg_short_errors_supported = yes; then
$1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"`
else
$1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"`
fi
# Put the nasty error message in config.log where it belongs
echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
ifelse([$4], , [AC_MSG_ERROR(dnl
[Package requirements ($2) were not met:
$$1_PKG_ERRORS
Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.
_PKG_TEXT
])],
[AC_MSG_RESULT([no])
$4])
elif test $pkg_failed = untried; then
ifelse([$4], , [AC_MSG_FAILURE(dnl
[The pkg-config script could not be found or is too old. Make sure it
is in your PATH or set the PKG_CONFIG environment variable to the full
path to pkg-config.
_PKG_TEXT
To get pkg-config, see <http://pkg-config.freedesktop.org/>.])],
[$4])
else
$1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
$1[]_LIBS=$pkg_cv_[]$1[]_LIBS
AC_MSG_RESULT([yes])
ifelse([$3], , :, [$3])
fi[]dnl
])# PKG_CHECK_MODULES

View File

@ -1,13 +0,0 @@
# nestegg uninstalled pkg-config file
prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@
Name: nestegg
Description: WebM/Matroska demuxer
Version: @VERSION@
Conflicts:
Libs: -L${libdir} -lnestegg
Cflags: -I${includedir}

View File

@ -1,13 +0,0 @@
# nestegg installed pkg-config file
prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@
Name: nestegg
Description: WebM/Matroska demuxer
Version: @VERSION@
Conflicts:
Libs: -L${libdir} -lnestegg
Cflags: -I${includedir}

View File

@ -25,7 +25,7 @@
#define ID_VOID 0xec
#define ID_CRC32 0xbf
/* WebMedia Elements */
/* WebM Elements */
#define ID_SEGMENT 0x18538067
/* Seek Head Elements */
@ -49,6 +49,7 @@
#define ID_BLOCK 0xa1
#define ID_BLOCK_DURATION 0x9b
#define ID_REFERENCE_BLOCK 0xfb
#define ID_DISCARD_PADDING 0x75a2
/* Tracks Elements */
#define ID_TRACKS 0x1654ae6b
@ -63,9 +64,12 @@
#define ID_LANGUAGE 0x22b59c
#define ID_CODEC_ID 0x86
#define ID_CODEC_PRIVATE 0x63a2
#define ID_CODEC_DELAY 0x56aa
#define ID_SEEK_PREROLL 0x56bb
/* Video Elements */
#define ID_VIDEO 0xe0
#define ID_STEREO_MODE 0x53b8
#define ID_PIXEL_WIDTH 0xb0
#define ID_PIXEL_HEIGHT 0xba
#define ID_PIXEL_CROP_BOTTOM 0x54aa
@ -129,6 +133,7 @@ enum ebml_type_enum {
#define TRACK_ID_VP8 "V_VP8"
#define TRACK_ID_VP9 "V_VP9"
#define TRACK_ID_VORBIS "A_VORBIS"
#define TRACK_ID_OPUS "A_OPUS"
enum vint_mask {
MASK_NONE,
@ -192,6 +197,7 @@ struct info {
struct block_group {
struct ebml_type duration;
struct ebml_type reference_block;
struct ebml_type discard_padding;
};
struct cluster {
@ -200,6 +206,7 @@ struct cluster {
};
struct video {
struct ebml_type stereo_mode;
struct ebml_type pixel_width;
struct ebml_type pixel_height;
struct ebml_type pixel_crop_bottom;
@ -227,6 +234,8 @@ struct track_entry {
struct ebml_type language;
struct ebml_type codec_id;
struct ebml_type codec_private;
struct ebml_type codec_delay;
struct ebml_type seek_preroll;
struct video video;
struct audio audio;
};
@ -274,6 +283,7 @@ struct saved_state {
struct list_node * ancestor;
uint64_t last_id;
uint64_t last_size;
int last_valid;
};
struct frame {
@ -289,6 +299,7 @@ struct nestegg {
struct pool_ctx * alloc_pool;
uint64_t last_id;
uint64_t last_size;
int last_valid;
struct list_node * ancestor;
struct ebml ebml;
struct segment segment;
@ -300,6 +311,7 @@ struct nestegg_packet {
uint64_t track;
uint64_t timecode;
struct frame * frame;
int64_t discard_padding;
};
/* Element Descriptor */
@ -341,7 +353,7 @@ static struct ebml_element_desc ne_ebml_elements[] = {
E_LAST
};
/* WebMedia Element Lists */
/* WebM Element Lists */
static struct ebml_element_desc ne_seek_elements[] = {
E_FIELD(ID_SEEK_ID, TYPE_BINARY, struct seek, id),
E_FIELD(ID_SEEK_POSITION, TYPE_UINT, struct seek, position),
@ -363,6 +375,7 @@ static struct ebml_element_desc ne_block_group_elements[] = {
E_SUSPEND(ID_BLOCK, TYPE_BINARY),
E_FIELD(ID_BLOCK_DURATION, TYPE_UINT, struct block_group, duration),
E_FIELD(ID_REFERENCE_BLOCK, TYPE_INT, struct block_group, reference_block),
E_FIELD(ID_DISCARD_PADDING, TYPE_INT, struct block_group, discard_padding),
E_LAST
};
@ -374,6 +387,7 @@ static struct ebml_element_desc ne_cluster_elements[] = {
};
static struct ebml_element_desc ne_video_elements[] = {
E_FIELD(ID_STEREO_MODE, TYPE_UINT, struct video, stereo_mode),
E_FIELD(ID_PIXEL_WIDTH, TYPE_UINT, struct video, pixel_width),
E_FIELD(ID_PIXEL_HEIGHT, TYPE_UINT, struct video, pixel_height),
E_FIELD(ID_PIXEL_CROP_BOTTOM, TYPE_UINT, struct video, pixel_crop_bottom),
@ -403,6 +417,8 @@ static struct ebml_element_desc ne_track_entry_elements[] = {
E_FIELD(ID_LANGUAGE, TYPE_STRING, struct track_entry, language),
E_FIELD(ID_CODEC_ID, TYPE_STRING, struct track_entry, codec_id),
E_FIELD(ID_CODEC_PRIVATE, TYPE_BINARY, struct track_entry, codec_private),
E_FIELD(ID_CODEC_DELAY, TYPE_UINT, struct track_entry, codec_delay),
E_FIELD(ID_SEEK_PREROLL, TYPE_UINT, struct track_entry, seek_preroll),
E_SINGLE_MASTER(ID_VIDEO, TYPE_MASTER, struct track_entry, video),
E_SINGLE_MASTER(ID_AUDIO, TYPE_MASTER, struct track_entry, audio),
E_LAST
@ -660,7 +676,7 @@ ne_read_float(nestegg_io * io, double * val, uint64_t length)
} value;
int r;
/* length == 10 not implemented */
/* Length == 10 not implemented. */
if (length != 4 && length != 8)
return -1;
r = ne_read_uint(io, &value.u, length);
@ -808,6 +824,7 @@ ne_ctx_save(nestegg * ctx, struct saved_state * s)
s->ancestor = ctx->ancestor;
s->last_id = ctx->last_id;
s->last_size = ctx->last_size;
s->last_valid = ctx->last_valid;
return 0;
}
@ -822,6 +839,7 @@ ne_ctx_restore(nestegg * ctx, struct saved_state * s)
ctx->ancestor = s->ancestor;
ctx->last_id = s->last_id;
ctx->last_size = s->last_size;
ctx->last_valid = s->last_valid;
return 0;
}
@ -830,7 +848,7 @@ ne_peek_element(nestegg * ctx, uint64_t * id, uint64_t * size)
{
int r;
if (ctx->last_id && ctx->last_size) {
if (ctx->last_valid) {
if (id)
*id = ctx->last_id;
if (size)
@ -851,6 +869,8 @@ ne_peek_element(nestegg * ctx, uint64_t * id, uint64_t * size)
if (size)
*size = ctx->last_size;
ctx->last_valid = 1;
return 1;
}
@ -863,8 +883,7 @@ ne_read_element(nestegg * ctx, uint64_t * id, uint64_t * size)
if (r != 1)
return r;
ctx->last_id = 0;
ctx->last_size = 0;
ctx->last_valid = 0;
return 1;
}
@ -915,7 +934,7 @@ static int
ne_read_simple(nestegg * ctx, struct ebml_element_desc * desc, size_t length)
{
struct ebml_type * storage;
int r;
int r = 0;
storage = (struct ebml_type *) (ctx->ancestor->data + desc->offset);
@ -930,8 +949,6 @@ ne_read_simple(nestegg * ctx, struct ebml_element_desc * desc, size_t length)
ctx->log(ctx, NESTEGG_LOG_DEBUG, "element %llx (%s) -> %p (%u)",
desc->id, desc->name, storage, desc->offset);
r = -1;
switch (desc->type) {
case TYPE_UINT:
r = ne_read_uint(ctx->io, &storage->v.u, length);
@ -961,29 +978,26 @@ ne_read_simple(nestegg * ctx, struct ebml_element_desc * desc, size_t length)
}
static int
ne_parse(nestegg * ctx, struct ebml_element_desc * top_level)
ne_parse(nestegg * ctx, struct ebml_element_desc * top_level, int64_t max_offset)
{
int r;
int64_t * data_offset;
uint64_t id, size;
uint64_t id, size, peeked_id;
struct ebml_element_desc * element;
/* loop until we need to return:
- hit suspend point
- parse complete
- error occurred */
/* loop over elements at current level reading them if sublevel found,
push ctx onto stack and continue if sublevel ended, pop ctx off stack
and continue */
if (!ctx->ancestor)
return -1;
for (;;) {
if (max_offset > 0 && ne_io_tell(ctx->io) >= max_offset) {
/* Reached end of offset allowed for parsing - return gracefully */
r = 1;
break;
}
r = ne_peek_element(ctx, &id, &size);
if (r != 1)
break;
peeked_id = id;
element = ne_find_element(id, ctx->ancestor->node);
if (element) {
@ -997,6 +1011,7 @@ ne_parse(nestegg * ctx, struct ebml_element_desc * top_level)
r = ne_read_element(ctx, &id, &size);
if (r != 1)
break;
assert(id == peeked_id);
if (element->flags & DESC_FLAG_OFFSET) {
data_offset = (int64_t *) (ctx->ancestor->data + element->data_offset);
@ -1106,7 +1121,7 @@ ne_read_xiph_lacing(nestegg_io * io, size_t block, size_t * read, uint64_t n, ui
if (*read + sum > block)
return -1;
/* last frame is the remainder of the block */
/* Last frame is the remainder of the block. */
sizes[i] = block - *read - sum;
return 1;
}
@ -1143,7 +1158,7 @@ ne_read_ebml_lacing(nestegg_io * io, size_t block, size_t * read, uint64_t n, ui
if (*read + sum > block)
return -1;
/* last frame is the remainder of the block */
/* Last frame is the remainder of the block. */
sizes[i] = block - *read - sum;
return 1;
}
@ -1159,6 +1174,37 @@ ne_get_timecode_scale(nestegg * ctx)
return scale;
}
static int
ne_map_track_number_to_index(nestegg * ctx,
unsigned int track_number,
unsigned int * track_index)
{
struct ebml_list_node * node;
struct track_entry * t_entry;
uint64_t t_number = 0;
if (!track_index)
return -1;
*track_index = 0;
if (track_number == 0)
return -1;
node = ctx->segment.tracks.track_entry.head;
while (node) {
assert(node->id == ID_TRACK_ENTRY);
t_entry = node->data;
if (ne_get_uint(t_entry->number, &t_number) != 0)
return -1;
if (t_number == track_number)
return 0;
*track_index += 1;
node = node->next;
}
return -1;
}
static struct track_entry *
ne_find_track_entry(nestegg * ctx, unsigned int track)
{
@ -1187,8 +1233,8 @@ ne_read_block(nestegg * ctx, uint64_t block_id, uint64_t block_size, nestegg_pac
struct frame * f, * last;
struct track_entry * entry;
double track_scale;
uint64_t track, length, frame_sizes[256], cluster_tc, flags, frames, tc_scale, total;
unsigned int i, lacing;
uint64_t track_number, length, frame_sizes[256], cluster_tc, flags, frames, tc_scale, total;
unsigned int i, lacing, track;
size_t consumed = 0;
*data = NULL;
@ -1196,11 +1242,11 @@ ne_read_block(nestegg * ctx, uint64_t block_id, uint64_t block_size, nestegg_pac
if (block_size > LIMIT_BLOCK)
return -1;
r = ne_read_vint(ctx->io, &track, &length);
r = ne_read_vint(ctx->io, &track_number, &length);
if (r != 1)
return r;
if (track == 0 || track > ctx->track_count)
if (track_number == 0)
return -1;
consumed += length;
@ -1219,8 +1265,8 @@ ne_read_block(nestegg * ctx, uint64_t block_id, uint64_t block_size, nestegg_pac
frames = 0;
/* flags are different between block and simpleblock, but lacing is
encoded the same way */
/* Flags are different between Block and SimpleBlock, but lacing is
encoded the same way. */
lacing = (flags & BLOCK_FLAGS_LACING) >> 1;
switch (lacing) {
@ -1266,14 +1312,17 @@ ne_read_block(nestegg * ctx, uint64_t block_id, uint64_t block_size, nestegg_pac
break;
}
/* sanity check unlaced frame sizes against total block size. */
/* Sanity check unlaced frame sizes against total block size. */
total = consumed;
for (i = 0; i < frames; ++i)
total += frame_sizes[i];
if (total > block_size)
return -1;
entry = ne_find_track_entry(ctx, (unsigned int)(track - 1));
if (ne_map_track_number_to_index(ctx, track_number, &track) != 0)
return -1;
entry = ne_find_track_entry(ctx, track);
if (!entry)
return -1;
@ -1291,8 +1340,8 @@ ne_read_block(nestegg * ctx, uint64_t block_id, uint64_t block_size, nestegg_pac
return -1;
pkt = ne_alloc(sizeof(*pkt));
pkt->track = track - 1;
pkt->timecode = (uint64_t)(abs_timecode * tc_scale * track_scale);
pkt->track = track;
pkt->timecode = abs_timecode * tc_scale * track_scale;
ctx->log(ctx, NESTEGG_LOG_DEBUG, "%sblock t %lld pts %f f %llx frames: %llu",
block_id == ID_BLOCK ? "" : "simple", pkt->track, pkt->timecode / 1e9, flags, frames);
@ -1326,6 +1375,35 @@ ne_read_block(nestegg * ctx, uint64_t block_id, uint64_t block_size, nestegg_pac
return 1;
}
static int
ne_read_discard_padding(nestegg * ctx, nestegg_packet * pkt)
{
int r;
uint64_t id, size;
struct ebml_element_desc * element;
struct ebml_type * storage;
r = ne_peek_element(ctx, &id, &size);
if (r != 1)
return r;
if (id != ID_DISCARD_PADDING)
return 1;
element = ne_find_element(id, ctx->ancestor->node);
if (!element)
return 1;
r = ne_read_simple(ctx, element, size);
if (r != 1)
return r;
storage = (struct ebml_type *) (ctx->ancestor->data + element->offset);
pkt->discard_padding = storage->v.i;
return 1;
}
static uint64_t
ne_buf_read_id(unsigned char const * p, size_t length)
{
@ -1369,8 +1447,33 @@ ne_find_seek_for_id(struct ebml_list_node * seek_head, uint64_t id)
return NULL;
}
static struct cue_track_positions *
ne_find_cue_position_for_track(nestegg * ctx, struct ebml_list_node * node, unsigned int track)
{
struct cue_track_positions * pos = NULL;
uint64_t track_number;
unsigned int t;
while (node) {
assert(node->id == ID_CUE_TRACK_POSITIONS);
pos = node->data;
if (ne_get_uint(pos->track, &track_number) != 0)
return NULL;
if (ne_map_track_number_to_index(ctx, track_number, &t) != 0)
return NULL;
if (t == track)
return pos;
node = node->next;
}
return NULL;
}
static struct cue_point *
ne_find_cue_point_for_tstamp(struct ebml_list_node * cue_point, uint64_t scale, uint64_t tstamp)
ne_find_cue_point_for_tstamp(nestegg * ctx, struct ebml_list_node * cue_point, unsigned int track, uint64_t scale, uint64_t tstamp)
{
uint64_t time;
struct cue_point * c, * prev = NULL;
@ -1385,7 +1488,9 @@ ne_find_cue_point_for_tstamp(struct ebml_list_node * cue_point, uint64_t scale,
if (ne_get_uint(c->time, &time) == 0 && time * scale > tstamp)
break;
prev = cue_point->data;
if (ne_find_cue_position_for_track(ctx, c->cue_track_positions.head, track) != NULL)
prev = c;
cue_point = cue_point->next;
}
@ -1395,7 +1500,6 @@ ne_find_cue_point_for_tstamp(struct ebml_list_node * cue_point, uint64_t scale,
static int
ne_is_suspend_element(uint64_t id)
{
/* this could search the tree of elements for DESC_FLAG_SUSPEND */
if (id == ID_SIMPLE_BLOCK || id == ID_BLOCK)
return 1;
return 0;
@ -1408,14 +1512,180 @@ ne_null_log_callback(nestegg * ctx, unsigned int severity, char const * fmt, ...
return;
}
static int
ne_init_cue_points(nestegg * ctx, int64_t max_offset)
{
int r;
struct ebml_list_node * node = ctx->segment.cues.cue_point.head;
struct seek * found;
uint64_t seek_pos, id;
struct saved_state state;
/* If there are no cues loaded, check for cues element in the seek head
and load it. */
if (!node) {
found = ne_find_seek_for_id(ctx->segment.seek_head.head, ID_CUES);
if (!found)
return -1;
if (ne_get_uint(found->position, &seek_pos) != 0)
return -1;
/* Save old parser state. */
r = ne_ctx_save(ctx, &state);
if (r != 0)
return -1;
/* Seek and set up parser state for segment-level element (Cues). */
r = ne_io_seek(ctx->io, ctx->segment_offset + seek_pos, NESTEGG_SEEK_SET);
if (r != 0)
return -1;
ctx->last_valid = 0;
r = ne_read_element(ctx, &id, NULL);
if (r != 1)
return -1;
if (id != ID_CUES)
return -1;
ctx->ancestor = NULL;
ne_ctx_push(ctx, ne_top_level_elements, ctx);
ne_ctx_push(ctx, ne_segment_elements, &ctx->segment);
ne_ctx_push(ctx, ne_cues_elements, &ctx->segment.cues);
/* parser will run until end of cues element. */
ctx->log(ctx, NESTEGG_LOG_DEBUG, "seek: parsing cue elements");
r = ne_parse(ctx, ne_cues_elements, max_offset);
while (ctx->ancestor)
ne_ctx_pop(ctx);
/* Reset parser state to original state and seek back to old position. */
if (ne_ctx_restore(ctx, &state) != 0)
return -1;
if (r < 0)
return -1;
node = ctx->segment.cues.cue_point.head;
if (!node)
return -1;
}
return 0;
}
/* Three functions that implement the nestegg_io interface, operating on a
* sniff_buffer. */
struct sniff_buffer {
unsigned char const * buffer;
size_t length;
int64_t offset;
};
static int
ne_buffer_read(void * buffer, size_t length, void * user_data)
{
struct sniff_buffer * sb = user_data;
int rv = 1;
size_t available = sb->length - sb->offset;
if (available < length)
return 0;
memcpy(buffer, sb->buffer + sb->offset, length);
sb->offset += length;
return rv;
}
static int
ne_buffer_seek(int64_t offset, int whence, void * user_data)
{
struct sniff_buffer * sb = user_data;
int64_t o = sb->offset;
switch(whence) {
case NESTEGG_SEEK_SET:
o = offset;
break;
case NESTEGG_SEEK_CUR:
o += offset;
break;
case NESTEGG_SEEK_END:
o = sb->length + offset;
break;
}
if (o < 0 || o > (int64_t) sb->length)
return -1;
sb->offset = o;
return 0;
}
static int64_t
ne_buffer_tell(void * user_data)
{
struct sniff_buffer * sb = user_data;
return sb->offset;
}
static int
ne_match_webm(nestegg_io io, int64_t max_offset)
{
int r;
uint64_t id;
char * doctype;
nestegg * ctx;
if (!(io.read && io.seek && io.tell))
return -1;
ctx = ne_alloc(sizeof(*ctx));
ctx->io = ne_alloc(sizeof(*ctx->io));
*ctx->io = io;
ctx->alloc_pool = ne_pool_init();
ctx->log = ne_null_log_callback;
r = ne_peek_element(ctx, &id, NULL);
if (r != 1) {
nestegg_destroy(ctx);
return 0;
}
if (id != ID_EBML) {
nestegg_destroy(ctx);
return 0;
}
ne_ctx_push(ctx, ne_top_level_elements, ctx);
/* we don't check the return value of ne_parse, that might fail because
* max_offset is not on a valid element end point. We only want to check
* the EBML ID and that the doctype is "webm". */
ne_parse(ctx, NULL, max_offset);
if (ne_get_string(ctx->ebml.doctype, &doctype) != 0 ||
strcmp(doctype, "webm") != 0) {
nestegg_destroy(ctx);
return 0;
}
nestegg_destroy(ctx);
return 1;
}
int
nestegg_init(nestegg ** context, nestegg_io io, nestegg_log callback)
nestegg_init(nestegg ** context, nestegg_io io, nestegg_log callback, int64_t max_offset)
{
int r;
uint64_t id, version, docversion;
struct ebml_list_node * track;
char * doctype;
nestegg * ctx = NULL;
nestegg * ctx;
if (!(io.read && io.seek && io.tell))
return -1;
@ -1445,7 +1715,7 @@ nestegg_init(nestegg ** context, nestegg_io io, nestegg_log callback)
ne_ctx_push(ctx, ne_top_level_elements, ctx);
r = ne_parse(ctx, NULL);
r = ne_parse(ctx, NULL, max_offset);
if (r != 1) {
nestegg_destroy(ctx);
@ -1530,99 +1800,131 @@ nestegg_track_count(nestegg * ctx, unsigned int * tracks)
return 0;
}
int
nestegg_get_cue_point(nestegg * ctx, unsigned int cluster_num, int64_t max_offset,
int64_t * start_pos, int64_t * end_pos, uint64_t * tstamp)
{
int range_obtained = 0;
unsigned int cluster_count = 0;
struct cue_point * cue_point;
struct cue_track_positions * pos;
uint64_t seek_pos, track_number, tc_scale, time;
struct ebml_list_node * cues_node = ctx->segment.cues.cue_point.head;
struct ebml_list_node * cue_pos_node = NULL;
unsigned int track = 0, track_count = 0, track_index;
if (!start_pos || !end_pos || !tstamp)
return -1;
/* Initialise return values */
*start_pos = -1;
*end_pos = -1;
*tstamp = 0;
if (!cues_node) {
ne_init_cue_points(ctx, max_offset);
cues_node = ctx->segment.cues.cue_point.head;
/* Verify cues have been added to context. */
if (!cues_node)
return -1;
}
nestegg_track_count(ctx, &track_count);
tc_scale = ne_get_timecode_scale(ctx);
while (cues_node && !range_obtained) {
assert(cues_node->id == ID_CUE_POINT);
cue_point = cues_node->data;
cue_pos_node = cue_point->cue_track_positions.head;
while (cue_pos_node) {
assert(cue_pos_node->id == ID_CUE_TRACK_POSITIONS);
pos = cue_pos_node->data;
for (track = 0; track < track_count; track++) {
if (ne_get_uint(pos->track, &track_number) != 0)
return -1;
if (ne_map_track_number_to_index(ctx, track_number, &track_index) != 0)
return -1;
if (track_index == track) {
if (ne_get_uint(pos->cluster_position, &seek_pos) != 0)
return -1;
if (cluster_count == cluster_num) {
*start_pos = ctx->segment_offset+seek_pos;
if (ne_get_uint(cue_point->time, &time) != 0)
return -1;
*tstamp = time * tc_scale;
} else if (cluster_count == cluster_num+1) {
*end_pos = (ctx->segment_offset+seek_pos)-1;
range_obtained = 1;
break;
}
cluster_count++;
}
}
cue_pos_node = cue_pos_node->next;
}
cues_node = cues_node->next;
}
return 0;
}
int
nestegg_offset_seek(nestegg * ctx, uint64_t offset)
{
int r;
/* Seek and set up parser state for segment-level element (Cluster). */
r = ne_io_seek(ctx->io, offset, NESTEGG_SEEK_SET);
if (r != 0)
return -1;
ctx->last_valid = 0;
while (ctx->ancestor)
ne_ctx_pop(ctx);
ne_ctx_push(ctx, ne_top_level_elements, ctx);
ne_ctx_push(ctx, ne_segment_elements, &ctx->segment);
return 0;
}
int
nestegg_track_seek(nestegg * ctx, unsigned int track, uint64_t tstamp)
{
int r;
struct cue_point * cue_point;
struct cue_track_positions * pos;
struct saved_state state;
struct seek * found;
uint64_t seek_pos, tc_scale, t, id;
struct ebml_list_node * node = ctx->segment.cues.cue_point.head;
uint64_t seek_pos, tc_scale;
/* If there are no cues loaded, check for cues element in the seek head
and load it. */
if (!node) {
found = ne_find_seek_for_id(ctx->segment.seek_head.head, ID_CUES);
if (!found)
return -1;
if (ne_get_uint(found->position, &seek_pos) != 0)
return -1;
/* Save old parser state. */
r = ne_ctx_save(ctx, &state);
if (!ctx->segment.cues.cue_point.head) {
r = ne_init_cue_points(ctx, -1);
if (r != 0)
return -1;
/* Seek and set up parser state for segment-level element (Cues). */
r = ne_io_seek(ctx->io, ctx->segment_offset + seek_pos, NESTEGG_SEEK_SET);
if (r != 0)
return -1;
ctx->last_id = 0;
ctx->last_size = 0;
r = ne_read_element(ctx, &id, NULL);
if (r != 1)
return -1;
if (id != ID_CUES)
return -1;
ctx->ancestor = NULL;
ne_ctx_push(ctx, ne_top_level_elements, ctx);
ne_ctx_push(ctx, ne_segment_elements, &ctx->segment);
ne_ctx_push(ctx, ne_cues_elements, &ctx->segment.cues);
/* parser will run until end of cues element. */
ctx->log(ctx, NESTEGG_LOG_DEBUG, "seek: parsing cue elements");
r = ne_parse(ctx, ne_cues_elements);
while (ctx->ancestor)
ne_ctx_pop(ctx);
/* Reset parser state to original state and seek back to old position. */
if (ne_ctx_restore(ctx, &state) != 0)
return -1;
if (r < 0)
return -1;
}
tc_scale = ne_get_timecode_scale(ctx);
cue_point = ne_find_cue_point_for_tstamp(ctx->segment.cues.cue_point.head, tc_scale, tstamp);
cue_point = ne_find_cue_point_for_tstamp(ctx, ctx->segment.cues.cue_point.head,
track, tc_scale, tstamp);
if (!cue_point)
return -1;
node = cue_point->cue_track_positions.head;
pos = ne_find_cue_position_for_track(ctx, cue_point->cue_track_positions.head, track);
if (pos == NULL)
return -1;
seek_pos = 0;
while (node) {
assert(node->id == ID_CUE_TRACK_POSITIONS);
pos = node->data;
if (ne_get_uint(pos->track, &t) == 0 && t - 1 == track) {
if (ne_get_uint(pos->cluster_position, &seek_pos) != 0)
return -1;
break;
}
node = node->next;
}
/* Seek and set up parser state for segment-level element (Cluster). */
r = ne_io_seek(ctx->io, ctx->segment_offset + seek_pos, NESTEGG_SEEK_SET);
if (r != 0)
return -1;
ctx->last_id = 0;
ctx->last_size = 0;
while (ctx->ancestor)
ne_ctx_pop(ctx);
ne_ctx_push(ctx, ne_top_level_elements, ctx);
ne_ctx_push(ctx, ne_segment_elements, &ctx->segment);
r = nestegg_offset_seek(ctx, ctx->segment_offset + seek_pos);
ctx->log(ctx, NESTEGG_LOG_DEBUG, "seek: parsing cluster elements");
r = ne_parse(ctx, NULL);
r = ne_parse(ctx, NULL, -1);
if (r != 1)
return -1;
@ -1676,6 +1978,9 @@ nestegg_track_codec_id(nestegg * ctx, unsigned int track)
if (strcmp(codec_id, TRACK_ID_VORBIS) == 0)
return NESTEGG_CODEC_VORBIS;
if (strcmp(codec_id, TRACK_ID_OPUS) == 0)
return NESTEGG_CODEC_OPUS;
return -1;
}
@ -1728,12 +2033,14 @@ nestegg_track_codec_data(nestegg * ctx, unsigned int track, unsigned int item,
if (!entry)
return -1;
if (nestegg_track_codec_id(ctx, track) != NESTEGG_CODEC_VORBIS)
if (nestegg_track_codec_id(ctx, track) != NESTEGG_CODEC_VORBIS
&& nestegg_track_codec_id(ctx, track) != NESTEGG_CODEC_OPUS)
return -1;
if (ne_get_binary(entry->codec_private, &codec_private) != 0)
return -1;
if (nestegg_track_codec_id(ctx, track) == NESTEGG_CODEC_VORBIS) {
p = codec_private.data;
count = *p++ + 1;
@ -1756,6 +2063,10 @@ nestegg_track_codec_data(nestegg * ctx, unsigned int track, unsigned int item,
}
*data = p;
*length = sizes[item];
} else {
*data = codec_private.data;
*length = codec_private.length;
}
return 0;
}
@ -1776,37 +2087,43 @@ nestegg_track_video_params(nestegg * ctx, unsigned int track,
if (nestegg_track_type(ctx, track) != NESTEGG_TRACK_VIDEO)
return -1;
value = 0;
ne_get_uint(entry->video.stereo_mode, &value);
if (value <= NESTEGG_VIDEO_STEREO_TOP_BOTTOM ||
value == NESTEGG_VIDEO_STEREO_RIGHT_LEFT)
params->stereo_mode = value;
if (ne_get_uint(entry->video.pixel_width, &value) != 0)
return -1;
params->width = (unsigned int)value;
params->width = value;
if (ne_get_uint(entry->video.pixel_height, &value) != 0)
return -1;
params->height = (unsigned int)value;
params->height = value;
value = 0;
ne_get_uint(entry->video.pixel_crop_bottom, &value);
params->crop_bottom = (unsigned int)value;
params->crop_bottom = value;
value = 0;
ne_get_uint(entry->video.pixel_crop_top, &value);
params->crop_top = (unsigned int)value;
params->crop_top = value;
value = 0;
ne_get_uint(entry->video.pixel_crop_left, &value);
params->crop_left = (unsigned int)value;
params->crop_left = value;
value = 0;
ne_get_uint(entry->video.pixel_crop_right, &value);
params->crop_right = (unsigned int)value;
params->crop_right = value;
value = params->width;
ne_get_uint(entry->video.display_width, &value);
params->display_width = (unsigned int)value;
params->display_width = value;
value = params->height;
ne_get_uint(entry->video.display_height, &value);
params->display_height = (unsigned int)value;
params->display_height = value;
return 0;
}
@ -1832,11 +2149,19 @@ nestegg_track_audio_params(nestegg * ctx, unsigned int track,
value = 1;
ne_get_uint(entry->audio.channels, &value);
params->channels = (unsigned int)value;
params->channels = value;
value = 16;
ne_get_uint(entry->audio.bit_depth, &value);
params->depth = (unsigned int)value;
params->depth = value;
value = 0;
ne_get_uint(entry->codec_delay, &value);
params->codec_delay = value;
value = 0;
ne_get_uint(entry->seek_preroll, &value);
params->seek_preroll = value;
return 0;
}
@ -1854,19 +2179,26 @@ nestegg_read_packet(nestegg * ctx, nestegg_packet ** pkt)
if (r != 1)
return r;
/* any suspend fields must be handled here */
/* Any DESC_FLAG_SUSPEND fields must be handled here. */
if (ne_is_suspend_element(id)) {
r = ne_read_element(ctx, &id, &size);
if (r != 1)
return r;
/* the only suspend fields are blocks and simple blocks, which we
/* The only DESC_FLAG_SUSPEND fields are Blocks and SimpleBlocks, which we
handle directly. */
r = ne_read_block(ctx, id, size, pkt);
if (r != 1)
return r;
r = ne_read_discard_padding(ctx, *pkt);
if (r != 1)
return r;
return r;
}
r = ne_parse(ctx, NULL);
r = ne_parse(ctx, NULL, -1);
if (r != 1)
return r;
}
@ -1892,7 +2224,7 @@ nestegg_free_packet(nestegg_packet * pkt)
int
nestegg_packet_track(nestegg_packet * pkt, unsigned int * track)
{
*track = (unsigned int)pkt->track;
*track = pkt->track;
return 0;
}
@ -1903,6 +2235,13 @@ nestegg_packet_tstamp(nestegg_packet * pkt, uint64_t * tstamp)
return 0;
}
int
nestegg_packet_discard_padding(nestegg_packet * pkt, int64_t * discard_padding)
{
*discard_padding = pkt->discard_padding;
return 0;
}
int
nestegg_packet_count(nestegg_packet * pkt, unsigned int * count)
{
@ -1940,3 +2279,28 @@ nestegg_packet_data(nestegg_packet * pkt, unsigned int item,
return -1;
}
int
nestegg_has_cues(nestegg * ctx)
{
return ctx->segment.cues.cue_point.head ||
ne_find_seek_for_id(ctx->segment.seek_head.head, ID_CUES);
}
int
nestegg_sniff(unsigned char const * buffer, size_t length)
{
nestegg_io io;
struct sniff_buffer user_data;
user_data.buffer = buffer;
user_data.length = length;
user_data.offset = 0;
io.read = ne_buffer_read;
io.seek = ne_buffer_seek;
io.tell = ne_buffer_tell;
io.userdata = &user_data;
return ne_match_webm(io, length);
}

View File

@ -15,9 +15,10 @@
#define SEEK_TEST
static int
stdio_read(void * p, size_t length, void * fp)
stdio_read(void * p, size_t length, void * file)
{
size_t r;
FILE * fp = file;
r = fread(p, length, 1, fp);
if (r == 0 && feof(fp))
@ -26,8 +27,9 @@ stdio_read(void * p, size_t length, void * fp)
}
static int
stdio_seek(int64_t offset, int whence, void * fp)
stdio_seek(int64_t offset, int whence, void * file)
{
FILE * fp = file;
return fseek(fp, offset, whence);
}
@ -43,7 +45,7 @@ log_callback(nestegg * ctx, unsigned int severity, char const * fmt, ...)
va_list ap;
char const * sev = NULL;
#ifndef DEBUG
#if !defined(DEBUG)
if (severity < NESTEGG_LOG_WARNING)
return;
#endif
@ -102,32 +104,32 @@ main(int argc, char * argv[])
io.userdata = fp;
ctx = NULL;
r = nestegg_init(&ctx, io, log_callback);
r = nestegg_init(&ctx, io, log_callback, -1);
if (r != 0)
return EXIT_FAILURE;
nestegg_track_count(ctx, &tracks);
nestegg_duration(ctx, &duration);
#ifdef DEBUG
#if defined(DEBUG)
fprintf(stderr, "media has %u tracks and duration %fs\n", tracks, duration / 1e9);
#endif
for (i = 0; i < tracks; ++i) {
type = nestegg_track_type(ctx, i);
#ifdef DEBUG
#if defined(DEBUG)
fprintf(stderr, "track %u: type: %d codec: %d", i,
type, nestegg_track_codec_id(ctx, i));
#endif
nestegg_track_codec_data_count(ctx, i, &data_items);
for (j = 0; j < data_items; ++j) {
nestegg_track_codec_data(ctx, i, j, &codec_data, &length);
#ifdef DEBUG
#if defined(DEBUG)
fprintf(stderr, " (%p, %u)", codec_data, (unsigned int) length);
#endif
}
if (type == NESTEGG_TRACK_VIDEO) {
nestegg_track_video_params(ctx, i, &vparams);
#ifdef DEBUG
#if defined(DEBUG)
fprintf(stderr, " video: %ux%u (d: %ux%u %ux%ux%ux%u)",
vparams.width, vparams.height,
vparams.display_width, vparams.display_height,
@ -135,23 +137,23 @@ main(int argc, char * argv[])
#endif
} else if (type == NESTEGG_TRACK_AUDIO) {
nestegg_track_audio_params(ctx, i, &aparams);
#ifdef DEBUG
#if defined(DEBUG)
fprintf(stderr, " audio: %.2fhz %u bit %u channels",
aparams.rate, aparams.depth, aparams.channels);
#endif
}
#ifdef DEBUG
#if defined(DEBUG)
fprintf(stderr, "\n");
#endif
}
#ifdef SEEK_TEST
#ifdef DEBUG
#if defined(SEEK_TEST)
#if defined(DEBUG)
fprintf(stderr, "seek to middle\n");
#endif
r = nestegg_track_seek(ctx, 0, duration / 2);
if (r == 0) {
#ifdef DEBUG
#if defined(DEBUG)
fprintf(stderr, "middle ");
#endif
r = nestegg_read_packet(ctx, &pkt);
@ -159,23 +161,23 @@ main(int argc, char * argv[])
nestegg_packet_track(pkt, &track);
nestegg_packet_count(pkt, &cnt);
nestegg_packet_tstamp(pkt, &tstamp);
#ifdef DEBUG
#if defined(DEBUG)
fprintf(stderr, "* t %u pts %f frames %u\n", track, tstamp / 1e9, cnt);
#endif
nestegg_free_packet(pkt);
} else {
#ifdef DEBUG
#if defined(DEBUG)
fprintf(stderr, "middle seek failed\n");
#endif
}
}
#ifdef DEBUG
#if defined(DEBUG)
fprintf(stderr, "seek to ~end\n");
#endif
r = nestegg_track_seek(ctx, 0, duration - (duration / 10));
if (r == 0) {
#ifdef DEBUG
#if defined(DEBUG)
fprintf(stderr, "end ");
#endif
r = nestegg_read_packet(ctx, &pkt);
@ -183,23 +185,23 @@ main(int argc, char * argv[])
nestegg_packet_track(pkt, &track);
nestegg_packet_count(pkt, &cnt);
nestegg_packet_tstamp(pkt, &tstamp);
#ifdef DEBUG
#if defined(DEBUG)
fprintf(stderr, "* t %u pts %f frames %u\n", track, tstamp / 1e9, cnt);
#endif
nestegg_free_packet(pkt);
} else {
#ifdef DEBUG
#if defined(DEBUG)
fprintf(stderr, "end seek failed\n");
#endif
}
}
#ifdef DEBUG
#if defined(DEBUG)
fprintf(stderr, "seek to ~start\n");
#endif
r = nestegg_track_seek(ctx, 0, duration / 10);
if (r == 0) {
#ifdef DEBUG
#if defined(DEBUG)
fprintf(stderr, "start ");
#endif
r = nestegg_read_packet(ctx, &pkt);
@ -207,12 +209,12 @@ main(int argc, char * argv[])
nestegg_packet_track(pkt, &track);
nestegg_packet_count(pkt, &cnt);
nestegg_packet_tstamp(pkt, &tstamp);
#ifdef DEBUG
#if defined(DEBUG)
fprintf(stderr, "* t %u pts %f frames %u\n", track, tstamp / 1e9, cnt);
#endif
nestegg_free_packet(pkt);
} else {
#ifdef DEBUG
#if defined(DEBUG)
fprintf(stderr, "start seek failed\n");
#endif
}
@ -224,17 +226,17 @@ main(int argc, char * argv[])
nestegg_packet_count(pkt, &pkt_cnt);
nestegg_packet_tstamp(pkt, &pkt_tstamp);
#ifdef DEBUG
#if defined(DEBUG)
fprintf(stderr, "t %u pts %f frames %u: ", pkt_track, pkt_tstamp / 1e9, pkt_cnt);
#endif
for (i = 0; i < pkt_cnt; ++i) {
nestegg_packet_data(pkt, i, &ptr, &size);
#ifdef DEBUG
#if defined(DEBUG)
fprintf(stderr, "%u ", (unsigned int) size);
#endif
}
#ifdef DEBUG
#if defined(DEBUG)
fprintf(stderr, "\n");
#endif

View File

@ -108,7 +108,7 @@ class WebMVideoSource : public CompressedVideoSource {
nestegg_io io = {nestegg_read_cb, nestegg_seek_cb, nestegg_tell_cb,
input_file_};
ASSERT_FALSE(nestegg_init(&nestegg_ctx_, io, NULL))
ASSERT_FALSE(nestegg_init(&nestegg_ctx_, io, NULL, -1))
<< "nestegg_init failed";
unsigned int n;

View File

@ -65,7 +65,7 @@ int file_is_webm(struct WebmInputContext *webm_ctx,
nestegg_video_params params;
io.userdata = vpx_ctx->file;
if (nestegg_init(&webm_ctx->nestegg_ctx, io, NULL))
if (nestegg_init(&webm_ctx->nestegg_ctx, io, NULL, -1))
goto fail;
if (nestegg_track_count(webm_ctx->nestegg_ctx, &n))