rem: g_signal_emit (G_OBJECT (bvw), bvw_table_signals[SIGNAL_GOT_METADATA], 0, NULL);
context: bacon_video_widget_signal_idler (BaconVideoWidget *bvw){  BVWSignal *signal = NULL;  gint queue_length;    g_return_val_if_fail (bvw != NULL, FALSE);  g_return_val_if_fail (BACON_IS_VIDEO_WIDGET (bvw), FALSE);    signal = g_async_queue_try_pop (bvw->priv->queue);  if (!signal)    return FALSE;    switch (signal->signal_id)    {      case ASYNC_VIDEO_SIZE:        {          GList *streaminfo = NULL;          /* Note that we don't use the size provided by the xoverlay           * element - we also need framerate and it's all provided           * in the caps that we can get through playbin. */          g_object_get (G_OBJECT (bvw->priv->play), "stream-info",			&streaminfo, NULL);          for ( ; streaminfo != NULL; streaminfo = streaminfo->next) {            GstStreamInfo *info = streaminfo->data;            switch (info->type) {              case GST_STREAM_TYPE_VIDEO: {                GstStructure *s;                s = gst_caps_get_structure (GST_PAD_CAPS (info->pad), 0);                if (s) {                  gst_structure_get_int (s, "width", &bvw->priv->video_width);                  gst_structure_get_int (s, "height", &bvw->priv->video_height);                  gst_structure_get_double (s, "framerate", &bvw->priv->video_fps);                }                break;              }              default:                break;            }          }          if (bvw->priv->vw) {            gst_video_widget_set_logo_focus (bvw->priv->vw, FALSE);            gst_video_widget_set_source_size (bvw->priv->vw,					      bvw->priv->video_width,					      bvw->priv->video_height);          }          g_signal_emit (G_OBJECT (bvw), bvw_table_signals[SIGNAL_GOT_METADATA], 0, NULL);          break;        }      case ASYNC_ERROR:        {          char *error_message = NULL;          gboolean emit = TRUE;                    if (signal->signal_data.error.error)            error_message = signal->signal_data.error.error->message;          if (bvw->priv->last_error_message) {            /* Let's check the latest error message */            if (g_ascii_strcasecmp (error_message,                                    bvw->priv->last_error_message) == 0)              emit = FALSE;          }          if (emit) {            g_signal_emit (G_OBJECT (bvw),                           bvw_table_signals[SIGNAL_ERROR], 0,			   error_message, TRUE, FALSE);                        /* Keep a copy of the last emitted message */            if (bvw->priv->last_error_message)              g_free (bvw->priv->last_error_message);            bvw->priv->last_error_message = g_strdup (error_message);          }                    /* Cleaning the error infos */          if (signal->signal_data.error.error)            g_error_free (signal->signal_data.error.error);          if (signal->signal_data.error.debug_message)            g_free (signal->signal_data.error.debug_message);                    break;        }      case ASYNC_FOUND_TAG:        {          GstTagList *tag_list = signal->signal_data.found_tag.tag_list;          if (tag_list) {            if (bvw->priv->tagcache) {              GstTagList *taglist;              taglist = gst_tag_list_merge (bvw->priv->tagcache, tag_list,					    GST_TAG_MERGE_APPEND);              gst_tag_list_free (tag_list);              gst_tag_list_free (bvw->priv->tagcache);              bvw->priv->tagcache = taglist;            } else {              bvw->priv->tagcache = tag_list;            }            g_signal_emit (G_OBJECT (bvw), bvw_table_signals[SIGNAL_GOT_METADATA],                           0, NULL);          }          break;        }      case ASYNC_EOS:        {          gst_element_set_state (GST_ELEMENT (bvw->priv->play),                                 GST_STATE_READY);          g_signal_emit (G_OBJECT (bvw), bvw_table_signals[SIGNAL_EOS], 0, NULL);          break;        }      default:        break;    }      g_free (signal);  queue_length = g_async_queue_length (bvw->priv->queue);  return (queue_length > 0);}