88#include "plugins/gstplayer.h"
99#include "texture_registry.h"
1010#include "util/logging.h"
11+ #include "tracer.h"
1112
1213#if !defined(HAVE_EGL_GLES2 )
1314 #error "gstreamer video player requires EGL and OpenGL ES2 support."
1920struct texture_sink {
2021 struct texture * fl_texture ;
2122 struct frame_interface * interface ;
23+ struct tracer * tracer ;
2224};
2325
2426static void on_destroy_texture_frame (const struct texture_frame * texture_frame , void * userdata ) {
@@ -66,19 +68,27 @@ static GstFlowReturn on_appsink_new_preroll(GstAppSink *appsink, void *userdata)
6668
6769 struct texture_sink * meta = userdata ;
6870
71+ TRACER_BEGIN (meta -> tracer , "on_appsink_new_preroll()" );
72+
73+ TRACER_BEGIN (meta -> tracer , "gst_app_sink_try_pull_preroll()" );
6974 sample = gst_app_sink_try_pull_preroll (appsink , 0 );
75+ TRACER_END (meta -> tracer , "gst_app_sink_try_pull_preroll()" );
76+
7077 if (sample == NULL ) {
7178 LOG_ERROR ("gstreamer returned a NULL sample.\n" );
72- return GST_FLOW_ERROR ;
79+ goto fail_stop_tracing ;
7380 }
7481
82+ TRACER_BEGIN (meta -> tracer , "frame_new()" );
7583 // supply video info here
7684 frame = frame_new (meta -> interface , sample , NULL );
85+ TRACER_END (meta -> tracer , "frame_new()" );
7786
7887 // the frame has a reference on the sample internally.
7988 gst_sample_unref (sample );
8089
8190 if (frame != NULL ) {
91+ TRACER_BEGIN (meta -> tracer , "texture_push_frame()" );
8292 texture_push_frame (
8393 meta -> fl_texture ,
8494 & (struct texture_frame ){
@@ -87,9 +97,15 @@ static GstFlowReturn on_appsink_new_preroll(GstAppSink *appsink, void *userdata)
8797 .userdata = frame ,
8898 }
8999 );
100+ TRACER_END (meta -> tracer , "texture_push_frame()" );
90101 }
91102
103+ TRACER_END (meta -> tracer , "on_appsink_new_preroll()" );
92104 return GST_FLOW_OK ;
105+
106+ fail_stop_tracing :
107+ TRACER_END (meta -> tracer , "on_appsink_new_preroll()" );
108+ return GST_FLOW_ERROR ;
93109}
94110
95111static GstFlowReturn on_appsink_new_sample (GstAppSink * appsink , void * userdata ) {
@@ -101,19 +117,27 @@ static GstFlowReturn on_appsink_new_sample(GstAppSink *appsink, void *userdata)
101117
102118 struct texture_sink * meta = userdata ;
103119
120+ TRACER_BEGIN (meta -> tracer , "on_appsink_new_sample()" );
121+
122+ TRACER_BEGIN (meta -> tracer , "gst_app_sink_try_pull_sample()" );
104123 sample = gst_app_sink_try_pull_sample (appsink , 0 );
124+ TRACER_END (meta -> tracer , "gst_app_sink_try_pull_sample()" );
125+
105126 if (sample == NULL ) {
106127 LOG_ERROR ("gstreamer returned a NULL sample.\n" );
107- return GST_FLOW_ERROR ;
128+ goto fail_stop_tracing ;
108129 }
109130
131+ TRACER_BEGIN (meta -> tracer , "frame_new()" );
110132 // supply video info here
111133 frame = frame_new (meta -> interface , sample , NULL );
134+ TRACER_END (meta -> tracer , "frame_new()" );
112135
113136 // the frame has a reference on the sample internally.
114137 gst_sample_unref (sample );
115138
116139 if (frame != NULL ) {
140+ TRACER_BEGIN (meta -> tracer , "texture_push_frame()" );
117141 texture_push_frame (
118142 meta -> fl_texture ,
119143 & (struct texture_frame ){
@@ -122,9 +146,15 @@ static GstFlowReturn on_appsink_new_sample(GstAppSink *appsink, void *userdata)
122146 .userdata = frame ,
123147 }
124148 );
149+ TRACER_END (meta -> tracer , "texture_push_frame()" );
125150 }
126151
152+ TRACER_END (meta -> tracer , "on_appsink_new_preroll()" );
127153 return GST_FLOW_OK ;
154+
155+ fail_stop_tracing :
156+ TRACER_END (meta -> tracer , "on_appsink_new_preroll()" );
157+ return GST_FLOW_ERROR ;
128158}
129159
130160static void on_appsink_cbs_destroy (void * userdata ) {
@@ -136,6 +166,7 @@ static void on_appsink_cbs_destroy(void *userdata) {
136166 meta = userdata ;
137167
138168 // meta->texture is not owned by us. freed by the player
169+ tracer_unref (meta -> tracer );
139170 frame_interface_unref (meta -> interface );
140171 free (meta );
141172}
@@ -218,7 +249,7 @@ UNUSED static GstPadProbeReturn on_query_appsink_pad(GstPad *pad, GstPadProbeInf
218249 return GST_PAD_PROBE_HANDLED ;
219250}
220251
221- bool flutter_gl_texture_sink_patch (GstElement * element , struct texture * texture , struct gl_renderer * renderer ) {
252+ bool flutter_gl_texture_sink_patch (GstElement * element , struct texture * texture , struct gl_renderer * renderer , struct tracer * tracer ) {
222253 ASSERT_NOT_NULL (element );
223254 ASSERT_NOT_NULL (texture );
224255 ASSERT_NOT_NULL (renderer );
@@ -283,6 +314,8 @@ bool flutter_gl_texture_sink_patch(GstElement *element, struct texture *texture,
283314 gst_pad_add_probe (pad , GST_PAD_PROBE_TYPE_QUERY_DOWNSTREAM , on_query_appsink_pad , NULL , NULL );
284315 }
285316
317+ meta -> tracer = tracer_ref (tracer );
318+
286319 gst_app_sink_set_callbacks (
287320 GST_APP_SINK (appsink ),
288321 & cbs ,
@@ -293,7 +326,7 @@ bool flutter_gl_texture_sink_patch(GstElement *element, struct texture *texture,
293326 return element ;
294327}
295328
296- GstElement * flutter_gl_texture_sink_new (struct texture * texture , struct gl_renderer * renderer ) {
329+ GstElement * flutter_gl_texture_sink_new (struct texture * texture , struct gl_renderer * renderer , struct tracer * tracer ) {
297330 ASSERT_NOT_NULL (texture );
298331 ASSERT_NOT_NULL (renderer );
299332
@@ -302,7 +335,7 @@ GstElement *flutter_gl_texture_sink_new(struct texture *texture, struct gl_rende
302335 return NULL ;
303336 }
304337
305- if (!flutter_gl_texture_sink_patch (element , texture , renderer )) {
338+ if (!flutter_gl_texture_sink_patch (element , texture , renderer , tracer )) {
306339 gst_object_unref (element );
307340 return NULL ;
308341 }
0 commit comments