summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/modules/webcodecs/video_frame_handle.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/blink/renderer/modules/webcodecs/video_frame_handle.cc')
-rw-r--r--chromium/third_party/blink/renderer/modules/webcodecs/video_frame_handle.cc59
1 files changed, 45 insertions, 14 deletions
diff --git a/chromium/third_party/blink/renderer/modules/webcodecs/video_frame_handle.cc b/chromium/third_party/blink/renderer/modules/webcodecs/video_frame_handle.cc
index d6d390744ca..437cfaec608 100644
--- a/chromium/third_party/blink/renderer/modules/webcodecs/video_frame_handle.cc
+++ b/chromium/third_party/blink/renderer/modules/webcodecs/video_frame_handle.cc
@@ -6,47 +6,62 @@
#include "media/base/video_frame.h"
#include "third_party/blink/renderer/core/execution_context/execution_context.h"
+#include "third_party/blink/renderer/modules/webcodecs/video_frame_monitor.h"
#include "third_party/blink/renderer/modules/webcodecs/webcodecs_logger.h"
#include "third_party/skia/include/core/SkImage.h"
namespace blink {
VideoFrameHandle::VideoFrameHandle(scoped_refptr<media::VideoFrame> frame,
- ExecutionContext* context)
- : frame_(std::move(frame)) {
+ ExecutionContext* context,
+ std::string monitoring_source_id)
+ : frame_(std::move(frame)),
+ monitoring_source_id_(std::move(monitoring_source_id)) {
DCHECK(frame_);
DCHECK(context);
close_auditor_ = WebCodecsLogger::From(*context).GetCloseAuditor();
-
DCHECK(close_auditor_);
+
+ MaybeMonitorOpenFrame();
}
VideoFrameHandle::VideoFrameHandle(scoped_refptr<media::VideoFrame> frame,
sk_sp<SkImage> sk_image,
- ExecutionContext* context)
- : VideoFrameHandle(std::move(frame), context) {
+ ExecutionContext* context,
+ std::string monitoring_source_id)
+ : VideoFrameHandle(std::move(frame),
+ context,
+ std::move(monitoring_source_id)) {
sk_image_ = std::move(sk_image);
}
VideoFrameHandle::VideoFrameHandle(
scoped_refptr<media::VideoFrame> frame,
sk_sp<SkImage> sk_image,
- scoped_refptr<WebCodecsLogger::VideoFrameCloseAuditor> close_auditor)
+ scoped_refptr<WebCodecsLogger::VideoFrameCloseAuditor> close_auditor,
+ std::string monitoring_source_id)
: sk_image_(std::move(sk_image)),
frame_(std::move(frame)),
- close_auditor_(std::move(close_auditor)) {
+ close_auditor_(std::move(close_auditor)),
+ monitoring_source_id_(std::move(monitoring_source_id)) {
DCHECK(frame_);
DCHECK(close_auditor_);
+ MaybeMonitorOpenFrame();
}
VideoFrameHandle::VideoFrameHandle(scoped_refptr<media::VideoFrame> frame,
- sk_sp<SkImage> sk_image)
- : sk_image_(std::move(sk_image)), frame_(std::move(frame)) {
+ sk_sp<SkImage> sk_image,
+ std::string monitoring_source_id)
+ : sk_image_(std::move(sk_image)),
+ frame_(std::move(frame)),
+ monitoring_source_id_(std::move(monitoring_source_id)) {
DCHECK(frame_);
+ MaybeMonitorOpenFrame();
}
VideoFrameHandle::~VideoFrameHandle() {
+ MaybeMonitorCloseFrame();
// If we still have a valid |close_auditor_|, Invalidate() was never
// called and corresponding frames never received a call to close() before
// being garbage collected.
@@ -76,9 +91,10 @@ void VideoFrameHandle::SetCloseOnClone() {
scoped_refptr<VideoFrameHandle> VideoFrameHandle::Clone() {
WTF::MutexLocker locker(mutex_);
- auto cloned_handle = frame_ ? base::MakeRefCounted<VideoFrameHandle>(
- frame_, sk_image_, close_auditor_)
- : nullptr;
+ auto cloned_handle =
+ frame_ ? base::MakeRefCounted<VideoFrameHandle>(
+ frame_, sk_image_, close_auditor_, monitoring_source_id_)
+ : nullptr;
if (close_on_clone_)
InvalidateLocked();
@@ -88,16 +104,31 @@ scoped_refptr<VideoFrameHandle> VideoFrameHandle::Clone() {
scoped_refptr<VideoFrameHandle> VideoFrameHandle::CloneForInternalUse() {
WTF::MutexLocker locker(mutex_);
- return frame_ ? base::MakeRefCounted<VideoFrameHandle>(frame_, sk_image_)
+ return frame_ ? base::MakeRefCounted<VideoFrameHandle>(frame_, sk_image_,
+ monitoring_source_id_)
: nullptr;
}
void VideoFrameHandle::InvalidateLocked() {
mutex_.AssertAcquired();
-
+ MaybeMonitorCloseFrame();
frame_.reset();
sk_image_.reset();
close_auditor_.reset();
}
+void VideoFrameHandle::MaybeMonitorOpenFrame() {
+ if (frame_ && !monitoring_source_id_.empty()) {
+ VideoFrameMonitor::Instance().OnOpenFrame(monitoring_source_id_,
+ frame_->unique_id());
+ }
+}
+
+void VideoFrameHandle::MaybeMonitorCloseFrame() {
+ if (frame_ && !monitoring_source_id_.empty()) {
+ VideoFrameMonitor::Instance().OnCloseFrame(monitoring_source_id_,
+ frame_->unique_id());
+ }
+}
+
} // namespace blink