Bug 1313398: P3. Don't always check if the decoder supports being recycled. r?gerald
The value never changes on a system, so there's no point checking it every single time
MozReview-Commit-ID: KTSslluQsKw
--- a/dom/media/platforms/wrappers/H264Converter.cpp
+++ b/dom/media/platforms/wrappers/H264Converter.cpp
@@ -74,16 +74,25 @@ H264Converter::Decode(MediaRawData* aSam
// contain a SPS.
rv = CreateDecoderAndInit(aSample);
if (rv == NS_ERROR_NOT_INITIALIZED) {
// We are missing the required SPS to create the decoder.
// Ignore for the time being, the MediaRawData will be dropped.
return DecodePromise::CreateAndResolve(DecodedData(), __func__);
}
} else {
+ // Initialize the members that we couldn't if the extradata was given during
+ // H264Converter's construction.
+ if (!mNeedAVCC) {
+ mNeedAVCC =
+ Some(mDecoder->NeedsConversion() == ConversionRequired::kNeedAVCC);
+ }
+ if (!mCanRecycleDecoder) {
+ mCanRecycleDecoder = Some(CanRecycleDecoder());
+ }
rv = CheckForSPSChange(aSample);
}
if (rv == NS_ERROR_DOM_MEDIA_INITIALIZING_DECODER) {
// The decoder is pending initialization.
RefPtr<DecodePromise> p = mDecodePromise.Ensure(__func__);
return p;
}
@@ -94,21 +103,16 @@ H264Converter::Decode(MediaRawData* aSam
RESULT_DETAIL("Unable to create H264 decoder")),
__func__);
}
if (mNeedKeyframe && !aSample->mKeyframe) {
return DecodePromise::CreateAndResolve(DecodedData(), __func__);
}
- if (!mNeedAVCC) {
- mNeedAVCC =
- Some(mDecoder->NeedsConversion() == ConversionRequired::kNeedAVCC);
- }
-
if (!*mNeedAVCC
&& !mp4_demuxer::AnnexB::ConvertSampleToAnnexB(aSample, mNeedKeyframe)) {
return DecodePromise::CreateAndReject(
MediaResult(NS_ERROR_OUT_OF_MEMORY,
RESULT_DETAIL("ConvertSampleToAnnexB")),
__func__);
}
@@ -255,16 +259,21 @@ H264Converter::CreateDecoderAndInit(Medi
return rv;
}
void
H264Converter::OnDecoderInitDone(const TrackType aTrackType)
{
mInitPromiseRequest.Complete();
RefPtr<MediaRawData> sample = mPendingSample.forget();
+
+ mNeedAVCC =
+ Some(mDecoder->NeedsConversion() == ConversionRequired::kNeedAVCC);
+ mCanRecycleDecoder = Some(CanRecycleDecoder());
+
DecodeFirstSample(sample);
}
void
H264Converter::OnDecoderInitFailed(const MediaResult& aError)
{
mInitPromiseRequest.Complete();
mDecodePromise.Reject(
@@ -284,19 +293,16 @@ H264Converter::CanRecycleDecoder() const
void
H264Converter::DecodeFirstSample(MediaRawData* aSample)
{
if (mNeedKeyframe && !aSample->mKeyframe) {
mDecodePromise.Resolve(DecodedData(), __func__);
return;
}
- mNeedAVCC =
- Some(mDecoder->NeedsConversion() == ConversionRequired::kNeedAVCC);
-
if (!*mNeedAVCC
&& !mp4_demuxer::AnnexB::ConvertSampleToAnnexB(aSample, mNeedKeyframe)) {
mDecodePromise.Reject(
MediaResult(NS_ERROR_OUT_OF_MEMORY,
RESULT_DETAIL("ConvertSampleToAnnexB")),
__func__);
return;
}
@@ -324,18 +330,18 @@ H264Converter::CheckForSPSChange(MediaRa
mp4_demuxer::AnnexB::ExtractExtraData(aSample);
if (!mp4_demuxer::AnnexB::HasSPS(extra_data)
|| mp4_demuxer::AnnexB::CompareExtraData(extra_data,
mCurrentConfig.mExtraData)) {
return NS_OK;
}
RefPtr<MediaRawData> sample = aSample;
-
- if (CanRecycleDecoder()) {
+ MOZ_ASSERT(mCanRecycleDecoder.isSome());
+ if (*mCanRecycleDecoder) {
// Do not recreate the decoder, reuse it.
UpdateConfigFromExtraData(extra_data);
if (!sample->mTrackInfo) {
sample->mTrackInfo = new TrackInfoSharedPtr(mCurrentConfig, 0);
}
mNeedKeyframe = true;
return NS_OK;
}
--- a/dom/media/platforms/wrappers/H264Converter.h
+++ b/dom/media/platforms/wrappers/H264Converter.h
@@ -95,13 +95,14 @@ private:
RefPtr<GMPCrashHelper> mGMPCrashHelper;
Maybe<bool> mNeedAVCC;
nsresult mLastError;
bool mNeedKeyframe = true;
const TrackInfo::TrackType mType;
MediaEventProducer<TrackInfo::TrackType>* const mOnWaitingForKeyEvent;
const CreateDecoderParams::OptionSet mDecoderOptions;
+ Maybe<bool> mCanRecycleDecoder;
};
} // namespace mozilla
#endif // mozilla_H264Converter_h