15fa5e5feSStephan Aßmus /* 20fc56ed5SStephan Aßmus * Copyright © 2000-2004 Ingo Weinhold <ingo_weinhold@gmx.de> 30fc56ed5SStephan Aßmus * Copyright © 2006-2008 Stephan Aßmus <superstippi@gmx.de> 40fc56ed5SStephan Aßmus * All rights reserved. Distributed under the terms of the MIT License. 55fa5e5feSStephan Aßmus */ 65fa5e5feSStephan Aßmus #ifndef MEDIA_TRACK_AUDIO_SUPPLIER_H 75fa5e5feSStephan Aßmus #define MEDIA_TRACK_AUDIO_SUPPLIER_H 85fa5e5feSStephan Aßmus 90fc56ed5SStephan Aßmus #include <List.h> 100fc56ed5SStephan Aßmus 110fc56ed5SStephan Aßmus #include "AudioTrackSupplier.h" 125fa5e5feSStephan Aßmus 135fa5e5feSStephan Aßmus class BMediaTrack; 140fc56ed5SStephan Aßmus struct media_codec_info; 150fc56ed5SStephan Aßmus struct media_format; 165fa5e5feSStephan Aßmus 170fc56ed5SStephan Aßmus class MediaTrackAudioSupplier : public AudioTrackSupplier { 185fa5e5feSStephan Aßmus public: 19e6ac2ec4SStephan Aßmus MediaTrackAudioSupplier(BMediaTrack* track, 20e6ac2ec4SStephan Aßmus int32 trackIndex); 215fa5e5feSStephan Aßmus virtual ~MediaTrackAudioSupplier(); 225fa5e5feSStephan Aßmus 230fc56ed5SStephan Aßmus virtual const media_format& Format() const; 242a72b9feSStephan Aßmus virtual status_t GetEncodedFormat(media_format* format) const; 252a72b9feSStephan Aßmus virtual status_t GetCodecInfo(media_codec_info* info) const; 260fc56ed5SStephan Aßmus virtual bigtime_t Duration() const; 272a72b9feSStephan Aßmus 280fc56ed5SStephan Aßmus // AudioReader interface 290fc56ed5SStephan Aßmus // (needed to reuse the class as AudioResampler input) 300fc56ed5SStephan Aßmus virtual status_t Read(void* buffer, int64 pos, int64 frames); 315fa5e5feSStephan Aßmus 320fc56ed5SStephan Aßmus virtual status_t InitCheck() const; 330fc56ed5SStephan Aßmus 34e6ac2ec4SStephan Aßmus virtual int32 TrackIndex() const 35e6ac2ec4SStephan Aßmus { return fTrackIndex; } 36e6ac2ec4SStephan Aßmus 370fc56ed5SStephan Aßmus private: 380fc56ed5SStephan Aßmus struct Buffer; 390fc56ed5SStephan Aßmus void _InitFromTrack(); 400fc56ed5SStephan Aßmus 410fc56ed5SStephan Aßmus int64 _FramesPerBuffer() const; 420fc56ed5SStephan Aßmus 430fc56ed5SStephan Aßmus void _CopyFrames(void* source, int64 sourceOffset, 440fc56ed5SStephan Aßmus void* target, int64 targetOffset, 450fc56ed5SStephan Aßmus int64 position, int64 frames) const; 460fc56ed5SStephan Aßmus void _CopyFrames(Buffer* buffer, void* target, 470fc56ed5SStephan Aßmus int64 targetOffset, int64 position, 480fc56ed5SStephan Aßmus int64 frames) const; 490fc56ed5SStephan Aßmus 500fc56ed5SStephan Aßmus void _AllocateBuffers(); 510fc56ed5SStephan Aßmus void _FreeBuffers(); 520fc56ed5SStephan Aßmus Buffer* _BufferAt(int32 index) const; 530fc56ed5SStephan Aßmus Buffer* _FindBufferAtFrame(int64 frame) const; 540fc56ed5SStephan Aßmus Buffer* _FindUnusedBuffer() const; 550fc56ed5SStephan Aßmus Buffer* _FindUsableBuffer() const; 560fc56ed5SStephan Aßmus Buffer* _FindUsableBufferFor(int64 position) const; 570fc56ed5SStephan Aßmus void _GetBuffersFor(BList& buffers, int64 position, 580fc56ed5SStephan Aßmus int64 frames) const; 590fc56ed5SStephan Aßmus void _TouchBuffer(Buffer* buffer); 600fc56ed5SStephan Aßmus 610fc56ed5SStephan Aßmus status_t _ReadBuffer(Buffer* buffer, int64 position); 620fc56ed5SStephan Aßmus status_t _ReadBuffer(Buffer* buffer, int64 position, 630fc56ed5SStephan Aßmus bigtime_t time); 640fc56ed5SStephan Aßmus 650fc56ed5SStephan Aßmus void _ReadCachedFrames(void*& buffer, 660fc56ed5SStephan Aßmus int64& position, int64& frames, 670fc56ed5SStephan Aßmus bigtime_t time); 680fc56ed5SStephan Aßmus 690fc56ed5SStephan Aßmus status_t _ReadUncachedFrames(void* buffer, 700fc56ed5SStephan Aßmus int64 position, int64 frames, 710fc56ed5SStephan Aßmus bigtime_t time); 720fc56ed5SStephan Aßmus 730fc56ed5SStephan Aßmus status_t _FindKeyFrameForward(int64& position); 740fc56ed5SStephan Aßmus status_t _FindKeyFrameBackward(int64& position); 75*c60fcc87SStephan Aßmus // NOTE: unused 76*c60fcc87SStephan Aßmus // status_t _SeekToKeyFrameForward(int64& position); 770fc56ed5SStephan Aßmus status_t _SeekToKeyFrameBackward(int64& position); 780fc56ed5SStephan Aßmus 795fa5e5feSStephan Aßmus private: 805fa5e5feSStephan Aßmus BMediaTrack* fMediaTrack; 810fc56ed5SStephan Aßmus char* fBuffer; 820fc56ed5SStephan Aßmus int64 fBufferOffset; 830fc56ed5SStephan Aßmus int64 fBufferSize; 840fc56ed5SStephan Aßmus BList fBuffers; 850fc56ed5SStephan Aßmus bool fHasKeyFrames; 860fc56ed5SStephan Aßmus int64 fCountFrames; 870fc56ed5SStephan Aßmus bool fReportSeekError; 88e6ac2ec4SStephan Aßmus int32 fTrackIndex; 895fa5e5feSStephan Aßmus }; 905fa5e5feSStephan Aßmus 915fa5e5feSStephan Aßmus #endif // MEDIA_TRACK_AUDIO_SUPPLIER_H 92