<b style="color: rgb(255, 0, 0);">Below is the code to assist you to understand my previous question, many thanks!<br><br>envpW = envp; (Note: envpW&nbsp; is the global variable that I used to get the encoded frame from the writer thread)</b><br>
<br>void EncoderSource::doGetNextFrame() {<br>&nbsp;&nbsp; deliverFrame();<br>&nbsp;<br>&nbsp; if (0 /* the source stops being readable */) {<br>&nbsp;&nbsp;&nbsp; handleClosure(this);<br>&nbsp;&nbsp;&nbsp; return;<br>&nbsp; }<br>}<br><br>void EncoderSource::deliverFrame() {<br>
&nbsp; // Deliver the data here:<br><br>&nbsp;&nbsp;&nbsp; //Below from original write.cpp<br>&nbsp;&nbsp;&nbsp; //FILE&nbsp; *outputFp = NULL;<br>&nbsp;&nbsp;&nbsp; //WriterEnv&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *envp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = (WriterEnv *) arg;<br>&nbsp;&nbsp;&nbsp; //void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = THREAD_SUCCESS;<br>
&nbsp;&nbsp;&nbsp; extern WriterEnv&nbsp; *envpW;<br>&nbsp;&nbsp;&nbsp; WriterBufferElement we2;<br><br>&nbsp;&nbsp;&nbsp; //while (TRUE) {<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Get an encoded buffer from the video thread */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (FifoUtil_get(&amp;envpW-&gt;inFifo, &amp;we2) == FIFOUTIL_FAILURE) <br>
&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; //Set Device Source Params...<br>&nbsp;&nbsp;&nbsp; if (we2.frameSize &gt; fMaxSize){<br>&nbsp;&nbsp;&nbsp; we2.frameSize = fMaxSize;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; //Copy to DeviceSource...<br>&nbsp;&nbsp;&nbsp; //fTo = (unsigned char*)malloc(we2.frameSize);<br>
&nbsp;&nbsp;&nbsp; memcpy(fTo, we2.encodedBuffer, we2.frameSize);<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; printf(&quot;Frame %d bytes %d\n&quot;, we2.frameSize,fMaxSize);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Send back the buffer to the video thread */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (FifoUtil_put(&amp;envpW-&gt;outFifo, &amp;we2) == FIFOUTIL_FAILURE) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ERR(&quot;Failed to put buffer in output fifo\n&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; // Final cleanup.<br><br>&nbsp; // After delivering the data, inform the reader that it is now available:<br>&nbsp;nextTask() = envir().taskScheduler().scheduleDelayedTask(0,<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (TaskFunc*)FramedSource::afterGetting, this);<br>}<br><br>void *writerThread(void *arg)<br>{<br>extern WriterEnv&nbsp; *envpW;<br><br>&nbsp;&nbsp;&nbsp; WriterBufferElement wFlush&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = { WRITER_FLUSH };<br>&nbsp;&nbsp;&nbsp; WriterEnv&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *envp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = (WriterEnv *) arg;<br>
&nbsp;&nbsp;&nbsp; void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = THREAD_SUCCESS;<br>&nbsp;&nbsp;&nbsp; WriterBufferElement we;<br><br>&nbsp;&nbsp;&nbsp; <b style="color: rgb(255, 0, 0);">envpW = envp;</b><br>&nbsp;&nbsp;&nbsp; /* Signal that initialization is done and wait for other threads */<br>
&nbsp;&nbsp;&nbsp; Rendezvous_meet(envp-&gt;hRendezvousInit);<br><br>&nbsp;&nbsp;&nbsp; ERR(&quot;Entering writer main loop.\n&quot;);<br><br>&nbsp;&nbsp;&nbsp; startMPEG4Streamer();<br><br>cleanup:<br>&nbsp;&nbsp;&nbsp; /* Make sure the other threads aren&#39;t waiting for init to complete */<br>
&nbsp;&nbsp;&nbsp; Rendezvous_force(envp-&gt;hRendezvousInit);<br><br>&nbsp;&nbsp;&nbsp; /* Make sure the other threads aren&#39;t stuck pausing */<br>&nbsp;&nbsp;&nbsp; Pause_off(envp-&gt;hPause);<br><br>&nbsp;&nbsp;&nbsp; /* Make sure the video thread isn&#39;t stuck in FifoUtil_get() */<br>
&nbsp;&nbsp;&nbsp; FifoUtil_put(&amp;envp-&gt;outFifo, &amp;wFlush);<br><br>&nbsp;&nbsp;&nbsp; /* Meet up with other threads before cleaning up */<br>&nbsp;&nbsp;&nbsp; Rendezvous_meet(envp-&gt;hRendezvousCleanup);<br>}<br>