OMX_ERRORTYPE TorcOMXPort::EnablePort(bool Enable) { if (!m_handle || !m_parent) return OMX_ErrorUndefined; OMX_PARAM_PORTDEFINITIONTYPE portdefinition; OMX_INITSTRUCTURE(portdefinition); portdefinition.nPortIndex = m_port; OMX_ERRORTYPE error = OMX_GetParameter(m_handle, OMX_IndexParamPortDefinition, &portdefinition); OMX_CHECK(error, m_parent->GetName(), "Failed to get port definition"); if (portdefinition.bEnabled == OMX_FALSE && Enable) { LOG(VB_GENERAL, LOG_INFO, QString("%1: Enabling port %2").arg(m_parent->GetName()).arg(m_port)); error = OMX_SendCommand(m_handle, OMX_CommandPortEnable, m_port, NULL); OMX_CHECK(error, m_parent->GetName(), "Failed to send command"); return m_parent->WaitForResponse(OMX_CommandPortEnable, m_port, 1000); } else if (portdefinition.bEnabled == OMX_TRUE && !Enable) { LOG(VB_GENERAL, LOG_INFO, QString("%1: Disabling port %2").arg(m_parent->GetName()).arg(m_port)); error = OMX_SendCommand(m_handle, OMX_CommandPortDisable, m_port, NULL); OMX_CHECK(error, m_parent->GetName(), "Failed to send command"); return m_parent->WaitForResponse(OMX_CommandPortDisable, m_port, 1000); } return OMX_ErrorNone; }
OMX_ERRORTYPE TorcOMXTunnel::Flush(void) { if (!m_connected) return OMX_ErrorUndefined; QMutexLocker locker(m_lock); OMX_CHECK(m_source->FlushBuffer(OMX_DirOutput, m_sourceIndex, m_sourceDomain), m_source->GetName(), "Tunnel failed to flush source"); OMX_CHECK(m_destination->FlushBuffer(OMX_DirInput, m_destinationIndex, m_destinationDomain), m_destination->GetName(), "Tunnel failed to flush destination"); OMX_CHECK(m_source->WaitForResponse(OMX_CommandFlush, m_sourcePort, 200), m_source->GetName(), "Tunnel failed to flush source"); OMX_CHECK(m_destination->WaitForResponse(OMX_CommandFlush, m_destinationPort, 200), m_destination->GetName(), "Tunnel failed to flush destination"); return OMX_ErrorNone; }
OMX_ERRORTYPE TorcOMXPort::Flush(void) { if (!m_handle || !m_parent) return OMX_ErrorUndefined; QMutexLocker locker(m_lock); OMX_ERRORTYPE error = OMX_SendCommand(m_handle, OMX_CommandFlush, m_port, NULL); OMX_CHECK(error, m_parent->GetName(), "Failed to send command"); return OMX_ErrorNone; }
OMX_ERRORTYPE TorcOMXTunnel::Create(void) { // TODO add error checking to EnablePort calls if (!m_source || !m_destination || !m_core) return OMX_ErrorUndefined; if (!m_source->GetHandle() || !m_destination->GetHandle() || !m_core->m_omxSetupTunnel) return OMX_ErrorUndefined; QMutexLocker locker(m_lock); m_connected = false; QString description = QString("%1:%2->%3:%4").arg(m_source->GetName()).arg(m_sourcePort).arg(m_destination->GetName()).arg(m_destinationPort); OMX_CHECK(m_core->m_omxSetupTunnel(m_source->GetHandle(), m_sourcePort, m_destination->GetHandle(), m_destinationPort), "", QString("Failed to create tunnel: " + description)); LOG(VB_GENERAL, LOG_INFO, QString("Created tunnel: %1").arg(description)); m_connected = true; return OMX_ErrorNone; }
OMX_ERRORTYPE TorcOMXPort::CreateBuffers(void) { if (!m_handle) return OMX_ErrorUndefined; QMutexLocker locker(m_lock); OMX_PARAM_PORTDEFINITIONTYPE portdefinition; OMX_INITSTRUCTURE(portdefinition); portdefinition.nPortIndex = m_port; OMX_ERRORTYPE error = OMX_GetParameter(m_handle, OMX_IndexParamPortDefinition, &portdefinition); OMX_CHECK(error, m_parent->GetName(), "Failed to get port definition"); m_alignment = portdefinition.nBufferAlignment; for (OMX_U32 i = 0; i < portdefinition.nBufferCountActual; ++i) { OMX_BUFFERHEADERTYPE *buffer = NULL; error = OMX_AllocateBuffer(m_handle, &buffer, m_port, NULL, portdefinition.nBufferSize); if (OMX_ErrorNone != error) { OMX_ERROR(error, m_parent->GetName(), "Failed to allocate buffer"); return error; } buffer->pAppPrivate = (void*)this; buffer->nFilledLen = 0; buffer->nOffset = 0; buffer->nInputPortIndex = m_port; m_buffers.append(buffer); m_availableBuffers.enqueue(buffer); } LOG(VB_GENERAL, LOG_INFO, QString("%1: Created %2 %3byte buffers") .arg(m_parent->GetName()).arg(portdefinition.nBufferCountActual).arg(portdefinition.nBufferSize)); return OMX_ErrorNone; }