⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 236255 in webkit


Ignore:
Timestamp:
Sep 20, 2018, 2:18:01 AM (8 years ago)
Author:
Philippe Normand
Message:

[GStreamer] Utilities cleanups
​https://bugs.webkit.org/show_bug.cgi?id=189699

Reviewed by Xabier Rodriguez-Calvar.

The GstMappedBuffer now has a move constructor so that it can be easily
reused in the webaudiosrc element. The now-unused corresponding
buffer-mapping utilities are removed from the code-base.

The HTTP source element used to handle a GstBuffer in its private
structure but this is no longer required since data is now pushed
in chunks, see bug #182829.

  • platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp:

(webKitWebAudioSrcLoop):

  • platform/graphics/gstreamer/GStreamerCommon.cpp:

(WebCore::createGstBuffer): Deleted.
(WebCore::createGstBufferForData): Deleted.
(WebCore::getGstBufferDataPointer): Deleted.
(WebCore::mapGstBuffer): Deleted.
(WebCore::unmapGstBuffer): Deleted.

  • platform/graphics/gstreamer/GStreamerCommon.h:

(WebCore::GstMappedBuffer::create): New method returning a
reference to a newly created GstMappedBuffer instance.

  • platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp:

(webKitWebSrcStop): Remove reference to unused GstBuffer.
(CachedResourceStreamingClient::dataReceived): Ditto.

Location:
trunk/Source/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r236254 r236255  
     12018-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
    1312018-09-20  Simon Fraser  <simon.fraser@apple.com>
    232
  • trunk/Source/WebCore/platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp

    r232749 r236255  
    309309}
    310310
    311 static void webKitWebAudioSrcLoop(WebKitWebAudioSrc* src)
     311static std::optional<Vector<GRefPtr<GstBuffer>>> webKitWebAudioSrcAllocateBuffersAndRenderAudio(WebKitWebAudioSrc* src)
    312312{
    313313    WebKitWebAudioSourcePrivate* priv = src->priv;
    … …  
    318318        GST_ELEMENT_ERROR(src, CORE, FAILED, ("Internal WebAudioSrc error"), ("Can't start without provider or bus"));
    319319        gst_task_stop(src->priv->task.get());
    320         return;
     320        return std::nullopt;
    321321    }
    322322
    … …  
    326326    GstClockTime duration = gst_util_uint64_scale(priv->numberOfSamples, GST_SECOND, priv->sampleRate) - timestamp;
    327327
    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());
    330330    for (unsigned i = 0; i < priv->sources.size(); ++i) {
    331331        GRefPtr<GstBuffer> buffer;
    332332        GstFlowReturn ret = gst_buffer_pool_acquire_buffer(priv->pool.get(), &buffer.outPtr(), nullptr);
    333333        if (ret != GST_FLOW_OK) {
    334             for (auto& buffer : channelBufferList)
    335                 unmapGstBuffer(buffer.get());
    336 
    337334            // FLUSHING and EOS are not errors.
    338335            if (ret < GST_FLOW_EOS || ret == GST_FLOW_NOT_LINKED)
    339336                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;
    342338        }
    343339
    … …  
    345341        GST_BUFFER_TIMESTAMP(buffer.get()) = timestamp;
    346342        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);
    349347        channelBufferList.uncheckedAppend(WTFMove(buffer));
    350348    }
    … …  
    353351    priv->provider->render(nullptr, priv->bus, priv->framesToPull);
    354352
    355     ASSERT(channelBufferList.size() == priv->sources.size());
     353    return std::make_optional(channelBufferList);
     354}
     355
     356static 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
    356368    bool failed = false;
    357369    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];
    361371
    362372        if (priv->enableGapBufferSupport && priv->bus->channel(i)->isSilent())
  • trunk/Source/WebCore/platform/graphics/gstreamer/GStreamerCommon.cpp

    r234501 r236255  
    4141namespace WebCore {
    4242
    43 const char* webkitGstMapInfoQuarkString = "webkit-gst-map-info";
    44 
    4543GstPad* webkitGstGhostPadFromStaticTemplate(GstStaticPadTemplate* staticPadTemplate, const gchar* name, GstPad* target)
    4644{
    … …  
    144142#endif
    145143
    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 }
    166144
    167145const char* capsMediaType(const GstCaps* caps)
    … …  
    204182    return false;
    205183#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);
    238184}
    239185
  • trunk/Source/WebCore/platform/graphics/gstreamer/GStreamerCommon.h

    r233796 r236255  
    6464bool getSampleVideoInfo(GstSample*, GstVideoInfo&);
    6565#endif
    66 GstBuffer* createGstBuffer(GstBuffer*);
    67 GstBuffer* createGstBufferForData(const char* data, int length);
    68 char* getGstBufferDataPointer(GstBuffer*);
    6966const char* capsMediaType(const GstCaps*);
    7067bool doCapsHaveType(const GstCaps*, const char*);
    7168bool areEncryptedCaps(const GstCaps*);
    72 void mapGstBuffer(GstBuffer*, uint32_t);
    73 void unmapGstBuffer(GstBuffer*);
    7469Vector<String> extractGStreamerOptionsFromCommandLine();
    7570bool initializeGStreamer(std::optional<Vector<String>>&& = std::nullopt);
    … …  
    8580    WTF_MAKE_NONCOPYABLE(GstMappedBuffer);
    8681public:
     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
    8792    GstMappedBuffer(GstBuffer* buffer, GstMapFlags flags)
    8893        : m_buffer(buffer)
    … …  
    9095        m_isValid = gst_buffer_map(m_buffer, &m_info, flags);
    9196    }
     97
    9298    // Unfortunately, GST_MAP_READWRITE is defined out of line from the MapFlags
    9399    // enum as an int, and C++ is careful to not implicity convert it to an enum.
    … …  
    99105        if (m_isValid)
    100106            gst_buffer_unmap(m_buffer, &m_info);
     107        m_isValid = false;
    101108    }
    102109
    … …  
    106113    explicit operator bool() const { return m_isValid; }
    107114private:
    108     GstBuffer* m_buffer;
    109     GstMapInfo m_info;
     115    GstBuffer* m_buffer { nullptr };
     116    GstMapInfo m_info GST_MAP_INFO_INIT;
    110117    bool m_isValid { false };
    111118};
  • trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp

    r234498 r236255  
    104104
    105105    RefPtr<MainThreadNotifier<MainThreadSourceNotification>> notifier;
    106     GRefPtr<GstBuffer> buffer;
    107106};
    108107
    … …  
    366365
    367366    bool wasSeeking = std::exchange(priv->isSeeking, false);
    368 
    369     if (priv->buffer) {
    370         unmapGstBuffer(priv->buffer.get());
    371         priv->buffer.clear();
    372     }
    373367
    374368    priv->paused = false;
    … …  
    892886    WebKitWebSrcPrivate* priv = src->priv;
    893887
    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 
    901888    if (priv->isSeeking) {
    902889        GST_DEBUG_OBJECT(src, "Seek in progress, ignoring data");
    903         priv->buffer.clear();
    904890        return;
    905891    }
    … …  
    910896            // Discard all the buffers coming before the requested seek position.
    911897            priv->offset += length;
    912             priv->buffer.clear();
    913898            return;
    914899        }
    … …  
    918903            data += offset;
    919904            length -= offset;
    920             if (priv->buffer)
    921                 gst_buffer_resize(priv->buffer.get(), offset, -1);
    922905            priv->offset = priv->requestedOffset;
    923906        }
    … …  
    925908        priv->requestedOffset = 0;
    926909    }
    927 
    928     // Ports using the GStreamer backend but not the soup implementation of ResourceHandle
    929     // 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     else
    933         gst_buffer_set_size(priv->buffer.get(), static_cast<gssize>(length));
    934910
    935911    checkUpdateBlocksize(length);
    … …  
    957933        uint64_t currentOffsetSize = std::min(blockSize, bufferSize - currentOffset);
    958934
    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);
    960936        if (UNLIKELY(!subBuffer)) {
    961937            GST_ELEMENT_ERROR(src, CORE, FAILED, ("Failed to allocate sub-buffer"), (nullptr));
    … …  
    986962        }
    987963    }
    988 
    989     priv->buffer.clear();
    990964}
    991965
Note: See TracChangeset for help on using the changeset viewer.