15fa5e5feSStephan Aßmus /* 2*8dd3060dSAxel Dörfler * Copyright 2000-2004 Ingo Weinhold <ingo_weinhold@gmx.de> 3*8dd3060dSAxel Dörfler * 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 9*8dd3060dSAxel Dörfler 100fc56ed5SStephan Aßmus #include <List.h> 110fc56ed5SStephan Aßmus 120fc56ed5SStephan Aßmus #include "AudioTrackSupplier.h" 135fa5e5feSStephan Aßmus 14*8dd3060dSAxel Dörfler 155fa5e5feSStephan Aßmus class BMediaTrack; 160fc56ed5SStephan Aßmus struct media_codec_info; 170fc56ed5SStephan Aßmus struct media_format; 185fa5e5feSStephan Aßmus 19*8dd3060dSAxel Dörfler 200fc56ed5SStephan Aßmus class MediaTrackAudioSupplier : public AudioTrackSupplier { 215fa5e5feSStephan Aßmus public: 22e6ac2ec4SStephan Aßmus MediaTrackAudioSupplier(BMediaTrack* track, 23e6ac2ec4SStephan Aßmus int32 trackIndex); 245fa5e5feSStephan Aßmus virtual ~MediaTrackAudioSupplier(); 255fa5e5feSStephan Aßmus 260fc56ed5SStephan Aßmus virtual const media_format& Format() const; 272a72b9feSStephan Aßmus virtual status_t GetEncodedFormat(media_format* format) const; 282a72b9feSStephan Aßmus virtual status_t GetCodecInfo(media_codec_info* info) const; 290fc56ed5SStephan Aßmus virtual bigtime_t Duration() const; 302a72b9feSStephan Aßmus 310fc56ed5SStephan Aßmus // AudioReader interface 320fc56ed5SStephan Aßmus // (needed to reuse the class as AudioResampler input) 33*8dd3060dSAxel Dörfler virtual bigtime_t InitialLatency() const; 340fc56ed5SStephan Aßmus virtual status_t Read(void* buffer, int64 pos, int64 frames); 355fa5e5feSStephan Aßmus 360fc56ed5SStephan Aßmus virtual status_t InitCheck() const; 370fc56ed5SStephan Aßmus TrackIndex()38e6ac2ec4SStephan Aßmus virtual int32 TrackIndex() const 39e6ac2ec4SStephan Aßmus { return fTrackIndex; } 40e6ac2ec4SStephan Aßmus 410fc56ed5SStephan Aßmus private: 420fc56ed5SStephan Aßmus struct Buffer; 430fc56ed5SStephan Aßmus void _InitFromTrack(); 440fc56ed5SStephan Aßmus 450fc56ed5SStephan Aßmus int64 _FramesPerBuffer() const; 460fc56ed5SStephan Aßmus 470fc56ed5SStephan Aßmus void _CopyFrames(void* source, int64 sourceOffset, 480fc56ed5SStephan Aßmus void* target, int64 targetOffset, 490fc56ed5SStephan Aßmus int64 position, int64 frames) const; 500fc56ed5SStephan Aßmus void _CopyFrames(Buffer* buffer, void* target, 510fc56ed5SStephan Aßmus int64 targetOffset, int64 position, 520fc56ed5SStephan Aßmus int64 frames) const; 530fc56ed5SStephan Aßmus 540fc56ed5SStephan Aßmus void _AllocateBuffers(); 550fc56ed5SStephan Aßmus void _FreeBuffers(); 560fc56ed5SStephan Aßmus Buffer* _BufferAt(int32 index) const; 570fc56ed5SStephan Aßmus Buffer* _FindBufferAtFrame(int64 frame) const; 580fc56ed5SStephan Aßmus Buffer* _FindUnusedBuffer() const; 590fc56ed5SStephan Aßmus Buffer* _FindUsableBuffer() const; 600fc56ed5SStephan Aßmus Buffer* _FindUsableBufferFor(int64 position) const; 610fc56ed5SStephan Aßmus void _GetBuffersFor(BList& buffers, int64 position, 620fc56ed5SStephan Aßmus int64 frames) const; 630fc56ed5SStephan Aßmus void _TouchBuffer(Buffer* buffer); 640fc56ed5SStephan Aßmus 650fc56ed5SStephan Aßmus status_t _ReadBuffer(Buffer* buffer, int64 position); 660fc56ed5SStephan Aßmus status_t _ReadBuffer(Buffer* buffer, int64 position, 670fc56ed5SStephan Aßmus bigtime_t time); 680fc56ed5SStephan Aßmus 690fc56ed5SStephan Aßmus void _ReadCachedFrames(void*& buffer, 700fc56ed5SStephan Aßmus int64& position, int64& frames, 710fc56ed5SStephan Aßmus bigtime_t time); 720fc56ed5SStephan Aßmus 730fc56ed5SStephan Aßmus status_t _ReadUncachedFrames(void* buffer, 740fc56ed5SStephan Aßmus int64 position, int64 frames, 750fc56ed5SStephan Aßmus bigtime_t time); 760fc56ed5SStephan Aßmus 770fc56ed5SStephan Aßmus status_t _FindKeyFrameForward(int64& position); 780fc56ed5SStephan Aßmus status_t _FindKeyFrameBackward(int64& position); 79c60fcc87SStephan Aßmus // NOTE: unused 80c60fcc87SStephan Aßmus // status_t _SeekToKeyFrameForward(int64& position); 810fc56ed5SStephan Aßmus status_t _SeekToKeyFrameBackward(int64& position); 820fc56ed5SStephan Aßmus 835fa5e5feSStephan Aßmus private: 845fa5e5feSStephan Aßmus BMediaTrack* fMediaTrack; 850fc56ed5SStephan Aßmus char* fBuffer; 860fc56ed5SStephan Aßmus int64 fBufferOffset; 870fc56ed5SStephan Aßmus int64 fBufferSize; 880fc56ed5SStephan Aßmus BList fBuffers; 890fc56ed5SStephan Aßmus bool fHasKeyFrames; 900fc56ed5SStephan Aßmus int64 fCountFrames; 910fc56ed5SStephan Aßmus bool fReportSeekError; 92e6ac2ec4SStephan Aßmus int32 fTrackIndex; 935fa5e5feSStephan Aßmus }; 945fa5e5feSStephan Aßmus 955fa5e5feSStephan Aßmus #endif // MEDIA_TRACK_AUDIO_SUPPLIER_H 96