Skip to content

Commit

Permalink
MMAL: Sanity check when buffers are firmware owned
Browse files Browse the repository at this point in the history
A firmware owned buffer shouldn't be deleted
  • Loading branch information
popcornmix committed Apr 3, 2020
1 parent 1aa0f10 commit 2be649f
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 0 deletions.
6 changes: 6 additions & 0 deletions xbmc/cores/VideoPlayer/DVDCodecs/Video/MMALCodec.cpp
Expand Up @@ -203,6 +203,12 @@ void CMMALVideo::dec_output_port_cb(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buf
bool kept = false;
CMMALVideoBuffer *omvb = (CMMALVideoBuffer *)buffer->user_data;

if (omvb)
{
assert(omvb && omvb->m_firmware_owned);
omvb->m_firmware_owned = false;
}

assert(!(buffer->flags & MMAL_BUFFER_HEADER_FLAG_TRANSMISSION_FAILED));
if (buffer->cmd == 0)
{
Expand Down
23 changes: 23 additions & 0 deletions xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/MMALRenderer.cpp
Expand Up @@ -50,10 +50,12 @@ CMMALBuffer::~CMMALBuffer()
{
if (VERBOSE && CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->CanLogComponent(LOGVIDEO))
CLog::Log(LOGDEBUG, "%s::%s %p", CLASSNAME, __func__, static_cast<void*>(this));
assert(!m_firmware_owned);
}

void CMMALBuffer::Unref()
{
assert(!m_firmware_owned);
if (mmal_buffer)
{
mmal_buffer_header_release(mmal_buffer);
Expand Down Expand Up @@ -354,6 +356,7 @@ CMMALBuffer *CMMALPool::GetBuffer(uint32_t timeout)
if (omvb)
{
omvb->Acquire(GetPtr());
assert(!omvb->m_firmware_owned);
omvb->m_rendered = false;
omvb->m_state = m_state;
buffer->user_data = omvb;
Expand Down Expand Up @@ -401,6 +404,8 @@ void CMMALPool::Prime()
static_cast<void*>(m_mmal_pool), port->name, omvb->mmal_buffer->length,
omvb->mmal_buffer->cmd, omvb->mmal_buffer->flags, static_cast<void*>(omvb->Pool().get()));
}
assert(omvb && !omvb->m_firmware_owned);
omvb->m_firmware_owned = true;
MMAL_STATUS_T status = mmal_port_send_buffer(port, omvb->mmal_buffer);
if (status != MMAL_SUCCESS)
{
Expand Down Expand Up @@ -452,6 +457,9 @@ void CMMALRenderer::vout_input_port_cb(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *
static_cast<void*>(buffer), buffer->dts * 1e-6, buffer->pts * 1e-6, buffer->length,
buffer->cmd, buffer->flags);
}
CMMALBuffer *omvb = (CMMALBuffer *)buffer->user_data;
assert(omvb && omvb->m_firmware_owned);
omvb->m_firmware_owned = false;
buffer->length = 0;
mmal_queue_put(m_queue_process, buffer);
}
Expand Down Expand Up @@ -683,6 +691,8 @@ void CMMALRenderer::Process()
CMMALBuffer *omvb = (CMMALBuffer *)buffer->user_data;
assert(buffer == omvb->mmal_buffer);
CheckConfigurationVout(omvb->Width(), omvb->Height(), omvb->AlignedWidth(), omvb->AlignedHeight(), omvb->Encoding());
assert(omvb && !omvb->m_firmware_owned);
omvb->m_firmware_owned = true;
MMAL_STATUS_T status = mmal_port_send_buffer(m_vout_input, buffer);
if (status != MMAL_SUCCESS)
{
Expand Down Expand Up @@ -795,6 +805,8 @@ void CMMALRenderer::Run()

if (m_deint_input)
{
assert(omvb && !omvb->m_firmware_owned);
omvb->m_firmware_owned = true;
MMAL_STATUS_T status = mmal_port_send_buffer(m_deint_input, omvb->mmal_buffer);
if (status != MMAL_SUCCESS)
{
Expand All @@ -816,6 +828,8 @@ void CMMALRenderer::Run()
CheckConfigurationVout(omvb->Width(), omvb->Height(), omvb->AlignedWidth(), omvb->AlignedHeight(), omvb->Encoding());
if (m_vout_input)
{
assert(omvb && !omvb->m_firmware_owned);
omvb->m_firmware_owned = true;
MMAL_STATUS_T status = mmal_port_send_buffer(m_vout_input, omvb->mmal_buffer);
if (status != MMAL_SUCCESS)
{
Expand Down Expand Up @@ -849,6 +863,8 @@ void CMMALRenderer::Run()
{
if (VERBOSE && CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->CanLogComponent(LOGVIDEO))
CLog::Log(LOGDEBUG, "%s::%s send %p to m_vout_input", CLASSNAME, __func__, static_cast<void*>(omvb));
assert(omvb && !omvb->m_firmware_owned);
omvb->m_firmware_owned = true;
MMAL_STATUS_T status = mmal_port_send_buffer(m_vout_input, buffer);
if (status != MMAL_SUCCESS)
{
Expand Down Expand Up @@ -1060,6 +1076,7 @@ void CMMALRenderer::RenderUpdate(int index, int index2, bool clear, unsigned int
omvb->Acquire();
omvb->m_rendered = true;
assert(omvb->mmal_buffer->user_data == omvb);
assert(!omvb->m_firmware_owned);
mmal_queue_put(m_queue_process, omvb->mmal_buffer);
}
else
Expand Down Expand Up @@ -1328,6 +1345,9 @@ void CMMALRenderer::deint_input_port_cb(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T
static_cast<void*>(buffer), buffer->dts * 1e-6, buffer->pts * 1e-6, buffer->length,
buffer->cmd, buffer->flags);
}
CMMALBuffer *omvb = (CMMALBuffer *)buffer->user_data;
assert(omvb && omvb->m_firmware_owned);
omvb->m_firmware_owned = false;
mmal_queue_put(m_queue_process, buffer);
}

Expand All @@ -1346,6 +1366,9 @@ void CMMALRenderer::deint_output_port_cb(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T
static_cast<void*>(buffer), buffer->dts * 1e-6, buffer->pts * 1e-6, buffer->length,
buffer->cmd, buffer->flags);
}
CMMALBuffer *omvb = (CMMALBuffer *)buffer->user_data;
assert(omvb && omvb->m_firmware_owned);
omvb->m_firmware_owned = false;
mmal_queue_put(m_queue_process, buffer);
}

Expand Down
Expand Up @@ -104,6 +104,7 @@ class CMMALBuffer : public CVideoBuffer
MMALState m_state = MMALStateNone;
bool m_rendered = false;
bool m_stills = false;
bool m_firmware_owned = false;

virtual void Unref();
virtual std::shared_ptr<CMMALPool> Pool() { return std::dynamic_pointer_cast<CMMALPool>(m_pool); };
Expand Down

0 comments on commit 2be649f

Please sign in to comment.