// Copyright 2021 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_WEBCODECS_VIDEO_FRAME_MONITOR_H_ #define THIRD_PARTY_BLINK_RENDERER_MODULES_WEBCODECS_VIDEO_FRAME_MONITOR_H_ #include <map> #include <optional> #include <string> #include "base/synchronization/lock.h" #include "media/base/video_frame.h" #include "third_party/blink/renderer/modules/modules_export.h" #include "third_party/blink/renderer/platform/allow_discouraged_type.h" #include "third_party/blink/renderer/platform/wtf/hash_map.h" #include "third_party/blink/renderer/platform/wtf/hash_traits.h" namespace blink { // This class helps monitor usage of media::VideoFrame objects. This class does // not directly use VideoFrames, but references them using the ID returned by // media::VideoFrame::unique_id. // This class is an alternative to using media::VideoFrame destruction observers // for cases that require monitoring to stop well before the media::VideoFrame // is destroyed. For example, monitoring blink::VideoFrames backed by // media::VideoFrames, where the JS-exposed blink::VideoFrames can be closed // but the backing media::VideoFrames can continue to live outside the // blink::VideoFrames. // This class is a per-renderer-process singleton and relies on the fact // that VideoFrame IDs are unique per process. That means that the same ID // identifies the same frame regardless of the execution context. // The motivating use case for this class is keeping track of frames coming // from sources that have global limits in the number of in-flight frames // allowed. Thus, frames are monitored per source. Sources are identified with // a nonempty std::string, so any way to group frames can be used as long as a // source ID is given. std::string is chosen over the Blink-standard WTF::String // because: // 1. source IDs often come from outside Blink (e.g., camera and screen // device IDs) // 2. std::string is easier to use in a multithreaded environment. // All the methods of this class can be called from any thread. class MODULES_EXPORT VideoFrameMonitor { … }; } // namespace blink #endif // THIRD_PARTY_BLINK_RENDERER_MODULES_WEBCODECS_VIDEO_FRAME_MONITOR_H_