EncodedAudioChunk.h (3583B)
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim:set ts=2 sw=2 sts=2 et cindent: */ 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 http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef mozilla_dom_EncodedAudioChunk_h 8 #define mozilla_dom_EncodedAudioChunk_h 9 10 #include "js/TypeDecls.h" 11 #include "mozilla/ErrorResult.h" 12 #include "mozilla/Maybe.h" 13 #include "mozilla/dom/BindingDeclarations.h" 14 #include "mozilla/dom/BufferSourceBindingFwd.h" 15 #include "nsCycleCollectionParticipant.h" 16 #include "nsWrapperCache.h" 17 18 class nsIGlobalObject; 19 20 namespace mozilla { 21 22 class MediaAlignedByteBuffer; 23 class MediaRawData; 24 25 namespace dom { 26 27 class StructuredCloneHolder; 28 29 enum class EncodedAudioChunkType : uint8_t; 30 struct EncodedAudioChunkInit; 31 32 } // namespace dom 33 } // namespace mozilla 34 35 namespace mozilla::dom { 36 37 class EncodedAudioChunkData { 38 public: 39 EncodedAudioChunkData(already_AddRefed<MediaAlignedByteBuffer> aBuffer, 40 const EncodedAudioChunkType& aType, int64_t aTimestamp, 41 Maybe<uint64_t>&& aDuration); 42 EncodedAudioChunkData(const EncodedAudioChunkData& aData) = default; 43 ~EncodedAudioChunkData() = default; 44 45 UniquePtr<EncodedAudioChunkData> Clone() const; 46 already_AddRefed<MediaRawData> TakeData(); 47 48 nsCString ToString() const; 49 50 protected: 51 // mBuffer's byte length is guaranteed to be smaller than UINT32_MAX. 52 RefPtr<MediaAlignedByteBuffer> mBuffer; 53 EncodedAudioChunkType mType; 54 int64_t mTimestamp; 55 Maybe<uint64_t> mDuration; 56 }; 57 58 class EncodedAudioChunk final : public EncodedAudioChunkData, 59 public nsISupports, 60 public nsWrapperCache { 61 public: 62 NS_DECL_CYCLE_COLLECTING_ISUPPORTS 63 NS_DECL_CYCLE_COLLECTION_WRAPPERCACHE_CLASS(EncodedAudioChunk) 64 65 public: 66 EncodedAudioChunk(nsIGlobalObject* aParent, 67 already_AddRefed<MediaAlignedByteBuffer> aBuffer, 68 const EncodedAudioChunkType& aType, int64_t aTimestamp, 69 Maybe<uint64_t>&& aDuration); 70 71 EncodedAudioChunk(nsIGlobalObject* aParent, 72 const EncodedAudioChunkData& aData); 73 74 protected: 75 ~EncodedAudioChunk() = default; 76 77 public: 78 nsIGlobalObject* GetParentObject() const; 79 80 JSObject* WrapObject(JSContext* aCx, 81 JS::Handle<JSObject*> aGivenProto) override; 82 83 static already_AddRefed<EncodedAudioChunk> Constructor( 84 const GlobalObject& aGlobal, const EncodedAudioChunkInit& aInit, 85 ErrorResult& aRv); 86 87 EncodedAudioChunkType Type() const; 88 89 int64_t Timestamp() const; 90 91 Nullable<uint64_t> GetDuration() const; 92 93 uint32_t ByteLength() const; 94 95 void CopyTo(const AllowSharedBufferSource& aDestination, ErrorResult& aRv); 96 97 // [Serializable] implementations: {Read, Write}StructuredClone 98 static JSObject* ReadStructuredClone(JSContext* aCx, nsIGlobalObject* aGlobal, 99 JSStructuredCloneReader* aReader, 100 const EncodedAudioChunkData& aData); 101 102 bool WriteStructuredClone(JSStructuredCloneWriter* aWriter, 103 StructuredCloneHolder* aHolder) const; 104 105 private: 106 // EncodedAudioChunk can run on either main thread or worker thread. 107 void AssertIsOnOwningThread() const { 108 NS_ASSERT_OWNINGTHREAD(EncodedAudioChunk); 109 } 110 111 nsCOMPtr<nsIGlobalObject> mParent; 112 }; 113 114 } // namespace mozilla::dom 115 116 #endif // mozilla_dom_EncodedAudioChunk_h