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