示例#1
0
文件: tag_list.cpp 项目: EQ4/nxplay
void add_raw_value(tag_list &p_tag_list, GValue const *p_value, std::string const &p_name, GstTagMergeMode const p_merge_mode)
{
	g_assert(p_value != NULL);
	g_assert(!p_name.empty());

	if (p_tag_list.is_empty())
		p_tag_list = tag_list(gst_tag_list_new_empty());

	gst_tag_list_add_value(p_tag_list.get_tag_list(), p_merge_mode, p_name.c_str(), p_value);
}
示例#2
0
static gboolean on_activate(GstPad* pad, GstObject* parent) {
  gst_pad_activate_mode(pad,GST_PAD_MODE_PUSH,TRUE);

  GstTagList* list = gst_tag_list_new_empty();
  GValue value;
  memset(&value,0,sizeof(value));
  g_value_init(&value,G_TYPE_DOUBLE);
  fprintf(stderr,"bwub setting gain/peak %f %f %f\n",
          g_activate_gain.peak, g_activate_gain.gain,
          g_activate_gain.level);
  g_value_set_double(&value,g_activate_gain.gain*2);
  gst_tag_list_add_value(list, GST_TAG_MERGE_REPLACE, GST_TAG_TRACK_GAIN, &value);
  gst_tag_list_add_value(list, GST_TAG_MERGE_REPLACE, GST_TAG_ALBUM_GAIN, &value);
  g_value_set_double(&value,g_activate_gain.peak*2);
  gst_tag_list_add_value(list,  GST_TAG_MERGE_REPLACE, GST_TAG_TRACK_PEAK, &value);
  gst_tag_list_add_value(list,  GST_TAG_MERGE_REPLACE, GST_TAG_ALBUM_PEAK, &value);
  g_value_set_double(&value,g_activate_gain.level);
  gst_tag_list_add_value(list,  GST_TAG_MERGE_REPLACE, GST_TAG_REFERENCE_LEVEL, &value);
  assert(TRUE==gst_pad_send_event(pad,gst_event_new_tag(list)));

  return TRUE;
}
示例#3
0
/**
 * gst_tag_setter_add_tag_value:
 * @setter: a #GstTagSetter
 * @mode: the mode to use
 * @tag: tag to set
 * @value: GValue to set for the tag
 *
 * Adds the given tag / GValue pair on the setter using the given merge mode.
 *
 * Since: 0.10.24
 */
void
gst_tag_setter_add_tag_value (GstTagSetter * setter,
    GstTagMergeMode mode, const gchar * tag, const GValue * value)
{
  GstTagData *data;

  g_return_if_fail (GST_IS_TAG_SETTER (setter));
  g_return_if_fail (GST_TAG_MODE_IS_VALID (mode));

  data = gst_tag_setter_get_data (setter);
  if (!data->list)
    data->list = gst_tag_list_new ();

  gst_tag_list_add_value (data->list, mode, tag, value);
}
示例#4
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;
}
示例#5
0
/**
 * gst_riff_parse_info:
 * @element: caller element (used for debugging/error).
 * @buf: input data to be used for parsing, stripped from header.
 * @taglist: a pointer to a taglist (returned by this function)
 *           containing information about this stream. May be
 *           NULL if no supported tags were found.
 *
 * Parses stream metadata from input data.
 */
void
gst_riff_parse_info (GstElement * element,
    GstBuffer * buf, GstTagList ** _taglist)
{
  guint8 *data;
  guint size, tsize;
  guint32 tag;
  const gchar *type;
  GstTagList *taglist;

  g_return_if_fail (_taglist != NULL);

  if (!buf) {
    *_taglist = NULL;
    return;
  }
  data = GST_BUFFER_DATA (buf);
  size = GST_BUFFER_SIZE (buf);
  taglist = gst_tag_list_new ();

  while (size > 8) {
    tag = GST_READ_UINT32_LE (data);
    tsize = GST_READ_UINT32_LE (data + 4);

    GST_MEMDUMP_OBJECT (element, "tag chunk", data, MIN (tsize + 8, size));

    size -= 8;
    data += 8;

    GST_DEBUG ("tag %" GST_FOURCC_FORMAT ", size %u",
        GST_FOURCC_ARGS (tag), tsize);

    if (tsize > size) {
      GST_WARNING_OBJECT (element,
          "Tagsize %d is larger than available data %d", tsize, size);
      tsize = size;
    }

    /* make uppercase */
    tag = tag & 0xDFDFDFDF;

    /* find out the type of metadata */
    switch (tag) {
      case GST_RIFF_INFO_IARL:
        type = GST_TAG_LOCATION;
        break;
      case GST_RIFF_INFO_IAAR:
        type = GST_TAG_ALBUM_ARTIST;
        break;
      case GST_RIFF_INFO_IART:
        type = GST_TAG_ARTIST;
        break;
      case GST_RIFF_INFO_ICMS:
        type = NULL;            /*"Commissioner"; */
        break;
      case GST_RIFF_INFO_ICMT:
        type = GST_TAG_COMMENT;
        break;
      case GST_RIFF_INFO_ICOP:
        type = GST_TAG_COPYRIGHT;
        break;
      case GST_RIFF_INFO_ICRD:
        type = GST_TAG_DATE;
        break;
      case GST_RIFF_INFO_ICRP:
        type = NULL;            /*"Cropped"; */
        break;
      case GST_RIFF_INFO_IDIM:
        type = NULL;            /*"Dimensions"; */
        break;
      case GST_RIFF_INFO_IDPI:
        type = NULL;            /*"Dots per Inch"; */
        break;
      case GST_RIFF_INFO_IENG:
        type = NULL;            /*"Engineer"; */
        break;
      case GST_RIFF_INFO_IGNR:
        type = GST_TAG_GENRE;
        break;
      case GST_RIFF_INFO_IKEY:
        type = GST_TAG_KEYWORDS;
        break;
      case GST_RIFF_INFO_ILGT:
        type = NULL;            /*"Lightness"; */
        break;
      case GST_RIFF_INFO_IMED:
        type = NULL;            /*"Medium"; */
        break;
      case GST_RIFF_INFO_INAM:
        type = GST_TAG_TITLE;
        break;
      case GST_RIFF_INFO_IPLT:
        type = NULL;            /*"Palette"; */
        break;
      case GST_RIFF_INFO_IPRD:
        type = GST_TAG_ALBUM;
        break;
      case GST_RIFF_INFO_ISBJ:
        type = GST_TAG_ALBUM_ARTIST;
        break;
      case GST_RIFF_INFO_ISFT:
        type = GST_TAG_ENCODER;
        break;
      case GST_RIFF_INFO_ISHP:
        type = NULL;            /*"Sharpness"; */
        break;
      case GST_RIFF_INFO_ISRC:
        type = GST_TAG_ISRC;
        break;
      case GST_RIFF_INFO_ISRF:
        type = NULL;            /*"Source Form"; */
        break;
      case GST_RIFF_INFO_ITCH:
        type = NULL;            /*"Technician"; */
        break;
      case GST_RIFF_INFO_ITRK:
        type = GST_TAG_TRACK_NUMBER;
        break;
      default:
        type = NULL;
        GST_WARNING_OBJECT (element,
            "Unknown INFO (metadata) tag entry %" GST_FOURCC_FORMAT,
            GST_FOURCC_ARGS (tag));
        break;
    }

    if (type != NULL && data[0] != '\0') {
      static const gchar *env_vars[] = { "GST_AVI_TAG_ENCODING",
        "GST_RIFF_TAG_ENCODING", "GST_TAG_ENCODING", NULL
      };
      GType tag_type;
      gchar *val;

      GST_DEBUG_OBJECT (element, "mapped tag %" GST_FOURCC_FORMAT " to tag %s",
          GST_FOURCC_ARGS (tag), type);

      tag_type = gst_tag_get_type (type);
      val = gst_tag_freeform_string_to_utf8 ((gchar *) data, tsize, env_vars);

      if (val != NULL) {
        if (tag_type == G_TYPE_STRING) {
          gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND, type, val, NULL);
        } else {
          GValue tag_val = { 0, };

          g_value_init (&tag_val, tag_type);
          if (gst_value_deserialize (&tag_val, val)) {
            gst_tag_list_add_value (taglist, GST_TAG_MERGE_APPEND, type,
                &tag_val);
          } else {
            GST_WARNING_OBJECT (element, "could not deserialize '%s' into a "
                "tag %s of type %s", val, type, g_type_name (tag_type));
          }
          g_value_unset (&tag_val);
        }
        g_free (val);
      } else {
        GST_WARNING_OBJECT (element, "could not extract %s tag", type);
      }
    }

    if (tsize & 1) {
      tsize++;
      if (tsize > size)
        tsize = size;
    }

    data += tsize;
    size -= tsize;
  }

  if (!gst_tag_list_is_empty (taglist)) {
    GST_INFO_OBJECT (element, "extracted tags: %" GST_PTR_FORMAT, taglist);
    *_taglist = taglist;
  } else {
    *_taglist = NULL;
    gst_tag_list_free (taglist);
  }

  return;
}