diff options
author | reimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2005-10-12 21:55:55 +0000 |
---|---|---|
committer | reimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2005-10-12 21:55:55 +0000 |
commit | 04a30a8f17f5066446776d47f16593bec8ad7947 (patch) | |
tree | d067d001f127986ece6f42efde23f734b68a052d /libmpdemux | |
parent | 2465a2037d3df22da67f305eeb5192f2b15f5b2f (diff) | |
download | mpv-04a30a8f17f5066446776d47f16593bec8ad7947.tar.bz2 mpv-04a30a8f17f5066446776d47f16593bec8ad7947.tar.xz |
Implement seeking
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@16746 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux')
-rw-r--r-- | libmpdemux/demux_mpc.c | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/libmpdemux/demux_mpc.c b/libmpdemux/demux_mpc.c index 33cc2c254b..003b965a0f 100644 --- a/libmpdemux/demux_mpc.c +++ b/libmpdemux/demux_mpc.c @@ -21,6 +21,7 @@ typedef struct da_priv { float last_pts; + float pts_per_packet; uint32_t dword; int pos; float length; @@ -105,12 +106,12 @@ static demuxer_t *demux_mpc_open(demuxer_t* demuxer) { priv = (da_priv_t *)malloc(sizeof(da_priv_t)); priv->last_pts = -1; + priv->pts_per_packet = (32 * 36) / (float)sh_audio->wf->nSamplesPerSec; priv->length = seconds; priv->dword = 0; priv->pos = 32; // empty bit buffer get_bits(priv, s, 8); // discard first 8 bits demuxer->priv = priv; - demuxer->seekable = 0; demuxer->audio->id = 0; demuxer->audio->sh = sh_audio; sh_audio->ds = demuxer->audio; @@ -145,7 +146,7 @@ static int demux_mpc_fill_buffer(demuxer_t *demux, demux_stream_t *ds) { if (priv->last_pts < 0) priv->last_pts = 0; else - priv->last_pts += (36 * 32) / (float)sh_audio->samplerate; + priv->last_pts += priv->pts_per_packet; ds->pts = priv->last_pts - (ds_tell_pts(demux->audio) - sh_audio->a_in_buffer_len)/(float)sh_audio->i_bps; ds_add_packet(ds, dp); @@ -153,7 +154,34 @@ static int demux_mpc_fill_buffer(demuxer_t *demux, demux_stream_t *ds) { } static void demux_mpc_seek(demuxer_t *demuxer,float rel_seek_secs,int flags){ -// TODO + sh_audio_t* sh_audio = demuxer->audio->sh; + da_priv_t* priv = demuxer->priv; + stream_t* s = demuxer->stream; + float target = rel_seek_secs; + if (flags & 2) + target *= priv->length; + if (!(flags & 1)) + target += priv->last_pts; + if (target < priv->last_pts) { + stream_seek(s, demuxer->movi_start); + priv->pos = 32; // empty bit buffer + get_bits(priv, s, 8); // discard first 8 bits + priv->last_pts = 0; + } + while (target > priv->last_pts) { + int bit_len = get_bits(priv, s, 20); + if (bit_len > 32) { + stream_skip(s, bit_len / 32 * 4 - 4); + get_bits(priv, s, 32); // make sure dword is reloaded + } + get_bits(priv, s, bit_len % 32); + priv->last_pts += priv->pts_per_packet; + if (s->eof) break; + } + if (!sh_audio) return; + sh_audio->delay = priv->last_pts - (ds_tell_pts(demuxer->audio) - + sh_audio->a_in_buffer_len)/(float)sh_audio->i_bps; + resync_audio_stream(sh_audio); } static void demux_close_mpc(demuxer_t* demuxer) { |