mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-01 06:35:42 +00:00
4ed8c95e5e
This patch adds support for Xing and VBRI headers to MP3FrameParser so that we can calculate the exact duration of an MP3 file if these headers are present. It is also now more robust against large ID3 tags and discontinuities in input.
86 lines
2.8 KiB
C++
86 lines
2.8 KiB
C++
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#ifndef __AppleMP3Reader_h__
|
|
#define __AppleMP3Reader_h__
|
|
|
|
#include "MediaDecoderReader.h"
|
|
#include "MP3FrameParser.h"
|
|
#include "VideoUtils.h"
|
|
|
|
#include <AudioToolbox/AudioToolbox.h>
|
|
|
|
namespace mozilla {
|
|
|
|
class AppleMP3Reader : public MediaDecoderReader
|
|
{
|
|
public:
|
|
AppleMP3Reader(AbstractMediaDecoder *aDecoder);
|
|
virtual ~AppleMP3Reader() MOZ_OVERRIDE;
|
|
|
|
virtual nsresult Init(MediaDecoderReader* aCloneDonor) MOZ_OVERRIDE;
|
|
|
|
nsresult PushDataToDemuxer();
|
|
|
|
virtual bool DecodeAudioData() MOZ_OVERRIDE;
|
|
virtual bool DecodeVideoFrame(bool &aKeyframeSkip,
|
|
int64_t aTimeThreshold) MOZ_OVERRIDE;
|
|
|
|
virtual bool HasAudio() MOZ_OVERRIDE;
|
|
virtual bool HasVideo() MOZ_OVERRIDE;
|
|
|
|
virtual nsresult ReadMetadata(MediaInfo* aInfo,
|
|
MetadataTags** aTags) MOZ_OVERRIDE;
|
|
|
|
virtual nsresult Seek(int64_t aTime,
|
|
int64_t aStartTime,
|
|
int64_t aEndTime,
|
|
int64_t aCurrentTime) MOZ_OVERRIDE;
|
|
|
|
void AudioSampleCallback(UInt32 aNumBytes,
|
|
UInt32 aNumPackets,
|
|
const void *aData,
|
|
AudioStreamPacketDescription *aPackets);
|
|
|
|
void AudioMetadataCallback(AudioFileStreamID aFileStream,
|
|
AudioFileStreamPropertyID aPropertyID,
|
|
UInt32 *aFlags);
|
|
|
|
virtual void NotifyDataArrived(const char* aBuffer,
|
|
uint32_t aLength,
|
|
int64_t aOffset) MOZ_OVERRIDE;
|
|
|
|
private:
|
|
void SetupDecoder();
|
|
nsresult Read(uint32_t *aNumBytes, char *aData);
|
|
|
|
static OSStatus PassthroughInputDataCallback(AudioConverterRef aAudioConverter,
|
|
UInt32 *aNumDataPackets,
|
|
AudioBufferList *aData,
|
|
AudioStreamPacketDescription **aPacketDesc,
|
|
void *aUserData);
|
|
|
|
// Initialisation has to be done in a callback, so we store the result here.
|
|
bool mStreamReady;
|
|
|
|
// Number of audio samples in an audio packet. Constant over all packets in a
|
|
// stream.
|
|
UInt32 mAudioFramesPerCompressedPacket;
|
|
// Store the next audio frame to be played; so we can keep time when seeking.
|
|
UInt64 mCurrentAudioFrame;
|
|
UInt32 mAudioChannels;
|
|
UInt32 mAudioSampleRate;
|
|
|
|
uint64_t mDuration;
|
|
|
|
AudioFileStreamID mAudioFileStream;
|
|
AudioConverterRef mAudioConverter;
|
|
|
|
MP3FrameParser mMP3FrameParser;
|
|
};
|
|
|
|
} // namespace mozilla
|
|
|
|
#endif // __AppleMP3Reader_h__
|