CAMLprim value ocaml_faad_mp4_metadata(value m) { CAMLparam1(m); CAMLlocal2(ans,v); mp4_t *mp = Mp4_val(m); int i, n; char *tag, *item; caml_enter_blocking_section(); n = mp4ff_meta_get_num_items(mp->ff); caml_leave_blocking_section(); ans = caml_alloc_tuple(n); for (i = 0; i < n; i++) { tag = NULL; item = NULL; caml_enter_blocking_section(); mp4ff_meta_get_by_index(mp->ff, i, &item, &tag); caml_leave_blocking_section(); assert(item && tag); v = caml_alloc_tuple(2); Store_field(v, 0, caml_copy_string(item)); Store_field(v, 1, caml_copy_string(tag)); Store_field(ans, i, v); free(item); free(tag); } CAMLreturn(ans); }
void aac_load_tags (DB_playItem_t *it, mp4ff_t *mp4) { char *s = NULL; int got_itunes_tags = 0; int n = mp4ff_meta_get_num_items (mp4); for (int t = 0; t < n; t++) { char *key = NULL; char *value = NULL; int res = mp4ff_meta_get_by_index(mp4, t, &key, &value); if (key && value) { got_itunes_tags = 1; if (strcasecmp (key, "cover")) { if (!strcasecmp (key, "replaygain_track_gain")) { deadbeef->pl_set_item_replaygain (it, DDB_REPLAYGAIN_TRACKGAIN, atof (value)); } else if (!strcasecmp (key, "replaygain_album_gain")) { deadbeef->pl_set_item_replaygain (it, DDB_REPLAYGAIN_ALBUMGAIN, atof (value)); } else if (!strcasecmp (key, "replaygain_track_peak")) { deadbeef->pl_set_item_replaygain (it, DDB_REPLAYGAIN_TRACKPEAK, atof (value)); } else if (!strcasecmp (key, "replaygain_album_peak")) { deadbeef->pl_set_item_replaygain (it, DDB_REPLAYGAIN_ALBUMPEAK, atof (value)); } else { int i; for (i = 0; metainfo[i]; i += 2) { if (!strcasecmp (metainfo[i], key)) { deadbeef->pl_add_meta (it, metainfo[i+1], value); break; } } if (!metainfo[i]) { deadbeef->pl_add_meta (it, key, value); } } } } if (key) { free (key); } if (value) { free (value); } } if (got_itunes_tags) { uint32_t f = deadbeef->pl_get_item_flags (it); f |= DDB_TAG_ITUNES; deadbeef->pl_set_item_flags (it, f); } }
static void xmms_mp4_get_mediainfo (xmms_xform_t *xform) { xmms_mp4_data_t *data; const gchar *metakey; glong temp; gint i, num_items; g_return_if_fail (xform); data = xmms_xform_private_data_get (xform); g_return_if_fail (data); if ((temp = mp4ff_get_sample_rate (data->mp4ff, data->track)) > 0) { glong srate = temp; if ((temp = mp4ff_get_track_duration (data->mp4ff, data->track)) >= 0) { glong msec = ((gint64) temp) * 1000 / srate; metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_DURATION, xmms_xform_metadata_set_int (xform, metakey, msec); } } if ((temp = mp4ff_get_avg_bitrate (data->mp4ff, data->track)) >= 0) { metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_BITRATE; xmms_xform_metadata_set_int (xform, metakey, temp); } num_items = mp4ff_meta_get_num_items (data->mp4ff); for (i = 0; i < num_items; i++) { gchar *key, *value; guint length; length = mp4ff_meta_get_by_index (data->mp4ff, i, &key, &value); if (length > 0) { if (!xmms_xform_metadata_mapper_match (xform, key, value, length)) { /* iTunSMPB should be handled in xmms_mp4_gapless_try */ if (0 != g_ascii_strcasecmp (key, "iTunSMPB")) { XMMS_DBG ("Unhandled tag '%s' = '%s'", key, value); } } g_free (key); g_free (value); } } }