static void addTagToMap(const GstTagList *list,
                        const gchar *tag,
                        gpointer user_data)
{
    QMap<QByteArray, QVariant> *map = reinterpret_cast<QMap<QByteArray, QVariant>* >(user_data);

    GValue val;
    val.g_type = 0;
    gst_tag_list_copy_value(&val,list,tag);

    switch( G_VALUE_TYPE(&val) ) {
        case G_TYPE_STRING:
        {
            const gchar *str_value = g_value_get_string(&val);
            map->insert(QByteArray(tag), QString::fromUtf8(str_value));
            break;
        }
        case G_TYPE_INT:
            map->insert(QByteArray(tag), g_value_get_int(&val));
            break;
        case G_TYPE_UINT:
            map->insert(QByteArray(tag), g_value_get_uint(&val));
            break;
        case G_TYPE_LONG:
            map->insert(QByteArray(tag), qint64(g_value_get_long(&val)));
            break;
        case G_TYPE_BOOLEAN:
            map->insert(QByteArray(tag), g_value_get_boolean(&val));
            break;
        case G_TYPE_CHAR:
            map->insert(QByteArray(tag), g_value_get_char(&val));
            break;
        case G_TYPE_DOUBLE:
            map->insert(QByteArray(tag), g_value_get_double(&val));
            break;
        default:
            // GST_TYPE_DATE is a function, not a constant, so pull it out of the switch
            if (G_VALUE_TYPE(&val) == GST_TYPE_DATE) {
                const GDate *date = gst_value_get_date(&val);
                if (g_date_valid(date)) {
                    int year = g_date_get_year(date);
                    int month = g_date_get_month(date);
                    int day = g_date_get_day(date);
                    map->insert(QByteArray(tag), QDate(year,month,day));
                    if (!map->contains("year"))
                        map->insert("year", year);
                }
            } else if (G_VALUE_TYPE(&val) == GST_TYPE_FRACTION) {
                int nom = gst_value_get_fraction_numerator(&val);
                int denom = gst_value_get_fraction_denominator(&val);

                if (denom > 0) {
                    map->insert(QByteArray(tag), double(nom)/denom);
                }
            }
            break;
    }

    g_value_unset(&val);
}
Beispiel #2
0
void Discoverer::fillTags(const GstTagList *tags, const gchar *tag, gpointer args)
{
    GValue val = { 0, };
    Metadata *meta = (Metadata *)args;

    gst_tag_list_copy_value(&val, tags, tag);
    meta->addTag(tag, convert(val));
    g_value_unset(&val);
}
static gboolean
bus_callback (GstBus * bus, GstMessage * message, gpointer data)
{
  switch (GST_MESSAGE_TYPE (message)) {
    case GST_MESSAGE_WARNING:{
      GError *err;
      gchar *debug;

      gst_message_parse_warning (message, &err, &debug);
      g_print ("Warning: %s\n", err->message);
      g_error_free (err);
      g_free (debug);
      break;
    }
    case GST_MESSAGE_ERROR:{
      GError *err;
      gchar *debug = NULL;

      gst_message_parse_error (message, &err, &debug);
      g_print ("Error: %s : %s\n", err->message, debug);
      g_error_free (err);
      g_free (debug);

      gtk_main_quit ();
      break;
    }
    case GST_MESSAGE_TAG:{
      GstTagList *tags;
      GValue v = { 0, };

      g_print ("Got tags\n");
      gst_message_parse_tag (message, &tags);

      if (gst_tag_list_copy_value (&v, tags, "mxf-structure")) {
        const GstStructure *s;
        GtkTreeIter iter;

        s = gst_value_get_structure (&v);

        gtk_tree_store_append (treestore, &iter, NULL);
        insert_structure (s, &iter);

        gtk_widget_show_all (window);

        g_value_unset (&v);
      }

      gst_tag_list_unref (tags);
      break;
    }
    default:
      break;
  }
  return TRUE;
}
Beispiel #4
0
/* Print a tag in a human-readable format (name: value) */
void print_tag_foreach (const GstTagList *tags, const gchar *tag, gpointer user_data) {
  GValue val = { 0 };
  gchar *str;
  gint depth = GPOINTER_TO_INT (user_data);
   
  gst_tag_list_copy_value (&val, tags, tag);
   
  if (G_VALUE_HOLDS_STRING (&val))
    str = g_value_dup_string (&val);
  else
    str = gst_value_serialize (&val);
   
  g_print ("%*s%s: %s\n", 2 * depth, " ", gst_tag_get_nick (tag), str);
  g_free (str);
   
  g_value_unset (&val);
}
Beispiel #5
0
EXPORT_C
#endif

gboolean
gst_tag_list_get_date (const GstTagList * list, const gchar * tag,
    GDate ** value)
{
  GValue v = { 0, };

  g_return_val_if_fail (GST_IS_TAG_LIST (list), FALSE);
  g_return_val_if_fail (tag != NULL, FALSE);
  g_return_val_if_fail (value != NULL, FALSE);

  if (!gst_tag_list_copy_value (&v, list, tag))
    return FALSE;
  *value = (GDate *) g_value_dup_boxed (&v);
  g_value_unset (&v);
  return (*value != NULL);
}
static void
print_tag_foreach (const GstTagList * tags, const gchar * tag,
    gpointer user_data)
{
  GValue val = { 0, };
  gchar *str;
  guint depth = GPOINTER_TO_UINT (user_data);

  if (!gst_tag_list_copy_value (&val, tags, tag))
    return;

  if (G_VALUE_HOLDS_STRING (&val)) {
    str = g_value_dup_string (&val);
  } else if (G_VALUE_TYPE (&val) == GST_TYPE_SAMPLE) {
    GstSample *sample = gst_value_get_sample (&val);
    GstBuffer *img = gst_sample_get_buffer (sample);
    GstCaps *caps = gst_sample_get_caps (sample);

    if (img) {
      if (caps) {
        gchar *caps_str;

        caps_str = gst_caps_to_string (caps);
        str = g_strdup_printf ("buffer of %" G_GSIZE_FORMAT " bytes, "
            "type: %s", gst_buffer_get_size (img), caps_str);
        g_free (caps_str);
      } else {
        str = g_strdup_printf ("buffer of %" G_GSIZE_FORMAT " bytes",
            gst_buffer_get_size (img));
      }
    } else {
      str = g_strdup ("NULL buffer");
    }
  } else {
    str = gst_value_serialize (&val);
  }

  g_print ("%*s%s: %s\n", 2 * depth, " ", gst_tag_get_nick (tag), str);
  g_free (str);

  g_value_unset (&val);
}
Beispiel #7
0
void collect_tags(const GstTagList * list,const gchar * tag,gpointer user_data)
{
    GValue original_value={0};

    if (gst_tag_list_copy_value(&original_value,list,tag))
    {
        GValue string_value={0};

        g_value_init(&string_value,G_TYPE_STRING);

        if (g_value_transform(&original_value,&string_value))
        {
            const gchar * value=g_value_get_string(&string_value);

            if (value)
            {
                tp_media_player_tag_found((TPMediaPlayer*)user_data,tag,value);
            }
        }
        g_value_unset(&string_value);
    }
    g_value_unset(&original_value);
}
static void
on_message (GstBus * bus, GstMessage * message, gpointer data)
{
  switch (GST_MESSAGE_TYPE (message)) {
    case GST_MESSAGE_WARNING:
    case GST_MESSAGE_ERROR:
      g_error ("Got error");
      gtk_main_quit ();
      break;
    case GST_MESSAGE_TAG:{
      GstTagList *tags;
      GValue v = { 0, };

      g_print ("Got tags\n");
      gst_message_parse_tag (message, &tags);

      if (gst_tag_list_copy_value (&v, tags, "mxf-structure")) {
        const GstStructure *s;
        GtkTreeIter iter;

        s = gst_value_get_structure (&v);

        gtk_tree_store_append (treestore, &iter, NULL);
        insert_structure (s, &iter);

        gtk_widget_show_all (window);

        g_value_unset (&v);
      }

      gst_tag_list_free (tags);
      break;
    }
    default:
      break;
  }
}
Beispiel #9
0
static gboolean
metadataparse_handle_unit_tags (ExifEntry * entry, MEUserData * meudata,
    const ExifByteOrder byte_order)
{
  gboolean ret = TRUE;

  /* FIXME: Cast to gint because EXIF_TAG_GPS_ALTITUDE_REF
   * and EXIF_TAG_GPS_LONGITUDE_REF are not part of ExifTag
   * and gcc warns about this
   */
  switch ((gint) entry->tag) {
    case EXIF_TAG_RESOLUTION_UNIT:
      meudata->resolution_unit = exif_get_short (entry->data, byte_order);
      if (meudata->resolution_unit == 3) {
        /* if [xy]resolution has alredy been add in cm, replace it in inches */
        GValue cm = { 0, };
        GValue inch = { 0, };
        GValue factor = { 0, };

        g_value_init (&factor, GST_TYPE_FRACTION);
        gst_value_set_fraction (&factor, 2, 5);

        if (gst_tag_list_copy_value (&cm, meudata->taglist,
                GST_TAG_IMAGE_XRESOLUTION)) {
          g_value_init (&inch, GST_TYPE_FRACTION);
          gst_tag_list_add_value (meudata->taglist, GST_TAG_MERGE_REPLACE,
              GST_TAG_IMAGE_XRESOLUTION, &inch);
          g_value_unset (&inch);
          g_value_unset (&cm);
        }
        if (gst_tag_list_copy_value (&cm, meudata->taglist,
                GST_TAG_IMAGE_YRESOLUTION)) {
          g_value_init (&inch, GST_TYPE_FRACTION);
          gst_tag_list_add_value (meudata->taglist, GST_TAG_MERGE_REPLACE,
              GST_TAG_IMAGE_YRESOLUTION, &inch);
          g_value_unset (&inch);
          g_value_unset (&cm);
        }

        g_value_unset (&factor);
      }
      break;
    case EXIF_TAG_GPS_ALTITUDE_REF:
    {
      gdouble value;

      meudata->altitude_ref = entry->data[0];
      if (gst_tag_list_get_double (meudata->taglist,
              GST_TAG_GEO_LOCATION_ELEVATION, &value)) {
        GST_DEBUG ("alt-ref: %d", meudata->altitude_ref);
        if (((meudata->altitude_ref == 1) && (value > 0.0)) ||
            ((meudata->altitude_ref == 0) && (value < 0.0))) {
          gst_tag_list_add (meudata->taglist, GST_TAG_MERGE_REPLACE,
              GST_TAG_GEO_LOCATION_ELEVATION, -value, NULL);
        }
      }
    }
      break;
    case EXIF_TAG_GPS_LATITUDE_REF:
    {
      gdouble value;

      meudata->latitude_ref = entry->data[0];
      if (gst_tag_list_get_double (meudata->taglist,
              GST_TAG_GEO_LOCATION_LATITUDE, &value)) {
        GST_DEBUG ("lat-ref: %c", meudata->latitude_ref);
        if (((meudata->latitude_ref == 'S') && (value > 0.0)) ||
            ((meudata->latitude_ref == 'N') && (value < 0.0))) {
          gst_tag_list_add (meudata->taglist, GST_TAG_MERGE_REPLACE,
              GST_TAG_GEO_LOCATION_LATITUDE, -value, NULL);
        }
      }
    }
      break;
    case EXIF_TAG_GPS_LONGITUDE_REF:
    {
      gdouble value;

      meudata->longitude_ref = entry->data[0];
      if (gst_tag_list_get_double (meudata->taglist,
              GST_TAG_GEO_LOCATION_LONGITUDE, &value)) {
        GST_DEBUG ("lon-ref: %c", meudata->longitude_ref);
        if (((meudata->longitude_ref == 'W') && (value > 0.0)) ||
            ((meudata->longitude_ref == 'E') && (value < 0.0))) {
          gst_tag_list_add (meudata->taglist, GST_TAG_MERGE_REPLACE,
              GST_TAG_GEO_LOCATION_LONGITUDE, -value, NULL);
        }
      }
    }
      break;
    default:
      ret = FALSE;
      break;
  }

  return ret;
}
QT_BEGIN_NAMESPACE

//internal
static void addTagToMap(const GstTagList *list,
                        const gchar *tag,
                        gpointer user_data)
{
    QMap<QByteArray, QVariant> *map = reinterpret_cast<QMap<QByteArray, QVariant>* >(user_data);

    GValue val;
    val.g_type = 0;
    gst_tag_list_copy_value(&val,list,tag);

    switch( G_VALUE_TYPE(&val) ) {
        case G_TYPE_STRING:
        {
            const gchar *str_value = g_value_get_string(&val);
            map->insert(QByteArray(tag), QString::fromUtf8(str_value));
            break;
        }
        case G_TYPE_INT:
            map->insert(QByteArray(tag), g_value_get_int(&val));
            break;
        case G_TYPE_UINT:
            map->insert(QByteArray(tag), g_value_get_uint(&val));
            break;
        case G_TYPE_LONG:
            map->insert(QByteArray(tag), qint64(g_value_get_long(&val)));
            break;
        case G_TYPE_BOOLEAN:
            map->insert(QByteArray(tag), g_value_get_boolean(&val));
            break;
        case G_TYPE_CHAR:
#if GLIB_CHECK_VERSION(2,32,0)
            map->insert(QByteArray(tag), g_value_get_schar(&val));
#else
            map->insert(QByteArray(tag), g_value_get_char(&val));
#endif
            break;
        case G_TYPE_DOUBLE:
            map->insert(QByteArray(tag), g_value_get_double(&val));
            break;
        default:
            // GST_TYPE_DATE is a function, not a constant, so pull it out of the switch
#if GST_CHECK_VERSION(1,0,0)
            if (G_VALUE_TYPE(&val) == G_TYPE_DATE) {
                const GDate *date = (const GDate *)g_value_get_boxed(&val);
#else
            if (G_VALUE_TYPE(&val) == GST_TYPE_DATE) {
                const GDate *date = gst_value_get_date(&val);
#endif
                if (g_date_valid(date)) {
                    int year = g_date_get_year(date);
                    int month = g_date_get_month(date);
                    int day = g_date_get_day(date);
                    map->insert(QByteArray(tag), QDate(year,month,day));
                    if (!map->contains("year"))
                        map->insert("year", year);
                }
            } else if (G_VALUE_TYPE(&val) == GST_TYPE_FRACTION) {
                int nom = gst_value_get_fraction_numerator(&val);
                int denom = gst_value_get_fraction_denominator(&val);

                if (denom > 0) {
                    map->insert(QByteArray(tag), double(nom)/denom);
                }
            }
            break;
    }

    g_value_unset(&val);
}

/*!
  Convert GstTagList structure to QMap<QByteArray, QVariant>.

  Mapping to int, bool, char, string, fractions and date are supported.
  Fraction values are converted to doubles.
*/
QMap<QByteArray, QVariant> QGstUtils::gstTagListToMap(const GstTagList *tags)
{
    QMap<QByteArray, QVariant> res;
    gst_tag_list_foreach(tags, addTagToMap, &res);

    return res;
}