Home | History | Annotate | Download | only in android
      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 //#define USE_LOG SLAndroidLogLevel_Verbose
     18 
     19 #include "sles_allinclusive.h"
     20 #include "android/android_AudioSfDecoder.h"
     21 
     22 #include <binder/IServiceManager.h>
     23 #include <media/IMediaHTTPService.h>
     24 #include <media/stagefright/foundation/ADebug.h>
     25 
     26 
     27 #define SIZE_CACHED_HIGH_BYTES 1000000
     28 #define SIZE_CACHED_MED_BYTES   700000
     29 #define SIZE_CACHED_LOW_BYTES   400000
     30 
     31 namespace android {
     32 
     33 //--------------------------------------------------------------------------------------------------
     34 AudioSfDecoder::AudioSfDecoder(const AudioPlayback_Parameters* params) : GenericPlayer(params),
     35         mDataSource(0),
     36         mAudioSource(0),
     37         mAudioSourceStarted(false),
     38         mBitrate(-1),
     39         mDurationUsec(ANDROID_UNKNOWN_TIME),
     40         mDecodeBuffer(NULL),
     41         mSeekTimeMsec(0),
     42         // play event logic depends on the initial time being zero not ANDROID_UNKNOWN_TIME
     43         mLastDecodedPositionUs(0)
     44 {
     45     SL_LOGD("AudioSfDecoder::AudioSfDecoder()");
     46 }
     47 
     48 
     49 AudioSfDecoder::~AudioSfDecoder() {
     50     SL_LOGD("AudioSfDecoder::~AudioSfDecoder()");
     51 }
     52 
     53 
     54 void AudioSfDecoder::preDestroy() {
     55     GenericPlayer::preDestroy();
     56     SL_LOGD("AudioSfDecoder::preDestroy()");
     57     {
     58         Mutex::Autolock _l(mBufferSourceLock);
     59 
     60         if (NULL != mDecodeBuffer) {
     61             mDecodeBuffer->release();
     62             mDecodeBuffer = NULL;
     63         }
     64 
     65         if ((mAudioSource != 0) && mAudioSourceStarted) {
     66             mAudioSource->stop();
     67             mAudioSourceStarted = false;
     68         }
     69     }
     70 }
     71 
     72 
     73 //--------------------------------------------------
     74 void AudioSfDecoder::play() {
     75     SL_LOGD("AudioSfDecoder::play");
     76 
     77     GenericPlayer::play();
     78     (new AMessage(kWhatDecode, id()))->post();
     79 }
     80 
     81 
     82 void AudioSfDecoder::getPositionMsec(int* msec) {
     83     int64_t timeUsec = getPositionUsec();
     84     if (timeUsec == ANDROID_UNKNOWN_TIME) {
     85         *msec = ANDROID_UNKNOWN_TIME;
     86     } else {
     87         *msec = timeUsec / 1000;
     88     }
     89 }
     90 
     91 
     92 //--------------------------------------------------
     93 uint32_t AudioSfDecoder::getPcmFormatKeyCount() const {
     94     return NB_PCMMETADATA_KEYS;
     95 }
     96 
     97 
     98 //--------------------------------------------------
     99 bool AudioSfDecoder::getPcmFormatKeySize(uint32_t index, uint32_t* pKeySize) {
    100     if (index >= NB_PCMMETADATA_KEYS) {
    101         return false;
    102     } else {
    103         *pKeySize = strlen(kPcmDecodeMetadataKeys[index]) +1;
    104         return true;
    105     }
    106 }
    107 
    108 
    109 //--------------------------------------------------
    110 bool AudioSfDecoder::getPcmFormatKeyName(uint32_t index, uint32_t keySize, char* keyName) {
    111     uint32_t actualKeySize;
    112     if (!getPcmFormatKeySize(index, &actualKeySize)) {
    113         return false;
    114     }
    115     if (keySize < actualKeySize) {
    116         return false;
    117     }
    118     strncpy(keyName, kPcmDecodeMetadataKeys[index], actualKeySize);
    119     return true;
    120 }
    121 
    122 
    123 //--------------------------------------------------
    124 bool AudioSfDecoder::getPcmFormatValueSize(uint32_t index, uint32_t* pValueSize) {
    125     if (index >= NB_PCMMETADATA_KEYS) {
    126         *pValueSize = 0;
    127         return false;
    128     } else {
    129         *pValueSize = sizeof(uint32_t);
    130         return true;
    131     }
    132 }
    133 
    134 
    135 //--------------------------------------------------
    136 bool AudioSfDecoder::getPcmFormatKeyValue(uint32_t index, uint32_t size, uint32_t* pValue) {
    137     uint32_t valueSize = 0;
    138     if (!getPcmFormatValueSize(index, &valueSize)) {
    139         return false;
    140     } else if (size != valueSize) {
    141         // this ensures we are accessing mPcmFormatValues with a valid size for that index
    142         SL_LOGE("Error retrieving metadata value at index %d: using size of %d, should be %d",
    143                 index, size, valueSize);
    144         return false;
    145     } else {
    146         android::Mutex::Autolock autoLock(mPcmFormatLock);
    147         *pValue = mPcmFormatValues[index];
    148         return true;
    149     }
    150 }
    151 
    152 
    153 //--------------------------------------------------
    154 // Event handlers
    155 //  it is strictly verboten to call those methods outside of the event loop
    156 
    157 // Initializes the data and audio sources, and update the PCM format info
    158 // post-condition: upon successful initialization based on the player data locator
    159 //    GenericPlayer::onPrepare() was called
    160 //    mDataSource != 0
    161 //    mAudioSource != 0
    162 //    mAudioSourceStarted == true
    163 // All error returns from this method are via notifyPrepared(status) followed by "return".
    164 void AudioSfDecoder::onPrepare() {
    165     SL_LOGD("AudioSfDecoder::onPrepare()");
    166     Mutex::Autolock _l(mBufferSourceLock);
    167 
    168     {
    169     android::Mutex::Autolock autoLock(mPcmFormatLock);
    170     // Initialize the PCM format info with the known parameters before the start of the decode
    171     mPcmFormatValues[ANDROID_KEY_INDEX_PCMFORMAT_BITSPERSAMPLE] = SL_PCMSAMPLEFORMAT_FIXED_16;
    172     mPcmFormatValues[ANDROID_KEY_INDEX_PCMFORMAT_CONTAINERSIZE] = 16;
    173     mPcmFormatValues[ANDROID_KEY_INDEX_PCMFORMAT_ENDIANNESS] = SL_BYTEORDER_LITTLEENDIAN;
    174     //    initialization with the default values: they will be replaced by the actual values
    175     //      once the decoder has figured them out
    176     mPcmFormatValues[ANDROID_KEY_INDEX_PCMFORMAT_NUMCHANNELS] = UNKNOWN_NUMCHANNELS;
    177     mPcmFormatValues[ANDROID_KEY_INDEX_PCMFORMAT_SAMPLERATE] = UNKNOWN_SAMPLERATE;
    178     mPcmFormatValues[ANDROID_KEY_INDEX_PCMFORMAT_CHANNELMASK] = UNKNOWN_CHANNELMASK;
    179     }
    180 
    181     //---------------------------------
    182     // Instantiate and initialize the data source for the decoder
    183     sp<DataSource> dataSource;
    184 
    185     switch (mDataLocatorType) {
    186 
    187     case kDataLocatorNone:
    188         SL_LOGE("AudioSfDecoder::onPrepare: no data locator set");
    189         notifyPrepared(MEDIA_ERROR_BASE);
    190         return;
    191 
    192     case kDataLocatorUri:
    193         dataSource = DataSource::CreateFromURI(
    194                 NULL /* XXX httpService */, mDataLocator.uriRef);
    195         if (dataSource == NULL) {
    196             SL_LOGE("AudioSfDecoder::onPrepare(): Error opening %s", mDataLocator.uriRef);
    197             notifyPrepared(MEDIA_ERROR_BASE);
    198             return;
    199         }
    200         break;
    201 
    202     case kDataLocatorFd:
    203     {
    204         // As FileSource unconditionally takes ownership of the fd and closes it, then
    205         // we have to make a dup for FileSource if the app wants to keep ownership itself
    206         int fd = mDataLocator.fdi.fd;
    207         if (mDataLocator.fdi.mCloseAfterUse) {
    208             mDataLocator.fdi.mCloseAfterUse = false;
    209         } else {
    210             fd = ::dup(fd);
    211         }
    212         dataSource = new FileSource(fd, mDataLocator.fdi.offset, mDataLocator.fdi.length);
    213         status_t err = dataSource->initCheck();
    214         if (err != OK) {
    215             notifyPrepared(err);
    216             return;
    217         }
    218         break;
    219     }
    220 
    221     // AndroidBufferQueue data source is handled by a subclass,
    222     // which does not call up to this method.  Hence, the missing case.
    223     default:
    224         TRESPASS();
    225     }
    226 
    227     //---------------------------------
    228     // Instantiate and initialize the decoder attached to the data source
    229     sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource);
    230     if (extractor == NULL) {
    231         SL_LOGE("AudioSfDecoder::onPrepare: Could not instantiate extractor.");
    232         notifyPrepared(ERROR_UNSUPPORTED);
    233         return;
    234     }
    235 
    236     ssize_t audioTrackIndex = -1;
    237     bool isRawAudio = false;
    238     for (size_t i = 0; i < extractor->countTracks(); ++i) {
    239         sp<MetaData> meta = extractor->getTrackMetaData(i);
    240 
    241         const char *mime;
    242         CHECK(meta->findCString(kKeyMIMEType, &mime));
    243 
    244         if (!strncasecmp("audio/", mime, 6)) {
    245             if (isSupportedCodec(mime)) {
    246                 audioTrackIndex = i;
    247 
    248                 if (!strcasecmp(MEDIA_MIMETYPE_AUDIO_RAW, mime)) {
    249                     isRawAudio = true;
    250                 }
    251                 break;
    252             }
    253         }
    254     }
    255 
    256     if (audioTrackIndex < 0) {
    257         SL_LOGE("AudioSfDecoder::onPrepare: Could not find a supported audio track.");
    258         notifyPrepared(ERROR_UNSUPPORTED);
    259         return;
    260     }
    261 
    262     sp<MediaSource> source = extractor->getTrack(audioTrackIndex);
    263     sp<MetaData> meta = source->getFormat();
    264 
    265     // we can't trust the OMXCodec (if there is one) to issue a INFO_FORMAT_CHANGED so we want
    266     // to have some meaningful values as soon as possible.
    267     int32_t channelCount;
    268     bool hasChannelCount = meta->findInt32(kKeyChannelCount, &channelCount);
    269     int32_t sr;
    270     bool hasSampleRate = meta->findInt32(kKeySampleRate, &sr);
    271 
    272     // first compute the duration
    273     off64_t size;
    274     int64_t durationUs;
    275     int32_t durationMsec;
    276     if (dataSource->getSize(&size) == OK
    277             && meta->findInt64(kKeyDuration, &durationUs)) {
    278         if (durationUs != 0) {
    279             mBitrate = size * 8000000ll / durationUs;  // in bits/sec
    280         } else {
    281             mBitrate = -1;
    282         }
    283         mDurationUsec = durationUs;
    284         durationMsec = durationUs / 1000;
    285     } else {
    286         mBitrate = -1;
    287         mDurationUsec = ANDROID_UNKNOWN_TIME;
    288         durationMsec = ANDROID_UNKNOWN_TIME;
    289     }
    290 
    291     // then assign the duration under the settings lock
    292     {
    293         Mutex::Autolock _l(mSettingsLock);
    294         mDurationMsec = durationMsec;
    295     }
    296 
    297     // the audio content is not raw PCM, so we need a decoder
    298     if (!isRawAudio) {
    299         OMXClient client;
    300         CHECK_EQ(client.connect(), (status_t)OK);
    301 
    302         source = OMXCodec::Create(
    303                 client.interface(), meta, false /* createEncoder */,
    304                 source);
    305 
    306         if (source == NULL) {
    307             SL_LOGE("AudioSfDecoder::onPrepare: Could not instantiate decoder.");
    308             notifyPrepared(ERROR_UNSUPPORTED);
    309             return;
    310         }
    311 
    312         meta = source->getFormat();
    313     }
    314 
    315 
    316     if (source->start() != OK) {
    317         SL_LOGE("AudioSfDecoder::onPrepare: Failed to start source/decoder.");
    318         notifyPrepared(MEDIA_ERROR_BASE);
    319         return;
    320     }
    321 
    322     //---------------------------------
    323     // The data source, and audio source (a decoder if required) are ready to be used
    324     mDataSource = dataSource;
    325     mAudioSource = source;
    326     mAudioSourceStarted = true;
    327 
    328     if (!hasChannelCount) {
    329         CHECK(meta->findInt32(kKeyChannelCount, &channelCount));
    330     }
    331 
    332     if (!hasSampleRate) {
    333         CHECK(meta->findInt32(kKeySampleRate, &sr));
    334     }
    335     // FIXME add code below once channel mask support is in, currently initialized to default
    336     //       value computed from the channel count
    337     //    if (!hasChannelMask) {
    338     //        CHECK(meta->findInt32(kKeyChannelMask, &channelMask));
    339     //    }
    340 
    341     if (!wantPrefetch()) {
    342         SL_LOGV("AudioSfDecoder::onPrepare: no need to prefetch");
    343         // doesn't need prefetching, notify good to go
    344         mCacheStatus = kStatusHigh;
    345         mCacheFill = 1000;
    346         notifyStatus();
    347         notifyCacheFill();
    348     }
    349 
    350     {
    351         android::Mutex::Autolock autoLock(mPcmFormatLock);
    352         mPcmFormatValues[ANDROID_KEY_INDEX_PCMFORMAT_SAMPLERATE] = sr;
    353         mPcmFormatValues[ANDROID_KEY_INDEX_PCMFORMAT_NUMCHANNELS] = channelCount;
    354         mPcmFormatValues[ANDROID_KEY_INDEX_PCMFORMAT_CHANNELMASK] =
    355                 channelCountToMask(channelCount);
    356     }
    357 
    358     // at this point we have enough information about the source to create the sink that
    359     // will consume the data
    360     createAudioSink();
    361 
    362     // signal successful completion of prepare
    363     mStateFlags |= kFlagPrepared;
    364 
    365     GenericPlayer::onPrepare();
    366     SL_LOGD("AudioSfDecoder::onPrepare() done, mStateFlags=0x%x", mStateFlags);
    367 }
    368 
    369 
    370 void AudioSfDecoder::onPause() {
    371     SL_LOGV("AudioSfDecoder::onPause()");
    372     GenericPlayer::onPause();
    373     pauseAudioSink();
    374 }
    375 
    376 
    377 void AudioSfDecoder::onPlay() {
    378     SL_LOGV("AudioSfDecoder::onPlay()");
    379     GenericPlayer::onPlay();
    380     startAudioSink();
    381 }
    382 
    383 
    384 void AudioSfDecoder::onSeek(const sp<AMessage> &msg) {
    385     SL_LOGV("AudioSfDecoder::onSeek");
    386     int64_t timeMsec;
    387     CHECK(msg->findInt64(WHATPARAM_SEEK_SEEKTIME_MS, &timeMsec));
    388 
    389     Mutex::Autolock _l(mTimeLock);
    390     mStateFlags |= kFlagSeeking;
    391     mSeekTimeMsec = timeMsec;
    392     // don't set mLastDecodedPositionUs to ANDROID_UNKNOWN_TIME; getPositionUsec
    393     // ignores mLastDecodedPositionUs while seeking, and substitutes the seek goal instead
    394 
    395     // nop for now
    396     GenericPlayer::onSeek(msg);
    397 }
    398 
    399 
    400 void AudioSfDecoder::onLoop(const sp<AMessage> &msg) {
    401     SL_LOGV("AudioSfDecoder::onLoop");
    402     int32_t loop;
    403     CHECK(msg->findInt32(WHATPARAM_LOOP_LOOPING, &loop));
    404 
    405     if (loop) {
    406         //SL_LOGV("AudioSfDecoder::onLoop start looping");
    407         mStateFlags |= kFlagLooping;
    408     } else {
    409         //SL_LOGV("AudioSfDecoder::onLoop stop looping");
    410         mStateFlags &= ~kFlagLooping;
    411     }
    412 
    413     // nop for now
    414     GenericPlayer::onLoop(msg);
    415 }
    416 
    417 
    418 void AudioSfDecoder::onCheckCache(const sp<AMessage> &msg) {
    419     //SL_LOGV("AudioSfDecoder::onCheckCache");
    420     bool eos;
    421     CacheStatus_t status = getCacheRemaining(&eos);
    422 
    423     if (eos || status == kStatusHigh
    424             || ((mStateFlags & kFlagPreparing) && (status >= kStatusEnough))) {
    425         if (mStateFlags & kFlagPlaying) {
    426             startAudioSink();
    427         }
    428         mStateFlags &= ~kFlagBuffering;
    429 
    430         SL_LOGV("AudioSfDecoder::onCheckCache: buffering done.");
    431 
    432         if (mStateFlags & kFlagPreparing) {
    433             //SL_LOGV("AudioSfDecoder::onCheckCache: preparation done.");
    434             mStateFlags &= ~kFlagPreparing;
    435         }
    436 
    437         if (mStateFlags & kFlagPlaying) {
    438             (new AMessage(kWhatDecode, id()))->post();
    439         }
    440         return;
    441     }
    442 
    443     msg->post(100000);
    444 }
    445 
    446 
    447 void AudioSfDecoder::onDecode() {
    448     SL_LOGV("AudioSfDecoder::onDecode");
    449 
    450     //-------------------------------- Need to buffer some more before decoding?
    451     bool eos;
    452     if (mDataSource == 0) {
    453         // application set play state to paused which failed, then set play state to playing
    454         return;
    455     }
    456 
    457     if (wantPrefetch()
    458             && (getCacheRemaining(&eos) == kStatusLow)
    459             && !eos) {
    460         SL_LOGV("buffering more.");
    461 
    462         if (mStateFlags & kFlagPlaying) {
    463             pauseAudioSink();
    464         }
    465         mStateFlags |= kFlagBuffering;
    466         (new AMessage(kWhatCheckCache, id()))->post(100000);
    467         return;
    468     }
    469 
    470     if (!(mStateFlags & (kFlagPlaying | kFlagBuffering | kFlagPreparing))) {
    471         // don't decode if we're not buffering, prefetching or playing
    472         //SL_LOGV("don't decode: not buffering, prefetching or playing");
    473         return;
    474     }
    475 
    476     //-------------------------------- Decode
    477     status_t err;
    478     MediaSource::ReadOptions readOptions;
    479     if (mStateFlags & kFlagSeeking) {
    480         assert(mSeekTimeMsec != ANDROID_UNKNOWN_TIME);
    481         readOptions.setSeekTo(mSeekTimeMsec * 1000);
    482     }
    483 
    484     int64_t timeUsec = ANDROID_UNKNOWN_TIME;
    485     {
    486         Mutex::Autolock _l(mBufferSourceLock);
    487 
    488         if (NULL != mDecodeBuffer) {
    489             // the current decoded buffer hasn't been rendered, drop it
    490             mDecodeBuffer->release();
    491             mDecodeBuffer = NULL;
    492         }
    493         if (!mAudioSourceStarted) {
    494             return;
    495         }
    496         err = mAudioSource->read(&mDecodeBuffer, &readOptions);
    497         if (err == OK) {
    498             // FIXME workaround apparent bug in AAC decoder: kKeyTime is 3 frames old if length is 0
    499             if (mDecodeBuffer->range_length() == 0) {
    500                 timeUsec = ANDROID_UNKNOWN_TIME;
    501             } else {
    502                 CHECK(mDecodeBuffer->meta_data()->findInt64(kKeyTime, &timeUsec));
    503             }
    504         } else {
    505             // errors are handled below
    506         }
    507     }
    508 
    509     {
    510         Mutex::Autolock _l(mTimeLock);
    511         if (mStateFlags & kFlagSeeking) {
    512             mStateFlags &= ~kFlagSeeking;
    513             mSeekTimeMsec = ANDROID_UNKNOWN_TIME;
    514         }
    515         if (timeUsec != ANDROID_UNKNOWN_TIME) {
    516             // Note that though we've decoded this position, we haven't rendered it yet.
    517             // So a GetPosition called after this point will observe the advanced position,
    518             // even though the PCM may not have been supplied to the sink.  That's OK as
    519             // we don't claim to provide AAC frame-accurate (let alone sample-accurate) GetPosition.
    520             mLastDecodedPositionUs = timeUsec;
    521         }
    522     }
    523 
    524     //-------------------------------- Handle return of decode
    525     if (err != OK) {
    526         bool continueDecoding = false;
    527         switch(err) {
    528             case ERROR_END_OF_STREAM:
    529                 if (0 < mDurationUsec) {
    530                     Mutex::Autolock _l(mTimeLock);
    531                     mLastDecodedPositionUs = mDurationUsec;
    532                 }
    533                 // handle notification and looping at end of stream
    534                 if (mStateFlags & kFlagPlaying) {
    535                     notify(PLAYEREVENT_ENDOFSTREAM, 1, true /*async*/);
    536                 }
    537                 if (mStateFlags & kFlagLooping) {
    538                     seek(0);
    539                     // kick-off decoding again
    540                     continueDecoding = true;
    541                 }
    542                 break;
    543             case INFO_FORMAT_CHANGED:
    544                 SL_LOGD("MediaSource::read encountered INFO_FORMAT_CHANGED");
    545                 // reconfigure output
    546                 {
    547                     Mutex::Autolock _l(mBufferSourceLock);
    548                     hasNewDecodeParams();
    549                 }
    550                 continueDecoding = true;
    551                 break;
    552             case INFO_DISCONTINUITY:
    553                 SL_LOGD("MediaSource::read encountered INFO_DISCONTINUITY");
    554                 continueDecoding = true;
    555                 break;
    556             default:
    557                 SL_LOGE("MediaSource::read returned error %d", err);
    558                 break;
    559         }
    560         if (continueDecoding) {
    561             if (NULL == mDecodeBuffer) {
    562                 (new AMessage(kWhatDecode, id()))->post();
    563                 return;
    564             }
    565         } else {
    566             return;
    567         }
    568     }
    569 
    570     //-------------------------------- Render
    571     sp<AMessage> msg = new AMessage(kWhatRender, id());
    572     msg->post();
    573 
    574 }
    575 
    576 
    577 void AudioSfDecoder::onMessageReceived(const sp<AMessage> &msg) {
    578     switch (msg->what()) {
    579         case kWhatDecode:
    580             onDecode();
    581             break;
    582 
    583         case kWhatRender:
    584             onRender();
    585             break;
    586 
    587         case kWhatCheckCache:
    588             onCheckCache(msg);
    589             break;
    590 
    591         default:
    592             GenericPlayer::onMessageReceived(msg);
    593             break;
    594     }
    595 }
    596 
    597 //--------------------------------------------------
    598 // Prepared state, prefetch status notifications
    599 void AudioSfDecoder::notifyPrepared(status_t prepareRes) {
    600     assert(!(mStateFlags & (kFlagPrepared | kFlagPreparedUnsuccessfully)));
    601     if (NO_ERROR == prepareRes) {
    602         // The "then" fork is not currently used, but is kept here to make it easier
    603         // to replace by a new signalPrepareCompletion(status) if we re-visit this later.
    604         mStateFlags |= kFlagPrepared;
    605     } else {
    606         mStateFlags |= kFlagPreparedUnsuccessfully;
    607     }
    608     // Do not call the superclass onPrepare to notify, because it uses a default error
    609     // status code but we can provide a more specific one.
    610     // GenericPlayer::onPrepare();
    611     notify(PLAYEREVENT_PREPARED, (int32_t)prepareRes, true /*async*/);
    612     SL_LOGD("AudioSfDecoder::onPrepare() done, mStateFlags=0x%x", mStateFlags);
    613 }
    614 
    615 
    616 void AudioSfDecoder::onNotify(const sp<AMessage> &msg) {
    617     notif_cbf_t notifyClient;
    618     void*       notifyUser;
    619     {
    620         android::Mutex::Autolock autoLock(mNotifyClientLock);
    621         if (NULL == mNotifyClient) {
    622             return;
    623         } else {
    624             notifyClient = mNotifyClient;
    625             notifyUser   = mNotifyUser;
    626         }
    627     }
    628     int32_t val;
    629     if (msg->findInt32(PLAYEREVENT_PREFETCHSTATUSCHANGE, &val)) {
    630         SL_LOGV("\tASfPlayer notifying %s = %d", PLAYEREVENT_PREFETCHSTATUSCHANGE, val);
    631         notifyClient(kEventPrefetchStatusChange, val, 0, notifyUser);
    632     }
    633     else if (msg->findInt32(PLAYEREVENT_PREFETCHFILLLEVELUPDATE, &val)) {
    634         SL_LOGV("\tASfPlayer notifying %s = %d", PLAYEREVENT_PREFETCHFILLLEVELUPDATE, val);
    635         notifyClient(kEventPrefetchFillLevelUpdate, val, 0, notifyUser);
    636     }
    637     else if (msg->findInt32(PLAYEREVENT_ENDOFSTREAM, &val)) {
    638         SL_LOGV("\tASfPlayer notifying %s = %d", PLAYEREVENT_ENDOFSTREAM, val);
    639         notifyClient(kEventEndOfStream, val, 0, notifyUser);
    640     }
    641     else {
    642         GenericPlayer::onNotify(msg);
    643     }
    644 }
    645 
    646 
    647 //--------------------------------------------------
    648 // Private utility functions
    649 
    650 bool AudioSfDecoder::wantPrefetch() {
    651     if (mDataSource != 0) {
    652         return (mDataSource->flags() & DataSource::kWantsPrefetching);
    653     } else {
    654         // happens if an improper data locator was passed, if the media extractor couldn't be
    655         //  initialized, if there is no audio track in the media, if the OMX decoder couldn't be
    656         //  instantiated, if the source couldn't be opened, or if the MediaSource
    657         //  couldn't be started
    658         SL_LOGV("AudioSfDecoder::wantPrefetch() tries to access NULL mDataSource");
    659         return false;
    660     }
    661 }
    662 
    663 
    664 int64_t AudioSfDecoder::getPositionUsec() {
    665     Mutex::Autolock _l(mTimeLock);
    666     if (mStateFlags & kFlagSeeking) {
    667         return mSeekTimeMsec * 1000;
    668     } else {
    669         return mLastDecodedPositionUs;
    670     }
    671 }
    672 
    673 
    674 CacheStatus_t AudioSfDecoder::getCacheRemaining(bool *eos) {
    675     sp<NuCachedSource2> cachedSource =
    676         static_cast<NuCachedSource2 *>(mDataSource.get());
    677 
    678     CacheStatus_t oldStatus = mCacheStatus;
    679 
    680     status_t finalStatus;
    681     size_t dataRemaining = cachedSource->approxDataRemaining(&finalStatus);
    682     *eos = (finalStatus != OK);
    683 
    684     CHECK_GE(mBitrate, 0);
    685 
    686     int64_t dataRemainingUs = dataRemaining * 8000000ll / mBitrate;
    687     //SL_LOGV("AudioSfDecoder::getCacheRemaining: approx %.2f secs remaining (eos=%d)",
    688     //       dataRemainingUs / 1E6, *eos);
    689 
    690     if (*eos) {
    691         // data is buffered up to the end of the stream, it can't get any better than this
    692         mCacheStatus = kStatusHigh;
    693         mCacheFill = 1000;
    694 
    695     } else {
    696         if (mDurationUsec > 0) {
    697             // known duration:
    698 
    699             //   fill level is ratio of how much has been played + how much is
    700             //   cached, divided by total duration
    701             int64_t currentPositionUsec = getPositionUsec();
    702             if (currentPositionUsec == ANDROID_UNKNOWN_TIME) {
    703                 // if we don't know where we are, assume the worst for the fill ratio
    704                 currentPositionUsec = 0;
    705             }
    706             if (mDurationUsec > 0) {
    707                 mCacheFill = (int16_t) ((1000.0
    708                         * (double)(currentPositionUsec + dataRemainingUs) / mDurationUsec));
    709             } else {
    710                 mCacheFill = 0;
    711             }
    712             //SL_LOGV("cacheFill = %d", mCacheFill);
    713 
    714             //   cache status is evaluated against duration thresholds
    715             if (dataRemainingUs > DURATION_CACHED_HIGH_MS*1000) {
    716                 mCacheStatus = kStatusHigh;
    717                 //ALOGV("high");
    718             } else if (dataRemainingUs > DURATION_CACHED_MED_MS*1000) {
    719                 //ALOGV("enough");
    720                 mCacheStatus = kStatusEnough;
    721             } else if (dataRemainingUs < DURATION_CACHED_LOW_MS*1000) {
    722                 //ALOGV("low");
    723                 mCacheStatus = kStatusLow;
    724             } else {
    725                 mCacheStatus = kStatusIntermediate;
    726             }
    727 
    728         } else {
    729             // unknown duration:
    730 
    731             //   cache status is evaluated against cache amount thresholds
    732             //   (no duration so we don't have the bitrate either, could be derived from format?)
    733             if (dataRemaining > SIZE_CACHED_HIGH_BYTES) {
    734                 mCacheStatus = kStatusHigh;
    735             } else if (dataRemaining > SIZE_CACHED_MED_BYTES) {
    736                 mCacheStatus = kStatusEnough;
    737             } else if (dataRemaining < SIZE_CACHED_LOW_BYTES) {
    738                 mCacheStatus = kStatusLow;
    739             } else {
    740                 mCacheStatus = kStatusIntermediate;
    741             }
    742         }
    743 
    744     }
    745 
    746     if (oldStatus != mCacheStatus) {
    747         notifyStatus();
    748     }
    749 
    750     if (abs(mCacheFill - mLastNotifiedCacheFill) > mCacheFillNotifThreshold) {
    751         notifyCacheFill();
    752     }
    753 
    754     return mCacheStatus;
    755 }
    756 
    757 
    758 void AudioSfDecoder::hasNewDecodeParams() {
    759 
    760     if ((mAudioSource != 0) && mAudioSourceStarted) {
    761         sp<MetaData> meta = mAudioSource->getFormat();
    762 
    763         int32_t channelCount;
    764         CHECK(meta->findInt32(kKeyChannelCount, &channelCount));
    765         int32_t sr;
    766         CHECK(meta->findInt32(kKeySampleRate, &sr));
    767 
    768         // FIXME similar to onPrepare()
    769         {
    770             android::Mutex::Autolock autoLock(mPcmFormatLock);
    771             SL_LOGV("format changed: old sr=%d, channels=%d; new sr=%d, channels=%d",
    772                     mPcmFormatValues[ANDROID_KEY_INDEX_PCMFORMAT_SAMPLERATE],
    773                     mPcmFormatValues[ANDROID_KEY_INDEX_PCMFORMAT_NUMCHANNELS],
    774                     sr, channelCount);
    775             mPcmFormatValues[ANDROID_KEY_INDEX_PCMFORMAT_NUMCHANNELS] = channelCount;
    776             mPcmFormatValues[ANDROID_KEY_INDEX_PCMFORMAT_SAMPLERATE] = sr;
    777             mPcmFormatValues[ANDROID_KEY_INDEX_PCMFORMAT_CHANNELMASK] =
    778                     channelCountToMask(channelCount);
    779         }
    780         // there's no need to do a notify of PLAYEREVENT_CHANNEL_COUNT,
    781         // because the only listener is for volume updates, and decoders don't support that
    782     }
    783 
    784     // alert users of those params
    785     updateAudioSink();
    786 }
    787 
    788 static const char* const kPlaybackOnlyCodecs[] = { MEDIA_MIMETYPE_AUDIO_AMR_NB,
    789         MEDIA_MIMETYPE_AUDIO_AMR_WB };
    790 #define NB_PLAYBACK_ONLY_CODECS (sizeof(kPlaybackOnlyCodecs)/sizeof(kPlaybackOnlyCodecs[0]))
    791 
    792 bool AudioSfDecoder::isSupportedCodec(const char* mime) {
    793     bool codecRequiresPermission = false;
    794     for (unsigned int i = 0 ; i < NB_PLAYBACK_ONLY_CODECS ; i++) {
    795         if (!strcasecmp(mime, kPlaybackOnlyCodecs[i])) {
    796             codecRequiresPermission = true;
    797             break;
    798         }
    799     }
    800     if (codecRequiresPermission) {
    801         // verify only the system can decode, for playback only
    802         return checkCallingPermission(
    803                 String16("android.permission.ALLOW_ANY_CODEC_FOR_PLAYBACK"));
    804     } else {
    805         return true;
    806     }
    807 }
    808 
    809 } // namespace android
    810