bool Manager::initTrackUpdate()
{
    ScopedLock m_lock(mutex);

    for (std::map<int,Track*>::iterator it = audioTracks.begin(); it != audioTracks.end(); ++it)
        it->second->inactive = !it->second->is_static;

    for (std::map<int, Track*>::iterator it = videoTracks.begin(); it != videoTracks.end(); ++it)
        it->second->inactive = !it->second->is_static;

    for (std::map<int,Track*>::iterator it = subtitleTracks.begin(); it != subtitleTracks.end(); ++it)
        it->second->inactive = !it->second->is_static;

    for (std::map<int,Track*>::iterator it = teletextTracks.begin(); it != teletextTracks.end(); ++it)
        it->second->inactive = !it->second->is_static;

    return true;
}
Exemple #2
0
int syncread_open(struct inode *inode, struct file *filp) {
  int rc= 0;
  m_lock(&mutex);

  if (filp->f_mode & FMODE_WRITE) {
    int rc;
    printk("<1>open request for write\n");
    /* Se debe esperar hasta que no hayan otros lectores o escritores */
    pend_open_write++;
    while (writing || readers>0) {
      if (c_wait(&cond, &mutex)) {
        pend_open_write--;
        c_broadcast(&cond);
        rc= -EINTR;
        goto epilog;
      }
    }
    writing= TRUE;
    pend_open_write--;
    curr_size= 0;
    c_broadcast(&cond);
    printk("<1>open for write successful\n");
  }
  else if (filp->f_mode & FMODE_READ) {
    /* Para evitar la hambruna de los escritores, si nadie esta escribiendo
     * pero hay escritores pendientes (esperan porque readers>0), los
     * nuevos lectores deben esperar hasta que todos los lectores cierren
     * el dispositivo e ingrese un nuevo escritor.
     */
    while (!writing && pend_open_write>0) {
      if (c_wait(&cond, &mutex)) {
        rc= -EINTR;
        goto epilog;
      }
    }
    readers++;
    printk("<1>open for read\n");
  }

epilog:
  m_unlock(&mutex);
  return rc;
}
// Propagate the setting to the condition manager and to the setup
void DiscriSettingsWindow::propagate() {
        
    std::lock_guard<std::mutex> m_lock(m_interface.m_conditions->getDiscriLock());
    
    // Majority
    m_interface.m_conditions->setChannelsMajority(m_box_majority->value());
    
    for (int dc_id = 0; dc_id < m_interface.m_conditions->getNDiscriChannels(); dc_id++) {
        // Include channel or not
        m_interface.m_conditions->setDiscriChannelState(dc_id, m_discriChannels.at(dc_id).included->isChecked());
        // Width
        m_interface.m_conditions->setDiscriChannelWidth(dc_id, m_discriChannels.at(dc_id).width->value());
        // Threshold
        m_interface.m_conditions->setDiscriChannelThreshold(dc_id, m_discriChannels.at(dc_id).threshold->value());
    }
    
    // ask condition manager to propagate the settings to the setup
    m_interface.m_conditions->propagateDiscriSettings();
}
bool CFEManager::Init()
{
	CFrontend * fe;
	unsigned short fekey;

	OpenThreads::ScopedLock<OpenThreads::Mutex> m_lock(mutex);
	have_sat = have_cable = have_terr = false;
	for(int i = 0; i < MAX_ADAPTERS; i++) {
		for(int j = 0; j < MAX_FE; j++) {
			fe = new CFrontend(j, i);
			if(fe->Open()) {
				fekey = MAKE_FE_KEY(i, j);
				femap.insert(std::pair <unsigned short, CFrontend*> (fekey, fe));
				INFO("add fe %d", fe->fenumber);
				if(livefe == NULL)
					livefe = fe;
				if (fe->hasSat())
					have_sat = true;
				if (fe->hasCable())
					have_cable = true;
				if (fe->hasTerr())
					have_terr = true;
			} else
				delete fe;
		}
	}
	for (unsigned i = 0; i < MAX_DMX_UNITS; i++)
		dmap.push_back(CFeDmx(i));

	INFO("found %d frontends, %d demuxes\n", (int)femap.size(), (int)dmap.size());
	/* for testing without a frontend, export SIMULATE_FE=1 */
	if (femap.empty() && getenv("SIMULATE_FE")) {
		INFO("SIMULATE_FE is set, adding dummy frontend for testing");
		fe = new CFrontend(0,0);
		fekey = MAKE_FE_KEY(0, 0);
		femap.insert(std::pair <unsigned short, CFrontend*> (fekey, fe));
		livefe = fe;
	}
	if (femap.empty())
		return false;

	return true;
}
int dvbsub_start(int pid)
#endif
{
#if HAVE_SPARK_HARDWARE || HAVE_DUCKBOX_HARDWARE
	isEplayer = _isEplayer;
	if (isEplayer && !dvbsub_paused)
		return 0;
#endif
	if(!dvbsub_paused && !pid)
		return 0;

	if(pid && (pid != dvbsub_pid)) {
		dvbsub_pause();
		if(dvbSubtitleConverter)
			dvbSubtitleConverter->Reset();
		dvbsub_pid = pid;
		pid_change_req = 1;
	}
printf("[dvb-sub] start, stopped %d pid %x\n", dvbsub_stopped, dvbsub_pid);
	if(dvbsub_pid) {
#if HAVE_SPARK_HARDWARE || HAVE_DUCKBOX_HARDWARE
		if (isEplayer) {
			OpenThreads::ScopedLock<OpenThreads::Mutex> m_lock(ass_mutex);
			std::map<int,ASS_Track*>::iterator it = ass_map.find(dvbsub_pid);
			if (it != ass_map.end())
				ass_track = it->second;
			else
				ass_track = NULL; //FIXME
		}
#endif
		dvbsub_stopped = 0;
		dvbsub_paused = false;
		if(dvbSubtitleConverter)
			dvbSubtitleConverter->Pause(false);
		pthread_mutex_lock(&readerMutex);
		pthread_cond_broadcast(&readerCond);
		pthread_mutex_unlock(&readerMutex);
		printf("[dvb-sub] started with pid 0x%x\n", dvbsub_pid);
	}

	return 1;
}
Exemple #6
0
int *
__isAlarm()
{
	int *al;

	m_lock(&kLock);
	if(!alarmKeyOnce) {
		t_keycreate(&isAlarmKey, NULL);
		++alarmKeyOnce;
	}
	m_unlock(&kLock);

	t_getspecific(isAlarmKey, &al);
	if( al == NULL ) {
		al = calloc(1, sizeof(int));
		t_setspecific(isAlarmKey, (void *)al);
	}

	return al;

}
Exemple #7
0
int *
__isIOFailed()
{
	int *io;

	m_lock(&kLock);
	if(!ioKeyOnce) {
		t_keycreate(&ioFailedKey, NULL);
		++ioKeyOnce;
	}
	m_unlock(&kLock);

	t_getspecific(ioFailedKey, &io);
	if( io == NULL ) {
		io = calloc(1, sizeof(int));
		t_setspecific(ioFailedKey, (void *)io);
	}

	return io;

}
Exemple #8
0
struct sigaction *
__old_sa_alarm()
{
	struct sigaction *sa;

	m_lock(&kLock);
	if(!saKeyOnce) {
		t_keycreate(&sa_alarmKey, NULL);
		++saKeyOnce;
	}
	m_unlock(&kLock);

	t_getspecific(sa_alarmKey, &sa);
	if( sa == NULL ) {
		sa = calloc(1, sizeof(struct sigaction));
		t_setspecific(sa_alarmKey, (void *)sa);
	}

	return sa;

}
void Manager::clearTracks()
{
    ScopedLock m_lock(mutex);

    for (std::map<int,Track*>::iterator it = audioTracks.begin(); it != audioTracks.end(); ++it)
        delete it->second;
    audioTracks.clear();

    for (std::map<int, Track*>::iterator it = videoTracks.begin(); it != videoTracks.end(); ++it)
        delete it->second;
    videoTracks.clear();

    for (std::map<int,Track*>::iterator it = subtitleTracks.begin(); it != subtitleTracks.end(); ++it)
        delete it->second;
    subtitleTracks.clear();

    for (std::map<int,Track*>::iterator it = teletextTracks.begin(); it != teletextTracks.end(); ++it)
        delete it->second;
    teletextTracks.clear();

    Programs.clear();
}
Exemple #10
0
bool cYTCache::useCachedCopy(MI_MOVIE_INFO *mi)
{
	std::string file = getName(mi);
	if (access(file, R_OK))
		return false;
	std::string xml = getName(mi, "xml");
	if (!access(xml, R_OK)) {
		mi->file.Url = file;
		return true;
	}
	{
		OpenThreads::ScopedLock<OpenThreads::Mutex> m_lock(mutex);
		if (pending.empty())
			return false;
		MI_MOVIE_INFO m = pending.front();
		if (compareMovieInfo(&m, mi)) {
			mi->file.Url = file;
			return true;
		}
	}
	
	return false;
}
Exemple #11
0
int bano_release(struct inode *inode, struct file *filp) {
	 m_lock(&mutex);

  if (filp->f_mode & FMODE_WRITE) {
    int dv = iminor(filp->f_inode);
    if (dv == 0) {
      // Esta saliendo una dama
      printk("<1>close for write successful dama\n");
      damas--;
    } else {
      // Esta saliendo un varon
      printk("<1>close for write successful varon\n");
      varones--;
    }
    c_broadcast(&cond);
  }
  else if (filp->f_mode & FMODE_READ) {
    printk("<1>close for read \n");
  }

  m_unlock(&mutex);
  return 0;
}
CFrontend * CFEManager::allocateFE(CZapitChannel * channel, bool forrecord)
{
	OpenThreads::ScopedLock<OpenThreads::Mutex> m_lock(mutex);

	if (forrecord)
		fedebug = 1;
	CFrontend * frontend = getFrontend(channel);
	if (frontend) {
#ifdef DYNAMIC_DEMUX
		int dnum = getDemux(channel->getTransponderId());
		INFO("record demux: %d", dnum);
		channel->setRecordDemux(dnum);
		if (forrecord && !dnum) {
			frontend = NULL;
		} else {
			cDemux::SetSource(dnum, frontend->fenumber);
		}
#else
		channel->setRecordDemux(frontend->fenumber+1);
		channel->setPipDemux(frontend->fenumber+1);
#if HAVE_COOL_HARDWARE
		/* I don't know if this check is necessary on cs, but it hurts on other hardware */
		if(femap.size() > 1)
#endif
			cDemux::SetSource(frontend->fenumber+1, frontend->fenumber);
#ifdef ENABLE_PIP
		/* FIXME until proper demux management */
		if (unused_demux)
			channel->setPipDemux(unused_demux);
		INFO("pip demux: %d", channel->getPipDemux());
#endif
#endif

	}
	return frontend;
}
Exemple #13
0
ssize_t syncread_read(struct file *filp, char *buf,
                    size_t count, loff_t *f_pos) {
  ssize_t rc;
  m_lock(&mutex);

  while (curr_size <= *f_pos && writing) {
    /* si el lector esta en el final del archivo pero hay un proceso
     * escribiendo todavia en el archivo, el lector espera.
     */
    if (c_wait(&cond, &mutex)) {
      printk("<1>read interrupted\n");
      rc= -EINTR;
      goto epilog;
    }
  }

  if (count > curr_size-*f_pos) {
    count= curr_size-*f_pos;
  }

  printk("<1>read %d bytes at %d\n", (int)count, (int)*f_pos);

  /* Transfiriendo datos hacia el espacio del usuario */
  if (copy_to_user(buf, syncread_buffer+*f_pos, count)!=0) {
    /* el valor de buf es una direccion invalida */
    rc= -EFAULT;
    goto epilog;
  }

  *f_pos+= count;
  rc= count;

epilog:
  m_unlock(&mutex);
  return rc;
}
bool CFEManager::unlockFrontend(CFrontend * frontend, bool unlock_demux)
{
	OpenThreads::ScopedLock<OpenThreads::Mutex> m_lock(mutex);
	have_locked = false;
	frontend->Unlock();
	if (unlock_demux) {
#ifdef DYNAMIC_DEMUX
		for (unsigned int i = 1; i < dmap.size(); i++) {
			if(dmap[i].tpid == frontend->getTsidOnid()) {
				dmap[i].Unlock();
				break;
			}
		}
#endif
	}
	for(fe_map_iterator_t it = femap.begin(); it != femap.end(); it++) {
		CFrontend * fe = it->second;
		if(fe->Locked()) {
			have_locked = true;
			break;
		}
	}
	return true;
}
Exemple #15
0
std::vector<MI_MOVIE_INFO> cYTCache::getPending(MI_MOVIE_INFO::miSource source, double *p_dltotal, double *p_dlnow, time_t *p_start)
{
	OpenThreads::ScopedLock<OpenThreads::Mutex> m_lock(mutex);
	std::vector<MI_MOVIE_INFO> res;
	for (std::vector<MI_MOVIE_INFO>::iterator it = pending.begin(); it != pending.end(); ++it)
		if ((*it).source == source)
			res.push_back(*it);
	if (!res.empty() && pending.front().source == source) {
		if (p_dltotal)
			*p_dltotal = dltotal;
		if (p_dlnow)
			*p_dlnow = dlnow;
		if (p_start)
			*p_start = dlstart;
	} else {
		if (p_dltotal)
			*p_dltotal = 0;
		if (p_dlnow)
			*p_dlnow = 0;
		if (p_start)
			*p_start = 0;
	}
	return res;
}
void CFbAccel::blit()
{
#ifdef PARTIAL_BLIT
	if (to_blit.xs == INT_MAX)
		return;

	int srcXa = to_blit.xs;
	int srcYa = to_blit.ys;
	int srcXb = to_blit.xe;
	int srcYb = to_blit.ye;
#else
	const int srcXa = 0;
	const int srcYa = 0;
	int srcXb = fb->xRes;
	int srcYb = fb->yRes;
#endif
	STMFBIO_BLT_DATA  bltData;
	memset(&bltData, 0, sizeof(STMFBIO_BLT_DATA));

	bltData.operation  = BLT_OP_COPY;
	//bltData.ulFlags  = BLT_OP_FLAGS_BLEND_SRC_ALPHA | BLT_OP_FLAGS_BLEND_DST_MEMORY; // we need alpha blending
	// src
	bltData.srcOffset  = lbb_off;
	bltData.srcPitch   = fb->stride;

	bltData.src_left   = srcXa;
	bltData.src_top    = srcYa;
	bltData.src_right  = srcXb;
	bltData.src_bottom = srcYb;

	bltData.srcFormat = SURF_BGRA8888;
	bltData.srcMemBase = STMFBGP_FRAMEBUFFER;

	/* calculate dst/blit factor */
	fb_var_screeninfo s;
	if (ioctl(fb->fd, FBIOGET_VSCREENINFO, &s) == -1)
		perror("CFbAccel <FBIOGET_VSCREENINFO>");

#ifdef PARTIAL_BLIT
	if (s.xres != last_xres) /* fb resolution has changed -> clear artifacts */
	{
		last_xres = s.xres;
		bltData.src_left   = 0;
		bltData.src_top    = 0;
		bltData.src_right  = xRes;
		bltData.src_bottom = yRes;
	}

	double xFactor = (double)s.xres/(double)xRes;
	double yFactor = (double)s.yres/(double)yRes;

	int desXa = xFactor * bltData.src_left;
	int desYa = yFactor * bltData.src_top;
	int desXb = xFactor * bltData.src_right;
	int desYb = yFactor * bltData.src_bottom;
#else
	const int desXa = 0;
	const int desYa = 0;
	int desXb = s.xres;
	int desYb = s.yres;
#endif

	/* dst */
	bltData.dstOffset  = 0;
	bltData.dstPitch   = s.xres * 4;

	bltData.dst_left   = desXa;
	bltData.dst_top    = desYa;
	bltData.dst_right  = desXb;
	bltData.dst_bottom = desYb;

	bltData.dstFormat = SURF_BGRA8888;
	bltData.dstMemBase = STMFBGP_FRAMEBUFFER;

	//printf("CFbAccel::blit: sx:%d sy:%d sxe:%d sye: %d dx:%d dy:%d dxe:%d dye:%d\n", srcXa, srcYa, srcXb, srcYb, desXa, desYa, desXb, desYb);
	if ((bltData.dst_right > s.xres) || (bltData.dst_bottom > s.yres))
		printf("CFbAccel::blit: values out of range desXb:%d desYb:%d\n",
			bltData.dst_right, bltData.dst_bottom);

	OpenThreads::ScopedLock<OpenThreads::Mutex> m_lock(mutex);
	if(ioctl(fb->fd, STMFBIO_SYNC_BLITTER) < 0)
		perror("CFbAccel::blit ioctl STMFBIO_SYNC_BLITTER 1");
	msync(lbb, fb->xRes * 4 * fb->yRes, MS_SYNC);
	if (ioctl(fb->fd, STMFBIO_BLT, &bltData ) < 0)
		perror("STMFBIO_BLT");
	if(ioctl(fb->fd, STMFBIO_SYNC_BLITTER) < 0)
		perror("CFbAccel::blit ioctl STMFBIO_SYNC_BLITTER 2");

#ifdef PARTIAL_BLIT
	to_blit.xs = to_blit.ys = INT_MAX;
	to_blit.xe = to_blit.ye = 0;
#endif
}
void CFbAccel::blit()
{
#ifdef ENABLE_GRAPHLCD
	nGLCD::Blit();
#endif
	msync(lbb, DEFAULT_XRES * 4 * DEFAULT_YRES, MS_SYNC);

	if (borderColor != borderColorOld || (borderColor != 0x00000000 && borderColor != 0xFF000000)) {
		borderColorOld = borderColor;
		switch(fb->mode3D) {
		case CFrameBuffer::Mode3D_off:
		default:
			blitBoxFB(0, 0, s.xres, sY, borderColor);		// top
			blitBoxFB(0, 0, sX, s.yres, borderColor);	// left
			blitBoxFB(eX, 0, s.xres, s.yres, borderColor);	// right
			blitBoxFB(0, eY, s.xres, s.yres, borderColor);	// bottom
			break;
		case CFrameBuffer::Mode3D_SideBySide:
			blitBoxFB(0, 0, s.xres, sY, borderColor);			// top
			blitBoxFB(0, 0, sX/2, s.yres, borderColor);			// left
			blitBoxFB(eX/2 + 1, 0, s.xres/2 + sX/2, s.yres, borderColor);	// middle
			blitBoxFB(s.xres/2 + eX/2 + 1, 0, s.xres, s.yres, borderColor);	// right
			blitBoxFB(0, eY, s.xres, s.yres, borderColor);			// bottom
			break;
		case CFrameBuffer::Mode3D_TopAndBottom:
			blitBoxFB(0, 0, s.xres, sY/2, borderColor); 			// top
			blitBoxFB(0, eY/2 + 1, s.xres, s.yres/2 + sY/2, borderColor); 	// middle
			blitBoxFB(0, s.yres/2 + eY/2 + 1, s.xres, s.yres, borderColor); // bottom
			blitBoxFB(0, 0, sX, s.yres, borderColor);			// left
			blitBoxFB(eX, 0, s.xres, s.yres, borderColor);			// right
			break;
		case CFrameBuffer::Mode3D_Tile:
			blitBoxFB(0, 0, (s.xres * 2)/3, (sY * 2)/3, borderColor);		// top
			blitBoxFB(0, 0, (sX * 2)/3, (s.yres * 2)/3, borderColor);		// left
			blitBoxFB((eX * 2)/3, 0, (s.xres * 2)/3, (s.yres * 2)/3, borderColor);	// right
			blitBoxFB(0, (eY * 2)/3, (s.xres * 2)/3, (s.yres * 2)/3, borderColor);	// bottom
			break;
		}
	}
	switch(fb->mode3D) {
	case CFrameBuffer::Mode3D_off:
	default:
		blitBB2FB(0, 0, DEFAULT_XRES, DEFAULT_YRES, sX, sY, eX, eY);
		break;
	case CFrameBuffer::Mode3D_SideBySide:
		blitBB2FB(0, 0, DEFAULT_XRES, DEFAULT_YRES, sX/2, sY, eX/2, eY);
		blitBB2FB(0, 0, DEFAULT_XRES, DEFAULT_YRES, s.xres/2 + sX/2, sY, s.xres/2 + eX/2, eY);
		break;
	case CFrameBuffer::Mode3D_TopAndBottom:
		blitBB2FB(0, 0, DEFAULT_XRES, DEFAULT_YRES, sX, sY/2, eX, eY/2);
		blitBB2FB(0, 0, DEFAULT_XRES, DEFAULT_YRES, sX, s.yres/2 + sY/2, eX, s.yres/2 + eY/2);
		break;
	case CFrameBuffer::Mode3D_Tile:
		blitBB2FB(0, 0, DEFAULT_XRES, DEFAULT_YRES, (sX * 2)/3, (sY * 2)/3, (eX * 2)/3, (eY * 2)/3);
		blitFB2FB(0, 0, s.xres/3, (s.yres * 2)/3, (s.xres * 2)/3, 0, s.xres, (s.yres * 2)/3);
		blitFB2FB(s.xres/3, 0, (s.xres * 2)/3, s.yres/3, 0, (s.yres * 2)/3, s.xres/3, s.yres);
		blitFB2FB(s.xres/3, s.yres/3, (s.xres * 2)/3, (s.yres * 2)/3, s.xres/3, (s.yres * 2)/3, (s.xres * 2)/3, s.yres);
		break;
	}
	OpenThreads::ScopedLock<OpenThreads::Mutex> m_lock(mutex);
	if(ioctl(fb->fd, STMFBIO_SYNC_BLITTER) < 0)
		perror("CFrameBuffer::blit ioctl STMFBIO_SYNC_BLITTER 2");
}
void CFbAccel::blit2FB(void *fbbuff, uint32_t width, uint32_t height, uint32_t xoff, uint32_t yoff, uint32_t xp, uint32_t yp, bool transp)
{
#if !HAVE_SPARK_HARDWARE && !HAVE_DUCKBOX_HARDWARE
	int  xc, yc;
	xc = (width > fb->xRes) ? fb->xRes : width;
	yc = (height > fb->yRes) ? fb->yRes : height;
#endif
#ifdef USE_NEVIS_GXA
	(void)transp;
	u32 cmd;
	void *uKva;

	uKva = cs_phys_addr(fbbuff);
	//printf("CFbAccel::blit2FB: data %x Kva %x\n", (int) fbbuff, (int) uKva);

	if (uKva != NULL) {
		OpenThreads::ScopedLock<OpenThreads::Mutex> m_lock(mutex);
		cmd = GXA_CMD_BLT | GXA_CMD_NOT_TEXT | GXA_SRC_BMP_SEL(1) | GXA_DST_BMP_SEL(2) | GXA_PARAM_COUNT(3);

		_write_gxa(gxa_base, GXA_BMP1_TYPE_REG, (3 << 16) | width);
		_write_gxa(gxa_base, GXA_BMP1_ADDR_REG, (unsigned int)uKva);

		_write_gxa(gxa_base, cmd, GXA_POINT(xoff, yoff)); /* destination pos */
		_write_gxa(gxa_base, cmd, GXA_POINT(xc, yc));     /* source width, FIXME real or adjusted xc, yc ? */
		_write_gxa(gxa_base, cmd, GXA_POINT(xp, yp));     /* source pos */

		return;
	}
#elif HAVE_SPARK_HARDWARE || HAVE_DUCKBOX_HARDWARE
	int x, y, dw, dh;
	x = xoff;
	y = yoff;
	dw = width - xp;
	dh = height - yp;

	size_t mem_sz = width * height * sizeof(fb_pixel_t);
	unsigned long ulFlags = 0;
	if (!transp) /* transp == false (default): use transparency from source alphachannel */
		ulFlags = BLT_OP_FLAGS_BLEND_SRC_ALPHA|BLT_OP_FLAGS_BLEND_DST_MEMORY; // we need alpha blending

	STMFBIO_BLT_EXTERN_DATA blt_data;
	memset(&blt_data, 0, sizeof(STMFBIO_BLT_EXTERN_DATA));
	blt_data.operation  = BLT_OP_COPY;
	blt_data.ulFlags    = ulFlags;
	blt_data.srcOffset  = 0;
	blt_data.srcPitch   = width * 4;
	blt_data.dstOffset  = lbb_off;
	blt_data.dstPitch   = fb->stride;
	blt_data.src_left   = xp;
	blt_data.src_top    = yp;
	blt_data.src_right  = width;
	blt_data.src_bottom = height;
	blt_data.dst_left   = x;
	blt_data.dst_top    = y;
	blt_data.dst_right  = x + dw;
	blt_data.dst_bottom = y + dh;
	blt_data.srcFormat  = SURF_ARGB8888;
	blt_data.dstFormat  = SURF_ARGB8888;
	blt_data.srcMemBase = (char *)backbuffer;
	blt_data.dstMemBase = (char *)fb->lfb;
	blt_data.srcMemSize = mem_sz;
	blt_data.dstMemSize = fb->stride * fb->yRes + lbb_off;

	OpenThreads::ScopedLock<OpenThreads::Mutex> m_lock(mutex);
#if 0
	ioctl(fb->fd, STMFBIO_SYNC_BLITTER);
#endif
	if (fbbuff != backbuffer)
		memmove(backbuffer, fbbuff, mem_sz);
	// icons are so small that they will still be in cache
	msync(backbuffer, backbuf_sz, MS_SYNC);

	if (ioctl(fb->fd, STMFBIO_BLT_EXTERN, &blt_data) < 0)
		perror("CFbAccel blit2FB STMFBIO_BLT_EXTERN");
	return;
#else
	fb_pixel_t *data = (fb_pixel_t *) fbbuff;

	uint8_t *d = (uint8_t *)lbb + xoff * sizeof(fb_pixel_t) + fb->stride * yoff;
	fb_pixel_t * d2;

	for (int count = 0; count < yc; count++ ) {
		fb_pixel_t *pixpos = &data[(count + yp) * width];
		d2 = (fb_pixel_t *) d;
		for (int count2 = 0; count2 < xc; count2++ ) {
			fb_pixel_t pix = *(pixpos + xp);
			if (transp || (pix & 0xff000000) == 0xff000000)
				*d2 = pix;
			else {
				uint8_t *in = (uint8_t *)(pixpos + xp);
				uint8_t *out = (uint8_t *)d2;
				int a = in[3];	/* TODO: big/little endian */
				*out = (*out + ((*in - *out) * a) / 256);
				in++; out++;
				*out = (*out + ((*in - *out) * a) / 256);
				in++; out++;
				*out = (*out + ((*in - *out) * a) / 256);
			}
			d2++;
			pixpos++;
		}
		d += fb->stride;
	}
#endif
}
void CFbAccel::paintLine(int xa, int ya, int xb, int yb, const fb_pixel_t col)
{
#if HAVE_TRIPLEDRAGON
	setColor(col);
	dfbdest->DrawLine(dfbdest, xa, ya, xb, yb);
#elif defined(USE_NEVIS_GXA)
	OpenThreads::ScopedLock<OpenThreads::Mutex> m_lock(mutex);
	/* draw a single vertical line from point xa/ya to xb/yb */
	unsigned int cmd = GXA_CMD_NOT_TEXT | GXA_SRC_BMP_SEL(2) | GXA_DST_BMP_SEL(2) | GXA_PARAM_COUNT(2) | GXA_CMD_NOT_ALPHA;

	setColor(col);
	_write_gxa(gxa_base, GXA_LINE_CONTROL_REG, 0x00000404);	/* X is major axis, skip last pixel */
	_write_gxa(gxa_base, cmd, GXA_POINT(xb, yb));		/* end point */
	_write_gxa(gxa_base, cmd, GXA_POINT(xa, ya));		/* start point */
#else
	int dx = abs (xa - xb);
	int dy = abs (ya - yb);
	if (dy == 0) /* horizontal line */
	{
		/* paintRect actually is 1 pixel short to the right,
		 * but that's bug-compatibility with the GXA code */
		paintRect(xa, ya, xb - xa, 1, col);
		return;
	}
	if (dx == 0) /* vertical line */
	{
		paintRect(xa, ya, 1, yb - ya, col);
		return;
	}
	int x;
	int y;
	int End;
	int step;

	if (dx > dy)
	{
		int p = 2 * dy - dx;
		int twoDy = 2 * dy;
		int twoDyDx = 2 * (dy-dx);

		if (xa > xb)
		{
			x = xb;
			y = yb;
			End = xa;
			step = ya < yb ? -1 : 1;
		}
		else
		{
			x = xa;
			y = ya;
			End = xb;
			step = yb < ya ? -1 : 1;
		}

		paintPixel(x, y, col);

		while (x < End)
		{
			x++;
			if (p < 0)
				p += twoDy;
			else
			{
				y += step;
				p += twoDyDx;
			}
			paintPixel(x, y, col);
		}
	}
	else
	{
		int p = 2 * dx - dy;
		int twoDx = 2 * dx;
		int twoDxDy = 2 * (dx-dy);

		if (ya > yb)
		{
			x = xb;
			y = yb;
			End = ya;
			step = xa < xb ? -1 : 1;
		}
		else
		{
			x = xa;
			y = ya;
			End = yb;
			step = xb < xa ? -1 : 1;
		}

		paintPixel(x, y, col);

		while (y < End)
		{
			y++;
			if (p < 0)
				p += twoDx;
			else
			{
				x += step;
				p += twoDxDy;
			}
			paintPixel(x, y, col);
		}
	}
#endif
}
void CFbAccel::paintRect(const int x, const int y, const int dx, const int dy, const fb_pixel_t col)
{
#if HAVE_TRIPLEDRAGON
	setColor(col);
	dfbdest->FillRectangle(dfbdest, x, y, dx, dy);
#elif defined(USE_NEVIS_GXA)
	OpenThreads::ScopedLock<OpenThreads::Mutex> m_lock(mutex);
	unsigned int cmd = GXA_CMD_BLT | GXA_CMD_NOT_TEXT | GXA_CMD_NOT_ALPHA |
			   GXA_SRC_BMP_SEL(6) | GXA_DST_BMP_SEL(2) | GXA_PARAM_COUNT(2);

	_write_gxa(gxa_base, GXA_BG_COLOR_REG, (unsigned int)col); /* setup the drawing color */
	_write_gxa(gxa_base, GXA_BMP6_TYPE_REG, (3 << 16) | (1 << 27)); /* 3 == 32bpp, 1<<27 == fill */
	_write_gxa(gxa_base, cmd, GXA_POINT(x, y));	/* destination pos */
	_write_gxa(gxa_base, cmd, GXA_POINT(dx, dy));	/* destination size */
	_write_gxa(gxa_base, GXA_BG_COLOR_REG, (unsigned int)fb->backgroundColor);

	/* the GXA seems to do asynchronous rendering, so we add a sync marker
	   to which the fontrenderer code can synchronize */
	add_gxa_sync_marker();
#elif HAVE_SPARK_HARDWARE || HAVE_DUCKBOX_HARDWARE
	if (dx <= 0 || dy <= 0)
		return;

	// The STM blitter introduces considerable overhead probably worth for small areas.  --martii
	if (dx * dy < DEFAULT_XRES * 4) {
		waitForIdle();
		fb_pixel_t *fbs = fb->getFrameBufferPointer() + (DEFAULT_XRES * y) + x;
		fb_pixel_t *fbe = fbs + DEFAULT_XRES * (dy - 1) + dx;
		int off = DEFAULT_XRES - dx;
		while (fbs < fbe) {
			fb_pixel_t *ex = fbs + dx;
			while (fbs < ex)
				*fbs++ = col;
			fbs += off;
		}
		return;
	}

	/* function has const parameters, so copy them here... */
	int width = dx;
	int height = dy;
	int xx = x;
	int yy = y;
	/* maybe we should just return instead of fixing this up... */
	if (x < 0) {
		fprintf(stderr, "[neutrino] fb::%s: x < 0 (%d)\n", __func__, x);
		width += x;
		if (width <= 0)
			return;
		xx = 0;
	}

	if (y < 0) {
		fprintf(stderr, "[neutrino] fb::%s: y < 0 (%d)\n", __func__, y);
		height += y;
		if (height <= 0)
			return;
		yy = 0;
	}

	int right = xx + width;
	int bottom = yy + height;

	if (right > (int)fb->xRes) {
		if (xx >= (int)fb->xRes) {
			fprintf(stderr, "[neutrino] fb::%s: x >= xRes (%d > %d)\n", __func__, xx, fb->xRes);
			return;
		}
		fprintf(stderr, "[neutrino] fb::%s: x+w > xRes! (%d+%d > %d)\n", __func__, xx, width, fb->xRes);
		right = fb->xRes;
	}
	if (bottom > (int)fb->yRes) {
		if (yy >= (int)fb->yRes) {
			fprintf(stderr, "[neutrino] fb::%s: y >= yRes (%d > %d)\n", __func__, yy, fb->yRes);
			return;
		}
		fprintf(stderr, "[neutrino] fb::%s: y+h > yRes! (%d+%d > %d)\n", __func__, yy, height, fb->yRes);
		bottom = fb->yRes;
	}

	STMFBIO_BLT_DATA bltData;
	memset(&bltData, 0, sizeof(STMFBIO_BLT_DATA));

	bltData.operation  = BLT_OP_FILL;
	bltData.dstOffset  = lbb_off;
	bltData.dstPitch   = fb->stride;

	bltData.dst_left   = xx;
	bltData.dst_top    = yy;
	bltData.dst_right  = right;
	bltData.dst_bottom = bottom;

	bltData.dstFormat  = SURF_ARGB8888;
	bltData.srcFormat  = SURF_ARGB8888;
	bltData.dstMemBase = STMFBGP_FRAMEBUFFER;
	bltData.srcMemBase = STMFBGP_FRAMEBUFFER;
	bltData.colour     = col;

	OpenThreads::ScopedLock<OpenThreads::Mutex> m_lock(mutex);
	if (ioctl(fb->fd, STMFBIO_BLT, &bltData ) < 0)
		fprintf(stderr, "blitRect FBIO_BLIT: %m x:%d y:%d w:%d h:%d s:%d\n", xx,yy,width,height,fb->stride);
#else
	int line = 0;
	int swidth = fb->stride / sizeof(fb_pixel_t);
	fb_pixel_t *fbp = fb->getFrameBufferPointer() + (swidth * y);
	int pos;
	while (line < dy)
	{
		for (pos = x; pos < x + dx; pos++)
			*(fbp + pos) = col;
		fbp += swidth;
		line++;
	}
#endif
}
void CFbAccel::waitForIdle(void)
{
	OpenThreads::ScopedLock<OpenThreads::Mutex> m_lock(mutex);
	ioctl(fb->fd, STMFBIO_SYNC_BLITTER);
}
static void* dvbsub_thread(void* /*arg*/)
{
	struct timespec restartWait;
	struct timeval now;
	set_threadname("dvbsub:main");

	sub_debug.print(Debug::VERBOSE, "%s started\n", __FUNCTION__);
	if (!dvbSubtitleConverter)
		dvbSubtitleConverter = new cDvbSubtitleConverter;

	int timeout = 1000000;
#if HAVE_SPARK_HARDWARE || HAVE_DUCKBOX_HARDWARE
	CFrameBuffer *fb = CFrameBuffer::getInstance();
	int xres = fb->getScreenWidth(true);
	int yres = fb->getScreenHeight(true);
	int clr_x0 = xres, clr_y0 = yres, clr_x1 = 0, clr_y1 = 0;
	uint32_t colortable[256];
	memset(colortable, 0, sizeof(colortable));
	uint32_t last_color = 0;
#endif

	while(dvbsub_running) {
#if HAVE_SPARK_HARDWARE || HAVE_DUCKBOX_HARDWARE
		if (ass_track) {
			usleep(100000); // FIXME ... should poll instead

			OpenThreads::ScopedLock<OpenThreads::Mutex> m_lock(ass_mutex);

			if (!ass_track)
				continue;

			if (ass_size != sub_font_size) {
				ass_size = sub_font_size;
				ass_set_font_scale(ass_renderer, ((double) ass_size)/ASS_CUSTOM_FONT_SIZE);
			}

			int detect_change = 0;
			int64_t pts;
			getPlayerPts(&pts);
			ASS_Image *image = ass_render_frame(ass_renderer, ass_track, pts/90, &detect_change);
			if (detect_change) {
				if (clr_x1 && clr_y1) {
					fb->paintBox(clr_x0, clr_y0, clr_x1 + 1, clr_y1 + 1, 0);
					clr_x0 = xres;
					clr_y0 = yres;
					clr_x1 = clr_y1 = 0;
				}

				while (image) {
					if (last_color != image->color) {
						last_color = image->color;
						uint32_t c = last_color >> 8, a = 255 - (last_color & 0xff);
						for (int i = 0; i < 256; i++) {
							uint32_t k = (a * i) >> 8;
							colortable[i] = k ? (c | (k << 24)) : 0;
						}
					}
					if (image->w && image->h && image->dst_x > -1 && image->dst_x + image->w < xres && image->dst_y > -1 && image->dst_y + image->h < yres) {
						if (image->dst_x < clr_x0)
							clr_x0 = image->dst_x;
						if (image->dst_y < clr_y0)
							clr_y0 = image->dst_y;
						if (image->dst_x + image->w > clr_x1)
							clr_x1 = image->dst_x + image->w;
						if (image->dst_y + image->h > clr_y1)
							clr_y1 = image->dst_y + image->h;

						uint32_t *lfb = fb->getFrameBufferPointer() + image->dst_x + xres * image->dst_y;
						unsigned char *bm = image->bitmap;
						int bm_add = image->stride - image->w;
						int lfb_add = xres - image->w;
						for (int y = 0; y < image->h; y++) {
							for (int x = 0; x < image->w; x++) {
								if (*bm)
									*lfb = colortable[*bm];
								lfb++, bm++;
							}
							lfb += lfb_add;
							bm += bm_add;
						}
					}
					image = image->next;
				}
				fb->getInstance()->blit();
			}
			continue;
		} else {
			if (clr_x1 && clr_y1) {
static void *ass_reader_thread(void *)
{
	set_threadname("ass_reader_thread");
	while (!sem_wait(&ass_sem)) {
		if (!ass_reader_running)
			break;

		ass_data *a = (ass_data *) ass_queue.pop();
		if (!a) {
			if (!ass_reader_running)
				break;
			continue;
		}

		OpenThreads::ScopedLock<OpenThreads::Mutex> m_lock(ass_mutex);
		std::map<int,ASS_Track*>::iterator it = ass_map.find(a->pid);
		ASS_Track *track;
		if (it == ass_map.end()) {
			CFrameBuffer *fb = CFrameBuffer::getInstance();
			int xres = fb->getScreenWidth(true);
			int yres = fb->getScreenHeight(true);
			if (!ass_library) {
				ass_library = ass_library_init();
				ass_set_extract_fonts(ass_library, 1);
				ass_set_style_overrides(ass_library, NULL);
				ass_renderer = ass_renderer_init(ass_library);
				ass_set_frame_size(ass_renderer, xres, yres);
				ass_set_margins(ass_renderer, 3 * yres / 100, 3 * yres / 100, 3 * xres / 100, 3 * xres / 100);
				ass_set_use_margins(ass_renderer, 1);
				ass_set_hinting(ass_renderer, ASS_HINTING_LIGHT);
				ass_set_aspect_ratio(ass_renderer, 1.0, 1.0);
				ass_font = *sub_font_file;
				ass_set_fonts(ass_renderer, ass_font.c_str(), "Arial", 0, NULL, 1);
			}
			track = ass_new_track(ass_library);
			track->PlayResX = xres;
			track->PlayResY = yres;
			ass_size = sub_font_size;
			ass_set_font_scale(ass_renderer, ((double) ass_size)/ASS_CUSTOM_FONT_SIZE);
			if (a->c->subtitle_header) {
				std::string ass_hdr = ass_subtitle_header_default();
				if (ass_hdr.compare((char*) a->c->subtitle_header)) {
					ass_process_codec_private(track, (char *) a->c->subtitle_header, a->c->subtitle_header_size);
				} else {
					// This is the FFMPEG default ASS header. Use something more suitable instead:
					ass_hdr = ass_subtitle_header_custom();
					ass_process_codec_private(track, (char *) ass_hdr.c_str(), ass_hdr.length());
				}
			}
			ass_map[a->pid] = track;
			if (a->pid == dvbsub_pid)
				ass_track = track;
//fprintf(stderr, "### got subtitle track %d, subtitle header: \n---\n%s\n---\n", pid, c->subtitle_header);
		} else
			track = it->second;
		for (unsigned int i = 0; i < a->sub.num_rects; i++)
			if (a->sub.rects[i]->ass)
				ass_process_data(track, a->sub.rects[i]->ass, strlen(a->sub.rects[i]->ass));
		avsubtitle_free(&a->sub);
		delete a;
	}
	ass_reader_running = false;
	pthread_exit(NULL);
}
bool Manager::selectProgram(const int id)
{
    ScopedLock m_lock(mutex);
    std::map<int,Program>::iterator i = Programs.find(id);
    if (i != Programs.end()) {

        // mark all tracks as hidden
        for (std::map<int,Track*>::iterator it = audioTracks.begin(); it != audioTracks.end(); ++it)
            it->second->hidden = true;

        for (std::map<int, Track*>::iterator it = videoTracks.begin(); it != videoTracks.end(); ++it)
            it->second->hidden = true;

        for (std::map<int,Track*>::iterator it = subtitleTracks.begin(); it != subtitleTracks.end(); ++it)
            it->second->hidden = true;

        for (std::map<int,Track*>::iterator it = teletextTracks.begin(); it != teletextTracks.end(); ++it)
            it->second->hidden = true;

        // unhide tracks that are part of the selected program
        for (unsigned int j = 0; j < i->second.streams.size(); j++) {
            AVStream *stream = i->second.streams[j];
            bool h = true;
            for (std::map<int,Track*>::iterator it = audioTracks.begin(); h && (it != audioTracks.end()); ++it)
                if (stream == it->second->stream)
                    h = it->second->hidden = false;

            if (!h)
                continue;

            for (std::map<int, Track*>::iterator it = videoTracks.begin(); h && (it != videoTracks.end()); ++it)
                if (stream == it->second->stream)
                    h = it->second->hidden = false;

            if (!h)
                continue;

            for (std::map<int,Track*>::iterator it = subtitleTracks.begin(); h && (it != subtitleTracks.end()); ++it)
                if (stream == it->second->stream)
                    h = it->second->hidden = false;

            if (!h)
                continue;

            for (std::map<int,Track*>::iterator it = teletextTracks.begin(); h && (it != teletextTracks.end()); ++it)
                if (stream == it->second->stream)
                    h = it->second->hidden = false;
        }

        // tell ffmpeg what we're interested in
        for (std::map<int,Track*>::iterator it = audioTracks.begin(); it != audioTracks.end(); ++it)
            if (it->second->hidden || it->second->inactive) {
                it->second->stream->discard = AVDISCARD_ALL;
            } else {
                it->second->stream->discard = AVDISCARD_NONE;
                player->input.SwitchAudio(it->second);
            }

        for (std::map<int, Track*>::iterator it = videoTracks.begin(); it != videoTracks.end(); ++it)
            if (it->second->hidden || it->second->inactive) {
                it->second->stream->discard = AVDISCARD_ALL;
            } else {
                it->second->stream->discard = AVDISCARD_NONE;
                player->input.SwitchVideo(it->second);
            }

        for (std::map<int,Track*>::iterator it = subtitleTracks.begin(); it != subtitleTracks.end(); ++it)
            if (it->second->hidden || it->second->inactive) {
                it->second->stream->discard = AVDISCARD_ALL;
            } else {
                it->second->stream->discard = AVDISCARD_NONE;
                player->input.SwitchSubtitle(it->second);
            }

        for (std::map<int,Track*>::iterator it = teletextTracks.begin(); it != teletextTracks.end(); ++it)
            if (it->second->hidden || it->second->inactive) {
                it->second->stream->discard = AVDISCARD_ALL;
            } else {
                it->second->stream->discard = AVDISCARD_NONE;
                player->input.SwitchTeletext(it->second);
            }

        return true;
    }
    return false;
}
Exemple #25
0
void func(const char* name, int mokey)
{
	boost::mutex m_mutex;
	boost::mutex::scoped_lock m_lock(m_mutex);
	std::cout << name << ": make money " << mokey << "a day" << std::endl;
}
Exemple #26
0
int bano_open(struct inode *inode, struct file *filp) {
	int rc= 0;
  m_lock(&mutex);

  if (filp->f_mode & FMODE_WRITE) {
    int dv = iminor(filp->f_inode);
    int rc;
    if (dv == 0) {
      // Esta entrando una dama
      printk("<1>open request for write dama\n");
      while (varones > 0) {
        printk("no cacho 1");
        if (c_wait(&cond, &mutex)) {
          c_broadcast(&cond);
          rc= -EINTR;
          if (damas == 0) {
            damas_pos = 0;
          }
          damas++;
          goto epilog;
        }
      }
      if (damas == 0) {
        damas_pos = 0;
      }
      damas++;
      curr_size_d = 0;
      printk("no cacho 2");
      c_broadcast(&cond);
      printk("<1>open for write successful damas: %d \n", damas);
    } else {
      // Esta entrando un varon
      printk("<1>open request for write varon\n");
      while (damas > 0) {
        if (c_wait(&cond, &mutex)) {
          c_broadcast(&cond);
          rc= -EINTR;
          if (varones == 0) {
            varones_pos = 0;
          }
          varones++;
          goto epilog;
        }
      }
      if (varones == 0) {
        varones_pos = 0;
      }
      varones++;
      curr_size_v= 0;
      c_broadcast(&cond);
      printk("<1>open for write successful varones: %d\n", varones);
    }

  }
  else if (filp->f_mode & FMODE_READ) {
    printk("<1>open for read\n");
  }

epilog:
  m_unlock(&mutex);
  return rc;
}
Exemple #27
0
void Player::SetChapters(std::vector<Chapter> &Chapters)
{
	OpenThreads::ScopedLock<OpenThreads::Mutex> m_lock(chapterMutex);
	chapters = Chapters;
}
int CFEManager::getEnabledCount()
{
	OpenThreads::ScopedLock<OpenThreads::Mutex> m_lock(mutex);
	return enabled_count;
}
void CFEManager::unlockDemux(int i)
{
	OpenThreads::ScopedLock<OpenThreads::Mutex> m_lock(mutex);
	if ((unsigned int) i < dmap.size())
		dmap[i].Unlock();
}
Exemple #30
0
ssize_t bano_read(struct file *filp, char *buf, size_t count, loff_t *f_pos) {
  ssize_t rc;
  int dv;
  m_lock(&mutex);


  dv = iminor(filp->f_inode);
  if (dv == 0) {
    // Dama
    while (curr_size_d <= *f_pos && damas > 0) {
      printk("What? \n");
      /* si el lector esta en el final del archivo pero hay un proceso
       * escribiendo todavia en el archivo, el lector espera.
       */
      if (c_wait(&cond, &mutex)) {
        printk("<1>read interrupted\n");
        rc= -EINTR;
        goto epilog;
      }
    }
    printk("Curresize: %d\n", (int) curr_size_d); 
    printk("Damas: %d\n", damas);

    if (count > curr_size_d-*f_pos) {
      count= curr_size_d-*f_pos;
    }

    printk("<1>read %d bytes at (damas) %d\n", (int)count, (int)*f_pos);

    /* Transfiriendo datos hacia el espacio del usuario */
    if (copy_to_user(buf, buffer_d+*f_pos, count)!=0) {
      /* el valor de buf es una direccion invalida */
      rc= -EFAULT;
      goto epilog;
    }

  } else {
    // Varon
    while (curr_size_v <= *f_pos && varones > 0) {
      printk("What? \n");
      /* si el lector esta en el final del archivo pero hay un proceso
       * escribiendo todavia en el archivo, el lector espera.
       */
      if (c_wait(&cond, &mutex)) {
        printk("<1>read interrupted\n");
        rc= -EINTR;
        goto epilog;
      }
    }
    printk("Curresize: %d\n", (int) curr_size_v); 
    printk("Varones: %d\n", varones);

    if (count > curr_size_v-*f_pos) {
      count= curr_size_v-*f_pos;
    }

    printk("<1>read %d bytes at (varones) %d\n", (int)count, (int)*f_pos);

    /* Transfiriendo datos hacia el espacio del usuario */
    if (copy_to_user(buf, buffer_v+*f_pos, count)!=0) {
      /* el valor de buf es una direccion invalida */
      rc= -EFAULT;
      goto epilog;
    }
  }


  *f_pos+= count;
  rc= count;

epilog:
  m_unlock(&mutex);
  return rc;
}