A Complete Example: Server and Client

The following code assumes you are already familiar with using the capture object of the toolkit. It is provided to show the major steps for achieving client-server communication. For a complete code listing, refer to the LEAD NetServer and LEAD NetClient demos.

The server side:

C++ syntax:

// set the target format The format to be used for the converted file. This includes the file format, any special settings used by that format, and which audio and/or video codec A COmpressor combined with a DECompressor, or encoder and a decoder, which allows you to both compress and decompress that same data. is to be used for the conversion, and any special settings used by the codecs.:
pCapture->put_TargetFormat(ltmmCapture_TargetFormat_NET);

// after selecting video and/or audio devices (both assumed)
// and compressors:

// set the server address as a target file
BSTR sServer;
sServer = SysAllocString(L”ltsf://10.1.1.200”); // use the default port, 27015
pCapture->put_TargetFile(sServer);
SysFreeString(sServer);

// call ReadyCapture to build the graph:
pCapture->ReadyCapture(ltmmCapture_Mode_VideoOrAudio);

// change the NET Mux settings if needed:

// get the mux object and query for the interface
IUnknown* pUnk = NULL;
ILMNetMux* pMux = NULL;
pCapture->GetSubObject(ltmmCapture_Object_TargetFilter, &pUnk);
pUnk->QueryInterface(IID_ILMNetMux, (void**) &pMux);
pUnk->Release();

// this is a live source
pMux->put_LiveSource(VARIANT_TRUE);

// I can afford 128 kbps only
pMux->put_BitRateLimit(128*1024);

// Set the max queue duration
double dVal;
pMux->get_MaxQueueDuration(&dVal);
if (dVal < 10)
   pMux->put_MaxQueueDuration(10);


pMux->Release();

// start the server:
pCapture->StartCapture(ltmmCapture_Mode_VideoOrAudio);

// you can monitor the achieved bit rate by continuously checking
// the BitRate property of the NET mux, use: get_BitRate(…)

// to send text messages, use the WriteMessage method of the mux:
// first, get the mux interface again (you might want to keep it for the life of the
// communication session:
// write the message:
BSTR Message;
Message = SysAllocString(L"Hello");
pMux->WriteMessage(Message);
SysFreeString(Message);

C syntax:

// set the target format:
IltmmCapture__put_TargetFormat
(pCapture , ltmmCapture_TargetFormat_NET);

// after selecting video and/or audio devices (both assumed)
// and compressors:

// set the server address as a target file
BSTR sServer;
sServer = SysAllocString(L”ltsf://10.1.1.200”); // use the default port, 27015
IltmmCapture__put_TargetFile
(pCapture , sServer);
SysFreeString(sServer);

// call ReadyCapture to build the graph:
IltmmCapture_ReadyCapture
(pCapture, ltmmCapture_Mode_VideoOrAudio);

// change the NET Mux settings if needed:

// get the mux object and query for the interface
IUnknown* pUnk = NULL;
ILMNetMux* pMux = NULL;
IltmmCapture__getSubObject
(pCapture, ltmmCapture_Object_TargetFilter, &pUnk);
IUnknown_QueryInterface(pUnk, IID_ILMNetMux, (void**) &pMux);
IUnknown_Release(pUnk);

// this is a live source
ILMNetMux__put_LiveSource
(pMux, VARIANT_TRUE);

// I can afford 128 kbps only
ILMNetMux__put_BitRateLimit
(128*1024);

// Set the max queue duration
double dVal;
ILMNetMux__get_MaxQueueDuration(pMux, &dVal);
if (dVal < 10)
    ILMNetMux__put_MaxQueueDuration(pMux, 10);

IUnknown_Release(pMux);

// start the server:
IltmmCapture_StartCapture
(pCapture, ltmmCapture_Mode_VideoOrAudio);

// you can monitor the achieved bit rate by continuously checking
// the BitRate property of the NET mux, use: get_BitRate(…)

/* to send text messages, use the WriteMessage method of the mux: */
/* first, get the mux interface again (you might want to keep it for */

/* the life time of the communication session) */
/* write the message: */
BSTR Message;
Message = SysAllocString(L"Hello");
ILMNetMux_WriteMessage
(Message);
SysFreeString(Message);

The client side:

C++ Syntax

BSTR sServer;
HRESULT hr;
sServer = SysAllocString(L"ltsf://10.1.1.200");
ILMNetSrc* pns;

 

// create an instance of the LEAD network source
CoCreateInstance(CLSID_LMNetSrc, NULL, CLSCTX_INPROC_SERVER, IID_ILMNetSrc, (void**) &pns);
hr = pns->CheckConnection(sServer, 0, 5000);
pns->Release();

if (hr != S_OK)
return hr;

 

// set the player source:
pPlay->put_SourceFile(sServer);
SysFreeString(sServer);

 

// if the AutoStart property is not TRUE, you need to run the player:
pPlay->Run();

// you can monitor the incoming bit rate by checking the BitRate property of
// the demultiplexer object:
IUnknown* pUnk = NULL;
ILMNetDmx* pDmx;
long bitrate = 0;

pPlay->GetSubObject(ltmmPlay_Object_Splitter, &pUnk);
pUnk->QueryInterface(IID_ILMNetDmx, (void**) &pDmx);
pUnk->Release();

pDmx->get_BitRate(&bitrate); // you may display the value
pDmx->Release();

// to receive a text message sent by the server, use the ReadMessage

// method. First, get the demux interface again (you might want to keep it for // the life of the communication session)
// read the message:
BSTR Message;
pDmx->ReadMessage(&Message);
// do something with the message.

// You need to call ReadMessage continuously to check for new messages.
 

C Syntax

BSTR sServer;
H
RESULT hr;
ILMNetSrc* pns;
sServer = SysAllocString(L"ltsf://10.1.1.200");
// create an instance of the LEAD network source
CoCreateInstance(&CLSID_LMNetSrc, NULL, CLSCTX_INPROC_SERVER, &IID_ILMNetSrc, (void**) &pns);
hr = ILMNetSrc_CheckConnection(pns, sServer, 0, 5000);
ILMNetSrc_Release(pns);
if (hr != S_OK)
return hr;

 

// set the player source:
IltmmPlay__put_SourceFile
(pPlay , sServer);
SysFreeString(sServer);

// if the AutoStart property is not TRUE, you need to run the player:
IltmmPlay_Run();

// you can monitor the incoming bit rate by checking the BitRate property of
// the demultiplexer object:
IUnknown* pUnk = NULL;
ILMNetDmx* pDmx;
long bitrate = 0;

IltmmPlay__getSubObject
(pPlay, ltmmPlay_Object_Splitter, &pUnk);
IUnknown_QueryInterface(pUnk, IID_ILMNetDmx, (void**) &pDmx);
IUnknown_Release(pUnk);

ILMNetDmx__get_BitRate
(pDmx, &bitrate); // you may display the value
IUnknown_Release(pDmx);

/* to receive a text message sent by the server, use the */
/* ReadMessage method: */
/* first, get the demux interface again (you might want */
/* to keep it for the life of the communication session) */
/*    read the message: */
BSTR Message;
ILMNetDmx_ReadMessage
(pDmx, &Message);
/* do something with the message. */

/* You need to call ReadMessage continuously to check */
/* for new messages.*/