smooth play patch
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@6635 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -327,8 +327,7 @@ OggSeekable::Seek(uint32 seekTo, int64 *frame, bigtime_t *time)
|
|||||||
int64 left_granulepos = 0;
|
int64 left_granulepos = 0;
|
||||||
off_t right = GetLastPagePosition();
|
off_t right = GetLastPagePosition();
|
||||||
int64 right_granulepos = 0;
|
int64 right_granulepos = 0;
|
||||||
bool done = false;
|
while (true) {
|
||||||
while (!done) {
|
|
||||||
TRACE(" Seek: [%llu,%llu]: ", left, right);
|
TRACE(" Seek: [%llu,%llu]: ", left, right);
|
||||||
ogg_sync_reset(&fSync);
|
ogg_sync_reset(&fSync);
|
||||||
ogg_stream_reset(&fStreamState);
|
ogg_stream_reset(&fStreamState);
|
||||||
@@ -336,7 +335,7 @@ OggSeekable::Seek(uint32 seekTo, int64 *frame, bigtime_t *time)
|
|||||||
fPosition = (right + left) / 2;
|
fPosition = (right + left) / 2;
|
||||||
} else {
|
} else {
|
||||||
fPosition = left;
|
fPosition = left;
|
||||||
done = true;
|
break;
|
||||||
}
|
}
|
||||||
do {
|
do {
|
||||||
status = ReadPage(&page, B_PAGE_SIZE);
|
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 not the first, look for a granulepos in a packet
|
||||||
if (*frame != 0) {
|
if (granulepos != fFirstGranulepos) {
|
||||||
ogg_packet packet;
|
ogg_packet packet;
|
||||||
do {
|
do {
|
||||||
status = GetPacket(&packet);
|
status = GetPacket(&packet);
|
||||||
@@ -383,6 +382,7 @@ OggSeekable::Seek(uint32 seekTo, int64 *frame, bigtime_t *time)
|
|||||||
} else {
|
} else {
|
||||||
fCurrentFrame = 0;
|
fCurrentFrame = 0;
|
||||||
fCurrentTime = 0;
|
fCurrentTime = 0;
|
||||||
|
Seek(left, SEEK_SET);
|
||||||
}
|
}
|
||||||
TRACE("OggSeekable::Seek done: ");
|
TRACE("OggSeekable::Seek done: ");
|
||||||
TRACE("[%lld,%lld] => ", left_granulepos, right_granulepos);
|
TRACE("[%lld,%lld] => ", left_granulepos, right_granulepos);
|
||||||
@@ -449,8 +449,6 @@ OggSeekable::GetNextChunk(void **chunkBuffer, int32 *chunkSize,
|
|||||||
media_header *mediaHeader)
|
media_header *mediaHeader)
|
||||||
{
|
{
|
||||||
BAutolock autolock(fPositionLock);
|
BAutolock autolock(fPositionLock);
|
||||||
mediaHeader->start_time = fCurrentTime;
|
|
||||||
mediaHeader->file_pos = fPosition;
|
|
||||||
status_t result = GetPacket(&fChunkPacket);
|
status_t result = GetPacket(&fChunkPacket);
|
||||||
if (result != B_OK) {
|
if (result != B_OK) {
|
||||||
TRACE("OggSeekable::GetNextChunk failed: GetPacket = %s\n", strerror(result));
|
TRACE("OggSeekable::GetNextChunk failed: GetPacket = %s\n", strerror(result));
|
||||||
@@ -460,10 +458,12 @@ OggSeekable::GetNextChunk(void **chunkBuffer, int32 *chunkSize,
|
|||||||
*chunkSize = sizeof(fChunkPacket);
|
*chunkSize = sizeof(fChunkPacket);
|
||||||
if (fChunkPacket.granulepos > 0) {
|
if (fChunkPacket.granulepos > 0) {
|
||||||
fCurrentFrame = fChunkPacket.granulepos - fFirstGranulepos;
|
fCurrentFrame = fChunkPacket.granulepos - fFirstGranulepos;
|
||||||
|
fCurrentTime = (bigtime_t)((fCurrentFrame * 1000000LL) / fFrameRate);
|
||||||
|
mediaHeader->start_time = fCurrentTime;
|
||||||
} else {
|
} else {
|
||||||
fCurrentFrame++;
|
mediaHeader->start_time = -1;
|
||||||
}
|
}
|
||||||
fCurrentTime = (bigtime_t)((fCurrentFrame * 1000000LL) / fFrameRate);
|
mediaHeader->file_pos = fPosition;
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -277,5 +277,11 @@ OggTobiasSeekable::GetNextChunk(void **chunkBuffer, int32 *chunkSize,
|
|||||||
mediaHeader->u.encoded_video.line_count
|
mediaHeader->u.encoded_video.line_count
|
||||||
= fMediaFormat.u.encoded_video.output.display.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;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -268,7 +268,7 @@ SpeexDecoder::Decode(void *buffer, int64 *frameCount,
|
|||||||
}
|
}
|
||||||
if (!synced) {
|
if (!synced) {
|
||||||
if (mh.start_time > 0) {
|
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;
|
synced = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -302,7 +302,7 @@ done:
|
|||||||
if (!synced) {
|
if (!synced) {
|
||||||
mediaHeader->start_time = fStartTime;
|
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;
|
*frameCount = (fOutputBufferSize - out_bytes_needed) / fFrameSize;
|
||||||
|
|
||||||
|
|||||||
@@ -195,7 +195,7 @@ VorbisDecoder::Decode(void *buffer, int64 *frameCount,
|
|||||||
}
|
}
|
||||||
if (!synced) {
|
if (!synced) {
|
||||||
if (mh.start_time > 0) {
|
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;
|
synced = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -238,7 +238,7 @@ done:
|
|||||||
if (!synced) {
|
if (!synced) {
|
||||||
mediaHeader->start_time = fStartTime;
|
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;
|
*frameCount = (fOutputBufferSize - out_bytes_needed) / fFrameSize;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user