[GLIB] Add GUniqueOutPtr and use it instead of GOwnPtr
[WebKit-https.git] / Source / WebCore / platform / graphics / gstreamer / GStreamerUtilities.cpp
1 /*
2  *  Copyright (C) 2012 Igalia S.L
3  *
4  *  This library is free software; you can redistribute it and/or
5  *  modify it under the terms of the GNU Lesser General Public
6  *  License as published by the Free Software Foundation; either
7  *  version 2 of the License, or (at your option) any later version.
8  *
9  *  This library is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  *  Lesser General Public License for more details.
13  *
14  *  You should have received a copy of the GNU Lesser General Public
15  *  License along with this library; if not, write to the Free Software
16  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
17  */
18
19
20 #include "config.h"
21
22 #if USE(GSTREAMER)
23 #include "GStreamerUtilities.h"
24
25 #include "IntSize.h"
26
27 #include <gst/audio/audio.h>
28 #include <gst/gst.h>
29 #include <wtf/gobject/GUniquePtr.h>
30
31 namespace WebCore {
32
33 const char* webkitGstMapInfoQuarkString = "webkit-gst-map-info";
34
35 GstPad* webkitGstGhostPadFromStaticTemplate(GstStaticPadTemplate* staticPadTemplate, const gchar* name, GstPad* target)
36 {
37     GstPad* pad;
38     GstPadTemplate* padTemplate = gst_static_pad_template_get(staticPadTemplate);
39
40     if (target)
41         pad = gst_ghost_pad_new_from_template(name, target, padTemplate);
42     else
43         pad = gst_ghost_pad_new_no_target_from_template(name, padTemplate);
44
45     gst_object_unref(padTemplate);
46
47     return pad;
48 }
49
50 #if ENABLE(VIDEO)
51 bool getVideoSizeAndFormatFromCaps(GstCaps* caps, WebCore::IntSize& size, GstVideoFormat& format, int& pixelAspectRatioNumerator, int& pixelAspectRatioDenominator, int& stride)
52 {
53     GstVideoInfo info;
54
55     if (!gst_caps_is_fixed(caps) || !gst_video_info_from_caps(&info, caps))
56         return false;
57
58     format = GST_VIDEO_INFO_FORMAT(&info);
59     size.setWidth(GST_VIDEO_INFO_WIDTH(&info));
60     size.setHeight(GST_VIDEO_INFO_HEIGHT(&info));
61     pixelAspectRatioNumerator = GST_VIDEO_INFO_PAR_N(&info);
62     pixelAspectRatioDenominator = GST_VIDEO_INFO_PAR_D(&info);
63     stride = GST_VIDEO_INFO_PLANE_STRIDE(&info, 0);
64
65     return true;
66 }
67 #endif
68
69 GstBuffer* createGstBuffer(GstBuffer* buffer)
70 {
71     gsize bufferSize = gst_buffer_get_size(buffer);
72     GstBuffer* newBuffer = gst_buffer_new_and_alloc(bufferSize);
73
74     if (!newBuffer)
75         return 0;
76
77     gst_buffer_copy_into(newBuffer, buffer, static_cast<GstBufferCopyFlags>(GST_BUFFER_COPY_METADATA), 0, bufferSize);
78     return newBuffer;
79 }
80
81 GstBuffer* createGstBufferForData(const char* data, int length)
82 {
83     GstBuffer* buffer = gst_buffer_new_and_alloc(length);
84
85     gst_buffer_fill(buffer, 0, data, length);
86
87     return buffer;
88 }
89
90 char* getGstBufferDataPointer(GstBuffer* buffer)
91 {
92     GstMiniObject* miniObject = reinterpret_cast<GstMiniObject*>(buffer);
93     GstMapInfo* mapInfo = static_cast<GstMapInfo*>(gst_mini_object_get_qdata(miniObject, g_quark_from_static_string(webkitGstMapInfoQuarkString)));
94     return reinterpret_cast<char*>(mapInfo->data);
95 }
96
97 void mapGstBuffer(GstBuffer* buffer)
98 {
99     GstMapInfo* mapInfo = g_slice_new(GstMapInfo);
100     if (!gst_buffer_map(buffer, mapInfo, GST_MAP_WRITE)) {
101         g_slice_free(GstMapInfo, mapInfo);
102         gst_buffer_unref(buffer);
103         return;
104     }
105
106     GstMiniObject* miniObject = reinterpret_cast<GstMiniObject*>(buffer);
107     gst_mini_object_set_qdata(miniObject, g_quark_from_static_string(webkitGstMapInfoQuarkString), mapInfo, 0);
108 }
109
110 void unmapGstBuffer(GstBuffer* buffer)
111 {
112     GstMiniObject* miniObject = reinterpret_cast<GstMiniObject*>(buffer);
113     GstMapInfo* mapInfo = static_cast<GstMapInfo*>(gst_mini_object_steal_qdata(miniObject, g_quark_from_static_string(webkitGstMapInfoQuarkString)));
114
115     if (!mapInfo)
116         return;
117
118     gst_buffer_unmap(buffer, mapInfo);
119     g_slice_free(GstMapInfo, mapInfo);
120 }
121
122 bool initializeGStreamer()
123 {
124 #if GST_CHECK_VERSION(0, 10, 31)
125     if (gst_is_initialized())
126         return true;
127 #endif
128
129     GUniqueOutPtr<GError> error;
130     // FIXME: We should probably pass the arguments from the command line.
131     bool gstInitialized = gst_init_check(0, 0, &error.outPtr());
132     ASSERT_WITH_MESSAGE(gstInitialized, "GStreamer initialization failed: %s", error ? error->message : "unknown error occurred");
133     return gstInitialized;
134 }
135
136 }
137
138 #endif // USE(GSTREAMER)