Changeset 269839 in webkit
- Timestamp:
- Nov 16, 2020 1:27:23 AM (3 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r269838 r269839 1 2020-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 1 18 2020-11-16 Fujii Hironori <Hironori.Fujii@sony.com> 2 19 -
trunk/Source/WebCore/platform/graphics/gstreamer/ImageDecoderGStreamer.cpp
r269614 r269839 224 224 } 225 225 226 int 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 226 244 void ImageDecoderGStreamer::InnerDecoder::decodebinPadAddedCallback(ImageDecoderGStreamer::InnerDecoder* decoder, GstPad* pad) 227 245 { … … 231 249 void ImageDecoderGStreamer::InnerDecoder::connectDecoderPad(GstPad* pad) 232 250 { 233 auto padCaps = adoptGRef(gst_pad_ get_current_caps(pad));251 auto padCaps = adoptGRef(gst_pad_query_caps(pad, nullptr)); 234 252 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")); 245 254 246 255 GstElement* sink = gst_element_factory_make("appsink", nullptr); … … 353 362 g_object_set(source, "stream", m_memoryStream.get(), nullptr); 354 363 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()); 360 372 gst_element_set_state(m_pipeline.get(), GST_STATE_PLAYING); 361 373 } -
trunk/Source/WebCore/platform/graphics/gstreamer/ImageDecoderGStreamer.h
r269614 r269839 107 107 void handleMessage(GstMessage*); 108 108 void preparePipeline(); 109 int selectStream(GstStream*); 109 110 void connectDecoderPad(GstPad*); 110 111 … … 112 113 GRefPtr<GstElement> m_pipeline; 113 114 GRefPtr<GInputStream> m_memoryStream; 115 GRefPtr<GstElement> m_decodebin; 114 116 RunLoop& m_runLoop; 115 117 };
Note: See TracChangeset
for help on using the changeset viewer.