aboutsummaryrefslogtreecommitdiff
path: root/audio/decoders/quicktime_intern.h
blob: bb5ff0cf5c1e4787f3e73e815f9425578ad54cd0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/* ScummVM - Graphic Adventure Engine
 *
 * ScummVM is the legal property of its developers, whose names
 * are too numerous to list here. Please refer to the COPYRIGHT
 * file distributed with this source distribution.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 *
 */

/**
 * Internal interface to the QuickTime audio decoder.
 *
 * This is available so that the QuickTimeVideoDecoder can use
 * this directly.
 */

#ifndef AUDIO_QUICKTIME_INTERN_H
#define AUDIO_QUICKTIME_INTERN_H

#include "common/quicktime.h"
#include "common/scummsys.h"
#include "common/types.h"

#include "audio/audiostream.h"

namespace Common {
	class SeekableReadStream;
	class String;
}

namespace Audio {

class Codec;

class QuickTimeAudioDecoder : public Common::QuickTimeParser {
public:
	QuickTimeAudioDecoder();
	virtual ~QuickTimeAudioDecoder();

	/**
	 * Load a QuickTime audio file
	 * @param filename	the filename to load
	 */
	bool loadAudioFile(const Common::String &filename);

	/**
	 * Load a QuickTime audio file from a SeekableReadStream
	 * @param stream	the stream to load
	 */
	bool loadAudioStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeFileHandle);

protected:
	class QuickTimeAudioTrack : public SeekableAudioStream {
	public:
		QuickTimeAudioTrack(QuickTimeAudioDecoder *decoder, Track *parentTrack);
		~QuickTimeAudioTrack();

		// AudioStream API
		int readBuffer(int16 *buffer, const int numSamples);
		bool isStereo() const { return _queue->isStereo(); }
		int getRate() const { return _queue->getRate(); }
		bool endOfData() const;

		// SeekableAudioStream API
		bool seek(const Timestamp &where);
		Timestamp getLength() const;

		// Queue *at least* "length" audio
		// If length is zero, it queues the next logical block of audio whether
		// that be a whole edit or just one chunk within an edit
		void queueAudio(const Timestamp &length = Timestamp());
		Track *getParent() const { return _parentTrack; }
		void queueRemainingAudio();
		bool hasDataInQueue() const { return _samplesQueued != 0; }

	private:
		QuickTimeAudioDecoder *_decoder;
		Track *_parentTrack;
		QueuingAudioStream *_queue;
		uint _curChunk;
		Timestamp _curMediaPos, _skipSamples;
		uint32 _curEdit, _samplesQueued;
		bool _skipAACPrimer;

		QueuingAudioStream *createStream() const;
		AudioStream *readAudioChunk(uint chunk);
		bool isOldDemuxing() const;
		void skipSamples(const Timestamp &length, AudioStream *stream);
		void findEdit(const Timestamp &position);
		bool allDataRead() const;
		void enterNewEdit(const Timestamp &position);
		void queueStream(AudioStream *stream, const Timestamp &length);
		uint32 getAudioChunkSampleCount(uint chunk) const;
		Timestamp getChunkLength(uint chunk, bool skipAACPrimer = false) const;
		uint32 getAACSampleTime(uint32 totalSampleCount, bool skipAACPrimer = false) const;
		Timestamp getCurrentTrackTime() const;
	};

	class AudioSampleDesc : public Common::QuickTimeParser::SampleDesc {
	public:
		AudioSampleDesc(Common::QuickTimeParser::Track *parentTrack, uint32 codecTag);
		~AudioSampleDesc();

		bool isAudioCodecSupported() const;

		AudioStream *createAudioStream(Common::SeekableReadStream *stream) const;
		void initCodec();

		// TODO: Make private in the long run
		uint16 _bitsPerSample;
		uint16 _channels;
		uint32 _sampleRate;
		uint32 _samplesPerFrame;
		uint32 _bytesPerFrame;

	private:
		Codec *_codec;
	};

	// Common::QuickTimeParser API
	virtual Common::QuickTimeParser::SampleDesc *readSampleDesc(Track *track, uint32 format, uint32 descSize);

	void init();

	Common::Array<QuickTimeAudioTrack *> _audioTracks;
};

} // End of namespace Audio

#endif