Changeset 287059 in webkit
- Timestamp:
- Dec 14, 2021, 5:25:11 PM (5 years ago)
- Location:
- trunk/Source
- Files:
-
- 14 edited
-
WebCore/ChangeLog (modified) (1 diff)
-
WebCore/Modules/mediasource/SourceBuffer.cpp (modified) (1 diff)
-
WebCore/Modules/mediasource/SourceBuffer.h (modified) (1 diff)
-
WebCore/platform/audio/cocoa/AudioFileReaderCocoa.cpp (modified) (1 diff)
-
WebCore/platform/graphics/SourceBufferPrivate.cpp (modified) (1 diff)
-
WebCore/platform/graphics/SourceBufferPrivate.h (modified) (2 diffs)
-
WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.h (modified) (1 diff)
-
WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm (modified) (1 diff)
-
WebCore/platform/graphics/cocoa/SourceBufferParser.cpp (modified) (5 diffs)
-
WebCore/platform/graphics/cocoa/SourceBufferParser.h (modified) (3 diffs)
-
WebCore/platform/graphics/cocoa/SourceBufferParserWebM.cpp (modified) (4 diffs)
-
WebKit/ChangeLog (modified) (1 diff)
-
WebKit/WebProcess/GPU/media/SourceBufferPrivateRemote.cpp (modified) (1 diff)
-
WebKit/WebProcess/GPU/media/SourceBufferPrivateRemote.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r287053 r287059 1 2021-12-14 Jean-Yves Avenard <jya@apple.com> 2 3 SourceBufferParser should be using contiguous SharedBuffer 4 https://bugs.webkit.org/show_bug.cgi?id=233865 5 rdar://problem/86085253 6 7 Reviewed by Eric Carlson. 8 9 The SharedBuffer sent to the SourceBufferParser can only ever contain one 10 DataSegment and we had assertions to that effect. The SharedBuffer class 11 type now guarantees how the data is structured and allow for more explicit 12 code which improves readability. 13 We also had some workarounds for the fact that SharedBuffer didn't use 14 thread-safe refcounting and instead we referenced the inner DataSegment. 15 This can be removed. 16 17 Covered by existing tests, no observable differences. 18 19 * Modules/mediasource/SourceBuffer.cpp: 20 (WebCore::SourceBuffer::appendBufferTimerFired): 21 * Modules/mediasource/SourceBuffer.h: 22 * platform/audio/cocoa/AudioFileReaderCocoa.cpp: 23 * platform/graphics/SourceBufferPrivate.cpp: 24 (WebCore::SourceBufferPrivate::append): 25 * platform/graphics/SourceBufferPrivate.h: 26 * platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.h: 27 * platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm: 28 (WebCore::SourceBufferPrivateAVFObjC::append): 29 * platform/graphics/cocoa/SourceBufferParser.cpp: 30 (WebCore::SourceBufferParser::Segment::Segment): 31 (WebCore::SourceBufferParser::Segment::size const): 32 (WebCore::SourceBufferParser::Segment::read const): 33 (WebCore::SourceBufferParser::Segment::takeSharedBuffer): 34 (WebCore::SourceBufferParser::Segment::getSharedBuffer const): 35 * platform/graphics/cocoa/SourceBufferParser.h: 36 * platform/graphics/cocoa/SourceBufferParserWebM.cpp: 37 1 38 2021-12-14 Jean-Yves Avenard <jya@apple.com> 2 39 -
trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp
r287021 r287059 531 531 // When the segment parser loop algorithm is invoked, run the following steps: 532 532 533 RefPtr< FragmentedSharedBuffer> appendData = WTFMove(m_pendingAppendData);533 RefPtr<SharedBuffer> appendData = WTFMove(m_pendingAppendData); 534 534 // 1. Loop Top: If the input buffer is empty, then jump to the need more data step below. 535 535 if (!appendData || !appendData->size()) { -
trunk/Source/WebCore/Modules/mediasource/SourceBuffer.h
r287021 r287059 223 223 WTF::Observer<void*()> m_opaqueRootProvider; 224 224 225 RefPtr< FragmentedSharedBuffer> m_pendingAppendData;225 RefPtr<SharedBuffer> m_pendingAppendData; 226 226 Timer m_appendBufferTimer; 227 227 -
trunk/Source/WebCore/platform/audio/cocoa/AudioFileReaderCocoa.cpp
r287021 r287059 131 131 132 132 public: 133 Ref< FragmentedSharedBuffer> m_buffer;133 Ref<SharedBuffer> m_buffer; 134 134 #if ENABLE(MEDIA_SOURCE) 135 135 Ref<AudioTrackPrivateWebM> m_track; -
trunk/Source/WebCore/platform/graphics/SourceBufferPrivate.cpp
r287021 r287059 1319 1319 } 1320 1320 1321 void SourceBufferPrivate::append(Ref< FragmentedSharedBuffer>&& buffer)1321 void SourceBufferPrivate::append(Ref<SharedBuffer>&& buffer) 1322 1322 { 1323 1323 append(buffer->extractData()); -
trunk/Source/WebCore/platform/graphics/SourceBufferPrivate.h
r287021 r287059 50 50 namespace WebCore { 51 51 52 class FragmentedSharedBuffer;52 class SharedBuffer; 53 53 class TimeRanges; 54 54 … … 69 69 70 70 virtual void setActive(bool) = 0; 71 WEBCORE_EXPORT virtual void append(Ref< FragmentedSharedBuffer>&&);71 WEBCORE_EXPORT virtual void append(Ref<SharedBuffer>&&); 72 72 virtual void abort() = 0; 73 73 virtual void resetParserState() = 0; -
trunk/Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.h
r287021 r287059 154 154 155 155 // SourceBufferPrivate overrides 156 void append(Ref< FragmentedSharedBuffer>&&) final;156 void append(Ref<SharedBuffer>&&) final; 157 157 void abort() final; 158 158 void resetParserState() final; -
trunk/Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm
r287021 r287059 564 564 } 565 565 566 void SourceBufferPrivateAVFObjC::append(Ref< FragmentedSharedBuffer>&& data)566 void SourceBufferPrivateAVFObjC::append(Ref<SharedBuffer>&& data) 567 567 { 568 568 ALWAYS_LOG(LOGIDENTIFIER, "data length = ", data->size()); -
trunk/Source/WebCore/platform/graphics/cocoa/SourceBufferParser.cpp
r287021 r287059 81 81 } 82 82 83 SourceBufferParser::Segment::Segment(Ref< FragmentedSharedBuffer>&& buffer)83 SourceBufferParser::Segment::Segment(Ref<SharedBuffer>&& buffer) 84 84 : m_segment(WTFMove(buffer)) 85 85 { … … 102 102 }, 103 103 #endif 104 [](const Ref< FragmentedSharedBuffer>& buffer)104 [](const Ref<SharedBuffer>& buffer) 105 105 { 106 106 return buffer->size(); … … 126 126 }, 127 127 #endif 128 [&](const Ref< FragmentedSharedBuffer>& buffer) -> ReadResult128 [&](const Ref<SharedBuffer>& buffer) -> ReadResult 129 129 { 130 130 buffer->copyTo(destination, position, sizeToRead); … … 134 134 } 135 135 136 Ref< FragmentedSharedBuffer> SourceBufferParser::Segment::takeSharedBuffer()136 Ref<SharedBuffer> SourceBufferParser::Segment::takeSharedBuffer() 137 137 { 138 138 return WTF::switchOn(m_segment, … … 143 143 auto readResult = read(0, vector.size(), vector.data()); 144 144 if (!readResult.has_value()) 145 return FragmentedSharedBuffer::create();145 return SharedBuffer::create(); 146 146 vector.shrink(readResult.value()); 147 return FragmentedSharedBuffer::create(WTFMove(vector));147 return SharedBuffer::create(WTFMove(vector)); 148 148 }, 149 149 #endif 150 [&](Ref< FragmentedSharedBuffer>& buffer)150 [&](Ref<SharedBuffer>& buffer) 151 151 { 152 return std::exchange(buffer, FragmentedSharedBuffer::create());152 return std::exchange(buffer, SharedBuffer::create()); 153 153 } 154 154 ); 155 155 } 156 156 157 RefPtr< FragmentedSharedBuffer> SourceBufferParser::Segment::getSharedBuffer() const157 RefPtr<SharedBuffer> SourceBufferParser::Segment::getSharedBuffer() const 158 158 { 159 159 return WTF::switchOn(m_segment, 160 160 #if HAVE(MT_PLUGIN_FORMAT_READER) 161 [&](const RetainPtr<MTPluginByteSourceRef>&) -> RefPtr< FragmentedSharedBuffer>161 [&](const RetainPtr<MTPluginByteSourceRef>&) -> RefPtr<SharedBuffer> 162 162 { 163 163 return nullptr; 164 164 }, 165 165 #endif 166 [&](const Ref< FragmentedSharedBuffer>& buffer) -> RefPtr<FragmentedSharedBuffer>166 [&](const Ref<SharedBuffer>& buffer) -> RefPtr<SharedBuffer> 167 167 { 168 168 return buffer.ptr(); -
trunk/Source/WebCore/platform/graphics/cocoa/SourceBufferParser.h
r287021 r287059 46 46 class ContentType; 47 47 class MediaSample; 48 class FragmentedSharedBuffer;48 class SharedBuffer; 49 49 50 50 class WEBCORE_EXPORT SourceBufferParser : public ThreadSafeRefCounted<SourceBufferParser> { … … 70 70 Segment(RetainPtr<MTPluginByteSourceRef>&&); 71 71 #endif 72 Segment(Ref< FragmentedSharedBuffer>&&);72 Segment(Ref<SharedBuffer>&&); 73 73 Segment(Segment&&) = default; 74 Ref< FragmentedSharedBuffer> takeSharedBuffer();75 // Will return nullptr if Segment's backend isn't a FragmentedSharedBuffer.76 RefPtr< FragmentedSharedBuffer> getSharedBuffer() const;74 Ref<SharedBuffer> takeSharedBuffer(); 75 // Will return nullptr if Segment's backend isn't a SharedBuffer. 76 RefPtr<SharedBuffer> getSharedBuffer() const; 77 77 78 78 size_t size() const; … … 88 88 RetainPtr<MTPluginByteSourceRef>, 89 89 #endif 90 Ref< FragmentedSharedBuffer>90 Ref<SharedBuffer> 91 91 > m_segment; 92 92 }; -
trunk/Source/WebCore/platform/graphics/cocoa/SourceBufferParserWebM.cpp
r287021 r287059 366 366 } 367 367 368 static void Free DataSegment(void* refcon, void*, size_t)368 static void FreeSharedBuffer(void* refcon, void*, size_t) 369 369 { 370 auto* buffer = reinterpret_cast< DataSegment*>(refcon);370 auto* buffer = reinterpret_cast<SharedBuffer*>(refcon); 371 371 buffer->deref(); 372 372 } … … 389 389 continue; 390 390 } 391 RefPtr< FragmentedSharedBuffer> sharedBuffer = currentSegment.getSharedBuffer();391 RefPtr<SharedBuffer> sharedBuffer = currentSegment.getSharedBuffer(); 392 392 CMBlockBufferRef rawBlockBuffer = nullptr; 393 393 uint64_t lastRead = 0; … … 409 409 destinationOffset = 0; 410 410 } else { 411 ASSERT(sharedBuffer->hasOneSegment(), "Can only deal with sharedBuffer containing a single DataSegment");412 // A FragmentedSharedBuffer doesn't have thread-safe refcounting, as such we must keep a reference to the DataSegment instead.413 411 // TODO: could we only create a new CMBlockBuffer if the backend memory changed since the previous one? 414 auto firstSegment = sharedBuffer->begin()->segment; 415 size_t canRead = std::min<size_t>(numToRead, firstSegment->size() - m_positionWithinSegment); 412 size_t canRead = std::min<size_t>(numToRead, sharedBuffer->size() - m_positionWithinSegment); 416 413 // From CMBlockBufferCustomBlockSource documentation: 417 414 // Note that for 64-bit architectures, this struct contains misaligned function pointers. … … 421 418 allocator.version = 0; 422 419 allocator.AllocateBlock = nullptr; 423 allocator.FreeBlock = Free DataSegment;424 allocator.refCon = firstSegment.ptr();425 firstSegment->ref();426 auto err = PAL::CMBlockBufferCreateWithMemoryBlock(nullptr, static_cast<void*>(const_cast<uint8_t*>( firstSegment->data())), firstSegment->size(), nullptr, &allocator, m_positionWithinSegment, canRead, 0, &rawBlockBuffer);420 allocator.FreeBlock = FreeSharedBuffer; 421 allocator.refCon = sharedBuffer.get(); 422 sharedBuffer->ref(); 423 auto err = PAL::CMBlockBufferCreateWithMemoryBlock(nullptr, static_cast<void*>(const_cast<uint8_t*>(sharedBuffer->data())), sharedBuffer->size(), nullptr, &allocator, m_positionWithinSegment, canRead, 0, &rawBlockBuffer); 427 424 if (err != kCMBlockBufferNoErr) 428 425 return Status(Status::kNotEnoughMemory); -
trunk/Source/WebKit/ChangeLog
r287056 r287059 1 2021-12-14 Jean-Yves Avenard <jya@apple.com> 2 3 SourceBufferParser should be using contiguous shared buffer 4 https://bugs.webkit.org/show_bug.cgi?id=233865 5 rdar://problem/86085253 6 7 Reviewed by Eric Carlson. 8 9 * WebProcess/GPU/media/SourceBufferPrivateRemote.cpp: 10 (WebKit::SourceBufferPrivateRemote::append): 11 * WebProcess/GPU/media/SourceBufferPrivateRemote.h: 12 1 13 2021-12-14 Alex Christensen <achristensen@webkit.org> 2 14 -
trunk/Source/WebKit/WebProcess/GPU/media/SourceBufferPrivateRemote.cpp
r287021 r287059 79 79 } 80 80 81 void SourceBufferPrivateRemote::append(Ref< FragmentedSharedBuffer>&& data)81 void SourceBufferPrivateRemote::append(Ref<SharedBuffer>&& data) 82 82 { 83 83 if (!m_gpuProcessConnection) -
trunk/Source/WebKit/WebProcess/GPU/media/SourceBufferPrivateRemote.h
r287021 r287059 73 73 // SourceBufferPrivate overrides 74 74 void setActive(bool) final; 75 void append(Ref<WebCore:: FragmentedSharedBuffer>&&) final;75 void append(Ref<WebCore::SharedBuffer>&&) final; 76 76 void abort() final; 77 77 void resetParserState() final;
Note:
See TracChangeset
for help on using the changeset viewer.