diff options
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.cc | 59 |
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 |