diff --git a/src/add-ons/media/plugins/ogg/OggSeekable.cpp b/src/add-ons/media/plugins/ogg/OggSeekable.cpp index 073912b850..1f440ef005 100644 --- a/src/add-ons/media/plugins/ogg/OggSeekable.cpp +++ b/src/add-ons/media/plugins/ogg/OggSeekable.cpp @@ -327,8 +327,7 @@ OggSeekable::Seek(uint32 seekTo, int64 *frame, bigtime_t *time) int64 left_granulepos = 0; off_t right = GetLastPagePosition(); int64 right_granulepos = 0; - bool done = false; - while (!done) { + while (true) { TRACE(" Seek: [%llu,%llu]: ", left, right); ogg_sync_reset(&fSync); ogg_stream_reset(&fStreamState); @@ -336,7 +335,7 @@ OggSeekable::Seek(uint32 seekTo, int64 *frame, bigtime_t *time) fPosition = (right + left) / 2; } else { fPosition = left; - done = true; + break; } do { status = ReadPage(&page, B_PAGE_SIZE); @@ -367,8 +366,8 @@ OggSeekable::Seek(uint32 seekTo, int64 *frame, bigtime_t *time) } } - // if not zero, look for a granulepos in a packet - if (*frame != 0) { + // if not the first, look for a granulepos in a packet + if (granulepos != fFirstGranulepos) { ogg_packet packet; do { status = GetPacket(&packet); @@ -383,6 +382,7 @@ OggSeekable::Seek(uint32 seekTo, int64 *frame, bigtime_t *time) } else { fCurrentFrame = 0; fCurrentTime = 0; + Seek(left, SEEK_SET); } TRACE("OggSeekable::Seek done: "); TRACE("[%lld,%lld] => ", left_granulepos, right_granulepos); @@ -449,8 +449,6 @@ OggSeekable::GetNextChunk(void **chunkBuffer, int32 *chunkSize, media_header *mediaHeader) { BAutolock autolock(fPositionLock); - mediaHeader->start_time = fCurrentTime; - mediaHeader->file_pos = fPosition; status_t result = GetPacket(&fChunkPacket); if (result != B_OK) { TRACE("OggSeekable::GetNextChunk failed: GetPacket = %s\n", strerror(result)); @@ -460,10 +458,12 @@ OggSeekable::GetNextChunk(void **chunkBuffer, int32 *chunkSize, *chunkSize = sizeof(fChunkPacket); if (fChunkPacket.granulepos > 0) { fCurrentFrame = fChunkPacket.granulepos - fFirstGranulepos; + fCurrentTime = (bigtime_t)((fCurrentFrame * 1000000LL) / fFrameRate); + mediaHeader->start_time = fCurrentTime; } else { - fCurrentFrame++; + mediaHeader->start_time = -1; } - fCurrentTime = (bigtime_t)((fCurrentFrame * 1000000LL) / fFrameRate); + mediaHeader->file_pos = fPosition; return B_OK; } diff --git a/src/add-ons/media/plugins/ogg/OggTobiasSeekable.cpp b/src/add-ons/media/plugins/ogg/OggTobiasSeekable.cpp index c66fb986c1..cf40cec64b 100644 --- a/src/add-ons/media/plugins/ogg/OggTobiasSeekable.cpp +++ b/src/add-ons/media/plugins/ogg/OggTobiasSeekable.cpp @@ -277,5 +277,11 @@ OggTobiasSeekable::GetNextChunk(void **chunkBuffer, int32 *chunkSize, mediaHeader->u.encoded_video.line_count = fMediaFormat.u.encoded_video.output.display.line_count; } + if (mediaHeader->start_time < 0) { + fCurrentFrame++; + fCurrentTime = (bigtime_t)((fCurrentFrame * 1000000LL) / fFrameRate); + mediaHeader->start_time = fCurrentTime; + } +// fprintf(stderr, "current frame = %lld, time = %lld\n", fCurrentFrame, fCurrentTime); return B_OK; } diff --git a/src/add-ons/media/plugins/speex/speexCodecPlugin.cpp b/src/add-ons/media/plugins/speex/speexCodecPlugin.cpp index bdc89389a8..d86ca50770 100644 --- a/src/add-ons/media/plugins/speex/speexCodecPlugin.cpp +++ b/src/add-ons/media/plugins/speex/speexCodecPlugin.cpp @@ -268,7 +268,7 @@ SpeexDecoder::Decode(void *buffer, int64 *frameCount, } if (!synced) { if (mh.start_time > 0) { - mediaHeader->start_time = mh.start_time - total_samples / fHeader->rate; + mediaHeader->start_time = mh.start_time - (1000000LL * total_samples) / fHeader->rate; synced = true; } } @@ -302,7 +302,7 @@ done: if (!synced) { mediaHeader->start_time = fStartTime; } - fStartTime = mediaHeader->start_time + total_samples / fHeader->rate; + fStartTime = mediaHeader->start_time + (1000000LL * total_samples) / fHeader->rate; *frameCount = (fOutputBufferSize - out_bytes_needed) / fFrameSize; diff --git a/src/add-ons/media/plugins/vorbis/vorbisCodecPlugin.cpp b/src/add-ons/media/plugins/vorbis/vorbisCodecPlugin.cpp index 101c88851b..5c09db4c91 100644 --- a/src/add-ons/media/plugins/vorbis/vorbisCodecPlugin.cpp +++ b/src/add-ons/media/plugins/vorbis/vorbisCodecPlugin.cpp @@ -195,7 +195,7 @@ VorbisDecoder::Decode(void *buffer, int64 *frameCount, } if (!synced) { if (mh.start_time > 0) { - mediaHeader->start_time = mh.start_time - total_samples / fInfo.rate; + mediaHeader->start_time = mh.start_time - (1000000LL * total_samples) / fInfo.rate; synced = true; } } @@ -238,7 +238,7 @@ done: if (!synced) { mediaHeader->start_time = fStartTime; } - fStartTime = mediaHeader->start_time + total_samples / fInfo.rate; + fStartTime = mediaHeader->start_time + (1000000LL * total_samples) / fInfo.rate; *frameCount = (fOutputBufferSize - out_bytes_needed) / fFrameSize;