Changeset 99977 in webkit


Ignore:
Timestamp:
Nov 11, 2011 8:35:13 AM (12 years ago)
Author:
Philippe Normand
Message:

[GStreamer] GstCaps and GstPad RefPtr implementation
https://bugs.webkit.org/show_bug.cgi?id=72023

Reviewed by Martin Robinson.

Smart pointer implementations for GstCaps and GstPad and them
in the media player code.

  • platform/graphics/gstreamer/GRefPtrGStreamer.cpp:

(WTF::GstPad):
(WTF::GstCaps):

  • platform/graphics/gstreamer/GRefPtrGStreamer.h:
  • platform/graphics/gstreamer/GStreamerGWorld.cpp:

(WebCore::GStreamerGWorld::enterFullscreen):
(WebCore::GStreamerGWorld::exitFullscreen):

  • platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:

(WebCore::MediaPlayerPrivateGStreamer::naturalSize):
(WebCore::MediaPlayerPrivateGStreamer::totalBytes):
(WebCore::MediaPlayerPrivateGStreamer::createGSTPlayBin):

  • platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp:

(webkit_web_src_init):
(StreamingClient::didReceiveResponse):

Location:
trunk/Source/WebCore
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r99968 r99977  
     12011-11-10  Philippe Normand  <pnormand@igalia.com>
     2
     3        [GStreamer] GstCaps and GstPad RefPtr implementation
     4        https://bugs.webkit.org/show_bug.cgi?id=72023
     5
     6        Reviewed by Martin Robinson.
     7
     8        Smart pointer implementations for GstCaps and GstPad and them
     9        in the media player code.
     10
     11        * platform/graphics/gstreamer/GRefPtrGStreamer.cpp:
     12        (WTF::GstPad):
     13        (WTF::GstCaps):
     14        * platform/graphics/gstreamer/GRefPtrGStreamer.h:
     15        * platform/graphics/gstreamer/GStreamerGWorld.cpp:
     16        (WebCore::GStreamerGWorld::enterFullscreen):
     17        (WebCore::GStreamerGWorld::exitFullscreen):
     18        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
     19        (WebCore::MediaPlayerPrivateGStreamer::naturalSize):
     20        (WebCore::MediaPlayerPrivateGStreamer::totalBytes):
     21        (WebCore::MediaPlayerPrivateGStreamer::createGSTPlayBin):
     22        * platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp:
     23        (webkit_web_src_init):
     24        (StreamingClient::didReceiveResponse):
     25
    1262011-11-11  Sheriff Bot  <webkit.review.bot@gmail.com>
    227
  • trunk/Source/WebCore/platform/graphics/gstreamer/GRefPtrGStreamer.cpp

    r95901 r99977  
    2929{
    3030    if (ptr)
    31         gst_object_ref(ptr);
     31        gst_object_ref_sink(ptr);
    3232    return ptr;
    3333}
     
    3939}
    4040
     41template <> GstPad* refGPtr<GstPad>(GstPad* ptr)
     42{
     43    if (ptr)
     44        gst_object_ref_sink(GST_OBJECT(ptr));
     45    return ptr;
     46}
     47
     48template <> void derefGPtr<GstPad>(GstPad* ptr)
     49{
     50    if (ptr)
     51        gst_object_unref(GST_OBJECT(ptr));
     52}
     53
     54template <> GstCaps* refGPtr<GstCaps>(GstCaps* ptr)
     55{
     56    if (ptr)
     57        gst_caps_ref(ptr);
     58    return ptr;
     59}
     60
     61template <> void derefGPtr<GstCaps>(GstCaps* ptr)
     62{
     63    if (ptr)
     64        gst_caps_unref(ptr);
     65}
     66
    4167}
    4268#endif // USE(GSTREAMER)
  • trunk/Source/WebCore/platform/graphics/gstreamer/GRefPtrGStreamer.h

    r95901 r99977  
    2525
    2626typedef struct _GstElement GstElement;
     27typedef struct _GstPad GstPad;
     28typedef struct _GstCaps GstCaps;
    2729
    2830namespace WTF {
     
    3133template<> void derefGPtr<GstElement>(GstElement* ptr);
    3234
     35template<> GstPad* refGPtr<GstPad>(GstPad* ptr);
     36template<> void derefGPtr<GstPad>(GstPad* ptr);
     37
     38template<> GstCaps* refGPtr<GstCaps>(GstCaps* ptr);
     39template<> void derefGPtr<GstCaps>(GstCaps* ptr);
     40
    3341}
    3442
  • trunk/Source/WebCore/platform/graphics/gstreamer/GStreamerGWorld.cpp

    r98924 r99977  
    9393    videoSink = adoptGRef(sinkPtr);
    9494
    95     GstElement* tee = gst_bin_get_by_name(GST_BIN(videoSink.get()), "videoTee");
     95    GRefPtr<GstElement> tee = adoptGRef(gst_bin_get_by_name(GST_BIN(videoSink.get()), "videoTee"));
    9696
    9797    // Add and link a queue, ffmpegcolorspace, videoscale and sink in the bin.
     
    104104
    105105    // Link a new src pad from tee to queue.
    106     GstPad* srcPad = gst_element_get_request_pad(tee, "src%d");
    107     GstPad* sinkPad = gst_element_get_static_pad(queue, "sink");
    108     gst_pad_link(srcPad, sinkPad);
    109     gst_object_unref(GST_OBJECT(sinkPad));
    110 
    111     m_dynamicPadName.set(gst_pad_get_name(srcPad));
     106    GRefPtr<GstPad> srcPad = adoptGRef(gst_element_get_request_pad(tee.get(), "src%d"));
     107    GRefPtr<GstPad> sinkPad = adoptGRef(gst_element_get_static_pad(queue, "sink"));
     108    gst_pad_link(srcPad.get(), sinkPad.get());
     109
     110    m_dynamicPadName.set(gst_pad_get_name(srcPad.get()));
    112111
    113112    // Synchronize the new elements with pipeline state. If it's
     
    122121    gst_element_set_state(colorspace, state);
    123122    gst_element_set_state(queue, state);
    124     gst_object_unref(tee);
    125123
    126124    // Query the current media segment informations and send them towards
     
    132130    if (!queryResult) {
    133131        gst_query_unref(query);
    134         gst_object_unref(GST_OBJECT(srcPad));
    135132        return true;
    136133    }
     
    146143
    147144    GstEvent* event = gst_event_new_new_segment(FALSE, rate, format, startValue, stopValue, position);
    148     gst_pad_push_event(srcPad, event);
     145    gst_pad_push_event(srcPad.get(), event);
    149146
    150147    gst_query_unref(query);
    151     gst_object_unref(GST_OBJECT(srcPad));
    152148    return true;
    153149}
     
    165161    videoSink = adoptGRef(sinkPtr);
    166162
    167     GstElement* tee = gst_bin_get_by_name(GST_BIN(videoSink.get()), "videoTee");
    168     GstElement* platformVideoSink = gst_bin_get_by_name(GST_BIN(videoSink.get()), "platformVideoSink");
    169     GstElement* queue = gst_bin_get_by_name(GST_BIN(videoSink.get()), "queue");
    170     GstElement* colorspace = gst_bin_get_by_name(GST_BIN(videoSink.get()), "colorspace");
    171     GstElement* videoScale = gst_bin_get_by_name(GST_BIN(videoSink.get()), "videoScale");
     163    GRefPtr<GstElement> tee = adoptGRef(gst_bin_get_by_name(GST_BIN(videoSink.get()), "videoTee"));
     164    GRefPtr<GstElement> platformVideoSink = adoptGRef(gst_bin_get_by_name(GST_BIN(videoSink.get()), "platformVideoSink"));
     165    GRefPtr<GstElement> queue = adoptGRef(gst_bin_get_by_name(GST_BIN(videoSink.get()), "queue"));
     166    GRefPtr<GstElement> colorspace = adoptGRef(gst_bin_get_by_name(GST_BIN(videoSink.get()), "colorspace"));
     167    GRefPtr<GstElement> videoScale = adoptGRef(gst_bin_get_by_name(GST_BIN(videoSink.get()), "videoScale"));
    172168
    173169    // Get pads to unlink and remove.
    174     GstPad* srcPad = gst_element_get_static_pad(tee, m_dynamicPadName.get());
    175     GstPad* sinkPad = gst_element_get_static_pad(queue, "sink");
     170    GRefPtr<GstPad> srcPad = adoptGRef(gst_element_get_static_pad(tee.get(), m_dynamicPadName.get()));
     171    GRefPtr<GstPad> sinkPad = adoptGRef(gst_element_get_static_pad(queue.get(), "sink"));
    176172
    177173    // Block data flow towards the pipeline branch to remove. No need
     
    179175    GstState state;
    180176    gst_element_get_state(m_pipeline, &state, 0, 0);
    181     if (state < GST_STATE_PLAYING || gst_pad_set_blocked(srcPad, true)) {
     177    if (state < GST_STATE_PLAYING || gst_pad_set_blocked(srcPad.get(), true)) {
    182178
    183179        // Unlink and release request pad.
    184         gst_pad_unlink(srcPad, sinkPad);
    185         gst_element_release_request_pad(tee, srcPad);
     180        gst_pad_unlink(srcPad.get(), sinkPad.get());
     181        gst_element_release_request_pad(tee.get(), srcPad.get());
    186182
    187183        // Unlink, remove and cleanup queue, ffmpegcolorspace, videoScale and sink.
    188         gst_element_unlink_many(queue, colorspace, videoScale, platformVideoSink, NULL);
    189         gst_bin_remove_many(GST_BIN(videoSink.get()), queue, colorspace, videoScale, platformVideoSink, NULL);
    190         gst_element_set_state(platformVideoSink, GST_STATE_NULL);
    191         gst_element_set_state(videoScale, GST_STATE_NULL);
    192         gst_element_set_state(colorspace, GST_STATE_NULL);
    193         gst_element_set_state(queue, GST_STATE_NULL);
     184        gst_element_unlink_many(queue.get(), colorspace.get(), videoScale.get(), platformVideoSink.get(), NULL);
     185        gst_bin_remove_many(GST_BIN(videoSink.get()), queue.get(), colorspace.get(), videoScale.get(), platformVideoSink.get(), NULL);
     186        gst_element_set_state(platformVideoSink.get(), GST_STATE_NULL);
     187        gst_element_set_state(videoScale.get(), GST_STATE_NULL);
     188        gst_element_set_state(colorspace.get(), GST_STATE_NULL);
     189        gst_element_set_state(queue.get(), GST_STATE_NULL);
    194190    }
    195191
    196     gst_object_unref(GST_OBJECT(srcPad));
    197     gst_object_unref(GST_OBJECT(sinkPad));
    198 
    199     gst_object_unref(queue);
    200     gst_object_unref(colorspace);
    201     gst_object_unref(videoScale);
    202     gst_object_unref(platformVideoSink);
    203 
    204     gst_object_unref(tee);
    205192    m_dynamicPadName.clear();
    206193}
  • trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp

    r98924 r99977  
    482482        return IntSize();
    483483
    484     GstPad* pad = gst_element_get_static_pad(m_webkitVideoSink, "sink");
     484    GRefPtr<GstPad> pad = adoptGRef(gst_element_get_static_pad(m_webkitVideoSink, "sink"));
    485485    if (!pad)
    486486        return IntSize();
    487487
    488488    guint64 width = 0, height = 0;
    489     GstCaps* caps = GST_PAD_CAPS(pad);
     489    GstCaps* caps = GST_PAD_CAPS(pad.get());
    490490    int pixelAspectRatioNumerator, pixelAspectRatioDenominator;
    491491    int displayWidth, displayHeight, displayAspectRatioGCD;
     
    497497    // https://bugzilla.gnome.org/show_bug.cgi?id=596326
    498498
    499     // Get the video PAR and original size.
     499    // Get the video PAR and original size, if this fails the
     500    // video-sink has likely not yet negotiated its caps.
    500501    if (!GST_IS_CAPS(caps) || !gst_caps_is_fixed(caps)
    501502        || !gst_video_format_parse_caps(caps, 0, &originalWidth, &originalHeight)
    502503        || !gst_video_parse_caps_pixel_aspect_ratio(caps, &pixelAspectRatioNumerator,
    503                                                     &pixelAspectRatioDenominator)) {
    504         gst_object_unref(GST_OBJECT(pad));
    505         // The video-sink has likely not yet negotiated its caps.
     504                                                    &pixelAspectRatioDenominator))
    506505        return IntSize();
    507     }
    508 
    509     gst_object_unref(GST_OBJECT(pad));
    510506
    511507    LOG_VERBOSE(Media, "Original video size: %dx%d", originalWidth, originalHeight);
     
    940936        switch (gst_iterator_next(iter, &data)) {
    941937        case GST_ITERATOR_OK: {
    942             GstPad* pad = GST_PAD_CAST(data);
     938            GRefPtr<GstPad> pad = adoptGRef(GST_PAD_CAST(data));
    943939            gint64 padLength = 0;
    944             if (gst_pad_query_duration(pad, &fmt, &padLength)
     940            if (gst_pad_query_duration(pad.get(), &fmt, &padLength)
    945941                && padLength > length)
    946942                length = padLength;
    947             gst_object_unref(pad);
    948943            break;
    949944        }
     
    17091704
    17101705    // Link a new src pad from tee to queue1.
    1711     GstPad* srcPad = gst_element_get_request_pad(videoTee, "src%d");
    1712     GstPad* sinkPad = gst_element_get_static_pad(queue, "sink");
    1713     gst_pad_link(srcPad, sinkPad);
    1714     gst_object_unref(GST_OBJECT(srcPad));
    1715     gst_object_unref(GST_OBJECT(sinkPad));
     1706    GRefPtr<GstPad> srcPad = adoptGRef(gst_element_get_request_pad(videoTee, "src%d"));
     1707    GRefPtr<GstPad> sinkPad = adoptGRef(gst_element_get_static_pad(queue, "sink"));
     1708    gst_pad_link(srcPad.get(), sinkPad.get());
    17161709
    17171710    GstElement* actualVideoSink = 0;
     
    17511744
    17521745    // Add a ghostpad to the bin so it can proxy to tee.
    1753     GstPad* pad = gst_element_get_static_pad(videoTee, "sink");
    1754     gst_element_add_pad(m_videoSinkBin, gst_ghost_pad_new("sink", pad));
    1755     gst_object_unref(GST_OBJECT(pad));
     1746    GRefPtr<GstPad> pad = adoptGRef(gst_element_get_static_pad(videoTee, "sink"));
     1747    gst_element_add_pad(m_videoSinkBin, gst_ghost_pad_new("sink", pad.get()));
    17561748
    17571749    // Set the bin as video sink of playbin.
    17581750    g_object_set(m_playBin, "video-sink", m_videoSinkBin, NULL);
    17591751
    1760 
    1761     pad = gst_element_get_static_pad(m_webkitVideoSink, "sink");
    1762     if (pad) {
    1763         g_signal_connect(pad, "notify::caps", G_CALLBACK(mediaPlayerPrivateVideoSinkCapsChangedCallback), this);
    1764         gst_object_unref(GST_OBJECT(pad));
    1765     }
     1752    pad = adoptGRef(gst_element_get_static_pad(m_webkitVideoSink, "sink"));
     1753    if (pad)
     1754        g_signal_connect(pad.get(), "notify::caps", G_CALLBACK(mediaPlayerPrivateVideoSinkCapsChangedCallback), this);
    17661755
    17671756}
  • trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp

    r96942 r99977  
    214214{
    215215    GstPadTemplate* padTemplate = gst_static_pad_template_get(&srcTemplate);
    216     GstPad* targetpad;
    217216    WebKitWebSrcPrivate* priv = WEBKIT_WEB_SRC_GET_PRIVATE(src);
    218217
     
    233232
    234233
    235     targetpad = gst_element_get_static_pad(GST_ELEMENT(priv->appsrc), "src");
    236     priv->srcpad = gst_ghost_pad_new_from_template("src", targetpad, padTemplate);
    237     gst_object_unref(targetpad);
     234    GRefPtr<GstPad> targetPad = adoptGRef(gst_element_get_static_pad(GST_ELEMENT(priv->appsrc), "src"));
     235    priv->srcpad = gst_ghost_pad_new_from_template("src", targetPad.get(), padTemplate);
    238236
    239237    gst_element_add_pad(GST_ELEMENT(src), priv->srcpad);
     
    733731           
    734732        if (endptr && *endptr == '\0' && icyMetaInt > 0) {
    735             GstCaps* caps = gst_caps_new_simple("application/x-icy", "metadata-interval", G_TYPE_INT, (gint) icyMetaInt, NULL);
    736 
    737             gst_app_src_set_caps(priv->appsrc, caps);
    738             gst_caps_unref(caps);
     733            GRefPtr<GstCaps> caps = adoptGRef(gst_caps_new_simple("application/x-icy", "metadata-interval", G_TYPE_INT, (gint) icyMetaInt, NULL));
     734
     735            gst_app_src_set_caps(priv->appsrc, caps.get());
    739736        }
    740737    }
Note: See TracChangeset for help on using the changeset viewer.