예제 #1
0
파일: CtVideo.cpp 프로젝트: kif/Lima
    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);
            }
        }
    }
예제 #2
0
  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);
	  }
      }
  }