1#ifndef _DECODER_PLUGIN_H
2#define _DECODER_PLUGIN_H
3
4#include <MediaTrack.h>
5#include <MediaFormats.h>
6#include "MediaPlugin.h"
7
8
9namespace BPrivate { namespace media {
10
11class PluginManager;
12
13class ChunkProvider {
14public:
15	virtual						~ChunkProvider() {};
16	virtual	status_t			GetNextChunk(const void** chunkBuffer,
17									size_t* chunkSize,
18									media_header* mediaHeader) = 0;
19};
20
21class Decoder {
22public:
23								Decoder();
24	virtual						~Decoder();
25
26	virtual	void				GetCodecInfo(media_codec_info* codecInfo) = 0;
27
28	// Setup get's called with the info data from Reader::GetStreamInfo
29	virtual	status_t			Setup(media_format* ioEncodedFormat,
30									const void* infoBuffer,
31									size_t infoSize) = 0;
32
33	virtual	status_t			NegotiateOutputFormat(
34									media_format* ioDecodedFormat) = 0;
35
36	virtual	status_t			SeekedTo(int64 frame, bigtime_t time) = 0;
37
38	virtual status_t			Decode(void* buffer, int64* frameCount,
39									media_header* mediaHeader,
40									media_decode_info* info = 0) = 0;
41
42			status_t			GetNextChunk(const void** chunkBuffer,
43									size_t* chunkSize,
44									media_header* mediaHeader);
45
46			void				SetChunkProvider(ChunkProvider* provider);
47
48	virtual status_t			Perform(perform_code code, void* data);
49
50private:
51	virtual void				_ReservedDecoder1();
52	virtual void				_ReservedDecoder2();
53	virtual void				_ReservedDecoder3();
54	virtual void				_ReservedDecoder4();
55	virtual void				_ReservedDecoder5();
56
57			ChunkProvider*		fChunkProvider;
58
59	// needed for plug-in reference count management
60	friend class PluginManager;
61			MediaPlugin*		fMediaPlugin;
62
63			uint32				fReserved[5];
64};
65
66
67class DecoderPlugin : public virtual MediaPlugin {
68public:
69								DecoderPlugin();
70
71	virtual	Decoder*			NewDecoder(uint index) = 0;
72	virtual	status_t			GetSupportedFormats(media_format** formats,
73									size_t* count) = 0;
74};
75
76} } // namespace BPrivate::media
77
78using namespace BPrivate::media;
79
80#endif // _DECODER_PLUGIN_H
81