7
7
class GstAppSink
8
8
{
9
9
private:
10
- std::mutex buffer_queue_mutex;
11
- std::condition_variable buffer_queue_cv;
12
- GQueue* buffer_queue;
13
10
GstElement* appsink;
14
11
15
- protected:
16
- static GstFlowReturn NewSample (GstElement* sink, GstAppSink* self)
17
- {
18
- GstSample* sample;
19
- g_signal_emit_by_name (sink, " pull-sample" , &sample);
20
- if (sample == NULL )
21
- return GST_FLOW_ERROR;
22
-
23
- // Push the sample into the buffer queue
24
- GstBufferList* buffer = gst_sample_get_buffer_list (sample);
25
- gst_buffer_list_ref (buffer);
26
- g_queue_push_tail (self->buffer_queue , buffer);
27
- gst_sample_unref (sample);
28
- self->buffer_queue_cv .notify_one ();
29
- return GST_FLOW_OK;
30
- }
31
-
32
12
public:
33
13
GstAppSink (GstElement* test_element, GstElement* tee, GstElement* pipeline)
34
14
{
@@ -43,8 +23,6 @@ class GstAppSink
43
23
// Set the appsink properties
44
24
g_object_set (
45
25
appsink, " emit-signals" , TRUE , " sync" , FALSE , " buffer-list" , TRUE , NULL );
46
- g_signal_connect (appsink, " new-sample" , G_CALLBACK (NewSample), this );
47
- buffer_queue = g_queue_new ();
48
26
49
27
// Add the appsink to the test element
50
28
gst_bin_add_many (GST_BIN (pipeline), queue, test_element, appsink, NULL );
@@ -60,33 +38,19 @@ class GstAppSink
60
38
61
39
GstBufferList* PopBuffer ()
62
40
{
63
- // Wait until we have at least one buffer in the queue
64
- std::unique_lock<std::mutex> lock (buffer_queue_mutex);
65
- buffer_queue_cv.wait (lock, [&]() {
66
- gboolean eos = false ;
67
- g_object_get (G_OBJECT (this ->appsink ), " eos" , &eos, NULL );
68
- if (eos)
69
- return true ;
70
- return !g_queue_is_empty (this ->buffer_queue );
71
- });
72
-
73
- return (GstBufferList*)g_queue_pop_head (buffer_queue);
74
- }
41
+ GstSample* sample;
42
+ g_signal_emit_by_name (appsink, " pull-sample" , &sample);
43
+ if (sample == NULL )
44
+ return NULL ;
75
45
76
- ~GstAppSink ()
77
- {
78
- // Flush the buffer queue
79
- while (!g_queue_is_empty (buffer_queue)) {
80
- GstBufferList* buffer = (GstBufferList*)g_queue_pop_head (buffer_queue);
81
- gst_buffer_list_unref (buffer);
82
- }
46
+ GstBufferList* buffer = gst_sample_get_buffer_list (sample);
47
+ gst_buffer_list_ref (buffer);
48
+ gst_sample_unref (sample);
83
49
84
- // Free resources
85
- gst_object_unref (appsink);
86
- g_queue_free (buffer_queue);
50
+ return buffer;
87
51
}
88
52
89
- int GetBufferCount () { return g_queue_get_length (buffer_queue ); }
53
+ ~GstAppSink () { gst_object_unref (appsink ); }
90
54
};
91
55
92
56
class GstTestFixture : public ::testing::Test
0 commit comments