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