GstPadProbeReturn eos_event_cb (GstPad *pad, GstPadProbeInfo *info, gpointer data) { if (GST_EVENT_TYPE (GST_PAD_PROBE_INFO_DATA (info)) == GST_EVENT_EOS) { GstElement *bin = NULL; GstMessage *message = NULL; GstStructure *msg_struct = NULL; MbMedia *media; gchar *uri = NULL; int pads = 0; media = (MbMedia *) data; bin = gst_bin_get_by_name (GST_BIN(_mb_global_data.pipeline), media->name); g_assert(bin); g_mutex_lock (&(media->mutex)); pads = --media->valid_pads; g_mutex_unlock (&(media->mutex)); g_object_get (media->decoder, "uri", &uri, NULL); g_debug ("EOS received (%s): %s.\n", media->name, uri); g_debug ("%s still has %d valid pad(s).\n", media->name, pads); if (pads == 0) { MbEvent *event = create_state_change_event (MB_END, media->name); notify_handler (event); free (event); g_hash_table_remove (_mb_global_data.media_table, media->name); msg_struct = gst_structure_new ("end-media", "event_type", G_TYPE_INT, APP_EVT_MEDIA_END, "data", G_TYPE_POINTER, media, /* FILL ME IF NECESSARY */ NULL); message = gst_message_new_application (GST_OBJECT(bin), msg_struct); g_debug ("Posting event\n"); gst_bus_post (_mb_global_data.bus, message); } g_free (uri); } return GST_PAD_PROBE_OK; }
static void nvtask_notify_lpop_proc(void* parent, nvcli_redis_t* ss, const navi_upreq_result_t* result) { navi_task_impl_t* impl = (navi_task_impl_t*)parent; impl->get_notify_session = NULL; if ( result->code == NVUP_RESULT_SESSION_OK ) { if (result->content_type == NVUP_RESULT_DATA_NULL) { impl->get_notify_retry = 0; return; } else if(result->content_type == NVUP_RESULT_DATA_STRING) { impl->get_notify_retry = 0; json_error_t js_err; json_t* notify_data = json_loads(result->s, &js_err); if ( notify_data ) { json_t* name_js = json_object_get(notify_data, "name"); if ( name_js && json_is_string(name_js)) { nvtask_notify_handler_fp notify_handler = (nvtask_notify_handler_fp) navi_hash_get_gr(impl->on_ctrl_handler,json_string_value(name_js)); if (notify_handler) { notify_handler(&impl->app_frame, notify_data); } } json_decref(notify_data); } nvtask_get_notify_redis(impl); //可能还有数据 } else { NAVI_FRAME_LOG(NAVI_LOG_INFO, "task [%s] nvtask_notify_lpop_proc get notify: content_type=%d", impl->full_name, result->content_type); impl->get_notify_retry++; nvtask_get_notify_redis(impl); } } else { NAVI_FRAME_LOG(NAVI_LOG_ERR, "task [%s] nvtask_notify_lpop_proc error:[%d]%s", impl->full_name, result->code,result->session_err_desc); impl->get_notify_retry++; nvtask_get_notify_redis(impl); } }
MbEvent * handle_navigation_message (GstMessage *message) { MbEvent *mb_event = NULL; GstNavigationMessageType nav_msg_type; nav_msg_type = gst_navigation_message_get_type (message); switch (nav_msg_type) { case GST_NAVIGATION_MESSAGE_EVENT: { GstEvent *event; GstNavigationEventType nav_evt_type; gst_navigation_message_parse_event (message, &event); nav_evt_type = gst_navigation_event_get_type (event); switch (nav_evt_type) { case GST_NAVIGATION_EVENT_MOUSE_BUTTON_PRESS: case GST_NAVIGATION_EVENT_MOUSE_BUTTON_RELEASE: { int button; double x, y; gst_navigation_event_parse_mouse_button_event (event, &button, &x, &y); mb_event = create_mouse_button_event ( nav_evt_type == GST_NAVIGATION_EVENT_MOUSE_BUTTON_PRESS ? MB_MOUSE_BUTTON_PRESS : MB_MOUSE_BUTTON_RELEASE, button, (int)x, (int) y); if (button == MB_MOUSE_LEFT_BUTTON && mb_event->type == MB_MOUSE_BUTTON_PRESS) { MbMedia *selected_media = compute_media_selection(x, y); if (selected_media != NULL) { MbEvent *selection_event = create_media_selection_event (MB_MEDIA_SELECTION, selected_media->name); notify_handler (selection_event); free (selection_event); } } break; } case GST_NAVIGATION_EVENT_MOUSE_MOVE: { double x, y; if (gst_navigation_event_parse_mouse_move_event (event, &x, &y)) mb_event = create_mouse_move_event (MB_MOUSE_MOVE, (int)x, (int) y); break; } case GST_NAVIGATION_EVENT_KEY_PRESS: case GST_NAVIGATION_EVENT_KEY_RELEASE: { const char *key; if (gst_navigation_event_parse_key_event (event, &key)) mb_event = create_keyboard_event ( nav_evt_type == GST_NAVIGATION_EVENT_KEY_PRESS ? MB_KEY_PRESS : MB_KEY_RELEASE, key); } default: break; } gst_event_unref (event); break; } default: break; } return mb_event; }
static gboolean bus_cb (GstBus *bus, GstMessage *message, gpointer data) { MbEvent *mb_event = NULL; GstElement *source = (GstElement *) message->src; const GstStructure *msg_struct; switch (GST_MESSAGE_TYPE (message)) { case GST_MESSAGE_STATE_CHANGED: { mb_event = handle_state_change_message(message); break; } case GST_MESSAGE_ELEMENT: { if (source == _mb_global_data.video_sink) { const char* struct_name; msg_struct = gst_message_get_structure(message); struct_name = gst_structure_get_name (msg_struct); if (strcmp (struct_name, "GstNavigationMessage") == 0) mb_event = handle_navigation_message(message); } break; } case GST_MESSAGE_APPLICATION: { mb_event = handle_application_message (message); break; } case GST_MESSAGE_ERROR: { GError *err; gchar *debug; gst_message_parse_error (message, &err, &debug); g_debug ("Error: %s\n", err->message); g_error_free (err); g_free (debug); break; } case GST_MESSAGE_EOS: { /* end-of-stream */ break; } default: /* unhandled message */ break; } if (mb_event != NULL) { notify_handler(mb_event); free (mb_event); mb_event = NULL; } return TRUE; }