text: // Copyright 2020 The Chromium Authors. All rights reserved.
  // 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_PEERCONNECTION_RTC_ENCODED_VIDEO_FRAME_DELEGATE_H_
  #define THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_RTC_ENCODED_VIDEO_FRAME_DELEGATE_H_
  
  #include <stdint.h>
  
  #include <memory>
  
  #include "third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h"
  #include "third_party/blink/renderer/modules/modules_export.h"
  #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
  #include "third_party/blink/renderer/platform/wtf/thread_safe_ref_counted.h"
  #include "third_party/blink/renderer/platform/wtf/threading_primitives.h"
  #include "third_party/webrtc/api/frame_transformer_interface.h"
  #include "third_party/webrtc/api/video/video_frame_metadata.h"
  
  namespace blink {
  
  class DOMArrayBuffer;
  
  // This class wraps a WebRTC video frame and allows making shallow
  // copies. Its purpose is to support making RTCEncodedVideoFrames
  // serializable in the same process.
  class RTCEncodedVideoFrameDelegate
      : public WTF::ThreadSafeRefCounted<RTCEncodedVideoFrameDelegate> {
   public:
    explicit RTCEncodedVideoFrameDelegate(
        std::unique_ptr<webrtc::TransformableVideoFrameInterface> webrtc_frame);
  
    String Type() const;
    uint64_t Timestamp() const;
    DOMArrayBuffer* CreateDataBuffer() const;
    void SetData(const DOMArrayBuffer* data);
    DOMArrayBuffer* CreateAdditionalDataBuffer() const;
    uint32_t Ssrc() const;
    const webrtc::VideoFrameMetadata* GetMetadata() const;
    std::unique_ptr<webrtc::TransformableVideoFrameInterface> PassWebRtcFrame();
  
   private:
    mutable Mutex mutex_;
    std::unique_ptr<webrtc::TransformableVideoFrameInterface> webrtc_frame_
        GUARDED_BY(mutex_);
  };
  
  class MODULES_EXPORT RTCEncodedVideoFramesAttachment
      : public SerializedScriptValue::Attachment {
   public:
    static const void* const kAttachmentKey;
    RTCEncodedVideoFramesAttachment() = default;
    ~RTCEncodedVideoFramesAttachment() override = default;
  
    bool IsLockedToAgentCluster() const override {
      return !encoded_video_frames_.IsEmpty();
    }
  
    Vector<scoped_refptr<RTCEncodedVideoFrameDelegate>>& EncodedVideoFrames() {
      return encoded_video_frames_;
    }
  
    const Vector<scoped_refptr<RTCEncodedVideoFrameDelegate>>&
    EncodedVideoFrames() const {
      return encoded_video_frames_;
    }
  
   private:
    Vector<scoped_refptr<RTCEncodedVideoFrameDelegate>> encoded_video_frames_;
  };
  
  }  // namespace blink
  
  #endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_RTC_ENCODED_VIDEO_FRAME_DELEGATE_H_
  