Bug 1145101: Part5. Re-use the same PDM when recreating a decoder. r=mattwoodrow

This ensure proper balance of PDM/Media Data Decoder Shutdown()
This commit is contained in:
Jean-Yves Avenard 2015-03-22 13:13:42 +11:00
parent 13e41fc86a
commit c4e90672b8
3 changed files with 15 additions and 11 deletions

View File

@ -582,10 +582,10 @@ void
MP4Reader::DisableHardwareAcceleration()
{
if (HasVideo() && mSharedDecoderManager) {
mPlatform->DisableHardwareAcceleration();
mSharedDecoderManager->DisableHardwareAcceleration();
const VideoDecoderConfig& video = mDemuxer->VideoConfig();
if (!mSharedDecoderManager->Recreate(mPlatform, video, mLayersBackendType, mDecoder->GetImageContainer())) {
if (!mSharedDecoderManager->Recreate(video, mLayersBackendType, mDecoder->GetImageContainer())) {
MonitorAutoLock mon(mVideo.mMonitor);
mVideo.mError = true;
if (mVideo.HasPromise()) {

View File

@ -105,24 +105,28 @@ SharedDecoderManager::CreateVideoDecoder(
return proxy.forget();
}
void
SharedDecoderManager::DisableHardwareAcceleration()
{
MOZ_ASSERT(mPDM);
mPDM->DisableHardwareAcceleration();
}
bool
SharedDecoderManager::Recreate(PlatformDecoderModule* aPDM,
const mp4_demuxer::VideoDecoderConfig& aConfig,
SharedDecoderManager::Recreate(const mp4_demuxer::VideoDecoderConfig& aConfig,
layers::LayersBackend aLayersBackend,
layers::ImageContainer* aImageContainer)
{
mDecoder->Flush();
mDecoder->Shutdown();
mDecoder = aPDM->CreateVideoDecoder(aConfig,
mDecoder = mPDM->CreateVideoDecoder(aConfig,
aLayersBackend,
aImageContainer,
mTaskQueue,
mCallback);
if (!mDecoder) {
mPDM = nullptr;
return false;
}
mPDM = aPDM;
nsresult rv = mDecoder->Init();
return rv == NS_OK;
}

View File

@ -42,10 +42,10 @@ public:
friend class SharedDecoderProxy;
friend class SharedDecoderCallback;
bool Recreate(PlatformDecoderModule* aPDM,
const mp4_demuxer::VideoDecoderConfig& aConfig,
layers::LayersBackend aLayersBackend,
layers::ImageContainer* aImageContainer);
void DisableHardwareAcceleration();
bool Recreate(const mp4_demuxer::VideoDecoderConfig& aConfig,
layers::LayersBackend aLayersBackend,
layers::ImageContainer* aImageContainer);
private:
virtual ~SharedDecoderManager();