int32_t mp4ff_get_sample_duration_use_offsets(const mp4ff_t *f, const int32_t track, const int32_t sample) { int32_t d,o; d = mp4ff_get_sample_duration(f,track,sample); if (d!=-1) { o = mp4ff_get_sample_offset(f,track,sample); if (o>d) d = 0; else d -= o; } return d; }
static gboolean xmms_mp4_gapless_try_legacy (xmms_xform_t *xform) { xmms_mp4_data_t *data; guint64 startsamples, stopsamples; g_return_val_if_fail (xform, FALSE); data = xmms_xform_private_data_get (xform); g_return_val_if_fail (data, FALSE); startsamples = mp4ff_get_sample_offset (data->mp4ff, data->track, 0); stopsamples = mp4ff_get_track_duration (data->mp4ff, data->track); return xmms_mp4_gapless_set (xform, startsamples, stopsamples); }
static gint xmms_mp4_read (xmms_xform_t *xform, xmms_sample_t *buf, gint len, xmms_error_t *err) { xmms_mp4_data_t *data; guint size, bytes_read = 0; data = xmms_xform_private_data_get (xform); g_return_val_if_fail (data, -1); size = MIN (data->outbuf->len, len); while (size == 0) { guchar *tmpbuf; guint tmpbuflen; gint duration, offset; if (data->sampleid >= data->numsamples) { XMMS_DBG ("MP4 EOF"); return 0; } bytes_read = mp4ff_read_sample (data->mp4ff, data->track, data->sampleid, &tmpbuf, &tmpbuflen); offset = mp4ff_get_sample_offset (data->mp4ff, data->track, data->sampleid); duration = mp4ff_get_sample_duration (data->mp4ff, data->track, data->sampleid); data->sampleid++; xmms_xform_auxdata_set_int (xform, "frame_offset", offset); xmms_xform_auxdata_set_int (xform, "frame_duration", duration); if (bytes_read > 0) { g_string_append_len (data->outbuf, (gchar *) tmpbuf, tmpbuflen); g_free (tmpbuf); } size = MIN (data->outbuf->len, len); } memcpy (buf, data->outbuf->str, size); g_string_erase (data->outbuf, 0, size); return size; }
int32_t mp4ff_find_sample_use_offsets(const mp4ff_t *f, const int32_t track, const int64_t offset,int32_t * toskip) { return mp4ff_find_sample(f,track,offset + mp4ff_get_sample_offset(f,track,0),toskip); }