P_INVOKE gchar *
bp_get_subtitle_description (BansheePlayer *player, int i)
{
    gchar *code = NULL;
    gchar *desc = NULL;
    GstTagList *tags = NULL;

    g_return_val_if_fail (IS_BANSHEE_PLAYER (player), NULL);

    g_signal_emit_by_name (G_OBJECT (player->playbin), "get-text-tags", i, &tags);
    if (G_LIKELY(tags)) {
        gst_tag_list_get_string (tags, GST_TAG_LANGUAGE_CODE, &code);
        gst_tag_list_free (tags);

        g_return_val_if_fail (code != NULL, NULL);

        // ISO 639-2 undetermined language
        if (strcmp ((const gchar *)code, "und") == 0) {
            g_free (code);
            return NULL;
        }
        bp_debug ("[subtitle]: iso 639-2 subtitle code %s", code);
        desc = (gchar *) gst_tag_get_language_name ((const gchar *)&code);
        bp_debug ("[subtitle]: subtitle language: %s", desc);

        g_free (code);
    }
    return desc;
}
示例#2
0
static void
play_cycle_track_selection (GstPlay * play, GstPlayTrackType track_type)
{
  const gchar *prop_cur, *prop_n, *prop_get, *name;
  gint cur = -1, n = -1;

  switch (track_type) {
    case GST_PLAY_TRACK_TYPE_AUDIO:
      prop_get = "get-audio-tags";
      prop_cur = "current-audio";
      prop_n = "n-audio";
      name = "audio";
      break;
    case GST_PLAY_TRACK_TYPE_VIDEO:
      prop_get = "get-video-tags";
      prop_cur = "current-video";
      prop_n = "n-video";
      name = "video";
      break;
    case GST_PLAY_TRACK_TYPE_SUBTITLE:
      prop_get = "get-text-tags";
      prop_cur = "current-text";
      prop_n = "n-text";
      name = "subtitle";
      break;
    default:
      return;
  }

  g_object_get (play->playbin, prop_cur, &cur, prop_n, &n, NULL);

  if (n < 1) {
    g_print ("No %s tracks.\n", name);
  } else if (n == 1) {
    g_print ("No other %s tracks to switch to.\n", name);
  } else {
    gchar *lcode = NULL, *lname = NULL;
    const gchar *lang = NULL;
    GstTagList *tags = NULL;

    cur = (cur + 1) % n;
    g_signal_emit_by_name (play->playbin, prop_get, cur, &tags);
    if (tags != NULL) {
      if (gst_tag_list_get_string (tags, GST_TAG_LANGUAGE_CODE, &lcode))
        lang = gst_tag_get_language_name (lcode);
      else if (gst_tag_list_get_string (tags, GST_TAG_LANGUAGE_NAME, &lname))
        lang = lname;
      gst_tag_list_unref (tags);
    }
    if (lang != NULL)
      g_print ("Switching to %s track %d of %d (%s).\n", name, cur + 1, n,
          lang);
    else
      g_print ("Switching to %s track %d of %d.\n", name, cur + 1, n);
    g_object_set (play->playbin, prop_cur, cur, NULL);
    g_free (lcode);
    g_free (lname);
  }
}
示例#3
0
static PyObject *
_wrap_gst_tag_get_language_name(PyObject *self, PyObject *args, PyObject *kwargs)
{
    static char *kwlist[] = { "language_code", NULL };
    char *language_code;
    const gchar *ret;

    if (!PyArg_ParseTupleAndKeywords(args, kwargs,"s:get_language_name", kwlist, &language_code))
        return NULL;
    pyg_begin_allow_threads;
    ret = gst_tag_get_language_name(language_code);
    pyg_end_allow_threads;
    if (ret)
        return PyString_FromString(ret);
    Py_INCREF(Py_None);
    return Py_None;
}
static void
play_cycle_track_selection (GstPlay * play, GstPlayTrackType track_type)
{
  const gchar *prop_cur, *prop_n, *prop_get, *name;
  gint cur = -1, n = -1;
  guint flag, cur_flags;

  switch (track_type) {
    case GST_PLAY_TRACK_TYPE_AUDIO:
      prop_get = "get-audio-tags";
      prop_cur = "current-audio";
      prop_n = "n-audio";
      name = "audio";
      flag = 0x2;
      break;
    case GST_PLAY_TRACK_TYPE_VIDEO:
      prop_get = "get-video-tags";
      prop_cur = "current-video";
      prop_n = "n-video";
      name = "video";
      flag = 0x1;
      break;
    case GST_PLAY_TRACK_TYPE_SUBTITLE:
      prop_get = "get-text-tags";
      prop_cur = "current-text";
      prop_n = "n-text";
      name = "subtitle";
      flag = 0x4;
      break;
    default:
      return;
  }

  g_object_get (play->playbin, prop_cur, &cur, prop_n, &n, "flags", &cur_flags,
      NULL);

  if (n < 1) {
    g_print ("No %s tracks.\n", name);
  } else {
    gchar *lcode = NULL, *lname = NULL;
    const gchar *lang = NULL;
    GstTagList *tags = NULL;

    if (!(cur_flags & flag))
      cur = 0;
    else
      cur = (cur + 1) % (n + 1);

    if (cur >= n && track_type != GST_PLAY_TRACK_TYPE_VIDEO) {
      cur = -1;
      g_print ("Disabling %s.           \n", name);
      if (cur_flags & flag) {
        cur_flags &= ~flag;
        g_object_set (play->playbin, "flags", cur_flags, NULL);
      }
    } else {
      /* For video we only want to switch between streams, not disable it altogether */
      if (cur >= n)
        cur = 0;
      if (!(cur_flags & flag) && track_type != GST_PLAY_TRACK_TYPE_VIDEO) {
        cur_flags |= flag;
        g_object_set (play->playbin, "flags", cur_flags, NULL);
      }
      g_signal_emit_by_name (play->playbin, prop_get, cur, &tags);
      if (tags != NULL) {
        if (gst_tag_list_get_string (tags, GST_TAG_LANGUAGE_CODE, &lcode))
          lang = gst_tag_get_language_name (lcode);
        else if (gst_tag_list_get_string (tags, GST_TAG_LANGUAGE_NAME, &lname))
          lang = lname;
        gst_tag_list_unref (tags);
      }
      if (lang != NULL)
        g_print ("Switching to %s track %d of %d (%s).\n", name, cur + 1, n,
            lang);
      else
        g_print ("Switching to %s track %d of %d.\n", name, cur + 1, n);
    }
    g_object_set (play->playbin, prop_cur, cur, NULL);
    g_free (lcode);
    g_free (lname);
  }
}