* Copyright 2000-2004 Ingo Weinhold <ingo_weinhold@gmx.de>
* Copyright 2006-2008 Stephan Aßmus <superstippi@gmx.de>
* All rights reserved. Distributed under the terms of the MIT License.
*/
#ifndef MEDIA_TRACK_AUDIO_SUPPLIER_H
#define MEDIA_TRACK_AUDIO_SUPPLIER_H
#include <List.h>
#include "AudioTrackSupplier.h"
class BMediaTrack;
struct media_codec_info;
struct media_format;
class MediaTrackAudioSupplier : public AudioTrackSupplier {
public:
MediaTrackAudioSupplier(BMediaTrack* track,
int32 trackIndex);
virtual ~MediaTrackAudioSupplier();
virtual const media_format& Format() const;
virtual status_t GetEncodedFormat(media_format* format) const;
virtual status_t GetCodecInfo(media_codec_info* info) const;
virtual bigtime_t Duration() const;
virtual bigtime_t InitialLatency() const;
virtual status_t Read(void* buffer, int64 pos, int64 frames);
virtual status_t InitCheck() const;
virtual int32 TrackIndex() const
{ return fTrackIndex; }
private:
struct Buffer;
void _InitFromTrack();
int64 _FramesPerBuffer() const;
void _CopyFrames(void* source, int64 sourceOffset,
void* target, int64 targetOffset,
int64 position, int64 frames) const;
void _CopyFrames(Buffer* buffer, void* target,
int64 targetOffset, int64 position,
int64 frames) const;
void _AllocateBuffers();
void _FreeBuffers();
Buffer* _BufferAt(int32 index) const;
Buffer* _FindBufferAtFrame(int64 frame) const;
Buffer* _FindUnusedBuffer() const;
Buffer* _FindUsableBuffer() const;
Buffer* _FindUsableBufferFor(int64 position) const;
void _GetBuffersFor(BList& buffers, int64 position,
int64 frames) const;
void _TouchBuffer(Buffer* buffer);
status_t _ReadBuffer(Buffer* buffer, int64 position);
status_t _ReadBuffer(Buffer* buffer, int64 position,
bigtime_t time);
void _ReadCachedFrames(void*& buffer,
int64& position, int64& frames,
bigtime_t time);
status_t _ReadUncachedFrames(void* buffer,
int64 position, int64 frames,
bigtime_t time);
status_t _FindKeyFrameForward(int64& position);
status_t _FindKeyFrameBackward(int64& position);
status_t _SeekToKeyFrameBackward(int64& position);
private:
BMediaTrack* fMediaTrack;
char* fBuffer;
int64 fBufferOffset;
int64 fBufferSize;
BList fBuffers;
bool fHasKeyFrames;
int64 fCountFrames;
bool fReportSeekError;
int32 fTrackIndex;
};
#endif