smooth play patch

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@6635 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
shatty 2004-02-18 14:49:40 +00:00
parent 602992140d
commit 8b876a958c
4 changed files with 19 additions and 13 deletions

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;

View File

@ -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;