RTCEncodedAudioFrame.h (3442B)
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ 6 7 #ifndef MOZILLA_DOM_MEDIA_WEBRTC_JSAPI_RTCENCODEDAUDIOFRAME_H_ 8 #define MOZILLA_DOM_MEDIA_WEBRTC_JSAPI_RTCENCODEDAUDIOFRAME_H_ 9 10 #include "mozilla/RefPtr.h" 11 #include "mozilla/dom/RTCEncodedAudioFrameBinding.h" 12 #include "mozilla/dom/RTCEncodedFrameBase.h" 13 #include "nsIGlobalObject.h" 14 15 namespace mozilla::dom { 16 17 class StructuredCloneHolder; 18 struct RTCEncodedAudioFrameOptions; 19 20 struct RTCEncodedAudioFrameData : RTCEncodedFrameState { 21 RTCEncodedAudioFrameMetadata mMetadata; 22 23 [[nodiscard]] RTCEncodedAudioFrameData Clone() const; 24 }; 25 26 // Wraps a libwebrtc frame, allowing the frame buffer to be modified, and 27 // providing read-only access to various metadata. After the libwebrtc frame is 28 // extracted (with RTCEncodedFrameBase::TakeFrame), the frame buffer is 29 // detached, but the metadata remains accessible. 30 class RTCEncodedAudioFrame final : public RTCEncodedAudioFrameData, 31 public RTCEncodedFrameBase { 32 public: 33 explicit RTCEncodedAudioFrame( 34 nsIGlobalObject* aGlobal, 35 std::unique_ptr<webrtc::TransformableFrameInterface> aFrame, 36 uint64_t aCounter, RTCRtpScriptTransformer* aOwner); 37 38 explicit RTCEncodedAudioFrame(nsIGlobalObject* aGlobal, 39 RTCEncodedAudioFrameData&& aData); 40 41 // nsISupports 42 NS_DECL_ISUPPORTS_INHERITED 43 NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(RTCEncodedAudioFrame, 44 RTCEncodedFrameBase) 45 46 // webidl (timestamp and data accessors live in base class) 47 JSObject* WrapObject(JSContext* aCx, 48 JS::Handle<JSObject*> aGivenProto) override; 49 50 static already_AddRefed<RTCEncodedAudioFrame> Constructor( 51 const GlobalObject& aGlobal, const RTCEncodedAudioFrame& aOriginalFrame, 52 const RTCEncodedAudioFrameOptions& aOptions, ErrorResult& aRv); 53 54 nsIGlobalObject* GetParentObject() const; 55 56 void GetMetadata(RTCEncodedAudioFrameMetadata& aMetadata) const; 57 58 bool CheckOwner(RTCRtpScriptTransformer* aOwner) const override; 59 60 bool IsVideo() const override { return false; } 61 62 static JSObject* ReadStructuredClone(JSContext* aCx, nsIGlobalObject* aGlobal, 63 JSStructuredCloneReader* aReader, 64 RTCEncodedAudioFrameData& aData); 65 bool WriteStructuredClone(JSStructuredCloneWriter* aWriter, 66 StructuredCloneHolder* aHolder) const; 67 68 private: 69 virtual ~RTCEncodedAudioFrame(); 70 71 // forbid copy/move to keep mState member in base valid 72 RTCEncodedAudioFrame(const RTCEncodedAudioFrame&) = delete; 73 RTCEncodedAudioFrame& operator=(const RTCEncodedAudioFrame&) = delete; 74 RTCEncodedAudioFrame(RTCEncodedAudioFrame&&) = delete; 75 RTCEncodedAudioFrame& operator=(RTCEncodedAudioFrame&&) = delete; 76 77 // RTCEncodedAudioFrame can run on either main thread or worker thread. 78 void AssertIsOnOwningThread() const { 79 NS_ASSERT_OWNINGTHREAD(RTCEncodedAudioFrame); 80 } 81 82 RefPtr<RTCRtpScriptTransformer> mOwner; 83 }; 84 85 } // namespace mozilla::dom 86 #endif // MOZILLA_DOM_MEDIA_WEBRTC_JSAPI_RTCENCODEDAUDIOFRAME_H_