[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;"C:\Program Files\Apache Group\Apache2\include""
+ 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=""C:\Program Files\Apache Group\Apache2\lib""
+ 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;"C:\Program Files\Apache Group\Apache2\include""
+ 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=""C:\Program Files\Apache Group\Apache2\lib""
+ 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;"C:\Program Files\Apache Group\Apache2\include""
+ 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=""C:\Program Files\Apache Group\Apache2\lib""
+ 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