Skip to content

Commit 98215b1

Browse files
committed
gstplayer, video player: add tracing
1 parent 4d29038 commit 98215b1

File tree

3 files changed

+63
-9
lines changed

3 files changed

+63
-9
lines changed

src/plugins/gstplayer.c

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,10 @@ static int apply_playback_state(struct gstplayer *player) {
447447

448448
TRACER_BEGIN(player->tracer, "apply_playback_state()");
449449

450+
TRACER_BEGIN(player->tracer, "gst_element_get_state()");
450451
ok = gst_element_get_state(player->pipeline, &current_state, &pending_state, 0);
452+
TRACER_END(player->tracer, "gst_element_get_state()");
453+
451454
if (ok == GST_STATE_CHANGE_FAILURE) {
452455
LOG_PLAYER_DEBUG(
453456
player,
@@ -478,7 +481,10 @@ static int apply_playback_state(struct gstplayer *player) {
478481
if (player->has_desired_position) {
479482
position = player->desired_position_ms * GST_MSECOND;
480483
} else {
484+
TRACER_BEGIN(player->tracer, "gst_element_query_position()");
481485
ok = gst_element_query_position(GST_ELEMENT(player->pipeline), GST_FORMAT_TIME, &position);
486+
TRACER_END(player->tracer, "gst_element_query_position()");
487+
482488
if (ok == FALSE) {
483489
LOG_PLAYER_ERROR(player, "Could not get the current playback position to apply the playback speed.\n");
484490
goto fail_stop_trace;
@@ -509,6 +515,7 @@ static int apply_playback_state(struct gstplayer *player) {
509515
GST_TIME_ARGS(GST_CLOCK_TIME_NONE)
510516
);
511517

518+
TRACER_BEGIN(player->tracer, "gst_element_seek()");
512519
ok = gst_element_seek(
513520
GST_ELEMENT(player->pipeline),
514521
desired_rate,
@@ -517,6 +524,8 @@ static int apply_playback_state(struct gstplayer *player) {
517524
GST_SEEK_TYPE_SET, position,
518525
GST_SEEK_TYPE_SET, GST_CLOCK_TIME_NONE
519526
);
527+
TRACER_END(player->tracer, "gst_element_seek()");
528+
520529
if (ok == FALSE) {
521530
LOG_PLAYER_ERROR(
522531
player,
@@ -534,6 +543,8 @@ static int apply_playback_state(struct gstplayer *player) {
534543
GST_TIME_ARGS(0),
535544
GST_TIME_ARGS(position)
536545
);
546+
547+
TRACER_BEGIN(player->tracer, "gst_element_seek()");
537548
ok = gst_element_seek(
538549
GST_ELEMENT(player->pipeline),
539550
desired_rate,
@@ -542,6 +553,7 @@ static int apply_playback_state(struct gstplayer *player) {
542553
GST_SEEK_TYPE_SET, 0,
543554
GST_SEEK_TYPE_SET, position
544555
);
556+
TRACER_END(player->tracer, "gst_element_seek()");
545557

546558
if (ok == FALSE) {
547559
LOG_PLAYER_ERROR(
@@ -580,7 +592,9 @@ static int apply_playback_state(struct gstplayer *player) {
580592
gst_element_state_get_name(desired_state)
581593
);
582594

595+
TRACER_BEGIN(player->tracer, "gst_element_set_state()");
583596
ok = gst_element_set_state(player->pipeline, desired_state);
597+
TRACER_END(player->tracer, "gst_element_set_state()");
584598

585599
if (ok == GST_STATE_CHANGE_FAILURE) {
586600
LOG_GST_SET_STATE_ERROR(player, player->pipeline);
@@ -597,7 +611,10 @@ static int apply_playback_state(struct gstplayer *player) {
597611
gst_element_state_get_name(desired_state)
598612
);
599613

614+
TRACER_BEGIN(player->tracer, "gst_element_set_state()");
600615
ok = gst_element_set_state(player->pipeline, desired_state);
616+
TRACER_END(player->tracer, "gst_element_set_state()");
617+
601618
if (ok == GST_STATE_CHANGE_FAILURE) {
602619
LOG_GST_SET_STATE_ERROR(player, player->pipeline);
603620
goto fail_stop_trace;
@@ -1022,7 +1039,10 @@ static int on_bus_fd_ready(sd_event_source *s, int fd, uint32_t revents, void *u
10221039

10231040
GstMessage *msg = gst_bus_pop(gst_element_get_bus(player->pipeline));
10241041
if (msg != NULL) {
1042+
TRACER_BEGIN(player->tracer, "on_bus_message()");
10251043
on_bus_message(player, msg);
1044+
TRACER_END(player->tracer, "on_bus_message()");
1045+
10261046
gst_message_unref(msg);
10271047
}
10281048

@@ -1237,7 +1257,7 @@ struct gstplayer *gstplayer_new(struct flutterpi *flutterpi, const char *uri, vo
12371257

12381258
struct gl_renderer *gl_renderer = flutterpi_get_gl_renderer(flutterpi);
12391259

1240-
GstElement *sink = flutter_gl_texture_sink_new(p->texture, gl_renderer);
1260+
GstElement *sink = flutter_gl_texture_sink_new(p->texture, gl_renderer, p->tracer);
12411261
if (sink == NULL) {
12421262
goto fail_destroy_texture;
12431263
}
@@ -1426,7 +1446,7 @@ struct gstplayer *gstplayer_new_from_pipeline(struct flutterpi *flutterpi, const
14261446

14271447
struct gl_renderer *gl_renderer = flutterpi_get_gl_renderer(flutterpi);
14281448

1429-
if (!flutter_gl_texture_sink_patch(sink, p->texture, gl_renderer)) {
1449+
if (!flutter_gl_texture_sink_patch(sink, p->texture, gl_renderer, p->tracer)) {
14301450
LOG_ERROR("Could not setup appsink.\n");
14311451
goto fail_unref_pipeline;
14321452
}

src/plugins/gstreamer_video_player.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,10 @@ const struct gl_texture_frame *frame_get_gl_frame(struct video_frame *frame);
6666
struct texture;
6767
struct gl_renderer;
6868
typedef struct _GstElement GstElement;
69+
struct tracer;
6970

70-
GstElement *flutter_gl_texture_sink_new(struct texture *texture, struct gl_renderer *renderer);
71+
bool flutter_gl_texture_sink_patch(GstElement *element, struct texture *texture, struct gl_renderer *renderer, struct tracer *tracer);
7172

72-
bool flutter_gl_texture_sink_patch(GstElement *element, struct texture *texture, struct gl_renderer *renderer);
73+
GstElement *flutter_gl_texture_sink_new(struct texture *texture, struct gl_renderer *renderer, struct tracer *tracer);
7374

7475
#endif

src/plugins/gstreamer_video_player/flutter_texture_sink.c

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
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."
@@ -19,6 +20,7 @@
1920
struct texture_sink {
2021
struct texture *fl_texture;
2122
struct frame_interface *interface;
23+
struct tracer *tracer;
2224
};
2325

2426
static 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

95111
static 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

130160
static 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

Comments
 (0)