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