// Handler for deliverEventQueue. // This thread decodes frames from events. void Cluster::deliveredEvent(const Event& e) { if (e.isCluster()) { EventFrame ef(e, e.getFrame()); // Stop the deliverEventQueue on update offers. // This preserves the connection decoder fragments for an update. // Only do this for the two brokers that are directly involved in this // offer: the one making the offer, or the one receiving it. const ClusterUpdateOfferBody* offer = castUpdateOffer(ef.frame.getBody()); if (offer && ( e.getMemberId() == self || MemberId(offer->getUpdatee()) == self) ) { QPID_LOG(info, *this << " stall for update offer from " << e.getMemberId() << " to " << MemberId(offer->getUpdatee())); deliverEventQueue.stop(); } deliverFrame(ef); } else if(!discarding) { if (e.isControl()) deliverFrame(EventFrame(e, e.getFrame())); else { try { decoder.decode(e, e.getData()); } catch (const Exception& ex) { // Close a connection that is sending us invalid data. QPID_LOG(error, *this << " aborting connection " << e.getConnectionId() << ": " << ex.what()); framing::AMQFrame abort((ClusterConnectionAbortBody())); deliverFrame(EventFrame(EventHeader(CONTROL, e.getConnectionId()), abort)); } } } }
void LiveDeviceSource::doGetNextFrame() { // VLOG(2) << "LiveDeviceSource::doGetNextFrame()"; // Arrange here for our "deliverFrame" member function to be called // when the next frame of data becomes available from the device. // This must be done in a non-blocking fashion - i.e., so that we // return immediately from this function even if no data is // currently available. // // If the device can be implemented as a readable socket, then one easy // way to do this is using a call to // envir().taskScheduler().turnOnBackgroundReadHandling( ... ) // (See examples of this call in the "liveMedia" directory.) // Check availability if ( m_qMediaSamples.empty() ) { m_bIsPlaying = false; return; } // We have had a sample m_bIsPlaying = true; // Deliver frame deliverFrame(); }
void StreamDeviceSource::doGetNextFrame() { // This function is called (by our 'downstream' object) when it asks for new data. // If a new frame of data is immediately available to be delivered, then do this now: if (0 != globalCircularBuffer.fillCount) { deliverFrame(); } }
void GAVideoLiveSource ::doGetNextFrame() { // This function is called (by our 'downstream' object) when it asks for new data. // Note: If, for some reason, the source device stops being readable (e.g., it gets closed), then you do the following: if (0 /* the source stops being readable */ /*%%% TO BE WRITTEN %%%*/) { handleClosure(NULL); return; } // If a new frame of data is immediately available to be delivered, then do this now: if (encoder_pktqueue_size(this->channelId) > 0) { deliverFrame(); } // No new data is immediately available to be delivered. We don't do anything more here. // Instead, our event trigger must be called (e.g., from a separate thread) when new data becomes available. }