Changeset 269839 in webkit


Ignore:
Timestamp:
Nov 16, 2020 1:27:23 AM (3 years ago)
Author:
Philippe Normand
Message:

[GStreamer] Switch the ImageDecoder to decodebin3
https://bugs.webkit.org/show_bug.cgi?id=218246

Reviewed by Xabier Rodriguez-Calvar.

Rely on the decodebin3 select-stream to ensure that at most one video stream is selected for
decoding. Thus we don't need to plug a fakesink to streams we don't need anymore.

  • platform/graphics/gstreamer/ImageDecoderGStreamer.cpp:

(WebCore::ImageDecoderGStreamer::InnerDecoder::decodebinSelectStreamCallback):
(WebCore::ImageDecoderGStreamer::InnerDecoder::selectStream):
(WebCore::ImageDecoderGStreamer::InnerDecoder::connectDecoderPad):
(WebCore::ImageDecoderGStreamer::InnerDecoder::preparePipeline):

  • platform/graphics/gstreamer/ImageDecoderGStreamer.h:
Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r269838 r269839  
     12020-11-16  Philippe Normand  <pnormand@igalia.com>
     2
     3        [GStreamer] Switch the ImageDecoder to decodebin3
     4        https://bugs.webkit.org/show_bug.cgi?id=218246
     5
     6        Reviewed by Xabier Rodriguez-Calvar.
     7
     8        Rely on the decodebin3 select-stream to ensure that at most one video stream is selected for
     9        decoding. Thus we don't need to plug a fakesink to streams we don't need anymore.
     10
     11        * platform/graphics/gstreamer/ImageDecoderGStreamer.cpp:
     12        (WebCore::ImageDecoderGStreamer::InnerDecoder::decodebinSelectStreamCallback):
     13        (WebCore::ImageDecoderGStreamer::InnerDecoder::selectStream):
     14        (WebCore::ImageDecoderGStreamer::InnerDecoder::connectDecoderPad):
     15        (WebCore::ImageDecoderGStreamer::InnerDecoder::preparePipeline):
     16        * platform/graphics/gstreamer/ImageDecoderGStreamer.h:
     17
    1182020-11-16  Fujii Hironori  <Hironori.Fujii@sony.com>
    219
  • trunk/Source/WebCore/platform/graphics/gstreamer/ImageDecoderGStreamer.cpp

    r269614 r269839  
    224224}
    225225
     226int ImageDecoderGStreamer::InnerDecoder::selectStream(GstStream* stream)
     227{
     228    // Select only the first video stream.
     229    auto* object = GST_OBJECT_CAST(m_decodebin.get());
     230    GST_OBJECT_LOCK(object);
     231    auto numberOfSourcePads = m_decodebin->numsrcpads;
     232    GST_OBJECT_UNLOCK(object);
     233
     234    if (numberOfSourcePads) {
     235        GST_DEBUG_OBJECT(m_pipeline.get(), "Discarding additional %" GST_PTR_FORMAT, stream);
     236        return 0;
     237    }
     238
     239    int result = gst_stream_get_stream_type(stream) & GST_STREAM_TYPE_VIDEO ? 1 : 0;
     240    GST_DEBUG_OBJECT(m_pipeline.get(), "%" GST_PTR_FORMAT " selected: %s", stream, boolForPrinting(result));
     241    return result;
     242}
     243
    226244void ImageDecoderGStreamer::InnerDecoder::decodebinPadAddedCallback(ImageDecoderGStreamer::InnerDecoder* decoder, GstPad* pad)
    227245{
     
    231249void ImageDecoderGStreamer::InnerDecoder::connectDecoderPad(GstPad* pad)
    232250{
    233     auto padCaps = adoptGRef(gst_pad_get_current_caps(pad));
     251    auto padCaps = adoptGRef(gst_pad_query_caps(pad, nullptr));
    234252    GST_DEBUG_OBJECT(m_pipeline.get(), "New decodebin pad %" GST_PTR_FORMAT " caps: %" GST_PTR_FORMAT, pad, padCaps.get());
    235 
    236     if (!doCapsHaveType(padCaps.get(), "video")) {
    237         GST_DEBUG_OBJECT(m_pipeline.get(), "Non-video pad, plugging to a fakesink");
    238         auto* sink = gst_element_factory_make("fakesink", nullptr);
    239         gst_bin_add(GST_BIN_CAST(m_pipeline.get()), sink);
    240         auto sinkPad = adoptGRef(gst_element_get_static_pad(sink, "sink"));
    241         gst_pad_link(pad, sinkPad.get());
    242         gst_element_sync_state_with_parent(sink);
    243         return;
    244     }
     253    RELEASE_ASSERT(doCapsHaveType(padCaps.get(), "video"));
    245254
    246255    GstElement* sink = gst_element_factory_make("appsink", nullptr);
     
    353362    g_object_set(source, "stream", m_memoryStream.get(), nullptr);
    354363
    355     GstElement* decoder = gst_element_factory_make("decodebin", nullptr);
    356     g_signal_connect_swapped(decoder, "pad-added", G_CALLBACK(decodebinPadAddedCallback), this);
    357 
    358     gst_bin_add_many(GST_BIN_CAST(m_pipeline.get()), source, decoder, nullptr);
    359     gst_element_link(source, decoder);
     364    m_decodebin = gst_element_factory_make("decodebin3", nullptr);
     365    g_signal_connect(m_decodebin.get(), "select-stream", G_CALLBACK(+[](GstElement*, GstStreamCollection*, GstStream* stream, ImageDecoderGStreamer::InnerDecoder* decoder) -> int {
     366        return decoder->selectStream(stream);
     367    }), this);
     368    g_signal_connect_swapped(m_decodebin.get(), "pad-added", G_CALLBACK(decodebinPadAddedCallback), this);
     369
     370    gst_bin_add_many(GST_BIN_CAST(m_pipeline.get()), source, m_decodebin.get(), nullptr);
     371    gst_element_link(source, m_decodebin.get());
    360372    gst_element_set_state(m_pipeline.get(), GST_STATE_PLAYING);
    361373}
  • trunk/Source/WebCore/platform/graphics/gstreamer/ImageDecoderGStreamer.h

    r269614 r269839  
    107107        void handleMessage(GstMessage*);
    108108        void preparePipeline();
     109        int selectStream(GstStream*);
    109110        void connectDecoderPad(GstPad*);
    110111
     
    112113        GRefPtr<GstElement> m_pipeline;
    113114        GRefPtr<GInputStream> m_memoryStream;
     115        GRefPtr<GstElement> m_decodebin;
    114116        RunLoop& m_runLoop;
    115117    };
Note: See TracChangeset for help on using the changeset viewer.