Index: BasicUsageEnvironment/include/BasicUsageEnvironment.hh
===================================================================
--- BasicUsageEnvironment/include/BasicUsageEnvironment.hh	(revision 14473)
+++ BasicUsageEnvironment/include/BasicUsageEnvironment.hh	(revision 14474)
@@ -20,11 +20,18 @@
 #ifndef _BASIC_USAGE_ENVIRONMENT_HH
 #define _BASIC_USAGE_ENVIRONMENT_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
+
 #ifndef _BASIC_USAGE_ENVIRONMENT0_HH
 #include "BasicUsageEnvironment0.hh"
 #endif
 
-class BasicUsageEnvironment: public BasicUsageEnvironment0 {
+class LIVEMEDIALIB_API BasicUsageEnvironment: public BasicUsageEnvironment0 {
 public:
   static BasicUsageEnvironment* createNew(TaskScheduler& taskScheduler);
 
@@ -44,7 +51,7 @@
 };
 
 
-class BasicTaskScheduler: public BasicTaskScheduler0 {
+class LIVEMEDIALIB_API BasicTaskScheduler: public BasicTaskScheduler0 {
 public:
   static BasicTaskScheduler* createNew(unsigned maxSchedulerGranularity = 10000/*microseconds*/);
     // "maxSchedulerGranularity" (default value: 10 ms) specifies the maximum time that we wait (in "select()") before
Index: BasicUsageEnvironment/include/BasicUsageEnvironment0.hh
===================================================================
--- BasicUsageEnvironment/include/BasicUsageEnvironment0.hh	(revision 14473)
+++ BasicUsageEnvironment/include/BasicUsageEnvironment0.hh	(revision 14474)
@@ -20,6 +20,12 @@
 #ifndef _BASIC_USAGE_ENVIRONMENT0_HH
 #define _BASIC_USAGE_ENVIRONMENT0_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _BASICUSAGEENVIRONMENT_VERSION_HH
 #include "BasicUsageEnvironment_version.hh"
 #endif
@@ -36,7 +42,7 @@
 
 // An abstract base class, useful for subclassing
 // (e.g., to redefine the implementation of "operator<<")
-class BasicUsageEnvironment0: public UsageEnvironment {
+class LIVEMEDIALIB_API BasicUsageEnvironment0: public UsageEnvironment {
 public:
   // redefined virtual functions:
   virtual MsgString getResultMsg() const;
@@ -71,7 +77,7 @@
 
 // An abstract base class, useful for subclassing
 // (e.g., to redefine the implementation of socket event handling)
-class BasicTaskScheduler0: public TaskScheduler {
+class LIVEMEDIALIB_API BasicTaskScheduler0: public TaskScheduler {
 public:
   virtual ~BasicTaskScheduler0();
 
Index: BasicUsageEnvironment/include/DelayQueue.hh
===================================================================
--- BasicUsageEnvironment/include/DelayQueue.hh	(revision 14473)
+++ BasicUsageEnvironment/include/DelayQueue.hh	(revision 14474)
@@ -20,6 +20,12 @@
 #ifndef _DELAY_QUEUE_HH
 #define _DELAY_QUEUE_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _NET_COMMON_H
 #include "NetCommon.h"
 #endif
@@ -32,7 +38,7 @@
 
 ///// A "Timeval" can be either an absolute time, or a time interval /////
 
-class Timeval {
+class LIVEMEDIALIB_API Timeval {
 public:
   time_base_seconds seconds() const {
     return fTv.tv_sec;
@@ -95,29 +101,29 @@
 }
 #endif
 
-class DelayInterval operator-(Timeval const& arg1, Timeval const& arg2);
+class LIVEMEDIALIB_API DelayInterval operator-(Timeval const& arg1, Timeval const& arg2);
 // returns ZERO iff arg2 >= arg1
 
 
 ///// DelayInterval /////
 
-class DelayInterval: public Timeval {
+class LIVEMEDIALIB_API DelayInterval: public Timeval {
 public:
   DelayInterval(time_base_seconds seconds, time_base_seconds useconds)
     : Timeval(seconds, useconds) {}
 };
 
-DelayInterval operator*(short arg1, DelayInterval const& arg2);
+LIVEMEDIALIB_API DelayInterval operator*(short arg1, DelayInterval const& arg2);
 
-extern DelayInterval const DELAY_ZERO;
-extern DelayInterval const DELAY_SECOND;
-extern DelayInterval const DELAY_MINUTE;
-extern DelayInterval const DELAY_HOUR;
-extern DelayInterval const DELAY_DAY;
+extern LIVEMEDIALIB_API DelayInterval const DELAY_ZERO;
+extern LIVEMEDIALIB_API DelayInterval const DELAY_SECOND;
+extern LIVEMEDIALIB_API DelayInterval const DELAY_MINUTE;
+extern LIVEMEDIALIB_API DelayInterval const DELAY_HOUR;
+extern LIVEMEDIALIB_API DelayInterval const DELAY_DAY;
 
 ///// _EventTime /////
 
-class _EventTime: public Timeval {
+class LIVEMEDIALIB_API _EventTime: public Timeval {
 public:
   _EventTime(unsigned secondsSinceEpoch = 0,
 	    unsigned usecondsSinceEpoch = 0)
@@ -132,7 +138,7 @@
 
 ///// DelayQueueEntry /////
 
-class DelayQueueEntry {
+class LIVEMEDIALIB_API DelayQueueEntry {
 public:
   virtual ~DelayQueueEntry();
 
@@ -157,7 +163,7 @@
 
 ///// DelayQueue /////
 
-class DelayQueue: public DelayQueueEntry {
+class LIVEMEDIALIB_API DelayQueue: public DelayQueueEntry {
 public:
   DelayQueue();
   virtual ~DelayQueue();
Index: UsageEnvironment/include/UsageEnvironment.hh
===================================================================
--- UsageEnvironment/include/UsageEnvironment.hh	(revision 14473)
+++ UsageEnvironment/include/UsageEnvironment.hh	(revision 14474)
@@ -19,6 +19,12 @@
 
 #ifndef _USAGE_ENVIRONMENT_HH
 #define _USAGE_ENVIRONMENT_HH
+
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
 
 #ifndef _USAGEENVIRONMENT_VERSION_HH
 #include "UsageEnvironment_version.hh"
@@ -50,7 +56,7 @@
 
 // An abstract base class, subclassed for each use of the library
 
-class UsageEnvironment {
+class LIVEMEDIALIB_API UsageEnvironment {
 public:
   Boolean reclaim();
       // returns True iff we were actually able to delete our object
@@ -103,7 +109,7 @@
 typedef void* TaskToken;
 typedef u_int32_t EventTriggerId;
 
-class TaskScheduler {
+class LIVEMEDIALIB_API TaskScheduler {
 public:
   virtual ~TaskScheduler();
 
Index: UsageEnvironment/include/strDup.hh
===================================================================
--- UsageEnvironment/include/strDup.hh	(revision 14473)
+++ UsageEnvironment/include/strDup.hh	(revision 14474)
@@ -17,6 +17,12 @@
 #ifndef _STRDUP_HH
 #define _STRDUP_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 // Copyright (c) 1996-2016 Live Networks, Inc.  All rights reserved.
 // A C++ equivalent to the standard C routine "strdup()".
 // This generates a char* that can be deleted using "delete[]"
@@ -24,14 +30,14 @@
 
 #include <string.h>
 
-char* strDup(char const* str);
+LIVEMEDIALIB_API char* strDup(char const* str);
 // Note: strDup(NULL) returns NULL
 
-char* strDupSize(char const* str);
+LIVEMEDIALIB_API char* strDupSize(char const* str);
 // Like "strDup()", except that it *doesn't* copy the original.
 // (Instead, it just allocates a string of the same size as the original.)
 
-char* strDupSize(char const* str, size_t& resultBufSize);
+LIVEMEDIALIB_API char* strDupSize(char const* str, size_t& resultBufSize);
 // An alternative form of "strDupSize()" that also returns the size of the allocated buffer.
 
 #endif
Index: groupsock/include/GroupsockHelper.hh
===================================================================
--- groupsock/include/GroupsockHelper.hh	(revision 14473)
+++ groupsock/include/GroupsockHelper.hh	(revision 14474)
@@ -21,6 +21,12 @@
 #ifndef _GROUPSOCK_HELPER_HH
 #define _GROUPSOCK_HELPER_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _NET_ADDRESS_HH
 #include "NetAddress.hh"
 #endif
@@ -45,11 +51,11 @@
 
 void ignoreSigPipeOnSocket(int socketNum);
 
-unsigned getSendBufferSize(UsageEnvironment& env, int socket);
-unsigned getReceiveBufferSize(UsageEnvironment& env, int socket);
-unsigned setSendBufferTo(UsageEnvironment& env,
+LIVEMEDIALIB_API unsigned getSendBufferSize(UsageEnvironment& env, int socket);
+LIVEMEDIALIB_API unsigned getReceiveBufferSize(UsageEnvironment& env, int socket);
+LIVEMEDIALIB_API unsigned setSendBufferTo(UsageEnvironment& env,
 			 int socket, unsigned requestedSize);
-unsigned setReceiveBufferTo(UsageEnvironment& env,
+LIVEMEDIALIB_API unsigned setReceiveBufferTo(UsageEnvironment& env,
 			    int socket, unsigned requestedSize);
 unsigned increaseSendBufferTo(UsageEnvironment& env,
 			      int socket, unsigned requestedSize);
@@ -132,7 +138,7 @@
 
 #if (defined(__WIN32__) || defined(_WIN32)) && !defined(__MINGW32__)
 // For Windoze, we need to implement our own gettimeofday()
-extern int gettimeofday(struct timeval*, int*);
+LIVEMEDIALIB_API extern int gettimeofday(struct timeval*, int*);
 #else
 #include <sys/time.h>
 #endif
Index: groupsock/include/NetAddress.hh
===================================================================
--- groupsock/include/NetAddress.hh	(revision 14473)
+++ groupsock/include/NetAddress.hh	(revision 14474)
@@ -20,6 +20,12 @@
 
 #ifndef _NET_ADDRESS_HH
 #define _NET_ADDRESS_HH
+
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
 
 #ifndef _HASH_TABLE_HH
 #include "HashTable.hh"
@@ -38,7 +44,7 @@
 // to allow for IPv6.
 typedef u_int32_t netAddressBits;
 
-class NetAddress {
+class LIVEMEDIALIB_API NetAddress {
 public:
   NetAddress(u_int8_t const* data,
 	     unsigned length = 4 /* default: 32 bits */);
@@ -59,7 +65,7 @@
   u_int8_t* fData;
 };
 
-class NetAddressList {
+class LIVEMEDIALIB_API NetAddressList {
 public:
   NetAddressList(char const* hostname);
   NetAddressList(NetAddressList const& orig);
@@ -91,7 +97,7 @@
 
 typedef u_int16_t portNumBits;
 
-class Port {
+class LIVEMEDIALIB_API Port {
 public:
   Port(portNumBits num /* in host byte order */);
   
@@ -104,11 +110,11 @@
 #endif
 };
 
-UsageEnvironment& operator<<(UsageEnvironment& s, const Port& p);
+LIVEMEDIALIB_API UsageEnvironment& operator<<(UsageEnvironment& s, const Port& p);
 
 
 // A generic table for looking up objects by (address1, address2, port)
-class AddressPortLookupTable {
+class LIVEMEDIALIB_API AddressPortLookupTable {
 public:
   AddressPortLookupTable();
   virtual ~AddressPortLookupTable();
@@ -138,7 +144,7 @@
 };
 
 
-Boolean IsMulticastAddress(netAddressBits address);
+LIVEMEDIALIB_API Boolean IsMulticastAddress(netAddressBits address);
 
 
 // A mechanism for displaying an IPv4 address in ASCII.  This is intended to replace "inet_ntoa()", which is not thread-safe.
Index: liveMedia/include/AMRAudioFileSink.hh
===================================================================
--- liveMedia/include/AMRAudioFileSink.hh	(revision 14473)
+++ liveMedia/include/AMRAudioFileSink.hh	(revision 14474)
@@ -21,11 +21,17 @@
 #ifndef _AMR_AUDIO_FILE_SINK_HH
 #define _AMR_AUDIO_FILE_SINK_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _FILE_SINK_HH
 #include "FileSink.hh"
 #endif
 
-class AMRAudioFileSink: public FileSink {
+class LIVEMEDIALIB_API AMRAudioFileSink: public FileSink {
 public:
   static AMRAudioFileSink* createNew(UsageEnvironment& env, char const* fileName,
 				     unsigned bufferSize = 10000,
Index: liveMedia/include/AudioInputDevice.hh
===================================================================
--- liveMedia/include/AudioInputDevice.hh	(revision 14473)
+++ liveMedia/include/AudioInputDevice.hh	(revision 14474)
@@ -20,11 +20,17 @@
 #ifndef _AUDIO_INPUT_DEVICE_HH
 #define _AUDIO_INPUT_DEVICE_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _FRAMED_SOURCE_HH
 #include "FramedSource.hh"
 #endif
 
-class AudioPortNames {
+class LIVEMEDIALIB_API AudioPortNames {
 public:
   AudioPortNames();
   virtual ~AudioPortNames();
@@ -33,7 +39,7 @@
   char** portName;
 };
 
-class AudioInputDevice: public FramedSource {
+class LIVEMEDIALIB_API AudioInputDevice: public FramedSource {
 public:
   unsigned char bitsPerSample() const { return fBitsPerSample; }
   unsigned char numChannels() const { return fNumChannels; }
Index: liveMedia/include/BasicUDPSource.hh
===================================================================
--- liveMedia/include/BasicUDPSource.hh	(revision 14473)
+++ liveMedia/include/BasicUDPSource.hh	(revision 14474)
@@ -21,6 +21,12 @@
 #ifndef _BASIC_UDP_SOURCE_HH
 #define _BASIC_UDP_SOURCE_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _FRAMED_SOURCE_HH
 #include "FramedSource.hh"
 #endif
@@ -28,7 +34,7 @@
 #include "Groupsock.hh"
 #endif
 
-class BasicUDPSource: public FramedSource {
+class LIVEMEDIALIB_API BasicUDPSource: public FramedSource {
 public:
   static BasicUDPSource* createNew(UsageEnvironment& env, Groupsock* inputGS);
 
@@ -36,10 +42,12 @@
 
   Groupsock* gs() const { return fInputGS; }
 
-private:
+protected:
+  // IHP: Moving to protected so we can subclass
   BasicUDPSource(UsageEnvironment& env, Groupsock* inputGS);
       // called only by createNew()
 
+private:
   static void incomingPacketHandler(BasicUDPSource* source, int mask);
   void incomingPacketHandler1();
 
Index: liveMedia/include/BitVector.hh
===================================================================
--- liveMedia/include/BitVector.hh	(revision 14473)
+++ liveMedia/include/BitVector.hh	(revision 14474)
@@ -21,11 +21,17 @@
 #ifndef _BIT_VECTOR_HH
 #define _BIT_VECTOR_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _BOOLEAN_HH
 #include "Boolean.hh"
 #endif
 
-class BitVector {
+class LIVEMEDIALIB_API BitVector {
 public:
   BitVector(unsigned char* baseBytePtr,
 	    unsigned baseBitOffset,
Index: liveMedia/include/ByteStreamFileSource.hh
===================================================================
--- liveMedia/include/ByteStreamFileSource.hh	(revision 14473)
+++ liveMedia/include/ByteStreamFileSource.hh	(revision 14474)
@@ -21,11 +21,17 @@
 #ifndef _BYTE_STREAM_FILE_SOURCE_HH
 #define _BYTE_STREAM_FILE_SOURCE_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _FRAMED_FILE_SOURCE_HH
 #include "FramedFileSource.hh"
 #endif
 
-class ByteStreamFileSource: public FramedFileSource {
+class LIVEMEDIALIB_API ByteStreamFileSource: public FramedFileSource {
 public:
   static ByteStreamFileSource* createNew(UsageEnvironment& env,
 					 char const* fileName,
Index: liveMedia/include/ByteStreamMultiFileSource.hh
===================================================================
--- liveMedia/include/ByteStreamMultiFileSource.hh	(revision 14473)
+++ liveMedia/include/ByteStreamMultiFileSource.hh	(revision 14474)
@@ -21,11 +21,17 @@
 #ifndef _BYTE_STREAM_MULTI_FILE_SOURCE_HH
 #define _BYTE_STREAM_MULTI_FILE_SOURCE_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _BYTE_STREAM_FILE_SOURCE_HH
 #include "ByteStreamFileSource.hh"
 #endif
 
-class ByteStreamMultiFileSource: public FramedSource {
+class LIVEMEDIALIB_API ByteStreamMultiFileSource: public FramedSource {
 public:
   static ByteStreamMultiFileSource*
   createNew(UsageEnvironment& env, char const** fileNameArray,
@@ -54,7 +60,9 @@
                                 struct timeval presentationTime,
 				unsigned durationInMicroseconds);
 
-private:
+/** IHP: Subclasses should be able to access these */
+//private:
+protected:
   unsigned fPreferredFrameSize;
   unsigned fPlayTimePerFrame;
   unsigned fNumSources;
Index: liveMedia/include/DigestAuthentication.hh
===================================================================
--- liveMedia/include/DigestAuthentication.hh	(revision 14473)
+++ liveMedia/include/DigestAuthentication.hh	(revision 14474)
@@ -20,6 +20,12 @@
 
 #ifndef _DIGEST_AUTHENTICATION_HH
 #define _DIGEST_AUTHENTICATION_HH
+
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
 
 #ifndef _BOOLEAN_HH
 #include <Boolean.hh>
@@ -29,7 +35,7 @@
 // The "realm", and "nonce" fields are supplied by the server
 // (in a "401 Unauthorized" response).
 // The "username" and "password" fields are supplied by the client.
-class Authenticator {
+class LIVEMEDIALIB_API Authenticator {
 public:
   Authenticator();
   Authenticator(char const* username, char const* password, Boolean passwordIsMD5 = False);
Index: liveMedia/include/FileServerMediaSubsession.hh
===================================================================
--- liveMedia/include/FileServerMediaSubsession.hh	(revision 14473)
+++ liveMedia/include/FileServerMediaSubsession.hh	(revision 14474)
@@ -22,6 +22,12 @@
 #ifndef _FILE_SERVER_MEDIA_SUBSESSION_HH
 #define _FILE_SERVER_MEDIA_SUBSESSION_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _SERVER_MEDIA_SESSION_HH
 #include "ServerMediaSession.hh"
 #endif
@@ -29,7 +35,7 @@
 #include "OnDemandServerMediaSubsession.hh"
 #endif
 
-class FileServerMediaSubsession: public OnDemandServerMediaSubsession {
+class LIVEMEDIALIB_API FileServerMediaSubsession: public OnDemandServerMediaSubsession {
 protected: // we're a virtual base class
   FileServerMediaSubsession(UsageEnvironment& env, char const* fileName,
 			    Boolean reuseFirstSource);
Index: liveMedia/include/FileSink.hh
===================================================================
--- liveMedia/include/FileSink.hh	(revision 14473)
+++ liveMedia/include/FileSink.hh	(revision 14474)
@@ -21,11 +21,17 @@
 #ifndef _FILE_SINK_HH
 #define _FILE_SINK_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _MEDIA_SINK_HH
 #include "MediaSink.hh"
 #endif
 
-class FileSink: public MediaSink {
+class LIVEMEDIALIB_API FileSink: public MediaSink {
 public:
   static FileSink* createNew(UsageEnvironment& env, char const* fileName,
 			     unsigned bufferSize = 20000,
Index: liveMedia/include/FramedFileSource.hh
===================================================================
--- liveMedia/include/FramedFileSource.hh	(revision 14473)
+++ liveMedia/include/FramedFileSource.hh	(revision 14474)
@@ -21,11 +21,17 @@
 #ifndef _FRAMED_FILE_SOURCE_HH
 #define _FRAMED_FILE_SOURCE_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _FRAMED_SOURCE_HH
 #include "FramedSource.hh"
 #endif
 
-class FramedFileSource: public FramedSource {
+class LIVEMEDIALIB_API FramedFileSource: public FramedSource {
 protected:
   FramedFileSource(UsageEnvironment& env, FILE* fid); // abstract base class
   virtual ~FramedFileSource();
Index: liveMedia/include/FramedFilter.hh
===================================================================
--- liveMedia/include/FramedFilter.hh	(revision 14473)
+++ liveMedia/include/FramedFilter.hh	(revision 14474)
@@ -21,11 +21,17 @@
 #ifndef _FRAMED_FILTER_HH
 #define _FRAMED_FILTER_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _FRAMED_SOURCE_HH
 #include "FramedSource.hh"
 #endif
 
-class FramedFilter: public FramedSource {
+class LIVEMEDIALIB_API FramedFilter: public FramedSource {
 public:
   FramedSource* inputSource() const { return fInputSource; }
 
Index: liveMedia/include/FramedSource.hh
===================================================================
--- liveMedia/include/FramedSource.hh	(revision 14473)
+++ liveMedia/include/FramedSource.hh	(revision 14474)
@@ -21,6 +21,12 @@
 #ifndef _FRAMED_SOURCE_HH
 #define _FRAMED_SOURCE_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _NET_COMMON_H
 #include "NetCommon.h"
 #endif
@@ -28,7 +34,7 @@
 #include "MediaSource.hh"
 #endif
 
-class FramedSource: public MediaSource {
+class LIVEMEDIALIB_API FramedSource: public MediaSource {
 public:
   static Boolean lookupByName(UsageEnvironment& env, char const* sourceName,
 			      FramedSource*& resultSource);
Index: liveMedia/include/GenericMediaServer.hh
===================================================================
--- liveMedia/include/GenericMediaServer.hh	(revision 14473)
+++ liveMedia/include/GenericMediaServer.hh	(revision 14474)
@@ -1,192 +1,198 @@
-/**********
-This library is free software; you can redistribute it and/or modify it under
-the terms of the GNU Lesser General Public License as published by the
-Free Software Foundation; either version 2.1 of the License, or (at your
-option) any later version. (See <http://www.gnu.org/copyleft/lesser.html>.)
-
-This library is distributed in the hope that it will be useful, but WITHOUT
-ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
-more details.
-
-You should have received a copy of the GNU Lesser General Public License
-along with this library; if not, write to the Free Software Foundation, Inc.,
-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
-**********/
-// "liveMedia"
-// Copyright (c) 1996-2016 Live Networks, Inc.  All rights reserved.
-// A generic media server class, used to implement a RTSP server, and any other server that uses
-//  "ServerMediaSession" objects to describe media to be served.
-// C++ header
-
-#ifndef _GENERIC_MEDIA_SERVER_HH
-#define _GENERIC_MEDIA_SERVER_HH
-
-#ifndef _MEDIA_HH
-#include "Media.hh"
-#endif
-#ifndef _SERVER_MEDIA_SESSION_HH
-#include "ServerMediaSession.hh"
-#endif
-
-#ifndef REQUEST_BUFFER_SIZE
-#define REQUEST_BUFFER_SIZE 20000 // for incoming requests
-#endif
-#ifndef RESPONSE_BUFFER_SIZE
-#define RESPONSE_BUFFER_SIZE 20000
-#endif
-
-class GenericMediaServer: public Medium {
-public:
-  void addServerMediaSession(ServerMediaSession* serverMediaSession);
-
-  virtual ServerMediaSession*
-  lookupServerMediaSession(char const* streamName, Boolean isFirstLookupInSession = True);
-
-  void removeServerMediaSession(ServerMediaSession* serverMediaSession);
-      // Removes the "ServerMediaSession" object from our lookup table, so it will no longer be accessible by new clients.
-      // (However, any *existing* client sessions that use this "ServerMediaSession" object will continue streaming.
-      //  The "ServerMediaSession" object will not get deleted until all of these client sessions have closed.)
-      // (To both delete the "ServerMediaSession" object *and* close all client sessions that use it,
-      //  call "deleteServerMediaSession(serverMediaSession)" instead.)
-  void removeServerMediaSession(char const* streamName);
-     // ditto
-
-  void closeAllClientSessionsForServerMediaSession(ServerMediaSession* serverMediaSession);
-      // Closes (from the server) all client sessions that are currently using this "ServerMediaSession" object.
-      // Note, however, that the "ServerMediaSession" object remains accessible by new clients.
-  void closeAllClientSessionsForServerMediaSession(char const* streamName);
-     // ditto
-
-  void deleteServerMediaSession(ServerMediaSession* serverMediaSession);
-      // Equivalent to:
-      //     "closeAllClientSessionsForServerMediaSession(serverMediaSession); removeServerMediaSession(serverMediaSession);"
-  void deleteServerMediaSession(char const* streamName);
-      // Equivalent to:
-      //     "closeAllClientSessionsForServerMediaSession(streamName); removeServerMediaSession(streamName);
-
-protected:
-  GenericMediaServer(UsageEnvironment& env, int ourSocket, Port ourPort,
-		     unsigned reclamationSeconds);
-      // If "reclamationSeconds" > 0, then the "ClientSession" state for each client will get
-      // reclaimed if no activity from the client is detected in at least "reclamationSeconds".
-  // we're an abstract base class
-  virtual ~GenericMediaServer();
-  void cleanup(); // MUST be called in the destructor of any subclass of us
-
-  static int setUpOurSocket(UsageEnvironment& env, Port& ourPort);
-
-  static void incomingConnectionHandler(void*, int /*mask*/);
-  void incomingConnectionHandler();
-  void incomingConnectionHandlerOnSocket(int serverSocket);
-
-public: // should be protected, but some old compilers complain otherwise
-  // The state of a TCP connection used by a client:
-  class ClientConnection {
-  protected:
-    ClientConnection(GenericMediaServer& ourServer, int clientSocket, struct sockaddr_in clientAddr);
-    virtual ~ClientConnection();
-
-    UsageEnvironment& envir() { return fOurServer.envir(); }
-    void closeSockets();
-
-    static void incomingRequestHandler(void*, int /*mask*/);
-    void incomingRequestHandler();
-    virtual void handleRequestBytes(int newBytesRead) = 0;
-    void resetRequestBuffer();
-
-  protected:
-    friend class GenericMediaServer;
-    friend class ClientSession;
-    friend class RTSPServer; // needed to make some broken Windows compilers work; remove this in the future when we end support for Windows
-    GenericMediaServer& fOurServer;
-    int fOurSocket;
-    struct sockaddr_in fClientAddr;
-    unsigned char fRequestBuffer[REQUEST_BUFFER_SIZE];
-    unsigned char fResponseBuffer[RESPONSE_BUFFER_SIZE];
-    unsigned fRequestBytesAlreadySeen, fRequestBufferBytesLeft;
-  };
-
-  // The state of an individual client session (using one or more sequential TCP connections) handled by a server:
-  class ClientSession {
-  protected:
-    ClientSession(GenericMediaServer& ourServer, u_int32_t sessionId);
-    virtual ~ClientSession();
-
-    UsageEnvironment& envir() { return fOurServer.envir(); }
-    void noteLiveness();
-    static void noteClientLiveness(ClientSession* clientSession);
-    static void livenessTimeoutTask(ClientSession* clientSession);
-
-  protected:
-    friend class GenericMediaServer;
-    friend class ClientConnection;
-    GenericMediaServer& fOurServer;
-    u_int32_t fOurSessionId;
-    ServerMediaSession* fOurServerMediaSession;
-    TaskToken fLivenessCheckTask;
-  };
-
-protected:
-  virtual ClientConnection* createNewClientConnection(int clientSocket, struct sockaddr_in clientAddr) = 0;
-  virtual ClientSession* createNewClientSession(u_int32_t sessionId) = 0;
-
-  ClientSession* createNewClientSessionWithId();
-      // Generates a new (unused) random session id, and calls the "createNewClientSession()"
-      // virtual function with this session id as parameter.
-
-  // Lookup a "ClientSession" object by sessionId (integer, and string):
-  ClientSession* lookupClientSession(u_int32_t sessionId);
-  ClientSession* lookupClientSession(char const* sessionIdStr);
-
-  // An iterator over our "ServerMediaSession" objects:
-  class ServerMediaSessionIterator {
-  public:
-    ServerMediaSessionIterator(GenericMediaServer& server);
-    virtual ~ServerMediaSessionIterator();
-    ServerMediaSession* next();
-  private:
-    HashTable::Iterator* fOurIterator;
-  };
-
-protected:
-  friend class ClientConnection;
-  friend class ClientSession;	
-  friend class ServerMediaSessionIterator;
-  int fServerSocket;
-  Port fServerPort;
-  unsigned fReclamationSeconds;
-
-private:
-  HashTable* fServerMediaSessions; // maps 'stream name' strings to "ServerMediaSession" objects
-  HashTable* fClientConnections; // the "ClientConnection" objects that we're using
-  HashTable* fClientSessions; // maps 'session id' strings to "ClientSession" objects
-};
-
-// A data structure used for optional user/password authentication:
-
-class UserAuthenticationDatabase {
-public:
-  UserAuthenticationDatabase(char const* realm = NULL,
-			     Boolean passwordsAreMD5 = False);
-    // If "passwordsAreMD5" is True, then each password stored into, or removed from,
-    // the database is actually the value computed
-    // by md5(<username>:<realm>:<actual-password>)
-  virtual ~UserAuthenticationDatabase();
-
-  virtual void addUserRecord(char const* username, char const* password);
-  virtual void removeUserRecord(char const* username);
-
-  virtual char const* lookupPassword(char const* username);
-      // returns NULL if the user name was not present
-
-  char const* realm() { return fRealm; }
-  Boolean passwordsAreMD5() { return fPasswordsAreMD5; }
-
-protected:
-  HashTable* fTable;
-  char* fRealm;
-  Boolean fPasswordsAreMD5;
-};
-
-#endif
+/**********
+This library is free software; you can redistribute it and/or modify it under
+the terms of the GNU Lesser General Public License as published by the
+Free Software Foundation; either version 2.1 of the License, or (at your
+option) any later version. (See <http://www.gnu.org/copyleft/lesser.html>.)
+
+This library is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
+more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with this library; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
+**********/
+// "liveMedia"
+// Copyright (c) 1996-2016 Live Networks, Inc.  All rights reserved.
+// A generic media server class, used to implement a RTSP server, and any other server that uses
+//  "ServerMediaSession" objects to describe media to be served.
+// C++ header
+
+#ifndef _GENERIC_MEDIA_SERVER_HH
+#define _GENERIC_MEDIA_SERVER_HH
+
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
+#ifndef _MEDIA_HH
+#include "Media.hh"
+#endif
+#ifndef _SERVER_MEDIA_SESSION_HH
+#include "ServerMediaSession.hh"
+#endif
+
+#ifndef REQUEST_BUFFER_SIZE
+#define REQUEST_BUFFER_SIZE 20000 // for incoming requests
+#endif
+#ifndef RESPONSE_BUFFER_SIZE
+#define RESPONSE_BUFFER_SIZE 20000
+#endif
+
+class LIVEMEDIALIB_API GenericMediaServer: public Medium {
+public:
+  void addServerMediaSession(ServerMediaSession* serverMediaSession);
+
+  virtual ServerMediaSession*
+  lookupServerMediaSession(char const* streamName, char const* streamParams, Boolean isFirstLookupInSession = True);
+
+  void removeServerMediaSession(ServerMediaSession* serverMediaSession);
+      // Removes the "ServerMediaSession" object from our lookup table, so it will no longer be accessible by new clients.
+      // (However, any *existing* client sessions that use this "ServerMediaSession" object will continue streaming.
+      //  The "ServerMediaSession" object will not get deleted until all of these client sessions have closed.)
+      // (To both delete the "ServerMediaSession" object *and* close all client sessions that use it,
+      //  call "deleteServerMediaSession(serverMediaSession)" instead.)
+  void removeServerMediaSession(char const* streamName);
+     // ditto
+
+  void closeAllClientSessionsForServerMediaSession(ServerMediaSession* serverMediaSession);
+      // Closes (from the server) all client sessions that are currently using this "ServerMediaSession" object.
+      // Note, however, that the "ServerMediaSession" object remains accessible by new clients.
+  void closeAllClientSessionsForServerMediaSession(char const* streamName);
+     // ditto
+
+  void deleteServerMediaSession(ServerMediaSession* serverMediaSession);
+      // Equivalent to:
+      //     "closeAllClientSessionsForServerMediaSession(serverMediaSession); removeServerMediaSession(serverMediaSession);"
+  void deleteServerMediaSession(char const* streamName);
+      // Equivalent to:
+      //     "closeAllClientSessionsForServerMediaSession(streamName); removeServerMediaSession(streamName);
+
+protected:
+  GenericMediaServer(UsageEnvironment& env, int ourSocket, Port ourPort,
+		     unsigned reclamationSeconds);
+      // If "reclamationSeconds" > 0, then the "ClientSession" state for each client will get
+      // reclaimed if no activity from the client is detected in at least "reclamationSeconds".
+  // we're an abstract base class
+  virtual ~GenericMediaServer();
+  void cleanup(); // MUST be called in the destructor of any subclass of us
+
+  static int setUpOurSocket(UsageEnvironment& env, Port& ourPort);
+
+  static void incomingConnectionHandler(void*, int /*mask*/);
+  void incomingConnectionHandler();
+  void incomingConnectionHandlerOnSocket(int serverSocket);
+
+public: // should be protected, but some old compilers complain otherwise
+  // The state of a TCP connection used by a client:
+  class ClientConnection {
+  protected:
+    ClientConnection(GenericMediaServer& ourServer, int clientSocket, struct sockaddr_in clientAddr);
+    virtual ~ClientConnection();
+
+    UsageEnvironment& envir() { return fOurServer.envir(); }
+    void closeSockets();
+
+    static void incomingRequestHandler(void*, int /*mask*/);
+    void incomingRequestHandler();
+    virtual void handleRequestBytes(int newBytesRead) = 0;
+    void resetRequestBuffer();
+
+  protected:
+    friend class GenericMediaServer;
+    friend class ClientSession;
+    friend class RTSPServer; // needed to make some broken Windows compilers work; remove this in the future when we end support for Windows
+    GenericMediaServer& fOurServer;
+    int fOurSocket;
+    struct sockaddr_in fClientAddr;
+    unsigned char fRequestBuffer[REQUEST_BUFFER_SIZE];
+    unsigned char fResponseBuffer[RESPONSE_BUFFER_SIZE];
+    unsigned fRequestBytesAlreadySeen, fRequestBufferBytesLeft;
+  };
+
+  // The state of an individual client session (using one or more sequential TCP connections) handled by a server:
+  class ClientSession {
+  protected:
+    ClientSession(GenericMediaServer& ourServer, u_int32_t sessionId);
+    virtual ~ClientSession();
+
+    UsageEnvironment& envir() { return fOurServer.envir(); }
+    void noteLiveness();
+    static void noteClientLiveness(ClientSession* clientSession);
+    static void livenessTimeoutTask(ClientSession* clientSession);
+
+  protected:
+    friend class GenericMediaServer;
+    friend class ClientConnection;
+    GenericMediaServer& fOurServer;
+    u_int32_t fOurSessionId;
+    ServerMediaSession* fOurServerMediaSession;
+    TaskToken fLivenessCheckTask;
+  };
+
+protected:
+  virtual ClientConnection* createNewClientConnection(int clientSocket, struct sockaddr_in clientAddr) = 0;
+  virtual ClientSession* createNewClientSession(u_int32_t sessionId) = 0;
+
+  ClientSession* createNewClientSessionWithId();
+      // Generates a new (unused) random session id, and calls the "createNewClientSession()"
+      // virtual function with this session id as parameter.
+
+  // Lookup a "ClientSession" object by sessionId (integer, and string):
+  ClientSession* lookupClientSession(u_int32_t sessionId);
+  ClientSession* lookupClientSession(char const* sessionIdStr);
+
+  // An iterator over our "ServerMediaSession" objects:
+  class ServerMediaSessionIterator {
+  public:
+    ServerMediaSessionIterator(GenericMediaServer& server);
+    virtual ~ServerMediaSessionIterator();
+    ServerMediaSession* next();
+  private:
+    HashTable::Iterator* fOurIterator;
+  };
+
+protected:
+  friend class ClientConnection;
+  friend class ClientSession;	
+  friend class ServerMediaSessionIterator;
+  int fServerSocket;
+  Port fServerPort;
+  unsigned fReclamationSeconds;
+
+private:
+  HashTable* fServerMediaSessions; // maps 'stream name' strings to "ServerMediaSession" objects
+  HashTable* fClientConnections; // the "ClientConnection" objects that we're using
+  HashTable* fClientSessions; // maps 'session id' strings to "ClientSession" objects
+};
+
+// A data structure used for optional user/password authentication:
+
+class UserAuthenticationDatabase {
+public:
+  UserAuthenticationDatabase(char const* realm = NULL,
+			     Boolean passwordsAreMD5 = False);
+    // If "passwordsAreMD5" is True, then each password stored into, or removed from,
+    // the database is actually the value computed
+    // by md5(<username>:<realm>:<actual-password>)
+  virtual ~UserAuthenticationDatabase();
+
+  virtual void addUserRecord(char const* username, char const* password);
+  virtual void removeUserRecord(char const* username);
+
+  virtual char const* lookupPassword(char const* username);
+      // returns NULL if the user name was not present
+
+  char const* realm() { return fRealm; }
+  Boolean passwordsAreMD5() { return fPasswordsAreMD5; }
+
+protected:
+  HashTable* fTable;
+  char* fRealm;
+  Boolean fPasswordsAreMD5;
+};
+
+#endif
Index: liveMedia/include/H264VideoFileServerMediaSubsession.hh
===================================================================
--- liveMedia/include/H264VideoFileServerMediaSubsession.hh	(revision 14473)
+++ liveMedia/include/H264VideoFileServerMediaSubsession.hh	(revision 14474)
@@ -22,11 +22,17 @@
 #ifndef _H264_VIDEO_FILE_SERVER_MEDIA_SUBSESSION_HH
 #define _H264_VIDEO_FILE_SERVER_MEDIA_SUBSESSION_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _FILE_SERVER_MEDIA_SUBSESSION_HH
 #include "FileServerMediaSubsession.hh"
 #endif
 
-class H264VideoFileServerMediaSubsession: public FileServerMediaSubsession {
+class LIVEMEDIALIB_API H264VideoFileServerMediaSubsession: public FileServerMediaSubsession {
 public:
   static H264VideoFileServerMediaSubsession*
   createNew(UsageEnvironment& env, char const* fileName, Boolean reuseFirstSource);
Index: liveMedia/include/H264VideoFileSink.hh
===================================================================
--- liveMedia/include/H264VideoFileSink.hh	(revision 14473)
+++ liveMedia/include/H264VideoFileSink.hh	(revision 14474)
@@ -21,11 +21,17 @@
 #ifndef _H264_VIDEO_FILE_SINK_HH
 #define _H264_VIDEO_FILE_SINK_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _H264_OR_5_VIDEO_FILE_SINK_HH
 #include "H264or5VideoFileSink.hh"
 #endif
 
-class H264VideoFileSink: public H264or5VideoFileSink {
+class LIVEMEDIALIB_API H264VideoFileSink: public H264or5VideoFileSink {
 public:
   static H264VideoFileSink* createNew(UsageEnvironment& env, char const* fileName,
 				      char const* sPropParameterSetsStr = NULL,
Index: liveMedia/include/H264VideoRTPSink.hh
===================================================================
--- liveMedia/include/H264VideoRTPSink.hh	(revision 14473)
+++ liveMedia/include/H264VideoRTPSink.hh	(revision 14474)
@@ -21,11 +21,17 @@
 #ifndef _H264_VIDEO_RTP_SINK_HH
 #define _H264_VIDEO_RTP_SINK_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _H264_OR_5_VIDEO_RTP_SINK_HH
 #include "H264or5VideoRTPSink.hh"
 #endif
 
-class H264VideoRTPSink: public H264or5VideoRTPSink {
+class LIVEMEDIALIB_API H264VideoRTPSink: public H264or5VideoRTPSink {
 public:
   static H264VideoRTPSink*
   createNew(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat);
Index: liveMedia/include/H264VideoRTPSource.hh
===================================================================
--- liveMedia/include/H264VideoRTPSource.hh	(revision 14473)
+++ liveMedia/include/H264VideoRTPSource.hh	(revision 14474)
@@ -21,11 +21,17 @@
 #ifndef _H264_VIDEO_RTP_SOURCE_HH
 #define _H264_VIDEO_RTP_SOURCE_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _MULTI_FRAMED_RTP_SOURCE_HH
 #include "MultiFramedRTPSource.hh"
 #endif
 
-class H264VideoRTPSource: public MultiFramedRTPSource {
+class LIVEMEDIALIB_API H264VideoRTPSource: public MultiFramedRTPSource {
 public:
   static H264VideoRTPSource*
   createNew(UsageEnvironment& env, Groupsock* RTPgs,
@@ -51,7 +57,7 @@
   unsigned char fCurPacketNALUnitType;
 };
 
-class SPropRecord {
+class LIVEMEDIALIB_API SPropRecord {
 public:
   ~SPropRecord() { delete[] sPropBytes; }
 
@@ -59,7 +65,7 @@
   unsigned char* sPropBytes;
 };
 
-SPropRecord* parseSPropParameterSets(char const* sPropParameterSetsStr,
+LIVEMEDIALIB_API SPropRecord* parseSPropParameterSets(char const* sPropParameterSetsStr,
 				     // result parameter:
 				     unsigned& numSPropRecords);
     // Returns the binary value of each 'parameter set' specified in a
Index: liveMedia/include/H264VideoStreamDiscreteFramer.hh
===================================================================
--- liveMedia/include/H264VideoStreamDiscreteFramer.hh	(revision 14473)
+++ liveMedia/include/H264VideoStreamDiscreteFramer.hh	(revision 14474)
@@ -24,11 +24,17 @@
 #ifndef _H264_VIDEO_STREAM_DISCRETE_FRAMER_HH
 #define _H264_VIDEO_STREAM_DISCRETE_FRAMER_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _H264_OR_5_VIDEO_STREAM_DISCRETE_FRAMER_HH
 #include "H264or5VideoStreamDiscreteFramer.hh"
 #endif
 
-class H264VideoStreamDiscreteFramer: public H264or5VideoStreamDiscreteFramer {
+class LIVEMEDIALIB_API H264VideoStreamDiscreteFramer: public H264or5VideoStreamDiscreteFramer {
 public:
   static H264VideoStreamDiscreteFramer*
   createNew(UsageEnvironment& env, FramedSource* inputSource);
Index: liveMedia/include/H264VideoStreamFramer.hh
===================================================================
--- liveMedia/include/H264VideoStreamFramer.hh	(revision 14473)
+++ liveMedia/include/H264VideoStreamFramer.hh	(revision 14474)
@@ -21,11 +21,17 @@
 #ifndef _H264_VIDEO_STREAM_FRAMER_HH
 #define _H264_VIDEO_STREAM_FRAMER_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _H264_OR_5_VIDEO_STREAM_FRAMER_HH
 #include "H264or5VideoStreamFramer.hh"
 #endif
 
-class H264VideoStreamFramer: public H264or5VideoStreamFramer {
+class LIVEMEDIALIB_API H264VideoStreamFramer: public H264or5VideoStreamFramer {
 public:
   static H264VideoStreamFramer* createNew(UsageEnvironment& env, FramedSource* inputSource,
 					  Boolean includeStartCodeInOutput = False);
Index: liveMedia/include/H264or5VideoFileSink.hh
===================================================================
--- liveMedia/include/H264or5VideoFileSink.hh	(revision 14473)
+++ liveMedia/include/H264or5VideoFileSink.hh	(revision 14474)
@@ -21,11 +21,17 @@
 #ifndef _H264_OR_5_VIDEO_FILE_SINK_HH
 #define _H264_OR_5_VIDEO_FILE_SINK_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _FILE_SINK_HH
 #include "FileSink.hh"
 #endif
 
-class H264or5VideoFileSink: public FileSink {
+class LIVEMEDIALIB_API H264or5VideoFileSink: public FileSink {
 protected:
   H264or5VideoFileSink(UsageEnvironment& env, FILE* fid,
 		       unsigned bufferSize, char const* perFrameFileNamePrefix,
@@ -38,6 +44,11 @@
 protected: // redefined virtual functions:
   virtual void afterGettingFrame(unsigned frameSize, unsigned numTruncatedBytes, struct timeval presentationTime);
 
+  virtual void writeHeader(unsigned frameSize, struct timeval presentationTime);
+  // IHP: Write out initial file data
+  virtual void writeFrame(unsigned frameSize, unsigned numTruncatedBytes, struct timeval presentationTime);
+  // IHP: Write out the acctual frame (called after any initial file data is written)
+
 private:
   char const* fSPropParameterSetsStr[3];
   Boolean fHaveWrittenFirstFrame;
Index: liveMedia/include/H264or5VideoRTPSink.hh
===================================================================
--- liveMedia/include/H264or5VideoRTPSink.hh	(revision 14473)
+++ liveMedia/include/H264or5VideoRTPSink.hh	(revision 14474)
@@ -21,6 +21,12 @@
 #ifndef _H264_OR_5_VIDEO_RTP_SINK_HH
 #define _H264_OR_5_VIDEO_RTP_SINK_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _VIDEO_RTP_SINK_HH
 #include "VideoRTPSink.hh"
 #endif
@@ -28,7 +34,7 @@
 #include "FramedFilter.hh"
 #endif
 
-class H264or5VideoRTPSink: public VideoRTPSink {
+class LIVEMEDIALIB_API H264or5VideoRTPSink: public VideoRTPSink {
 protected:
   H264or5VideoRTPSink(int hNumber, // 264 or 265
 		      UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat,
@@ -40,6 +46,9 @@
 
 private: // redefined virtual functions:
   virtual Boolean continuePlaying();
+
+protected:
+  // IHP: Making this protected so we can subclass it
   virtual void doSpecialFrameHandling(unsigned fragmentationOffset,
                                       unsigned char* frameStart,
                                       unsigned numBytesInFrame,
Index: liveMedia/include/InputFile.hh
===================================================================
--- liveMedia/include/InputFile.hh	(revision 14473)
+++ liveMedia/include/InputFile.hh	(revision 14474)
@@ -21,6 +21,12 @@
 #ifndef _INPUT_FILE_HH
 #define _INPUT_FILE_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #include <UsageEnvironment.hh>
 #include <stdio.h>
 
@@ -46,21 +52,21 @@
 #include <sys/stat.h>
 #endif
 
-FILE* OpenInputFile(UsageEnvironment& env, char const* fileName);
+LIVEMEDIALIB_API FILE* OpenInputFile(UsageEnvironment& env, char const* fileName);
 
-void CloseInputFile(FILE* fid);
+LIVEMEDIALIB_API void CloseInputFile(FILE* fid);
 
-u_int64_t GetFileSize(char const* fileName, FILE* fid);
+LIVEMEDIALIB_API u_int64_t GetFileSize(char const* fileName, FILE* fid);
     // 0 means zero-length, unbounded, or unknown
 
-int64_t SeekFile64(FILE *fid, int64_t offset, int whence);
+LIVEMEDIALIB_API int64_t SeekFile64(FILE *fid, int64_t offset, int whence);
     // A platform-independent routine for seeking within (possibly) large files
 
-int64_t TellFile64(FILE *fid);
+LIVEMEDIALIB_API int64_t TellFile64(FILE *fid);
     // A platform-independent routine for reporting the position within
     // (possibly) large files
 
-Boolean FileIsSeekable(FILE *fid);
+LIVEMEDIALIB_API Boolean FileIsSeekable(FILE *fid);
     // Tests whether "fid" is seekable, by trying to seek within it.
 
 #endif
Index: liveMedia/include/JPEGVideoRTPSource.hh
===================================================================
--- liveMedia/include/JPEGVideoRTPSource.hh	(revision 14473)
+++ liveMedia/include/JPEGVideoRTPSource.hh	(revision 14474)
@@ -21,6 +21,12 @@
 #ifndef _JPEG_VIDEO_RTP_SOURCE_HH
 #define _JPEG_VIDEO_RTP_SOURCE_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _MULTI_FRAMED_RTP_SOURCE_HH
 #include "MultiFramedRTPSource.hh"
 #endif
@@ -27,7 +33,7 @@
 
 #define MAX_JPEG_HEADER_SIZE 1024
 
-class JPEGVideoRTPSource: public MultiFramedRTPSource {
+class LIVEMEDIALIB_API JPEGVideoRTPSource: public MultiFramedRTPSource {
 public:
   static JPEGVideoRTPSource*
   createNew(UsageEnvironment& env, Groupsock* RTPgs,
@@ -38,7 +44,7 @@
 protected:
   virtual ~JPEGVideoRTPSource();
 
-private:
+  // IHP: Moving this to protected so we can subclass
   JPEGVideoRTPSource(UsageEnvironment& env, Groupsock* RTPgs,
 		     unsigned char rtpPayloadFormat,
 		     unsigned rtpTimestampFrequency,
@@ -45,6 +51,7 @@
 		     unsigned defaultWidth, unsigned defaultHeight);
       // called only by createNew()
 
+private:
   // Image dimensions from the SDP description, if any
   unsigned fDefaultWidth, fDefaultHeight;
 
Index: liveMedia/include/MPEG4ESVideoRTPSink.hh
===================================================================
--- liveMedia/include/MPEG4ESVideoRTPSink.hh	(revision 14473)
+++ liveMedia/include/MPEG4ESVideoRTPSink.hh	(revision 14474)
@@ -21,11 +21,17 @@
 #ifndef _MPEG4ES_VIDEO_RTP_SINK_HH
 #define _MPEG4ES_VIDEO_RTP_SINK_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _VIDEO_RTP_SINK_HH
 #include "VideoRTPSink.hh"
 #endif
 
-class MPEG4ESVideoRTPSink: public VideoRTPSink {
+class LIVEMEDIALIB_API MPEG4ESVideoRTPSink: public VideoRTPSink {
 public:
   static MPEG4ESVideoRTPSink* createNew(UsageEnvironment& env,
 					Groupsock* RTPgs, unsigned char rtpPayloadFormat,
Index: liveMedia/include/MPEG4ESVideoRTPSource.hh
===================================================================
--- liveMedia/include/MPEG4ESVideoRTPSource.hh	(revision 14473)
+++ liveMedia/include/MPEG4ESVideoRTPSource.hh	(revision 14474)
@@ -21,11 +21,17 @@
 #ifndef _MPEG4_ES_VIDEO_RTP_SOURCE_HH
 #define _MPEG4_ES_VIDEO_RTP_SOURCE_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _MULTI_FRAMED_RTP_SOURCE_HH
 #include "MultiFramedRTPSource.hh"
 #endif
 
-class MPEG4ESVideoRTPSource: public MultiFramedRTPSource {
+class LIVEMEDIALIB_API MPEG4ESVideoRTPSource: public MultiFramedRTPSource {
 public:
   static MPEG4ESVideoRTPSource*
   createNew(UsageEnvironment& env, Groupsock* RTPgs,
@@ -35,7 +41,7 @@
 protected:
   virtual ~MPEG4ESVideoRTPSource();
 
-private:
+  // IHP: Moving to protected so we can subclass
   MPEG4ESVideoRTPSource(UsageEnvironment& env, Groupsock* RTPgs,
 			unsigned char rtpPayloadFormat,
 			unsigned rtpTimestampFrequency);
Index: liveMedia/include/MPEG4GenericRTPSink.hh
===================================================================
--- liveMedia/include/MPEG4GenericRTPSink.hh	(revision 14473)
+++ liveMedia/include/MPEG4GenericRTPSink.hh	(revision 14474)
@@ -21,11 +21,17 @@
 #ifndef _MPEG4_GENERIC_RTP_SINK_HH
 #define _MPEG4_GENERIC_RTP_SINK_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _MULTI_FRAMED_RTP_SINK_HH
 #include "MultiFramedRTPSink.hh"
 #endif
 
-class MPEG4GenericRTPSink: public MultiFramedRTPSink {
+class LIVEMEDIALIB_API MPEG4GenericRTPSink: public MultiFramedRTPSink {
 public:
   static MPEG4GenericRTPSink*
   createNew(UsageEnvironment& env, Groupsock* RTPgs,
Index: liveMedia/include/MPEG4GenericRTPSource.hh
===================================================================
--- liveMedia/include/MPEG4GenericRTPSource.hh	(revision 14473)
+++ liveMedia/include/MPEG4GenericRTPSource.hh	(revision 14474)
@@ -20,12 +20,18 @@
 
 #ifndef _MPEG4_GENERIC_RTP_SOURCE_HH
 #define _MPEG4_GENERIC_RTP_SOURCE_HH
+
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
 
 #ifndef _MULTI_FRAMED_RTP_SOURCE_HH
 #include "MultiFramedRTPSource.hh"
 #endif
 
-class MPEG4GenericRTPSource: public MultiFramedRTPSource {
+class LIVEMEDIALIB_API MPEG4GenericRTPSource: public MultiFramedRTPSource {
 public:
   static MPEG4GenericRTPSource*
   createNew(UsageEnvironment& env, Groupsock* RTPgs,
@@ -42,7 +48,7 @@
 protected:
   virtual ~MPEG4GenericRTPSource();
 
-private:
+  // IHP: Moving to protected so we can subclass
   MPEG4GenericRTPSource(UsageEnvironment& env, Groupsock* RTPgs,
 			unsigned char rtpPayloadFormat,
 			unsigned rtpTimestampFrequency,
@@ -75,6 +81,6 @@
 
 // A function that looks up the sampling frequency from an
 // "AudioSpecificConfig" string.  (0 means 'unknown')
-unsigned samplingFrequencyFromAudioSpecificConfig(char const* configStr);
+LIVEMEDIALIB_API unsigned samplingFrequencyFromAudioSpecificConfig(char const* configStr);
 
 #endif
Index: liveMedia/include/MPEG4LATMAudioRTPSource.hh
===================================================================
--- liveMedia/include/MPEG4LATMAudioRTPSource.hh	(revision 14473)
+++ liveMedia/include/MPEG4LATMAudioRTPSource.hh	(revision 14474)
@@ -21,6 +21,12 @@
 #ifndef _MPEG4_LATM_AUDIO_RTP_SOURCE_HH
 #define _MPEG4_LATM_AUDIO_RTP_SOURCE_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _MULTI_FRAMED_RTP_SOURCE_HH
 #include "MultiFramedRTPSource.hh"
 #endif
@@ -92,7 +98,7 @@
     // (or NULL) if the parsing failed, without bothering with the other
     // result parameters.
 
-unsigned char* parseGeneralConfigStr(char const* configStr,
+LIVEMEDIALIB_API unsigned char* parseGeneralConfigStr(char const* configStr,
 				     // result parameter:
 				     unsigned& configSize);
     // A routine that parses an arbitrary config string, returning
Index: liveMedia/include/MPEG4VideoFileServerMediaSubsession.hh
===================================================================
--- liveMedia/include/MPEG4VideoFileServerMediaSubsession.hh	(revision 14473)
+++ liveMedia/include/MPEG4VideoFileServerMediaSubsession.hh	(revision 14474)
@@ -22,11 +22,17 @@
 #ifndef _MPEG4_VIDEO_FILE_SERVER_MEDIA_SUBSESSION_HH
 #define _MPEG4_VIDEO_FILE_SERVER_MEDIA_SUBSESSION_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _FILE_SERVER_MEDIA_SUBSESSION_HH
 #include "FileServerMediaSubsession.hh"
 #endif
 
-class MPEG4VideoFileServerMediaSubsession: public FileServerMediaSubsession{
+class LIVEMEDIALIB_API MPEG4VideoFileServerMediaSubsession: public FileServerMediaSubsession{
 public:
   static MPEG4VideoFileServerMediaSubsession*
   createNew(UsageEnvironment& env, char const* fileName, Boolean reuseFirstSource);
Index: liveMedia/include/MPEG4VideoStreamDiscreteFramer.hh
===================================================================
--- liveMedia/include/MPEG4VideoStreamDiscreteFramer.hh	(revision 14473)
+++ liveMedia/include/MPEG4VideoStreamDiscreteFramer.hh	(revision 14474)
@@ -24,11 +24,17 @@
 #ifndef _MPEG4_VIDEO_STREAM_DISCRETE_FRAMER_HH
 #define _MPEG4_VIDEO_STREAM_DISCRETE_FRAMER_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _MPEG4_VIDEO_STREAM_FRAMER_HH
 #include "MPEG4VideoStreamFramer.hh"
 #endif
 
-class MPEG4VideoStreamDiscreteFramer: public MPEG4VideoStreamFramer {
+class LIVEMEDIALIB_API MPEG4VideoStreamDiscreteFramer: public MPEG4VideoStreamFramer {
 public:
   static MPEG4VideoStreamDiscreteFramer*
   createNew(UsageEnvironment& env, FramedSource* inputSource, Boolean leavePresentationTimesUnmodified = False);
Index: liveMedia/include/MPEG4VideoStreamFramer.hh
===================================================================
--- liveMedia/include/MPEG4VideoStreamFramer.hh	(revision 14473)
+++ liveMedia/include/MPEG4VideoStreamFramer.hh	(revision 14474)
@@ -26,11 +26,17 @@
 #ifndef _MPEG4_VIDEO_STREAM_FRAMER_HH
 #define _MPEG4_VIDEO_STREAM_FRAMER_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _MPEG_VIDEO_STREAM_FRAMER_HH
 #include "MPEGVideoStreamFramer.hh"
 #endif
 
-class MPEG4VideoStreamFramer: public MPEGVideoStreamFramer {
+class LIVEMEDIALIB_API MPEG4VideoStreamFramer: public MPEGVideoStreamFramer {
 public:
   static MPEG4VideoStreamFramer*
   createNew(UsageEnvironment& env, FramedSource* inputSource);
Index: liveMedia/include/MPEGVideoStreamFramer.hh
===================================================================
--- liveMedia/include/MPEGVideoStreamFramer.hh	(revision 14473)
+++ liveMedia/include/MPEGVideoStreamFramer.hh	(revision 14474)
@@ -22,11 +22,17 @@
 #ifndef _MPEG_VIDEO_STREAM_FRAMER_HH
 #define _MPEG_VIDEO_STREAM_FRAMER_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _FRAMED_FILTER_HH
 #include "FramedFilter.hh"
 #endif
 
-class TimeCode {
+class LIVEMEDIALIB_API TimeCode {
 public:
   TimeCode();
   virtual ~TimeCode();
@@ -35,7 +41,7 @@
   unsigned days, hours, minutes, seconds, pictures;
 };
 
-class MPEGVideoStreamFramer: public FramedFilter {
+class LIVEMEDIALIB_API MPEGVideoStreamFramer: public FramedFilter {
 public:
   Boolean& pictureEndMarker() { return fPictureEndMarker; }
       // a hack for implementing the RTP 'M' bit
Index: liveMedia/include/Media.hh
===================================================================
--- liveMedia/include/Media.hh	(revision 14473)
+++ liveMedia/include/Media.hh	(revision 14474)
@@ -21,6 +21,12 @@
 #ifndef _MEDIA_HH
 #define _MEDIA_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _LIVEMEDIA_VERSION_HH
 #include "liveMedia_version.hh"
 #endif
@@ -47,7 +53,7 @@
 
 #define mediumNameMaxLen 30
 
-class Medium {
+class LIVEMEDIALIB_API Medium {
 public:
   static Boolean lookupByName(UsageEnvironment& env,
 			      char const* mediumName,
Index: liveMedia/include/MediaSession.hh
===================================================================
--- liveMedia/include/MediaSession.hh	(revision 14473)
+++ liveMedia/include/MediaSession.hh	(revision 14474)
@@ -48,6 +48,12 @@
 #ifndef _MEDIA_SESSION_HH
 #define _MEDIA_SESSION_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _RTCP_HH
 #include "RTCP.hh"
 #endif
@@ -57,7 +63,7 @@
 
 class MediaSubsession; // forward
 
-class MediaSession: public Medium {
+class LIVEMEDIALIB_API MediaSession: public Medium {
 public:
   static MediaSession* createNew(UsageEnvironment& env,
 				 char const* sdpDescription);
@@ -141,7 +147,7 @@
 };
 
 
-class MediaSubsessionIterator {
+class LIVEMEDIALIB_API MediaSubsessionIterator {
 public:
   MediaSubsessionIterator(MediaSession const& session);
   virtual ~MediaSubsessionIterator();
@@ -155,7 +161,7 @@
 };
 
 
-class MediaSubsession {
+class LIVEMEDIALIB_API MediaSubsession {
 public:
   MediaSession& parentSession() { return fParent; }
   MediaSession const& parentSession() const { return fParent; }
Index: liveMedia/include/MediaSink.hh
===================================================================
--- liveMedia/include/MediaSink.hh	(revision 14473)
+++ liveMedia/include/MediaSink.hh	(revision 14474)
@@ -20,12 +20,18 @@
 
 #ifndef _MEDIA_SINK_HH
 #define _MEDIA_SINK_HH
+
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
 
 #ifndef _FRAMED_SOURCE_HH
 #include "FramedSource.hh"
 #endif
 
-class MediaSink: public Medium {
+class LIVEMEDIALIB_API MediaSink: public Medium {
 public:
   static Boolean lookupByName(UsageEnvironment& env, char const* sinkName,
 			      MediaSink*& resultSink);
@@ -68,7 +74,7 @@
 };
 
 // A data structure that a sink may use for an output packet:
-class OutPacketBuffer {
+class LIVEMEDIALIB_API OutPacketBuffer {
 public:
   OutPacketBuffer(unsigned preferredPacketSize, unsigned maxPacketSize,
 		  unsigned maxBufferSize = 0);
Index: liveMedia/include/MediaSource.hh
===================================================================
--- liveMedia/include/MediaSource.hh	(revision 14473)
+++ liveMedia/include/MediaSource.hh	(revision 14474)
@@ -21,11 +21,17 @@
 #ifndef _MEDIA_SOURCE_HH
 #define _MEDIA_SOURCE_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _MEDIA_HH
 #include "Media.hh"
 #endif
 
-class MediaSource: public Medium {
+class LIVEMEDIALIB_API MediaSource: public Medium {
 public:
   static Boolean lookupByName(UsageEnvironment& env, char const* sourceName,
 			      MediaSource*& resultSource);
Index: liveMedia/include/MetaDataRTPSink.hh
===================================================================
--- liveMedia/include/MetaDataRTPSink.hh	(nonexistent)
+++ liveMedia/include/MetaDataRTPSink.hh	(revision 14474)
@@ -0,0 +1,88 @@
+/**********
+This library is free software; you can redistribute it and/or modify it under
+the terms of the GNU Lesser General Public License as published by the
+Free Software Foundation; either version 2.1 of the License, or (at your
+option) any later version. (See <http://www.gnu.org/copyleft/lesser.html>.)
+
+This library is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
+more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with this library; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
+**********/
+
+////////////////////////////////////////////////////////////////////
+// Copyright 2011 intuVision, inc.
+// intuVision open source - all rights reserved.
+//
+// FILENAME : MetaDataRTPSink.hh
+// AUTHORS  : Ashutosh Morde
+//            intuVision, Inc.
+//            10 Tower Park, Suite 200
+//            Woburn, MA  01801
+//            Email: ashu@intuvisiontech.com
+// DATE     : March 11, 2011
+// DERIVED  : SimpleRTPSink.hh
+////////////////////////////////////////////////////////////////////
+
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
+#ifndef _METADATA_RTP_SINK_HH
+#define _METADATA_RTP_SINK_HH
+
+#ifndef _MULTI_FRAMED_RTP_SINK_HH
+#include "MultiFramedRTPSink.hh"
+#endif
+
+class LIVEMEDIALIB_API MetaDataRTPSink: public MultiFramedRTPSink {
+public:
+  static MetaDataRTPSink*
+  createNew(UsageEnvironment& env, Groupsock* RTPgs,
+	    unsigned char rtpPayloadFormat,
+	    unsigned rtpTimestampFrequency,
+	    char const* sdpMediaTypeString,
+	    char const* rtpPayloadFormatName,
+	    unsigned numChannels = 1,
+	    Boolean allowMultipleFramesPerPacket = True,
+	    Boolean doNormalMBitRule = True);
+  // "doNormalMBitRule" means: If the medium is video, set the RTP "M"
+  // bit on each outgoing packet iff it contains the last (or only)
+  // fragment of a frame.  (Otherwise, leave the "M" bit unset.)
+protected:
+  MetaDataRTPSink(UsageEnvironment& env, Groupsock* RTPgs,
+		unsigned char rtpPayloadFormat,
+		unsigned rtpTimestampFrequency,
+		char const* sdpMediaTypeString,
+		char const* rtpPayloadFormatName,
+		unsigned numChannels,
+		Boolean allowMultipleFramesPerPacket,
+		Boolean doNormalMBitRule);
+	// called only by createNew()
+
+  virtual ~MetaDataRTPSink();
+
+protected: // redefined virtual functions
+  virtual void doSpecialFrameHandling(unsigned fragmentationOffset,
+                                      unsigned char* frameStart,
+                                      unsigned numBytesInFrame,
+                                      struct timeval frameTimestamp,
+                                      unsigned numRemainingBytes);
+  virtual
+  Boolean frameCanAppearAfterPacketStart(unsigned char const* frameStart,
+					 unsigned numBytesInFrame) const;
+  virtual char const* sdpMediaType() const;
+
+private:
+  char const* fSDPMediaTypeString;
+  Boolean fAllowMultipleFramesPerPacket;
+  Boolean fSetMBitOnLastFrames;
+};
+
+#endif
Index: liveMedia/include/MultiFramedRTPSink.hh
===================================================================
--- liveMedia/include/MultiFramedRTPSink.hh	(revision 14473)
+++ liveMedia/include/MultiFramedRTPSink.hh	(revision 14474)
@@ -22,11 +22,17 @@
 #ifndef _MULTI_FRAMED_RTP_SINK_HH
 #define _MULTI_FRAMED_RTP_SINK_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _RTP_SINK_HH
 #include "RTPSink.hh"
 #endif
 
-class MultiFramedRTPSink: public RTPSink {
+class LIVEMEDIALIB_API MultiFramedRTPSink: public RTPSink {
 public:
   void setPacketSizes(unsigned preferredPacketSize, unsigned maxPacketSize);
 
@@ -115,9 +121,11 @@
 
   static void ourHandleClosure(void* clientData);
 
-private:
+protected:
+  // IHP: Need access to this for subclasses
   OutPacketBuffer* fOutBuf;
 
+private:
   Boolean fNoFramesLeft;
   unsigned fNumFramesUsedSoFar;
   unsigned fCurFragmentationOffset;
Index: liveMedia/include/MultiFramedRTPSource.hh
===================================================================
--- liveMedia/include/MultiFramedRTPSource.hh	(revision 14473)
+++ liveMedia/include/MultiFramedRTPSource.hh	(revision 14474)
@@ -22,6 +22,12 @@
 #ifndef _MULTI_FRAMED_RTP_SOURCE_HH
 #define _MULTI_FRAMED_RTP_SOURCE_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _RTP_SOURCE_HH
 #include "RTPSource.hh"
 #endif
@@ -29,7 +35,7 @@
 class BufferedPacket; // forward
 class BufferedPacketFactory; // forward
 
-class MultiFramedRTPSource: public RTPSource {
+class LIVEMEDIALIB_API MultiFramedRTPSource: public RTPSource {
 protected:
   MultiFramedRTPSource(UsageEnvironment& env, Groupsock* RTPgs,
 		       unsigned char rtpPayloadFormat,
@@ -55,6 +61,16 @@
   // redefined virtual functions:
   virtual void doStopGettingFrames();
 
+  // IHP: pre-process a data packet
+  virtual void doSpecialPreprocessing(BufferedPacket* packet, unsigned rtpHdr) {}
+
+  // IHP: post-process a data frame
+  virtual void doSpecialPostprocessing( Boolean isEmpty ) {}
+
+  // IHP: Moving these up so we can access them in post-processing
+  unsigned char* fSavedTo;
+  unsigned fSavedMaxSize;
+
 private:
   // redefined virtual functions:
   virtual void doGetNextFrame();
@@ -71,8 +87,6 @@
   BufferedPacket* fPacketReadInProgress;
   Boolean fNeedDelivery;
   Boolean fPacketLossInFragmentedFrame;
-  unsigned char* fSavedTo;
-  unsigned fSavedMaxSize;
 
   // A buffer to (optionally) hold incoming pkts that have been reorderered
   class ReorderingPacketBuffer* fReorderingBuffer;
Index: liveMedia/include/OnDemandServerMediaSubsession.hh
===================================================================
--- liveMedia/include/OnDemandServerMediaSubsession.hh	(revision 14473)
+++ liveMedia/include/OnDemandServerMediaSubsession.hh	(revision 14474)
@@ -22,6 +22,12 @@
 #ifndef _ON_DEMAND_SERVER_MEDIA_SUBSESSION_HH
 #define _ON_DEMAND_SERVER_MEDIA_SUBSESSION_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _SERVER_MEDIA_SESSION_HH
 #include "ServerMediaSession.hh"
 #endif
@@ -35,7 +41,7 @@
 #include "RTCP.hh"
 #endif
 
-class OnDemandServerMediaSubsession: public ServerMediaSubsession {
+class LIVEMEDIALIB_API OnDemandServerMediaSubsession: public ServerMediaSubsession {
 protected: // we're a virtual base class
   OnDemandServerMediaSubsession(UsageEnvironment& env, Boolean reuseFirstSource,
 				portNumBits initialPortNum = 6970,
@@ -92,6 +98,9 @@
   virtual void setStreamSourceDuration(FramedSource* inputSource, double streamDuration, u_int64_t& numBytes);
   virtual void closeStreamSource(FramedSource* inputSource);
 
+  // IHP: adding more info to 'a=control'
+  virtual char const* getControlSPDLine( );
+
 protected: // new virtual functions, defined by all subclasses
   virtual FramedSource* createNewStreamSource(unsigned clientSessionId,
 					      unsigned& estBitrate) = 0;
@@ -134,6 +143,9 @@
   char* fSDPLines;
   HashTable* fDestinationsHashTable; // indexed by client session id
 
+  // IHP: adding more info to 'a=control'
+  const char* fControlLine;
+
 private:
   Boolean fReuseFirstSource;
   portNumBits fInitialPortNum;
Index: liveMedia/include/OutputFile.hh
===================================================================
--- liveMedia/include/OutputFile.hh	(revision 14473)
+++ liveMedia/include/OutputFile.hh	(revision 14474)
@@ -20,12 +20,18 @@
 
 #ifndef _OUTPUT_FILE_HH
 #define _OUTPUT_FILE_HH
+
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
 
 #include <UsageEnvironment.hh>
 #include <stdio.h>
 
-FILE* OpenOutputFile(UsageEnvironment& env, char const* fileName);
+LIVEMEDIALIB_API FILE* OpenOutputFile(UsageEnvironment& env, char const* fileName);
 
-void CloseOutputFile(FILE* fid);
+LIVEMEDIALIB_API void CloseOutputFile(FILE* fid);
 
 #endif
Index: liveMedia/include/RTCP.hh
===================================================================
--- liveMedia/include/RTCP.hh	(revision 14473)
+++ liveMedia/include/RTCP.hh	(revision 14474)
@@ -21,6 +21,12 @@
 #ifndef _RTCP_HH
 #define _RTCP_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _RTP_SINK_HH
 #include "RTPSink.hh"
 #endif
@@ -28,7 +34,7 @@
 #include "RTPSource.hh"
 #endif
 
-class SDESItem {
+class LIVEMEDIALIB_API SDESItem {
 public:
   SDESItem(unsigned char tag, unsigned char const* value);
 
@@ -45,7 +51,7 @@
 
 class RTCPMemberDatabase; // forward
 
-class RTCPInstance: public Medium {
+class LIVEMEDIALIB_API RTCPInstance: public Medium {
 public:
   static RTCPInstance* createNew(UsageEnvironment& env, Groupsock* RTCPgs,
 				 unsigned totSessionBW, /* in kbps */
Index: liveMedia/include/RTPInterface.hh
===================================================================
--- liveMedia/include/RTPInterface.hh	(revision 14473)
+++ liveMedia/include/RTPInterface.hh	(revision 14474)
@@ -23,6 +23,12 @@
 #ifndef _RTP_INTERFACE_HH
 #define _RTP_INTERFACE_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _MEDIA_HH
 #include <Media.hh>
 #endif
@@ -52,7 +58,7 @@
   unsigned char fStreamChannelId;
 };
 
-class RTPInterface {
+class LIVEMEDIALIB_API RTPInterface {
 public:
   RTPInterface(Medium* owner, Groupsock* gs);
   virtual ~RTPInterface();
Index: liveMedia/include/RTPSink.hh
===================================================================
--- liveMedia/include/RTPSink.hh	(revision 14473)
+++ liveMedia/include/RTPSink.hh	(revision 14474)
@@ -21,6 +21,12 @@
 #ifndef _RTP_SINK_HH
 #define _RTP_SINK_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _MEDIA_SINK_HH
 #include "MediaSink.hh"
 #endif
@@ -30,7 +36,7 @@
 
 class RTPTransmissionStatsDB; // forward
 
-class RTPSink: public MediaSink {
+class LIVEMEDIALIB_API RTPSink: public MediaSink {
 public:
   static Boolean lookupByName(UsageEnvironment& env, char const* sinkName,
 			      RTPSink*& resultSink);
@@ -133,7 +139,7 @@
 
 class RTPTransmissionStats; // forward
 
-class RTPTransmissionStatsDB {
+class LIVEMEDIALIB_API RTPTransmissionStatsDB {
 public:
   unsigned numReceivers() const { return fNumReceivers; }
 
@@ -174,7 +180,7 @@
   HashTable* fTable;
 };
 
-class RTPTransmissionStats {
+class LIVEMEDIALIB_API RTPTransmissionStats {
 public:
   u_int32_t SSRC() const {return fSSRC;}
   struct sockaddr_in const& lastFromAddress() const {return fLastFromAddress;}
Index: liveMedia/include/RTPSource.hh
===================================================================
--- liveMedia/include/RTPSource.hh	(revision 14473)
+++ liveMedia/include/RTPSource.hh	(revision 14474)
@@ -21,6 +21,12 @@
 #ifndef _RTP_SOURCE_HH
 #define _RTP_SOURCE_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _FRAMED_SOURCE_HH
 #include "FramedSource.hh"
 #endif
@@ -30,7 +36,7 @@
 
 class RTPReceptionStatsDB; // forward
 
-class RTPSource: public FramedSource {
+class LIVEMEDIALIB_API RTPSource: public FramedSource {
 public:
   static Boolean lookupByName(UsageEnvironment& env, char const* sourceName,
 			      RTPSource*& resultSource);
Index: liveMedia/include/RTSPClient.hh
===================================================================
--- liveMedia/include/RTSPClient.hh	(revision 14473)
+++ liveMedia/include/RTSPClient.hh	(revision 14474)
@@ -21,6 +21,12 @@
 #ifndef _RTSP_CLIENT_HH
 #define _RTSP_CLIENT_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _MEDIA_SESSION_HH
 #include "MediaSession.hh"
 #endif
@@ -36,7 +42,7 @@
 #endif
 #endif
 
-class RTSPClient: public Medium {
+class LIVEMEDIALIB_API RTSPClient: public Medium {
 public:
   static RTSPClient* createNew(UsageEnvironment& env, char const* rtspURL,
 			       int verbosityLevel = 0,
@@ -179,6 +185,9 @@
   void setUserAgentString(char const* userAgentName);
       // sets an alternative string to be used in RTSP "User-Agent:" headers
 
+  // IHP: Adding extra headers for SETUP
+  void setExtraSetupHeaders(char const* extraSetupHeaders);
+
   void disallowBasicAuthentication() { fAllowBasicAuthentication = False; }
       // call this if you don't want the server to request 'Basic' authentication
       // (which would cause the client to send usernames and passwords over the net).
@@ -191,7 +200,7 @@
 
 public: // Some compilers complain if this is "private:"
   // The state of a request-in-progress:
-  class RequestRecord {
+  class LIVEMEDIALIB_API RequestRecord {
   public:
     RequestRecord(unsigned cseq, char const* commandName, responseHandler* handler,
 		  MediaSession* session = NULL, MediaSubsession* subsession = NULL, u_int32_t booleanFlags = 0,
@@ -344,6 +353,10 @@
   char fSessionCookie[33];
   unsigned fSessionCookieCounter;
   Boolean fHTTPTunnelingConnectionIsPending;
+
+  // IHP: Adding extra headers for SETUP
+  char* fExtraSetupHeaderStr;
+  unsigned fExtraSetupHeaderStrLen;
 };
 
 
Index: liveMedia/include/RTSPCommon.hh
===================================================================
--- liveMedia/include/RTSPCommon.hh	(revision 14473)
+++ liveMedia/include/RTSPCommon.hh	(revision 14474)
@@ -45,6 +45,8 @@
 			       unsigned resultURLPreSuffixMaxSize,
 			       char* resultURLSuffix,
 			       unsigned resultURLSuffixMaxSize,
+             char* resultURLParams, // IHP: Added url param parsing
+             unsigned resultURLParamsMaxSize, // IHP: Added url param parsing
 			       char* resultCSeq,
 			       unsigned resultCSeqMaxSize,
 			       char* resultSessionId,
Index: liveMedia/include/RTSPServer.hh
===================================================================
--- liveMedia/include/RTSPServer.hh	(revision 14473)
+++ liveMedia/include/RTSPServer.hh	(revision 14474)
@@ -1,322 +1,335 @@
-/**********
-This library is free software; you can redistribute it and/or modify it under
-the terms of the GNU Lesser General Public License as published by the
-Free Software Foundation; either version 2.1 of the License, or (at your
-option) any later version. (See <http://www.gnu.org/copyleft/lesser.html>.)
-
-This library is distributed in the hope that it will be useful, but WITHOUT
-ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
-more details.
-
-You should have received a copy of the GNU Lesser General Public License
-along with this library; if not, write to the Free Software Foundation, Inc.,
-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
-**********/
-// "liveMedia"
-// Copyright (c) 1996-2016 Live Networks, Inc.  All rights reserved.
-// A RTSP server
-// C++ header
-
-#ifndef _RTSP_SERVER_HH
-#define _RTSP_SERVER_HH
-
-#ifndef _GENERIC_MEDIA_SERVER_HH
-#include "GenericMediaServer.hh"
-#endif
-#ifndef _DIGEST_AUTHENTICATION_HH
-#include "DigestAuthentication.hh"
-#endif
-
-class RTSPServer: public GenericMediaServer {
-public:
-  static RTSPServer* createNew(UsageEnvironment& env, Port ourPort = 554,
-			       UserAuthenticationDatabase* authDatabase = NULL,
-			       unsigned reclamationSeconds = 65);
-      // If ourPort.num() == 0, we'll choose the port number
-      // Note: The caller is responsible for reclaiming "authDatabase"
-      // If "reclamationSeconds" > 0, then the "RTSPClientSession" state for
-      //     each client will get reclaimed (and the corresponding RTP stream(s)
-      //     torn down) if no RTSP commands - or RTCP "RR" packets - from the
-      //     client are received in at least "reclamationSeconds" seconds.
-
-  static Boolean lookupByName(UsageEnvironment& env, char const* name,
-			      RTSPServer*& resultServer);
-
-  typedef void (responseHandlerForREGISTER)(RTSPServer* rtspServer, unsigned requestId, int resultCode, char* resultString);
-  unsigned registerStream(ServerMediaSession* serverMediaSession,
-			  char const* remoteClientNameOrAddress, portNumBits remoteClientPortNum,
-			  responseHandlerForREGISTER* responseHandler,
-			  char const* username = NULL, char const* password = NULL,
-			  Boolean receiveOurStreamViaTCP = False,
-			  char const* proxyURLSuffix = NULL);
-  // 'Register' the stream represented by "serverMediaSession" with the given remote client (specifed by name and port number).
-  // This is done using our custom "REGISTER" RTSP command.
-  // The function returns a unique number that can be used to identify the request; this number is also passed to "responseHandler".
-  // When a response is received from the remote client (or the "REGISTER" request fails), the specified response handler
-  //   (if non-NULL) is called.  (Note that the "resultString" passed to the handler was dynamically allocated,
-  //   and should be delete[]d by the handler after use.)
-  // If "receiveOurStreamViaTCP" is True, then we're requesting that the remote client access our stream using RTP/RTCP-over-TCP.
-  //   (Otherwise, the remote client may choose regular RTP/RTCP-over-UDP streaming.)
-  // "proxyURLSuffix" (optional) is used only when the remote client is also a proxy server.
-  //   It tells the proxy server the suffix that it should use in its "rtsp://" URL (when front-end clients access the stream)
-
-  char* rtspURL(ServerMediaSession const* serverMediaSession, int clientSocket = -1) const;
-      // returns a "rtsp://" URL that could be used to access the
-      // specified session (which must already have been added to
-      // us using "addServerMediaSession()".
-      // This string is dynamically allocated; caller should delete[]
-      // (If "clientSocket" is non-negative, then it is used (by calling "getsockname()") to determine
-      //  the IP address to be used in the URL.)
-  char* rtspURLPrefix(int clientSocket = -1) const;
-      // like "rtspURL()", except that it returns just the common prefix used by
-      // each session's "rtsp://" URL.
-      // This string is dynamically allocated; caller should delete[]
-
-  UserAuthenticationDatabase* setAuthenticationDatabase(UserAuthenticationDatabase* newDB);
-      // Changes the server's authentication database to "newDB", returning a pointer to the old database (if there was one).
-      // "newDB" may be NULL (you can use this to disable authentication at runtime, if desired).
-
-  void disableStreamingRTPOverTCP() {
-    fAllowStreamingRTPOverTCP = False;
-  }
-
-  Boolean setUpTunnelingOverHTTP(Port httpPort);
-      // (Attempts to) enable RTSP-over-HTTP tunneling on the specified port.
-      // Returns True iff the specified port can be used in this way (i.e., it's not already being used for a separate HTTP server).
-      // Note: RTSP-over-HTTP tunneling is described in http://developer.apple.com/quicktime/icefloe/dispatch028.html
-  portNumBits httpServerPortNum() const; // in host byte order.  (Returns 0 if not present.)
-
-protected:
-  RTSPServer(UsageEnvironment& env,
-	     int ourSocket, Port ourPort,
-	     UserAuthenticationDatabase* authDatabase,
-	     unsigned reclamationSeconds);
-      // called only by createNew();
-  virtual ~RTSPServer();
-
-  virtual char const* allowedCommandNames(); // used to implement "RTSPClientConnection::handleCmd_OPTIONS()"
-  virtual Boolean weImplementREGISTER(char const* proxyURLSuffix, char*& responseStr);
-      // used to implement "RTSPClientConnection::handleCmd_REGISTER()"
-      // Note: "responseStr" is dynamically allocated (or NULL), and should be delete[]d after the call
-  virtual void implementCmd_REGISTER(char const* url, char const* urlSuffix, int socketToRemoteServer,
-				     Boolean deliverViaTCP, char const* proxyURLSuffix);
-      // used to implement "RTSPClientConnection::handleCmd_REGISTER()"
-
-  virtual UserAuthenticationDatabase* getAuthenticationDatabaseForCommand(char const* cmdName);
-  virtual Boolean specialClientAccessCheck(int clientSocket, struct sockaddr_in& clientAddr,
-					   char const* urlSuffix);
-      // a hook that allows subclassed servers to do server-specific access checking
-      // on each client (e.g., based on client IP address), without using digest authentication.
-  virtual Boolean specialClientUserAccessCheck(int clientSocket, struct sockaddr_in& clientAddr,
-					       char const* urlSuffix, char const *username);
-      // another hook that allows subclassed servers to do server-specific access checking
-      // - this time after normal digest authentication has already taken place (and would otherwise allow access).
-      // (This test can only be used to further restrict access, not to grant additional access.)
-
-private: // redefined virtual functions
-  virtual Boolean isRTSPServer() const;
-
-public: // should be protected, but some old compilers complain otherwise
-  // The state of a TCP connection used by a RTSP client:
-  class RTSPClientSession; // forward
-  class RTSPClientConnection: public GenericMediaServer::ClientConnection {
-  public:
-    // A data structure that's used to implement the "REGISTER" command:
-    class ParamsForREGISTER {
-    public:
-      ParamsForREGISTER(RTSPClientConnection* ourConnection, char const* url, char const* urlSuffix,
-			Boolean reuseConnection, Boolean deliverViaTCP, char const* proxyURLSuffix);
-      virtual ~ParamsForREGISTER();
-    private:
-      friend class RTSPClientConnection;
-      RTSPClientConnection* fOurConnection;
-      char* fURL;
-      char* fURLSuffix;
-      Boolean fReuseConnection, fDeliverViaTCP;
-      char* fProxyURLSuffix;
-    };
-  protected: // redefined virtual functions:
-    virtual void handleRequestBytes(int newBytesRead);
-
-  protected:
-    RTSPClientConnection(RTSPServer& ourServer, int clientSocket, struct sockaddr_in clientAddr);
-    virtual ~RTSPClientConnection();
-
-    friend class RTSPServer;
-    friend class RTSPClientSession;
-
-    // Make the handler functions for each command virtual, to allow subclasses to reimplement them, if necessary:
-    virtual void handleCmd_OPTIONS();
-        // You probably won't need to subclass/reimplement this function; reimplement "RTSPServer::allowedCommandNames()" instead.
-    virtual void handleCmd_GET_PARAMETER(char const* fullRequestStr); // when operating on the entire server
-    virtual void handleCmd_SET_PARAMETER(char const* fullRequestStr); // when operating on the entire server
-    virtual void handleCmd_DESCRIBE(char const* urlPreSuffix, char const* urlSuffix, char const* fullRequestStr);
-    virtual void handleCmd_REGISTER(char const* url, char const* urlSuffix, char const* fullRequestStr,
-				    Boolean reuseConnection, Boolean deliverViaTCP, char const* proxyURLSuffix);
-        // You probably won't need to subclass/reimplement this function;
-        //     reimplement "RTSPServer::weImplementREGISTER()" and "RTSPServer::implementCmd_REGISTER()" instead.
-    virtual void handleCmd_bad();
-    virtual void handleCmd_notSupported();
-    virtual void handleCmd_notFound();
-    virtual void handleCmd_sessionNotFound();
-    virtual void handleCmd_unsupportedTransport();
-    // Support for optional RTSP-over-HTTP tunneling:
-    virtual Boolean parseHTTPRequestString(char* resultCmdName, unsigned resultCmdNameMaxSize,
-					   char* urlSuffix, unsigned urlSuffixMaxSize,
-					   char* sessionCookie, unsigned sessionCookieMaxSize,
-					   char* acceptStr, unsigned acceptStrMaxSize);
-    virtual void handleHTTPCmd_notSupported();
-    virtual void handleHTTPCmd_notFound();
-    virtual void handleHTTPCmd_OPTIONS();
-    virtual void handleHTTPCmd_TunnelingGET(char const* sessionCookie);
-    virtual Boolean handleHTTPCmd_TunnelingPOST(char const* sessionCookie, unsigned char const* extraData, unsigned extraDataSize);
-    virtual void handleHTTPCmd_StreamingGET(char const* urlSuffix, char const* fullRequestStr);
-  protected:
-    void resetRequestBuffer();
-    void closeSocketsRTSP();
-    static void handleAlternativeRequestByte(void*, u_int8_t requestByte);
-    void handleAlternativeRequestByte1(u_int8_t requestByte);
-    Boolean authenticationOK(char const* cmdName, char const* urlSuffix, char const* fullRequestStr);
-    void changeClientInputSocket(int newSocketNum, unsigned char const* extraData, unsigned extraDataSize);
-      // used to implement RTSP-over-HTTP tunneling
-    static void continueHandlingREGISTER(ParamsForREGISTER* params);
-    virtual void continueHandlingREGISTER1(ParamsForREGISTER* params);
-
-    // Shortcuts for setting up a RTSP response (prior to sending it):
-    void setRTSPResponse(char const* responseStr);
-    void setRTSPResponse(char const* responseStr, u_int32_t sessionId);
-    void setRTSPResponse(char const* responseStr, char const* contentStr);
-    void setRTSPResponse(char const* responseStr, u_int32_t sessionId, char const* contentStr);
-
-    RTSPServer& fOurRTSPServer; // same as ::fOurServer
-    int& fClientInputSocket; // aliased to ::fOurSocket
-    int fClientOutputSocket;
-    Boolean fIsActive;
-    unsigned char* fLastCRLF;
-    unsigned fRecursionCount;
-    char const* fCurrentCSeq;
-    Authenticator fCurrentAuthenticator; // used if access control is needed
-    char* fOurSessionCookie; // used for optional RTSP-over-HTTP tunneling
-    unsigned fBase64RemainderCount; // used for optional RTSP-over-HTTP tunneling (possible values: 0,1,2,3)
-  };
-
-  // The state of an individual client session (using one or more sequential TCP connections) handled by a RTSP server:
-  class RTSPClientSession: public GenericMediaServer::ClientSession {
-  protected:
-    RTSPClientSession(RTSPServer& ourServer, u_int32_t sessionId);
-    virtual ~RTSPClientSession();
-
-    friend class RTSPServer;
-    friend class RTSPClientConnection;
-    // Make the handler functions for each command virtual, to allow subclasses to redefine them:
-    virtual void handleCmd_SETUP(RTSPClientConnection* ourClientConnection,
-				 char const* urlPreSuffix, char const* urlSuffix, char const* fullRequestStr);
-    virtual void handleCmd_withinSession(RTSPClientConnection* ourClientConnection,
-					 char const* cmdName,
-					 char const* urlPreSuffix, char const* urlSuffix,
-					 char const* fullRequestStr);
-    virtual void handleCmd_TEARDOWN(RTSPClientConnection* ourClientConnection,
-				    ServerMediaSubsession* subsession);
-    virtual void handleCmd_PLAY(RTSPClientConnection* ourClientConnection,
-				ServerMediaSubsession* subsession, char const* fullRequestStr);
-    virtual void handleCmd_PAUSE(RTSPClientConnection* ourClientConnection,
-				 ServerMediaSubsession* subsession);
-    virtual void handleCmd_GET_PARAMETER(RTSPClientConnection* ourClientConnection,
-					 ServerMediaSubsession* subsession, char const* fullRequestStr);
-    virtual void handleCmd_SET_PARAMETER(RTSPClientConnection* ourClientConnection,
-					 ServerMediaSubsession* subsession, char const* fullRequestStr);
-  protected:
-    void deleteStreamByTrack(unsigned trackNum);
-    void reclaimStreamStates();
-    Boolean isMulticast() const { return fIsMulticast; }
-
-    // Shortcuts for setting up a RTSP response (prior to sending it):
-    void setRTSPResponse(RTSPClientConnection* ourClientConnection, char const* responseStr) { ourClientConnection->setRTSPResponse(responseStr); }
-    void setRTSPResponse(RTSPClientConnection* ourClientConnection, char const* responseStr, u_int32_t sessionId) { ourClientConnection->setRTSPResponse(responseStr, sessionId); }
-    void setRTSPResponse(RTSPClientConnection* ourClientConnection, char const* responseStr, char const* contentStr) { ourClientConnection->setRTSPResponse(responseStr, contentStr); }
-    void setRTSPResponse(RTSPClientConnection* ourClientConnection, char const* responseStr, u_int32_t sessionId, char const* contentStr) { ourClientConnection->setRTSPResponse(responseStr, sessionId, contentStr); }
-
-  protected:
-    RTSPServer& fOurRTSPServer; // same as ::fOurServer
-    Boolean fIsMulticast, fStreamAfterSETUP;
-    unsigned char fTCPStreamIdCount; // used for (optional) RTP/TCP
-    Boolean usesTCPTransport() const { return fTCPStreamIdCount > 0; }
-    unsigned fNumStreamStates;
-    struct streamState {
-      ServerMediaSubsession* subsession;
-      int tcpSocketNum;
-      void* streamToken;
-    } * fStreamStates;
-  };
-
-protected: // redefined virtual functions
-  // If you subclass "RTSPClientConnection", then you must also redefine this virtual function in order
-  // to create new objects of your subclass:
-  virtual ClientConnection* createNewClientConnection(int clientSocket, struct sockaddr_in clientAddr);
-
-protected:
-  // If you subclass "RTSPClientSession", then you must also redefine this virtual function in order
-  // to create new objects of your subclass:
-  virtual ClientSession* createNewClientSession(u_int32_t sessionId);
-
-private:
-  static void incomingConnectionHandlerHTTP(void*, int /*mask*/);
-  void incomingConnectionHandlerHTTP();
-
-  void noteTCPStreamingOnSocket(int socketNum, RTSPClientSession* clientSession, unsigned trackNum);
-  void unnoteTCPStreamingOnSocket(int socketNum, RTSPClientSession* clientSession, unsigned trackNum);
-  void stopTCPStreamingOnSocket(int socketNum);
-
-private:
-  friend class RTSPClientConnection;
-  friend class RTSPClientSession;
-  friend class RegisterRequestRecord;
-  int fHTTPServerSocket; // for optional RTSP-over-HTTP tunneling
-  Port fHTTPServerPort; // ditto
-  HashTable* fClientConnectionsForHTTPTunneling; // maps client-supplied 'session cookie' strings to "RTSPClientConnection"s
-    // (used only for optional RTSP-over-HTTP tunneling)
-  HashTable* fTCPStreamingDatabase;
-    // maps TCP socket numbers to ids of sessions that are streaming over it (RTP/RTCP-over-TCP)
-  HashTable* fPendingRegisterRequests;
-  unsigned fRegisterRequestCounter;
-  UserAuthenticationDatabase* fAuthDB;
-  Boolean fAllowStreamingRTPOverTCP; // by default, True
-};
-
-
-////////// A subclass of "RTSPServer" that implements the "REGISTER" command to set up proxying on the specified URL //////////
-
-class RTSPServerWithREGISTERProxying: public RTSPServer {
-public:
-  static RTSPServerWithREGISTERProxying* createNew(UsageEnvironment& env, Port ourPort = 554,
-						   UserAuthenticationDatabase* authDatabase = NULL,
-						   UserAuthenticationDatabase* authDatabaseForREGISTER = NULL,
-						   unsigned reclamationSeconds = 65,
-						   Boolean streamRTPOverTCP = False,
-						   int verbosityLevelForProxying = 0);
-
-protected:
-  RTSPServerWithREGISTERProxying(UsageEnvironment& env, int ourSocket, Port ourPort,
-				 UserAuthenticationDatabase* authDatabase, UserAuthenticationDatabase* authDatabaseForREGISTER,
-				 unsigned reclamationSeconds,
-				 Boolean streamRTPOverTCP, int verbosityLevelForProxying);
-  // called only by createNew();
-  virtual ~RTSPServerWithREGISTERProxying();
-
-protected: // redefined virtual functions
-  virtual char const* allowedCommandNames();
-  virtual Boolean weImplementREGISTER(char const* proxyURLSuffix, char*& responseStr);
-  virtual void implementCmd_REGISTER(char const* url, char const* urlSuffix, int socketToRemoteServer,
-				     Boolean deliverViaTCP, char const* proxyURLSuffix);
-  virtual UserAuthenticationDatabase* getAuthenticationDatabaseForCommand(char const* cmdName);
-
-private:
-  Boolean fStreamRTPOverTCP;
-  int fVerbosityLevelForProxying;
-  unsigned fRegisteredProxyCounter;
-  char* fAllowedCommandNames;
-  UserAuthenticationDatabase* fAuthDBForREGISTER;
-}; 
-
-#endif
+/**********
+This library is free software; you can redistribute it and/or modify it under
+the terms of the GNU Lesser General Public License as published by the
+Free Software Foundation; either version 2.1 of the License, or (at your
+option) any later version. (See <http://www.gnu.org/copyleft/lesser.html>.)
+
+This library is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
+more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with this library; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
+**********/
+// "liveMedia"
+// Copyright (c) 1996-2016 Live Networks, Inc.  All rights reserved.
+// A RTSP server
+// C++ header
+
+#ifndef _RTSP_SERVER_HH
+#define _RTSP_SERVER_HH
+
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
+#ifndef _GENERIC_MEDIA_SERVER_HH
+#include "GenericMediaServer.hh"
+#endif
+#ifndef _DIGEST_AUTHENTICATION_HH
+#include "DigestAuthentication.hh"
+#endif
+
+class LIVEMEDIALIB_API RTSPServer: public GenericMediaServer {
+public:
+  static RTSPServer* createNew(UsageEnvironment& env, Port ourPort = 554,
+			       UserAuthenticationDatabase* authDatabase = NULL,
+			       unsigned reclamationSeconds = 65);
+      // If ourPort.num() == 0, we'll choose the port number
+      // Note: The caller is responsible for reclaiming "authDatabase"
+      // If "reclamationSeconds" > 0, then the "RTSPClientSession" state for
+      //     each client will get reclaimed (and the corresponding RTP stream(s)
+      //     torn down) if no RTSP commands - or RTCP "RR" packets - from the
+      //     client are received in at least "reclamationSeconds" seconds.
+
+  static Boolean lookupByName(UsageEnvironment& env, char const* name,
+			      RTSPServer*& resultServer);
+
+  typedef void (responseHandlerForREGISTER)(RTSPServer* rtspServer, unsigned requestId, int resultCode, char* resultString);
+  unsigned registerStream(ServerMediaSession* serverMediaSession,
+			  char const* remoteClientNameOrAddress, portNumBits remoteClientPortNum,
+			  responseHandlerForREGISTER* responseHandler,
+			  char const* username = NULL, char const* password = NULL,
+			  Boolean receiveOurStreamViaTCP = False,
+			  char const* proxyURLSuffix = NULL);
+  // 'Register' the stream represented by "serverMediaSession" with the given remote client (specifed by name and port number).
+  // This is done using our custom "REGISTER" RTSP command.
+  // The function returns a unique number that can be used to identify the request; this number is also passed to "responseHandler".
+  // When a response is received from the remote client (or the "REGISTER" request fails), the specified response handler
+  //   (if non-NULL) is called.  (Note that the "resultString" passed to the handler was dynamically allocated,
+  //   and should be delete[]d by the handler after use.)
+  // If "receiveOurStreamViaTCP" is True, then we're requesting that the remote client access our stream using RTP/RTCP-over-TCP.
+  //   (Otherwise, the remote client may choose regular RTP/RTCP-over-UDP streaming.)
+  // "proxyURLSuffix" (optional) is used only when the remote client is also a proxy server.
+  //   It tells the proxy server the suffix that it should use in its "rtsp://" URL (when front-end clients access the stream)
+
+  char* rtspURL(ServerMediaSession const* serverMediaSession, int clientSocket = -1) const;
+      // returns a "rtsp://" URL that could be used to access the
+      // specified session (which must already have been added to
+      // us using "addServerMediaSession()".
+      // This string is dynamically allocated; caller should delete[]
+      // (If "clientSocket" is non-negative, then it is used (by calling "getsockname()") to determine
+      //  the IP address to be used in the URL.)
+  char* rtspURLPrefix(int clientSocket = -1) const;
+      // like "rtspURL()", except that it returns just the common prefix used by
+      // each session's "rtsp://" URL.
+      // This string is dynamically allocated; caller should delete[]
+
+  UserAuthenticationDatabase* setAuthenticationDatabase(UserAuthenticationDatabase* newDB);
+      // Changes the server's authentication database to "newDB", returning a pointer to the old database (if there was one).
+      // "newDB" may be NULL (you can use this to disable authentication at runtime, if desired).
+
+  void disableStreamingRTPOverTCP() {
+    fAllowStreamingRTPOverTCP = False;
+  }
+
+  Boolean setUpTunnelingOverHTTP(Port httpPort);
+      // (Attempts to) enable RTSP-over-HTTP tunneling on the specified port.
+      // Returns True iff the specified port can be used in this way (i.e., it's not already being used for a separate HTTP server).
+      // Note: RTSP-over-HTTP tunneling is described in http://developer.apple.com/quicktime/icefloe/dispatch028.html
+  portNumBits httpServerPortNum() const; // in host byte order.  (Returns 0 if not present.)
+
+protected:
+  RTSPServer(UsageEnvironment& env,
+	     int ourSocket, Port ourPort,
+	     UserAuthenticationDatabase* authDatabase,
+	     unsigned reclamationSeconds);
+      // called only by createNew();
+  virtual ~RTSPServer();
+
+  virtual char const* allowedCommandNames(); // used to implement "RTSPClientConnection::handleCmd_OPTIONS()"
+  virtual Boolean weImplementREGISTER(char const* proxyURLSuffix, char*& responseStr);
+      // used to implement "RTSPClientConnection::handleCmd_REGISTER()"
+      // Note: "responseStr" is dynamically allocated (or NULL), and should be delete[]d after the call
+  virtual void implementCmd_REGISTER(char const* url, char const* urlSuffix, int socketToRemoteServer,
+				     Boolean deliverViaTCP, char const* proxyURLSuffix);
+      // used to implement "RTSPClientConnection::handleCmd_REGISTER()"
+
+  virtual UserAuthenticationDatabase* getAuthenticationDatabaseForCommand(char const* cmdName);
+  virtual Boolean specialClientAccessCheck(int clientSocket, struct sockaddr_in& clientAddr,
+					   char const* urlSuffix);
+      // a hook that allows subclassed servers to do server-specific access checking
+      // on each client (e.g., based on client IP address), without using digest authentication.
+  virtual Boolean specialClientUserAccessCheck(int clientSocket, struct sockaddr_in& clientAddr,
+					       char const* urlSuffix, char const *username);
+      // another hook that allows subclassed servers to do server-specific access checking
+      // - this time after normal digest authentication has already taken place (and would otherwise allow access).
+      // (This test can only be used to further restrict access, not to grant additional access.)
+
+private: // redefined virtual functions
+  virtual Boolean isRTSPServer() const;
+
+public: // should be protected, but some old compilers complain otherwise
+  // The state of a TCP connection used by a RTSP client:
+  class RTSPClientSession; // forward
+  class RTSPClientConnection: public GenericMediaServer::ClientConnection {
+  public:
+    // A data structure that's used to implement the "REGISTER" command:
+    class ParamsForREGISTER {
+    public:
+      ParamsForREGISTER(RTSPClientConnection* ourConnection, char const* url, char const* urlSuffix,
+			Boolean reuseConnection, Boolean deliverViaTCP, char const* proxyURLSuffix);
+      virtual ~ParamsForREGISTER();
+    private:
+      friend class RTSPClientConnection;
+      RTSPClientConnection* fOurConnection;
+      char* fURL;
+      char* fURLSuffix;
+      Boolean fReuseConnection, fDeliverViaTCP;
+      char* fProxyURLSuffix;
+    };
+  protected: // redefined virtual functions:
+    virtual void handleRequestBytes(int newBytesRead);
+
+  protected:
+    RTSPClientConnection(RTSPServer& ourServer, int clientSocket, struct sockaddr_in clientAddr);
+    virtual ~RTSPClientConnection();
+
+    friend class RTSPServer;
+    friend class RTSPClientSession;
+
+    // Make the handler functions for each command virtual, to allow subclasses to reimplement them, if necessary:
+    virtual void handleCmd_OPTIONS();
+        // You probably won't need to subclass/reimplement this function; reimplement "RTSPServer::allowedCommandNames()" instead.
+    virtual void handleCmd_GET_PARAMETER(char const* fullRequestStr); // when operating on the entire server
+    virtual void handleCmd_SET_PARAMETER(char const* fullRequestStr); // when operating on the entire server
+    virtual void handleCmd_DESCRIBE(char const* urlPreSuffix, char const* urlSuffix, 
+      char const* urlParams, char const* fullRequestStr);
+    // IHP: Adding url parsing
+
+    virtual void handleCmd_REGISTER(char const* url, char const* urlSuffix, char const* fullRequestStr,
+				    Boolean reuseConnection, Boolean deliverViaTCP, char const* proxyURLSuffix);
+        // You probably won't need to subclass/reimplement this function;
+        //     reimplement "RTSPServer::weImplementREGISTER()" and "RTSPServer::implementCmd_REGISTER()" instead.
+    virtual void handleCmd_bad();
+    virtual void handleCmd_notSupported();
+    virtual void handleCmd_notFound();
+    virtual void handleCmd_sessionNotFound();
+    virtual void handleCmd_unsupportedTransport();
+    // Support for optional RTSP-over-HTTP tunneling:
+    virtual Boolean parseHTTPRequestString(char* resultCmdName, unsigned resultCmdNameMaxSize,
+					   char* urlSuffix, unsigned urlSuffixMaxSize,
+					   char* sessionCookie, unsigned sessionCookieMaxSize,
+					   char* acceptStr, unsigned acceptStrMaxSize);
+    virtual void handleHTTPCmd_notSupported();
+    virtual void handleHTTPCmd_notFound();
+    virtual void handleHTTPCmd_OPTIONS();
+    virtual void handleHTTPCmd_TunnelingGET(char const* sessionCookie);
+    virtual Boolean handleHTTPCmd_TunnelingPOST(char const* sessionCookie, unsigned char const* extraData, unsigned extraDataSize);
+    virtual void handleHTTPCmd_StreamingGET(char const* urlSuffix, char const* urlParams, char const* fullRequestStr);
+    // IHP: Adding url parsing
+  protected:
+    void resetRequestBuffer();
+    void closeSocketsRTSP();
+    static void handleAlternativeRequestByte(void*, u_int8_t requestByte);
+    void handleAlternativeRequestByte1(u_int8_t requestByte);
+    Boolean authenticationOK(char const* cmdName, char const* urlSuffix, char const* fullRequestStr);
+    void changeClientInputSocket(int newSocketNum, unsigned char const* extraData, unsigned extraDataSize);
+      // used to implement RTSP-over-HTTP tunneling
+    static void continueHandlingREGISTER(ParamsForREGISTER* params);
+    virtual void continueHandlingREGISTER1(ParamsForREGISTER* params);
+
+    // Shortcuts for setting up a RTSP response (prior to sending it):
+    void setRTSPResponse(char const* responseStr);
+    void setRTSPResponse(char const* responseStr, u_int32_t sessionId);
+    void setRTSPResponse(char const* responseStr, char const* contentStr);
+    void setRTSPResponse(char const* responseStr, u_int32_t sessionId, char const* contentStr);
+
+    RTSPServer& fOurRTSPServer; // same as ::fOurServer
+    int& fClientInputSocket; // aliased to ::fOurSocket
+    int fClientOutputSocket;
+    Boolean fIsActive;
+    unsigned char* fLastCRLF;
+    unsigned fRecursionCount;
+    char const* fCurrentCSeq;
+    Authenticator fCurrentAuthenticator; // used if access control is needed
+    char* fOurSessionCookie; // used for optional RTSP-over-HTTP tunneling
+    unsigned fBase64RemainderCount; // used for optional RTSP-over-HTTP tunneling (possible values: 0,1,2,3)
+  };
+
+  // The state of an individual client session (using one or more sequential TCP connections) handled by a RTSP server:
+  class RTSPClientSession: public GenericMediaServer::ClientSession {
+  protected:
+    RTSPClientSession(RTSPServer& ourServer, u_int32_t sessionId);
+    virtual ~RTSPClientSession();
+
+    friend class RTSPServer;
+    friend class RTSPClientConnection;
+    // Make the handler functions for each command virtual, to allow subclasses to redefine them:
+    virtual void handleCmd_SETUP(RTSPClientConnection* ourClientConnection,
+				 char const* urlPreSuffix, char const* urlSuffix,
+         char const* urlParams, char const* fullRequestStr);
+    // IHP: Add url parsing
+
+    virtual void handleCmd_withinSession(RTSPClientConnection* ourClientConnection,
+					 char const* cmdName,
+					 char const* urlPreSuffix, char const* urlSuffix,
+					 char const* fullRequestStr);
+    virtual void handleCmd_TEARDOWN(RTSPClientConnection* ourClientConnection,
+				    ServerMediaSubsession* subsession);
+    virtual void handleCmd_PLAY(RTSPClientConnection* ourClientConnection,
+				ServerMediaSubsession* subsession, char const* fullRequestStr);
+    virtual void handleCmd_PAUSE(RTSPClientConnection* ourClientConnection,
+				 ServerMediaSubsession* subsession);
+    virtual void handleCmd_GET_PARAMETER(RTSPClientConnection* ourClientConnection,
+					 ServerMediaSubsession* subsession, char const* fullRequestStr);
+    virtual void handleCmd_SET_PARAMETER(RTSPClientConnection* ourClientConnection,
+					 ServerMediaSubsession* subsession, char const* fullRequestStr);
+  protected:
+    void deleteStreamByTrack(unsigned trackNum);
+    void reclaimStreamStates();
+    Boolean isMulticast() const { return fIsMulticast; }
+
+    // Shortcuts for setting up a RTSP response (prior to sending it):
+    void setRTSPResponse(RTSPClientConnection* ourClientConnection, char const* responseStr) { ourClientConnection->setRTSPResponse(responseStr); }
+    void setRTSPResponse(RTSPClientConnection* ourClientConnection, char const* responseStr, u_int32_t sessionId) { ourClientConnection->setRTSPResponse(responseStr, sessionId); }
+    void setRTSPResponse(RTSPClientConnection* ourClientConnection, char const* responseStr, char const* contentStr) { ourClientConnection->setRTSPResponse(responseStr, contentStr); }
+    void setRTSPResponse(RTSPClientConnection* ourClientConnection, char const* responseStr, u_int32_t sessionId, char const* contentStr) { ourClientConnection->setRTSPResponse(responseStr, sessionId, contentStr); }
+
+  protected:
+    RTSPServer& fOurRTSPServer; // same as ::fOurServer
+    Boolean fIsMulticast, fStreamAfterSETUP;
+    unsigned char fTCPStreamIdCount; // used for (optional) RTP/TCP
+    Boolean usesTCPTransport() const { return fTCPStreamIdCount > 0; }
+    unsigned fNumStreamStates;
+    struct streamState {
+      ServerMediaSubsession* subsession;
+      int tcpSocketNum;
+      void* streamToken;
+    } * fStreamStates;
+  };
+
+protected: // redefined virtual functions
+  // If you subclass "RTSPClientConnection", then you must also redefine this virtual function in order
+  // to create new objects of your subclass:
+  virtual ClientConnection* createNewClientConnection(int clientSocket, struct sockaddr_in clientAddr);
+
+protected:
+  // If you subclass "RTSPClientSession", then you must also redefine this virtual function in order
+  // to create new objects of your subclass:
+  virtual ClientSession* createNewClientSession(u_int32_t sessionId);
+
+private:
+  static void incomingConnectionHandlerHTTP(void*, int /*mask*/);
+  void incomingConnectionHandlerHTTP();
+
+  void noteTCPStreamingOnSocket(int socketNum, RTSPClientSession* clientSession, unsigned trackNum);
+  void unnoteTCPStreamingOnSocket(int socketNum, RTSPClientSession* clientSession, unsigned trackNum);
+  void stopTCPStreamingOnSocket(int socketNum);
+
+private:
+  friend class RTSPClientConnection;
+  friend class RTSPClientSession;
+  friend class RegisterRequestRecord;
+  int fHTTPServerSocket; // for optional RTSP-over-HTTP tunneling
+  Port fHTTPServerPort; // ditto
+  HashTable* fClientConnectionsForHTTPTunneling; // maps client-supplied 'session cookie' strings to "RTSPClientConnection"s
+    // (used only for optional RTSP-over-HTTP tunneling)
+  HashTable* fTCPStreamingDatabase;
+    // maps TCP socket numbers to ids of sessions that are streaming over it (RTP/RTCP-over-TCP)
+  HashTable* fPendingRegisterRequests;
+  unsigned fRegisterRequestCounter;
+  UserAuthenticationDatabase* fAuthDB;
+  Boolean fAllowStreamingRTPOverTCP; // by default, True
+};
+
+
+////////// A subclass of "RTSPServer" that implements the "REGISTER" command to set up proxying on the specified URL //////////
+
+class RTSPServerWithREGISTERProxying: public RTSPServer {
+public:
+  static RTSPServerWithREGISTERProxying* createNew(UsageEnvironment& env, Port ourPort = 554,
+						   UserAuthenticationDatabase* authDatabase = NULL,
+						   UserAuthenticationDatabase* authDatabaseForREGISTER = NULL,
+						   unsigned reclamationSeconds = 65,
+						   Boolean streamRTPOverTCP = False,
+						   int verbosityLevelForProxying = 0);
+
+protected:
+  RTSPServerWithREGISTERProxying(UsageEnvironment& env, int ourSocket, Port ourPort,
+				 UserAuthenticationDatabase* authDatabase, UserAuthenticationDatabase* authDatabaseForREGISTER,
+				 unsigned reclamationSeconds,
+				 Boolean streamRTPOverTCP, int verbosityLevelForProxying);
+  // called only by createNew();
+  virtual ~RTSPServerWithREGISTERProxying();
+
+protected: // redefined virtual functions
+  virtual char const* allowedCommandNames();
+  virtual Boolean weImplementREGISTER(char const* proxyURLSuffix, char*& responseStr);
+  virtual void implementCmd_REGISTER(char const* url, char const* urlSuffix, int socketToRemoteServer,
+				     Boolean deliverViaTCP, char const* proxyURLSuffix);
+  virtual UserAuthenticationDatabase* getAuthenticationDatabaseForCommand(char const* cmdName);
+
+private:
+  Boolean fStreamRTPOverTCP;
+  int fVerbosityLevelForProxying;
+  unsigned fRegisteredProxyCounter;
+  char* fAllowedCommandNames;
+  UserAuthenticationDatabase* fAuthDBForREGISTER;
+}; 
+
+#endif
Index: liveMedia/include/RTSPServerSupportingHTTPStreaming.hh
===================================================================
--- liveMedia/include/RTSPServerSupportingHTTPStreaming.hh	(revision 14473)
+++ liveMedia/include/RTSPServerSupportingHTTPStreaming.hh	(revision 14474)
@@ -57,7 +57,8 @@
     virtual ~RTSPClientConnectionSupportingHTTPStreaming();
 
   protected: // redefined virtual functions
-    virtual void handleHTTPCmd_StreamingGET(char const* urlSuffix, char const* fullRequestStr);
+    virtual void handleHTTPCmd_StreamingGET(char const* urlSuffix, char const* urlParams, char const* fullRequestStr);
+    // IHP: Adding url parsing
 
   protected:
     static void afterStreaming(void* clientData);
Index: liveMedia/include/ServerMediaSession.hh
===================================================================
--- liveMedia/include/ServerMediaSession.hh	(revision 14473)
+++ liveMedia/include/ServerMediaSession.hh	(revision 14474)
@@ -24,6 +24,12 @@
 #ifndef _SERVER_MEDIA_SESSION_HH
 #define _SERVER_MEDIA_SESSION_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _RTCP_HH
 #include "RTCP.hh"
 #endif
@@ -30,7 +36,7 @@
 
 class ServerMediaSubsession; // forward
 
-class ServerMediaSession: public Medium {
+class LIVEMEDIALIB_API ServerMediaSession: public Medium {
 public:
   static ServerMediaSession* createNew(UsageEnvironment& env,
 				       char const* streamName = NULL,
@@ -103,7 +109,7 @@
 };
 
 
-class ServerMediaSubsessionIterator {
+class LIVEMEDIALIB_API ServerMediaSubsessionIterator {
 public:
   ServerMediaSubsessionIterator(ServerMediaSession& session);
   virtual ~ServerMediaSubsessionIterator();
@@ -117,7 +123,7 @@
 };
 
 
-class ServerMediaSubsession: public Medium {
+class LIVEMEDIALIB_API ServerMediaSubsession: public Medium {
 public:
   unsigned trackNumber() const { return fTrackNumber; }
   char const* trackId();
Index: liveMedia/include/SimpleRTPSink.hh
===================================================================
--- liveMedia/include/SimpleRTPSink.hh	(revision 14473)
+++ liveMedia/include/SimpleRTPSink.hh	(revision 14474)
@@ -22,11 +22,17 @@
 #ifndef _SIMPLE_RTP_SINK_HH
 #define _SIMPLE_RTP_SINK_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _MULTI_FRAMED_RTP_SINK_HH
 #include "MultiFramedRTPSink.hh"
 #endif
 
-class SimpleRTPSink: public MultiFramedRTPSink {
+class LIVEMEDIALIB_API SimpleRTPSink: public MultiFramedRTPSink {
 public:
   static SimpleRTPSink*
   createNew(UsageEnvironment& env, Groupsock* RTPgs,
Index: liveMedia/include/SimpleRTPSource.hh
===================================================================
--- liveMedia/include/SimpleRTPSource.hh	(revision 14473)
+++ liveMedia/include/SimpleRTPSource.hh	(revision 14474)
@@ -25,11 +25,17 @@
 #ifndef _SIMPLE_RTP_SOURCE_HH
 #define _SIMPLE_RTP_SOURCE_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _MULTI_FRAMED_RTP_SOURCE_HH
 #include "MultiFramedRTPSource.hh"
 #endif
 
-class SimpleRTPSource: public MultiFramedRTPSource {
+class LIVEMEDIALIB_API SimpleRTPSource: public MultiFramedRTPSource {
 public:
   static SimpleRTPSource* createNew(UsageEnvironment& env, Groupsock* RTPgs,
 				    unsigned char rtpPayloadFormat,
Index: liveMedia/include/VideoRTPSink.hh
===================================================================
--- liveMedia/include/VideoRTPSink.hh	(revision 14473)
+++ liveMedia/include/VideoRTPSink.hh	(revision 14474)
@@ -21,11 +21,17 @@
 #ifndef _VIDEO_RTP_SINK_HH
 #define _VIDEO_RTP_SINK_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _MULTI_FRAMED_RTP_SINK_HH
 #include "MultiFramedRTPSink.hh"
 #endif
 
-class VideoRTPSink: public MultiFramedRTPSink {
+class LIVEMEDIALIB_API VideoRTPSink: public MultiFramedRTPSink {
 protected:
   VideoRTPSink(UsageEnvironment& env,
 	       Groupsock* rtpgs, unsigned char rtpPayloadType,
Index: liveMedia/include/WAVAudioFileServerMediaSubsession.hh
===================================================================
--- liveMedia/include/WAVAudioFileServerMediaSubsession.hh	(revision 14473)
+++ liveMedia/include/WAVAudioFileServerMediaSubsession.hh	(revision 14474)
@@ -22,11 +22,17 @@
 #ifndef _WAV_AUDIO_FILE_SERVER_MEDIA_SUBSESSION_HH
 #define _WAV_AUDIO_FILE_SERVER_MEDIA_SUBSESSION_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _FILE_SERVER_MEDIA_SUBSESSION_HH
 #include "FileServerMediaSubsession.hh"
 #endif
 
-class WAVAudioFileServerMediaSubsession: public FileServerMediaSubsession{
+class LIVEMEDIALIB_API WAVAudioFileServerMediaSubsession: public FileServerMediaSubsession{
 public:
   static WAVAudioFileServerMediaSubsession*
   createNew(UsageEnvironment& env, char const* fileName, Boolean reuseFirstSource,
Index: liveMedia/include/WAVAudioFileSource.hh
===================================================================
--- liveMedia/include/WAVAudioFileSource.hh	(revision 14473)
+++ liveMedia/include/WAVAudioFileSource.hh	(revision 14474)
@@ -23,6 +23,12 @@
 #ifndef _WAV_AUDIO_FILE_SOURCE_HH
 #define _WAV_AUDIO_FILE_SOURCE_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _AUDIO_INPUT_DEVICE_HH
 #include "AudioInputDevice.hh"
 #endif
@@ -36,7 +42,7 @@
 } WAV_AUDIO_FORMAT;
 
 
-class WAVAudioFileSource: public AudioInputDevice {
+class LIVEMEDIALIB_API WAVAudioFileSource: public AudioInputDevice {
 public:
 
   static WAVAudioFileSource* createNew(UsageEnvironment& env,
Index: liveMedia/include/liveMedia.hh
===================================================================
--- liveMedia/include/liveMedia.hh	(revision 14473)
+++ liveMedia/include/liveMedia.hh	(revision 14474)
@@ -46,6 +46,7 @@
 #include "H265VideoStreamDiscreteFramer.hh"
 #include "JPEGVideoRTPSink.hh"
 #include "SimpleRTPSink.hh"
+#include "MetaDataRTPSink.hh"
 #include "uLawAudioFilter.hh"
 #include "MPEG2IndexFromTransportStream.hh"
 #include "MPEG2TransportStreamTrickModeFilter.hh"
Index: liveMedia/GenericMediaServer.cpp
===================================================================
--- liveMedia/GenericMediaServer.cpp	(revision 14473)
+++ liveMedia/GenericMediaServer.cpp	(revision 14474)
@@ -38,7 +38,7 @@
 }
 
 ServerMediaSession* GenericMediaServer
-::lookupServerMediaSession(char const* streamName, Boolean /*isFirstLookupInSession*/) {
+::lookupServerMediaSession(char const* streamName, char const* streamParams, Boolean /*isFirstLookupInSession*/) {
   // Default implementation:
   return (ServerMediaSession*)(fServerMediaSessions->Lookup(streamName));
 }
Index: liveMedia/H264or5VideoFileSink.cpp
===================================================================
--- liveMedia/H264or5VideoFileSink.cpp	(revision 14473)
+++ liveMedia/H264or5VideoFileSink.cpp	(revision 14474)
@@ -40,10 +40,20 @@
 }
 
 void H264or5VideoFileSink::afterGettingFrame(unsigned frameSize, unsigned numTruncatedBytes, struct timeval presentationTime) {
+  if (!fHaveWrittenFirstFrame) {
+    // IHP: calling virtual write functions
+    writeHeader(frameSize, presentationTime);
+    fHaveWrittenFirstFrame = True; // for next time
+  }
+
+  // IHP: calling virtual write functions
+  writeFrame(frameSize, numTruncatedBytes, presentationTime);
+}
+
+void H264or5VideoFileSink::writeHeader( unsigned frameSize, struct timeval presentationTime ) {
   unsigned char const start_code[4] = {0x00, 0x00, 0x00, 0x01};
 
-  if (!fHaveWrittenFirstFrame) {
-    // If we have NAL units encoded in "sprop parameter strings", prepend these to the file:
+  // If we have NAL units encoded in "sprop parameter strings", prepend these to the file:
     for (unsigned j = 0; j < 3; ++j) {
       unsigned numSPropRecords;
       SPropRecord* sPropRecords
@@ -54,12 +64,14 @@
       }
       delete[] sPropRecords;
     }
-    fHaveWrittenFirstFrame = True; // for next time
-  }
+}
 
+void H264or5VideoFileSink::writeFrame(unsigned frameSize, unsigned numTruncatedBytes, struct timeval presentationTime) {
+  unsigned char const start_code[4] = {0x00, 0x00, 0x00, 0x01};
+
   // Write the input data to the file, with the start code in front:
   addData(start_code, 4, presentationTime);
 
   // Call the parent class to complete the normal file write with the input data:
   FileSink::afterGettingFrame(frameSize, numTruncatedBytes, presentationTime);
-}
+}
\ No newline at end of file
Index: liveMedia/H264or5VideoStreamDiscreteFramer.cpp
===================================================================
--- liveMedia/H264or5VideoStreamDiscreteFramer.cpp	(revision 14473)
+++ liveMedia/H264or5VideoStreamDiscreteFramer.cpp	(revision 14474)
@@ -64,6 +64,13 @@
     nal_unit_type = 0xFF;
   }
 
+  // IHP: Adding some debugging stuff
+  u_int8_t nal_ref_idc = (fTo[0]&0x60)>>5;
+  #ifdef DEBUG
+    fprintf(stderr, "Parsed %d-byte NAL-unit (nal_ref_idc: %d, nal_unit_type: %d)\n",
+      frameSize, nal_ref_idc, nal_unit_type);
+  #endif
+
   // Begin by checking for a (likely) common error: NAL units that (erroneously) begin with a
   // 0x00000001 or 0x000001 'start code'.  (Those start codes should only be in byte-stream data;
   // *not* data that consists of discrete NAL units.)
Index: liveMedia/MPEGVideoStreamParser.hh
===================================================================
--- liveMedia/MPEGVideoStreamParser.hh	(revision 14473)
+++ liveMedia/MPEGVideoStreamParser.hh	(revision 14474)
@@ -21,6 +21,12 @@
 #ifndef _MPEG_VIDEO_STREAM_PARSER_HH
 #define _MPEG_VIDEO_STREAM_PARSER_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _STREAM_PARSER_HH
 #include "StreamParser.hh"
 #endif
@@ -30,7 +36,7 @@
 
 ////////// MPEGVideoStreamParser definition //////////
 
-class MPEGVideoStreamParser: public StreamParser {
+class LIVEMEDIALIB_API MPEGVideoStreamParser: public StreamParser {
 public:
   MPEGVideoStreamParser(MPEGVideoStreamFramer* usingSource,
 			FramedSource* inputSource);
Index: liveMedia/MediaSession.cpp
===================================================================
--- liveMedia/MediaSession.cpp	(revision 14473)
+++ liveMedia/MediaSession.cpp	(revision 14474)
@@ -1126,6 +1126,13 @@
 	if (sscanfResult == 1) {
 	  // <name>
 	  setAttribute(nameStr);
+  // IHP: The non-standard way CISCO represent width/height
+  // TODO: Make sure these aren't needed (don't seem to be)
+  //} else if( !strcmp(nameStr, "width") ) {
+  //  fVideoWidth = atoi(valueStr); 
+  //}
+  //else if( !strcmp(nameStr, "height") ) {
+  //  fVideoHeight = atoi(valueStr);
 	} else {
 	  // <name>=<value>
 	  setAttribute(nameStr, valueStr);
Index: liveMedia/MediaSink.cpp
===================================================================
--- liveMedia/MediaSink.cpp	(revision 14473)
+++ liveMedia/MediaSink.cpp	(revision 14474)
@@ -110,7 +110,7 @@
 
 ////////// OutPacketBuffer //////////
 
-unsigned OutPacketBuffer::maxSize = 60000; // by default
+unsigned OutPacketBuffer::maxSize = 100000;// IHP: Change from default 60000; // by default
 
 OutPacketBuffer
 ::OutPacketBuffer(unsigned preferredPacketSize, unsigned maxPacketSize, unsigned maxBufferSize)
Index: liveMedia/MetaDataRTPSink.cpp
===================================================================
--- liveMedia/MetaDataRTPSink.cpp	(nonexistent)
+++ liveMedia/MetaDataRTPSink.cpp	(revision 14474)
@@ -0,0 +1,99 @@
+/**********
+This library is free software; you can redistribute it and/or modify it under
+the terms of the GNU Lesser General Public License as published by the
+Free Software Foundation; either version 2.1 of the License, or (at your
+option) any later version. (See <http://www.gnu.org/copyleft/lesser.html>.)
+
+This library is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
+more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with this library; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
+**********/
+
+////////////////////////////////////////////////////////////////////
+// Copyright 2011 intuVision, inc.
+// intuVision open source - all rights reserved.
+//
+// FILENAME : MetaDataRTPSink.cpp
+// AUTHORS  : Ashutosh Morde
+//            intuVision, Inc.
+//            10 Tower Park, Suite 200
+//            Woburn, MA  01801
+//            Email: ashu@intuvisiontech.com
+// DATE     : March 11, 2011
+// DERIVED  : SimpleRTPSink.cpp
+////////////////////////////////////////////////////////////////////
+
+#include "MetaDataRTPSink.hh"
+
+MetaDataRTPSink::MetaDataRTPSink(UsageEnvironment& env, Groupsock* RTPgs,
+			     unsigned char rtpPayloadFormat,
+			     unsigned rtpTimestampFrequency,
+			     char const* sdpMediaTypeString,
+			     char const* rtpPayloadFormatName,
+			     unsigned numChannels,
+			     Boolean allowMultipleFramesPerPacket,
+			     Boolean doNormalMBitRule)
+  : MultiFramedRTPSink(env, RTPgs, rtpPayloadFormat, rtpTimestampFrequency,
+		       rtpPayloadFormatName),
+    fAllowMultipleFramesPerPacket(allowMultipleFramesPerPacket) {
+  fSDPMediaTypeString
+    = strDup(sdpMediaTypeString == NULL ? "unknown" : sdpMediaTypeString);
+  fSetMBitOnLastFrames
+    = strcmp(fSDPMediaTypeString, "video") == 0 && doNormalMBitRule;
+}
+
+MetaDataRTPSink::~MetaDataRTPSink() {
+  delete[] (char*)fSDPMediaTypeString;
+}
+
+MetaDataRTPSink*
+MetaDataRTPSink::createNew(UsageEnvironment& env, Groupsock* RTPgs,
+			 unsigned char rtpPayloadFormat,
+			 unsigned rtpTimestampFrequency,
+			 char const* sdpMediaTypeString,
+			 char const* rtpPayloadFormatName,
+			 unsigned numChannels,
+			 Boolean allowMultipleFramesPerPacket,
+			 Boolean doNormalMBitRule) {
+  return new MetaDataRTPSink(env, RTPgs,
+			   rtpPayloadFormat, rtpTimestampFrequency,
+			   sdpMediaTypeString, rtpPayloadFormatName,
+			   numChannels,
+			   allowMultipleFramesPerPacket,
+			   doNormalMBitRule);
+}
+
+void MetaDataRTPSink::doSpecialFrameHandling(unsigned fragmentationOffset,
+					   unsigned char* frameStart,
+					   unsigned numBytesInFrame,
+					   struct timeval frameTimestamp,
+					   unsigned numRemainingBytes) {
+  if (numRemainingBytes == 0) {
+    setMarkerBit();
+  }
+
+   // Also set the RTP timestamp:
+  setTimestamp(frameTimestamp);
+  
+  // Important: Also call our base class's doSpecialFrameHandling(),
+  // to set the packet's timestamp:
+  MultiFramedRTPSink::doSpecialFrameHandling(fragmentationOffset,
+					     frameStart, numBytesInFrame,
+					     frameTimestamp,
+					     numRemainingBytes);
+}
+
+Boolean MetaDataRTPSink::
+frameCanAppearAfterPacketStart(unsigned char const* /*frameStart*/,
+			       unsigned /*numBytesInFrame*/) const {
+  return false;
+}
+
+char const* MetaDataRTPSink::sdpMediaType() const {
+  return fSDPMediaTypeString;
+}
Index: liveMedia/MultiFramedRTPSource.cpp
===================================================================
--- liveMedia/MultiFramedRTPSource.cpp	(revision 14473)
+++ liveMedia/MultiFramedRTPSource.cpp	(revision 14474)
@@ -195,6 +195,10 @@
 		<< fSavedMaxSize << ").  "
 		<< fNumTruncatedBytes << " bytes of trailing data will be dropped!\n";
       }
+      
+      // IHP: pass this frame along for post-processing
+      doSpecialPostprocessing( fReorderingBuffer->isEmpty() );
+
       // Call our own 'after getting' function, so that the downstream object can consume the data:
       if (fReorderingBuffer->isEmpty()) {
 	// Common case optimization: There are no more queued incoming packets, so this code will not get
@@ -260,7 +264,11 @@
 
     // Check for the 12-byte RTP header:
     if (bPacket->dataSize() < 12) break;
-    unsigned rtpHdr = ntohl(*(u_int32_t*)(bPacket->data())); ADVANCE(4);
+    unsigned rtpHdr = ntohl(*(u_int32_t*)(bPacket->data()));
+
+    // IHP: Allow RTP-level preprocessing
+    doSpecialPreprocessing( bPacket, rtpHdr); ADVANCE(4);
+
     Boolean rtpMarkerBit = (rtpHdr&0x00800000) != 0;
     unsigned rtpTimestamp = ntohl(*(u_int32_t*)(bPacket->data()));ADVANCE(4);
     unsigned rtpSSRC = ntohl(*(u_int32_t*)(bPacket->data())); ADVANCE(4);
Index: liveMedia/OnDemandServerMediaSubsession.cpp
===================================================================
--- liveMedia/OnDemandServerMediaSubsession.cpp	(revision 14473)
+++ liveMedia/OnDemandServerMediaSubsession.cpp	(revision 14474)
@@ -28,7 +28,8 @@
 				portNumBits initialPortNum,
 				Boolean multiplexRTCPWithRTP)
   : ServerMediaSubsession(env),
-    fSDPLines(NULL), fReuseFirstSource(reuseFirstSource),
+    fSDPLines(NULL), fControlLine(NULL),
+    fReuseFirstSource(reuseFirstSource),
     fMultiplexRTCPWithRTP(multiplexRTCPWithRTP), fLastStreamToken(NULL),
     fAppHandlerTask(NULL), fAppHandlerClientData(NULL) {
   fDestinationsHashTable = HashTable::create(ONE_WORD_HASH_KEYS);
@@ -431,6 +432,7 @@
   char const* rtcpmuxLine = fMultiplexRTCPWithRTP ? "a=rtcp-mux\r\n" : "";
   char const* rangeLine = rangeSDPLine();
   char const* auxSDPLine = getAuxSDPLine(rtpSink, inputSource);
+  char const* controlLine = getControlSPDLine();
   if (auxSDPLine == NULL) auxSDPLine = "";
 
   char const* const sdpFmt =
@@ -441,7 +443,7 @@
     "%s"
     "%s"
     "%s"
-    "a=control:%s\r\n";
+    "%s\r\n";
   unsigned sdpFmtSize = strlen(sdpFmt)
     + strlen(mediaType) + 5 /* max short len */ + 3 /* max char len */
     + strlen(ipAddressStr.val())
@@ -450,7 +452,7 @@
     + strlen(rtcpmuxLine)
     + strlen(rangeLine)
     + strlen(auxSDPLine)
-    + strlen(trackId());
+    + strlen(controlLine);
   char* sdpLines = new char[sdpFmtSize];
   sprintf(sdpLines, sdpFmt,
 	  mediaType, // m= <media>
@@ -462,7 +464,7 @@
 	  rtcpmuxLine, // a=rtcp-mux:... (if present)
 	  rangeLine, // a=range:... (if present)
 	  auxSDPLine, // optional extra SDP line
-	  trackId()); // a=control:<track-id>
+	  controlLine); // a=control:<track-id>
   delete[] (char*)rangeLine; delete[] rtpmapLine;
 
   fSDPLines = strDup(sdpLines);
@@ -469,7 +471,20 @@
   delete[] sdpLines;
 }
 
+// IHP: adding more info to 'a=control'
+char const* OnDemandServerMediaSubsession::getControlSPDLine( )
+{
+  if (trackId() == NULL) return NULL; // not yet in a ServerMediaSession
+
+  if (fControlLine == NULL) {
+    char buf[100];
+    sprintf(buf, "a=control:%s", trackId());
+    fControlLine = strDup( buf );
+  }
+  return fControlLine;
+}
 
+
 ////////// StreamState implementation //////////
 
 static void afterPlayingStreamState(void* clientData) {
Index: liveMedia/RTSPClient.cpp
===================================================================
--- liveMedia/RTSPClient.cpp	(revision 14473)
+++ liveMedia/RTSPClient.cpp	(revision 14474)
@@ -353,6 +353,19 @@
   fUserAgentHeaderStrLen = strlen(fUserAgentHeaderStr);
 }
 
+// IHP: Adding extra headers for SETUP
+void RTSPClient::setExtraSetupHeaders(char const* extraSetupHeaders) {
+  if (extraSetupHeaders == NULL || extraSetupHeaders[0] == '\0' ) return;
+
+  // Change the existing user agent header string:
+  char const* const formatStr = "%s\r\n";
+  unsigned const headerSize = strlen(formatStr) + strlen(extraSetupHeaders);
+  delete[] fExtraSetupHeaderStr;
+  fExtraSetupHeaderStr = new char[headerSize];
+  sprintf(fExtraSetupHeaderStr, formatStr, extraSetupHeaders);
+  fExtraSetupHeaderStrLen = strlen(fExtraSetupHeaderStr);
+}
+
 unsigned RTSPClient::responseBufferSize = 20000; // default value; you can reassign this in your application if you need to
 
 RTSPClient::RTSPClient(UsageEnvironment& env, char const* rtspURL,
@@ -364,7 +377,8 @@
     fTunnelOverHTTPPortNum(tunnelOverHTTPPortNum),
     fUserAgentHeaderStr(NULL), fUserAgentHeaderStrLen(0),
     fInputSocketNum(-1), fOutputSocketNum(-1), fBaseURL(NULL), fTCPStreamIdCount(0),
-    fLastSessionId(NULL), fSessionTimeoutParameter(0), fSessionCookieCounter(0), fHTTPTunnelingConnectionIsPending(False) {
+    fLastSessionId(NULL), fSessionTimeoutParameter(0), fSessionCookieCounter(0), fHTTPTunnelingConnectionIsPending(False),
+    fExtraSetupHeaderStr(NULL), fExtraSetupHeaderStrLen(0) { // IHP: Adding extra headers for SETUP
   setBaseURL(rtspURL);
 
   fResponseBuffer = new char[responseBufferSize+1];
@@ -402,6 +416,9 @@
 
   delete[] fResponseBuffer;
   delete[] fUserAgentHeaderStr;
+
+  // IHP: Adding extra headers for SETUP
+  delete[] fExtraSetupHeaderStr;
 }
 
 void RTSPClient::reset() {
@@ -708,11 +725,17 @@
     // Optionally include a "Blocksize:" string:
     char* blocksizeStr = createBlocksizeString(streamUsingTCP);
 
+    // IHP: Adding extra headers for SETUP
     // The "Transport:" and "Session:" (if present) and "Blocksize:" (if present) headers
     // make up the 'extra headers':
-    extraHeaders = new char[transportSize + strlen(sessionStr) + strlen(blocksizeStr)];
+    if (fExtraSetupHeaderStr == NULL) {
+      extraHeaders = new char[transportSize + strlen(sessionStr) + strlen(blocksizeStr)];
+      sprintf(extraHeaders, "%s%s%s", transportStr, sessionStr, blocksizeStr);
+    } else {
+      extraHeaders = new char[transportSize + strlen(sessionStr) + strlen(blocksizeStr) + fExtraSetupHeaderStrLen];
+      sprintf(extraHeaders, "%s%s%s%s", transportStr, sessionStr, blocksizeStr, fExtraSetupHeaderStr);
+    }
     extraHeadersWereAllocated = True;
-    sprintf(extraHeaders, "%s%s%s", transportStr, sessionStr, blocksizeStr);
     delete[] transportStr; delete[] sessionStr; delete[] blocksizeStr;
   } else if (strcmp(request->commandName(), "GET") == 0 || strcmp(request->commandName(), "POST") == 0) {
     // We will be sending a HTTP (not a RTSP) request.
@@ -999,6 +1022,7 @@
   char cmdName[RTSP_PARAM_STRING_MAX];
   char urlPreSuffix[RTSP_PARAM_STRING_MAX];
   char urlSuffix[RTSP_PARAM_STRING_MAX];
+  char urlParams[RTSP_PARAM_STRING_MAX];
   char cseq[RTSP_PARAM_STRING_MAX];
   char sessionId[RTSP_PARAM_STRING_MAX];
   unsigned contentLength;
@@ -1006,6 +1030,7 @@
 			      cmdName, sizeof cmdName,
 			      urlPreSuffix, sizeof urlPreSuffix,
 			      urlSuffix, sizeof urlSuffix,
+            urlParams, sizeof urlParams,
 			      cseq, sizeof cseq,
 			      sessionId, sizeof sessionId,
 			      contentLength)) {
Index: liveMedia/RTSPCommon.cpp
===================================================================
--- liveMedia/RTSPCommon.cpp	(revision 14473)
+++ liveMedia/RTSPCommon.cpp	(revision 14474)
@@ -48,6 +48,7 @@
   *url = '\0';
 }
 
+// IHP: Updating to parse urlParams
 Boolean parseRTSPRequestString(char const* reqStr,
 			       unsigned reqStrSize,
 			       char* resultCmdName,
@@ -56,6 +57,8 @@
 			       unsigned resultURLPreSuffixMaxSize,
 			       char* resultURLSuffix,
 			       unsigned resultURLSuffixMaxSize,
+             char* resultURLParams,
+             unsigned resultURLParamsMaxSize,
 			       char* resultCSeq,
 			       unsigned resultCSeqMaxSize,
                                char* resultSessionIdStr,
@@ -111,41 +114,62 @@
 
   // Look for the URL suffix (before the following "RTSP/"):
   parseSucceeded = False;
-  for (unsigned k = i+1; (int)k < (int)(reqStrSize-5); ++k) {
-    if (reqStr[k] == 'R' && reqStr[k+1] == 'T' &&
-	reqStr[k+2] == 'S' && reqStr[k+3] == 'P' && reqStr[k+4] == '/') {
-      while (--k >= i && reqStr[k] == ' ') {} // go back over all spaces before "RTSP/"
-      unsigned k1 = k;
-      while (k1 > i && reqStr[k1] != '/') --k1;
-
-      // ASSERT: At this point
-      //   i: first space or slash after "host" or "host:port"
-      //   k: last non-space before "RTSP/"
-      //   k1: last slash in the range [i,k]
-
-      // The URL suffix comes from [k1+1,k]
-      // Copy "resultURLSuffix":
-      unsigned n = 0, k2 = k1+1;
-      if (k2 <= k) {
-        if (k - k1 + 1 > resultURLSuffixMaxSize) return False; // there's no room
-        while (k2 <= k) resultURLSuffix[n++] = reqStr[k2++];
-      }
-      resultURLSuffix[n] = '\0';
-
-      // The URL 'pre-suffix' comes from [i+1,k1-1]
-      // Copy "resultURLPreSuffix":
-      n = 0; k2 = i+1;
-      if (k2+1 <= k1) {
-        if (k1 - i > resultURLPreSuffixMaxSize) return False; // there's no room
-        while (k2 <= k1-1) resultURLPreSuffix[n++] = reqStr[k2++];
-      }
-      resultURLPreSuffix[n] = '\0';
-      decodeURL(resultURLPreSuffix);
-
-      i = k + 7; // to go past " RTSP/"
-      parseSucceeded = True;
-      break;
-    }
+  // p -> presuffix, s -> suffix, m -> params, l -> lasts non-space
+  unsigned p = 0, s = i, m = 0, l = 0;
+  for (unsigned k = i+1; (int)k < (int)(reqStrSize-5); ++k) {
+    if (m == 0) {
+      if (reqStr[k] == '/') { p = s; s = k; continue; }
+      else if (reqStr[k] == '?') { m = k; continue; }
+    }
+    if (reqStr[k] == 'R' && reqStr[k+1] == 'T' &&
+        reqStr[k+2] == 'S' && reqStr[k+3] == 'P' && reqStr[k+4] == '/') {
+
+      if (m != 0 && l > m) {
+        // Read the parameters (m to l)
+        unsigned len = l - m;
+        if (len+1 > resultURLParamsMaxSize) return False; // there's no room
+        memcpy( resultURLParams, reqStr+m+1, len );
+        resultURLParams[len] = '\0';
+
+        // Read the suffix (s to m)
+        len = m - s - 1;
+        if (len+1 > resultURLSuffixMaxSize) return False; // there's no room
+        memcpy( resultURLSuffix, reqStr+s+1, len );
+        resultURLSuffix[len] = '\0';
+      }
+      else if (s != 0 && l > s) {
+        // No paramters were set
+        if (resultURLParamsMaxSize > 0) resultURLParams[0] = '\0';
+
+        // Read the suffix (s to l)
+        unsigned len = l - s;
+        if (len+1 > resultURLSuffixMaxSize) return False; // there's no room
+        memcpy( resultURLSuffix, reqStr+s+1, len );
+        resultURLSuffix[len] = '\0';
+      }
+      else
+      {
+        if (resultURLParamsMaxSize > 0) resultURLParams[0] = '\0';
+        if (resultURLSuffixMaxSize > 0) resultURLSuffix[0] = '\0';
+      }
+
+      if (p != 0) {
+        // Read the presuffix (p to s)
+        unsigned len = s - p - 1;
+        if (len+1 > resultURLPreSuffixMaxSize) return False; // there's no room
+        memcpy( resultURLPreSuffix, reqStr+p+1, len );
+        resultURLPreSuffix[len] = '\0';
+      }
+      else if (resultURLPreSuffixMaxSize > 0) {
+        // No presuffix were set
+        if (resultURLPreSuffixMaxSize > 0) resultURLPreSuffix[0] = '\0';
+      }
+
+      i = k + 7; // to go past " RTSP/"
+      parseSucceeded = True;
+      break;
+    }
+    else if (reqStr[k] != ' ') l = k;
   }
   if (!parseSucceeded) return False;
 
Index: liveMedia/RTSPServer.cpp
===================================================================
--- liveMedia/RTSPServer.cpp	(revision 14473)
+++ liveMedia/RTSPServer.cpp	(revision 14474)
@@ -420,7 +420,8 @@
 }
 
 void RTSPServer::RTSPClientConnection
-::handleCmd_DESCRIBE(char const* urlPreSuffix, char const* urlSuffix, char const* fullRequestStr) {
+::handleCmd_DESCRIBE(char const* urlPreSuffix, char const* urlSuffix, 
+                     char const* urlParams, char const* fullRequestStr) {
   ServerMediaSession* session = NULL;
   char* sdpDescription = NULL;
   char* rtspURL = NULL;
@@ -440,7 +441,7 @@
     // for "application/sdp", because that's what we're sending back #####
     
     // Begin by looking up the "ServerMediaSession" object for the specified "urlTotalSuffix":
-    session = fOurServer.lookupServerMediaSession(urlTotalSuffix);
+    session = fOurServer.lookupServerMediaSession(urlTotalSuffix, urlParams);
     if (session == NULL) {
       handleCmd_notFound();
       break;
@@ -689,7 +690,7 @@
   return True;
 }
 
-void RTSPServer::RTSPClientConnection::handleHTTPCmd_StreamingGET(char const* /*urlSuffix*/, char const* /*fullRequestStr*/) {
+void RTSPServer::RTSPClientConnection::handleHTTPCmd_StreamingGET(char const* /*urlSuffix*/, char const* urlParams, char const* /*fullRequestStr*/) {
   // By default, we don't support requests to access streams via HTTP:
   handleHTTPCmd_notSupported();
 }
@@ -869,6 +870,7 @@
     char cmdName[RTSP_PARAM_STRING_MAX];
     char urlPreSuffix[RTSP_PARAM_STRING_MAX];
     char urlSuffix[RTSP_PARAM_STRING_MAX];
+    char urlParams[RTSP_PARAM_STRING_MAX];
     char cseq[RTSP_PARAM_STRING_MAX];
     char sessionIdStr[RTSP_PARAM_STRING_MAX];
     unsigned contentLength = 0;
@@ -877,6 +879,7 @@
 						    cmdName, sizeof cmdName,
 						    urlPreSuffix, sizeof urlPreSuffix,
 						    urlSuffix, sizeof urlSuffix,
+                urlParams, sizeof urlParams,
 						    cseq, sizeof cseq,
 						    sessionIdStr, sizeof sessionIdStr,
 						    contentLength);
@@ -920,7 +923,7 @@
 	  handleCmd_notSupported();
 	}
       } else if (strcmp(cmdName, "DESCRIBE") == 0) {
-	handleCmd_DESCRIBE(urlPreSuffix, urlSuffix, (char const*)fRequestBuffer);
+	handleCmd_DESCRIBE(urlPreSuffix, urlSuffix, urlParams, (char const*)fRequestBuffer);
       } else if (strcmp(cmdName, "SETUP") == 0) {
 	Boolean areAuthenticated = True;
 
@@ -945,7 +948,7 @@
 	  }
 	}
 	if (clientSession != NULL) {
-	  clientSession->handleCmd_SETUP(this, urlPreSuffix, urlSuffix, (char const*)fRequestBuffer);
+	  clientSession->handleCmd_SETUP(this, urlPreSuffix, urlSuffix, urlParams, (char const*)fRequestBuffer);
 	  playAfterSetup = clientSession->fStreamAfterSETUP;
 	} else if (areAuthenticated) {
 	  handleCmd_sessionNotFound();
@@ -1007,7 +1010,7 @@
 	  if (strcmp(acceptStr, "application/x-rtsp-tunnelled") == 0) {
 	    isValidHTTPCmd = False;
 	  } else {
-	    handleHTTPCmd_StreamingGET(urlSuffix, (char const*)fRequestBuffer);
+	    handleHTTPCmd_StreamingGET(urlSuffix, urlParams, (char const*)fRequestBuffer);
 	  }
 	} else if (strcmp(cmdName, "GET") == 0) {
 	  handleHTTPCmd_TunnelingGET(sessionCookie);
@@ -1421,7 +1424,7 @@
 
 void RTSPServer::RTSPClientSession
 ::handleCmd_SETUP(RTSPServer::RTSPClientConnection* ourClientConnection,
-		  char const* urlPreSuffix, char const* urlSuffix, char const* fullRequestStr) {
+		  char const* urlPreSuffix, char const* urlSuffix, char const* urlParams, char const* fullRequestStr) {
   // Normally, "urlPreSuffix" should be the session (stream) name, and "urlSuffix" should be the subsession (track) name.
   // However (being "liberal in what we accept"), we also handle 'aggregate' SETUP requests (i.e., without a track name),
   // in the special case where we have only a single track.  I.e., in this case, we also handle:
@@ -1434,7 +1437,7 @@
   do {
     // First, make sure the specified stream name exists:
     ServerMediaSession* sms
-      = fOurServer.lookupServerMediaSession(streamName, fOurServerMediaSession == NULL);
+      = fOurServer.lookupServerMediaSession(streamName, urlParams, fOurServerMediaSession == NULL);
     if (sms == NULL) {
       // Check for the special case (noted above), before we give up:
       if (urlPreSuffix[0] == '\0') {
@@ -1447,7 +1450,7 @@
       trackId = NULL;
       
       // Check again:
-      sms = fOurServer.lookupServerMediaSession(streamName, fOurServerMediaSession == NULL);
+      sms = fOurServer.lookupServerMediaSession(streamName, urlParams, fOurServerMediaSession == NULL);
     }
     if (sms == NULL) {
       if (fOurServerMediaSession == NULL) {
@@ -2082,7 +2085,8 @@
 
 Boolean RTSPServerWithREGISTERProxying::weImplementREGISTER(char const* proxyURLSuffix, char*& responseStr) {
   // First, check whether we have already proxied a stream as "proxyURLSuffix":
-  if (proxyURLSuffix != NULL && lookupServerMediaSession(proxyURLSuffix) != NULL) {
+  // IHP: use blank urlParams for lookupMediaSession
+  if (proxyURLSuffix != NULL && lookupServerMediaSession(proxyURLSuffix, "") != NULL) {
     responseStr = strDup("451 Invalid parameter");
     return False;
   }
Index: liveMedia/RTSPServerSupportingHTTPStreaming.cpp
===================================================================
--- liveMedia/RTSPServerSupportingHTTPStreaming.cpp	(revision 14473)
+++ liveMedia/RTSPServerSupportingHTTPStreaming.cpp	(revision 14474)
@@ -77,7 +77,7 @@
 }
 
 void RTSPServerSupportingHTTPStreaming::RTSPClientConnectionSupportingHTTPStreaming
-::handleHTTPCmd_StreamingGET(char const* urlSuffix, char const* /*fullRequestStr*/) {
+::handleHTTPCmd_StreamingGET(char const* urlSuffix, char const* urlParams, char const* /*fullRequestStr*/) {
   // If "urlSuffix" ends with "?segment=<offset-in-seconds>,<duration-in-seconds>", then strip this off, and send the
   // specified segment.  Otherwise, construct and send a playlist that consists of segments from the specified file.
   do {
@@ -90,7 +90,7 @@
     streamName[questionMarkPos-urlSuffix] = '\0';
 
     do {
-      ServerMediaSession* session = fOurServer.lookupServerMediaSession(streamName);
+      ServerMediaSession* session = fOurServer.lookupServerMediaSession(streamName, urlParams);
       if (session == NULL) {
 	handleHTTPCmd_notFound();
 	break;
@@ -165,7 +165,7 @@
   // Construct and send a playlist that describes segments from the specified file.
 
   // First, make sure that the named file exists, and is streamable:
-  ServerMediaSession* session = fOurServer.lookupServerMediaSession(urlSuffix);
+  ServerMediaSession* session = fOurServer.lookupServerMediaSession(urlSuffix, urlParams);
   if (session == NULL) {
     handleHTTPCmd_notFound();
     return;
Index: liveMedia/StreamParser.hh
===================================================================
--- liveMedia/StreamParser.hh	(revision 14473)
+++ liveMedia/StreamParser.hh	(revision 14474)
@@ -21,11 +21,17 @@
 #ifndef _STREAM_PARSER_HH
 #define _STREAM_PARSER_HH
 
+#ifdef LIVEMEDIALIB_EXPORTS
+#define LIVEMEDIALIB_API __declspec(dllexport)
+#else
+#define LIVEMEDIALIB_API __declspec(dllimport)
+#endif
+
 #ifndef _FRAMED_SOURCE_HH
 #include "FramedSource.hh"
 #endif
 
-class StreamParser {
+class LIVEMEDIALIB_API StreamParser {
 public:
   virtual void flushInput();
 
Index: LiveMediaLib-vc110..vcxproj
===================================================================
--- LiveMediaLib-vc110..vcxproj	(nonexistent)
+++ LiveMediaLib-vc110..vcxproj	(revision 14474)
@@ -0,0 +1,563 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{905581E4-63EE-40A8-A321-51FC9F5384EA}</ProjectGuid>
+    <RootNamespace>LiveMediaLib</RootNamespace>
+    <Keyword>Win32Proj</Keyword>
+    <ProjectName>LiveMediaLib-vc110</ProjectName>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <PlatformToolset>v110</PlatformToolset>
+    <CharacterSet>MultiByte</CharacterSet>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <PlatformToolset>v110</PlatformToolset>
+    <CharacterSet>MultiByte</CharacterSet>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <PlatformToolset>v110</PlatformToolset>
+    <CharacterSet>MultiByte</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <PlatformToolset>v110</PlatformToolset>
+    <CharacterSet>MultiByte</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup>
+    <_ProjectFileVersion>11.0.50727.1</_ProjectFileVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <OutDir>$(Configuration)\</OutDir>
+    <IntDir>$(Configuration)\</IntDir>
+    <LinkIncremental>true</LinkIncremental>
+    <TargetName>LiveMediaLib-20160520D</TargetName>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <LinkIncremental>true</LinkIncremental>
+    <TargetName>LiveMediaLib-20160520-x64D</TargetName>
+    <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <OutDir>$(Configuration)\</OutDir>
+    <IntDir>$(Configuration)\</IntDir>
+    <LinkIncremental>false</LinkIncremental>
+    <TargetName>LiveMediaLib-20160520</TargetName>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <LinkIncremental>false</LinkIncremental>
+    <TargetName>LiveMediaLib-20160520-x64</TargetName>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <Optimization>Disabled</Optimization>
+      <AdditionalIncludeDirectories>BasicUsageEnvironment\include;groupsock\include;liveMedia\include;UsageEnvironment\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions>DEBUG;WIN32;_DEBUG;_WINDOWS;_USRDLL;_CRT_SECURE_NO_WARNINGS;LIVEMEDIALIB_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <MinimalRebuild>true</MinimalRebuild>
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+      <PrecompiledHeader />
+      <WarningLevel>Level3</WarningLevel>
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+    </ClCompile>
+    <Link>
+      <AdditionalDependencies>Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <SubSystem>Windows</SubSystem>
+      <ImportLibrary>$(TargetDir)$(TargetName).lib</ImportLibrary>
+      <TargetMachine>MachineX86</TargetMachine>
+    </Link>
+    <PostBuildEvent>
+      <Message>Copy .dll and .lib files to bin\</Message>
+      <Command>copy /Y $(TargetPath) $(ProjectDir)\bin
+copy /Y $(TargetDir)$(TargetName).lib $(ProjectDir)\bin
+copy /Y $(TargetDir)$(TargetName).pdb $(ProjectDir)\bin</Command>
+    </PostBuildEvent>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <Optimization>Disabled</Optimization>
+      <AdditionalIncludeDirectories>BasicUsageEnvironment\include;groupsock\include;liveMedia\include;UsageEnvironment\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions>DEBUG;WIN32;_DEBUG;_WINDOWS;_USRDLL;_CRT_SECURE_NO_WARNINGS;LIVEMEDIALIB_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+    </ClCompile>
+    <Link>
+      <AdditionalDependencies>Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <SubSystem>Windows</SubSystem>
+      <ImportLibrary>$(TargetDir)$(TargetName).lib</ImportLibrary>
+    </Link>
+    <PostBuildEvent>
+      <Message>Copy .dll and .lib files to bin\</Message>
+      <Command>copy /Y $(TargetPath) $(ProjectDir)\bin
+copy /Y $(TargetDir)$(TargetName).lib $(ProjectDir)\bin
+copy /Y $(TargetDir)$(TargetName).pdb $(ProjectDir)\bin</Command>
+    </PostBuildEvent>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <Optimization>MaxSpeed</Optimization>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <AdditionalIncludeDirectories>BasicUsageEnvironment\include;groupsock\include;liveMedia\include;UsageEnvironment\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;_CRT_SECURE_NO_WARNINGS;LIVEMEDIALIB_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <PrecompiledHeader />
+      <WarningLevel>Level3</WarningLevel>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+    </ClCompile>
+    <Link>
+      <AdditionalDependencies>Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <SubSystem>Windows</SubSystem>
+      <OptimizeReferences>true</OptimizeReferences>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <TargetMachine>MachineX86</TargetMachine>
+    </Link>
+    <PostBuildEvent>
+      <Message>Copy .dll and .lib files to bin\</Message>
+      <Command>copy /Y $(TargetPath) $(ProjectDir)\bin\$(TargetFileName)
+copy /Y $(TargetDir)\$(TargetName).lib $(ProjectDir)\bin\</Command>
+    </PostBuildEvent>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <Optimization>MaxSpeed</Optimization>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <AdditionalIncludeDirectories>BasicUsageEnvironment\include;groupsock\include;liveMedia\include;UsageEnvironment\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;_CRT_SECURE_NO_WARNINGS;LIVEMEDIALIB_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+    </ClCompile>
+    <Link>
+      <AdditionalDependencies>Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <SubSystem>Windows</SubSystem>
+      <OptimizeReferences>true</OptimizeReferences>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+    </Link>
+    <PostBuildEvent>
+      <Message>Copy .dll and .lib files to bin\</Message>
+      <Command>copy /Y $(TargetPath) $(ProjectDir)\bin\$(TargetFileName)
+copy /Y $(TargetDir)\$(TargetName).lib $(ProjectDir)\bin</Command>
+    </PostBuildEvent>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <ClCompile Include="BasicUsageEnvironment\BasicHashTable.cpp" />
+    <ClCompile Include="BasicUsageEnvironment\BasicTaskScheduler.cpp" />
+    <ClCompile Include="BasicUsageEnvironment\BasicTaskScheduler0.cpp" />
+    <ClCompile Include="BasicUsageEnvironment\BasicUsageEnvironment.cpp" />
+    <ClCompile Include="BasicUsageEnvironment\BasicUsageEnvironment0.cpp" />
+    <ClCompile Include="BasicUsageEnvironment\DelayQueue.cpp" />
+    <ClCompile Include="dllmain.cpp" />
+    <ClCompile Include="groupsock\GroupEId.cpp" />
+    <ClCompile Include="groupsock\Groupsock.cpp" />
+    <ClCompile Include="groupsock\GroupsockHelper.cpp" />
+    <ClCompile Include="groupsock\inet.c" />
+    <ClCompile Include="groupsock\IOHandlers.cpp" />
+    <ClCompile Include="groupsock\NetAddress.cpp" />
+    <ClCompile Include="groupsock\NetInterface.cpp" />
+    <ClCompile Include="liveMedia\AC3AudioFileServerMediaSubsession.cpp" />
+    <ClCompile Include="liveMedia\AC3AudioRTPSink.cpp" />
+    <ClCompile Include="liveMedia\AC3AudioRTPSource.cpp" />
+    <ClCompile Include="liveMedia\AC3AudioStreamFramer.cpp" />
+    <ClCompile Include="liveMedia\ADTSAudioFileServerMediaSubsession.cpp" />
+    <ClCompile Include="liveMedia\ADTSAudioFileSource.cpp" />
+    <ClCompile Include="liveMedia\AMRAudioFileServerMediaSubsession.cpp" />
+    <ClCompile Include="liveMedia\AMRAudioFileSink.cpp" />
+    <ClCompile Include="liveMedia\AMRAudioFileSource.cpp" />
+    <ClCompile Include="liveMedia\AMRAudioRTPSink.cpp" />
+    <ClCompile Include="liveMedia\AMRAudioRTPSource.cpp" />
+    <ClCompile Include="liveMedia\AMRAudioSource.cpp" />
+    <ClCompile Include="liveMedia\AudioInputDevice.cpp" />
+    <ClCompile Include="liveMedia\AudioRTPSink.cpp" />
+    <ClCompile Include="liveMedia\AVIFileSink.cpp" />
+    <ClCompile Include="liveMedia\Base64.cpp" />
+    <ClCompile Include="liveMedia\BasicUDPSink.cpp" />
+    <ClCompile Include="liveMedia\BasicUDPSource.cpp" />
+    <ClCompile Include="liveMedia\BitVector.cpp" />
+    <ClCompile Include="liveMedia\ByteStreamFileSource.cpp" />
+    <ClCompile Include="liveMedia\ByteStreamMemoryBufferSource.cpp" />
+    <ClCompile Include="liveMedia\ByteStreamMultiFileSource.cpp" />
+    <ClCompile Include="liveMedia\DeviceSource.cpp" />
+    <ClCompile Include="liveMedia\DigestAuthentication.cpp" />
+    <ClCompile Include="liveMedia\DVVideoFileServerMediaSubsession.cpp" />
+    <ClCompile Include="liveMedia\DVVideoRTPSink.cpp" />
+    <ClCompile Include="liveMedia\DVVideoRTPSource.cpp" />
+    <ClCompile Include="liveMedia\DVVideoStreamFramer.cpp" />
+    <ClCompile Include="liveMedia\EBMLNumber.cpp" />
+    <ClCompile Include="liveMedia\FileServerMediaSubsession.cpp" />
+    <ClCompile Include="liveMedia\FileSink.cpp" />
+    <ClCompile Include="liveMedia\FramedFileSource.cpp" />
+    <ClCompile Include="liveMedia\FramedFilter.cpp" />
+    <ClCompile Include="liveMedia\FramedSource.cpp" />
+    <ClCompile Include="liveMedia\GenericMediaServer.cpp" />
+    <ClCompile Include="liveMedia\GSMAudioRTPSink.cpp" />
+    <ClCompile Include="liveMedia\H261VideoRTPSource.cpp" />
+    <ClCompile Include="liveMedia\H263plusVideoFileServerMediaSubsession.cpp" />
+    <ClCompile Include="liveMedia\H263plusVideoRTPSink.cpp" />
+    <ClCompile Include="liveMedia\H263plusVideoRTPSource.cpp" />
+    <ClCompile Include="liveMedia\H263plusVideoStreamFramer.cpp" />
+    <ClCompile Include="liveMedia\H263plusVideoStreamParser.cpp" />
+    <ClCompile Include="liveMedia\H264or5VideoFileSink.cpp" />
+    <ClCompile Include="liveMedia\H264or5VideoRTPSink.cpp" />
+    <ClCompile Include="liveMedia\H264or5VideoStreamDiscreteFramer.cpp" />
+    <ClCompile Include="liveMedia\H264or5VideoStreamFramer.cpp" />
+    <ClCompile Include="liveMedia\H264VideoFileServerMediaSubsession.cpp" />
+    <ClCompile Include="liveMedia\H264VideoFileSink.cpp" />
+    <ClCompile Include="liveMedia\H264VideoRTPSink.cpp" />
+    <ClCompile Include="liveMedia\H264VideoRTPSource.cpp" />
+    <ClCompile Include="liveMedia\H264VideoStreamDiscreteFramer.cpp" />
+    <ClCompile Include="liveMedia\H264VideoStreamFramer.cpp" />
+    <ClCompile Include="liveMedia\H265VideoFileServerMediaSubsession.cpp" />
+    <ClCompile Include="liveMedia\H265VideoFileSink.cpp" />
+    <ClCompile Include="liveMedia\H265VideoRTPSink.cpp" />
+    <ClCompile Include="liveMedia\H265VideoRTPSource.cpp" />
+    <ClCompile Include="liveMedia\H265VideoStreamDiscreteFramer.cpp" />
+    <ClCompile Include="liveMedia\H265VideoStreamFramer.cpp" />
+    <ClCompile Include="liveMedia\InputFile.cpp" />
+    <ClCompile Include="liveMedia\JPEGVideoRTPSink.cpp" />
+    <ClCompile Include="liveMedia\JPEGVideoRTPSource.cpp" />
+    <ClCompile Include="liveMedia\JPEGVideoSource.cpp" />
+    <ClCompile Include="liveMedia\Locale.cpp" />
+    <ClCompile Include="liveMedia\MatroskaDemuxedTrack.cpp" />
+    <ClCompile Include="liveMedia\MatroskaFile.cpp" />
+    <ClCompile Include="liveMedia\MatroskaFileParser.cpp" />
+    <ClCompile Include="liveMedia\MatroskaFileServerDemux.cpp" />
+    <ClCompile Include="liveMedia\MatroskaFileServerMediaSubsession.cpp" />
+    <ClCompile Include="liveMedia\Media.cpp" />
+    <ClCompile Include="liveMedia\MediaSession.cpp" />
+    <ClCompile Include="liveMedia\MediaSink.cpp" />
+    <ClCompile Include="liveMedia\MediaSource.cpp" />
+    <ClCompile Include="liveMedia\MetaDataRTPSink.cpp" />
+    <ClCompile Include="liveMedia\MP3ADU.cpp" />
+    <ClCompile Include="liveMedia\MP3ADUdescriptor.cpp" />
+    <ClCompile Include="liveMedia\MP3ADUinterleaving.cpp" />
+    <ClCompile Include="liveMedia\MP3ADURTPSink.cpp" />
+    <ClCompile Include="liveMedia\MP3ADURTPSource.cpp" />
+    <ClCompile Include="liveMedia\MP3ADUTranscoder.cpp" />
+    <ClCompile Include="liveMedia\MP3AudioFileServerMediaSubsession.cpp" />
+    <ClCompile Include="liveMedia\MP3AudioMatroskaFileServerMediaSubsession.cpp" />
+    <ClCompile Include="liveMedia\MP3FileSource.cpp" />
+    <ClCompile Include="liveMedia\MP3Internals.cpp" />
+    <ClCompile Include="liveMedia\MP3InternalsHuffman.cpp" />
+    <ClCompile Include="liveMedia\MP3InternalsHuffmanTable.cpp" />
+    <ClCompile Include="liveMedia\MP3StreamState.cpp" />
+    <ClCompile Include="liveMedia\MP3Transcoder.cpp" />
+    <ClCompile Include="liveMedia\MPEG1or2AudioRTPSink.cpp" />
+    <ClCompile Include="liveMedia\MPEG1or2AudioRTPSource.cpp" />
+    <ClCompile Include="liveMedia\MPEG1or2AudioStreamFramer.cpp" />
+    <ClCompile Include="liveMedia\MPEG1or2Demux.cpp" />
+    <ClCompile Include="liveMedia\MPEG1or2DemuxedElementaryStream.cpp" />
+    <ClCompile Include="liveMedia\MPEG1or2DemuxedServerMediaSubsession.cpp" />
+    <ClCompile Include="liveMedia\MPEG1or2FileServerDemux.cpp" />
+    <ClCompile Include="liveMedia\MPEG1or2VideoFileServerMediaSubsession.cpp" />
+    <ClCompile Include="liveMedia\MPEG1or2VideoRTPSink.cpp" />
+    <ClCompile Include="liveMedia\MPEG1or2VideoRTPSource.cpp" />
+    <ClCompile Include="liveMedia\MPEG1or2VideoStreamDiscreteFramer.cpp" />
+    <ClCompile Include="liveMedia\MPEG1or2VideoStreamFramer.cpp" />
+    <ClCompile Include="liveMedia\MPEG2IndexFromTransportStream.cpp" />
+    <ClCompile Include="liveMedia\MPEG2TransportFileServerMediaSubsession.cpp" />
+    <ClCompile Include="liveMedia\MPEG2TransportStreamFramer.cpp" />
+    <ClCompile Include="liveMedia\MPEG2TransportStreamFromESSource.cpp" />
+    <ClCompile Include="liveMedia\MPEG2TransportStreamFromPESSource.cpp" />
+    <ClCompile Include="liveMedia\MPEG2TransportStreamIndexFile.cpp" />
+    <ClCompile Include="liveMedia\MPEG2TransportStreamMultiplexor.cpp" />
+    <ClCompile Include="liveMedia\MPEG2TransportStreamTrickModeFilter.cpp" />
+    <ClCompile Include="liveMedia\MPEG2TransportUDPServerMediaSubsession.cpp" />
+    <ClCompile Include="liveMedia\MPEG4ESVideoRTPSink.cpp" />
+    <ClCompile Include="liveMedia\MPEG4ESVideoRTPSource.cpp" />
+    <ClCompile Include="liveMedia\MPEG4GenericRTPSink.cpp" />
+    <ClCompile Include="liveMedia\MPEG4GenericRTPSource.cpp" />
+    <ClCompile Include="liveMedia\MPEG4LATMAudioRTPSink.cpp" />
+    <ClCompile Include="liveMedia\MPEG4LATMAudioRTPSource.cpp" />
+    <ClCompile Include="liveMedia\MPEG4VideoFileServerMediaSubsession.cpp" />
+    <ClCompile Include="liveMedia\MPEG4VideoStreamDiscreteFramer.cpp" />
+    <ClCompile Include="liveMedia\MPEG4VideoStreamFramer.cpp" />
+    <ClCompile Include="liveMedia\MPEGVideoStreamFramer.cpp" />
+    <ClCompile Include="liveMedia\MPEGVideoStreamParser.cpp" />
+    <ClCompile Include="liveMedia\MultiFramedRTPSink.cpp" />
+    <ClCompile Include="liveMedia\MultiFramedRTPSource.cpp" />
+    <ClCompile Include="liveMedia\OnDemandServerMediaSubsession.cpp" />
+    <ClCompile Include="liveMedia\ourMD5.cpp" />
+    <ClCompile Include="liveMedia\OutputFile.cpp" />
+    <ClCompile Include="liveMedia\PassiveServerMediaSubsession.cpp" />
+    <ClCompile Include="liveMedia\ProxyServerMediaSession.cpp" />
+    <ClCompile Include="liveMedia\QCELPAudioRTPSource.cpp" />
+    <ClCompile Include="liveMedia\QuickTimeFileSink.cpp" />
+    <ClCompile Include="liveMedia\QuickTimeGenericRTPSource.cpp" />
+    <ClCompile Include="liveMedia\RTCP.cpp" />
+    <ClCompile Include="liveMedia\rtcp_from_spec.c" />
+    <ClCompile Include="liveMedia\RTPInterface.cpp" />
+    <ClCompile Include="liveMedia\RTPSink.cpp" />
+    <ClCompile Include="liveMedia\RTPSource.cpp" />
+    <ClCompile Include="liveMedia\RTSPClient.cpp" />
+    <ClCompile Include="liveMedia\RTSPCommon.cpp" />
+    <ClCompile Include="liveMedia\RTSPRegisterSender.cpp" />
+    <ClCompile Include="liveMedia\RTSPServer.cpp" />
+    <ClCompile Include="liveMedia\RTSPServerSupportingHTTPStreaming.cpp" />
+    <ClCompile Include="liveMedia\ServerMediaSession.cpp" />
+    <ClCompile Include="liveMedia\SimpleRTPSink.cpp" />
+    <ClCompile Include="liveMedia\SimpleRTPSource.cpp" />
+    <ClCompile Include="liveMedia\SIPClient.cpp" />
+    <ClCompile Include="liveMedia\StreamParser.cpp" />
+    <ClCompile Include="liveMedia\StreamReplicator.cpp" />
+    <ClCompile Include="liveMedia\T140TextRTPSink.cpp" />
+    <ClCompile Include="liveMedia\TCPStreamSink.cpp" />
+    <ClCompile Include="liveMedia\TextRTPSink.cpp" />
+    <ClCompile Include="liveMedia\TheoraVideoRTPSink.cpp" />
+    <ClCompile Include="liveMedia\TheoraVideoRTPSource.cpp" />
+    <ClCompile Include="liveMedia\uLawAudioFilter.cpp" />
+    <ClCompile Include="liveMedia\VideoRTPSink.cpp" />
+    <ClCompile Include="liveMedia\VorbisAudioRTPSink.cpp" />
+    <ClCompile Include="liveMedia\VorbisAudioRTPSource.cpp" />
+    <ClCompile Include="liveMedia\VP8VideoRTPSink.cpp" />
+    <ClCompile Include="liveMedia\VP8VideoRTPSource.cpp" />
+    <ClCompile Include="liveMedia\VP9VideoRTPSink.cpp" />
+    <ClCompile Include="liveMedia\VP9VideoRTPSource.cpp" />
+    <ClCompile Include="liveMedia\WAVAudioFileServerMediaSubsession.cpp" />
+    <ClCompile Include="liveMedia\WAVAudioFileSource.cpp" />
+    <ClCompile Include="stdafx.cpp" />
+    <ClCompile Include="UsageEnvironment\HashTable.cpp" />
+    <ClCompile Include="UsageEnvironment\strDup.cpp" />
+    <ClCompile Include="UsageEnvironment\UsageEnvironment.cpp" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="groupsock\include\NetCommon.h" />
+    <ClInclude Include="liveMedia\rtcp_from_spec.h" />
+    <ClInclude Include="stdafx.h" />
+    <ClInclude Include="targetver.h" />
+  </ItemGroup>
+  <ItemGroup>
+    <Text Include="ReadMe.txt" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="BasicUsageEnvironment\include\BasicHashTable.hh" />
+    <None Include="BasicUsageEnvironment\include\BasicUsageEnvironment.hh" />
+    <None Include="BasicUsageEnvironment\include\BasicUsageEnvironment0.hh" />
+    <None Include="BasicUsageEnvironment\include\BasicUsageEnvironment_version.hh" />
+    <None Include="BasicUsageEnvironment\include\DelayQueue.hh" />
+    <None Include="BasicUsageEnvironment\include\HandlerSet.hh" />
+    <None Include="groupsock\include\GroupEId.hh" />
+    <None Include="groupsock\include\Groupsock.hh" />
+    <None Include="groupsock\include\GroupsockHelper.hh" />
+    <None Include="groupsock\include\groupsock_version.hh" />
+    <None Include="groupsock\include\IOHandlers.hh" />
+    <None Include="groupsock\include\NetAddress.hh" />
+    <None Include="groupsock\include\NetInterface.hh" />
+    <None Include="groupsock\include\TunnelEncaps.hh" />
+    <None Include="liveMedia\include\AC3AudioFileServerMediaSubsession.hh" />
+    <None Include="liveMedia\include\AC3AudioRTPSink.hh" />
+    <None Include="liveMedia\include\AC3AudioRTPSource.hh" />
+    <None Include="liveMedia\include\AC3AudioStreamFramer.hh" />
+    <None Include="liveMedia\include\ADTSAudioFileServerMediaSubsession.hh" />
+    <None Include="liveMedia\include\ADTSAudioFileSource.hh" />
+    <None Include="liveMedia\include\AMRAudioFileServerMediaSubsession.hh" />
+    <None Include="liveMedia\include\AMRAudioFileSink.hh" />
+    <None Include="liveMedia\include\AMRAudioFileSource.hh" />
+    <None Include="liveMedia\include\AMRAudioRTPSink.hh" />
+    <None Include="liveMedia\include\AMRAudioRTPSource.hh" />
+    <None Include="liveMedia\include\AMRAudioSource.hh" />
+    <None Include="liveMedia\include\AudioInputDevice.hh" />
+    <None Include="liveMedia\include\AudioRTPSink.hh" />
+    <None Include="liveMedia\include\AVIFileSink.hh" />
+    <None Include="liveMedia\include\Base64.hh" />
+    <None Include="liveMedia\include\BasicUDPSink.hh" />
+    <None Include="liveMedia\include\BasicUDPSource.hh" />
+    <None Include="liveMedia\include\BitVector.hh" />
+    <None Include="liveMedia\include\ByteStreamFileSource.hh" />
+    <None Include="liveMedia\include\ByteStreamMemoryBufferSource.hh" />
+    <None Include="liveMedia\include\ByteStreamMultiFileSource.hh" />
+    <None Include="liveMedia\include\DarwinInjector.hh" />
+    <None Include="liveMedia\include\DeviceSource.hh" />
+    <None Include="liveMedia\include\DigestAuthentication.hh" />
+    <None Include="liveMedia\include\DVVideoFileServerMediaSubsession.hh" />
+    <None Include="liveMedia\include\DVVideoRTPSink.hh" />
+    <None Include="liveMedia\include\DVVideoRTPSource.hh" />
+    <None Include="liveMedia\include\DVVideoStreamFramer.hh" />
+    <None Include="liveMedia\include\FileServerMediaSubsession.hh" />
+    <None Include="liveMedia\include\FileSink.hh" />
+    <None Include="liveMedia\include\FramedFileSource.hh" />
+    <None Include="liveMedia\include\FramedFilter.hh" />
+    <None Include="liveMedia\include\FramedSource.hh" />
+    <None Include="liveMedia\include\GenericMediaServer.hh" />
+    <None Include="liveMedia\include\GSMAudioRTPSink.hh" />
+    <None Include="liveMedia\include\H261VideoRTPSource.hh" />
+    <None Include="liveMedia\include\H263plusVideoFileServerMediaSubsession.hh" />
+    <None Include="liveMedia\include\H263plusVideoRTPSink.hh" />
+    <None Include="liveMedia\include\H263plusVideoRTPSource.hh" />
+    <None Include="liveMedia\include\H263plusVideoStreamFramer.hh" />
+    <None Include="liveMedia\include\H264or5VideoFileSink.hh" />
+    <None Include="liveMedia\include\H264or5VideoRTPSink.hh" />
+    <None Include="liveMedia\include\H264or5VideoStreamFramer.hh" />
+    <None Include="liveMedia\include\H264VideoFileServerMediaSubsession.hh" />
+    <None Include="liveMedia\include\H264VideoFileSink.hh" />
+    <None Include="liveMedia\include\H264VideoRTPSink.hh" />
+    <None Include="liveMedia\include\H264VideoRTPSource.hh" />
+    <None Include="liveMedia\include\H264VideoStreamDiscreteFramer.hh" />
+    <None Include="liveMedia\include\H264VideoStreamFramer.hh" />
+    <None Include="liveMedia\include\H265VideoFileServerMediaSubsession.hh" />
+    <None Include="liveMedia\include\H265VideoFileSink.hh" />
+    <None Include="liveMedia\include\H265VideoRTPSink.hh" />
+    <None Include="liveMedia\include\H265VideoRTPSource.hh" />
+    <None Include="liveMedia\include\H265VideoStreamDiscreteFramer.hh" />
+    <None Include="liveMedia\include\H265VideoStreamFramer.hh" />
+    <None Include="liveMedia\include\InputFile.hh" />
+    <None Include="liveMedia\include\JPEGVideoRTPSink.hh" />
+    <None Include="liveMedia\include\JPEGVideoRTPSource.hh" />
+    <None Include="liveMedia\include\JPEGVideoSource.hh" />
+    <None Include="liveMedia\include\liveMedia.hh" />
+    <None Include="liveMedia\include\liveMedia_version.hh" />
+    <None Include="liveMedia\include\Locale.hh" />
+    <None Include="liveMedia\include\MatroskaFile.hh" />
+    <None Include="liveMedia\include\MatroskaFileServerDemux.hh" />
+    <None Include="liveMedia\include\Media.hh" />
+    <None Include="liveMedia\include\MediaSession.hh" />
+    <None Include="liveMedia\include\MediaSink.hh" />
+    <None Include="liveMedia\include\MediaSource.hh" />
+    <None Include="liveMedia\include\MetaDataRTPSink.hh" />
+    <None Include="liveMedia\include\MP3ADU.hh" />
+    <None Include="liveMedia\include\MP3ADUinterleaving.hh" />
+    <None Include="liveMedia\include\MP3ADURTPSink.hh" />
+    <None Include="liveMedia\include\MP3ADURTPSource.hh" />
+    <None Include="liveMedia\include\MP3ADUTranscoder.hh" />
+    <None Include="liveMedia\include\MP3AudioFileServerMediaSubsession.hh" />
+    <None Include="liveMedia\include\MP3FileSource.hh" />
+    <None Include="liveMedia\include\MP3Transcoder.hh" />
+    <None Include="liveMedia\include\MPEG1or2AudioRTPSink.hh" />
+    <None Include="liveMedia\include\MPEG1or2AudioRTPSource.hh" />
+    <None Include="liveMedia\include\MPEG1or2AudioStreamFramer.hh" />
+    <None Include="liveMedia\include\MPEG1or2Demux.hh" />
+    <None Include="liveMedia\include\MPEG1or2DemuxedElementaryStream.hh" />
+    <None Include="liveMedia\include\MPEG1or2DemuxedServerMediaSubsession.hh" />
+    <None Include="liveMedia\include\MPEG1or2FileServerDemux.hh" />
+    <None Include="liveMedia\include\MPEG1or2VideoFileServerMediaSubsession.hh" />
+    <None Include="liveMedia\include\MPEG1or2VideoRTPSink.hh" />
+    <None Include="liveMedia\include\MPEG1or2VideoRTPSource.hh" />
+    <None Include="liveMedia\include\MPEG1or2VideoStreamDiscreteFramer.hh" />
+    <None Include="liveMedia\include\MPEG1or2VideoStreamFramer.hh" />
+    <None Include="liveMedia\include\MPEG2IndexFromTransportStream.hh" />
+    <None Include="liveMedia\include\MPEG2TransportFileServerMediaSubsession.hh" />
+    <None Include="liveMedia\include\MPEG2TransportStreamFramer.hh" />
+    <None Include="liveMedia\include\MPEG2TransportStreamFromESSource.hh" />
+    <None Include="liveMedia\include\MPEG2TransportStreamFromPESSource.hh" />
+    <None Include="liveMedia\include\MPEG2TransportStreamIndexFile.hh" />
+    <None Include="liveMedia\include\MPEG2TransportStreamMultiplexor.hh" />
+    <None Include="liveMedia\include\MPEG2TransportStreamTrickModeFilter.hh" />
+    <None Include="liveMedia\include\MPEG2TransportUDPServerMediaSubsession.hh" />
+    <None Include="liveMedia\include\MPEG4ESVideoRTPSink.hh" />
+    <None Include="liveMedia\include\MPEG4ESVideoRTPSource.hh" />
+    <None Include="liveMedia\include\MPEG4GenericRTPSink.hh" />
+    <None Include="liveMedia\include\MPEG4GenericRTPSource.hh" />
+    <None Include="liveMedia\include\MPEG4LATMAudioRTPSink.hh" />
+    <None Include="liveMedia\include\MPEG4LATMAudioRTPSource.hh" />
+    <None Include="liveMedia\include\MPEG4VideoFileServerMediaSubsession.hh" />
+    <None Include="liveMedia\include\MPEG4VideoStreamDiscreteFramer.hh" />
+    <None Include="liveMedia\include\MPEG4VideoStreamFramer.hh" />
+    <None Include="liveMedia\include\MPEGVideoStreamFramer.hh" />
+    <None Include="liveMedia\include\MultiFramedRTPSink.hh" />
+    <None Include="liveMedia\include\MultiFramedRTPSource.hh" />
+    <None Include="liveMedia\include\OnDemandServerMediaSubsession.hh" />
+    <None Include="liveMedia\include\ourMD5.hh" />
+    <None Include="liveMedia\include\OutputFile.hh" />
+    <None Include="liveMedia\include\PassiveServerMediaSubsession.hh" />
+    <None Include="liveMedia\include\ProxyServerMediaSession.hh" />
+    <None Include="liveMedia\include\QCELPAudioRTPSource.hh" />
+    <None Include="liveMedia\include\QuickTimeFileSink.hh" />
+    <None Include="liveMedia\include\QuickTimeGenericRTPSource.hh" />
+    <None Include="liveMedia\include\RTCP.hh" />
+    <None Include="liveMedia\include\RTPInterface.hh" />
+    <None Include="liveMedia\include\RTPSink.hh" />
+    <None Include="liveMedia\include\RTPSource.hh" />
+    <None Include="liveMedia\include\RTSPClient.hh" />
+    <None Include="liveMedia\include\RTSPCommon.hh" />
+    <None Include="liveMedia\include\RTSPRegisterSender.hh" />
+    <None Include="liveMedia\include\RTSPServer.hh" />
+    <None Include="liveMedia\include\RTSPServerSupportingHTTPStreaming.hh" />
+    <None Include="liveMedia\include\ServerMediaSession.hh" />
+    <None Include="liveMedia\include\SimpleRTPSink.hh" />
+    <None Include="liveMedia\include\SimpleRTPSource.hh" />
+    <None Include="liveMedia\include\SIPClient.hh" />
+    <None Include="liveMedia\include\StreamReplicator.hh" />
+    <None Include="liveMedia\include\T140TextRTPSink.hh" />
+    <None Include="liveMedia\include\TCPStreamSink.hh" />
+    <None Include="liveMedia\include\TextRTPSink.hh" />
+    <None Include="liveMedia\include\TheoraVideoRTPSink.hh" />
+    <None Include="liveMedia\include\TheoraVideoRTPSource.hh" />
+    <None Include="liveMedia\include\uLawAudioFilter.hh" />
+    <None Include="liveMedia\include\VideoRTPSink.hh" />
+    <None Include="liveMedia\include\VorbisAudioRTPSink.hh" />
+    <None Include="liveMedia\include\VorbisAudioRTPSource.hh" />
+    <None Include="liveMedia\include\VP8VideoRTPSink.hh" />
+    <None Include="liveMedia\include\VP8VideoRTPSource.hh" />
+    <None Include="liveMedia\include\VP9VideoRTPSink.hh" />
+    <None Include="liveMedia\include\VP9VideoRTPSource.hh" />
+    <None Include="liveMedia\include\WAVAudioFileServerMediaSubsession.hh" />
+    <None Include="liveMedia\include\WAVAudioFileSource.hh" />
+    <None Include="liveMedia\Makefile.head" />
+    <None Include="liveMedia\Makefile.tail" />
+    <None Include="liveMedia\MatroskaFileServerMediaSubsession.hh" />
+    <None Include="liveMedia\MP3AudioMatroskaFileServerMediaSubsession.hh" />
+    <None Include="liveMedia\MPEGVideoStreamParser.hh" />
+    <None Include="liveMedia\StreamParser.hh" />
+    <None Include="UsageEnvironment\include\Boolean.hh" />
+    <None Include="UsageEnvironment\include\HashTable.hh" />
+    <None Include="UsageEnvironment\include\strDup.hh" />
+    <None Include="UsageEnvironment\include\UsageEnvironment.hh" />
+    <None Include="UsageEnvironment\include\UsageEnvironment_version.hh" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>
\ No newline at end of file
Index: LiveMediaLib-vc110..vcxproj.filters
===================================================================
--- LiveMediaLib-vc110..vcxproj.filters	(nonexistent)
+++ LiveMediaLib-vc110..vcxproj.filters	(revision 14474)
@@ -0,0 +1,1091 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="Source Files">
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+    </Filter>
+    <Filter Include="Header Files">
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
+    </Filter>
+    <Filter Include="Resource Files">
+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
+    </Filter>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="dllmain.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="stdafx.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="BasicUsageEnvironment\BasicHashTable.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="BasicUsageEnvironment\BasicTaskScheduler.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="BasicUsageEnvironment\BasicTaskScheduler0.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="BasicUsageEnvironment\BasicUsageEnvironment.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="BasicUsageEnvironment\BasicUsageEnvironment0.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="BasicUsageEnvironment\DelayQueue.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="groupsock\GroupEId.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="groupsock\Groupsock.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="groupsock\GroupsockHelper.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="groupsock\inet.c">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="groupsock\IOHandlers.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="groupsock\NetAddress.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="groupsock\NetInterface.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\AC3AudioFileServerMediaSubsession.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\AC3AudioRTPSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\AC3AudioRTPSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\AC3AudioStreamFramer.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\ADTSAudioFileServerMediaSubsession.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\ADTSAudioFileSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\AMRAudioFileServerMediaSubsession.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\AMRAudioFileSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\AMRAudioFileSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\AMRAudioRTPSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\AMRAudioRTPSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\AMRAudioSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\AudioInputDevice.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\AudioRTPSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\AVIFileSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\Base64.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\BasicUDPSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\BasicUDPSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\BitVector.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\ByteStreamFileSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\ByteStreamMemoryBufferSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\ByteStreamMultiFileSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\DeviceSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\DigestAuthentication.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\DVVideoFileServerMediaSubsession.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\DVVideoRTPSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\DVVideoRTPSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\DVVideoStreamFramer.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\EBMLNumber.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\FileServerMediaSubsession.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\FileSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\FramedFileSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\FramedFilter.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\FramedSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\GSMAudioRTPSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\H261VideoRTPSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\H263plusVideoFileServerMediaSubsession.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\H263plusVideoRTPSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\H263plusVideoRTPSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\H263plusVideoStreamFramer.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\H263plusVideoStreamParser.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\H264VideoFileServerMediaSubsession.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\H264VideoFileSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\H264VideoRTPSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\H264VideoRTPSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\H264VideoStreamDiscreteFramer.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\H264VideoStreamFramer.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\InputFile.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\JPEGVideoRTPSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\JPEGVideoRTPSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\JPEGVideoSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\Locale.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MatroskaDemuxedTrack.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MatroskaFile.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MatroskaFileParser.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MatroskaFileServerDemux.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\Media.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MediaSession.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MediaSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MediaSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MP3ADU.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MP3ADUdescriptor.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MP3ADUinterleaving.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MP3ADURTPSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MP3ADURTPSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MP3ADUTranscoder.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MP3AudioFileServerMediaSubsession.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MP3AudioMatroskaFileServerMediaSubsession.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MP3FileSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MP3Internals.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MP3InternalsHuffman.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MP3InternalsHuffmanTable.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MP3StreamState.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MP3Transcoder.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MPEG1or2AudioRTPSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MPEG1or2AudioRTPSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MPEG1or2AudioStreamFramer.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MPEG1or2Demux.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MPEG1or2DemuxedElementaryStream.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MPEG1or2DemuxedServerMediaSubsession.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MPEG1or2FileServerDemux.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MPEG1or2VideoFileServerMediaSubsession.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MPEG1or2VideoRTPSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MPEG1or2VideoRTPSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MPEG1or2VideoStreamDiscreteFramer.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MPEG1or2VideoStreamFramer.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MPEG2IndexFromTransportStream.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MPEG2TransportFileServerMediaSubsession.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MPEG2TransportStreamFramer.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MPEG2TransportStreamFromESSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MPEG2TransportStreamFromPESSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MPEG2TransportStreamIndexFile.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MPEG2TransportStreamMultiplexor.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MPEG2TransportStreamTrickModeFilter.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MPEG2TransportUDPServerMediaSubsession.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MPEG4ESVideoRTPSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MPEG4ESVideoRTPSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MPEG4GenericRTPSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MPEG4GenericRTPSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MPEG4LATMAudioRTPSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MPEG4LATMAudioRTPSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MPEG4VideoFileServerMediaSubsession.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MPEG4VideoStreamDiscreteFramer.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MPEG4VideoStreamFramer.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MPEGVideoStreamFramer.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MPEGVideoStreamParser.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MultiFramedRTPSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MultiFramedRTPSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\OnDemandServerMediaSubsession.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\OutputFile.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\PassiveServerMediaSubsession.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\ProxyServerMediaSession.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\QCELPAudioRTPSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\QuickTimeFileSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\QuickTimeGenericRTPSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\RTCP.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\rtcp_from_spec.c">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\RTPInterface.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\RTPSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\RTPSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\RTSPClient.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\RTSPCommon.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\RTSPServer.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\RTSPServerSupportingHTTPStreaming.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\ServerMediaSession.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\SimpleRTPSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\SimpleRTPSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\SIPClient.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\StreamParser.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\StreamReplicator.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\T140TextRTPSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\TCPStreamSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\TextRTPSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\uLawAudioFilter.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\VideoRTPSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\VorbisAudioRTPSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\VorbisAudioRTPSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\VP8VideoRTPSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\VP8VideoRTPSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\WAVAudioFileServerMediaSubsession.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\WAVAudioFileSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="UsageEnvironment\HashTable.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="UsageEnvironment\strDup.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="UsageEnvironment\UsageEnvironment.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MetaDataRTPSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\H264or5VideoFileSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\H264or5VideoRTPSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\H264or5VideoStreamDiscreteFramer.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\GenericMediaServer.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\ourMD5.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\H264or5VideoStreamFramer.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\H265VideoStreamDiscreteFramer.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\H265VideoStreamFramer.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\TheoraVideoRTPSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\TheoraVideoRTPSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\H265VideoFileServerMediaSubsession.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\H265VideoFileSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\H265VideoRTPSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\H265VideoRTPSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\VP9VideoRTPSink.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\VP9VideoRTPSource.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\MatroskaFileServerMediaSubsession.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="liveMedia\RTSPRegisterSender.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="stdafx.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="targetver.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="groupsock\include\NetCommon.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="liveMedia\rtcp_from_spec.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+  </ItemGroup>
+  <ItemGroup>
+    <Text Include="ReadMe.txt" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="BasicUsageEnvironment\include\BasicHashTable.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="BasicUsageEnvironment\include\BasicUsageEnvironment.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="BasicUsageEnvironment\include\BasicUsageEnvironment_version.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="BasicUsageEnvironment\include\BasicUsageEnvironment0.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="BasicUsageEnvironment\include\DelayQueue.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="BasicUsageEnvironment\include\HandlerSet.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="groupsock\include\GroupEId.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="groupsock\include\Groupsock.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="groupsock\include\groupsock_version.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="groupsock\include\GroupsockHelper.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="groupsock\include\IOHandlers.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="groupsock\include\NetAddress.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="groupsock\include\NetInterface.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="groupsock\include\TunnelEncaps.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\AC3AudioFileServerMediaSubsession.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\AC3AudioRTPSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\AC3AudioRTPSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\AC3AudioStreamFramer.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\ADTSAudioFileServerMediaSubsession.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\ADTSAudioFileSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\AMRAudioFileServerMediaSubsession.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\AMRAudioFileSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\AMRAudioFileSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\AMRAudioRTPSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\AMRAudioRTPSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\AMRAudioSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\AudioInputDevice.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\AudioRTPSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\AVIFileSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\Base64.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\BasicUDPSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\BasicUDPSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\BitVector.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\ByteStreamFileSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\ByteStreamMemoryBufferSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\ByteStreamMultiFileSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\DarwinInjector.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\DeviceSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\DigestAuthentication.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\DVVideoFileServerMediaSubsession.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\DVVideoRTPSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\DVVideoRTPSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\DVVideoStreamFramer.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\FileServerMediaSubsession.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\FileSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\FramedFileSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\FramedFilter.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\FramedSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\GSMAudioRTPSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\H261VideoRTPSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\H263plusVideoFileServerMediaSubsession.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\H263plusVideoRTPSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\H263plusVideoRTPSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\H263plusVideoStreamFramer.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\H264VideoFileServerMediaSubsession.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\H264VideoFileSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\H264VideoRTPSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\H264VideoRTPSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\H264VideoStreamDiscreteFramer.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\H264VideoStreamFramer.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\InputFile.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\JPEGVideoRTPSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\JPEGVideoRTPSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\JPEGVideoSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\liveMedia.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\liveMedia_version.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\Locale.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MatroskaFile.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MatroskaFileServerDemux.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\Media.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MediaSession.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MediaSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MediaSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MP3ADU.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MP3ADUinterleaving.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MP3ADURTPSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MP3ADURTPSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MP3ADUTranscoder.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MP3AudioFileServerMediaSubsession.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MP3FileSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MP3Transcoder.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MPEG1or2AudioRTPSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MPEG1or2AudioRTPSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MPEG1or2AudioStreamFramer.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MPEG1or2Demux.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MPEG1or2DemuxedElementaryStream.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MPEG1or2DemuxedServerMediaSubsession.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MPEG1or2FileServerDemux.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MPEG1or2VideoFileServerMediaSubsession.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MPEG1or2VideoRTPSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MPEG1or2VideoRTPSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MPEG1or2VideoStreamDiscreteFramer.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MPEG1or2VideoStreamFramer.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MPEG2IndexFromTransportStream.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MPEG2TransportFileServerMediaSubsession.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MPEG2TransportStreamFramer.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MPEG2TransportStreamFromESSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MPEG2TransportStreamFromPESSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MPEG2TransportStreamIndexFile.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MPEG2TransportStreamMultiplexor.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MPEG2TransportStreamTrickModeFilter.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MPEG2TransportUDPServerMediaSubsession.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MPEG4ESVideoRTPSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MPEG4ESVideoRTPSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MPEG4GenericRTPSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MPEG4GenericRTPSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MPEG4LATMAudioRTPSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MPEG4LATMAudioRTPSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MPEG4VideoFileServerMediaSubsession.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MPEG4VideoStreamDiscreteFramer.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MPEG4VideoStreamFramer.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MPEGVideoStreamFramer.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MultiFramedRTPSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MultiFramedRTPSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\OnDemandServerMediaSubsession.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\OutputFile.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\PassiveServerMediaSubsession.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\ProxyServerMediaSession.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\QCELPAudioRTPSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\QuickTimeFileSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\QuickTimeGenericRTPSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\RTCP.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\RTPInterface.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\RTPSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\RTPSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\RTSPClient.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\RTSPCommon.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\RTSPServer.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\RTSPServerSupportingHTTPStreaming.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\ServerMediaSession.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\SimpleRTPSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\SimpleRTPSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\SIPClient.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\StreamReplicator.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\T140TextRTPSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\TCPStreamSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\TextRTPSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\uLawAudioFilter.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\VideoRTPSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\VorbisAudioRTPSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\VorbisAudioRTPSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\VP8VideoRTPSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\VP8VideoRTPSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\WAVAudioFileServerMediaSubsession.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\WAVAudioFileSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\Makefile.head">
+      <Filter>Source Files</Filter>
+    </None>
+    <None Include="liveMedia\Makefile.tail">
+      <Filter>Source Files</Filter>
+    </None>
+    <None Include="UsageEnvironment\include\Boolean.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="UsageEnvironment\include\HashTable.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="UsageEnvironment\include\strDup.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="UsageEnvironment\include\UsageEnvironment.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="UsageEnvironment\include\UsageEnvironment_version.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\MetaDataRTPSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\MPEGVideoStreamParser.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\StreamParser.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\H264or5VideoFileSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\H264or5VideoRTPSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\GenericMediaServer.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\ourMD5.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\H264or5VideoStreamFramer.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\H265VideoStreamDiscreteFramer.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\H265VideoStreamFramer.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\TheoraVideoRTPSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\TheoraVideoRTPSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\H265VideoFileServerMediaSubsession.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\H265VideoFileSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\H265VideoRTPSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\H265VideoRTPSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\VP9VideoRTPSink.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\VP9VideoRTPSource.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\MP3AudioMatroskaFileServerMediaSubsession.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\MatroskaFileServerMediaSubsession.hh">
+      <Filter>Header Files</Filter>
+    </None>
+    <None Include="liveMedia\include\RTSPRegisterSender.hh">
+      <Filter>Header Files</Filter>
+    </None>
+  </ItemGroup>
+</Project>
\ No newline at end of file
Index: LiveMediaLib-vc110.sln
===================================================================
--- LiveMediaLib-vc110.sln	(nonexistent)
+++ LiveMediaLib-vc110.sln	(revision 14474)
@@ -0,0 +1,34 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LiveMediaLib-vc110", "LiveMediaLib-vc110..vcxproj", "{905581E4-63EE-40A8-A321-51FC9F5384EA}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testRTSPClient", "testProgs\testRTSPClient.vcxproj", "{0CE5D06C-DDBA-4E9C-8549-CDBCA619D95C}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Win32 = Debug|Win32
+		Debug|x64 = Debug|x64
+		Release|Win32 = Release|Win32
+		Release|x64 = Release|x64
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{905581E4-63EE-40A8-A321-51FC9F5384EA}.Debug|Win32.ActiveCfg = Debug|Win32
+		{905581E4-63EE-40A8-A321-51FC9F5384EA}.Debug|Win32.Build.0 = Debug|Win32
+		{905581E4-63EE-40A8-A321-51FC9F5384EA}.Debug|x64.ActiveCfg = Debug|x64
+		{905581E4-63EE-40A8-A321-51FC9F5384EA}.Debug|x64.Build.0 = Debug|x64
+		{905581E4-63EE-40A8-A321-51FC9F5384EA}.Release|Win32.ActiveCfg = Release|Win32
+		{905581E4-63EE-40A8-A321-51FC9F5384EA}.Release|Win32.Build.0 = Release|Win32
+		{905581E4-63EE-40A8-A321-51FC9F5384EA}.Release|x64.ActiveCfg = Release|x64
+		{905581E4-63EE-40A8-A321-51FC9F5384EA}.Release|x64.Build.0 = Release|x64
+		{0CE5D06C-DDBA-4E9C-8549-CDBCA619D95C}.Debug|Win32.ActiveCfg = Debug|Win32
+		{0CE5D06C-DDBA-4E9C-8549-CDBCA619D95C}.Debug|Win32.Build.0 = Debug|Win32
+		{0CE5D06C-DDBA-4E9C-8549-CDBCA619D95C}.Debug|x64.ActiveCfg = Debug|Win32
+		{0CE5D06C-DDBA-4E9C-8549-CDBCA619D95C}.Release|Win32.ActiveCfg = Release|Win32
+		{0CE5D06C-DDBA-4E9C-8549-CDBCA619D95C}.Release|Win32.Build.0 = Release|Win32
+		{0CE5D06C-DDBA-4E9C-8549-CDBCA619D95C}.Release|x64.ActiveCfg = Release|Win32
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
Index: dllmain.cpp
===================================================================
--- dllmain.cpp	(nonexistent)
+++ dllmain.cpp	(revision 14474)
@@ -0,0 +1,19 @@
+// dllmain.cpp : Defines the entry point for the DLL application.
+#include "stdafx.h"
+
+BOOL APIENTRY DllMain( HMODULE hModule,
+                       DWORD  ul_reason_for_call,
+                       LPVOID lpReserved
+					 )
+{
+	switch (ul_reason_for_call)
+	{
+	case DLL_PROCESS_ATTACH:
+	case DLL_THREAD_ATTACH:
+	case DLL_THREAD_DETACH:
+	case DLL_PROCESS_DETACH:
+		break;
+	}
+	return TRUE;
+}
+
Index: stdafx.cpp
===================================================================
--- stdafx.cpp	(nonexistent)
+++ stdafx.cpp	(revision 14474)
@@ -0,0 +1,8 @@
+// stdafx.cpp : source file that includes just the standard includes
+// LiveMediaLib.pch will be the pre-compiled header
+// stdafx.obj will contain the pre-compiled type information
+
+#include "stdafx.h"
+
+// TODO: reference any additional headers you need in STDAFX.H
+// and not in this file
Index: stdafx.h
===================================================================
--- stdafx.h	(nonexistent)
+++ stdafx.h	(revision 14474)
@@ -0,0 +1,16 @@
+// stdafx.h : include file for standard system include files,
+// or project specific include files that are used frequently, but
+// are changed infrequently
+//
+
+#pragma once
+
+#include "targetver.h"
+
+#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers
+// Windows Header Files:
+#include <windows.h>
+
+
+
+// TODO: reference additional headers your program requires here
Index: targetver.h
===================================================================
--- targetver.h	(nonexistent)
+++ targetver.h	(revision 14474)
@@ -0,0 +1,24 @@
+#pragma once
+
+// The following macros define the minimum required platform.  The minimum required platform
+// is the earliest version of Windows, Internet Explorer etc. that has the necessary features to run 
+// your application.  The macros work by enabling all features available on platform versions up to and 
+// including the version specified.
+
+// Modify the following defines if you have to target a platform prior to the ones specified below.
+// Refer to MSDN for the latest info on corresponding values for different platforms.
+#ifndef WINVER                          // Specifies that the minimum required platform is Windows Vista.
+#define WINVER 0x0600           // Change this to the appropriate value to target other versions of Windows.
+#endif
+
+#ifndef _WIN32_WINNT            // Specifies that the minimum required platform is Windows Vista.
+#define _WIN32_WINNT 0x0600     // Change this to the appropriate value to target other versions of Windows.
+#endif
+
+#ifndef _WIN32_WINDOWS          // Specifies that the minimum required platform is Windows 98.
+#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
+#endif
+
+#ifndef _WIN32_IE                       // Specifies that the minimum required platform is Internet Explorer 7.0.
+#define _WIN32_IE 0x0700        // Change this to the appropriate value to target other versions of IE.
+#endif
