Bug 1270016: P3. Only check audio format at decode time. r?kamidphish
With raw streaming flac, we can't determine the audio format at the time the codec is opened.
Additionally, when using streaming flac, we do not have a STREAMINFO block. The FFmpeg flac decoder check that extradata is null and not its size and would error due to an invalid extradata.
MozReview-Commit-ID: KZ3n8b8WUMo
--- a/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp
+++ b/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp
@@ -16,18 +16,20 @@ namespace mozilla
FFmpegAudioDecoder<LIBAV_VER>::FFmpegAudioDecoder(FFmpegLibWrapper* aLib,
TaskQueue* aTaskQueue, MediaDataDecoderCallback* aCallback,
const AudioInfo& aConfig)
: FFmpegDataDecoder(aLib, aTaskQueue, aCallback, GetCodecId(aConfig.mMimeType))
{
MOZ_COUNT_CTOR(FFmpegAudioDecoder);
// Use a new MediaByteBuffer as the object will be modified during initialization.
- mExtraData = new MediaByteBuffer;
- mExtraData->AppendElements(*aConfig.mCodecSpecificConfig);
+ if (aConfig.mCodecSpecificConfig && aConfig.mCodecSpecificConfig->Length()) {
+ mExtraData = new MediaByteBuffer;
+ mExtraData->AppendElements(*aConfig.mCodecSpecificConfig);
+ }
}
RefPtr<MediaDataDecoder::InitPromise>
FFmpegAudioDecoder<LIBAV_VER>::Init()
{
nsresult rv = InitDecoder();
return rv == NS_OK ? InitPromise::CreateAndResolve(TrackInfo::kAudioTrack, __func__)
@@ -137,16 +139,26 @@ FFmpegAudioDecoder<LIBAV_VER>::DoDecode(
int bytesConsumed =
mLib->avcodec_decode_audio4(mCodecContext, mFrame, &decoded, &packet);
if (bytesConsumed < 0) {
NS_WARNING("FFmpeg audio decoder error.");
return DecodeResult::DECODE_ERROR;
}
+ if (mFrame->format != AV_SAMPLE_FMT_FLT &&
+ mFrame->format != AV_SAMPLE_FMT_FLTP &&
+ mFrame->format != AV_SAMPLE_FMT_S16 &&
+ mFrame->format != AV_SAMPLE_FMT_S16P &&
+ mFrame->format != AV_SAMPLE_FMT_S32 &&
+ mFrame->format != AV_SAMPLE_FMT_S32P) {
+ NS_WARNING("FFmpeg audio decoder outputs unsupported audio format.");
+ return DecodeResult::DECODE_ERROR;
+ }
+
if (decoded) {
uint32_t numChannels = mCodecContext->channels;
AudioConfig::ChannelLayout layout(numChannels);
if (!layout.IsValid()) {
return DecodeResult::FATAL_ERROR;
}
uint32_t samplingRate = mCodecContext->sample_rate;
--- a/dom/media/platforms/ffmpeg/FFmpegDataDecoder.cpp
+++ b/dom/media/platforms/ffmpeg/FFmpegDataDecoder.cpp
@@ -81,27 +81,16 @@ FFmpegDataDecoder<LIBAV_VER>::InitDecode
if (mLib->avcodec_open2(mCodecContext, codec, nullptr) < 0) {
NS_WARNING("Couldn't initialise ffmpeg decoder");
mLib->avcodec_close(mCodecContext);
mLib->av_freep(&mCodecContext);
return NS_ERROR_FAILURE;
}
- if (mCodecContext->codec_type == AVMEDIA_TYPE_AUDIO &&
- mCodecContext->sample_fmt != AV_SAMPLE_FMT_FLT &&
- mCodecContext->sample_fmt != AV_SAMPLE_FMT_FLTP &&
- mCodecContext->sample_fmt != AV_SAMPLE_FMT_S16 &&
- mCodecContext->sample_fmt != AV_SAMPLE_FMT_S16P &&
- mCodecContext->sample_fmt != AV_SAMPLE_FMT_S32 &&
- mCodecContext->sample_fmt != AV_SAMPLE_FMT_S32P) {
- NS_WARNING("FFmpeg audio decoder outputs unsupported audio format.");
- return NS_ERROR_FAILURE;
- }
-
FFMPEG_LOG("FFmpeg init successful.");
return NS_OK;
}
nsresult
FFmpegDataDecoder<LIBAV_VER>::Shutdown()
{
if (mTaskQueue) {