Skip to content

Commit

Permalink
[mmalcodec] Add shared lock around MMAL operations
Browse files Browse the repository at this point in the history
  • Loading branch information
popcornmix committed Apr 18, 2015
1 parent a11df54 commit 008a685
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 0 deletions.
17 changes: 17 additions & 0 deletions xbmc/cores/dvdplayer/DVDCodecs/Video/MMALCodec.cpp
Expand Up @@ -127,6 +127,7 @@ CMMALVideo::CMMALVideo()

CMMALVideo::~CMMALVideo()
{
CSingleLock lock(m_sharedSection);
if (g_advancedSettings.CanLogComponent(LOGVIDEO))
CLog::Log(LOGDEBUG, "%s::%s %p", CLASSNAME, __func__, this);
if (!m_finished)
Expand Down Expand Up @@ -175,6 +176,7 @@ CMMALVideo::~CMMALVideo()

void CMMALVideo::PortSettingsChanged(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer)
{
CSingleLock lock(m_sharedSection);
MMAL_EVENT_FORMAT_CHANGED_T *fmt = mmal_event_format_changed_get(buffer);
mmal_format_copy(m_es_format, fmt->format);

Expand Down Expand Up @@ -289,6 +291,7 @@ static void dec_output_port_cb_static(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *b

bool CMMALVideo::change_dec_output_format()
{
CSingleLock lock(m_sharedSection);
MMAL_STATUS_T status;
if (g_advancedSettings.CanLogComponent(LOGVIDEO))
CLog::Log(LOGDEBUG, "%s::%s", CLASSNAME, __func__);
Expand Down Expand Up @@ -325,6 +328,7 @@ bool CMMALVideo::change_dec_output_format()

bool CMMALVideo::CreateDeinterlace(EINTERLACEMETHOD interlace_method)
{
CSingleLock lock(m_sharedSection);
MMAL_STATUS_T status;

if (g_advancedSettings.CanLogComponent(LOGVIDEO))
Expand Down Expand Up @@ -422,6 +426,7 @@ bool CMMALVideo::CreateDeinterlace(EINTERLACEMETHOD interlace_method)

bool CMMALVideo::DestroyDeinterlace()
{
CSingleLock lock(m_sharedSection);
MMAL_STATUS_T status;

if (g_advancedSettings.CanLogComponent(LOGVIDEO))
Expand Down Expand Up @@ -478,6 +483,7 @@ bool CMMALVideo::DestroyDeinterlace()

bool CMMALVideo::SendCodecConfigData()
{
CSingleLock lock(m_sharedSection);
MMAL_STATUS_T status;
if (!m_dec_input_pool)
return true;
Expand Down Expand Up @@ -507,6 +513,7 @@ bool CMMALVideo::SendCodecConfigData()

bool CMMALVideo::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options)
{
CSingleLock lock(m_sharedSection);
if (g_advancedSettings.CanLogComponent(LOGVIDEO))
CLog::Log(LOGDEBUG, "%s::%s usemmal:%d software:%d %dx%d", CLASSNAME, __func__, CSettings::Get().GetBool("videoplayer.usemmal"), hints.software, hints.width, hints.height);

Expand Down Expand Up @@ -709,13 +716,15 @@ bool CMMALVideo::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options)
m_preroll = !m_hints.stills;
m_speed = DVD_PLAYSPEED_NORMAL;

lock.Leave();
g_renderManager.PassCookie(this);
return true;
}

void CMMALVideo::Dispose()
{
g_renderManager.PassCookie(NULL);
CSingleLock lock(m_sharedSection);
m_finished = true;
Reset();
}
Expand All @@ -728,6 +737,7 @@ void CMMALVideo::SetDropState(bool bDrop)

int CMMALVideo::Decode(uint8_t* pData, int iSize, double dts, double pts)
{
CSingleLock lock(m_sharedSection);
//if (g_advancedSettings.CanLogComponent(LOGVIDEO))
// CLog::Log(LOGDEBUG, "%s::%s - %-8p %-6d dts:%.3f pts:%.3f ready_queue(%d)",
// CLASSNAME, __func__, pData, iSize, dts == DVD_NOPTS_VALUE ? 0.0 : dts*1e-6, pts == DVD_NOPTS_VALUE ? 0.0 : pts*1e-6, m_output_ready.size());
Expand Down Expand Up @@ -876,13 +886,15 @@ int CMMALVideo::Decode(uint8_t* pData, int iSize, double dts, double pts)
if (g_advancedSettings.CanLogComponent(LOGVIDEO))
CLog::Log(LOGDEBUG, "%s::%s - Nothing to do: ready_queue(%d) demux_queue(%d) space(%d) preroll(%d)",
CLASSNAME, __func__, m_output_ready.size(), m_demux_queue_length, mmal_queue_length(m_dec_input_pool->queue) * m_dec_input->buffer_size, m_preroll);
lock.Leave();
Sleep(10); // otherwise we busy spin
}
return ret;
}

void CMMALVideo::Reset(void)
{
CSingleLock lock(m_sharedSection);
if (g_advancedSettings.CanLogComponent(LOGVIDEO))
CLog::Log(LOGDEBUG, "%s::%s", CLASSNAME, __func__);

Expand Down Expand Up @@ -947,6 +959,7 @@ void CMMALVideo::SetSpeed(int iSpeed)

void CMMALVideo::Recycle(MMAL_BUFFER_HEADER_T *buffer)
{
CSingleLock lock(m_sharedSection);
if (g_advancedSettings.CanLogComponent(LOGVIDEO))
CLog::Log(LOGDEBUG, "%s::%s %p", CLASSNAME, __func__, buffer);

Expand All @@ -972,6 +985,7 @@ void CMMALVideo::Recycle(MMAL_BUFFER_HEADER_T *buffer)

bool CMMALVideo::GetPicture(DVDVideoPicture* pDvdVideoPicture)
{
CSingleLock lock(m_sharedSection);
if (!m_output_ready.empty())
{
CMMALVideoBuffer *buffer;
Expand Down Expand Up @@ -1031,6 +1045,7 @@ bool CMMALVideo::GetPicture(DVDVideoPicture* pDvdVideoPicture)

bool CMMALVideo::ClearPicture(DVDVideoPicture* pDvdVideoPicture)
{
CSingleLock lock(m_sharedSection);
if (pDvdVideoPicture->format == RENDER_FMT_MMAL)
{
if (g_advancedSettings.CanLogComponent(LOGVIDEO))
Expand All @@ -1043,12 +1058,14 @@ bool CMMALVideo::ClearPicture(DVDVideoPicture* pDvdVideoPicture)

bool CMMALVideo::GetCodecStats(double &pts, int &droppedPics)
{
CSingleLock lock(m_sharedSection);
droppedPics= -1;
return false;
}

void CMMALVideo::SetCodecControl(int flags)
{
CSingleLock lock(m_sharedSection);
m_codecControlFlags = flags;
if (g_advancedSettings.CanLogComponent(LOGVIDEO))
CLog::Log(LOGDEBUG, "%s::%s flags:%x", CLASSNAME, __func__, flags);
Expand Down
1 change: 1 addition & 0 deletions xbmc/cores/dvdplayer/DVDCodecs/Video/MMALCodec.h
Expand Up @@ -132,6 +132,7 @@ class CMMALVideo : public CDVDVideoCodec
bool m_preroll;
int m_codecControlFlags;

CCriticalSection m_sharedSection;
MMAL_COMPONENT_T *m_dec;
MMAL_PORT_T *m_dec_input;
MMAL_PORT_T *m_dec_output;
Expand Down

0 comments on commit 008a685

Please sign in to comment.