already_AddRefed<MediaDataDecoder> PlatformDecoderModule::CreateDecoder(const TrackInfo& aConfig, FlushableTaskQueue* aTaskQueue, MediaDataDecoderCallback* aCallback, layers::LayersBackend aLayersBackend, layers::ImageContainer* aImageContainer) { nsRefPtr<MediaDataDecoder> m; bool hasPlatformDecoder = SupportsMimeType(aConfig.mMimeType); if (aConfig.GetAsAudioInfo()) { if (!hasPlatformDecoder && VorbisDataDecoder::IsVorbis(aConfig.mMimeType)) { m = new VorbisDataDecoder(*aConfig.GetAsAudioInfo(), aTaskQueue, aCallback); } else if (!hasPlatformDecoder && OpusDataDecoder::IsOpus(aConfig.mMimeType)) { m = new OpusDataDecoder(*aConfig.GetAsAudioInfo(), aTaskQueue, aCallback); } else { m = CreateAudioDecoder(*aConfig.GetAsAudioInfo(), aTaskQueue, aCallback); } return m.forget(); } if (!aConfig.GetAsVideoInfo()) { return nullptr; } if (H264Converter::IsH264(aConfig)) { m = new H264Converter(this, *aConfig.GetAsVideoInfo(), aLayersBackend, aImageContainer, aTaskQueue, aCallback); } else if (!hasPlatformDecoder && VPXDecoder::IsVPX(aConfig.mMimeType)) { m = new VPXDecoder(*aConfig.GetAsVideoInfo(), aImageContainer, aTaskQueue, aCallback); } else { m = CreateVideoDecoder(*aConfig.GetAsVideoInfo(), aLayersBackend, aImageContainer, aTaskQueue, aCallback); } return m.forget(); }
already_AddRefed<MediaDataDecoder> PlatformDecoderModule::CreateDecoder(const TrackInfo& aConfig, FlushableTaskQueue* aTaskQueue, MediaDataDecoderCallback* aCallback, layers::LayersBackend aLayersBackend, layers::ImageContainer* aImageContainer) { nsRefPtr<MediaDataDecoder> m; if (aConfig.GetAsAudioInfo()) { m = CreateAudioDecoder(*aConfig.GetAsAudioInfo(), aTaskQueue, aCallback); return m.forget(); } if (!aConfig.GetAsVideoInfo()) { return nullptr; } if (H264Converter::IsH264(aConfig)) { m = new H264Converter(this, *aConfig.GetAsVideoInfo(), aLayersBackend, aImageContainer, aTaskQueue, aCallback); } else { m = CreateVideoDecoder(*aConfig.GetAsVideoInfo(), aLayersBackend, aImageContainer, aTaskQueue, aCallback); } return m.forget(); }
already_AddRefed<MediaDataDecoder> PlatformDecoderModule::CreateDecoder(const TrackInfo& aConfig, FlushableTaskQueue* aTaskQueue, MediaDataDecoderCallback* aCallback, layers::LayersBackend aLayersBackend, layers::ImageContainer* aImageContainer) { RefPtr<MediaDataDecoder> m; bool hasPlatformDecoder = SupportsMimeType(aConfig.mMimeType); if (aConfig.GetAsAudioInfo()) { if (!hasPlatformDecoder && VorbisDataDecoder::IsVorbis(aConfig.mMimeType)) { m = new VorbisDataDecoder(*aConfig.GetAsAudioInfo(), aTaskQueue, aCallback); } else if (!hasPlatformDecoder && OpusDataDecoder::IsOpus(aConfig.mMimeType)) { m = new OpusDataDecoder(*aConfig.GetAsAudioInfo(), aTaskQueue, aCallback); } else { m = CreateAudioDecoder(*aConfig.GetAsAudioInfo(), aTaskQueue, aCallback); } return m.forget(); } if (!aConfig.GetAsVideoInfo()) { return nullptr; } MediaDataDecoderCallback* callback = aCallback; RefPtr<DecoderCallbackFuzzingWrapper> callbackWrapper; if (sEnableFuzzingWrapper) { callbackWrapper = new DecoderCallbackFuzzingWrapper(aCallback); callbackWrapper->SetVideoOutputMinimumInterval( TimeDuration::FromMilliseconds(sVideoOutputMinimumInterval_ms)); callbackWrapper->SetDontDelayInputExhausted(sDontDelayInputExhausted); callback = callbackWrapper.get(); } if (H264Converter::IsH264(aConfig)) { RefPtr<H264Converter> h = new H264Converter(this, *aConfig.GetAsVideoInfo(), aLayersBackend, aImageContainer, aTaskQueue, callback); const nsresult rv = h->GetLastError(); if (NS_SUCCEEDED(rv) || rv == NS_ERROR_NOT_INITIALIZED) { // The H264Converter either successfully created the wrapped decoder, // or there wasn't enough AVCC data to do so. Otherwise, there was some // problem, for example WMF DLLs were missing. m = h.forget(); } } else if (!hasPlatformDecoder && VPXDecoder::IsVPX(aConfig.mMimeType)) { m = new VPXDecoder(*aConfig.GetAsVideoInfo(), aImageContainer, aTaskQueue, callback); } else { m = CreateVideoDecoder(*aConfig.GetAsVideoInfo(), aLayersBackend, aImageContainer, aTaskQueue, callback); } if (callbackWrapper && m) { m = new DecoderFuzzingWrapper(m.forget(), callbackWrapper.forget()); } return m.forget(); }
already_AddRefed<MediaDataDecoder> PlatformDecoderModule::CreateDecoder(const TrackInfo& aConfig, FlushableTaskQueue* aTaskQueue, MediaDataDecoderCallback* aCallback, layers::LayersBackend aLayersBackend, layers::ImageContainer* aImageContainer) { nsRefPtr<MediaDataDecoder> m; bool hasPlatformDecoder = SupportsMimeType(aConfig.mMimeType); if (aConfig.GetAsAudioInfo()) { if (!hasPlatformDecoder && VorbisDataDecoder::IsVorbis(aConfig.mMimeType)) { m = new VorbisDataDecoder(*aConfig.GetAsAudioInfo(), aTaskQueue, aCallback); } else if (!hasPlatformDecoder && OpusDataDecoder::IsOpus(aConfig.mMimeType)) { m = new OpusDataDecoder(*aConfig.GetAsAudioInfo(), aTaskQueue, aCallback); } else { m = CreateAudioDecoder(*aConfig.GetAsAudioInfo(), aTaskQueue, aCallback); } return m.forget(); } if (!aConfig.GetAsVideoInfo()) { return nullptr; } MediaDataDecoderCallback* callback = aCallback; nsRefPtr<DecoderCallbackFuzzingWrapper> callbackWrapper; if (sEnableFuzzingWrapper) { callbackWrapper = new DecoderCallbackFuzzingWrapper(aCallback); callbackWrapper->SetVideoOutputMinimumInterval( TimeDuration::FromMilliseconds(sVideoOutputMinimumInterval_ms)); callbackWrapper->SetDontDelayInputExhausted(sDontDelayInputExhausted); callback = callbackWrapper.get(); } if (H264Converter::IsH264(aConfig)) { m = new H264Converter(this, *aConfig.GetAsVideoInfo(), aLayersBackend, aImageContainer, aTaskQueue, callback); } else if (!hasPlatformDecoder && VPXDecoder::IsVPX(aConfig.mMimeType)) { m = new VPXDecoder(*aConfig.GetAsVideoInfo(), aImageContainer, aTaskQueue, callback); } else { m = CreateVideoDecoder(*aConfig.GetAsVideoInfo(), aLayersBackend, aImageContainer, aTaskQueue, callback); } if (callbackWrapper && m) { m = new DecoderFuzzingWrapper(m.forget(), callbackWrapper.forget()); } return m.forget(); }