static gint64 xmms_mp4_seek (xmms_xform_t *xform, gint64 samples, xmms_xform_seek_mode_t whence, xmms_error_t *err) { int32_t toskip, sampleid_candidate; xmms_mp4_data_t *data; g_return_val_if_fail (whence == XMMS_XFORM_SEEK_SET, -1); g_return_val_if_fail (xform, -1); data = xmms_xform_private_data_get (xform); g_return_val_if_fail (data, FALSE); sampleid_candidate = mp4ff_find_sample(data->mp4ff, data->track, samples, &toskip); if (sampleid_candidate < 0) { return -1; } data->sampleid = sampleid_candidate; data->buffer_length = 0; g_string_erase (data->outbuf, 0, -1); return samples-toskip; }
CAMLprim value ocaml_faad_mp4_seek(value m, value track, value offset) { CAMLparam1(m); CAMLlocal1(ret); int32_t toskip = 0; mp4_t *mp = Mp4_val(m); int t = Int_val(track); caml_enter_blocking_section(); int sample = mp4ff_find_sample(mp->ff,t,(int64_t)(Int_val(offset)),&toskip); caml_leave_blocking_section(); ret = caml_alloc_tuple(2); Field(ret,0) = Val_int(sample); Field(ret,1) = Val_int(toskip); CAMLreturn(ret); }
FXbool MP4Reader::seek(FXdouble pos){ FXint f = mp4ff_find_sample(handle,track,pos*stream_length,NULL); if (f>=0) frame=f; return true; }
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); }