virtual void process(Data &aData) { DEB_MEMBER_FUNCT(); DEB_PARAM() << DEB_VAR1(aData); AutoMutex aLock(m_cnt.m_cond.mutex()); VideoImage *anImage = m_cnt.m_write_image; DEB_TRACE() << DEB_VAR1(*anImage); while(anImage->inused) m_cnt.m_cond.wait(); anImage->inused = -1; // Write Mode aLock.unlock(); data2Image(aData,*anImage); aLock.lock(); anImage->inused = 0; // Unlock ++m_cnt.m_image_counter; // if read Image is not use, swap if(!m_cnt.m_read_image->inused) { m_cnt.m_write_image = m_cnt.m_read_image; m_cnt.m_write_image->frameNumber = -1; m_cnt.m_read_image = anImage; if(m_cnt.m_image_callback) { CtVideo::Image anImageWrapper(&m_cnt,anImage); ImageCallback *cb = m_cnt.m_image_callback; aLock.unlock(); cb->newImage(anImageWrapper); } } }
virtual void process(Data &aData) { DEB_MEMBER_FUNCT(); DEB_PARAM() << DEB_VAR1(aData); AutoMutex aLock(m_cnt.m_cond.mutex()); VideoImage *anImage = m_cnt.m_write_image; DEB_TRACE() << DEB_VAR1(*anImage); while(anImage->inused) m_cnt.m_cond.wait(); anImage->inused = -1; // Write Mode aLock.unlock(); data2Image(aData,*anImage); //Check if data is still available bool still_available = _check_available(aData); aLock.lock(); anImage->inused = 0; // Unlock if(!still_available) { DEB_ALWAYS() << "invalidate video copy"; anImage->frameNumber = -1; // invalidate copy return; } ++m_cnt.m_image_counter; // if read Image is not use, swap if(!m_cnt.m_read_image->inused) { m_cnt.m_write_image = m_cnt.m_read_image; m_cnt.m_write_image->frameNumber = -1; m_cnt.m_read_image = anImage; if(m_cnt.m_image_callback) { CtVideo::Image anImageWrapper(&m_cnt,anImage); ImageCallback *cb = m_cnt.m_image_callback; aLock.unlock(); cb->newImage(anImageWrapper); } } }