Skip to content

Commit

Permalink
Revert "[rbp] Refactor the vsync handle to support multiple callers"
Browse files Browse the repository at this point in the history
This reverts commit b1303dda441c9d5daa0d7344648cd4b972d99da6.
  • Loading branch information
popcornmix committed Aug 4, 2015
1 parent 98c58a2 commit 6c088ec
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 43 deletions.
68 changes: 30 additions & 38 deletions xbmc/linux/RBP.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,6 @@ CRBP::CRBP()
m_enabled = 0;
m_mb = mbox_open();
vcsm_init();
m_vsync_count = 0;
}

CRBP::~CRBP()
Expand Down Expand Up @@ -147,45 +146,11 @@ void CRBP::LogFirmwareVerison()
CLog::Log(LOGNOTICE, "Config:\n%s", response);
}

static void vsync_callback_static(DISPMANX_UPDATE_HANDLE_T u, void *arg)
{
CRBP *rbp = reinterpret_cast<CRBP*>(arg);
rbp->VSyncCallback();
}

void CRBP::VSyncCallback()
{
CSingleLock lock(m_vsync_lock);
m_vsync_count++;
m_vsync_cond.notifyAll();
}

unsigned int CRBP::WaitVsync(unsigned int target)
{
CSingleLock lock(m_vsync_lock);
if (target == ~0U)
target = m_vsync_count+1;

if (m_display == DISPMANX_NO_HANDLE)
{
CLog::Log(LOGDEBUG, "CRBP::%s skipping while display closed", __func__);
return m_vsync_count;
}

while (m_vsync_count < target)
if (!m_vsync_cond.wait(lock, 100))
break;

return m_vsync_count;
}

DISPMANX_DISPLAY_HANDLE_T CRBP::OpenDisplay(uint32_t device)
{
if (m_display == DISPMANX_NO_HANDLE)
{
m_display = vc_dispmanx_display_open( 0 /*screen*/ );
int s = vc_dispmanx_vsync_callback(m_display, vsync_callback_static, (void *)this);
assert(s == 0);
init_cursor();
}
return m_display;
Expand All @@ -194,11 +159,9 @@ DISPMANX_DISPLAY_HANDLE_T CRBP::OpenDisplay(uint32_t device)
void CRBP::CloseDisplay(DISPMANX_DISPLAY_HANDLE_T display)
{
assert(display == m_display);
int s = vc_dispmanx_vsync_callback(m_display, NULL, NULL);
assert(s == 0);
uninit_cursor();
vc_dispmanx_display_close(m_display);
m_display = DISPMANX_NO_HANDLE;
uninit_cursor();
}

void CRBP::GetDisplaySize(int &width, int &height)
Expand Down Expand Up @@ -251,6 +214,35 @@ unsigned char *CRBP::CaptureDisplay(int width, int height, int *pstride, bool sw
return image;
}


static void vsync_callback(DISPMANX_UPDATE_HANDLE_T u, void *arg)
{
CEvent *sync = (CEvent *)arg;
sync->Set();
}

void CRBP::WaitVsync()
{
int s;
DISPMANX_DISPLAY_HANDLE_T m_display = vc_dispmanx_display_open( 0 /*screen*/ );
if (m_display == DISPMANX_NO_HANDLE)
{
CLog::Log(LOGDEBUG, "CRBP::%s skipping while display closed", __func__);
return;
}
m_vsync.Reset();
s = vc_dispmanx_vsync_callback(m_display, vsync_callback, (void *)&m_vsync);
if (s == 0)
{
m_vsync.WaitMSec(1000);
}
else assert(0);
s = vc_dispmanx_vsync_callback(m_display, NULL, NULL);
assert(s == 0);
vc_dispmanx_display_close( m_display );
}


void CRBP::Deinitialize()
{
if (m_omx_image_init)
Expand Down
7 changes: 2 additions & 5 deletions xbmc/linux/RBP.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,7 @@ class CRBP
// stride can be null for packed output
unsigned char *CaptureDisplay(int width, int height, int *stride, bool swap_red_blue, bool video_only = true);
DllOMX *GetDllOMX() { return m_OMX ? m_OMX->GetDll() : NULL; }
unsigned int WaitVsync(unsigned int target = ~0U);
void VSyncCallback();
void WaitVsync();
double AdjustHDMIClock(double adjust);

void SuspendVideoOutput();
Expand All @@ -84,9 +83,7 @@ class CRBP
bool m_codec_wvc1_enabled;
COMXCore *m_OMX;
DISPMANX_DISPLAY_HANDLE_T m_display;
CCriticalSection m_vsync_lock;
XbmcThreads::ConditionVariable m_vsync_cond;
unsigned int m_vsync_count;
CEvent m_vsync;
class DllLibOMXCore;
CCriticalSection m_critSection;

Expand Down

0 comments on commit 6c088ec

Please sign in to comment.