[WPE][GTK] Bump minimum versions of GLib, GTK, libsoup, ATK, GStreamer, and Cairo
[WebKit-https.git] / Source / WebCore / platform / graphics / gstreamer / InbandTextTrackPrivateGStreamer.cpp
1 /*
2  * Copyright (C) 2013 Cable Television Laboratories, Inc.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17  * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
18  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
21  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
23  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27
28 #if ENABLE(VIDEO) && USE(GSTREAMER) && ENABLE(VIDEO_TRACK)
29
30 #include "InbandTextTrackPrivateGStreamer.h"
31
32 #include "GStreamerCommon.h"
33 #include "Logging.h"
34 #include <glib-object.h>
35 #include <gst/gst.h>
36
37 GST_DEBUG_CATEGORY_EXTERN(webkit_media_player_debug);
38 #define GST_CAT_DEFAULT webkit_media_player_debug
39
40 namespace WebCore {
41
42 InbandTextTrackPrivateGStreamer::InbandTextTrackPrivateGStreamer(gint index, GRefPtr<GstPad> pad)
43     : InbandTextTrackPrivate(WebVTT)
44     , TrackPrivateBaseGStreamer(this, index, pad)
45 {
46     m_eventProbe = gst_pad_add_probe(m_pad.get(), GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, [] (GstPad*, GstPadProbeInfo* info, gpointer userData) -> GstPadProbeReturn {
47         auto* track = static_cast<InbandTextTrackPrivateGStreamer*>(userData);
48         switch (GST_EVENT_TYPE(gst_pad_probe_info_get_event(info))) {
49         case GST_EVENT_STREAM_START:
50             track->streamChanged();
51             break;
52         default:
53             break;
54         }
55         return GST_PAD_PROBE_OK;
56     }, this, nullptr);
57
58     notifyTrackOfStreamChanged();
59 }
60
61 InbandTextTrackPrivateGStreamer::InbandTextTrackPrivateGStreamer(gint index, GRefPtr<GstStream> stream)
62     : InbandTextTrackPrivate(WebVTT)
63     , TrackPrivateBaseGStreamer(this, index, stream)
64 {
65     m_streamId = gst_stream_get_stream_id(stream.get());
66     GST_INFO("Track %d got stream start for stream %s.", m_index, m_streamId.utf8().data());
67 }
68
69 void InbandTextTrackPrivateGStreamer::disconnect()
70 {
71     if (m_pad)
72         gst_pad_remove_probe(m_pad.get(), m_eventProbe);
73
74     TrackPrivateBaseGStreamer::disconnect();
75 }
76
77 void InbandTextTrackPrivateGStreamer::handleSample(GRefPtr<GstSample> sample)
78 {
79     {
80         LockHolder lock(m_sampleMutex);
81         m_pendingSamples.append(sample);
82     }
83
84     RefPtr<InbandTextTrackPrivateGStreamer> protectedThis(this);
85     m_notifier->notify(MainThreadNotification::NewSample, [protectedThis] {
86         protectedThis->notifyTrackOfSample();
87     });
88 }
89
90 void InbandTextTrackPrivateGStreamer::streamChanged()
91 {
92     RefPtr<InbandTextTrackPrivateGStreamer> protectedThis(this);
93     m_notifier->notify(MainThreadNotification::StreamChanged, [protectedThis] {
94         protectedThis->notifyTrackOfStreamChanged();
95     });
96 }
97
98 void InbandTextTrackPrivateGStreamer::notifyTrackOfSample()
99 {
100     Vector<GRefPtr<GstSample> > samples;
101     {
102         LockHolder lock(m_sampleMutex);
103         m_pendingSamples.swap(samples);
104     }
105
106     for (size_t i = 0; i < samples.size(); ++i) {
107         GRefPtr<GstSample> sample = samples[i];
108         GstBuffer* buffer = gst_sample_get_buffer(sample.get());
109         if (!buffer) {
110             GST_WARNING("Track %d got sample with no buffer.", m_index);
111             continue;
112         }
113         auto mappedBuffer = GstMappedBuffer::create(buffer, GST_MAP_READ);
114         ASSERT(mappedBuffer);
115         if (!mappedBuffer) {
116             GST_WARNING("Track %d unable to map buffer.", m_index);
117             continue;
118         }
119
120         GST_INFO("Track %d parsing sample: %.*s", m_index, static_cast<int>(mappedBuffer->size()),
121             reinterpret_cast<char*>(mappedBuffer->data()));
122         client()->parseWebVTTCueData(reinterpret_cast<char*>(mappedBuffer->data()), mappedBuffer->size());
123     }
124 }
125
126 void InbandTextTrackPrivateGStreamer::notifyTrackOfStreamChanged()
127 {
128     GRefPtr<GstEvent> event = adoptGRef(gst_pad_get_sticky_event(m_pad.get(),
129         GST_EVENT_STREAM_START, 0));
130     if (!event)
131         return;
132
133     const gchar* streamId;
134     gst_event_parse_stream_start(event.get(), &streamId);
135     GST_INFO("Track %d got stream start for stream %s.", m_index, streamId);
136     m_streamId = streamId;
137 }
138
139 } // namespace WebCore
140
141 #endif // ENABLE(VIDEO) && USE(GSTREAMER) && ENABLE(VIDEO_TRACK)