Beispiel #1
0
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;
}
Beispiel #2
0
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);
	}
}
Beispiel #3
0
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;
}
Beispiel #4
0
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;
}