Changeset 236255 in webkit
- Timestamp:
- Sep 20, 2018, 2:18:01 AM (8 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 5 edited
-
ChangeLog (modified) (1 diff)
-
platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp (modified) (5 diffs)
-
platform/graphics/gstreamer/GStreamerCommon.cpp (modified) (3 diffs)
-
platform/graphics/gstreamer/GStreamerCommon.h (modified) (5 diffs)
-
platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r236254 r236255 1 2018-09-20 Philippe Normand <pnormand@igalia.com> 2 3 [GStreamer] Utilities cleanups 4 https://bugs.webkit.org/show_bug.cgi?id=189699 5 6 Reviewed by Xabier Rodriguez-Calvar. 7 8 The GstMappedBuffer now has a move constructor so that it can be easily 9 reused in the webaudiosrc element. The now-unused corresponding 10 buffer-mapping utilities are removed from the code-base. 11 12 The HTTP source element used to handle a GstBuffer in its private 13 structure but this is no longer required since data is now pushed 14 in chunks, see bug #182829. 15 16 * platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp: 17 (webKitWebAudioSrcLoop): 18 * platform/graphics/gstreamer/GStreamerCommon.cpp: 19 (WebCore::createGstBuffer): Deleted. 20 (WebCore::createGstBufferForData): Deleted. 21 (WebCore::getGstBufferDataPointer): Deleted. 22 (WebCore::mapGstBuffer): Deleted. 23 (WebCore::unmapGstBuffer): Deleted. 24 * platform/graphics/gstreamer/GStreamerCommon.h: 25 (WebCore::GstMappedBuffer::create): New method returning a 26 reference to a newly created GstMappedBuffer instance. 27 * platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp: 28 (webKitWebSrcStop): Remove reference to unused GstBuffer. 29 (CachedResourceStreamingClient::dataReceived): Ditto. 30 1 31 2018-09-20 Simon Fraser <simon.fraser@apple.com> 2 32 -
trunk/Source/WebCore/platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp
r232749 r236255 309 309 } 310 310 311 static void webKitWebAudioSrcLoop(WebKitWebAudioSrc* src)311 static std::optional<Vector<GRefPtr<GstBuffer>>> webKitWebAudioSrcAllocateBuffersAndRenderAudio(WebKitWebAudioSrc* src) 312 312 { 313 313 WebKitWebAudioSourcePrivate* priv = src->priv; … … 318 318 GST_ELEMENT_ERROR(src, CORE, FAILED, ("Internal WebAudioSrc error"), ("Can't start without provider or bus")); 319 319 gst_task_stop(src->priv->task.get()); 320 return ;320 return std::nullopt; 321 321 } 322 322 … … 326 326 GstClockTime duration = gst_util_uint64_scale(priv->numberOfSamples, GST_SECOND, priv->sampleRate) - timestamp; 327 327 328 Vector<GRefPtr<GstBuffer>> channelBufferList ;329 channelBufferList.reserveInitialCapacity(priv->sources.size());328 Vector<GRefPtr<GstBuffer>> channelBufferList(priv->sources.size()); 329 Vector<GstMappedBuffer> mappedBuffers(priv->sources.size()); 330 330 for (unsigned i = 0; i < priv->sources.size(); ++i) { 331 331 GRefPtr<GstBuffer> buffer; 332 332 GstFlowReturn ret = gst_buffer_pool_acquire_buffer(priv->pool.get(), &buffer.outPtr(), nullptr); 333 333 if (ret != GST_FLOW_OK) { 334 for (auto& buffer : channelBufferList)335 unmapGstBuffer(buffer.get());336 337 334 // FLUSHING and EOS are not errors. 338 335 if (ret < GST_FLOW_EOS || ret == GST_FLOW_NOT_LINKED) 339 336 GST_ELEMENT_ERROR(src, CORE, PAD, ("Internal WebAudioSrc error"), ("Failed to allocate buffer for flow: %s", gst_flow_get_name(ret))); 340 gst_task_stop(src->priv->task.get()); 341 return; 337 return std::nullopt; 342 338 } 343 339 … … 345 341 GST_BUFFER_TIMESTAMP(buffer.get()) = timestamp; 346 342 GST_BUFFER_DURATION(buffer.get()) = duration; 347 mapGstBuffer(buffer.get(), GST_MAP_READWRITE); 348 priv->bus->setChannelMemory(i, reinterpret_cast<float*>(getGstBufferDataPointer(buffer.get())), priv->framesToPull); 343 GstMappedBuffer mappedBuffer(buffer.get(), GST_MAP_READWRITE); 344 ASSERT(mappedBuffer); 345 mappedBuffers.uncheckedAppend(WTFMove(mappedBuffer)); 346 priv->bus->setChannelMemory(i, reinterpret_cast<float*>(mappedBuffers[i].data()), priv->framesToPull); 349 347 channelBufferList.uncheckedAppend(WTFMove(buffer)); 350 348 } … … 353 351 priv->provider->render(nullptr, priv->bus, priv->framesToPull); 354 352 355 ASSERT(channelBufferList.size() == priv->sources.size()); 353 return std::make_optional(channelBufferList); 354 } 355 356 static void webKitWebAudioSrcLoop(WebKitWebAudioSrc* src) 357 { 358 WebKitWebAudioSourcePrivate* priv = src->priv; 359 360 std::optional<Vector<GRefPtr<GstBuffer>>> channelBufferList = webKitWebAudioSrcAllocateBuffersAndRenderAudio(src); 361 if (!channelBufferList) { 362 gst_task_stop(src->priv->task.get()); 363 return; 364 } 365 366 ASSERT(channelBufferList->size() == priv->sources.size()); 367 356 368 bool failed = false; 357 369 for (unsigned i = 0; i < priv->sources.size(); ++i) { 358 // Unmap before passing on the buffer. 359 auto& buffer = channelBufferList[i]; 360 unmapGstBuffer(buffer.get()); 370 auto& buffer = channelBufferList.value()[i]; 361 371 362 372 if (priv->enableGapBufferSupport && priv->bus->channel(i)->isSilent()) -
trunk/Source/WebCore/platform/graphics/gstreamer/GStreamerCommon.cpp
r234501 r236255 41 41 namespace WebCore { 42 42 43 const char* webkitGstMapInfoQuarkString = "webkit-gst-map-info";44 45 43 GstPad* webkitGstGhostPadFromStaticTemplate(GstStaticPadTemplate* staticPadTemplate, const gchar* name, GstPad* target) 46 44 { … … 144 142 #endif 145 143 146 GstBuffer* createGstBuffer(GstBuffer* buffer)147 {148 gsize bufferSize = gst_buffer_get_size(buffer);149 GstBuffer* newBuffer = gst_buffer_new_and_alloc(bufferSize);150 151 if (!newBuffer)152 return 0;153 154 gst_buffer_copy_into(newBuffer, buffer, static_cast<GstBufferCopyFlags>(GST_BUFFER_COPY_METADATA), 0, bufferSize);155 return newBuffer;156 }157 158 GstBuffer* createGstBufferForData(const char* data, int length)159 {160 GstBuffer* buffer = gst_buffer_new_and_alloc(length);161 162 gst_buffer_fill(buffer, 0, data, length);163 164 return buffer;165 }166 144 167 145 const char* capsMediaType(const GstCaps* caps) … … 204 182 return false; 205 183 #endif 206 }207 208 char* getGstBufferDataPointer(GstBuffer* buffer)209 {210 GstMiniObject* miniObject = reinterpret_cast<GstMiniObject*>(buffer);211 GstMapInfo* mapInfo = static_cast<GstMapInfo*>(gst_mini_object_get_qdata(miniObject, g_quark_from_static_string(webkitGstMapInfoQuarkString)));212 return reinterpret_cast<char*>(mapInfo->data);213 }214 215 void mapGstBuffer(GstBuffer* buffer, uint32_t flags)216 {217 GstMapInfo* mapInfo = static_cast<GstMapInfo*>(fastMalloc(sizeof(GstMapInfo)));218 if (!gst_buffer_map(buffer, mapInfo, static_cast<GstMapFlags>(flags))) {219 fastFree(mapInfo);220 gst_buffer_unref(buffer);221 return;222 }223 224 GstMiniObject* miniObject = reinterpret_cast<GstMiniObject*>(buffer);225 gst_mini_object_set_qdata(miniObject, g_quark_from_static_string(webkitGstMapInfoQuarkString), mapInfo, nullptr);226 }227 228 void unmapGstBuffer(GstBuffer* buffer)229 {230 GstMiniObject* miniObject = reinterpret_cast<GstMiniObject*>(buffer);231 GstMapInfo* mapInfo = static_cast<GstMapInfo*>(gst_mini_object_steal_qdata(miniObject, g_quark_from_static_string(webkitGstMapInfoQuarkString)));232 233 if (!mapInfo)234 return;235 236 gst_buffer_unmap(buffer, mapInfo);237 fastFree(mapInfo);238 184 } 239 185 -
trunk/Source/WebCore/platform/graphics/gstreamer/GStreamerCommon.h
r233796 r236255 64 64 bool getSampleVideoInfo(GstSample*, GstVideoInfo&); 65 65 #endif 66 GstBuffer* createGstBuffer(GstBuffer*);67 GstBuffer* createGstBufferForData(const char* data, int length);68 char* getGstBufferDataPointer(GstBuffer*);69 66 const char* capsMediaType(const GstCaps*); 70 67 bool doCapsHaveType(const GstCaps*, const char*); 71 68 bool areEncryptedCaps(const GstCaps*); 72 void mapGstBuffer(GstBuffer*, uint32_t);73 void unmapGstBuffer(GstBuffer*);74 69 Vector<String> extractGStreamerOptionsFromCommandLine(); 75 70 bool initializeGStreamer(std::optional<Vector<String>>&& = std::nullopt); … … 85 80 WTF_MAKE_NONCOPYABLE(GstMappedBuffer); 86 81 public: 82 83 GstMappedBuffer() = default; 84 GstMappedBuffer(GstMappedBuffer&& other) 85 : m_buffer(other.m_buffer) 86 , m_info(other.m_info) 87 , m_isValid(other.m_isValid) 88 { 89 other.m_isValid = false; 90 } 91 87 92 GstMappedBuffer(GstBuffer* buffer, GstMapFlags flags) 88 93 : m_buffer(buffer) … … 90 95 m_isValid = gst_buffer_map(m_buffer, &m_info, flags); 91 96 } 97 92 98 // Unfortunately, GST_MAP_READWRITE is defined out of line from the MapFlags 93 99 // enum as an int, and C++ is careful to not implicity convert it to an enum. … … 99 105 if (m_isValid) 100 106 gst_buffer_unmap(m_buffer, &m_info); 107 m_isValid = false; 101 108 } 102 109 … … 106 113 explicit operator bool() const { return m_isValid; } 107 114 private: 108 GstBuffer* m_buffer ;109 GstMapInfo m_info ;115 GstBuffer* m_buffer { nullptr }; 116 GstMapInfo m_info GST_MAP_INFO_INIT; 110 117 bool m_isValid { false }; 111 118 }; -
trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp
r234498 r236255 104 104 105 105 RefPtr<MainThreadNotifier<MainThreadSourceNotification>> notifier; 106 GRefPtr<GstBuffer> buffer;107 106 }; 108 107 … … 366 365 367 366 bool wasSeeking = std::exchange(priv->isSeeking, false); 368 369 if (priv->buffer) {370 unmapGstBuffer(priv->buffer.get());371 priv->buffer.clear();372 }373 367 374 368 priv->paused = false; … … 892 886 WebKitWebSrcPrivate* priv = src->priv; 893 887 894 GST_LOG_OBJECT(src, "Have %lld bytes of data", priv->buffer ? static_cast<long long>(gst_buffer_get_size(priv->buffer.get())) : length);895 896 ASSERT(!priv->buffer || data == getGstBufferDataPointer(priv->buffer.get()));897 898 if (priv->buffer)899 unmapGstBuffer(priv->buffer.get());900 901 888 if (priv->isSeeking) { 902 889 GST_DEBUG_OBJECT(src, "Seek in progress, ignoring data"); 903 priv->buffer.clear();904 890 return; 905 891 } … … 910 896 // Discard all the buffers coming before the requested seek position. 911 897 priv->offset += length; 912 priv->buffer.clear();913 898 return; 914 899 } … … 918 903 data += offset; 919 904 length -= offset; 920 if (priv->buffer)921 gst_buffer_resize(priv->buffer.get(), offset, -1);922 905 priv->offset = priv->requestedOffset; 923 906 } … … 925 908 priv->requestedOffset = 0; 926 909 } 927 928 // Ports using the GStreamer backend but not the soup implementation of ResourceHandle929 // won't be using buffers provided by this client, the buffer is created here in that case.930 if (!priv->buffer)931 priv->buffer = adoptGRef(createGstBufferForData(data, length));932 else933 gst_buffer_set_size(priv->buffer.get(), static_cast<gssize>(length));934 910 935 911 checkUpdateBlocksize(length); … … 957 933 uint64_t currentOffsetSize = std::min(blockSize, bufferSize - currentOffset); 958 934 959 GstBuffer* subBuffer = gst_buffer_ copy_region(priv->buffer.get(), GST_BUFFER_COPY_ALL, currentOffset, currentOffsetSize);935 GstBuffer* subBuffer = gst_buffer_new_wrapped(g_memdup(data + currentOffset, currentOffsetSize), currentOffsetSize); 960 936 if (UNLIKELY(!subBuffer)) { 961 937 GST_ELEMENT_ERROR(src, CORE, FAILED, ("Failed to allocate sub-buffer"), (nullptr)); … … 986 962 } 987 963 } 988 989 priv->buffer.clear();990 964 } 991 965
Note:
See TracChangeset
for help on using the changeset viewer.