summaryrefslogtreecommitdiff
path: root/validate/gst/validate/gst-validate-pad-monitor.h
blob: 73879e04e1d4c7695645d2426c590cf0cf3f59a3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
/* GStreamer
 * Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
 *
 * gst-validate-pad-monitor.h - Validate PadMonitor class
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 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
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 */

#ifndef __GST_VALIDATE_PAD_MONITOR_H__
#define __GST_VALIDATE_PAD_MONITOR_H__

#include <glib-object.h>
#include <gst/gst.h>

typedef struct _GstValidatePadMonitor GstValidatePadMonitor;
typedef struct _GstValidatePadMonitorClass GstValidatePadMonitorClass;

#include <gst/validate/gst-validate-monitor.h>
#include <gst/validate/media-descriptor-parser.h>
#include <gst/validate/gst-validate-element-monitor.h>

G_BEGIN_DECLS

#define GST_TYPE_VALIDATE_PAD_MONITOR			(gst_validate_pad_monitor_get_type ())
#define GST_IS_VALIDATE_PAD_MONITOR(obj)		(G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_VALIDATE_PAD_MONITOR))
#define GST_IS_VALIDATE_PAD_MONITOR_CLASS(klass)	(G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_VALIDATE_PAD_MONITOR))
#define GST_VALIDATE_PAD_MONITOR_GET_CLASS(obj)	(G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_VALIDATE_PAD_MONITOR, GstValidatePadMonitorClass))
#define GST_VALIDATE_PAD_MONITOR(obj)			(G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_VALIDATE_PAD_MONITOR, GstValidatePadMonitor))
#define GST_VALIDATE_PAD_MONITOR_CLASS(klass)		(G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_VALIDATE_PAD_MONITOR, GstValidatePadMonitorClass))
#define GST_VALIDATE_PAD_MONITOR_CAST(obj)            ((GstValidatePadMonitor*)(obj))
#define GST_VALIDATE_PAD_MONITOR_CLASS_CAST(klass)    ((GstValidatePadMonitorClass*)(klass))


/**
 * GstValidatePadMonitor:
 *
 * GStreamer Validate PadMonitor class.
 *
 * Class that wraps a #GstPad for Validate checks
 */
struct _GstValidatePadMonitor {
  GstValidateMonitor 	 parent;

  GstValidateElementMonitor *element_monitor;

  gboolean       setup;

  GstPadChainFunction chain_func;
  GstPadEventFunction event_func;
  GstPadEventFullFunction event_full_func;
  GstPadGetRangeFunction getrange_func;
  GstPadQueryFunction query_func;
  GstPadActivateModeFunction activatemode_func;

  gulong pad_probe_id;

  /*< private >*/
  /* Last caps pushed/received */
  GstCaps *last_caps;
  gboolean caps_is_audio;
  gboolean caps_is_video;
  gboolean caps_is_raw;

  /* FIXME : Let's migrate all those booleans into a 32 (or 64) bit flag */
  gboolean first_buffer;

  gboolean has_segment;
  gboolean is_eos;

  gboolean pending_flush_stop;
  guint32 pending_flush_stop_seqnum;
  guint32 pending_flush_start_seqnum;
  guint32 pending_newsegment_seqnum;
  guint32 pending_eos_seqnum;

  /* Whether the next buffer should have a DISCONT flag on it, because
   * it's the first one, or follows a SEGMENT and/or a FLUSH */
  gboolean pending_buffer_discont;

  GstClockTime pending_seek_accurate_time;

  GstEvent *expected_segment;
  GPtrArray *serialized_events;
  GList *expired_events;

  GstStructure *pending_setcaps_fields;

  GstCaps * last_refused_caps;
  GstCaps * last_query_filter;
  GstCaps * last_query_res;

  /* tracked data */
  GstSegment segment;
  GstClockTime current_timestamp;
  GstClockTime current_duration;

  GstFlowReturn last_flow_return;

  /* Stores the timestamp range of data that has flown through
   * this pad by using TIMESTAMP and TIMESTAMP+DURATION from
   * incomming buffers. Every time a buffer is pushed, this range
   * is extended.
   *
   * When a buffer is pushed, the timestamp range is checked against
   * the outgoing timestamp to check it is in the received boundaries.
   */
  GstClockTime timestamp_range_start;
  GstClockTime timestamp_range_end;

  /* GstValidateMediaCheck related fields */
  GList *all_bufs;
  /* The GstBuffer that should arrive next in a GList */
  GList *current_buf;
  gboolean check_buffers;
};

/**
 * GstValidatePadMonitorClass:
 * @parent_class: parent
 *
 * GStreamer Validate PadMonitor object class.
 */
struct _GstValidatePadMonitorClass {
  GstValidateMonitorClass	parent_class;
};

/* normal GObject stuff */
GST_VALIDATE_API
GType		gst_validate_pad_monitor_get_type		(void);

GST_VALIDATE_API
GstValidatePadMonitor *   gst_validate_pad_monitor_new      (GstPad * pad, GstValidateRunner * runner, GstValidateElementMonitor *element_monitor);

G_END_DECLS

#endif /* __GST_VALIDATE_PAD_MONITOR_H__ */