diff --git a/renderers/video_renderer.h b/renderers/video_renderer.h index 8f03e2a..23287ba 100644 --- a/renderers/video_renderer.h +++ b/renderers/video_renderer.h @@ -44,14 +44,15 @@ typedef enum videoflip_e { typedef struct video_renderer_s video_renderer_t; -video_renderer_t *video_renderer_init(logger_t *logger, const char *server_name, videoflip_t videoflip); -void video_renderer_start(video_renderer_t *renderer); -void video_renderer_render_buffer(video_renderer_t *renderer, raop_ntp_t *ntp, unsigned char* data, int data_len, uint64_t pts, int type); -void video_renderer_flush(video_renderer_t *renderer); -void video_renderer_destroy(video_renderer_t *renderer); +video_renderer_t *video_renderer_init (logger_t *logger, const char *server_name, videoflip_t videoflip); +void video_renderer_start (video_renderer_t *renderer); +void video_renderer_render_buffer (video_renderer_t *renderer, raop_ntp_t *ntp, unsigned char* data, int data_len, uint64_t pts, int type); +void video_renderer_flush (video_renderer_t *renderer); +bool video_renderer_listen (video_renderer_t *renderer); +void video_renderer_destroy (video_renderer_t *renderer); /* not implemented for gstreamer */ -void video_renderer_update_background(video_renderer_t *renderer, int type); +void video_renderer_update_background (video_renderer_t *renderer, int type); #ifdef __cplusplus } diff --git a/renderers/video_renderer_gstreamer.c b/renderers/video_renderer_gstreamer.c index 9ddb280..394f2f8 100644 --- a/renderers/video_renderer_gstreamer.c +++ b/renderers/video_renderer_gstreamer.c @@ -29,6 +29,7 @@ struct video_renderer_s { logger_t *logger; GstElement *appsrc, *pipeline, *sink; + GstBus *bus; }; static gboolean check_plugins (void) @@ -107,9 +108,13 @@ video_renderer_t *video_renderer_init(logger_t *logger, const char *server_name, return renderer; } + + + void video_renderer_start(video_renderer_t *renderer) { //g_signal_connect( renderer->pipeline, "deep-notify", G_CALLBACK(gst_object_default_deep_notify ), NULL ); gst_element_set_state (renderer->pipeline, GST_STATE_PLAYING); + renderer->bus = gst_element_get_bus(renderer->pipeline); } void video_renderer_render_buffer(video_renderer_t *renderer, raop_ntp_t *ntp, unsigned char* data, int data_len, uint64_t pts, int type) { @@ -132,8 +137,40 @@ void video_renderer_flush(video_renderer_t *renderer) { } +bool video_renderer_listen(video_renderer_t *renderer) { + GstMessage *msg = NULL; + + /* Wait until error or EOS */ + msg = gst_bus_timed_pop_filtered(renderer->bus, GST_CLOCK_TIME_NONE, + GST_MESSAGE_ERROR | GST_MESSAGE_EOS); + + /* parse message */ + if (msg != NULL) { + GError *err; + gchar *debug_info; + + switch (GST_MESSAGE_TYPE (msg)) { + case GST_MESSAGE_ERROR: + gst_message_parse_error (msg, &err, &debug_info); + g_printerr("GStreamer: %s\n", err->message); + g_clear_error (&err); + g_free (debug_info); + break; + case GST_MESSAGE_EOS: + g_print("End-Of-Stream reached.\n"); + break; + default: + g_printerr("unexpected message\n"); + break; + } + gst_message_unref(msg); + } + return false; +} + void video_renderer_destroy(video_renderer_t *renderer) { gst_app_src_end_of_stream (GST_APP_SRC(renderer->appsrc)); + gst_object_unref(renderer->bus); gst_element_set_state (renderer->pipeline, GST_STATE_NULL); gst_object_unref (renderer->pipeline); if (renderer) { diff --git a/uxplay.cpp b/uxplay.cpp index e824568..eae09e0 100755 --- a/uxplay.cpp +++ b/uxplay.cpp @@ -47,7 +47,7 @@ static int start_server (std::vector hw_addr, std::string name, unsigned s unsigned short tcp[2], unsigned short udp[3], videoflip_t videoflip, bool use_audio, bool debug_log); -int stop_server (); +static int stop_server (); static bool running = false; static dnssd_t *dnssd = NULL; @@ -271,7 +271,7 @@ int main (int argc, char *argv[]) { } running = true; while (running) { - sleep(1); + if (!(video_renderer_listen(video_renderer))) break; } LOGI("Stopping...");