MediaExtractor.h revision 4dd09daf
1/*
2 * Copyright 2009-2010, Stephan A��mus <supertippi@gmx.de>. All rights reserved.
3 * Copyright 2009, Axel D��rfler, axeld@pinc-software.de.
4 * Copyright 2008, Maurice Kalinowski. All rights reserved.
5 * Copyright 2004-2007, Marcus Overhagen. All rights reserved.
6 *
7 * Distributed under the terms of the MIT License.
8 */
9#ifndef _MEDIA_EXTRACTOR_H
10#define _MEDIA_EXTRACTOR_H
11
12
13#include <Url.h>
14
15#include "ReaderPlugin.h"
16#include "StreamerPlugin.h"
17#include "DecoderPlugin.h"
18
19
20namespace BPrivate {
21namespace media {
22
23
24class ChunkCache;
25struct chunk_buffer;
26
27
28struct stream_info {
29	status_t		status;
30	void*			cookie;
31	bool			hasCookie;
32	const void*		infoBuffer;
33	size_t			infoBufferSize;
34	ChunkCache*		chunkCache;
35	chunk_buffer*	lastChunk;
36	media_format	encodedFormat;
37};
38
39
40class MediaExtractor {
41public:
42								MediaExtractor(BDataIO* source, int32 flags);
43								MediaExtractor(const BUrl& url, int32 flags);
44
45								~MediaExtractor();
46
47			status_t			InitCheck();
48
49			BDataIO*			Source() const;
50
51			void				GetFileFormatInfo(
52									media_file_format* fileFormat) const;
53			status_t			GetMetaData(BMessage* _data) const;
54
55			int32				StreamCount();
56
57			const char*			Copyright();
58
59			const media_format*	EncodedFormat(int32 stream);
60			int64				CountFrames(int32 stream) const;
61			bigtime_t			Duration(int32 stream) const;
62
63			status_t			Seek(int32 stream, uint32 seekTo,
64									int64* _frame, bigtime_t* _time);
65			status_t			FindKeyFrame(int32 stream, uint32 seekTo,
66									int64* _frame, bigtime_t* _time) const;
67
68			status_t			GetNextChunk(int32 stream,
69									const void** _chunkBuffer,
70									size_t* _chunkSize,
71									media_header* mediaHeader);
72
73			status_t			CreateDecoder(int32 stream, Decoder** _decoder,
74									media_codec_info* codecInfo);
75
76			status_t			GetStreamMetaData(int32 stream,
77									BMessage* _data) const;
78
79private:
80			void				_Init(BDataIO* source, int32 flags);
81
82			void				_RecycleLastChunk(stream_info& info);
83	static	int32				_ExtractorEntry(void* arg);
84			void				_ExtractorThread();
85
86private:
87			status_t			fInitStatus;
88
89			sem_id				fExtractorWaitSem;
90			thread_id			fExtractorThread;
91
92			BDataIO*			fSource;
93			Reader*				fReader;
94			Streamer*			fStreamer;
95
96			stream_info*		fStreamInfo;
97			int32				fStreamCount;
98
99			media_file_format	fFileFormat;
100};
101
102} // namespace media
103} // namespace BPrivate
104
105using namespace BPrivate::media;
106
107#endif	// _MEDIA_EXTRACTOR_H
108