void OmxDecoder::ReleaseMediaResources() { mMediaResourcePromise.RejectIfExists(true, __func__); ReleaseVideoBuffer(); ReleaseAudioBuffer(); { Mutex::Autolock autoLock(mPendingVideoBuffersLock); MOZ_ASSERT(mPendingRecycleTexutreClients.empty()); // Release all pending recycle TextureClients, if they are not recycled yet. // This should not happen. See Bug 1042308. if (!mPendingRecycleTexutreClients.empty()) { printf_stderr("OmxDecoder::ReleaseMediaResources -- TextureClients are not recycled yet\n"); for (std::set<TextureClient*>::iterator it=mPendingRecycleTexutreClients.begin(); it!=mPendingRecycleTexutreClients.end(); it++) { GrallocTextureClientOGL* client = static_cast<GrallocTextureClientOGL*>(*it); client->ClearRecycleCallback(); if (client->GetMediaBuffer()) { mPendingVideoBuffers.push(BufferItem(client->GetMediaBuffer(), client->GetAndResetReleaseFenceHandle())); } } mPendingRecycleTexutreClients.clear(); } } { // Free all pending video buffers. Mutex::Autolock autoLock(mSeekLock); ReleaseAllPendingVideoBuffersLocked(); } if (mVideoSource.get()) { mVideoSource->stop(); mVideoSource.clear(); } if (mAudioSource.get()) { mAudioSource->stop(); mAudioSource.clear(); } mNativeWindowClient.clear(); mNativeWindow.clear(); // Reset this variable to make the first seek go to the previous keyframe // when resuming mLastSeekTime = -1; }
/* static */ void GonkVideoDecoderManager::RecycleCallback(TextureClient* aClient, void* aClosure) { GonkVideoDecoderManager* videoManager = static_cast<GonkVideoDecoderManager*>(aClosure); GrallocTextureClientOGL* client = static_cast<GrallocTextureClientOGL*>(aClient); aClient->ClearRecycleCallback(); videoManager->PostReleaseVideoBuffer(client->GetMediaBuffer()); }
void OmxDecoder::ReleaseMediaResources() { ReleaseVideoBuffer(); ReleaseAudioBuffer(); { Mutex::Autolock autoLock(mPendingVideoBuffersLock); MOZ_ASSERT(mPendingRecycleTexutreClients.empty()); // Release all pending recycle TextureClients, if they are not recycled yet. // This should not happen. See Bug 1042308. if (!mPendingRecycleTexutreClients.empty()) { printf_stderr("OmxDecoder::ReleaseMediaResources -- TextureClients are not recycled yet\n"); for (std::set<TextureClient*>::iterator it=mPendingRecycleTexutreClients.begin(); it!=mPendingRecycleTexutreClients.end(); it++) { GrallocTextureClientOGL* client = static_cast<GrallocTextureClientOGL*>(*it); client->ClearRecycleCallback(); if (client->GetMediaBuffer()) { mPendingVideoBuffers.push(BufferItem(client->GetMediaBuffer(), client->GetReleaseFenceHandle())); } } mPendingRecycleTexutreClients.clear(); } } { // Free all pending video buffers. Mutex::Autolock autoLock(mSeekLock); ReleaseAllPendingVideoBuffersLocked(); } if (mVideoSource.get()) { mVideoSource->stop(); mVideoSource.clear(); } if (mAudioSource.get()) { mAudioSource->stop(); mAudioSource.clear(); } mNativeWindowClient.clear(); mNativeWindow.clear(); }
/* static */ void GonkVideoDecoderManager::RecycleCallback(TextureClient* aClient, void* aClosure) { MOZ_ASSERT(aClient && !aClient->IsDead()); GonkVideoDecoderManager* videoManager = static_cast<GonkVideoDecoderManager*>(aClosure); GrallocTextureClientOGL* client = static_cast<GrallocTextureClientOGL*>(aClient); aClient->ClearRecycleCallback(); FenceHandle handle = aClient->GetAndResetReleaseFenceHandle(); videoManager->PostReleaseVideoBuffer(client->GetMediaBuffer(), handle); }
void OmxDecoder::RecycleCallbackImp(TextureClient* aClient) { aClient->ClearRecycleCallback(); { Mutex::Autolock autoLock(mPendingVideoBuffersLock); if (mPendingRecycleTexutreClients.find(aClient) == mPendingRecycleTexutreClients.end()) { printf_stderr("OmxDecoder::RecycleCallbackImp -- TextureClient is not pending recycle\n"); return; } mPendingRecycleTexutreClients.erase(aClient); GrallocTextureClientOGL* client = static_cast<GrallocTextureClientOGL*>(aClient); if (client->GetMediaBuffer()) { mPendingVideoBuffers.push(BufferItem(client->GetMediaBuffer(), client->GetReleaseFenceHandle())); } } sp<AMessage> notify = new AMessage(kNotifyPostReleaseVideoBuffer, mReflector->id()); // post AMessage to OmxDecoder via ALooper. notify->post(); }