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