android_AudioSfDecoder.h revision bb832e853d4afb11b0a3287b2eb0cad87696d631
1/* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#ifndef AUDIO_SF_DECODER_H_ 18#define AUDIO_SF_DECODER_H_ 19 20#include <media/stagefright/DataSource.h> 21#include <media/stagefright/MediaSource.h> 22#include <media/stagefright/FileSource.h> 23#include <media/stagefright/MediaDefs.h> 24#include <media/stagefright/MediaExtractor.h> 25#include <media/stagefright/MetaData.h> 26#include <media/stagefright/OMXClient.h> 27#include <media/stagefright/OMXCodec.h> 28#include "NuCachedSource2.h" 29#include "ThrottledSource.h" 30 31#include "android_GenericPlayer.h" 32#include "OpenSLES_AndroidMetadata.h" 33 34//-------------------------------------------------------------------------------------------------- 35namespace android { 36 37// keep in sync with the entries of kPcmDecodeMetadataKeys[] 38#define ANDROID_KEY_INDEX_PCMFORMAT_NUMCHANNELS 0 39#define ANDROID_KEY_INDEX_PCMFORMAT_SAMPLESPERSEC 1 40#define ANDROID_KEY_INDEX_PCMFORMAT_BITSPERSAMPLE 2 41#define ANDROID_KEY_INDEX_PCMFORMAT_CONTAINERSIZE 3 42#define ANDROID_KEY_INDEX_PCMFORMAT_CHANNELMASK 4 43#define ANDROID_KEY_INDEX_PCMFORMAT_ENDIANNESS 5 44 45// to keep in sync with the ANDROID_KEY_INDEX_PCMFORMAT_* constants in android_AudioSfDecoder.cpp 46static const char* const kPcmDecodeMetadataKeys[] = { 47 ANDROID_KEY_PCMFORMAT_NUMCHANNELS, ANDROID_KEY_PCMFORMAT_SAMPLESPERSEC, 48 ANDROID_KEY_PCMFORMAT_BITSPERSAMPLE, ANDROID_KEY_PCMFORMAT_CONTAINERSIZE, 49 ANDROID_KEY_PCMFORMAT_CHANNELMASK, ANDROID_KEY_PCMFORMAT_ENDIANNESS }; 50#define NB_PCMMETADATA_KEYS (sizeof(kPcmDecodeMetadataKeys)/sizeof(kPcmDecodeMetadataKeys[0])) 51 52class AudioSfDecoder : public GenericPlayer 53{ 54public: 55 56 AudioSfDecoder(const AudioPlayback_Parameters* params); 57 virtual ~AudioSfDecoder(); 58 59 virtual void preDestroy(); 60 61 // overridden from GenericPlayer 62 virtual void play(); 63 virtual void getPositionMsec(int* msec); //msec != NULL, ANDROID_UNKNOWN_TIME if unknown 64 65 void startPrefetch_async(); 66 67 uint32_t getPcmFormatKeyCount(); 68 bool getPcmFormatKeySize(uint32_t index, uint32_t* pKeySize); 69 bool getPcmFormatKeyName(uint32_t index, uint32_t keySize, char* keyName); 70 bool getPcmFormatValueSize(uint32_t index, uint32_t* pValueSize); 71 bool getPcmFormatKeyValue(uint32_t index, uint32_t size, uint32_t* pValue); 72 73protected: 74 75 enum { 76 kWhatDecode = 'deco', 77 kWhatRender = 'rend', 78 kWhatCheckCache = 'cach' 79 }; 80 81 // Async event handlers (called from the AudioSfDecoder's event loop) 82 void onDecode(); 83 void onCheckCache(const sp<AMessage> &msg); 84 virtual void onRender(); 85 86 // Async event handlers (called from GenericPlayer's event loop) 87 virtual void onPrepare(); 88 virtual void onPlay(); 89 virtual void onPause(); 90 virtual void onSeek(const sp<AMessage> &msg); 91 virtual void onLoop(const sp<AMessage> &msg); 92 93 // overridden from GenericPlayer 94 virtual void onNotify(const sp<AMessage> &msg); 95 virtual void onMessageReceived(const sp<AMessage> &msg); 96 97 // to be implemented by subclasses of AudioSfDecoder to do something with the audio samples 98 // (called from GenericPlayer's event loop) 99 virtual void createAudioSink() = 0; 100 virtual void updateAudioSink() = 0; // called with mBufferSourceLock held 101 virtual void startAudioSink() = 0; 102 virtual void pauseAudioSink() = 0; 103 104 sp<DataSource> mDataSource; // where the raw data comes from 105 sp<MediaSource> mAudioSource;// the decoder reading from the data source 106 // used to indicate mAudioSource was successfully started, but wasn't stopped 107 bool mAudioSourceStarted; 108 109 // negative values indicate invalid value 110 int64_t mBitrate; // in bits/sec 111 uint32_t mChannelMask; 112 int64_t mDurationUsec; // ANDROID_UNKNOWN_TIME if unknown 113 114 // buffer passed from decoder to renderer 115 MediaBuffer *mDecodeBuffer; 116 117 // mutex used to protect the decode buffer, the audio source and its running state 118 Mutex mBufferSourceLock; 119 120 void notifyPrepared(status_t prepareRes); 121 122 int64_t mSeekTimeMsec; 123 int64_t mLastDecodedPositionUs; // ANDROID_UNKNOWN_TIME if unknown 124 // mutex used for seek flag, seek time (mSeekTimeMsec), 125 // and last decoded position (mLastDecodedPositionUs) 126 Mutex mTimeLock; 127 128 // informations that can be retrieved in the PCM format queries 129 // these values are only written in the event loop 130 uint32_t mPcmFormatKeyCount; 131 uint32_t mPcmFormatValues[NB_PCMMETADATA_KEYS]; 132 // protects mPcmFormatKeyCount and mPcmFormatValues 133 Mutex mPcmFormatLock; 134 135private: 136 bool wantPrefetch(); 137 CacheStatus_t getCacheRemaining(bool *eos); 138 int64_t getPositionUsec(); // ANDROID_UNKNOWN_TIME if unknown 139 140 // convenience function to update internal state when decoding parameters have changed, 141 // called with a lock on mBufferSourceLock 142 void hasNewDecodeParams(); 143 144private: 145 DISALLOW_EVIL_CONSTRUCTORS(AudioSfDecoder); 146 147}; 148 149} // namespace android 150 151#endif // AUDIO_SF_DECODER_H_ 152