<div>I have figured out how to do this, so here is the basis of my code, and some hanging unanswered questions... the code is mostly testMPEG2TransportStreamer.cpp.<br></div>

<div>&nbsp;<br>#include &lt;fstream&gt;<br>#include &lt;math.h&gt;<br>#include &lt;vector&gt;<br><br>#include &quot;liveMedia.hh&quot;<br>#include &quot;BasicUsageEnvironment.hh&quot;<br>#include &quot;GroupsockHelper.hh&quot;
<br>// To stream using &quot;source-specific multicast&quot; (SSM), uncomment the following:<br>//#define USE_SSM 1<br>#ifdef USE_SSM<br>Boolean const isSSM = True;<br>#else<br>Boolean const isSSM = False;<br>#endif<br><br>
// To set up an internal RTSP server, uncomment the following:<br>//#define IMPLEMENT_RTSP_SERVER 1<br>// (Note that this RTSP server works for multicast only)<br><br>#define TRANSPORT_PACKET_SIZE 188<br>#define TRANSPORT_PACKETS_PER_NETWORK_PACKET 7
<br><br>class pipeToRTP {<br>&nbsp;&nbsp;&nbsp; public:<br>&nbsp;&nbsp;&nbsp; // Constructor and destructor<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pipeToRTP();<br><br>&nbsp;&nbsp;&nbsp; // Primitive execution method<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void execute();<br><br>&nbsp;&nbsp;&nbsp; protected:<br>&nbsp;&nbsp;&nbsp; //-----------------------------------------------------------------------
<br>&nbsp;&nbsp;&nbsp; // Variable Declarations<br>&nbsp;&nbsp;&nbsp; //-----------------------------------------------------------------------<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char rtpFileName_[L_tmpnam];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string destAddressStr_;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned short rtpPortNum_;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; //-----------------------------------------------------------------------<br>&nbsp;&nbsp;&nbsp; // Method Declarations<br>&nbsp;&nbsp;&nbsp; //-----------------------------------------------------------------------<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void preamble();
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void setupRTP();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void compute();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void play();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void postamble();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; // Buffers<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char cBuffer_[MAX_GRAB]; // Ouput of FEC is a type 1000 SB<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<br>&nbsp;&nbsp;&nbsp; // RTP objects<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UsageEnvironment* env;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FramedSource* videoSource;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RTPSink* videoSink;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BasicTaskScheduler* scheduler;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ByteStreamFileSource* Source;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ofstream outPipe_;
<br><br>};<br><br><br>/**<br>&nbsp;* pipeToRTP Constructor<br>&nbsp;*/<br>pipeToRTP::pipeToRTP() {<br>&nbsp;&nbsp;&nbsp; tmpnam(rtpFileName_); // make a random filename<br>}<br><br><br>/**<br>&nbsp;* Class Execution<br>&nbsp;*/<br>void pipeToRTP::execute() {
<br>&nbsp;&nbsp;&nbsp; preamble();<br>&nbsp;&nbsp;&nbsp; m_sync();<br>&nbsp;&nbsp;&nbsp; setupRTP(); <br>&nbsp;&nbsp;&nbsp; //compute(); // Called via setupRTP()<br>&nbsp;&nbsp;&nbsp; postamble();<br>}<br><br><br>/**<br>&nbsp;* Preamble<br>&nbsp;* Initializes file headers, variables, and buffers<br>&nbsp;*/<br>
void pipeToRTP::preamble() {}<br><br><br>/**<br>&nbsp;* Main loop<br>&nbsp;* This is where the data packets are pushed to a file stream<br>&nbsp;*/<br>void pipeToRTP::compute() {&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; while (m_do(lper_, hin_.xfer_len)) {
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Grab to our unix pipe<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_grabx(hin_, cBuffer_, ngot_);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (ngot_ &gt; 0) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Send out the packet to Unix pipe<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outPipe_.write(cBuffer_, ngot_); // write a block of data
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scheduler-&gt;SingleStep(0); // Made this guy public<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br><br>}<br><br><br>/**<br>&nbsp;* Postamble<br>&nbsp;* Performs post-processing tasks such as closing file headers and freeing<br>&nbsp;* memory.
<br>&nbsp;*/<br>void pipeToRTP::postamble() {<br>#ifdef DEBUG<br>&nbsp; *env &lt;&lt; &quot;...done reading from file\n&quot;;<br>#endif<br><br>&nbsp; Medium::close(videoSource);<br>&nbsp; // Note that this also closes the input file that this source read from.
<br>&nbsp; <br>&nbsp; outPipe_.close();<br>&nbsp; <br>&nbsp; exit(1);<br>}<br><br><br>/**<br>&nbsp;* Main Routine<br>&nbsp;* Instantiates an instance of the class and calls the execution method<br>&nbsp;*/<br>void mainroutine() {<br>&nbsp;&nbsp;&nbsp; pipeToRTP p;<br><br>
&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.execute();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (...) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_error(&quot;Primitive execution failed (pipeToRTP)&quot;);<br>&nbsp;&nbsp;&nbsp; }<br>}<br><br><br><br>/**<br>&nbsp;* setupRTP<br>&nbsp;* Initializes RTP environment.<br>
&nbsp;*/<br>void pipeToRTP::setupRTP() {<br>&nbsp; // Begin by setting up our usage environment:<br>&nbsp;&nbsp;&nbsp; scheduler = BasicTaskScheduler::createNew();<br>&nbsp;&nbsp;&nbsp; env = BasicUsageEnvironment::createNew(*scheduler);<br><br>&nbsp;...<br><br>#ifdef DEBUG
<br>&nbsp;&nbsp;&nbsp; *env &lt;&lt; &quot;Beginning streaming...\n&quot;;<br>#endif<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; outPipe_.open(rtpFileName_); // Open the file<br>&nbsp;&nbsp;&nbsp; if (!outPipe_) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cerr &lt;&lt; &quot;Could not open fifo for output&quot; &lt;&lt; endl;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(1);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; play();<br>&nbsp;&nbsp;&nbsp; compute();<br>}<br><br><br><br>void afterPlaying(void* /*clientData*/) {<br>&nbsp; // Just for the compiler<br>}<br><br><br><br>void pipeToRTP::play() {<br>&nbsp; unsigned const inputDataChunkSize
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = TRANSPORT_PACKETS_PER_NETWORK_PACKET*TRANSPORT_PACKET_SIZE;<br><br>&nbsp; // Open the input as a &#39;byte-stream file source&#39;:<br>&nbsp; Source = ByteStreamFileSource::createNew(*env, rtpFileName_, inputDataChunkSize);
<br>&nbsp; if (Source == NULL) {<br>&nbsp;&nbsp;&nbsp; *env &lt;&lt; &quot;Unable to open file \&quot;&quot; &lt;&lt; rtpFileName_<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;&lt; &quot;\&quot; as a byte-stream file source\n&quot;;<br>&nbsp;&nbsp;&nbsp; exit(1);<br>&nbsp; }<br>&nbsp; <br>&nbsp; // Create a &#39;framer&#39; for the input source (to give us proper inter-packet gaps):
<br>&nbsp; videoSource = MPEG2TransportStreamFramer::createNew(*env, Source);<br><br>&nbsp; // Finally, start playing:<br>#ifdef DEBUG<br>&nbsp; *env &lt;&lt; &quot;Beginning to read from file...\n&quot;;<br>#endif<br>&nbsp; videoSink-&gt;startPlaying(*videoSource, afterPlaying, videoSink);
<br>}<br><br><br><br>Right, so the only way I could manage to get this working was to use an ofstream object to write my data to, using a random filename which was passed to ByteStreamFileSource::createNew. Also, teh above functions play() and compute() HAD to be withing setupRTP() or else I would get a bad file descriptor error from select()... this probably has something to do with scope, but I will not investigate this further.&nbsp; Performace seems to be good, this uses minimal cpu cycles on my machine.&nbsp; 
<br><br>If anyone has a better alternative to ofstream, I would be happy to hear it!<br><br>Russell<br><br><br>&nbsp;</div>
<div><span class="gmail_quote">On 6/19/07, <b class="gmail_sendername">Russell Brennan</b> &lt;<a href="mailto:rjbrennn@gmail.com" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">rjbrennn@gmail.com
</a>&gt; wrote:</span>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0px 0px 0px 0.8ex; padding-left: 1ex;">
<div>Hello,</div>
<div>&nbsp;</div>
<div>I am trying to take a buffer of MPEG2-TS data which is constantly written to, and hook it up to live555 for output via RTP.&nbsp; I am currently basing my work on the testMEPG2TransportStreamer code, but obviously this was designed to stream a file.&nbsp; 
<br clear="all"></div>
<div>My current idea is not really panning out, due to the fact that I am apparently confused...&nbsp; ByteStreamFileSource is used in the test program, but it seems that I will need to use a different type of source.&nbsp; Is there an existing MediaSource that will work, or will I need to create my own? 
</div>
<div>&nbsp;</div>
<div>Also, MPEG2TransportStreamFramer is used as the videosource to videoSink-&gt;startPlaying . This would seem to still be valid for what I am doing, correct?</div>
<div>&nbsp;</div>
<div>Lastly, doEventLoop seems to continuously call SingleStep(), and from what I can make of this function, it seems that in some way this is where the data to be sent out is packaged and sent.&nbsp; Assuming that I get acknowledgement each time my buffer is ready to be sent out, can I simply call SingleStep() each time I have data to send? 
</div>
<div>&nbsp;</div>
<div>I hope I was clear enough... Thanks in advance!</div>
<div><br>-- <br>Russell Brennan<br>&nbsp;</div></blockquote></div><br><br clear="all"><br>-- <br>Russell Brennan<br><a href="mailto:RJBrennn@gmail.com" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">RJBrennn@gmail.com
</a><br>(708) 699-7314