[prev in list] [next in list] [prev in thread] [next in thread]
List: helix-common-dev
Subject: [Common-dev] CR: capture fileformat
From: "Eric Hyche" <ehyche () real ! com>
Date: 2008-12-05 3:22:54
Message-ID: 010801c95688$c329fe60$497dfb20$ () com
[Download RAW message or body]
This is a MIME-formatted message. If you see this text it means that your
E-mail software does not support MIME-formatted messages.
Description
----------------------------------------------
This CR adds support for a "capture" fileformat; that is,
a fileformat plugin which claims JSR135 "capture://" URLs.
For example, you can give the capture fileformat plugin
an URL of:
splay capture://audio_video
and it will capture and display audio and video from the default
audio and video capture devices using all the default
settings.
Right now I am planning on checking in the capture fileformat
to datatype/capture/fileformat, but I'm open to other
locations, if others feel a different location would
be more appropriate.
Files Added
--------------------------------------------
datatype/capture/fileformat/* - capture fileformat
datatype/wav/common/util/* - added utility functions to write out WAV file
Files Modified
--------------------------------------------
client/core/hxplay.cpp
- fix bug in scheme/extension claiming
client/encodesvc/common/util/hxencodesvc_utils.cpp
client/encodesvc/common/util/pub/hxencodesvc_utils.h
- add Producer SDK event strings
client/encodesvc/include/ihxtplugininfobase.h
- remove HX_DISABLE_LOGGING when plugin helper destructs
client/encodesvc/recordengine/chxvideocapture.cpp
- add default device property for video
common/include/hxtypes.h
- add MAX_INT64 definition
common/include/ihxtlogsystem.h
- add HXLOG_CAPF logging 4cc
common/log/logobserverfile/hxtlogobserver.cpp
common/log/logobserverfile/hxtlogobserver.h
- fix bug in file log observer where it subscribes
twice to the observer manager, resulting in two
log statement lines for each logging statement
common/log/logsystem/hxtwritermanager.cpp
- remove noisy unnecessary assert
common/util/hxurlutil.cpp
common/util/pub/hxurlutil.h
- enable URL option properties to all be set as buffer properties
datatype/common/audrend/audrend.cpp
- add logging statement for OnPacket
helix.bif
- add targets for datatype_capture_fileformat, datatype_wav_common_util,
and splay_capture. splay_capture builds everything you need
to test the capture fileformat.
Branches
--------------------------------------------
HEAD only
=======================================
Eric Hyche (ehyche@real.com)
Principal Engineer
RealNetworks, Inc.
["datatype_capture_fileformat.zip" (application/x-zip-compressed)]
["datatype_wav_common_util.zip" (application/x-zip-compressed)]
["captureff-bif-diff.txt" (text/plain)]
Index: helix.bif
===================================================================
RCS file: /cvsroot/common/build/BIF/helix.bif,v
retrieving revision 1.713
diff -u -w -u -w -r1.713 helix.bif
--- helix.bif 3 Dec 2008 12:49:39 -0000 1.713
+++ helix.bif 5 Dec 2008 03:10:52 -0000
@@ -1372,9 +1372,7 @@
<source_dependlist>
common_include
- protocol_common_util
protocol_transport_rdt
- protocol_http
</source_dependlist>
<dependlist>
@@ -1390,6 +1388,8 @@
client_common_container
client_common_util
client_common_netio
+ protocol_common_util
+ protocol_http
</dependlist>
</module>
@@ -1697,6 +1697,7 @@
client_common_container
client_common_util
client_common_netio
+ client_netwksvc
client_videosvc
common_log_logutil
</dependlist>
@@ -8144,6 +8145,19 @@
</module>
+ <!-- DATATYPE_WAV_COMMON_UTIL -->
+ <module id="datatype_wav_common_util" name="datatype/wav/common/util" group="core">
+ <cvs root="helix"/>
+
+ <source_dependlist>
+ common_include
+ common_runtime
+ common_util
+ common_container
+ common_dbgtool
+ </source_dependlist>
+ </module>
+
<!-- DATATYPE_WAV_RENDERER_PCM -->
<module id="datatype_wav_renderer_pcm" name="datatype/wav/renderer/pcm" group="core">
<cvs root="helix"/>
@@ -9039,6 +9053,31 @@
</dependlist>
</module>
+ <!-- SPLAY_CAPTURE -->
+ <module id="splay_capture" name="clientapps/simpleplayer" group="core">
+ <dependlist>
+ common_runtime
+ common_system
+ common_container
+ common_dbgtool
+ common_util
+ client_medpltfm
+ client_core
+ filesystem_local
+ datatype_ram_fileformat
+ datatype_ram_renderer
+ protocol_sdp
+ datatype_image_png_common
+ common_import_zlib
+ datatype_image_png_import_libpng
+ video_site
+ client_encodesvc
+ datatype_capture_fileformat
+ datatype_wav_renderer_pcm
+ datatype_i420_renderer
+ </dependlist>
+ </module>
+
<!-- SPLAY_RA -->
<module id="splay_ra" name="clientapps/simpleplayer" group="core">
<dependlist>
@@ -16063,6 +16102,27 @@
</module>
+ <!-- DATATYPE/CAPTURE/FILEFORMAT -->
+ <module id="datatype_capture_fileformat" name="datatype/capture/fileformat" group="core">
+ <cvs root="helix"/>
+
+ <source_dependlist>
+ common_include
+ client_include
+ client_encodesvc_include
+ </source_dependlist>
+
+ <dependlist>
+ common_runtime
+ common_container
+ common_dbgtool
+ common_util
+ common_system
+ common_log_logutil
+ client_encodesvc_common_util
+ </dependlist>
+ </module>
+
<!-- New Client Encoding Services Targets -->
<module id="client_encodesvc_checkout_only" name="client/encodesvc" group="core">
<attribute id="no_build"/>
["captureff-client-diff.txt" (text/plain)]
Index: core/hxplay.cpp
===================================================================
RCS file: /cvsroot/client/core/hxplay.cpp,v
retrieving revision 1.197
diff -u -w -u -w -r1.197 hxplay.cpp
--- core/hxplay.cpp 20 Sep 2008 06:06:17 -0000 1.197
+++ core/hxplay.cpp 5 Dec 2008 02:59:17 -0000
@@ -5444,7 +5444,7 @@
if (m_EventList.GetNumEvents() == 0)
{
- HXLOGL3(HXLOG_CORP, "HXPlayer[%p]::ProcessCurrentEvents() End", this);
+ HXLOGL3(HXLOG_CORP, "HXPlayer[%p]::ProcessCurrentEvents() End \
m_EventList.GetNumEvents() == 0", this); return HXR_OK;
}
@@ -5486,7 +5486,6 @@
if (!pEvent->m_pRendererInfo->m_bIsFirstTimeSync &&
pPacket->GetTime() > \
pEvent->m_pRendererInfo->m_pStreamInfo->m_ulTimeAfterSeek) {
-
#if defined(_MACINTOSH) || defined(_MAC_UNIX)
/* Cannot call audio player Seek() at interrupt time. It results
* in audio device Reset() which issues DoImmediate commands
@@ -7900,6 +7899,9 @@
HX_RESULT retVal = pProps->GetPropertyBuffer(PROPERTY_SCHEME, \
pSchemeStr); if (SUCCEEDED(retVal))
{
+ // Initialize the extension string and the search string
+ CHXString cExtension;
+ CHXString cSearch;
// Get the full path
IHXBuffer* pFullPathStr = NULL;
retVal = pProps->GetPropertyBuffer(PROPERTY_FULLPATH, pFullPathStr);
@@ -7908,7 +7910,6 @@
// Put this into a CHXString
CHXString cFullPath((const char*) pFullPathStr->GetBuffer());
CHXString cFileName = cFullPath;
- CHXString cExtension;
// Find the last "/" or "\"
INT32 lLastSlash1 = cFullPath.ReverseFind('/');
INT32 lLastSlash2 = cFullPath.ReverseFind('\\');
@@ -7924,7 +7925,7 @@
cExtension = cFileName.Right(cFileName.GetLength() - lPeriod \
- 1); }
// Construct the search string
- CHXString cSearch((const char*) pSchemeStr->GetBuffer());
+ cSearch = (const char*) pSchemeStr->GetBuffer();
// Do we have an extension?
if (cExtension.GetLength() > 0)
{
@@ -7933,7 +7934,19 @@
// Append the extension
cSearch += cExtension;
}
-
+ }
+ else
+ {
+ // Some URLs (like capture://audio) do not have a path
+ // at all, so they will fail the test where we look
+ // for the PROPERTY_FULLPATH in the CHXURL properties.
+ // So in this case, the search string is just the scheme
+ cSearch = (const char*) pSchemeStr->GetBuffer();
+ // Clear the return value
+ retVal = HXR_OK;
+ }
+ // We either need to have an extension or the input flag needs
+ // to be set saying we don't have to claim the extension.
if (!bMustClaimExtension || (cExtension.GetLength() > 0))
{
// Get the IHXPluginHandler3 interface
@@ -7977,7 +7990,6 @@
}
HX_RELEASE(pHandler3);
}
- }
HX_RELEASE(pFullPathStr);
}
HX_RELEASE(pSchemeStr);
Index: encodesvc/common/util/hxencodesvc_utils.cpp
===================================================================
RCS file: /cvsroot/client/encodesvc/common/util/hxencodesvc_utils.cpp,v
retrieving revision 1.1
diff -u -w -u -w -r1.1 hxencodesvc_utils.cpp
--- encodesvc/common/util/hxencodesvc_utils.cpp 6 Nov 2008 15:38:11 -0000 1.1
+++ encodesvc/common/util/hxencodesvc_utils.cpp 5 Dec 2008 02:59:17 -0000
@@ -58,6 +58,65 @@
#include "hxtypes.h"
#include "hxcom.h"
#include "hxencodesvc.h"
+#include "ihxteventcodes.h"
+
+static const char* const g_pEventName[NUM_EHXTEVENTS] =
+{
+ "eEventEncodingStarted",
+ "eEventEncodingFinished",
+ "eEventTwoPassAnalysisStarted",
+ "eEventTwoPassAnalysisFinished",
+ "eEventTwoPassEncodingUsingAnalysisStarted",
+ "eEventTwoPassEncodingUsingAnalysisFinished",
+ "eEventEncodeProgress",
+ "eEventAnalysisProgress",
+ "eEventInputStarted",
+ "eEventInputFinished",
+ "eEventInputError",
+ "eEventDestinationStarted",
+ "eEventDestinationMergeProgress",
+ "eEventDestinationFinished",
+ "eEventDestinationError",
+ "eEventDestinationCanceled",
+ "eEventDestinationBroadcasting",
+ "eEventDestinationReconnecting",
+ "eEventDestinationListening",
+ "eEventCurrentLatency",
+ "eEventStreamConfigEncodingComplexityUpdate",
+ "eEventInputFilterStarted",
+ "eEventInputFilterFinished",
+ "eEventInputFilterError",
+ "eEventOutputFilterStarted",
+ "eEventOutputFilterMergeProgress",
+ "eEventOutputFilterFinished",
+ "eEventOutputFilterError",
+ "eEventOutputFilterCanceled",
+ "eEventOutputFilterStreamDone",
+ "eEventOutputFilterBroadcasting",
+ "eEventOutputFilterReconnecting",
+ "eEventOutputFilterListening",
+ "eEventOutputTempFileCreated",
+ "eEventOutputFilterLastEvent",
+ "eEventTransformFilterEncodingComplexityUpdate",
+ "eEventTransformFilterError",
+ "eFirstPerformanceEvent",
+ "eEventPerformanceOverload",
+ "eEventPerformanceLoad",
+ "eLastPerformanceEvent",
+ "eFirstCoreEvent",
+ "eEventLastEvent",
+ "eEventEncodeTimestamp",
+ "eEventFilterDone",
+ "eEventGraphDone",
+ "eEventStarted",
+ "eEventStopped",
+ "eEventPaused",
+ "eEventResumed",
+ "eEventInputDirectorError",
+ "eEventTransformDirectorError",
+ "eEventOutputDirectorError",
+ "eLastCoreEvent"
+};
const char* GetAudioEncoderIDString(UINT32 ulID)
{
@@ -290,3 +349,14 @@
return pszRet;
}
+const char* GetEventString(EHXTEvent eEvent)
+{
+ const char* pszRet = "Unknown";
+
+ if (eEvent < NUM_EHXTEVENTS)
+ {
+ pszRet = g_pEventName[eEvent];
+ }
+
+ return pszRet;
+}
Index: encodesvc/common/util/pub/hxencodesvc_utils.h
===================================================================
RCS file: /cvsroot/client/encodesvc/common/util/pub/hxencodesvc_utils.h,v
retrieving revision 1.1
diff -u -w -u -w -r1.1 hxencodesvc_utils.h
--- encodesvc/common/util/pub/hxencodesvc_utils.h 6 Nov 2008 15:38:11 -0000 1.1
+++ encodesvc/common/util/pub/hxencodesvc_utils.h 5 Dec 2008 02:59:17 -0000
@@ -74,5 +74,7 @@
// For example, given an input of HX_XA_VIDEOCODEC_AVC, returns
// the string "HX_XA_VIDEOCODEC_AVC".
const char* GetVideoEncoderIDString(UINT32 ulID);
+// Retrieve a string containing the event name
+const char* GetEventString(EHXTEvent eEvent);
#endif /* #ifndef HXENCODESVC_UTILS_H */
Index: encodesvc/include/ihxtplugininfobase.h
===================================================================
RCS file: /cvsroot/client/encodesvc/include/ihxtplugininfobase.h,v
retrieving revision 1.4
diff -u -w -u -w -r1.4 ihxtplugininfobase.h
--- encodesvc/include/ihxtplugininfobase.h 10 Sep 2008 18:46:35 -0000 1.4
+++ encodesvc/include/ihxtplugininfobase.h 5 Dec 2008 02:59:17 -0000
@@ -75,7 +75,6 @@
{
HX_RELEASE( m_pContext );
HX_RELEASE( m_pAgent );
- HX_DISABLE_LOGGING();
}
// IHXPlugin Interface Methods
Index: encodesvc/recordengine/chxvideocapture.cpp
===================================================================
RCS file: /cvsroot/client/encodesvc/recordengine/chxvideocapture.cpp,v
retrieving revision 1.1
diff -u -w -u -w -r1.1 chxvideocapture.cpp
--- encodesvc/recordengine/chxvideocapture.cpp 6 Nov 2008 15:48:25 -0000 1.1
+++ encodesvc/recordengine/chxvideocapture.cpp 5 Dec 2008 02:59:17 -0000
@@ -411,6 +411,12 @@
{
// Increment the short name index
m_ulShortNameIndex++;
+ // Get the default device flag
+ HXBOOL bDefaultDevice = FALSE;
+ pInfo->GetBool(kPropCaptureDefaultDevice, &bDefaultDevice);
+ // Set the HX_CAPTURE_PROPERTY_IS_DEFAULT_DEVICE property
+ pCaps->SetPropertyULONG32(HX_CAPTURE_PROPERTY_IS_DEFAULT_DEVICE,
+ (bDefaultDevice ? 1 : 0));
// Get the kPropVideoWidthList property
IHXTUintList* pWidthList = NULL;
retVal = pInfo->GetUintList(kPropVideoWidthList, &pWidthList);
["captureff-common-diff.txt" (text/plain)]
Index: include/hxtypes.h
===================================================================
RCS file: /cvsroot/common/include/hxtypes.h,v
retrieving revision 1.41
diff -u -w -u -w -r1.41 hxtypes.h
--- include/hxtypes.h 24 Jun 2008 22:15:00 -0000 1.41
+++ include/hxtypes.h 5 Dec 2008 03:05:46 -0000
@@ -260,6 +260,10 @@
#define MAX_UINT64 0xffffffffffffffffULL
#endif /* MAX_UINT64 */
+#if !defined(MAX_INT64)
+#define MAX_INT64 0x7fffffffffffffffLL
+#endif /* MAX_UINT64 */
+
#if defined(_MACINTOSH)
#define kLetInterruptsFinishBeforeQuittingGestalt 'RN$~'
#endif
Index: include/ihxtlogsystem.h
===================================================================
RCS file: /cvsroot/common/include/ihxtlogsystem.h,v
retrieving revision 1.49
diff -u -w -u -w -r1.49 ihxtlogsystem.h
--- include/ihxtlogsystem.h 28 Nov 2008 06:51:21 -0000 1.49
+++ include/ihxtlogsystem.h 5 Dec 2008 03:05:46 -0000
@@ -238,6 +238,7 @@
,HXLOG_EVIR = HX_MAKE4CC('E','V','I','R') // Encoding services - VIDRENDR
,HXLOG_EMED = HX_MAKE4CC('E','M','E','D') // Encoding services - MEDIASAMPLES
,HXLOG_EPUB = HX_MAKE4CC('E','P','U','B') // Encoding services - PUB
+ ,HXLOG_CAPF = HX_MAKE4CC('C','A','P','F') // Capture file format
};
static const struct _ClientLogging4CC
@@ -338,6 +339,7 @@
{HXLOG_EVIR, "Encoding Services Video Rendering"},
{HXLOG_EMED, "Encoding Services Media Samples"},
{HXLOG_EPUB, "Encoding Services PUB"},
+ {HXLOG_CAPF, "Capture File Format"},
{0, NULL} // This entry should ALWAYS remain the last entry
};
Index: log/logobserverfile/hxtlogobserver.cpp
===================================================================
RCS file: /cvsroot/common/log/logobserverfile/hxtlogobserver.cpp,v
retrieving revision 1.21
diff -u -w -u -w -r1.21 hxtlogobserver.cpp
--- log/logobserverfile/hxtlogobserver.cpp 27 Sep 2007 19:24:57 -0000 1.21
+++ log/logobserverfile/hxtlogobserver.cpp 5 Dec 2008 03:05:46 -0000
@@ -111,7 +111,8 @@
m_pLogSystem(NULL),
m_pContext(NULL),
m_bEnableDeliveryThread(HXLOG_ENABLE_DELIVERY_THREAD_PREFVAL_DEFAULT),
-m_pFileMutex(NULL)
+m_pFileMutex(NULL),
+m_bPluginInitialized(FALSE)
{
}
@@ -1114,8 +1115,13 @@
STDMETHODIMP CHXTFileObserver::InitPlugin(IUnknown* pContext)
{
- HX_RESULT retVal = HXR_FAIL;
+ HX_RESULT retVal = HXR_OK;
+ if (!m_bPluginInitialized)
+ {
+ // Set the return value
+ retVal = HXR_INVALID_PARAMETER;
+ // Make sure we were passed in a context
if (pContext)
{
HX_RELEASE(m_pContext);
@@ -1199,10 +1205,16 @@
// Init the log observer
retVal = Init((const char*) cFileName);
+ if (SUCCEEDED(retVal))
+ {
+ // We initialized successfully, so set the flag
+ m_bPluginInitialized = TRUE;
+ }
}
}
HX_RELEASE(pPrefs);
}
+ }
return retVal;
}
Index: log/logobserverfile/hxtlogobserver.h
===================================================================
RCS file: /cvsroot/common/log/logobserverfile/hxtlogobserver.h,v
retrieving revision 1.13
diff -u -w -u -w -r1.13 hxtlogobserver.h
--- log/logobserverfile/hxtlogobserver.h 7 Apr 2006 12:38:17 -0000 1.13
+++ log/logobserverfile/hxtlogobserver.h 5 Dec 2008 03:05:46 -0000
@@ -163,6 +163,7 @@
IUnknown* m_pContext;
HXBOOL m_bEnableDeliveryThread;
IHXMutex* m_pFileMutex;
+ HXBOOL m_bPluginInitialized;
#if defined(HELIX_FEATURE_CLIENT)
static const char* const m_pszDescription;
Index: log/logsystem/hxtwritermanager.cpp
===================================================================
RCS file: /cvsroot/common/log/logsystem/hxtwritermanager.cpp,v
retrieving revision 1.9
diff -u -w -u -w -r1.9 hxtwritermanager.cpp
--- log/logsystem/hxtwritermanager.cpp 17 Jan 2007 20:12:46 -0000 1.9
+++ log/logsystem/hxtwritermanager.cpp 5 Dec 2008 03:05:46 -0000
@@ -159,7 +159,9 @@
HXBOOL bVarArgs;
const char* szTransMessage = NULL;
res = m_pTranslationCentre->GetMessage(pMsgData->MessageNumber(), \
pMsgData->NameSpace(), &bVarArgs, &szTransMessage);
- HX_ASSERT(SUCCEEDED(res));
+ // Client most likely does not have translation support.
+ // We don't want to assert here in that case.
+// HX_ASSERT(SUCCEEDED(res));
if(SUCCEEDED(res))
{
pMsgData->Message(szTransMessage);
Index: util/hxurlutil.cpp
===================================================================
RCS file: /cvsroot/common/util/hxurlutil.cpp,v
retrieving revision 1.9
diff -u -w -u -w -r1.9 hxurlutil.cpp
--- util/hxurlutil.cpp 18 Jan 2008 04:54:26 -0000 1.9
+++ util/hxurlutil.cpp 5 Dec 2008 03:05:46 -0000
@@ -89,7 +89,8 @@
}
-HX_RESULT HXURLUtil::GetOptions(IUnknown* pContext, const HXURLRep& url, IHXValues*& \
pVal /* out*/) +HX_RESULT HXURLUtil::GetOptions(IUnknown* pContext, const HXURLRep& \
url, IHXValues*& pVal /* out*/, + HXBOOL \
bAllBufferProperties) {
HX_RESULT hr = HXR_FAIL;
@@ -104,7 +105,7 @@
hr = pContext->QueryInterface(IID_IHXCommonClassFactory, (void**)&pFactory);
if (HXR_OK == hr)
{
- hr = ParseOptions(url.Query(), pFactory, pVal);
+ hr = ParseOptions(url.Query(), pFactory, pVal, bAllBufferProperties);
HX_RELEASE(pFactory);
}
}
@@ -130,7 +131,8 @@
HX_RESULT HXURLUtil::ParseOptions(const char* pszEscapedQuery,
IHXCommonClassFactory* pFactory,
- IHXValues*& pVal /*out*/)
+ IHXValues*& pVal /*out*/,
+ HXBOOL bAllBufferProperties)
{
HX_ASSERT(pFactory);
@@ -188,7 +190,7 @@
}
else
{
- if(valueIsQuoted || !IsNumber(value))
+ if(valueIsQuoted || !IsNumber(value) || bAllBufferProperties)
{
IHXBuffer* pBuffer = 0;
hr = pFactory->CreateInstance(CLSID_IHXBuffer, (void**)&pBuffer);
Index: util/pub/hxurlutil.h
===================================================================
RCS file: /cvsroot/common/util/pub/hxurlutil.h,v
retrieving revision 1.6
diff -u -w -u -w -r1.6 hxurlutil.h
--- util/pub/hxurlutil.h 27 Nov 2006 17:37:48 -0000 1.6
+++ util/pub/hxurlutil.h 5 Dec 2008 03:05:46 -0000
@@ -70,10 +70,12 @@
static ProtocolInfo GetProtocolInfo(const char* pszScheme);
- static HX_RESULT GetOptions(IUnknown* pContext, const HXURLRep& url, IHXValues*& \
pVal /* out*/); + static HX_RESULT GetOptions(IUnknown* pContext, const HXURLRep& \
url, IHXValues*& pVal /* out*/, + HXBOOL \
bAllBufferProperties = FALSE); static HX_RESULT ParseOptions(const char* \
pszEscapedQuery, IHXCommonClassFactory* pFactory,
- IHXValues*& pVal /*out*/);
+ IHXValues*& pVal /*out*/,
+ HXBOOL bAllBufferProperties = FALSE);
static void DoDollarFixup(CHXString& url);
static void DoFileURLFixup(HXURLRep& url);
};
["captureff-datatype-diff.txt" (text/plain)]
? capture
? wav/common
Index: common/audrend/audrend.cpp
===================================================================
RCS file: /cvsroot/datatype/common/audrend/audrend.cpp,v
retrieving revision 1.47
diff -u -w -u -w -r1.47 audrend.cpp
--- common/audrend/audrend.cpp 2 Dec 2008 22:58:29 -0000 1.47
+++ common/audrend/audrend.cpp 5 Dec 2008 03:06:13 -0000
@@ -216,6 +216,8 @@
HX_ASSERT(pContext);
+ HX_ENABLE_LOGGING(pContext);
+
m_pContext = pContext;
m_pContext->AddRef();
@@ -674,6 +676,7 @@
STDMETHODIMP
CAudioRenderer::OnPacket(IHXPacket* pPacket, LONG32 lTimeOffset)
{
+ HXLOGL4(HXLOG_BAUD, "OnPacket(%p,%ld) ts=%lu", pPacket, lTimeOffset, (pPacket ? \
pPacket->GetTime() : 0)); HX_RESULT retVal = HXR_OK;
/* Ignore any pre-seek packets or NULL packets */
_______________________________________________
Common-dev mailing list
Common-dev@helixcommunity.org
http://lists.helixcommunity.org/mailman/listinfo/common-dev
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic