From 89639edfde9448794ac04785f1a0f47d28c5266e Mon Sep 17 00:00:00 2001 From: Jean-Yves Avenard Date: Tue, 6 Oct 2015 22:55:18 +1100 Subject: [PATCH] Bug 1211335: Have FFMpegDecoderModule properly return if a codec is supported. r=cpearce --- .../platforms/ffmpeg/FFmpegDataDecoder.cpp | 28 +++++++++++-------- .../platforms/ffmpeg/FFmpegDataDecoder.h | 2 ++ .../platforms/ffmpeg/FFmpegDecoderModule.h | 9 ++++-- 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/dom/media/platforms/ffmpeg/FFmpegDataDecoder.cpp b/dom/media/platforms/ffmpeg/FFmpegDataDecoder.cpp index 6079c8673be4..84e4c24f6add 100644 --- a/dom/media/platforms/ffmpeg/FFmpegDataDecoder.cpp +++ b/dom/media/platforms/ffmpeg/FFmpegDataDecoder.cpp @@ -70,24 +70,16 @@ ChoosePixelFormat(AVCodecContext* aCodecContext, const PixelFormat* aFormats) nsresult FFmpegDataDecoder::InitDecoder() { - StaticMutexAutoLock mon(sMonitor); - FFMPEG_LOG("Initialising FFmpeg decoder."); - if (!sFFmpegInitDone) { - avcodec_register_all(); -#ifdef DEBUG - av_log_set_level(AV_LOG_DEBUG); -#endif - sFFmpegInitDone = true; - } - - AVCodec* codec = avcodec_find_decoder(mCodecID); + AVCodec* codec = FindAVCodec(mCodecID); if (!codec) { NS_WARNING("Couldn't find ffmpeg decoder"); return NS_ERROR_FAILURE; } + StaticMutexAutoLock mon(sMonitor); + if (!(mCodecContext = avcodec_alloc_context3(codec))) { NS_WARNING("Couldn't init ffmpeg context"); return NS_ERROR_FAILURE; @@ -240,4 +232,18 @@ FFmpegDataDecoder::PrepareFrame() return mFrame; } +/* static */ AVCodec* +FFmpegDataDecoder::FindAVCodec(AVCodecID aCodec) +{ + StaticMutexAutoLock mon(sMonitor); + if (!sFFmpegInitDone) { + avcodec_register_all(); +#ifdef DEBUG + av_log_set_level(AV_LOG_DEBUG); +#endif + sFFmpegInitDone = true; + } + return avcodec_find_decoder(aCodec); +} + } // namespace mozilla diff --git a/dom/media/platforms/ffmpeg/FFmpegDataDecoder.h b/dom/media/platforms/ffmpeg/FFmpegDataDecoder.h index 9b7cfb124839..c8f98e0835ea 100644 --- a/dom/media/platforms/ffmpeg/FFmpegDataDecoder.h +++ b/dom/media/platforms/ffmpeg/FFmpegDataDecoder.h @@ -36,6 +36,8 @@ public: nsresult Drain() override; nsresult Shutdown() override; + static AVCodec* FindAVCodec(AVCodecID aCodec); + protected: // Flush and Drain operation, always run virtual void ProcessFlush(); diff --git a/dom/media/platforms/ffmpeg/FFmpegDecoderModule.h b/dom/media/platforms/ffmpeg/FFmpegDecoderModule.h index 0e99695d205d..24322d2da541 100644 --- a/dom/media/platforms/ffmpeg/FFmpegDecoderModule.h +++ b/dom/media/platforms/ffmpeg/FFmpegDecoderModule.h @@ -68,8 +68,13 @@ public: bool SupportsMimeType(const nsACString& aMimeType) override { - return FFmpegAudioDecoder::GetCodecId(aMimeType) != AV_CODEC_ID_NONE || - FFmpegH264Decoder::GetCodecId(aMimeType) != AV_CODEC_ID_NONE; + AVCodecID audioCodec = FFmpegAudioDecoder::GetCodecId(aMimeType); + AVCodecID videoCodec = FFmpegH264Decoder::GetCodecId(aMimeType); + if (audioCodec == AV_CODEC_ID_NONE && videoCodec == AV_CODEC_ID_NONE) { + return false; + } + AVCodecID codec = audioCodec != AV_CODEC_ID_NONE ? audioCodec : videoCodec; + return !!FFmpegDataDecoder::FindAVCodec(codec); } ConversionRequired