performance improvements
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13658 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -519,13 +519,17 @@ uint32 MOVFileReader::getChunkSize(uint32 stream_index, uint32 pFrameNo)
|
|||||||
// Get first sample in chunk
|
// Get first sample in chunk
|
||||||
uint32 SampleNo = aTrakAtom->getFirstSampleInChunk(ChunkNo);
|
uint32 SampleNo = aTrakAtom->getFirstSampleInChunk(ChunkNo);
|
||||||
|
|
||||||
// Add up all sample sizes in chunk
|
|
||||||
uint32 ChunkSize = 0;
|
uint32 ChunkSize = 0;
|
||||||
for (uint32 i=0;i<aTrakAtom->getNoSamplesInChunk(ChunkNo);i++) {
|
if (aTrakAtom->IsSingleSampleSize()) {
|
||||||
ChunkSize += aTrakAtom->getSizeForSample(SampleNo);
|
ChunkSize = aTrakAtom->getNoSamplesInChunk(ChunkNo) * aTrakAtom->getSizeForSample(SampleNo);
|
||||||
SampleNo++;
|
} else {
|
||||||
|
// Add up all sample sizes in chunk
|
||||||
|
for (uint32 i=0;i<aTrakAtom->getNoSamplesInChunk(ChunkNo);i++) {
|
||||||
|
ChunkSize += aTrakAtom->getSizeForSample(SampleNo);
|
||||||
|
SampleNo++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ChunkSize;
|
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)
|
bool MOVFileReader::GetNextChunkInfo(uint32 stream_index, uint32 pFrameNo, off_t *start, uint32 *size, bool *keyframe)
|
||||||
{
|
{
|
||||||
|
|
||||||
*start = getOffsetForFrame(stream_index, pFrameNo);
|
*start = getOffsetForFrame(stream_index, pFrameNo);
|
||||||
*size = getChunkSize(stream_index, pFrameNo);
|
*size = getChunkSize(stream_index, pFrameNo);
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#include <DataIO.h>
|
#include <DataIO.h>
|
||||||
|
#include <StopWatch.h>
|
||||||
#include <ByteOrder.h>
|
#include <ByteOrder.h>
|
||||||
#include <InterfaceDefs.h>
|
#include <InterfaceDefs.h>
|
||||||
#include <MediaFormats.h>
|
#include <MediaFormats.h>
|
||||||
@@ -369,7 +370,7 @@ movReader::AllocateCookie(int32 streamNumber, void **_cookie)
|
|||||||
|
|
||||||
TRACE("frame_count %Ld\n", cookie->frame_count);
|
TRACE("frame_count %Ld\n", cookie->frame_count);
|
||||||
TRACE("duration %.6f (%Ld)\n", cookie->duration / 1E6, cookie->duration);
|
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;
|
description.family = B_QUICKTIME_FORMAT_FAMILY;
|
||||||
if (stream_header->fourcc_handler == 'ekaf' || stream_header->fourcc_handler == 0) // 'fake' or 0 fourcc => used compression id
|
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;
|
mov_cookie *cookie = (mov_cookie *)_cookie;
|
||||||
|
|
||||||
int64 start; uint32 size; bool keyframe;
|
int64 start; uint32 size; bool keyframe;
|
||||||
|
|
||||||
if (cookie->audio) {
|
if (cookie->audio) {
|
||||||
if (!theFileReader->GetNextChunkInfo(cookie->stream, cookie->chunk_pos, &start, &size, &keyframe))
|
if (!theFileReader->GetNextChunkInfo(cookie->stream, cookie->chunk_pos, &start, &size, &keyframe))
|
||||||
return B_LAST_BUFFER_ERROR;
|
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;
|
mediaHeader->u.encoded_audio.buffer_flags = keyframe ? B_MEDIA_KEY_FRAME : 0;
|
||||||
|
|
||||||
// This will only work with raw audio I think.
|
// 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);
|
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
|
// We should find the current frame position (ie first frame in chunk) then compute using fps
|
||||||
|
|||||||
Reference in New Issue
Block a user