smooth play patch
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@6635 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
602992140d
commit
8b876a958c
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue