NS_IMETHODIMP MediaEngineDefaultAudioSource::Notify(nsITimer* aTimer) { TimeStamp now = TimeStamp::Now(); TimeDuration timeSinceLastNotify = now - mLastNotify; mLastNotify = now; TrackTicks samplesSinceLastNotify = RateConvertTicksRoundUp(AUDIO_RATE, 1000000, timeSinceLastNotify.ToMicroseconds()); // If it's been longer since the last Notify() than mBufferSize holds, we // have underrun and the MSG had to append silence while waiting for us // to push more data. In this case we reset to mBufferSize again. TrackTicks samplesToAppend = std::min(samplesSinceLastNotify, mBufferSize); AudioSegment segment; AppendToSegment(segment, samplesToAppend); mSource->AppendToTrack(mTrackID, &segment); // Generate null data for fake tracks. if (mHasFakeTracks) { for (int i = 0; i < kFakeAudioTrackCount; ++i) { AudioSegment nullSegment; nullSegment.AppendNullData(samplesToAppend); mSource->AppendToTrack(kTrackCount + kFakeVideoTrackCount+i, &nullSegment); } } return NS_OK; }
/* static */ double Logger::GetElapsedTime() { TimeStamp ts = TimeStamp::Now(); bool inconsistent; TimeDuration duration = ts - TimeStamp::ProcessCreation(inconsistent); return duration.ToMicroseconds(); }
/** * Compares the elapsed time from the beginning of GetEncodedTrack and * the processed frame duration in mSourceSegment * in order to set the nextEncodeOperation for next target frame. */ VP8TrackEncoder::EncodeOperation VP8TrackEncoder::GetNextEncodeOperation(TimeDuration aTimeElapsed, StreamTime aProcessedDuration) { int64_t durationInUsec = FramesToUsecs(aProcessedDuration, mTrackRate).value(); if (aTimeElapsed.ToMicroseconds() > (durationInUsec * SKIP_FRAME_RATIO)) { // The encoder is too slow. // We should skip next frame to consume the mSourceSegment. return SKIP_FRAME; } else if (aTimeElapsed.ToMicroseconds() > (durationInUsec * I_FRAME_RATIO)) { // The encoder is a little slow. // We force the encoder to encode an I-frame to accelerate. return ENCODE_I_FRAME; } else { return ENCODE_NORMAL_FRAME; } }
void EventTokenBucket::UpdateCredits() { MOZ_ASSERT(PR_GetCurrentThread() == gSocketThread); TimeStamp now = TimeStamp::Now(); TimeDuration elapsed = now - mLastUpdate; mLastUpdate = now; mCredit += static_cast<uint64_t>(elapsed.ToMicroseconds()); if (mCredit > mMaxCredit) mCredit = mMaxCredit; SOCKET_LOG(("EventTokenBucket::UpdateCredits %p to %lu (%lu each.. %3.2f)\n", this, mCredit, mUnitCost, (double)mCredit / mUnitCost)); }
void TimeoutManager::RecordExecution(Timeout* aRunningTimeout, Timeout* aTimeout) { if (!StaticPrefs::dom_performance_enable_scheduler_timing() && mWindow.IsChromeWindow()) { return; } TimeoutBudgetManager& budgetManager = TimeoutBudgetManager::Get(); TimeStamp now = TimeStamp::Now(); if (aRunningTimeout) { // If we're running a timeout callback, record any execution until // now. TimeDuration duration = budgetManager.RecordExecution( now, aRunningTimeout, mWindow.IsBackgroundInternal()); budgetManager.MaybeCollectTelemetry(now); UpdateBudget(now, duration); // This is an ad-hoc way to use the counters for the timers // that should be removed at somepoint. See Bug 1482834 PerformanceCounter* counter = GetPerformanceCounter(); if (counter) { counter->IncrementExecutionDuration(duration.ToMicroseconds()); } } if (aTimeout) { // If we're starting a new timeout callback, start recording. budgetManager.StartRecording(now); PerformanceCounter* counter = GetPerformanceCounter(); if (counter) { counter->IncrementDispatchCounter(DispatchCategory(TaskCategory::Timer)); } } else { // Else stop by clearing the start timestamp. budgetManager.StopRecording(); } }
static int Interpolate(int start, int end, TimeDuration aFrameDiff, TimeDuration aTouchDiff) { return start + (((end - start) * aFrameDiff.ToMicroseconds()) / aTouchDiff.ToMicroseconds()); }
gfxFontEntry* gfxPlatformFontList::SystemFindFontForChar(uint32_t aCh, uint32_t aNextCh, int32_t aRunScript, const gfxFontStyle* aStyle) { gfxFontEntry* fontEntry = nullptr; // is codepoint with no matching font? return null immediately if (mCodepointsWithNoFonts.test(aCh)) { return nullptr; } // Try to short-circuit font fallback for U+FFFD, used to represent // encoding errors: just use cached family from last time U+FFFD was seen. // This helps speed up pages with lots of encoding errors, binary-as-text, // etc. if (aCh == 0xFFFD && mReplacementCharFallbackFamily) { bool needsBold; // ignored in the system fallback case fontEntry = mReplacementCharFallbackFamily->FindFontForStyle(*aStyle, needsBold); // this should never fail, as we must have found U+FFFD in order to set // mReplacementCharFallbackFamily at all, but better play it safe if (fontEntry && fontEntry->HasCharacter(aCh)) { return fontEntry; } } TimeStamp start = TimeStamp::Now(); // search commonly available fonts bool common = true; gfxFontFamily *fallbackFamily = nullptr; fontEntry = CommonFontFallback(aCh, aNextCh, aRunScript, aStyle, &fallbackFamily); // if didn't find a font, do system-wide fallback (except for specials) uint32_t cmapCount = 0; if (!fontEntry) { common = false; fontEntry = GlobalFontFallback(aCh, aRunScript, aStyle, cmapCount, &fallbackFamily); } TimeDuration elapsed = TimeStamp::Now() - start; PRLogModuleInfo *log = gfxPlatform::GetLog(eGfxLog_textrun); if (MOZ_UNLIKELY(MOZ_LOG_TEST(log, LogLevel::Warning))) { uint32_t unicodeRange = FindCharUnicodeRange(aCh); int32_t script = mozilla::unicode::GetScriptCode(aCh); MOZ_LOG(log, LogLevel::Warning,\ ("(textrun-systemfallback-%s) char: u+%6.6x " "unicode-range: %d script: %d match: [%s]" " time: %dus cmaps: %d\n", (common ? "common" : "global"), aCh, unicodeRange, script, (fontEntry ? NS_ConvertUTF16toUTF8(fontEntry->Name()).get() : "<none>"), int32_t(elapsed.ToMicroseconds()), cmapCount)); } // no match? add to set of non-matching codepoints if (!fontEntry) { mCodepointsWithNoFonts.set(aCh); } else if (aCh == 0xFFFD && fontEntry && fallbackFamily) { mReplacementCharFallbackFamily = fallbackFamily; } // track system fallback time static bool first = true; int32_t intElapsed = int32_t(first ? elapsed.ToMilliseconds() : elapsed.ToMicroseconds()); Telemetry::Accumulate((first ? Telemetry::SYSTEM_FONT_FALLBACK_FIRST : Telemetry::SYSTEM_FONT_FALLBACK), intElapsed); first = false; // track the script for which fallback occurred (incremented one make it // 1-based) Telemetry::Accumulate(Telemetry::SYSTEM_FONT_FALLBACK_SCRIPT, aRunScript + 1); return fontEntry; }
RasterImage::Draw(gfxContext* aContext, const IntSize& aSize, const ImageRegion& aRegion, uint32_t aWhichFrame, SamplingFilter aSamplingFilter, const Maybe<SVGImageContext>& /*aSVGContext - ignored*/, uint32_t aFlags) { if (aWhichFrame > FRAME_MAX_VALUE) { return DrawResult::BAD_ARGS; } if (mError) { return DrawResult::BAD_IMAGE; } // Illegal -- you can't draw with non-default decode flags. // (Disabling colorspace conversion might make sense to allow, but // we don't currently.) if (ToSurfaceFlags(aFlags) != DefaultSurfaceFlags()) { return DrawResult::BAD_ARGS; } if (!aContext) { return DrawResult::BAD_ARGS; } if (IsUnlocked() && mProgressTracker) { mProgressTracker->OnUnlockedDraw(); } // If we're not using SamplingFilter::GOOD, we shouldn't high-quality scale or // downscale during decode. uint32_t flags = aSamplingFilter == SamplingFilter::GOOD ? aFlags : aFlags & ~FLAG_HIGH_QUALITY_SCALING; DrawableSurface surface = LookupFrame(aSize, flags, ToPlaybackType(aWhichFrame)); if (!surface) { // Getting the frame (above) touches the image and kicks off decoding. if (mDrawStartTime.IsNull()) { mDrawStartTime = TimeStamp::Now(); } return DrawResult::NOT_READY; } bool shouldRecordTelemetry = !mDrawStartTime.IsNull() && surface->IsFinished(); auto result = DrawInternal(Move(surface), aContext, aSize, aRegion, aSamplingFilter, flags); if (shouldRecordTelemetry) { TimeDuration drawLatency = TimeStamp::Now() - mDrawStartTime; Telemetry::Accumulate(Telemetry::IMAGE_DECODE_ON_DRAW_LATENCY, int32_t(drawLatency.ToMicroseconds())); mDrawStartTime = TimeStamp(); } return result; }
gfxFontEntry* gfxPlatformFontList::SystemFindFontForChar(const uint32_t aCh, int32_t aRunScript, const gfxFontStyle* aStyle) { gfxFontEntry* fontEntry = nullptr; // is codepoint with no matching font? return null immediately if (mCodepointsWithNoFonts.test(aCh)) { return nullptr; } // try to short-circuit font fallback for U+FFFD, used to represent // encoding errors: just use a platform-specific fallback system // font that is guaranteed (or at least highly likely) to be around, // or a cached family from last time U+FFFD was seen. this helps // speed up pages with lots of encoding errors, binary-as-text, etc. if (aCh == 0xFFFD && mReplacementCharFallbackFamily.Length() > 0) { bool needsBold; // ignored in the system fallback case fontEntry = FindFontForFamily(mReplacementCharFallbackFamily, aStyle, needsBold); if (fontEntry && fontEntry->TestCharacterMap(aCh)) return fontEntry; } TimeStamp start = TimeStamp::Now(); // search commonly available fonts bool common = true; fontEntry = CommonFontFallback(aCh, aRunScript, aStyle); // if didn't find a font, do system-wide fallback (except for specials) uint32_t cmapCount = 0; if (!fontEntry) { common = false; fontEntry = GlobalFontFallback(aCh, aRunScript, aStyle, cmapCount); } TimeDuration elapsed = TimeStamp::Now() - start; #ifdef PR_LOGGING PRLogModuleInfo *log = gfxPlatform::GetLog(eGfxLog_textrun); if (NS_UNLIKELY(log)) { uint32_t charRange = gfxFontUtils::CharRangeBit(aCh); uint32_t unicodeRange = FindCharUnicodeRange(aCh); int32_t script = mozilla::unicode::GetScriptCode(aCh); PR_LOG(log, PR_LOG_WARNING,\ ("(textrun-systemfallback-%s) char: u+%6.6x " "char-range: %d unicode-range: %d script: %d match: [%s]" " time: %dus cmaps: %d\n", (common ? "common" : "global"), aCh, charRange, unicodeRange, script, (fontEntry ? NS_ConvertUTF16toUTF8(fontEntry->Name()).get() : "<none>"), int32_t(elapsed.ToMicroseconds()), cmapCount)); } #endif // no match? add to set of non-matching codepoints if (!fontEntry) { mCodepointsWithNoFonts.set(aCh); } else if (aCh == 0xFFFD && fontEntry) { mReplacementCharFallbackFamily = fontEntry->FamilyName(); } // track system fallback time static bool first = true; int32_t intElapsed = int32_t(first ? elapsed.ToMilliseconds() : elapsed.ToMicroseconds()); Telemetry::Accumulate((first ? Telemetry::SYSTEM_FONT_FALLBACK_FIRST : Telemetry::SYSTEM_FONT_FALLBACK), intElapsed); first = false; // track the script for which fallback occurred (incremented one make it // 1-based) Telemetry::Accumulate(Telemetry::SYSTEM_FONT_FALLBACK_SCRIPT, aRunScript + 1); return fontEntry; }
NS_IMETHODIMP CVE_2014_1482_seamonkey2_9_RasterImage::Draw(gfxContext *aContext, gfxPattern::GraphicsFilter aFilter, const gfxMatrix &aUserSpaceToImageSpace, const gfxRect &aFill, const nsIntRect &aSubimage, const nsIntSize& /*aViewportSize - ignored*/, PRUint32 aFlags) { if (mError) return NS_ERROR_FAILURE; // Disallowed in the API if (mInDecoder && (aFlags & imgIContainer::FLAG_SYNC_DECODE)) return NS_ERROR_FAILURE; // Illegal -- you can't draw with non-default decode flags. // (Disabling colorspace conversion might make sense to allow, but // we don't currently.) if ((aFlags & DECODE_FLAGS_MASK) != DECODE_FLAGS_DEFAULT) return NS_ERROR_FAILURE; NS_ENSURE_ARG_POINTER(aContext); // We can only draw with the default decode flags if (mFrameDecodeFlags != DECODE_FLAGS_DEFAULT) { if (!CanForciblyDiscard()) return NS_ERROR_NOT_AVAILABLE; ForceDiscard(); mFrameDecodeFlags = DECODE_FLAGS_DEFAULT; } // We use !mDecoded && mHasSourceData to mean discarded. if (!mDecoded && mHasSourceData) { mDrawStartTime = TimeStamp::Now(); } // If a synchronous draw is requested, flush anything that might be sitting around if (aFlags & FLAG_SYNC_DECODE) { nsresult rv = SyncDecode(); NS_ENSURE_SUCCESS(rv, rv); } imgFrame *frame = GetCurrentDrawableImgFrame(); if (!frame) { return NS_OK; // Getting the frame (above) touches the image and kicks off decoding } nsIntRect framerect = frame->GetRect(); nsIntMargin padding(framerect.x, framerect.y, mSize.width - framerect.XMost(), mSize.height - framerect.YMost()); frame->Draw(aContext, aFilter, aUserSpaceToImageSpace, aFill, padding, aSubimage); if (mDecoded && !mDrawStartTime.IsNull()) { TimeDuration drawLatency = TimeStamp::Now() - mDrawStartTime; Telemetry::Accumulate(Telemetry::IMAGE_DECODE_ON_DRAW_LATENCY, PRInt32(drawLatency.ToMicroseconds())); // clear the value of mDrawStartTime mDrawStartTime = TimeStamp(); } return NS_OK; }