1 | // Copyright (C) 2016 Jolla Ltd. |
2 | // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only |
3 | |
4 | #include <common/qgstreamerbufferprobe_p.h> |
5 | |
6 | #include <common/qgst_p.h> |
7 | |
8 | QT_BEGIN_NAMESPACE |
9 | |
10 | QGstreamerBufferProbe::QGstreamerBufferProbe(Flags flags) |
11 | : m_flags(flags) |
12 | { |
13 | } |
14 | |
15 | QGstreamerBufferProbe::~QGstreamerBufferProbe() = default; |
16 | |
17 | void QGstreamerBufferProbe::addProbeToPad(GstPad *pad, bool downstream) |
18 | { |
19 | QGstCaps caps{ |
20 | gst_pad_get_current_caps(pad), |
21 | QGstCaps::HasRef, |
22 | }; |
23 | |
24 | if (caps) |
25 | probeCaps(caps: caps.caps()); |
26 | |
27 | if (m_flags & ProbeCaps) { |
28 | m_capsProbeId = gst_pad_add_probe( |
29 | pad, |
30 | mask: downstream |
31 | ? GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM |
32 | : GST_PAD_PROBE_TYPE_EVENT_UPSTREAM, |
33 | callback: capsProbe, |
34 | user_data: this, |
35 | destroy_data: nullptr); |
36 | } |
37 | if (m_flags & ProbeBuffers) { |
38 | m_bufferProbeId = gst_pad_add_probe( |
39 | pad, mask: GST_PAD_PROBE_TYPE_BUFFER, callback: bufferProbe, user_data: this, destroy_data: nullptr); |
40 | } |
41 | } |
42 | |
43 | void QGstreamerBufferProbe::removeProbeFromPad(GstPad *pad) |
44 | { |
45 | if (m_capsProbeId != -1) { |
46 | gst_pad_remove_probe(pad, id: m_capsProbeId); |
47 | m_capsProbeId = -1; |
48 | } |
49 | if (m_bufferProbeId != -1) { |
50 | gst_pad_remove_probe(pad, id: m_bufferProbeId); |
51 | m_bufferProbeId = -1; |
52 | } |
53 | } |
54 | |
55 | void QGstreamerBufferProbe::probeCaps(GstCaps *) |
56 | { |
57 | } |
58 | |
59 | bool QGstreamerBufferProbe::probeBuffer(GstBuffer *) |
60 | { |
61 | return true; |
62 | } |
63 | |
64 | GstPadProbeReturn QGstreamerBufferProbe::capsProbe(GstPad *, GstPadProbeInfo *info, gpointer user_data) |
65 | { |
66 | QGstreamerBufferProbe * const control = static_cast<QGstreamerBufferProbe *>(user_data); |
67 | |
68 | if (GstEvent * const event = gst_pad_probe_info_get_event(info)) { |
69 | if (GST_EVENT_TYPE(event) == GST_EVENT_CAPS) { |
70 | GstCaps *caps; |
71 | gst_event_parse_caps(event, caps: &caps); |
72 | |
73 | control->probeCaps(caps); |
74 | } |
75 | } |
76 | return GST_PAD_PROBE_OK; |
77 | } |
78 | |
79 | GstPadProbeReturn QGstreamerBufferProbe::bufferProbe( |
80 | GstPad *, GstPadProbeInfo *info, gpointer user_data) |
81 | { |
82 | QGstreamerBufferProbe * const control = static_cast<QGstreamerBufferProbe *>(user_data); |
83 | if (GstBuffer * const buffer = gst_pad_probe_info_get_buffer(info)) |
84 | return control->probeBuffer(buffer) ? GST_PAD_PROBE_OK : GST_PAD_PROBE_DROP; |
85 | return GST_PAD_PROBE_OK; |
86 | } |
87 | |
88 | QT_END_NAMESPACE |
89 | |