void OmxDecoder::ReleaseMediaResources() { mVideoCodecRequest.DisconnectIfExists(); 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++) { GrallocTextureData* client = static_cast<GrallocTextureData*>((*it)->GetInternalData()); (*it)->ClearRecycleCallback(); if (client->GetMediaBuffer()) { mPendingVideoBuffers.push(BufferItem(client->GetMediaBuffer(), (*it)->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; }
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); GrallocTextureData* grallocData = static_cast<GrallocTextureData*>(aClient->GetInternalData()); if (grallocData->GetMediaBuffer()) { mPendingVideoBuffers.push(BufferItem(grallocData->GetMediaBuffer(), aClient->GetAndResetReleaseFenceHandle())); } } sp<AMessage> notify = new AMessage(kNotifyPostReleaseVideoBuffer, mReflector->id()); // post AMessage to OmxDecoder via ALooper. notify->post(); }