[xiph-commits] r8566 - in trunk/oggdsf: sln/oggdsf_all src/tools src/tools/mod_timeslice

ozone at motherfish-iii.xiph.org ozone at motherfish-iii.xiph.org
Fri Dec 31 09:40:26 PST 2004


Author: ozone
Date: 2004-12-31 09:40:25 -0800 (Fri, 31 Dec 2004)
New Revision: 8566

Added:
   trunk/oggdsf/src/tools/mod_timeslice/
   trunk/oggdsf/src/tools/mod_timeslice/README.txt
   trunk/oggdsf/src/tools/mod_timeslice/anx_time.c
   trunk/oggdsf/src/tools/mod_timeslice/anx_time.h
   trunk/oggdsf/src/tools/mod_timeslice/apr_stdcall.h
   trunk/oggdsf/src/tools/mod_timeslice/mod_timeslice.cpp
   trunk/oggdsf/src/tools/mod_timeslice/mod_timeslice.vcproj
Modified:
   trunk/oggdsf/sln/oggdsf_all/oggdsf_all.sln
Log:
oggdsf:
 * Added mod_timeslice Apache 2 module, to perform server-side seeking on Annodex files


Modified: trunk/oggdsf/sln/oggdsf_all/oggdsf_all.sln
===================================================================
--- trunk/oggdsf/sln/oggdsf_all/oggdsf_all.sln	2004-12-31 14:16:36 UTC (rev 8565)
+++ trunk/oggdsf/sln/oggdsf_all/oggdsf_all.sln	2004-12-31 17:40:25 UTC (rev 8566)
@@ -1107,8 +1107,16 @@
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CMMLDump", "..\..\src\tools\CMMLDump\CMMLDump.vcproj", "{3A7DAD80-4C79-48FB-B779-8CEA4EE9CF90}"
 	ProjectSection(ProjectDependencies) = postProject
 		{223ACC19-608E-4E1B-A054-067F0CACB272} = {223ACC19-608E-4E1B-A054-067F0CACB272}
+		{2DA569EC-3E22-4BC9-A242-C7A56EB9C6F4} = {2DA569EC-3E22-4BC9-A242-C7A56EB9C6F4}
 	EndProjectSection
 EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_timeslice", "..\..\src\tools\mod_timeslice\mod_timeslice.vcproj", "{F8FDD992-E21A-483F-BBE7-305D10163DE4}"
+	ProjectSection(ProjectDependencies) = postProject
+		{223ACC19-608E-4E1B-A054-067F0CACB272} = {223ACC19-608E-4E1B-A054-067F0CACB272}
+		{9A14F6AC-BC6E-401A-A300-07369BD6C5FE} = {9A14F6AC-BC6E-401A-A300-07369BD6C5FE}
+		{2DA569EC-3E22-4BC9-A242-C7A56EB9C6F4} = {2DA569EC-3E22-4BC9-A242-C7A56EB9C6F4}
+	EndProjectSection
+EndProject
 Global
 	GlobalSection(SolutionConfiguration) = preSolution
 		Debug = Debug
@@ -2398,6 +2406,26 @@
 		{3A7DAD80-4C79-48FB-B779-8CEA4EE9CF90}.Release_SSE.Build.0 = Release|Win32
 		{3A7DAD80-4C79-48FB-B779-8CEA4EE9CF90}.Release_SSE2.ActiveCfg = Release|Win32
 		{3A7DAD80-4C79-48FB-B779-8CEA4EE9CF90}.Release_SSE2.Build.0 = Release|Win32
+		{F8FDD992-E21A-483F-BBE7-305D10163DE4}.Debug.ActiveCfg = Debug|Win32
+		{F8FDD992-E21A-483F-BBE7-305D10163DE4}.Debug.Build.0 = Debug|Win32
+		{F8FDD992-E21A-483F-BBE7-305D10163DE4}.Debug Unicode.ActiveCfg = Debug|Win32
+		{F8FDD992-E21A-483F-BBE7-305D10163DE4}.Debug Unicode.Build.0 = Debug|Win32
+		{F8FDD992-E21A-483F-BBE7-305D10163DE4}.Debug__cdecl.ActiveCfg = Debug__cdecl|Win32
+		{F8FDD992-E21A-483F-BBE7-305D10163DE4}.Debug__cdecl.Build.0 = Debug__cdecl|Win32
+		{F8FDD992-E21A-483F-BBE7-305D10163DE4}.MakeFile.ActiveCfg = Debug__cdecl|Win32
+		{F8FDD992-E21A-483F-BBE7-305D10163DE4}.MakeFile.Build.0 = Debug__cdecl|Win32
+		{F8FDD992-E21A-483F-BBE7-305D10163DE4}.Release.ActiveCfg = Release|Win32
+		{F8FDD992-E21A-483F-BBE7-305D10163DE4}.Release.Build.0 = Release|Win32
+		{F8FDD992-E21A-483F-BBE7-305D10163DE4}.Release Unicode.ActiveCfg = Release|Win32
+		{F8FDD992-E21A-483F-BBE7-305D10163DE4}.Release Unicode.Build.0 = Release|Win32
+		{F8FDD992-E21A-483F-BBE7-305D10163DE4}.Release__cdecl.ActiveCfg = Release|Win32
+		{F8FDD992-E21A-483F-BBE7-305D10163DE4}.Release__cdecl.Build.0 = Release|Win32
+		{F8FDD992-E21A-483F-BBE7-305D10163DE4}.Release_NoDotNET.ActiveCfg = Release|Win32
+		{F8FDD992-E21A-483F-BBE7-305D10163DE4}.Release_NoDotNET.Build.0 = Release|Win32
+		{F8FDD992-E21A-483F-BBE7-305D10163DE4}.Release_SSE.ActiveCfg = Release|Win32
+		{F8FDD992-E21A-483F-BBE7-305D10163DE4}.Release_SSE.Build.0 = Release|Win32
+		{F8FDD992-E21A-483F-BBE7-305D10163DE4}.Release_SSE2.ActiveCfg = Release|Win32
+		{F8FDD992-E21A-483F-BBE7-305D10163DE4}.Release_SSE2.Build.0 = Release|Win32
 	EndGlobalSection
 	GlobalSection(SolutionItems) = postSolution
 	EndGlobalSection

Added: trunk/oggdsf/src/tools/mod_timeslice/README.txt
===================================================================
--- trunk/oggdsf/src/tools/mod_timeslice/README.txt	2004-12-31 14:16:36 UTC (rev 8565)
+++ trunk/oggdsf/src/tools/mod_timeslice/README.txt	2004-12-31 17:40:25 UTC (rev 8566)
@@ -0,0 +1,137 @@
+mod_timeslice
+=============
+
+mod_timeslice is an Apache 2 module which enables server-side seeking into
+media files via timed URIs.  Currently, if a media player client wishes to
+start playback of a multimedia file from an HTTP server at 15 seconds
+(i.e. seek to 15 seconds), it has two choices.  It can:
+
+    1.  Download the media file from the beginning, and simply wait until
+	15 seconds of data have been received.  This is what many media
+	players do.
+
+    2.  Perform a time to byte mapping if the media file format enables
+	this, and issue an HTTP/1.1 Range: request, so that the web server
+	starts serving the data at the byte specified.  This has the
+	disadvantage of being imprecise, and for accurate seeking, the
+	client generally has to perform a bisection search (such as
+	a binary search) over the network.
+
+With mod_timeslice, the client can ask the web server to play back
+a resource at a particular time point by using a timed URI.  As an
+example, to play back the media file http://example.com/foo.anx starting
+at 15 seconds, the client simply appends the timed URI query '?t=15', e.g.
+
+    http://www.example.com/foo.anx?t=15
+
+The web server is then responsible for delivering the data to the client
+at 15 seconds.  For more information on timed URIs, including various
+different time scheme formats, see
+<http://www.annodex.net/specifications.html>.
+
+Note that mod_timeslice is effectively a re-implementation of the timed
+URI capability of mod_annodex <http://www.annodex.net/installation.html>.
+mod_annodex is far more powerful, being able to dynamically generate
+Annodex media from CMML files, and serve out only the CMML portion of
+Annodex media.  These features will be added in the future, though
+possibly not to mod_timeslice itself.
+
+
+What Works
+----------
+
+* Currently, only Annodex media files are supported.  Support for Ogg
+  files will be forthcoming.
+
+* Only "simple" time queries are supported: i.e. integer-only, npt time
+  queries without the leading npt: time specification.  e.g. '?t=10' will
+  work, '?t=10.5' will not because we do not yet parse floating point
+  numbers, '?t=npt:10' will not work because of the leading npt:,
+  '?t=1:20' will not work since we do not yet parse MM:SS time formats.
+  Of course we will support the whole timed URI specification in the
+  future; consider this a cheap'n'cheerful implementation of the timed URI
+  specification for now.
+
+
+Requirements
+------------
+
+Windows:
+
+* The official Apache 2 Win32 binary provided as an MSI installer,
+  available at <http://httpd.apache.org/download.cgi>.  Apache 2.0.52 is
+  used for development.
+
+Note that this module has been tested to work on Linux systems, but
+I haven't packaged the build system for it yet (though it's a standard
+apxs2 module build).
+
+
+Building
+--------
+
+Windows:
+
+* Windows developers can simply open up the mod_timeslice.vcproj Visual
+  Studio project file and build that.  Note that the project file is
+  pre-configured to use the standard Apache 2 installation path of
+  C:\Program Files\Apache Group\Apache2, and of course requires the Apache
+  2 development libraries and headers to be installed.  If your Apache
+  2 installation path differs, edit the project properties and adjust them
+  accordingly.  (If you have ideas on how to make this easier for
+  non-standard installations, let me know.)
+
+There is no building instructions provided for UNIX yet.  One will be
+provided in the future.
+
+
+Installing
+----------
+
+* Add the "application/x-annodex" MIME type to your Apache's mime.types
+  file, for file extensions anx, axa and axv.
+
+* Edit your httpd.conf file to enable mod_timeslice by inserting the
+  following line:
+
+  LoadModule timeslice_module /path/to/mod_timeslice.so
+
+* Copy mod_timeslice.so (and mod_timeslice.pdb, if you want to use the
+  Visual Studio Debugger with Apache) to Apache's module directory,
+  usually at C:\Program Files\Apache Group\Apache2\modules.
+
+
+Copyright
+---------
+
+Copyright (C) 2004-2005, Zentaro Kavanagh
+Copyright (C) 2004-2005, Commonwealth Scientific and Industrial Research
+                         Organisation (CSIRO) Australia
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+
+    * Neither the name of Zentaro Kavanagh, CSIRO Australia nor the names
+of its contributors may be used to endorse or promote products derived
+from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+


Property changes on: trunk/oggdsf/src/tools/mod_timeslice/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: trunk/oggdsf/src/tools/mod_timeslice/anx_time.c
===================================================================
--- trunk/oggdsf/src/tools/mod_timeslice/anx_time.c	2004-12-31 14:16:36 UTC (rev 8565)
+++ trunk/oggdsf/src/tools/mod_timeslice/anx_time.c	2004-12-31 17:40:25 UTC (rev 8566)
@@ -0,0 +1,207 @@
+/*
+   Copyright (C) 2003 Commonwealth Scientific and Industrial Research
+   Organisation (CSIRO) Australia
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions
+   are met:
+
+   - Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+   - Neither the name of CSIRO Australia nor the names of its
+   contributors may be used to endorse or promote products derived from
+   this software without specific prior written permission.
+
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+   PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE ORGANISATION OR
+   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <stdio.h>
+#include <math.h>
+
+static double
+parse_npt (const char *str)
+{
+  int h=0,m=0, n;
+  float s;
+  double result;
+
+  n = sscanf (str, "%d:%d:%f",  &h, &m, &s);
+  if (n == 3) {
+    goto done;
+  }
+
+  n = sscanf (str, "%d:%f",  &m, &s);
+  if (n == 2) {
+    h = 0;
+    goto done;
+  }
+
+  n = sscanf (str, "%f", &s);
+  if (n == 1) {
+    h = 0; m = 0;
+    goto sec_only;
+  }
+
+  return -1.0;
+
+ done:
+
+  /* check valid time specs */
+  if (h < 0) return -1;
+  if (m > 59 || m < 0) return -1;
+  if (s >= 60.0 || s < 0) return -1;
+
+ sec_only:
+
+  result = ((h * 3600.0) + (m * 60.0) + s);
+
+  return result;
+}
+
+/* parse_smpte: parse a smpte-string */
+static double
+parse_smpte(const char *str, double framerate)
+{
+  int h = 0, m = 0, s = 0, n;
+  float frames;
+  double result;
+
+  n = sscanf (str, "%d:%d:%d:%f", &h, &m, &s, &frames);
+  if (n == 4) {
+    goto done;
+  }
+
+  n = sscanf (str, "%d:%d:%f", &m, &s, &frames);
+  if (n == 3) {
+    h = 0;
+    goto done;
+  }
+
+  return -1.0;
+
+ done:
+
+  /* check valid time specs */
+  if (h < 0) return -1;
+  if (m > 59 || m < 0) return -1;
+  if (s > 59 || s < 0) return -1;
+  if (frames > (float)ceil(framerate) || frames < 0) return -1;
+
+  result = ((h * 3600.0) + (m * 60.0) + s) + (frames/framerate);
+
+  return result;
+
+#if 0
+  char *p;
+  int maxframes;
+  maxframes = (int) ceil(framerate) - 1;
+
+  hours = strtol(s, &p, 10);
+  if (*p != ':' || !isdigit(*(p+1))) {
+    secs = hours;
+    hours = 0;
+    goto return_time;
+  }
+  p++;
+
+  mins = strtol(p, &p, 10);
+  if (*p != ':' || !isdigit(*(p+1))) {
+    secs = mins;
+    mins = hours;
+    hours = 0;
+    goto return_time;
+  }
+  p++;
+
+  secs = strtol(p, &p, 10);
+  if (*p != ':' || !isdigit(*(p+1))) {
+    goto return_time;
+  }
+
+  if (*p == ':') { 
+    frames = strtol(++p, &p, 10);
+  }
+
+ return_time:
+  if (*p == '.') {
+    subframes = strtol(++p, &p, 10);
+  }
+
+  /*
+  fprintf(stderr, "hours=%d min=%d sec=%d frames=%d subframes=%d\n", hours, mins
+, secs, frames, subframes);
+  */
+
+  /* check valid time specs */
+  if (hours<0) return -1;
+  if (mins>59 || mins<0) return -1;
+  if (secs>59 || secs<0) return -1;
+  if (frames>maxframes || frames<0) return -1;
+  if (subframes>99 || subframes<0) return -1;
+
+  return ( 1.0*hms_to_secs(hours, mins, secs)
+           + (1.0*frames/framerate)
+           + (1.0*subframes/(100.0*framerate)) );
+#endif
+}
+
+double
+anx_parse_time (const char * str)
+{
+  char timespec[16];
+
+  if (str == NULL) return -1.0;
+
+  if (sscanf (str, "npt:%16s", timespec) == 1) {
+    return parse_npt (timespec);
+  }
+
+  if (sscanf (str, "smpte-24:%16s", timespec) == 1) {
+    return parse_smpte (timespec, 24.0);
+  }
+  
+  if (sscanf (str, "smpte-24-drop:%16s", timespec) == 1) {
+    return parse_smpte (timespec, 23.976);
+  }
+  
+  if (sscanf (str, "smpte-25:%16s", timespec) == 1) {
+    return parse_smpte (timespec, 25.0);
+  }
+  
+  if (sscanf (str, "smpte-30:%16s", timespec) == 1) {
+    return parse_smpte (timespec, 30.0);
+  }
+  
+  if (sscanf (str, "smpte-30-drop:%16s", timespec) == 1) {
+    return parse_smpte (timespec, 29.97);
+  }
+  
+  if (sscanf (str, "smpte-50:%16s", timespec) == 1) {
+    return parse_smpte (timespec, 50.0);
+  }
+  
+  if (sscanf (str, "smpte-60:%16s", timespec) == 1) {
+    return parse_smpte (timespec, 60);
+  }
+
+  if (sscanf (str, "smpte-60-drop:%16s", timespec) == 1) {
+    return parse_smpte (timespec, 59.94);
+  }
+
+  return parse_npt(str);
+}


Property changes on: trunk/oggdsf/src/tools/mod_timeslice/anx_time.c
___________________________________________________________________
Name: svn:eol-style
   + native

Added: trunk/oggdsf/src/tools/mod_timeslice/anx_time.h
===================================================================
--- trunk/oggdsf/src/tools/mod_timeslice/anx_time.h	2004-12-31 14:16:36 UTC (rev 8565)
+++ trunk/oggdsf/src/tools/mod_timeslice/anx_time.h	2004-12-31 17:40:25 UTC (rev 8566)
@@ -0,0 +1,44 @@
+/*
+   Copyright (C) 2005 Commonwealth Scientific and Industrial Research
+   Organisation (CSIRO) Australia
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions
+   are met:
+
+   - Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+   - Neither the name of CSIRO Australia nor the names of its
+   contributors may be used to endorse or promote products derived from
+   this software without specific prior written permission.
+
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+   PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE ORGANISATION OR
+   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#pragma once
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+double anx_parse_time (const char * str);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif


Property changes on: trunk/oggdsf/src/tools/mod_timeslice/anx_time.h
___________________________________________________________________
Name: svn:eol-style
   + native

Added: trunk/oggdsf/src/tools/mod_timeslice/apr_stdcall.h
===================================================================
--- trunk/oggdsf/src/tools/mod_timeslice/apr_stdcall.h	2004-12-31 14:16:36 UTC (rev 8565)
+++ trunk/oggdsf/src/tools/mod_timeslice/apr_stdcall.h	2004-12-31 17:40:25 UTC (rev 8566)
@@ -0,0 +1,74 @@
+// ===========================================================================
+// Copyright (C) 2004-2005  Commonwealth Scientific and Industrial Research
+//                          Organisation (CSIRO) Australia
+// 
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 
+// - Redistributions of source code must retain the above copyright
+//   notice, this list of conditions and the following disclaimer.
+// 
+// - Redistributions in binary form must reproduce the above copyright
+//   notice, this list of conditions and the following disclaimer in the
+//   documentation and/or other materials provided with the distribution.
+// 
+// - Neither the name of Zentaro Kavanagh, CSIRO Australia nor the names of
+//   contributors may be used to endorse or promote products derived from
+//   this software without specific prior written permission.
+// 
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+// PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE ORGANISATION OR
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+// ===========================================================================
+
+#pragma once
+
+
+/* Apache expects its modules to use a __cdecl calling convention on Windows
+   but we link to many libraries which are __stdcall, so it's more convenient
+   for us to generate code defaulting to __stdcall.  This means, however, that
+   we need to declare any entry points into the module as __cdecl.  Thus, prefix
+   add the AP_MODULE_ENTRY_POINT macro below to any functions which Apache
+   is responsible for calling.
+ */
+
+#ifdef WIN32
+# define AP_MODULE_ENTRY_POINT __cdecl
+#else
+# define AP_MODULE_ENTRY_POINT
+#endif
+
+/* We also need to override the function typedefs in the Apache header files,
+   because the included Apache headers will think our functions are __stdcall,
+   rather than __cdecl, which is what they actually are.  So, we need to typecast
+   the function prototype into fooling the Apache headers that we're __stdcall.
+   Ouch.  Use the macros below to do this.
+ */
+   
+#ifdef WIN32
+# define AP_HOOK_HANDLER_FUNCTION(x) (ap_HOOK_handler_t (__stdcall *)) x
+#else
+# define AP_HOOK_HANDLER_FUNCTION(x) x
+#endif
+
+#ifdef WIN32
+# define AP_REGISTER_HOOK_FUNCTION(x) (void (__stdcall *)(apr_pool_t *)) x
+#else
+# define AP_REGISTER_HOOK_FUNCTION(x) x
+#endif
+
+/* One final note: remember to extern "C" any functions that are entry points
+   into the module, and also to append AP_MODULE_DECLARE_DATA after your
+   module declaration!  (See http://httpd.apache.org/docs-2.0/mod/mod_so.html
+   for more information about the latter.)
+ */
+

Added: trunk/oggdsf/src/tools/mod_timeslice/mod_timeslice.cpp
===================================================================
--- trunk/oggdsf/src/tools/mod_timeslice/mod_timeslice.cpp	2004-12-31 14:16:36 UTC (rev 8565)
+++ trunk/oggdsf/src/tools/mod_timeslice/mod_timeslice.cpp	2004-12-31 17:40:25 UTC (rev 8566)
@@ -0,0 +1,463 @@
+// ===========================================================================
+// Copyright (C) 2004-2005  Zentaro Kavanagh
+// Copyright (C) 2004-2005  Commonwealth Scientific and Industrial Research
+//                          Organisation (CSIRO) Australia
+// 
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 
+// - Redistributions of source code must retain the above copyright
+//   notice, this list of conditions and the following disclaimer.
+// 
+// - Redistributions in binary form must reproduce the above copyright
+//   notice, this list of conditions and the following disclaimer in the
+//   documentation and/or other materials provided with the distribution.
+// 
+// - Neither the name of Zentaro Kavanagh, CSIRO Australia nor the names of
+//   contributors may be used to endorse or promote products derived from
+//   this software without specific prior written permission.
+// 
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+// PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE ORGANISATION OR
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+// ===========================================================================
+
+#include "anx_time.h"
+#include "apr_stdcall.h"
+
+#include "httpd.h"
+#ifdef WIN32
+# undef strtoul /* Otherwise Visual Studio .NET 2003 complains */
+#endif
+#include "http_config.h"
+#include "http_core.h"
+#include "http_log.h"
+#include "http_protocol.h"
+#include "apr_strings.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#include <libOOOgg/libOOOgg.h>
+#include <libOOOgg/dllstuff.h>
+#include <libOOOggSeek/AutoAnxSeekTable.h>
+
+#include <iostream>
+#include <fstream>
+
+
+
+/* Note: This file's pretty ugly at the moment, it's basically a merge of the
+   mod_annodex_ap20 source code and AnxCutter.  Don't worry, it will be tidied
+   up :)
+ */
+
+#define DEBUG
+
+#define ANX_MIME_TYPE "application/x-annodex"
+#define CMML_MIME_TYPE "text/x-cmml"
+
+#define CMML_PREAMBLE \
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" \
+
+#define MOD_ANNODEX_TYPE_UNKNOWN -1
+
+#define MOD_ANNODEX_TYPE_ANX 0
+#define MOD_ANNODEX_TYPE_CMML 1
+
+#define MEDIA_BUF_LEN 8192
+
+
+/**
+ * Create a table corresponding to name=value pairs in the query string
+ * @param r The resource request
+ * @param query The query string
+ * @return A newly created table with corresponding name=value keys.
+ */
+static apr_table_t *
+make_cgi_table (request_rec * r, char * query)
+{
+  apr_table_t * t;
+  char * key, * val, * end;
+
+  t = apr_table_make (r->pool, 3);
+
+  if (!query) return t;
+
+  key = query;
+
+  do {
+    val = strchr (key, '=');
+    end = strchr (key, '&');
+
+    if (end) {
+      if (val) {
+        if (val < end) {
+          *val++ = '\0';
+        } else {
+          val = NULL;
+        }
+      }
+      *end++ = '\0';
+    } else {
+      if (val) *val++ = '\0';
+    }
+
+    /*ap_rprintf (r, "%s = %s\n", key, val);*/
+    apr_table_set (t, key, val);
+
+    key = end;
+
+  } while (end != NULL);
+
+  return t;
+}
+
+/**
+ * Determine the relative quality factor of a mime type given the Accept:
+ * header of a resource request, following rules of RFC2616 Sec. 14.1
+ * @param r The resource request
+ * @param content_type The content_type to check
+ * @return The relative quality factor
+ */
+static float
+get_accept_quality (request_rec * r, char * content_type)
+{
+  char * a, * accept, *next, * last, * pnext, * plast;
+  float q = 0.0, type_q = 0.0, all_q = 0.0;
+  char * m_sep, * m_major;
+  apr_size_t m_major_len;
+
+  a = (char *)apr_table_get (r->headers_in, (const char *)"Accept");
+
+  /* If there was no Accept: header, accept all types equally */
+  if (a == NULL) return 1.0;
+
+  /* Form a 'major/*' mime type range for later comparison */
+  m_sep = strchr (content_type, '/');
+  m_major_len = (apr_size_t)(m_sep - content_type);
+  m_major = apr_pstrndup (r->pool, content_type, m_major_len + 2);
+  *(m_major+m_major_len+1) = '*';
+  *(m_major+m_major_len+2) = '\0';
+
+  /* Copy the Accept line for tokenization */
+  accept = apr_pstrdup (r->pool, a);
+
+  apr_collapse_spaces (accept, accept);
+
+  next = apr_strtok (accept, ",", &last);
+  while (next) {
+    pnext = apr_strtok (next, ";", &plast);
+
+    if (!strcmp (pnext, content_type)) {
+      while (pnext) {
+	pnext = apr_strtok (NULL, ";", &plast);
+	if (pnext && sscanf (pnext, "q=%f", &q) == 1) {
+	  return q;
+	}
+      }
+      return 1.0;
+    } else if (!strcmp (pnext, "*/*")) {
+      while (pnext) {
+	pnext = apr_strtok (NULL, ";", &plast);
+	if (pnext && sscanf (pnext, "q=%f", &q) == 1) {
+	  all_q = q;
+	}
+      }
+      all_q = 1.0;
+    } else if (!strcmp (pnext, m_major)) {
+      while (pnext) {
+	pnext = apr_strtok (NULL, ";", &plast);
+	if (pnext && sscanf (pnext, "q=%f", &q) == 1) {
+	  type_q = q;
+	}
+      }
+      type_q = 1.0;
+    }
+    next = apr_strtok (NULL, ",", &last);
+  }
+
+  if (q > 0.0) return q;
+  else if (type_q > 0.0) return type_q;
+  else return all_q;
+}
+
+
+enum eDemuxState {
+	SEEN_NOTHING,
+	SEEN_ANNODEX_BOS,
+	SEEN_ANNODEX_EOS,
+	SEEN_ALL_CODEC_HEADERS,
+	INVALID = 100
+};
+
+eDemuxState demuxState;
+
+typedef pair<unsigned long, unsigned long> tSerial_HeadCountPair;
+
+unsigned long bytePos;
+
+bool gotAllHeaders;
+
+vector<tSerial_HeadCountPair> theStreams;
+
+unsigned long annodexSerialNo;
+
+using namespace std;
+
+unsigned long headerCount(OggPacket* inPacket)
+{
+  const unsigned short NUM_SEC_HEADERS_OFFSET = 24;
+
+  return iLE_Math::charArrToULong(inPacket->packetData() +
+                                  NUM_SEC_HEADERS_OFFSET);
+
+}
+
+request_rec *theRequest;
+
+bool writePageToOutputFile(OggPage* inOggPage) {
+  // outputFile.write((char*)inOggPage->createRawPageData(), inOggPage->pageSize());
+  ap_rwrite((char*)inOggPage->createRawPageData(),
+            inOggPage->pageSize(),
+	    theRequest);
+  return true;
+}
+
+//This will be called by the callback
+bool pageCB(OggPage* inOggPage, void *)
+{
+
+	bool allEmpty = true;
+
+	switch (demuxState) {
+
+		case SEEN_NOTHING:
+			if (		(inOggPage->numPackets() == 1)
+					&&	(inOggPage->header()->isBOS())
+					&&	(strncmp((char*)inOggPage->getPacket(0)->packetData(), "Annodex\0", 8) == 0)) {
+				
+				//Advance the state
+				demuxState = SEEN_ANNODEX_BOS;
+
+				//Remember the annodex streams serial no
+				annodexSerialNo = inOggPage->header()->StreamSerialNo();
+
+				//Write out the page.
+				writePageToOutputFile(inOggPage);
+			} else {
+
+				demuxState = INVALID;
+			}
+
+			break;
+		case SEEN_ANNODEX_BOS:
+			if (		(inOggPage->numPackets() == 1)
+					&&	(inOggPage->header()->isBOS())
+					&&	(strncmp((char*)inOggPage->getPacket(0)->packetData(), "AnxData\0", 8) == 0)) {
+				
+
+				//Create an association of serial no and num headers
+				tSerial_HeadCountPair locMap;
+				locMap.first = inOggPage->header()->StreamSerialNo();
+				locMap.second = headerCount(inOggPage->getPacket(0));
+				
+				//Add the association to the list
+				theStreams.push_back(locMap);
+
+				//Write the page out to the output file.
+				writePageToOutputFile(inOggPage);
+			} else if (			(inOggPage->header()->isEOS())
+							&&	(inOggPage->header()->StreamSerialNo() == annodexSerialNo)) {
+
+				//It's the Annodex EOS.
+				demuxState = SEEN_ANNODEX_EOS;
+				writePageToOutputFile(inOggPage);
+			} else {
+				demuxState = INVALID;
+			}
+			break;
+		case SEEN_ANNODEX_EOS:
+			for (unsigned int i = 0; i < theStreams.size(); i++) {
+				if (theStreams[i].first == inOggPage->header()->StreamSerialNo()) {
+					if (theStreams[i].second >= 1) {
+						theStreams[i].second--;
+						writePageToOutputFile(inOggPage);
+					} else {
+						demuxState = INVALID;
+					}
+				}
+			}
+
+			
+			for (unsigned int i = 0; i < theStreams.size(); i++) {
+				if (theStreams[i].second != 0) {
+					allEmpty = false;
+				}
+			}
+
+			if (allEmpty) {
+
+				demuxState = SEEN_ALL_CODEC_HEADERS;
+			}
+			break;
+		case SEEN_ALL_CODEC_HEADERS:
+			break;
+		case INVALID:
+			break;
+		default:
+			break;
+	}
+
+
+	if (demuxState == INVALID) {
+	}
+	// delete inOggPage;
+
+	return true;
+}
+
+static int
+ma_anxenc (request_rec * r, char * filename, char * content_type,
+	   apr_table_t * cgi_table)
+{
+  char * val;
+  double seek_offset = 0.0;
+
+  theRequest = r;
+
+  /* put the requested time into seek_offset */
+  val = (char *)apr_table_get (cgi_table, "t");
+
+  if (!val)
+  {
+	fstream inputFile;
+	inputFile.open(filename, ios_base::in | ios_base::binary);
+	for (;;)
+	{
+	  const unsigned short BUFF_SIZE = 8092;
+	  char* locBuff = new char[BUFF_SIZE];
+
+	  inputFile.read(locBuff, BUFF_SIZE);
+	  unsigned long locBytesRead = inputFile.gcount();
+	  if (locBytesRead == 0) break;
+	  ap_rwrite (locBuff, locBytesRead, r);
+	}
+	inputFile.close();
+
+	return 0;
+  }
+
+  seek_offset = anx_parse_time (val);
+
+  /* begin AnxCutter code */
+  demuxState = SEEN_NOTHING;
+  bytePos = 0;
+  gotAllHeaders = false;
+  annodexSerialNo = 0;
+
+  OggDataBuffer testOggBuff;
+  testOggBuff.registerStaticCallback(&pageCB, NULL);
+	
+  /* rip out the headers from the file */
+
+  fstream inputFile;
+		
+  ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, r,
+                "ma_anxenc t=%s (%ld)\n", val, seek_offset);
+
+  inputFile.open(filename, ios_base::in | ios_base::binary);
+
+  char* locBuff = new char[MEDIA_BUF_LEN];
+  while (demuxState < SEEN_ALL_CODEC_HEADERS) {
+    inputFile.read(locBuff, MEDIA_BUF_LEN);
+    unsigned long locBytesRead = inputFile.gcount();
+	if (locBytesRead > 0)
+	{
+	  ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, r,
+                "feeding %ld bytes to testOggBuff", locBytesRead);
+	}
+    testOggBuff.feed((const unsigned char*)locBuff, locBytesRead);
+  }
+  inputFile.close();
+
+  // Build a seek table for the file
+  AutoAnxSeekTable *locSeekTable = new AutoAnxSeekTable(filename);
+  locSeekTable->buildTable();
+	
+  // Seek to the user's requested start time
+  LOOG_UINT64 locStartTime = (LOOG_UINT64) seek_offset * 10000000;
+  OggSeekTable::tSeekPair locSeekResult = locSeekTable->getStartPos(locStartTime);
+	
+  // Stream-copy everything from the requested timepoint onward to the output file
+  inputFile.open(filename, ios_base::in | ios_base::binary);
+  inputFile.seekg(locSeekResult.second);
+
+  for (;;) {
+    inputFile.read(locBuff, MEDIA_BUF_LEN);
+    unsigned long locBytesRead = inputFile.gcount();
+    if (locBytesRead == 0) break;
+    //outputFile.write(locBuff, locBytesRead);
+    ap_rwrite (locBuff, locBytesRead, r);
+  }
+  inputFile.close();
+
+  ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, r,
+                "Served request");
+}
+
+
+extern "C" {
+
+/* The annodex content handler */
+static int AP_MODULE_ENTRY_POINT annodex_handler(request_rec *r)
+{
+  apr_uri_t * uri;
+  char * filename;
+  apr_table_t * cgi_table;
+
+	   ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, r,
+                  "Got here 2");
+
+  uri = &(r->parsed_uri);
+
+  /* usually filename is request filename */
+  filename = r->filename;
+
+	   ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, r,
+                  "filename is %s", filename);
+
+  cgi_table = make_cgi_table (r, uri->query);
+
+  ma_anxenc (r, r->filename, ANX_MIME_TYPE, cgi_table);
+
+  return OK;
+}
+
+static void AP_MODULE_ENTRY_POINT annodex_register_hooks(apr_pool_t *p)
+{
+    ap_hook_handler(AP_HOOK_HANDLER_FUNCTION(annodex_handler),
+		            NULL, NULL, APR_HOOK_MIDDLE);
+}
+
+/* Dispatch list for API hooks */
+module AP_MODULE_DECLARE_DATA timeslice_module = {
+    STANDARD20_MODULE_STUFF, 
+    NULL,                  /* create per-dir    config structures */
+    NULL,                  /* merge  per-dir    config structures */
+    NULL,                  /* create per-server config structures */
+    NULL,                  /* merge  per-server config structures */
+    NULL,                  /* table of config file commands       */
+    AP_REGISTER_HOOK_FUNCTION(annodex_register_hooks)  /* register hooks */
+};
+
+} /* extern "C" */

Added: trunk/oggdsf/src/tools/mod_timeslice/mod_timeslice.vcproj
===================================================================
--- trunk/oggdsf/src/tools/mod_timeslice/mod_timeslice.vcproj	2004-12-31 14:16:36 UTC (rev 8565)
+++ trunk/oggdsf/src/tools/mod_timeslice/mod_timeslice.vcproj	2004-12-31 17:40:25 UTC (rev 8566)
@@ -0,0 +1,213 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="mod_timeslice"
+	ProjectGUID="{F8FDD992-E21A-483F-BBE7-305D10163DE4}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="Debug"
+			IntermediateDirectory="Debug"
+			ConfigurationType="2"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="..\..\lib\helper;..\..\lib\core\ogg;&quot;C:\Program Files\Apache Group\Apache2\include&quot;"
+				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				UsePrecompiledHeader="0"
+				WarningLevel="4"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="4"
+				CallingConvention="2"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalOptions="/NODEFAULTLIB:library"
+				AdditionalDependencies="libhttpd.lib libapr.lib"
+				OutputFile="$(OutDir)/mod_timeslice.so"
+				LinkIncremental="2"
+				AdditionalLibraryDirectories="&quot;C:\Program Files\Apache Group\Apache2\lib&quot;"
+				IgnoreAllDefaultLibraries="FALSE"
+				IgnoreDefaultLibraryNames=""
+				GenerateDebugInformation="TRUE"
+				ProgramDatabaseFile="$(OutDir)/mod_timeslice.pdb"
+				SubSystem="2"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="Release"
+			IntermediateDirectory="Release"
+			ConfigurationType="2"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalIncludeDirectories="..\..\lib\helper;..\..\lib\core\ogg;&quot;C:\Program Files\Apache Group\Apache2\include&quot;"
+				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
+				RuntimeLibrary="2"
+				UsePrecompiledHeader="0"
+				WarningLevel="4"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="3"
+				CallingConvention="2"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalOptions="/NODEFAULTLIB:library"
+				AdditionalDependencies="libapr.lib libaprutil.lib libhttpd.lib apr.lib aprutil.lib"
+				OutputFile="$(OutDir)/mod_timeslice.so"
+				LinkIncremental="1"
+				AdditionalLibraryDirectories="&quot;C:\Program Files\Apache Group\Apache2\lib&quot;"
+				IgnoreAllDefaultLibraries="FALSE"
+				IgnoreDefaultLibraryNames="MSVCRT"
+				GenerateDebugInformation="TRUE"
+				SubSystem="2"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Debug__cdecl|Win32"
+			OutputDirectory="$(ConfigurationName)"
+			IntermediateDirectory="$(ConfigurationName)"
+			ConfigurationType="2"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="..\..\lib\helper;..\..\lib\core\ogg;&quot;C:\Program Files\Apache Group\Apache2\include&quot;"
+				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				UsePrecompiledHeader="0"
+				WarningLevel="4"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="4"
+				CallingConvention="0"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalOptions="/NODEFAULTLIB:library"
+				AdditionalDependencies="libhttpd.lib libapr.lib"
+				OutputFile="$(OutDir)/mod_timeslice.so"
+				LinkIncremental="2"
+				AdditionalLibraryDirectories="&quot;C:\Program Files\Apache Group\Apache2\lib&quot;"
+				IgnoreAllDefaultLibraries="FALSE"
+				IgnoreDefaultLibraryNames="MSVCRTD"
+				GenerateDebugInformation="TRUE"
+				ProgramDatabaseFile="$(OutDir)/mod_timeslice.pdb"
+				SubSystem="2"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+			<File
+				RelativePath=".\anx_time.c">
+			</File>
+			<File
+				RelativePath=".\mod_timeslice.cpp">
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+			<File
+				RelativePath=".\anx_time.h">
+			</File>
+			<File
+				RelativePath=".\apr_stdcall.h">
+			</File>
+		</Filter>
+		<Filter
+			Name="Resource Files"
+			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
+		</Filter>
+		<File
+			RelativePath=".\README.txt">
+		</File>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>



More information about the commits mailing list