/* * Copyright (C) 2011 Igalia S.L * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "config.h" #include "GRefPtrGStreamer.h" #if USE(GSTREAMER) #include namespace WTF { template <> GRefPtr adoptGRef(GstElement* ptr) { ASSERT(!ptr || !g_object_is_floating(ptr)); return GRefPtr(ptr, GRefPtrAdopt); } template <> GstElement* refGPtr(GstElement* ptr) { if (ptr) gst_object_ref_sink(GST_OBJECT(ptr)); return ptr; } template <> void derefGPtr(GstElement* ptr) { if (ptr) gst_object_unref(ptr); } template <> GRefPtr adoptGRef(GstPad* ptr) { ASSERT(!ptr || !g_object_is_floating(ptr)); return GRefPtr(ptr, GRefPtrAdopt); } template <> GstPad* refGPtr(GstPad* ptr) { if (ptr) gst_object_ref_sink(GST_OBJECT(ptr)); return ptr; } template <> void derefGPtr(GstPad* ptr) { if (ptr) gst_object_unref(GST_OBJECT(ptr)); } template <> GRefPtr adoptGRef(GstPadTemplate* ptr) { ASSERT(!ptr || !g_object_is_floating(ptr)); return GRefPtr(ptr, GRefPtrAdopt); } template <> GstPadTemplate* refGPtr(GstPadTemplate* ptr) { if (ptr) gst_object_ref_sink(GST_OBJECT(ptr)); return ptr; } template <> void derefGPtr(GstPadTemplate* ptr) { if (ptr) gst_object_unref(GST_OBJECT(ptr)); } template <> GRefPtr adoptGRef(GstCaps* ptr) { return GRefPtr(ptr, GRefPtrAdopt); } template <> GstCaps* refGPtr(GstCaps* ptr) { if (ptr) gst_caps_ref(ptr); return ptr; } template <> void derefGPtr(GstCaps* ptr) { if (ptr) gst_caps_unref(ptr); } template <> GRefPtr adoptGRef(GstContext* ptr) { return GRefPtr(ptr, GRefPtrAdopt); } template <> GstContext* refGPtr(GstContext* ptr) { if (ptr) gst_context_ref(ptr); return ptr; } template <> void derefGPtr(GstContext* ptr) { if (ptr) gst_context_unref(ptr); } template <> GRefPtr adoptGRef(GstTask* ptr) { // There is no need to check the object reference is floating here because // gst_task_init() always sinks it. return GRefPtr(ptr, GRefPtrAdopt); } template <> GstTask* refGPtr(GstTask* ptr) { if (ptr) gst_object_ref_sink(GST_OBJECT(ptr)); return ptr; } template <> void derefGPtr(GstTask* ptr) { if (ptr) gst_object_unref(ptr); } template <> GRefPtr adoptGRef(GstBus* ptr) { ASSERT(!ptr || !g_object_is_floating(ptr)); return GRefPtr(ptr, GRefPtrAdopt); } template <> GstBus* refGPtr(GstBus* ptr) { if (ptr) gst_object_ref_sink(GST_OBJECT(ptr)); return ptr; } template <> void derefGPtr(GstBus* ptr) { if (ptr) gst_object_unref(ptr); } template <> GRefPtr adoptGRef(GstElementFactory* ptr) { ASSERT(!ptr || !g_object_is_floating(ptr)); return GRefPtr(ptr, GRefPtrAdopt); } template <> GstElementFactory* refGPtr(GstElementFactory* ptr) { if (ptr) gst_object_ref_sink(GST_OBJECT(ptr)); return ptr; } template <> void derefGPtr(GstElementFactory* ptr) { if (ptr) gst_object_unref(ptr); } template<> GRefPtr adoptGRef(GstBuffer* ptr) { return GRefPtr(ptr, GRefPtrAdopt); } template<> GstBuffer* refGPtr(GstBuffer* ptr) { if (ptr) gst_buffer_ref(ptr); return ptr; } template<> void derefGPtr(GstBuffer* ptr) { if (ptr) gst_buffer_unref(ptr); } template<> GRefPtr adoptGRef(GstBufferList* ptr) { return GRefPtr(ptr, GRefPtrAdopt); } template<> GstBufferList* refGPtr(GstBufferList* ptr) { if (ptr) gst_buffer_list_ref(ptr); return ptr; } template<> void derefGPtr(GstBufferList* ptr) { if (ptr) gst_buffer_list_unref(ptr); } template<> GRefPtr adoptGRef(GstBufferPool* ptr) { ASSERT(!ptr || !g_object_is_floating(ptr)); return GRefPtr(ptr, GRefPtrAdopt); } template<> GstBufferPool* refGPtr(GstBufferPool* ptr) { if (ptr) gst_object_ref_sink(GST_OBJECT(ptr)); return ptr; } template<> void derefGPtr(GstBufferPool* ptr) { if (ptr) gst_object_unref(ptr); } template<> GRefPtr adoptGRef(GstSample* ptr) { return GRefPtr(ptr, GRefPtrAdopt); } template<> GstSample* refGPtr(GstSample* ptr) { if (ptr) gst_sample_ref(ptr); return ptr; } template<> void derefGPtr(GstSample* ptr) { if (ptr) gst_sample_unref(ptr); } template<> GRefPtr adoptGRef(GstTagList* ptr) { return GRefPtr(ptr, GRefPtrAdopt); } template<> GstTagList* refGPtr(GstTagList* ptr) { if (ptr) gst_tag_list_ref(ptr); return ptr; } template<> void derefGPtr(GstTagList* ptr) { if (ptr) gst_tag_list_unref(ptr); } template<> GRefPtr adoptGRef(GstEvent* ptr) { return GRefPtr(ptr, GRefPtrAdopt); } template<> GstEvent* refGPtr(GstEvent* ptr) { if (ptr) gst_event_ref(ptr); return ptr; } template<> void derefGPtr(GstEvent* ptr) { if (ptr) gst_event_unref(ptr); } template<> GRefPtr adoptGRef(GstToc* ptr) { return GRefPtr(ptr, GRefPtrAdopt); } template<> GstToc* refGPtr(GstToc* ptr) { if (ptr) return gst_toc_ref(ptr); return ptr; } template<> void derefGPtr(GstToc* ptr) { if (ptr) gst_toc_unref(ptr); } template<> GRefPtr adoptGRef(GstMessage* ptr) { return GRefPtr(ptr, GRefPtrAdopt); } template<> GstMessage* refGPtr(GstMessage* ptr) { if (ptr) return gst_message_ref(ptr); return ptr; } template<> void derefGPtr(GstMessage* ptr) { if (ptr) gst_message_unref(ptr); } template <> GRefPtr adoptGRef(WebKitVideoSink* ptr) { ASSERT(!ptr || !g_object_is_floating(ptr)); return GRefPtr(ptr, GRefPtrAdopt); } template <> WebKitVideoSink* refGPtr(WebKitVideoSink* ptr) { if (ptr) gst_object_ref_sink(GST_OBJECT(ptr)); return ptr; } template <> void derefGPtr(WebKitVideoSink* ptr) { if (ptr) gst_object_unref(GST_OBJECT(ptr)); } template <> GRefPtr adoptGRef(WebKitWebSrc* ptr) { ASSERT(!ptr || !g_object_is_floating(ptr)); return GRefPtr(ptr, GRefPtrAdopt); } // This method is only available for WebKitWebSrc and should not be used for any other type. // This is only to work around a bug in GST where the URI downloader is not taking the ownership of WebKitWebSrc. // See https://bugs.webkit.org/show_bug.cgi?id=144040. GRefPtr ensureGRef(WebKitWebSrc* ptr) { if (ptr && g_object_is_floating(ptr)) gst_object_ref_sink(GST_OBJECT(ptr)); return GRefPtr(ptr); } template <> WebKitWebSrc* refGPtr(WebKitWebSrc* ptr) { if (ptr) gst_object_ref_sink(GST_OBJECT(ptr)); return ptr; } template <> void derefGPtr(WebKitWebSrc* ptr) { if (ptr) gst_object_unref(GST_OBJECT(ptr)); } } // namespace WTF #endif // USE(GSTREAMER)