// StartPlayback -- Kick off video playback. OMX_ERRORTYPE COpenMaxVideo::StartDecoder(void) { OMX_ERRORTYPE omx_err; #if defined(OMX_DEBUG_VERBOSE) CLog::Log(LOGDEBUG, "%s::%s\n", CLASSNAME, __func__); #endif // transition decoder component to IDLE state omx_err = SetStateForComponent(OMX_StateIdle); if (omx_err) { CLog::Log(LOGERROR, "%s::%s - setting OMX_StateIdle failed with omx_err(0x%x)\n", CLASSNAME, __func__, omx_err); return omx_err; } // transition decoder component to executing state omx_err = SetStateForComponent(OMX_StateExecuting); if (omx_err) { CLog::Log(LOGERROR, "%s::%s - setting OMX_StateExecuting failed with omx_err(0x%x)\n", CLASSNAME, __func__, omx_err); return omx_err; } //prime the omx output buffers. PrimeFillBuffers(); return omx_err; }
// StopPlayback -- Stop video playback OMX_ERRORTYPE COpenMaxVideo::StopDecoder(void) { OMX_ERRORTYPE omx_err; #if defined(OMX_DEBUG_VERBOSE) CLog::Log(LOGDEBUG, "%s::%s\n", CLASSNAME, __func__); #endif // transition decoder component from executing to idle omx_err = SetStateForComponent(OMX_StateIdle); if (omx_err) { CLog::Log(LOGERROR, "%s::%s - setting OMX_StateIdle failed with omx_err(0x%x)\n", CLASSNAME, __func__, omx_err); return omx_err; } // we can free our allocated port buffers in OMX_StateIdle state. // free OpenMax input buffers. omx_err = FreeOMXInputBuffers(true); // free OpenMax output buffers. omx_err = FreeOMXOutputBuffers(true); // transition decoder component from idle to loaded omx_err = SetStateForComponent(OMX_StateLoaded); if (omx_err) CLog::Log(LOGERROR, "%s::%s - setting OMX_StateLoaded failed with omx_err(0x%x)\n", CLASSNAME, __func__, omx_err); return omx_err; }
void COMXCoreComponent::TransitionToStateLoaded() { if(!m_handle) return; if(GetState() != OMX_StateIdle) SetStateForComponent(OMX_StateIdle); if(GetState() != OMX_StateLoaded) SetStateForComponent(OMX_StateLoaded); }
bool COMXCoreComponent::Deinitialize() { OMX_ERRORTYPE omx_err; if(!m_DllOMXOpen) return false; m_exit = true; m_flush_input = true; m_flush_output = true; if(m_handle) { FlushAll(); FreeOutputBuffers(true); FreeInputBuffers(true); if(GetState() == OMX_StateExecuting) SetStateForComponent(OMX_StatePause); if(GetState() != OMX_StateIdle) SetStateForComponent(OMX_StateIdle); if(GetState() != OMX_StateLoaded) SetStateForComponent(OMX_StateLoaded); omx_err = m_DllOMX->OMX_FreeHandle(m_handle); if (omx_err != OMX_ErrorNone) { CLog::Log(LOGERROR, "COMXCoreComponent::Deinitialize - failed to free handle for component %s omx_err(0x%08x)", m_componentName.c_str(), omx_err); } m_handle = NULL; } m_input_port = 0; m_output_port = 0; m_componentName = ""; m_DllOMXOpen = false; CustomDecoderFillBufferDoneHandler = NULL; CustomDecoderEmptyBufferDoneHandler = NULL; m_DllOMX->Unload(); return true; }
bool OMXClock::StateExecute(bool lock) { if (!GetComponent()) return false; if (lock) Lock(); OMX_ERRORTYPE omxErr = OMX_ErrorNone; if (GetState() != OMX_StateExecuting) { StateIdle(false); omxErr = SetStateForComponent(OMX_StateExecuting); if (omxErr != OMX_ErrorNone) { if (lock) Unlock(); return false; } } m_lastMediaTime = 0.0f; if (lock) Unlock(); return true; }
void OMXClock::StateIdle(bool lock) { if (!GetComponent()) return; if (lock) Lock(); if (GetState() != OMX_StateIdle) SetStateForComponent(OMX_StateIdle); m_lastMediaTime = 0.0f; if (lock) Unlock(); }
OMX_ERRORTYPE COMXCoreComponent::AllocOutputBuffers(bool use_buffers /* = false */) { OMX_ERRORTYPE omx_err = OMX_ErrorNone; if(!m_handle) return OMX_ErrorUndefined; m_omx_output_use_buffers = use_buffers; OMX_PARAM_PORTDEFINITIONTYPE portFormat; OMX_INIT_STRUCTURE(portFormat); portFormat.nPortIndex = m_output_port; omx_err = OMX_GetParameter(m_handle, OMX_IndexParamPortDefinition, &portFormat); if(omx_err != OMX_ErrorNone) return omx_err; if(GetState() != OMX_StateIdle) { if(GetState() != OMX_StateLoaded) SetStateForComponent(OMX_StateLoaded); SetStateForComponent(OMX_StateIdle); } omx_err = EnablePort(m_output_port, false); if(omx_err != OMX_ErrorNone) return omx_err; m_output_alignment = portFormat.nBufferAlignment; m_output_buffer_count = portFormat.nBufferCountActual; m_output_buffer_size = portFormat.nBufferSize; CLog::Log(LOGDEBUG, "COMXCoreComponent::AllocOutputBuffers component(%s) - port(%d), nBufferCountMin(%lu), nBufferCountActual(%lu), nBufferSize(%lu) nBufferAlignmen(%lu)\n", m_componentName.c_str(), m_output_port, portFormat.nBufferCountMin, portFormat.nBufferCountActual, portFormat.nBufferSize, portFormat.nBufferAlignment); for (size_t i = 0; i < portFormat.nBufferCountActual; i++) { OMX_BUFFERHEADERTYPE *buffer = NULL; OMX_U8* data = NULL; if(m_omx_output_use_buffers) { data = (OMX_U8*)_aligned_malloc(portFormat.nBufferSize, m_output_alignment); omx_err = OMX_UseBuffer(m_handle, &buffer, m_output_port, NULL, portFormat.nBufferSize, data); } else { omx_err = OMX_AllocateBuffer(m_handle, &buffer, m_output_port, NULL, portFormat.nBufferSize); } if(omx_err != OMX_ErrorNone) { CLog::Log(LOGERROR, "COMXCoreComponent::AllocOutputBuffers component(%s) - OMX_UseBuffer failed with omx_err(0x%x)\n", m_componentName.c_str(), omx_err); if(m_omx_output_use_buffers && data) _aligned_free(data); return omx_err; } buffer->nOutputPortIndex = m_output_port; buffer->nFilledLen = 0; buffer->nOffset = 0; buffer->pAppPrivate = (void*)i; m_omx_output_buffers.push_back(buffer); m_omx_output_available.push(buffer); } omx_err = WaitForCommand(OMX_CommandPortEnable, m_output_port); m_flush_output = false; return omx_err; }