8472d782995b553fbb4921177484cc5e8817ec53
[WebKit-https.git] / Source / WebCore / platform / graphics / gstreamer / GStreamerUtilities.h
1 /*
2  *  Copyright (C) 2012, 2015, 2016 Igalia S.L
3  *  Copyright (C) 2015, 2016 Metrological Group B.V.
4  *
5  *  This library is free software; you can redistribute it and/or
6  *  modify it under the terms of the GNU Lesser General Public
7  *  License as published by the Free Software Foundation; either
8  *  version 2 of the License, or (at your option) any later version.
9  *
10  *  This library is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  *  Lesser General Public License for more details.
14  *
15  *  You should have received a copy of the GNU Lesser General Public
16  *  License along with this library; if not, write to the Free Software
17  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
18  */
19
20 #pragma once
21
22
23 #include "FloatSize.h"
24 #include <gst/gst.h>
25 #include <gst/video/video-format.h>
26 #include <gst/video/video-info.h>
27 #include <wtf/MediaTime.h>
28
29 namespace WebCore {
30
31 class IntSize;
32
33 inline bool webkitGstCheckVersion(guint major, guint minor, guint micro)
34 {
35     guint currentMajor, currentMinor, currentMicro, currentNano;
36     gst_version(&currentMajor, &currentMinor, &currentMicro, &currentNano);
37
38     if (currentMajor < major)
39         return false;
40     if (currentMajor > major)
41         return true;
42
43     if (currentMinor < minor)
44         return false;
45     if (currentMinor > minor)
46         return true;
47
48     if (currentMicro < micro)
49         return false;
50
51     return true;
52 }
53
54 #define GST_VIDEO_CAPS_TYPE_PREFIX  "video/"
55 #define GST_AUDIO_CAPS_TYPE_PREFIX  "audio/"
56 #define GST_TEXT_CAPS_TYPE_PREFIX   "text/"
57
58 GstPad* webkitGstGhostPadFromStaticTemplate(GstStaticPadTemplate*, const gchar* name, GstPad* target);
59 #if ENABLE(VIDEO)
60 bool getVideoSizeAndFormatFromCaps(GstCaps*, WebCore::IntSize&, GstVideoFormat&, int& pixelAspectRatioNumerator, int& pixelAspectRatioDenominator, int& stride);
61 std::optional<FloatSize> getVideoResolutionFromCaps(const GstCaps*);
62 bool getSampleVideoInfo(GstSample*, GstVideoInfo&);
63 #endif
64 GstBuffer* createGstBuffer(GstBuffer*);
65 GstBuffer* createGstBufferForData(const char* data, int length);
66 char* getGstBufferDataPointer(GstBuffer*);
67 const char* capsMediaType(const GstCaps*);
68 bool doCapsHaveType(const GstCaps*, const char*);
69 bool areEncryptedCaps(const GstCaps*);
70 void mapGstBuffer(GstBuffer*, uint32_t);
71 void unmapGstBuffer(GstBuffer*);
72 bool initializeGStreamer();
73 unsigned getGstPlayFlag(const char* nick);
74 uint64_t toGstUnsigned64Time(const MediaTime&);
75
76 inline GstClockTime toGstClockTime(const MediaTime &mediaTime)
77 {
78     return static_cast<GstClockTime>(toGstUnsigned64Time(mediaTime));
79 }
80
81 bool gstRegistryHasElementForMediaType(GList* elementFactories, const char* capsString);
82 }
83
84 #ifndef GST_BUFFER_DTS_OR_PTS
85 #define GST_BUFFER_DTS_OR_PTS(buffer) (GST_BUFFER_DTS_IS_VALID(buffer) ? GST_BUFFER_DTS(buffer) : GST_BUFFER_PTS(buffer))
86 #endif