From f1459e8f917d0b028f657af3da444a9649c8e9b3 Mon Sep 17 00:00:00 2001 From: David McPaul Date: Wed, 13 Jul 2005 13:41:08 +0000 Subject: [PATCH] performance improvements git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13658 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../plugins/mov_reader/libMOV/MOVFileReader.cpp | 15 +++++++++------ .../media/plugins/mov_reader/mov_reader.cpp | 7 ++++--- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/add-ons/media/plugins/mov_reader/libMOV/MOVFileReader.cpp b/src/add-ons/media/plugins/mov_reader/libMOV/MOVFileReader.cpp index 79e502c39a..e21d5ea5bb 100644 --- a/src/add-ons/media/plugins/mov_reader/libMOV/MOVFileReader.cpp +++ b/src/add-ons/media/plugins/mov_reader/libMOV/MOVFileReader.cpp @@ -519,13 +519,17 @@ uint32 MOVFileReader::getChunkSize(uint32 stream_index, uint32 pFrameNo) // Get first sample in chunk uint32 SampleNo = aTrakAtom->getFirstSampleInChunk(ChunkNo); - // Add up all sample sizes in chunk uint32 ChunkSize = 0; - for (uint32 i=0;igetNoSamplesInChunk(ChunkNo);i++) { - ChunkSize += aTrakAtom->getSizeForSample(SampleNo); - SampleNo++; + if (aTrakAtom->IsSingleSampleSize()) { + ChunkSize = aTrakAtom->getNoSamplesInChunk(ChunkNo) * aTrakAtom->getSizeForSample(SampleNo); + } else { + // Add up all sample sizes in chunk + for (uint32 i=0;igetNoSamplesInChunk(ChunkNo);i++) { + ChunkSize += aTrakAtom->getSizeForSample(SampleNo); + SampleNo++; + } } - + return ChunkSize; } @@ -557,7 +561,6 @@ bool MOVFileReader::IsKeyFrame(uint32 stream_index, uint32 pFrameNo) bool MOVFileReader::GetNextChunkInfo(uint32 stream_index, uint32 pFrameNo, off_t *start, uint32 *size, bool *keyframe) { - *start = getOffsetForFrame(stream_index, pFrameNo); *size = getChunkSize(stream_index, pFrameNo); diff --git a/src/add-ons/media/plugins/mov_reader/mov_reader.cpp b/src/add-ons/media/plugins/mov_reader/mov_reader.cpp index 50ad382268..b51f0c9999 100644 --- a/src/add-ons/media/plugins/mov_reader/mov_reader.cpp +++ b/src/add-ons/media/plugins/mov_reader/mov_reader.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -369,7 +370,7 @@ movReader::AllocateCookie(int32 streamNumber, void **_cookie) TRACE("frame_count %Ld\n", cookie->frame_count); TRACE("duration %.6f (%Ld)\n", cookie->duration / 1E6, cookie->duration); - TRACE("compression %s\n", &video_format->compression); + TRACE("compression %s\n", (char *)(&video_format->compression)); description.family = B_QUICKTIME_FORMAT_FAMILY; if (stream_header->fourcc_handler == 'ekaf' || stream_header->fourcc_handler == 0) // 'fake' or 0 fourcc => used compression id @@ -482,7 +483,7 @@ movReader::GetNextChunk(void *_cookie, mov_cookie *cookie = (mov_cookie *)_cookie; int64 start; uint32 size; bool keyframe; - + if (cookie->audio) { if (!theFileReader->GetNextChunkInfo(cookie->stream, cookie->chunk_pos, &start, &size, &keyframe)) return B_LAST_BUFFER_ERROR; @@ -503,7 +504,7 @@ movReader::GetNextChunk(void *_cookie, mediaHeader->u.encoded_audio.buffer_flags = keyframe ? B_MEDIA_KEY_FRAME : 0; // This will only work with raw audio I think. - mediaHeader->start_time = (cookie->byte_pos * 1000000L * cookie->bytes_per_sec_scale) / cookie->bytes_per_sec_rate; + mediaHeader->start_time = (cookie->byte_pos * 1000000LL * cookie->bytes_per_sec_scale) / cookie->bytes_per_sec_rate; TRACE("Audio - Frames in Chunk %ld / Actual Start Time %Ld using byte_pos\n",theFileReader->getNoFramesInChunk(cookie->stream,cookie->chunk_pos),mediaHeader->start_time); // We should find the current frame position (ie first frame in chunk) then compute using fps