Ejemplo n.º 1
0
IRenderBuffer *CBaseRenderBufferPool::GetBuffer(unsigned int width, unsigned int height)
{
  if (!m_bConfigured)
    return nullptr;

  IRenderBuffer *renderBuffer = nullptr;

  void *header = nullptr;

  if (GetHeaderWithTimeout(header))
  {
    CSingleLock lock(m_bufferMutex);

    for (auto it = m_free.begin(); it != m_free.end(); ++it)
    {
      std::unique_ptr<IRenderBuffer> &buffer = *it;

      // Only return buffers of the same dimensions
      const unsigned int bufferWidth = buffer->GetWidth();
      const unsigned int bufferHeight = buffer->GetHeight();

      if (bufferWidth == width && bufferHeight == height)
      {
        renderBuffer = buffer.release();
        renderBuffer->SetHeader(header);
        m_free.erase(it);
        break;
      }
    }

    if (renderBuffer == nullptr)
    {
      CLog::Log(LOGDEBUG, "RetroPlayer[RENDER]: Creating render buffer of size %ux%u for buffer pool",
                width,
                height);

      std::unique_ptr<IRenderBuffer> renderBufferPtr(CreateRenderBuffer(header));
      if (renderBufferPtr->Allocate(m_format, width, height))
        renderBuffer = renderBufferPtr.release();
      else
        CLog::Log(LOGERROR, "RetroPlayer[RENDER]: Failed to allocate render buffer");
    }

    if (renderBuffer != nullptr)
    {
      renderBuffer->Acquire(GetPtr());
      renderBuffer->Update();
    }
  }

  return renderBuffer;
}
Ejemplo n.º 2
0
IRenderBuffer *CBaseRenderBufferPool::GetBuffer(size_t size)
{
  if (!m_bConfigured)
    return nullptr;

  // If frame size is unknown, set it now
  if (m_frameSize == 0)
    m_frameSize = size;

  // Changing sizes is not implemented
  if (m_frameSize != size)
    return nullptr;

  IRenderBuffer *renderBuffer = nullptr;

  void *header = nullptr;

  if (GetHeaderWithTimeout(header))
  {
    CSingleLock lock(m_bufferMutex);

    if (!m_free.empty())
    {
      renderBuffer = m_free.front().release();
      m_free.pop_front();
      renderBuffer->SetHeader(header);
    }
    else
    {
      CLog::Log(LOGDEBUG, "RetroPlayer[RENDER]: Creating render buffer for buffer pool");

      std::unique_ptr<IRenderBuffer> renderBufferPtr(CreateRenderBuffer(header));
      if (renderBufferPtr->Allocate(m_format, m_width, m_height, m_frameSize))
        renderBuffer = renderBufferPtr.release();
    }

    if (renderBuffer != nullptr)
    {
      renderBuffer->Acquire(GetPtr());
      renderBuffer->Update();
    }
  }

  return renderBuffer;
}