From 9279f48ca151a1d9ae3a1172900da56b2f01aeea Mon Sep 17 00:00:00 2001 From: Cameron Kaiser Date: Mon, 18 Mar 2019 21:30:52 -0700 Subject: [PATCH] #550: OOM lockout kludge, alter paths + #334: remove tele from MSE --- dom/html/HTMLMediaElement.cpp | 4 ++++ .../platforms/ffmpeg/FFmpegDataDecoder.cpp | 6 ++--- .../platforms/ffmpeg/FFmpegH264Decoder.cpp | 22 ++++++++++++++++++- .../platforms/ffmpeg/FFmpegRuntimeLinker.cpp | 8 +++---- 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/dom/html/HTMLMediaElement.cpp b/dom/html/HTMLMediaElement.cpp index ef8e362dc..e8d699f53 100644 --- a/dom/html/HTMLMediaElement.cpp +++ b/dom/html/HTMLMediaElement.cpp @@ -2648,6 +2648,7 @@ HTMLMediaElement::ReportEMETelemetry() void HTMLMediaElement::ReportMSETelemetry() { +#if(0) // Report telemetry for videos when a page is unloaded. We // want to know data on what state the video is at when // the user has exited. @@ -2700,6 +2701,7 @@ HTMLMediaElement::ReportMSETelemetry() Telemetry::Accumulate(Telemetry::VIDEO_MSE_JOIN_LATENCY_MS, SECONDS_TO_MS(latency)); LOG(LogLevel::Debug, ("%p VIDEO_MSE_JOIN_LATENCY = %f (%d ms) count=%d\n", this, latency, SECONDS_TO_MS(latency), mJoinLatency.Count())); +#endif } void HTMLMediaElement::UnbindFromTree(bool aDeep, @@ -4236,12 +4238,14 @@ void HTMLMediaElement::SuspendOrResumeElement(bool aPauseElement, bool aSuspendE UpdateSrcMediaStreamPlaying(); UpdateAudioChannelPlayingState(); if (aPauseElement) { +#if(0) if (mMediaSource) { ReportMSETelemetry(); #ifdef MOZ_EME ReportEMETelemetry(); #endif } +#endif #ifdef MOZ_EME // For EME content, force destruction of the CDM client (and CDM diff --git a/dom/media/platforms/ffmpeg/FFmpegDataDecoder.cpp b/dom/media/platforms/ffmpeg/FFmpegDataDecoder.cpp index 599c5cf08..8e8262317 100644 --- a/dom/media/platforms/ffmpeg/FFmpegDataDecoder.cpp +++ b/dom/media/platforms/ffmpeg/FFmpegDataDecoder.cpp @@ -12,6 +12,7 @@ #include "FFmpegLog.h" #include "FFmpegDataDecoder.h" #include "prsystem.h" +#include "prenv.h" #include "FFmpegRuntimeLinker.h" #include "libavutil/pixfmt.h" @@ -248,9 +249,8 @@ FFmpegDataDecoder::FindAVCodec(AVCodecID aCodec) StaticMutexAutoLock mon(sMonitor); if (!sFFmpegInitDone) { avcodec_register_all(); -#ifdef DEBUG - av_log_set_level(AV_LOG_DEBUG); -#endif + if (PR_GetEnv("AV_LOG_DEBUG")) + av_log_set_level(AV_LOG_DEBUG); sFFmpegInitDone = true; } return avcodec_find_decoder(aCodec); diff --git a/dom/media/platforms/ffmpeg/FFmpegH264Decoder.cpp b/dom/media/platforms/ffmpeg/FFmpegH264Decoder.cpp index 0c614067c..c27ed3899 100644 --- a/dom/media/platforms/ffmpeg/FFmpegH264Decoder.cpp +++ b/dom/media/platforms/ffmpeg/FFmpegH264Decoder.cpp @@ -16,6 +16,8 @@ #include "FFmpegLog.h" #include "mozilla/PodOperations.h" +#include "prtime.h" + typedef mozilla::layers::Image Image; typedef mozilla::layers::PlanarYCbCrImage PlanarYCbCrImage; @@ -30,6 +32,10 @@ FFmpegH264Decoder::PtsCorrectionContext::PtsCorrectionContext() { } +// PRIntervalTime is insufficient since the timeout length may be +// many seconds. +static PRTime sLockOutDueToOOM = 0L; + int64_t FFmpegH264Decoder::PtsCorrectionContext::GuessCorrectPts(int64_t aPts, int64_t aDts) { @@ -93,6 +99,12 @@ FFmpegH264Decoder::DecodeResult FFmpegH264Decoder::DoDecodeFrame(MediaRawData* aSample) { MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn()); + if (PR_Now() < sLockOutDueToOOM) { + // Halt further allocations. + NS_WARNING("** FFMPEG LOCKED OUT DUE TO OUT OF MEMORY **"); + mCallback->Error(); + return DecodeResult::DECODE_ERROR; + } uint8_t* inputData = const_cast(aSample->Data()); size_t inputSize = aSample->Size(); @@ -140,6 +152,12 @@ FFmpegH264Decoder::DoDecodeFrame(MediaRawData* aSample, uint8_t* aData, int aSize) { MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn()); + if (PR_Now() < sLockOutDueToOOM) { + // Halt further allocations. + NS_WARNING("** FFMPEG LOCKED OUT DUE TO OUT OF MEMORY **"); + mCallback->Error(); + return DecodeResult::DECODE_ERROR; + } AVPacket packet; av_init_packet(&packet); @@ -234,7 +252,9 @@ FFmpegH264Decoder::DoDecodeFrame(MediaRawData* aSample, -1, mImage); if (!v) { - NS_WARNING("image allocation error."); + int32_t lockout = 3; /* XXX: make a pref */ + fprintf(stderr, "Warning: TenFourFox ran out of memory trying to decode H.264 video.\nAny H.264 video on any page playing in the next %i seconds will be blocked.\n", lockout); + sLockOutDueToOOM = PR_Now() + ( PR_USEC_PER_SEC * lockout ); mCallback->Error(); return DecodeResult::DECODE_ERROR; } diff --git a/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp b/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp index 486920f8c..e84cb5bee 100644 --- a/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp +++ b/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp @@ -104,11 +104,9 @@ FFmpegRuntimeLinker::Link() #endif free(libFullPath); } - // Try also finding the library in ~/Library/ffmpeg. - if (!sLinkedLib && - PR_GetEnv("HOME") && - asprintf(&libFullPath, "%s/Library/ffmpeg/%s", PR_GetEnv("HOME"), lib) - > 0 && libFullPath) { + // Try also finding the library in ~/Library/TenFourFox-FFmpeg. + if (!sLinkedLib && PR_GetEnv("HOME") && + asprintf(&libFullPath, "%s/Library/TenFourFox-FFmpeg/%s", PR_GetEnv("HOME"), lib) > 0 && libFullPath) { #if DEBUG fprintf(stderr, "TenFourFox looking for FFmpeg: %s\n", libFullPath); #endif