diff --git a/dom/html/HTMLMediaElement.cpp b/dom/html/HTMLMediaElement.cpp index 9c4426c903c3..5d844b9b4c8d 100644 --- a/dom/html/HTMLMediaElement.cpp +++ b/dom/html/HTMLMediaElement.cpp @@ -2766,10 +2766,9 @@ void HTMLMediaElement::SelectResource() { LOG(LogLevel::Debug, ("%p Trying load from src=%s", this, NS_ConvertUTF16toUTF8(src).get())); if (profiler_is_collecting_markers()) { - nsPrintfCString markerName{"%p:mozloadresource", this}; - profiler_add_marker(markerName, geckoprofiler::category::MEDIA_PLAYBACK, + profiler_add_marker("loadresource", geckoprofiler::category::MEDIA_PLAYBACK, {}, LoadSourceMarker{}, nsString{src}, nsString{}, - nsString{}); + nsString{}, Flow::FromPointer(this)); } NS_ASSERTION( @@ -2827,9 +2826,10 @@ void HTMLMediaElement::NotifyLoadError(const nsACString& aErrorDetails) { NS_WARNING("Should know the source we were loading from!"); } if (profiler_is_collecting_markers()) { - profiler_add_marker(nsPrintfCString("%p:mozloaderror", this), + profiler_add_marker("loaderror", geckoprofiler::category::MEDIA_PLAYBACK, {}, - LoadErrorMarker{}, aErrorDetails); + LoadErrorMarker{}, aErrorDetails, + Flow::FromPointer(this)); } } @@ -3048,10 +3048,9 @@ void HTMLMediaElement::LoadFromSourceChildren() { NS_ConvertUTF16toUTF8(media).get())); if (profiler_is_collecting_markers()) { - nsPrintfCString markerName{"%p:mozloadresource", this}; - profiler_add_marker(markerName, geckoprofiler::category::MEDIA_PLAYBACK, + profiler_add_marker("loadresource", geckoprofiler::category::MEDIA_PLAYBACK, {}, LoadSourceMarker{}, nsString{src}, nsString{type}, - nsString{media}); + nsString{media}, Flow::FromPointer(this)); } nsCOMPtr uri; @@ -4492,6 +4491,9 @@ HTMLMediaElement::~HTMLMediaElement() { !mHasSelfReference, "How can we be destroyed if we're still holding a self reference?"); + PROFILER_MARKER("~HTMLMediaElement", MEDIA_PLAYBACK, {}, TerminatingFlowMarker, + Flow::FromPointer(this)); + mWatchManager.Shutdown(); mShutdownObserver->Unsubscribe(); @@ -7210,13 +7212,13 @@ void HTMLMediaElement::MakeAssociationWithCDMResolved() { if (mMediaKeys) { nsString keySystem; mMediaKeys->GetKeySystem(keySystem); - profiler_add_marker(nsPrintfCString("%p:mozcdmresolved", this), + profiler_add_marker("cdmresolved", geckoprofiler::category::MEDIA_PLAYBACK, {}, CDMResolvedMarker{}, keySystem, - mMediaKeys->GetMediaKeySystemConfigurationString()); + mMediaKeys->GetMediaKeySystemConfigurationString(), + Flow::FromPointer(this)); } else { - nsPrintfCString markerName{"%p:mozremovemediakey", this}; - PROFILER_MARKER_UNTYPED(markerName, MEDIA_PLAYBACK); + PROFILER_MARKER("removemediakey", MEDIA_PLAYBACK, {}, FlowMarker, Flow::FromPointer(this)); } } } diff --git a/dom/media/utils/MediaElementEventRunners.cpp b/dom/media/utils/MediaElementEventRunners.cpp index 561536d1a64b..c9a47b552946 100644 --- a/dom/media/utils/MediaElementEventRunners.cpp +++ b/dom/media/utils/MediaElementEventRunners.cpp @@ -12,6 +12,7 @@ #include "mozilla/dom/HTMLVideoElement.h" #include "mozilla/dom/MediaError.h" #include "mozilla/dom/TimeRanges.h" +#include "mozilla/FlowMarkers.h" extern mozilla::LazyLogModule gMediaElementEventsLog; #define LOG_EVENT(type, msg) MOZ_LOG(gMediaElementEventsLog, type, msg) @@ -48,41 +49,42 @@ void nsMediaEventRunner::ReportProfilerMarker() { RefPtr buffered = mElement->Buffered(); if (buffered && buffered->Length() > 0) { for (size_t i = 0; i < buffered->Length(); ++i) { - profiler_add_marker(nsPrintfCString("%p:progress", mElement.get()), + profiler_add_marker("progress", geckoprofiler::category::MEDIA_PLAYBACK, {}, BufferedUpdateMarker{}, AssertedCast(buffered->Start(i) * 1000), AssertedCast(buffered->End(i) * 1000), - GetElementDurationMs()); + GetElementDurationMs(), + Flow::FromPointer(mElement.get())); } } } else if (mEventName.EqualsLiteral("resize")) { MOZ_ASSERT(mElement->HasVideo()); auto mediaInfo = mElement->GetMediaInfo(); - profiler_add_marker(nsPrintfCString("%p:resize", mElement.get()), + profiler_add_marker("resize", geckoprofiler::category::MEDIA_PLAYBACK, {}, VideoResizeMarker{}, mediaInfo.mVideo.mDisplay.width, - mediaInfo.mVideo.mDisplay.height); + mediaInfo.mVideo.mDisplay.height, + Flow::FromPointer(mElement.get())); } else if (mEventName.EqualsLiteral("loadedmetadata")) { nsString src; mElement->GetCurrentSrc(src); auto mediaInfo = mElement->GetMediaInfo(); - profiler_add_marker( - nsPrintfCString("%p:loadedmetadata", mElement.get()), + profiler_add_marker("loadedmetadata", geckoprofiler::category::MEDIA_PLAYBACK, {}, MetadataMarker{}, src, mediaInfo.HasAudio() ? mediaInfo.mAudio.mMimeType : "none"_ns, - mediaInfo.HasVideo() ? mediaInfo.mVideo.mMimeType : "none"_ns); + mediaInfo.HasVideo() ? mediaInfo.mVideo.mMimeType : "none"_ns, + Flow::FromPointer(mElement.get())); } else if (mEventName.EqualsLiteral("error")) { auto* error = mElement->GetError(); nsString message; error->GetMessage(message); - profiler_add_marker(nsPrintfCString("%p:error", mElement.get()), + profiler_add_marker("error", geckoprofiler::category::MEDIA_PLAYBACK, {}, - ErrorMarker{}, message); + ErrorMarker{}, message, Flow::FromPointer(mElement.get())); } else { - nsPrintfCString markerName{"%p:", mElement.get()}; - markerName += NS_ConvertUTF16toUTF8(mEventName); - PROFILER_MARKER_UNTYPED(markerName, MEDIA_PLAYBACK); + auto eventName = NS_ConvertUTF16toUTF8(mEventName); + PROFILER_MARKER(eventName, MEDIA_PLAYBACK, {}, FlowMarker, Flow::FromPointer(mElement.get())); } } @@ -168,9 +170,10 @@ NS_IMETHODIMP nsSourceErrorEventRunner::Run() { LOG_EVENT(LogLevel::Debug, ("%p Dispatching simple event source error", mElement.get())); if (profiler_is_collecting_markers()) { - profiler_add_marker(nsPrintfCString("%p:sourceerror", mElement.get()), + profiler_add_marker("sourceerror", geckoprofiler::category::MEDIA_PLAYBACK, {}, - ErrorMarker{}, mErrorDetails); + ErrorMarker{}, mErrorDetails, + Flow::FromPointer(mElement.get())); } return nsContentUtils::DispatchTrustedEvent(mElement->OwnerDoc(), mSource, u"error"_ns, CanBubble::eNo, @@ -220,12 +223,13 @@ void nsTimeupdateRunner::ReportProfilerMarker() { return; } auto* videoElement = mElement->AsHTMLVideoElement(); - profiler_add_marker(nsPrintfCString("%p:timeupdate", mElement.get()), + profiler_add_marker("timeupdate", geckoprofiler::category::MEDIA_PLAYBACK, {}, TimeUpdateMarker{}, AssertedCast(mElement->CurrentTime() * 1000), GetElementDurationMs(), - videoElement ? videoElement->MozPaintedFrames() : 0); + videoElement ? videoElement->MozPaintedFrames() : 0, + Flow::FromPointer(mElement.get())); } #undef LOG_EVENT diff --git a/dom/media/utils/MediaProfilerMarkers.h b/dom/media/utils/MediaProfilerMarkers.h index 05e152424acf..9d88b30892ea 100644 --- a/dom/media/utils/MediaProfilerMarkers.h +++ b/dom/media/utils/MediaProfilerMarkers.h @@ -4,6 +4,7 @@ #include "mozilla/BaseProfilerMarkersPrerequisites.h" #include "mozilla/ProfilerMarkers.h" +#include "mozilla/Flow.h" namespace mozilla { @@ -22,18 +23,21 @@ struct TimeUpdateMarker : public BaseMarkerType { MS::Format::Milliseconds}, {"paintedFrames", MS::InputType::Uint32, "Painted Frames", MS::Format::Integer}, // optional, zero for audio + {"element", MS::InputType::Uint64, "Element", MS::Format::Flow, MS::PayloadFlags::Searchable}, }; static constexpr MS::Location Locations[] = {MS::Location::MarkerChart, MS::Location::MarkerTable}; static constexpr const char* ChartLabel = "{marker.data.name}"; static void StreamJSONMarkerData(baseprofiler::SpliceableJSONWriter& aWriter, uint64_t aCurrentTime, uint64_t aDuration, - uint32_t aPaintedFrames) { + uint32_t aPaintedFrames, + Flow aFlow) { aWriter.IntProperty("currentTimeMs", aCurrentTime); aWriter.IntProperty("mediaDurationMs", aDuration); if (aPaintedFrames != 0) { aWriter.IntProperty("paintedFrames", aPaintedFrames); } + aWriter.FlowProperty("element", aFlow); } }; @@ -50,6 +54,7 @@ struct BufferedUpdateMarker : public BaseMarkerType { MS::Format::Milliseconds}, {"mediaDurationMs", MS::InputType::Uint64, "Media Duration (Ms)", MS::Format::Milliseconds}, + {"element", MS::InputType::Uint64, "Element", MS::Format::Flow, MS::PayloadFlags::Searchable}, }; static constexpr MS::Location Locations[] = {MS::Location::MarkerChart, @@ -57,10 +62,12 @@ struct BufferedUpdateMarker : public BaseMarkerType { static constexpr const char* ChartLabel = "{marker.data.name}"; static void StreamJSONMarkerData(baseprofiler::SpliceableJSONWriter& aWriter, uint64_t aBufferStart, uint64_t aBufferEnd, - uint64_t aDuration) { + uint64_t aDuration, + Flow aFlow) { aWriter.IntProperty("bufferStartMs", aBufferStart); aWriter.IntProperty("bufferEndMs", aBufferEnd); aWriter.IntProperty("mediaDurationMs", aDuration); + aWriter.FlowProperty("element", aFlow); } }; @@ -73,15 +80,18 @@ struct VideoResizeMarker : public BaseMarkerType { static constexpr MS::PayloadField PayloadFields[] = { {"width", MS::InputType::Uint64, "Width", MS::Format::Integer}, {"height", MS::InputType::Uint64, "Height", MS::Format::Integer}, + {"element", MS::InputType::Uint64, "Element", MS::Format::Flow, MS::PayloadFlags::Searchable}, }; static constexpr MS::Location Locations[] = {MS::Location::MarkerChart, MS::Location::MarkerTable}; static constexpr const char* ChartLabel = "{marker.data.name}"; static void StreamJSONMarkerData(baseprofiler::SpliceableJSONWriter& aWriter, - uint64_t aWidth, uint64_t aHeight) { + uint64_t aWidth, uint64_t aHeight, + Flow aFlow) { aWriter.IntProperty("width", aWidth); aWriter.IntProperty("height", aHeight); + aWriter.FlowProperty("element", aFlow); } }; @@ -97,6 +107,7 @@ struct MetadataMarker : public BaseMarkerType { MS::Format::String}, {"videoMimeType", MS::InputType::CString, "Video Mimetype", MS::Format::String}, + {"element", MS::InputType::Uint64, "Element", MS::Format::Flow, MS::PayloadFlags::Searchable}, }; static constexpr MS::Location Locations[] = {MS::Location::MarkerChart, @@ -105,8 +116,9 @@ struct MetadataMarker : public BaseMarkerType { static void StreamJSONMarkerData(baseprofiler::SpliceableJSONWriter& aWriter, const ProfilerString16View& aSrc, const ProfilerString8View& aAudioMimeType, - const ProfilerString8View& aVideoMimeType) { - StreamJSONMarkerDataImpl(aWriter, aSrc, aAudioMimeType, aVideoMimeType); + const ProfilerString8View& aVideoMimeType, + Flow aFlow) { + StreamJSONMarkerDataImpl(aWriter, aSrc, aAudioMimeType, aVideoMimeType, aFlow); } }; @@ -120,6 +132,7 @@ struct CDMResolvedMarker : public BaseMarkerType { {"keySystem", MS::InputType::String, "Key System", MS::Format::String}, {"configuration", MS::InputType::CString, "Configuration", MS::Format::String}, + {"element", MS::InputType::Uint64, "Element", MS::Format::Flow, MS::PayloadFlags::Searchable}, }; static constexpr MS::Location Locations[] = {MS::Location::MarkerChart, @@ -127,8 +140,9 @@ struct CDMResolvedMarker : public BaseMarkerType { static constexpr const char* ChartLabel = "{marker.data.name}"; static void StreamJSONMarkerData(baseprofiler::SpliceableJSONWriter& aWriter, const ProfilerString16View& aKeySystem, - const ProfilerString8View& aConfiguration) { - StreamJSONMarkerDataImpl(aWriter, aKeySystem, aConfiguration); + const ProfilerString8View& aConfiguration, + Flow aFlow) { + StreamJSONMarkerDataImpl(aWriter, aKeySystem, aConfiguration, aFlow); } }; @@ -141,13 +155,15 @@ struct LoadErrorMarker : public BaseMarkerType { static constexpr MS::PayloadField PayloadFields[] = { {"errorMessage", MS::InputType::CString, "Error Message", MS::Format::String}, + {"element", MS::InputType::Uint64, "Element", MS::Format::Flow, MS::PayloadFlags::Searchable}, }; static constexpr MS::Location Locations[] = {MS::Location::MarkerChart, MS::Location::MarkerTable}; static constexpr const char* ChartLabel = "{marker.data.name}"; static void StreamJSONMarkerData(baseprofiler::SpliceableJSONWriter& aWriter, - const ProfilerString8View& aErrorMsg) { - StreamJSONMarkerDataImpl(aWriter, aErrorMsg); + const ProfilerString8View& aErrorMsg, + Flow aFlow) { + StreamJSONMarkerDataImpl(aWriter, aErrorMsg, aFlow); } }; @@ -160,13 +176,15 @@ struct ErrorMarker : public BaseMarkerType { static constexpr MS::PayloadField PayloadFields[] = { {"errorMessage", MS::InputType::String, "Error Message", MS::Format::String}, + {"element", MS::InputType::Uint64, "Element", MS::Format::Flow, MS::PayloadFlags::Searchable}, }; static constexpr MS::Location Locations[] = {MS::Location::MarkerChart, MS::Location::MarkerTable}; static constexpr const char* ChartLabel = "{marker.data.name}"; static void StreamJSONMarkerData(baseprofiler::SpliceableJSONWriter& aWriter, - const ProfilerString16View& aErrorMsg) { - StreamJSONMarkerDataImpl(aWriter, aErrorMsg); + const ProfilerString16View& aErrorMsg, + Flow aFlow) { + StreamJSONMarkerDataImpl(aWriter, aErrorMsg, aFlow); } }; @@ -182,6 +200,7 @@ struct LoadSourceMarker : public BaseMarkerType { {"contentType", MS::InputType::String, "Content Type", MS::Format::String}, {"media", MS::InputType::String, "Media", MS::Format::String}, + {"element", MS::InputType::Uint64, "Element", MS::Format::Flow, MS::PayloadFlags::Searchable}, }; static constexpr MS::Location Locations[] = {MS::Location::MarkerChart, @@ -190,8 +209,9 @@ struct LoadSourceMarker : public BaseMarkerType { static void StreamJSONMarkerData(baseprofiler::SpliceableJSONWriter& aWriter, const ProfilerString16View& aSrc, const ProfilerString16View& aType, - const ProfilerString16View& aMedia) { - StreamJSONMarkerDataImpl(aWriter, aSrc, aType, aMedia); + const ProfilerString16View& aMedia, + Flow aFlow) { + StreamJSONMarkerDataImpl(aWriter, aSrc, aType, aMedia, aFlow); } }; @@ -205,13 +225,16 @@ struct RenderVideoMarker : public BaseMarkerType { static constexpr MS::PayloadField PayloadFields[] = { {"paintedFrames", MS::InputType::Uint64, "Painted Frames", MS::Format::Integer}, + {"element", MS::InputType::Uint64, "Element", MS::Format::Flow, MS::PayloadFlags::Searchable}, }; static constexpr MS::Location Locations[] = {MS::Location::MarkerChart, MS::Location::MarkerTable}; static constexpr const char* ChartLabel = "{marker.data.name}"; static void StreamJSONMarkerData(baseprofiler::SpliceableJSONWriter& aWriter, - uint64_t aPaintedFrames) { + uint64_t aPaintedFrames, + Flow aFlow) { aWriter.IntProperty("paintedFrames", aPaintedFrames); + aWriter.FlowProperty("element", aFlow); } };