Esempio n. 1
0
UINT	CDisplayDX::GetAdapterOrdinal()
{
    if (m_pDirect3DInstance == NULL || (g_Settings()->Get( "settings.player.force_default_adapter", false ) == true))
    {
        g_Log->Error( "Using default adapter for screen %d", m_DesiredScreenID );
        return D3DADAPTER_DEFAULT;
    }
    MONITORINFO monitorInfo;
    for( DWORD iMonitor = 0; iMonitor < m_dwNumMonitors; iMonitor++ )
    {
        if (iMonitor == m_DesiredScreenID)
        {
            MonitorInfo *pMonitorInfo = &m_Monitors[iMonitor];
            monitorInfo.cbSize = sizeof(MONITORINFO);
            if ( GetMonitorInfo( pMonitorInfo->hMonitor, &monitorInfo ) != 0 )
                for ( UINT iAdapter = 0; iAdapter < m_pDirect3DInstance->GetAdapterCount(); ++iAdapter )
                {
                    if ( m_pDirect3DInstance->GetAdapterMonitor(iAdapter) == pMonitorInfo->hMonitor )
                    {
                        g_Log->Info( "Using adapter %d for screen %d", iAdapter, m_DesiredScreenID );
                        return iAdapter;
                    }
                }
        }
    }
    g_Log->Info( "Using default adapter for screen %d", m_DesiredScreenID );
    return D3DADAPTER_DEFAULT;
}
Esempio n. 2
0
/*
	Start.
	Start decoding playlist.
*/
bool	CContentDecoder::Start()
{
	if( m_spPlaylist == NULL )
	{
		g_Log->Warning( "No playlist..." );
		return false;
	}
	
	//abs is a protection against malicious negative numbers giving large integer when converted to uint32
    m_LoopIterations = static_cast<uint32>(g_Settings()->Get( "settings.player.LoopIterations", 2 ));

	//	Start by opening, so we have a context to work with.
	m_bStop = false;

	m_pNextSheepThread = new thread( bind( &CContentDecoder::CalculateNextSheep, this ) );
	
#ifdef WIN32
	SetThreadPriority( (HANDLE)m_pNextSheepThread->native_handle(), THREAD_PRIORITY_BELOW_NORMAL );
	SetThreadPriorityBoost( (HANDLE)m_pNextSheepThread->native_handle(), TRUE );
#else
	struct sched_param sp;
	sp.sched_priority = 8; //Foreground NORMAL_PRIORITY_CLASS - THREAD_PRIORITY_BELOW_NORMAL
	pthread_setschedparam( (pthread_t)m_pNextSheepThread->native_handle(), SCHED_RR, &sp );
#endif

	while ( Initialized() == false )
		thread::sleep( get_system_time() + posix_time::milliseconds(100) );
		
	m_pDecoderThread = new thread( bind( &CContentDecoder::ReadPackets, this ) );
	
	int retry = 0;
	
	CVideoFrame *tmp = NULL;
   
	while ( retry < 10 && !m_FrameQueue.peek( tmp, false ) && !m_bStop)
	{
		thread::sleep( get_system_time() + posix_time::milliseconds(100) );
		retry++;
	}

	if (tmp == NULL)
		return false;

	return true;
}
Esempio n. 3
0
/*
	CContentDecoder.

*/
CContentDecoder::CContentDecoder( spCPlaylist _spPlaylist, bool _bStartByRandom, bool _bCalculateTransitions, const uint32 _queueLenght, AVPixelFormat _wantedFormat )
{
	g_Log->Info( "CContentDecoder()" );
	m_FadeCount = static_cast<uint32>(g_Settings()->Get("settings.player.fadecount", 30));
	//	We want errors!
	av_log_set_level( AV_LOG_ERROR );

	//	Register all formats and codecs.
	av_register_all();
	
    m_pScaler = NULL;
    m_ScalerWidth = 0;
    m_ScalerHeight = 0;
    
	m_bStartByRandom = _bStartByRandom;
	
	m_bCalculateTransitions = _bCalculateTransitions;

	m_pDecoderThread = NULL;
	
	m_FrameQueue.setMaxQueueElements(_queueLenght);
	
	m_NextSheepQueue.setMaxQueueElements(10);

	m_WantedPixelFormat = _wantedFormat;

	m_bStop = true;

	m_spPlaylist = _spPlaylist;
	
	m_bForceNext = false;
		
	m_sharedFrame = NULL;
	
	m_Initialized = false;
	m_NoSheeps = true;

	m_FadeIn = m_FadeCount;
	m_FadeOut = 0;
	m_prevLast = 0;
	
	m_MainVideoInfo = NULL;//new sMainVideoInfo();
	m_SecondVideoInfo = NULL;
}
bool	CContentDownloader::Startup( const bool _bPreview, bool _bReadOnlyInstance )
{
	g_Log->Info( "Attempting to start contentdownloader...", _bPreview );
	Shepherd::initializeShepherd();

	Shepherd::setRedirectServerName( g_Settings()->Get( "settings.content.redirectserver", std::string(REDIRECT_SERVER) ).c_str() );
	
	std::string root = g_Settings()->Get( "settings.content.sheepdir", g_Settings()->Root() + "content" );
	
	if (root.empty())
	{
		root = g_Settings()->Root() + "content";
		g_Settings()->Set( "settings.content.sheepdir", root );
	}
	
	Shepherd::setRootPath( root.c_str() );
	Shepherd::setCacheSize( g_Settings()->Get( "settings.content.cache_size", 2000 ), 0 );
	Shepherd::setCacheSize( g_Settings()->Get( "settings.content.cache_size_gold", 2000 ), 1 );
	if (g_Settings()->Get( "settings.content.unlimited_cache", true) == true)
		Shepherd::setCacheSize( 0, 0 );
	if (g_Settings()->Get( "settings.content.unlimited_cache_gold", true) == true)
		Shepherd::setCacheSize( 0, 1 );
	Shepherd::setPassword( g_Settings()->Get( "settings.content.password_md5", std::string("") ).c_str() );
	Shepherd::setUniqueID( g_Settings()->Get( "settings.content.unique_id", generateID() ).c_str() );
	Shepherd::setUseProxy( g_Settings()->Get( "settings.content.use_proxy", false ) );
	Shepherd::setRegistered( g_Settings()->Get( "settings.content.registered", false ) );
	Shepherd::setProxy( g_Settings()->Get( "settings.content.proxy", std::string("") ).c_str() );
	Shepherd::setProxyUserName( g_Settings()->Get( "settings.content.proxy_username", std::string("") ).c_str() );
	Shepherd::setProxyPassword( g_Settings()->Get( "settings.content.proxy_password", std::string("") ).c_str() );

	Shepherd::setSaveFrames( g_Settings()->Get( "settings.generator.save_frames", false ) );
	SheepGenerator::setNickName( g_Settings()->Get( "settings.generator.nickname", std::string("") ).c_str() );
	SheepGenerator::setURL( g_Settings()->Get( "settings.generator.user_url", std::string("") ).c_str() );

    m_gDownloader = NULL;
		
	if( g_Settings()->Get( "settings.content.download_mode", true ) && _bReadOnlyInstance == false)
	{
		m_gDownloader = new SheepDownloader();
		g_Log->Info( "Starting download thread..." );
		m_gDownloadThread = new boost::thread( boost::bind( &SheepDownloader::shepherdCallback, m_gDownloader ) );
#ifdef WIN32
		SetThreadPriority( (HANDLE)m_gDownloadThread->native_handle(), THREAD_PRIORITY_BELOW_NORMAL );
		SetThreadPriorityBoost( (HANDLE)m_gDownloadThread->native_handle(), TRUE );
#else
		struct sched_param sp;
		sp.sched_priority = 6; //Background NORMAL_PRIORITY_CLASS - THREAD_PRIORITY_BELOW_NORMAL
		pthread_setschedparam( (pthread_t)m_gDownloadThread->native_handle(), SCHED_RR, &sp );
#endif
	}
	else
		g_Log->Warning( "Downloading disabled." );

	if( g_Settings()->Get( "settings.generator.enabled", true ) && _bReadOnlyInstance == false)
	{
		//	Create the generators based on the number of processors.
		uint32 ncpus = 1;
		if( g_Settings()->Get( "settings.generator.all_cores", false ) )
		{
#ifdef WIN32
			SYSTEM_INFO sysInfo;
			GetSystemInfo( &sysInfo );
			ncpus = (uint32)sysInfo.dwNumberOfProcessors;
#else
	#ifdef MAC
			ncpus = static_cast<uint32>(MPProcessors());
        #else
#ifdef LINUX_GNU
			ncpus = sysconf( _SC_NPROCESSORS_ONLN );
#endif
	#endif
#endif
		}

		if (ncpus > 1)
			--ncpus;
		uint32 i;
		for( i=0; i<ncpus; i++ )
		{
			g_Log->Info( "Starting generator for core %d...", i );
			gGenerators.push_back( new SheepGenerator() );
			gGenerators[i]->setGeneratorId( i );
		}

		g_Log->Info( "Starting generator threads..." );

		for( i=0; i<gGenerators.size(); i++ )
		{
			gGeneratorThreads.push_back( new boost::thread( boost::bind( &SheepGenerator::shepherdCallback, gGenerators[i] ) ) );
#ifdef WIN32
			SetThreadPriority( (HANDLE)gGeneratorThreads[i]->native_handle(), THREAD_PRIORITY_IDLE );
			SetThreadPriorityBoost( (HANDLE)gGeneratorThreads[i]->native_handle(), FALSE );
#else
			struct sched_param sp;
			sp.sched_priority = 1; //THREAD_PRIORITY_IDLE - THREAD_PRIORITY_IDLE
			pthread_setschedparam( (pthread_t)gGeneratorThreads[i]->native_handle(), SCHED_RR, &sp );
#endif
		}
	}
	else
		g_Log->Warning( "Generators disabled..." );

	g_Log->Info( "...success" );

	return true;
}
Esempio n. 5
0
bool	CDisplayDX::InitDX9()
{
    if( m_pDirect3DInstance == NULL )
    {
        g_Log->Error( "Couldn't initialize Direct3D\nMake sure you have DirectX 9.0c or later installed." );
        return false;
    } else
        g_Log->Info( "Direct3D Initialized from old IDirect3D9 object" );


    memset( &m_PresentationParams, 0, sizeof(m_PresentationParams) );

    m_PresentationParams.BackBufferFormat = D3DFMT_X8R8G8B8;
    if (g_Settings()->Get( "settings.player.MultiDisplayMode", 0 ) != 2 && g_Settings()->Get( "settings.player.force_windowed_directx", true ) == true)
        m_PresentationParams.Windowed = TRUE;
    else
        m_PresentationParams.Windowed = !m_bFullScreen;

    D3DDISPLAYMODE dm = {0};
    if ( m_bFullScreen && m_pDirect3DInstance->GetAdapterDisplayMode( GetAdapterOrdinal(), &dm ) == D3D_OK )
    {
        m_PresentationParams.BackBufferWidth  = dm.Width;
        m_PresentationParams.BackBufferHeight = dm.Height;
    } else
    {
        m_PresentationParams.BackBufferWidth  = m_Width;
        m_PresentationParams.BackBufferHeight = m_Height;
    }
    g_Log->Info( "Using backbuffer w=%d h=%d", m_PresentationParams.BackBufferWidth, m_PresentationParams.BackBufferHeight);
    m_PresentationParams.BackBufferCount  = 1;
    m_PresentationParams.hDeviceWindow = m_WindowHandle;

    m_PresentationParams.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;

    if (g_Settings()->Get( "settings.player.vbl_sync", false ) == true)
        m_PresentationParams.PresentationInterval = D3DPRESENT_INTERVAL_ONE;
    else
        m_PresentationParams.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;

    m_PresentationParams.SwapEffect = D3DSWAPEFFECT_DISCARD;

    m_PresentationParams.EnableAutoDepthStencil = false;

    m_PresentationParams.MultiSampleType = D3DMULTISAMPLE_NONE;

    D3DCAPS9 caps;
    DWORD dwVertexProcessing = 0;
    m_pDirect3DInstance->GetDeviceCaps(0, D3DDEVTYPE_HAL, &caps);
    if ( caps.VertexShaderVersion >= D3DVS_VERSION(2,0) )
        m_Shader20 = true;
    if (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
    {
        if ( caps.VertexShaderVersion < D3DVS_VERSION(1,1) )
        {
            dwVertexProcessing = D3DCREATE_MIXED_VERTEXPROCESSING;
            g_Log->Info( "DX: Mixed vertex processing" );
            m_Shader20 = false;
        }
        else
        {
            dwVertexProcessing = D3DCREATE_HARDWARE_VERTEXPROCESSING;
            g_Log->Info( "DX: Hardware vertex processing" );
            m_Shader20 = true;

        }
    }
    else
    {
        dwVertexProcessing = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
        g_Log->Info( "DX: Software vertex processing" );
        m_Shader20 = false;
    }

    HRESULT devresult = m_pDirect3DInstance->CreateDevice( m_bFullScreen ? GetAdapterOrdinal() : D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, (gl_hFocusWindow == NULL) ? m_WindowHandle : gl_hFocusWindow, D3DCREATE_FPU_PRESERVE | dwVertexProcessing, &m_PresentationParams, &m_pDevice);
    /*	UINT adapterid = 0;
    	for (adapterid = 0; adapterid < m_pDirect3D->GetAdapterCount(); ++adapterid)
    	{
    		D3DADAPTER_IDENTIFIER9 adapterid9;
    		m_pDirect3D->GetAdapterIdentifier(adapterid, 0, &adapterid9);
    		if (strstr(adapterid9.Description, "PerfHUD") != 0)
    			break;
    	}
    	HRESULT devresult = m_pDirect3D->CreateDevice( adapterid, D3DDEVTYPE_REF, m_WindowHandle, D3DCREATE_FPU_PRESERVE | dwVertexProcessing, &m_PresentationParams, &m_pDevice);*/
    if(devresult  != D3D_OK )
    {
        g_Log->Error( "Failed to create Direct3D 9 device" );
        switch (devresult)
        {
        case D3DERR_DEVICELOST:
            g_Log->Info( "CreateDevice returned D3DERR_DEVICELOST" );
            break;
        case D3DERR_INVALIDCALL:
            g_Log->Info( "CreateDevice returned D3DERR_INVALIDCALL" );
            break;
        case D3DERR_NOTAVAILABLE:
            g_Log->Info( "CreateDevice returned D3DERR_NOTAVAILABLE" );
            break;
        case D3DERR_OUTOFVIDEOMEMORY:
            g_Log->Info( "CreateDevice returned D3DERR_OUTOFVIDEOMEMORY" );
            break;
        default:
            g_Log->Info( "CreateDevice returned %X", devresult );
            break;
        };
        return false;
    }
    if (gl_hFocusWindow == NULL && m_bFullScreen == true)
    {
        g_Log->Info( "gl_hFocusWindow = m_WindowHandle" );
        gl_hFocusWindow = m_WindowHandle;
    }
    return true;
}